summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2015-10-02 14:56:07 +0200
committerDaniel Wilhelm <daniel@wili.li>2015-10-02 14:56:07 +0200
commitde73d25e0b27f4bee2de116d19cab32800785d64 (patch)
tree21de1736d12a92223ad04c02a5b0826d77e5e71c
parent7.1 (diff)
downloadFreeFileSync-de73d25e0b27f4bee2de116d19cab32800785d64.tar.gz
FreeFileSync-de73d25e0b27f4bee2de116d19cab32800785d64.tar.bz2
FreeFileSync-de73d25e0b27f4bee2de116d19cab32800785d64.zip
7.2
-rw-r--r--FreeFileSync/Build/Changelog.txt20
-rw-r--r--FreeFileSync/Build/Help/html/Synchronize with FTP.html17
-rw-r--r--FreeFileSync/Build/Languages/arabic.lng298
-rw-r--r--FreeFileSync/Build/Languages/bulgarian.lng443
-rw-r--r--FreeFileSync/Build/Languages/chinese_simple.lng304
-rw-r--r--FreeFileSync/Build/Languages/chinese_traditional.lng326
-rw-r--r--FreeFileSync/Build/Languages/croatian.lng324
-rw-r--r--FreeFileSync/Build/Languages/czech.lng322
-rw-r--r--FreeFileSync/Build/Languages/danish.lng349
-rw-r--r--FreeFileSync/Build/Languages/dutch.lng316
-rw-r--r--FreeFileSync/Build/Languages/english_uk.lng298
-rw-r--r--FreeFileSync/Build/Languages/finnish.lng318
-rw-r--r--FreeFileSync/Build/Languages/french.lng326
-rw-r--r--FreeFileSync/Build/Languages/german.lng110
-rw-r--r--FreeFileSync/Build/Languages/greek.lng314
-rw-r--r--FreeFileSync/Build/Languages/hebrew.lng346
-rw-r--r--FreeFileSync/Build/Languages/hindi.lng508
-rw-r--r--FreeFileSync/Build/Languages/hungarian.lng342
-rw-r--r--FreeFileSync/Build/Languages/italian.lng298
-rw-r--r--FreeFileSync/Build/Languages/japanese.lng380
-rw-r--r--FreeFileSync/Build/Languages/korean.lng340
-rw-r--r--FreeFileSync/Build/Languages/lithuanian.lng348
-rw-r--r--FreeFileSync/Build/Languages/norwegian.lng298
-rw-r--r--FreeFileSync/Build/Languages/outdated/scottish_gaelic.lng561
-rw-r--r--FreeFileSync/Build/Languages/outdated/slovenian.lng462
-rw-r--r--FreeFileSync/Build/Languages/polish.lng311
-rw-r--r--FreeFileSync/Build/Languages/portuguese.lng298
-rw-r--r--FreeFileSync/Build/Languages/portuguese_br.lng334
-rw-r--r--FreeFileSync/Build/Languages/romanian.lng308
-rw-r--r--FreeFileSync/Build/Languages/russian.lng317
-rw-r--r--FreeFileSync/Build/Languages/serbian.lng302
-rw-r--r--FreeFileSync/Build/Languages/spanish.lng311
-rw-r--r--FreeFileSync/Build/Languages/swedish.lng356
-rw-r--r--FreeFileSync/Build/Languages/turkish.lng298
-rw-r--r--FreeFileSync/Build/Languages/ukrainian.lng317
-rw-r--r--FreeFileSync/Build/Resources.zipbin283380 -> 288512 bytes
-rw-r--r--FreeFileSync/Source/LICENSE49
-rw-r--r--FreeFileSync/Source/Makefile2
-rw-r--r--FreeFileSync/Source/RealtimeSync/Makefile2
-rw-r--r--FreeFileSync/Source/RealtimeSync/application.cpp2
-rw-r--r--FreeFileSync/Source/RealtimeSync/folder_selector2.cpp9
-rw-r--r--FreeFileSync/Source/RealtimeSync/gui_generated.cpp2
-rw-r--r--FreeFileSync/Source/RealtimeSync/gui_generated.h2
-rw-r--r--FreeFileSync/Source/RealtimeSync/main_dlg.cpp8
-rw-r--r--FreeFileSync/Source/RealtimeSync/monitor.cpp12
-rw-r--r--FreeFileSync/Source/RealtimeSync/tray_menu.cpp2
-rw-r--r--FreeFileSync/Source/RealtimeSync/xml_proc.cpp2
-rw-r--r--FreeFileSync/Source/algorithm.cpp34
-rw-r--r--FreeFileSync/Source/algorithm.h2
-rw-r--r--FreeFileSync/Source/application.cpp6
-rw-r--r--FreeFileSync/Source/comparison.cpp56
-rw-r--r--FreeFileSync/Source/file_hierarchy.cpp15
-rw-r--r--FreeFileSync/Source/fs/abstract.cpp126
-rw-r--r--FreeFileSync/Source/fs/abstract.h110
-rw-r--r--FreeFileSync/Source/fs/concrete.cpp10
-rw-r--r--FreeFileSync/Source/fs/concrete.h2
-rw-r--r--FreeFileSync/Source/fs/native.cpp158
-rw-r--r--FreeFileSync/Source/fs/native_traverser_impl.h47
-rw-r--r--FreeFileSync/Source/lib/db_file.cpp42
-rw-r--r--FreeFileSync/Source/lib/dir_exist_async.h46
-rw-r--r--FreeFileSync/Source/lib/dir_lock.cpp41
-rw-r--r--FreeFileSync/Source/lib/ffs_paths.cpp22
-rw-r--r--FreeFileSync/Source/lib/generate_logfile.h5
-rw-r--r--FreeFileSync/Source/lib/hard_filter.cpp6
-rw-r--r--FreeFileSync/Source/lib/icon_buffer.cpp10
-rw-r--r--FreeFileSync/Source/lib/icon_holder.h2
-rw-r--r--FreeFileSync/Source/lib/icon_loader.cpp86
-rw-r--r--FreeFileSync/Source/lib/localization.cpp6
-rw-r--r--FreeFileSync/Source/lib/lock_holder.h2
-rw-r--r--FreeFileSync/Source/lib/parallel_scan.cpp114
-rw-r--r--FreeFileSync/Source/lib/parse_lng.h33
-rw-r--r--FreeFileSync/Source/lib/process_xml.cpp10
-rw-r--r--FreeFileSync/Source/lib/resolve_path.cpp19
-rw-r--r--FreeFileSync/Source/lib/versioning.cpp227
-rw-r--r--FreeFileSync/Source/lib/versioning.h18
-rw-r--r--FreeFileSync/Source/synchronization.cpp97
-rw-r--r--FreeFileSync/Source/ui/batch_config.cpp2
-rw-r--r--FreeFileSync/Source/ui/batch_status_handler.cpp20
-rw-r--r--FreeFileSync/Source/ui/check_version.cpp36
-rw-r--r--FreeFileSync/Source/ui/custom_grid.cpp68
-rw-r--r--FreeFileSync/Source/ui/folder_selector.cpp95
-rw-r--r--FreeFileSync/Source/ui/folder_selector.h9
-rw-r--r--FreeFileSync/Source/ui/gui_generated.cpp6987
-rw-r--r--FreeFileSync/Source/ui/gui_generated.h1492
-rw-r--r--FreeFileSync/Source/ui/gui_status_handler.cpp6
-rw-r--r--FreeFileSync/Source/ui/main_dlg.cpp116
-rw-r--r--FreeFileSync/Source/ui/progress_indicator.cpp2
-rw-r--r--FreeFileSync/Source/ui/search.cpp6
-rw-r--r--FreeFileSync/Source/ui/small_dlgs.cpp110
-rw-r--r--FreeFileSync/Source/ui/small_dlgs.h4
-rw-r--r--FreeFileSync/Source/ui/sorting.h6
-rw-r--r--FreeFileSync/Source/ui/sync_cfg.cpp4
-rw-r--r--FreeFileSync/Source/ui/tree_view.cpp86
-rw-r--r--FreeFileSync/Source/ui/tree_view.h8
-rw-r--r--FreeFileSync/Source/version/version.h2
-rw-r--r--LICENSE49
-rw-r--r--wx+/file_drop.h2
-rw-r--r--wx+/graph.cpp16
-rw-r--r--wx+/image_resources.cpp3
-rw-r--r--zen/async_task.h4
-rw-r--r--zen/basic_math.h2
-rw-r--r--zen/dir_watcher.cpp157
-rw-r--r--zen/file_access.cpp489
-rw-r--r--zen/file_access.h28
-rw-r--r--zen/file_error.h18
-rw-r--r--zen/file_io.cpp99
-rw-r--r--zen/file_io.h2
-rw-r--r--zen/file_traverser.cpp14
-rw-r--r--zen/long_path_prefix.h2
-rw-r--r--zen/perf.h1
-rw-r--r--zen/recycler.cpp16
-rw-r--r--zen/recycler.h2
-rw-r--r--zen/scope_guard.h2
-rw-r--r--zen/shell_execute.h10
-rw-r--r--zen/stl_tools.h5
-rw-r--r--zen/string_base.h25
-rw-r--r--zen/string_tools.h79
-rw-r--r--zen/string_traits.h41
-rw-r--r--zen/symlink_target.h22
-rw-r--r--zen/sys_error.h3
-rw-r--r--zen/thread.h63
-rw-r--r--zen/type_tools.h3
-rw-r--r--zen/win.h4
-rw-r--r--zen/xml_io.cpp8
-rw-r--r--zen/zstring.cpp16
-rw-r--r--zen/zstring.h42
126 files changed, 13028 insertions, 9822 deletions
diff --git a/FreeFileSync/Build/Changelog.txt b/FreeFileSync/Build/Changelog.txt
index f36ff359..1b4363ae 100644
--- a/FreeFileSync/Build/Changelog.txt
+++ b/FreeFileSync/Build/Changelog.txt
@@ -1,3 +1,23 @@
+FreeFileSync 7.2 [2015-07-01]
+-----------------------------
+Support synchronization with SFTP (SSH File Transfer Protocol)
+Detailed error reporting when checking folder existence
+Synchronize MTP devices with no modification time support
+Set focus to comparison button on startup
+Fixed transactional stream clean up error if target file already existing
+Fixed incomplete input stream clean up on fadvise failure (Linux)
+Consider non-native paths for direct comparison after startup
+Revised algorithm generating folder pair display name
+Reduced number of file accesses during versioning
+Stricter language file consistency checking
+Resolved crash when running Windows 7 on CPUs without SSE2
+Improved Minidump creation handling stack overflows
+Revised path formatting to always match native representation
+Fixed about dialog layout for large font sizes
+Support Minidump creation for Windows XP
+Updated translation files
+
+
FreeFileSync 7.1 [2015-06-06]
-----------------------------
Avoid various access denied errors when synchronizing with admin rights (Windows)
diff --git a/FreeFileSync/Build/Help/html/Synchronize with FTP.html b/FreeFileSync/Build/Help/html/Synchronize with FTP.html
index a3c3a8af..42076a98 100644
--- a/FreeFileSync/Build/Help/html/Synchronize with FTP.html
+++ b/FreeFileSync/Build/Help/html/Synchronize with FTP.html
@@ -7,24 +7,15 @@
</head>
<body>
- <H2>Synchronize with FTP/WebDAV <SPAN STYLE="font-weight: normal">(Windows)</SPAN></H2>
+ <H2>Synchronize with SFTP <SPAN STYLE="font-weight: normal">(Windows)</SPAN></H2>
- <P>FreeFileSync does not support accessing FTP volumes directly. But this
- functionality can be integrated by mapping the FTP web space to a drive letter:
+ <P>FreeFileSync support synchronization with SFTP natively.
</P>
- <P><B>Example:</B> Use the free utility NetDrive (<A HREF="http://www.netdrive.net/">http://www.netdrive.net</A>)</P>
-
- <UL>
- <LI>Add a <SPAN STYLE="font-style: normal"><B>New Site</B></SPAN> and specify site name, site URL, drive letter, account and password.
- <LI>Use the newly created drive as if it were a normal hard disk.
- </UL>
-
<div class="bluebox">
<div class="bluebox_inner">
- <B>Note</B><BR>Most FTP drives set a file's time stamp to the current time when
- synchronizing ignoring the source file's time and date. As a workaround you can do a
- <A HREF="Expert%20Settings.html">Compare by File Size</A>.
+ <B>Note</B><BR>In case the FTP server sets file modification times to the current time
+ you can do a <A HREF="Expert%20Settings.html">Compare by File Size</A> as a workaround.
</div>
</div>
<BR CLEAR=LEFT>
diff --git a/FreeFileSync/Build/Languages/arabic.lng b/FreeFileSync/Build/Languages/arabic.lng
index 3326cd96..c70f3237 100644
--- a/FreeFileSync/Build/Languages/arabic.lng
+++ b/FreeFileSync/Build/Languages/arabic.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>خطأ في البنية</target>
-<source>Cannot open file %x.</source>
-<target>تعذر فتح الملف %x.</target>
+<source>Cannot find file %x.</source>
+<target></target>
<source>File %x does not contain a valid configuration.</source>
<target>لا يحتوي الملف %x تكويناً صحيحاً.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>أي عدد من أزواج المسارات البديلة من أجل ملف خيارات واحد</target>
-<source>Open configuration for edit without executing.</source>
-<target>فتح التضبيطات من أجل التعديل من دون تنفيذ الملف.</target>
+<source>Open configuration for editing without executing it.</source>
+<target></target>
<source>Cannot find the following folders:</source>
<target>تعذر العثور على المجلدات التالية:</target>
@@ -202,6 +202,82 @@
<source>Update attributes on right</source>
<target>تحديث السمات على اليسار</target>
+<source>Cannot read file %x.</source>
+<target>لا يمكن قراءة الملف %x.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target></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 write file %x.</source>
+<target>لا يمكن كتابة الملف %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>لا يمكن نسخ الرابط الرمزي من %x إلى %y</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>لا يمكن نقل الملف %x إلى %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>لا يمكن تعداد المسار %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>لا يمكن قراءة سمات الملف %x.</target>
+
+<source>Cannot find %x.</source>
+<target></target>
+
+<source>Cannot open file %x.</source>
+<target>تعذر فتح الملف %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>لا يمكن حذف المسار %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>لا يمكن حذف الملف %x.</target>
+
+<source>Cannot find device %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target></target>
+
+<source>Cannot create 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 open directory %x.</source>
+<target>لا يمكن فتح المسار %x.</target>
+
+<source>Incorrect command line:</source>
+<target>سطر أوامر خاطئ:</target>
+
+<source>Error Code %x:</source>
+<target>خطأ رقم %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target></target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -239,20 +315,14 @@
<source>Database file is corrupt:</source>
<target>ملف قاعدة البيانات معطوب:</target>
-<source>Cannot write file %x.</source>
-<target>لا يمكن كتابة الملف %x.</target>
-
-<source>Cannot read file %x.</source>
-<target>لا يمكن قراءة الملف %x.</target>
-
<source>Database files do not share a common session.</source>
<target>ملفات قواعد البيانات لا تشترك في جلسة عمل مشتركة.</target>
<source>Searching for folder %x...</source>
<target>البحث عن المجلد %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>لا يمكن قراءة سمات الملف %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target></target>
<source>Cannot get process information.</source>
<target>لا يمكن الحصول على معلومات العملية.</target>
@@ -349,6 +419,15 @@
<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>
+
<source>&Open...</source>
<target>&فتح...</target>
@@ -397,9 +476,6 @@
<source>Browse</source>
<target>تصفح</target>
-<source>Select a folder</source>
-<target>تحديد مجلد</target>
-
<source>Idle time (in seconds):</source>
<target>وقت الخمول (بالثانية)</target>
@@ -453,9 +529,6 @@ The command is triggered if:
<source>&Quit</source>
<target>إ&نهاء</target>
-<source>Incorrect command line:</source>
-<target>سطر أوامر خاطئ:</target>
-
<source>&Retry</source>
<target>إ&عادة المحاولة</target>
@@ -510,18 +583,18 @@ The command is triggered if:
<source>Updating attributes of %x</source>
<target>تحديث سمات %x</target>
+<source>%x and %y have different content.</source>
+<target></target>
+
+<source>Data verification error:</source>
+<target></target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>جاري إنشاء نسخة ظل وسيطة لـ %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>خطأ في التحقق من البيانات: يحتوي %x و %y بيانات مختلفة.</target>
-
<source>Target folder %x already existing.</source>
<target>المجلد الهدف %x موجود سابقاً.</target>
-<source>Cannot find folder %x.</source>
-<target>تعذر العثور على المجلد %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>يجب أن لا يكون حقل إدخال المجلد الهدف فارغاً.</target>
@@ -534,8 +607,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>العناصر التالية لم تحل اختلافاتها، و لن يتم مزامنتها:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>المجلدات التالية مختلفة بشكل كبير. تأكد من تقابل المجلدات بشكل صحيح من أجل المزامنة.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target></target>
<source>Not enough free disk space available in:</source>
<target>المساحة الحرة المتوفرة على القرص غير كافية:</target>
@@ -561,12 +634,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>توقفت عملية المزامنة</target>
+<source>Stopped</source>
+<target>توقف</target>
+
<source>Synchronization completed with errors</source>
<target>انتهاء عملية المزامنة مع وجود أخطء</target>
<source>Synchronization completed with warnings</source>
<target>انتهاء عملية المزامنة مع وجود تحذيرات</target>
+<source>Warning</source>
+<target>تحذير</target>
+
<source>Nothing to synchronize</source>
<target>لا يوجد شيء للمزامنة</target>
@@ -576,9 +655,6 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>جاري تنظيف ملفات المتابعة القديمة...</target>
-<source>Stopped</source>
-<target>توقف</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>بإمكانك العودة إلى نافذة FreeFileSync الرئيسية لحل هذه المشكلة.</target>
@@ -673,9 +749,6 @@ The command is triggered if:
<source>Action</source>
<target>التصرف</target>
-<source>Drag && drop</source>
-<target>سحب و إفلات</target>
-
<source>Local comparison settings</source>
<target>إعدادات المقارنة المحلية</target>
@@ -706,6 +779,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>إعدادات المزامنة المحلية</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target></target>
+
<source>&New</source>
<target>&جديد</target>
@@ -775,6 +851,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>إزالة زوج مجلدات</target>
+<source>Select SFTP folder</source>
+<target></target>
+
<source>Swap sides</source>
<target>مبادلة الجانبين</target>
@@ -832,8 +911,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>التعرف على الملفات المتساوية عن طريق مقارنة محتوى الملف</target>
-<source>Ignore time shift (in hours)</source>
-<target>إهمال الفارق الزمني (بالساعات)</target>
+<source>&Ignore time shift (in hours)</source>
+<target></target>
<source>Consider file times with specified offset as equal</source>
<target>اعتبار الملفات ذات الفارق الزمني المحدد و كأنها متساوية</target>
@@ -841,14 +920,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>تعامل مع التوقيت الصيفي</target>
-<source>Include symbolic links:</source>
-<target>تضمن السارات الرمزية:</target>
+<source>Include &symbolic links:</source>
+<target></target>
-<source>Direct</source>
-<target>مباشر</target>
+<source>&Follow</source>
+<target></target>
-<source>Follow</source>
-<target>اتبع</target>
+<source>&Direct</source>
+<target></target>
<source>More information</source>
<target>المزيد من المعلومات</target>
@@ -887,15 +966,11 @@ The command is triggered if:
<target>اكتشاف الملفات المنقولة</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
-<target>
-- تفعيل التحقق بعد المزامنة
-- يحتاج و ينشئ ملفات قواعد معطيات
-- غير مدعوم لجميع أنظمة الملفات
-</target>
+<target></target>
<source>Detect synchronization directions with the help of database files</source>
<target>تحديد اتجاه المزامنة بالاستعانة بقواعد بيانات الملفات</target>
@@ -942,6 +1017,29 @@ The command is triggered if:
<source>OK</source>
<target>موافق</target>
+<source>Enter your SFTP login details:</source>
+<target></target>
+
+<source>Server name or IP address:</source>
+<target></target>
+
+<source>Examples:</source>
+<target></target>
+
+<source>User name:</source>
+<target></target>
+
+<source>Password:</source>
+<target></target>
+
+<source>&Show password</source>
+<target></target>
+
+<source>Directory on server:</source>
+<target></target>
+
+
+
<source>Start synchronization now?</source>
<target>بدأ المزامنة الآن؟</target>
@@ -951,6 +1049,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>&لا تظهر نافذة الحوار هذه مرة ثانية</target>
+<source>Arrange folder pair</source>
+<target></target>
+
<source>Items found:</source>
<target>العناصر التي تم العثور عليها:</target>
@@ -1083,6 +1184,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>شكرا جزيلا للترجمة:</target>
+<source>SSH File Transfer Protocol</source>
+<target></target>
+
<source>Save as Batch Job</source>
<target>حفظ كمهمة دفعية</target>
@@ -1095,8 +1199,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>اختيار المطال الزمني</target>
-<source>&Preferences...</source>
-<target>&خيارات...</target>
+<source>&Preferences</source>
+<target></target>
+
+<source>Main Bar</source>
+<target>الشريط الرئيسي</target>
<source>Folder Pairs</source>
<target>أزواج المجلدات</target>
@@ -1113,9 +1220,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>نظرة عامة</target>
-<source>Main Bar</source>
-<target>الشريط الرئيسي</target>
-
<source>Confirm</source>
<target>تأكيد</target>
@@ -1240,8 +1344,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&لا تحفظ</target>
-<source>Delete selected configurations</source>
-<target>حذف الخيارات المنتقاة</target>
+<source>Remove entry from list</source>
+<target></target>
<source>Synchronization Settings</source>
<target>إعدادات المزامنة</target>
@@ -1294,8 +1398,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>إظهار الملفات التي تم فلترتها أو استبعادها بشكل مؤقت</target>
-<source>Set as default</source>
-<target>تحديد كوضع افتراضي</target>
+<source>Save as default</source>
+<target></target>
<source>Filter</source>
<target>عامل الفلترة</target>
@@ -1306,6 +1410,12 @@ This guarantees a consistent state even in case of a serious error.
<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>
@@ -1318,18 +1428,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>إنهاء نافذة حوار تقدم العملية</target>
-<source>Standby</source>
-<target>وضع الاستعداد</target>
-
<source>Log off</source>
<target>تسجيل الخروج</target>
+<source>Standby</source>
+<target>وضع الاستعداد</target>
+
<source>Shut down</source>
<target>إيقاف التشغيل</target>
-<source>Hibernate</source>
-<target>السبات</target>
-
<source>Scanning...</source>
<target>جاري الفحص...</target>
@@ -1339,9 +1446,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>معلومات</target>
-<source>Warning</source>
-<target>تحذير</target>
-
<source>Select all</source>
<target>اختيار الجميع</target>
@@ -1395,8 +1499,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>خيارات</target>
-<source>Copy NTFS permissions</source>
-<target>نسخ أذونات NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target></target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>دمج تطبيقات خارجية في قائمة السياق. تتوفر وحدات الماكرو التالية:</target>
@@ -1491,27 +1595,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>النسبة المئوية</target>
+<source>Unable to register to receive system messages.</source>
+<target>تعذر التسجيل لاستقبال رسائل النظام.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target></target>
+
<source>Cannot monitor directory %x.</source>
<target>لا يمكن مراقبة المسار %x.</target>
-<source>Cannot delete file %x.</source>
-<target>لا يمكن حذف الملف %x.</target>
-
<source>The file is locked by another process:</source>
<target>الملف مقفول من قبل عملية أخرى:</target>
-<source>Cannot move file %x to %y.</source>
-<target>لا يمكن نقل الملف %x إلى %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>لا يمكن حذف المسار %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>لا يمكن كتابة سمات الملف %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>لا يمكن كتابة وقت تعديل %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>لا يمكن قراءة سياق الأمان %x.</target>
@@ -1521,33 +1619,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>لا يمكن قراءة أذونات %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>لا يمكن كتابة أذونات %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>لا يمكن إنشاء المسار %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>لا يمكن نسخ الرابط الرمزي من %x إلى %y</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target></target>
<source>Cannot find system function %x.</source>
<target>لا يمكن العثور على وظيفة نظام %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target></target>
+
<source>Cannot copy file %x to %y.</source>
<target>لا يمكن نسخ الملف %x إلى %y.</target>
<source>Type of item %x is not supported:</source>
<target>نوع العنصر %x غير مدعوم:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>لا يمكن حل الارتباط الرمزي %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>لا يمكن فتح المسار %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>لا يمكن تعداد المسار %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1593,9 +1679,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x يوم</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>تعذر التسجيل لاستقبال رسائل النظام.</target>
-
<source>Cannot set privilege %x.</source>
<target>لا يمكن تعيين امتيازات %x.</target>
@@ -1605,23 +1688,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>تعذر تغيير أولويات I/O للعملية</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>تعذر نقل %x إلى سلة المحذوفات.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>فشل تصفح سلة المهملات من أجل الملف %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>تعذر تحديد المسار النهائي لـ %x.</target>
-
-<source>Error Code %x:</source>
-<target>خطأ رقم %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>لا يمكن قراءة عناصر XML التالية:</target>
+<source>The following XML elements could not be read:</source>
+<target></target>
-<source>Configuration file %x loaded partially only.</source>
-<target>تم تحميل ملف التكوين %x بشكلٍ جزئي فقط.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target></target>
<source>Prepare installation</source>
<target>الاستعداد للتثبيت</target>
diff --git a/FreeFileSync/Build/Languages/bulgarian.lng b/FreeFileSync/Build/Languages/bulgarian.lng
index 9c583ae8..2a3f99a2 100644
--- a/FreeFileSync/Build/Languages/bulgarian.lng
+++ b/FreeFileSync/Build/Languages/bulgarian.lng
@@ -17,13 +17,13 @@
<target>Няма промени след последната синхронизация.</target>
<source>The database entry is not in sync considering current settings.</source>
-<target>Записът в базата данни не е синхронизиран според текущите настройки.</target>
+<target>Записът в базата данни не е синхронизиран по текущите настройки.</target>
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
-<target>Задават се подразбиращи се посоки на синхронизация: старите файлове ще се заменят с по-нови.</target>
+<target>Задават се подразбирани посоки на синхронизация: старите файлове ще се заменят с по-нови.</target>
<source>Checking recycle bin availability for folder %x...</source>
-<target>Проверява достъпността на кошчето за папка %x...</target>
+<target>Проверява се достъпността на кошчето за папка %x...</target>
<source>Moving file %x to the recycle bin</source>
<target>Файл %x се премества в кошчето</target>
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Синтактична грешка</target>
-<source>Cannot open file %x.</source>
-<target>Файл %x не може да се отвори.</target>
+<source>Cannot find file %x.</source>
+<target>Не е намерен файл %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Файл %x не съдържа валидна конфигурация.</target>
@@ -89,19 +89,19 @@
<target>Път до алтернативен файл GlobalSettings.xml.</target>
<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
-<target>Произволен брой .ffs_gui и/или .ffs_batch конфигурационни файлове на FFS.</target>
+<target>Произволен брой конфигурационни файлове .ffs_gui и/или .ffs_batch на FFS.</target>
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Произволен брой алтернативни двойки директории за най-много един конфигурационен файл.</target>
-<source>Open configuration for edit without executing.</source>
+<source>Open configuration for editing without executing it.</source>
<target>Отвори конфигурацията за редактиране без изпълнение.</target>
<source>Cannot find the following folders:</source>
<target>Не са намерени следните папки:</target>
<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
-<target>Тази грешка може да се игнорира, като всяка папка се счита празна и се създава автоматично по време на синхронизацията.</target>
+<target>Може да игнорирате тази грешка, като всяка папка се счита празна и се създава автоматично по време на синхронизацията.</target>
<source>A folder input field is empty.</source>
<target>Полето за въведена папка е празно.</target>
@@ -110,7 +110,7 @@
<target>Съответната папка ще се счита празна.</target>
<source>The following folder paths are dependent from each other:</source>
-<target>Пътищата до следните папки са взаимнозависими:</target>
+<target>Пътищата до следните папки са взаимно зависими:</target>
<source>File %x has an invalid date.</source>
<target>Файл %x има невалидна дата.</target>
@@ -140,7 +140,7 @@
<target>Създава се списък на файловете...</target>
<source>Starting comparison</source>
-<target>Започва сравняването</target>
+<target>Сравняването започва</target>
<source>Calculating sync directions...</source>
<target>Пресмятат се посоките на синхронизация...</target>
@@ -167,7 +167,7 @@
<target>Двете страни са еднакви</target>
<source>Conflict/item cannot be categorized</source>
-<target>Конфликт/Елемент, който не може да се категоризира</target>
+<target>Конфликт/Елементът не може да се категоризира</target>
<source>Copy new item to left</source>
<target>Копирай новия елемент наляво</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>Актуализирай атрибутите на десния елемент</target>
+<source>Cannot read file %x.</source>
+<target>Не може да се прочете файл %x.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Неочакван размер на потока данни.
+Очаквани: %x байта
+Действителни: %y байта
+</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 write file %x.</source>
+<target>Не може да се запише файл %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Не може да се копира символната връзка %x в %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Не може да се премести файл %x в %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Не може да се прочете директория %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Не могат да се прочетат атрибутите на файл %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Не е намерен %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Не може да се отвори файл %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Не е намерено устройство %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Не може да се определи свободното дисково пространство за %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Не може да се създаде директория %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Не може да се изтрие директория %x.</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>Не може да се отвори директория %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Невалиден команден ред:</target>
+
+<source>Error Code %x:</source>
+<target>Код на грешка %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Неуспешно свързване към SFTP-сървър %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -221,7 +301,7 @@
<target>%x ГБ</target>
<source>Cannot load file %x.</source>
-<target>Файл %x не може да се зареди.</target>
+<target>Не може да се зареди файл %x.</target>
<source>Database file %x is incompatible.</source>
<target>Файлът на базата данни %x е несъвместим.</target>
@@ -235,26 +315,20 @@
<source>Database file is corrupt:</source>
<target>Файлът на базата данни е повреден:</target>
-<source>Cannot write file %x.</source>
-<target>Файл %x не може да се запише.</target>
-
-<source>Cannot read file %x.</source>
-<target>Файл %x не може да се прочете.</target>
-
<source>Database files do not share a common session.</source>
<target>Файловете на базата данни не споделят обща сесия.</target>
<source>Searching for folder %x...</source>
<target>Търсене на папка %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Атрибутите на файл %x не могат да се прочетат.</target>
+<source>Time out 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>
+<target>Изчаква се, докато е заключена директорията:</target>
<source>Lock owner:</source>
<target>Притежател на заключването:</target>
@@ -269,13 +343,13 @@
</target>
<source>Detecting abandoned lock...</source>
-<target>Открива изоставено заключване...</target>
+<target>Откриване на изоставено заключване...</target>
<source>Creating file %x</source>
-<target>Създава файл %x</target>
+<target>Създава се файл %x</target>
<source>Saving file %x...</source>
-<target>Запазва файл %x...</target>
+<target>Запазва се файл %x...</target>
<source>Items processed:</source>
<target>Обработени елементи:</target>
@@ -293,7 +367,7 @@
<target>Не може да се заключи директорията за %x.</target>
<source>Scanning:</source>
-<target>Търси файлове:</target>
+<target>Търсят се файлове:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -326,7 +400,7 @@
<target>Моля, ползвайте 64-бит. версия на FFS за създаване фонови копия на тази система.</target>
<source>Cannot determine volume name for %x.</source>
-<target>Името на тома за %x не може да се определи.</target>
+<target>Не може да се определи името на тома за %x.</target>
<source>Volume name %x is not part of file path %y.</source>
<target>Името на тома %x не е част от пътя до файла %y.</target>
@@ -337,6 +411,15 @@
<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>
+
<source>&Open...</source>
<target>&Отвори...</target>
@@ -371,7 +454,7 @@
<target>3. Натиснете 'Старт'.</target>
<source>To get started just import a .ffs_batch file.</source>
-<target>За стартиране просто импортирайте файл .ffs_batch.</target>
+<target>Просто импортирайте файл .ffs_batch за стартиране.</target>
<source>Folders to watch:</source>
<target>Папки за следене:</target>
@@ -385,14 +468,11 @@
<source>Browse</source>
<target>Преглед</target>
-<source>Select a folder</source>
-<target>Изберете папка</target>
-
<source>Idle time (in seconds):</source>
<target>Време на изчакване (сек.):</target>
<source>Idle time between last detected change and execution of command</source>
-<target>Време на изчакване между последнaта открита промяна и изпълнението на командата</target>
+<target>Време на изчакване между последнaта открита промяна и изпълнение на командата</target>
<source>Command line:</source>
<target>Команден ред:</target>
@@ -427,7 +507,7 @@ The command is triggered if:
<target>Следенето на директории е активирано</target>
<source>Waiting until all directories are available...</source>
-<target>Изчаква достъпност на всички директории...</target>
+<target>Изчаква се достъпност на всички директории...</target>
<source>Error</source>
<target>Грешка</target>
@@ -441,9 +521,6 @@ The command is triggered if:
<source>&Quit</source>
<target>Кра&й</target>
-<source>Incorrect command line:</source>
-<target>Невалиден команден ред:</target>
-
<source>&Retry</source>
<target>Пов&торение</target>
@@ -498,18 +575,18 @@ The command is triggered if:
<source>Updating attributes of %x</source>
<target>Актуализира атрибутите на %x</target>
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Създава Volume Shadow Copy за %x...</target>
+<source>%x and %y have different content.</source>
+<target>%x и %y имат различно съдържание.</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Грешка при верификация: %x и %y имат различно съдържание.</target>
+<source>Data verification error:</source>
+<target>Грешка при верификация на данните:</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>Cannot find folder %x.</source>
-<target>Не е открита папка %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Полето за целева папка не бива да е празно.</target>
@@ -522,8 +599,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Следните елементи имат нерешени конфликти и няма да бъдат синхронизирани:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Следните папки са съществено различни. Убедете се, че са зададени съответни папки за синхронизация.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Следните папки са съществено различни. Уверете се, че сте избрали точните папки за синхронизация.</target>
<source>Not enough free disk space available in:</source>
<target>Недостатъчно свободно дисково пространство в:</target>
@@ -541,7 +618,7 @@ The command is triggered if:
<target>Синхронизация на двойка папки:</target>
<source>Generating database...</source>
-<target>Създаване на база данни...</target>
+<target>Създава се база данни...</target>
<source>job name</source>
<target>име на задачата</target>
@@ -549,12 +626,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>Синхронизацията е спряна</target>
+<source>Stopped</source>
+<target>Стопирано</target>
+
<source>Synchronization completed with errors</source>
<target>Синхронизацията завърши с грешки</target>
<source>Synchronization completed with warnings</source>
<target>Синхронизацията завърши с предупреждения</target>
+<source>Warning</source>
+<target>Предупреждение</target>
+
<source>Nothing to synchronize</source>
<target>Няма нищо за синхронизиране</target>
@@ -562,13 +645,10 @@ The command is triggered if:
<target>Синхронизацията завърши успешно</target>
<source>Cleaning up old log files...</source>
-<target>Изчиства старите log-файлове...</target>
-
-<source>Stopped</source>
-<target>Стопирано</target>
+<target>Изчистват се старите log-файлове...</target>
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
-<target>За решаване на този проблем може да превключите на главното меню на FreeFileSync.</target>
+<target>За решаване на този проблем може да превключите на главното меню на FFS.</target>
<source>&Don't show this warning again</source>
<target>Не показвай ве&че това предупреждение</target>
@@ -580,7 +660,7 @@ The command is triggered if:
<target>Превкл&ючи</target>
<source>Switching to FreeFileSync's main window</source>
-<target>Превключва към главното меню на FreeFileSync</target>
+<target>Превключване към главното меню на FFS</target>
<source>
<pluralform>Automatic retry in 1 second...</pluralform>
@@ -595,7 +675,7 @@ The command is triggered if:
<target>Игнорирай сле&дващите грешки</target>
<source>Retrying operation...</source>
-<target>Повтаря операцията...</target>
+<target>Повтаря се операцията...</target>
<source>Serious Error</source>
<target>Сериозна грешка</target>
@@ -607,7 +687,7 @@ The command is triggered if:
<target>Има нова версия на FreeFileSync:</target>
<source>Download now?</source>
-<target>Свали сега?</target>
+<target>Свали веднага?</target>
<source>&Download</source>
<target>Свал&яне</target>
@@ -616,10 +696,10 @@ The command is triggered if:
<target>FreeFileSync вече е актуална.</target>
<source>Unable to connect to www.freefilesync.org.</source>
-<target>Не мога да се свържа с www.freefilesync.org.</target>
+<target>Не може да се свърже с www.freefilesync.org.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
-<target>Номера на текущата версия на FreeFileSync не е открит онлайн. Ще опитате ли ръчно?</target>
+<target>Не е открит номера на текущата версия на FFS онлайн. Ще опитате ли ръчно?</target>
<source>&Check</source>
<target>Оп&итай</target>
@@ -657,9 +737,6 @@ The command is triggered if:
<source>Action</source>
<target>Действие</target>
-<source>Drag && drop</source>
-<target>Влачи && Пусни</target>
-
<source>Local comparison settings</source>
<target>Локални настройки за сравняване</target>
@@ -690,6 +767,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>Локални Настройки за Синхронизация</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Избраната папка %x не може да се ползва с FreeFileSync. Моля, изберете папка от локална файлова система, мрежа или MTP-устройство.</target>
+
<source>&New</source>
<target>&Нов</target>
@@ -697,7 +777,7 @@ The command is triggered if:
<target>&Запази</target>
<source>Save as &batch job...</source>
-<target>Запази &като пакетна задача</target>
+<target>Запази &като пакетна задача...</target>
<source>Start &comparison</source>
<target>Почни &сравняване</target>
@@ -709,7 +789,7 @@ The command is triggered if:
<target>&Настройки на филтъра</target>
<source>S&ynchronization settings</source>
-<target>Настройки на с&инхронизацията</target>
+<target>Настройки на с&инхронизация</target>
<source>Start &synchronization</source>
<target>Почни &синхронизация</target>
@@ -730,7 +810,7 @@ The command is triggered if:
<target>&Инициализирай изгледа</target>
<source>&Export file list...</source>
-<target>Експорт на &файловия списък...</target>
+<target>&Експортирай файловия списък...</target>
<source>&Tools</source>
<target>Инстр&ументи</target>
@@ -739,10 +819,10 @@ The command is triggered if:
<target>&Провери за нова версия</target>
<source>&Check now</source>
-<target>&Провери сега</target>
+<target>&Веднага</target>
<source>Check &automatically once a week</source>
-<target>Проверявай &автоматично ежеседмично</target>
+<target>&Автоматично веднъж седмично</target>
<source>Cancel</source>
<target>Отказ</target>
@@ -759,6 +839,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>Отнемане на двойка папки</target>
+<source>Select SFTP folder</source>
+<target>Изберете SFTP-папка</target>
+
<source>Swap sides</source>
<target>Размяна на страните</target>
@@ -772,7 +855,7 @@ The command is triggered if:
<target>Спазвай регистъра</target>
<source>New</source>
-<target>Нов</target>
+<target>Нова</target>
<source>Open...</source>
<target>Отвори...</target>
@@ -784,10 +867,10 @@ The command is triggered if:
<target>Запази като...</target>
<source>View type:</source>
-<target>Тип изглед:</target>
+<target>Изберете тип:</target>
<source>Select view:</source>
-<target>Изберете изглед:</target>
+<target>Изберете показване:</target>
<source>Statistics:</source>
<target>Статистика:</target>
@@ -805,34 +888,40 @@ The command is triggered if:
<target>Общо байтове за копиране</target>
<source>Use local settings:</source>
-<target>Ползвай локални настройки</target>
+<target>Ползвай локални настройки:</target>
<source>Select a variant:</source>
-<target>Избор на вариант:</target>
+<target>Изберете вариант:</target>
<source>Identify equal files by comparing modification time and size.</source>
-<target>Определи еднаквите файлове, сравнявайки времето на промяна и размера.</target>
+<target>
+Определяне на еднаквите файлове,
+сравнявайки времето на промяна и размера.
+</target>
<source>Identify equal files by comparing the file content.</source>
-<target>Определи еднаквите файлове, сравнявайки файловото съдържание.</target>
+<target>
+Определяне на еднаквите файлове,
+сравнявайки файловото съдържание.
+</target>
-<source>Ignore time shift (in hours)</source>
-<target>Игнорирай отместването на времето (в часове)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Игнорирай разликата във времето (в часове)</target>
<source>Consider file times with specified offset as equal</source>
-<target>Считай файловите времена със зададено отместване за еднакви</target>
+<target>Считай файловите времена със зададена разлика за еднакви</target>
<source>Handle daylight saving time</source>
<target>Отчитай лятното време</target>
-<source>Include symbolic links:</source>
-<target>Включи символни връзки:</target>
+<source>Include &symbolic links:</source>
+<target>Включи &символни връзки:</target>
-<source>Direct</source>
-<target>Директно</target>
+<source>&Follow</source>
+<target>&Следвай</target>
-<source>Follow</source>
-<target>Следвай</target>
+<source>&Direct</source>
+<target>&Директно</target>
<source>More information</source>
<target>Още информация</target>
@@ -862,7 +951,10 @@ The command is triggered if:
<target>Максимум:</target>
<source>Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair.</source>
-<target>Изберете филтърни правила за изключване на някои файлове от синхронизация. Въведете файлови пътища относно съответните им двойки папки.</target>
+<target>
+Изберете филтърни правила за изключване на някои файлове от синхронизация.
+Въведете относителни файлови пътища към съответните двойки папки.
+</target>
<source>C&lear</source>
<target>И&зчисти</target>
@@ -871,14 +963,14 @@ The command is triggered if:
<target>Откриване на преместени файлове</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Откриването е активно след начална синхронизация,
-- Изисква и създава файлове на базата данни,
-- Не се поддържа от всички файлови системи.
+- Не се поддържа от всички файлови системи,
+- Изисква и създава файлове с бази данни,
+- Няма откриване при първа синхронизация.
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -906,7 +998,7 @@ The command is triggered if:
<target>Премести файловете в зададена потребителска папка</target>
<source>Naming convention:</source>
-<target>Конвенция за преименуване:</target>
+<target>Конвенция за именуване:</target>
<source>Handle errors:</source>
<target>Обработка на грешки:</target>
@@ -915,7 +1007,7 @@ The command is triggered if:
<target>Скрий всички грешки и предупреждения</target>
<source>&Pop-up</source>
-<target>&Запитай</target>
+<target>&Попитай</target>
<source>Show pop-up on errors or warnings</source>
<target>Питай при грешки или предупреждения</target>
@@ -926,8 +1018,29 @@ The command is triggered if:
<source>OK</source>
<target>ОК</target>
+<source>Enter your SFTP login details:</source>
+<target>Въведете данните си за SFTP-логване:</target>
+
+<source>Server name or IP address:</source>
+<target>Име на сървъра или IP-адрес:</target>
+
+<source>Examples:</source>
+<target>Примери:</target>
+
+<source>User name:</source>
+<target>Потребителско име:</target>
+
+<source>Password:</source>
+<target>Парола:</target>
+
+<source>&Show password</source>
+<target>&Покажи паролата</target>
+
+<source>Directory on server:</source>
+<target>Директория на сървъра:</target>
+
<source>Start synchronization now?</source>
-<target>Почни синхронизация сега?</target>
+<target>Почни синхронизация веднага?</target>
<source>Variant:</source>
<target>Вариант:</target>
@@ -935,6 +1048,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>&Не показвай вече този диалог</target>
+<source>Arrange folder pair</source>
+<target>Подреди двойката папки</target>
+
<source>Items found:</source>
<target>Намерени елементи:</target>
@@ -963,7 +1079,7 @@ The command is triggered if:
<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>
+<target>Създаване на пакетен файл за автоматична синхронизация. За старт щракнете двукратно върху този файл или задайте планова задача: %x</target>
<source>&Stop</source>
<target>&Стоп</target>
@@ -972,7 +1088,7 @@ The command is triggered if:
<target>Спри синхронизацията при първа грешка</target>
<source>Run minimized</source>
-<target>Изпълнявай в минимизиран вид</target>
+<target>Изпълни в минимизиран вид</target>
<source>Save log:</source>
<target>Запази протокол:</target>
@@ -987,7 +1103,7 @@ The command is triggered if:
<target>Как се планира пакетна задача?</target>
<source>The following settings are used for all synchronization jobs.</source>
-<target>Следните настройки се ползват от всички задачи за синхронизация:</target>
+<target>Следните настройки се ползват от всички задачи за синхронизация.</target>
<source>Fail-safe file copy</source>
<target>Надеждно копиране на файлове</target>
@@ -1008,7 +1124,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Копирай заключени файлове</target>
<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target>Копирай споделени или заключени файлове с услугата Volume Shadow Copy</target>
+<target>Копирай споделени или заключени файлове с услугата Volume Shadow Copy.</target>
<source>(requires administrator rights)</source>
<target>(изисква администраторски права)</target>
@@ -1026,7 +1142,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Брой повторения:</target>
<source>Delay (in seconds):</source>
-<target>Забавяне (сек.):</target>
+<target>Задръжка (сек.):</target>
<source>Customize context menu:</source>
<target>Настрой контекстното меню:</target>
@@ -1067,6 +1183,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>Благодарности за локализацията:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH File Transfer Protocol</target>
+
<source>Save as Batch Job</source>
<target>Запази като пакетна задача</target>
@@ -1079,8 +1198,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Избери интервала време</target>
-<source>&Preferences...</source>
-<target>&Предпочитания...</target>
+<source>&Preferences</source>
+<target>&Предпочитания</target>
+
+<source>Main Bar</source>
+<target>Главен панел</target>
<source>Folder Pairs</source>
<target>Двойки папки</target>
@@ -1097,9 +1219,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>Обзор</target>
-<source>Main Bar</source>
-<target>Главен панел</target>
-
<source>Confirm</source>
<target>Потвърждение</target>
@@ -1138,8 +1257,8 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Showing %y of %x rows</pluralform>
</source>
<target>
-<pluralform>Показва %y от 1 ред</pluralform>
-<pluralform>Показва %y от %x реда</pluralform>
+<pluralform>Показани: %y от 1 ред</pluralform>
+<pluralform>Показани: %y от %x реда</pluralform>
</target>
<source>Set direction:</source>
@@ -1182,7 +1301,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Големи</target>
<source>Select time span...</source>
-<target>Избори интервала време...</target>
+<target>Избери интервала време...</target>
<source>Show "%x"</source>
<target>Покажи "%x"</target>
@@ -1203,16 +1322,16 @@ This guarantees a consistent state even in case of a serious error.
<target>Ще запазите ли промените на %x?</target>
<source>Never save &changes</source>
-<target>&Не запазвай промените никога</target>
+<target>&Не запазвай никога промените</target>
<source>Do&n't save</source>
<target>&Не запазвай</target>
-<source>Delete selected configurations</source>
-<target>Изтрий маркираните конфигурации</target>
+<source>Remove entry from list</source>
+<target>Премахни позицията от списъка</target>
<source>Synchronization Settings</source>
-<target>Настройки на синхронизацията</target>
+<target>Настройки на синхронизация</target>
<source>Clear filter</source>
<target>Изчисти филтъра</target>
@@ -1262,8 +1381,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>Покажи филтрираните или временно изключени файлове</target>
-<source>Set as default</source>
-<target>Задай по подразбиране</target>
+<source>Save as default</source>
+<target>Запази като подразбирано</target>
<source>Filter</source>
<target>Филтър</target>
@@ -1272,32 +1391,35 @@ This guarantees a consistent state even in case of a serious error.
<target>Всички файлове са синхронизирани</target>
<source>Cannot find %x</source>
-<target>%x не може да се намери.</target>
+<target>Не е намерен %x</target>
+
+<source>Move up</source>
+<target>Премести нагоре</target>
+
+<source>Move down</source>
+<target>Премести надолу</target>
<source>Comma-separated values</source>
-<target>Стойности, отделени със запетаи</target>
+<target>Отделени със запетая стойности</target>
<source>File list exported</source>
<target>Файловия списък е експортиран</target>
<source>Searching for program updates...</source>
-<target>Търсене на актуални версии на програмата...</target>
+<target>Търсене на обновления на програмата...</target>
<source>Close progress dialog</source>
<target>Затвори диалога</target>
-<source>Standby</source>
-<target>Режим на очакване</target>
-
<source>Log off</source>
<target>Излез от сесията</target>
+<source>Standby</source>
+<target>Режим на очакване</target>
+
<source>Shut down</source>
<target>Изключи компютъра</target>
-<source>Hibernate</source>
-<target>Хибернация</target>
-
<source>Scanning...</source>
<target>Търсене на файлове...</target>
@@ -1307,9 +1429,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Информация</target>
-<source>Warning</source>
-<target>Предупреждение</target>
-
<source>Select all</source>
<target>Маркирай всичко</target>
@@ -1355,11 +1474,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>Предпочитания</target>
-<source>Copy NTFS permissions</source>
-<target>Копирай NTFS-правата за достъп</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<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 name</source>
<target>- пълно име на файла или папката</target>
@@ -1380,16 +1499,16 @@ This guarantees a consistent state even in case of a serious error.
<target>&Покажи</target>
<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
-<target>Определи и разпространи промените върху двете страни. Изтривания, премествания и конфликти се откриват автоматично чрез база данни.</target>
+<target>Откриване и разпростиране на промените в двете страни. Изтривания, премествания и конфликти се откриват автоматично с база данни.</target>
<source>Create a mirror backup of the left folder by adapting the right folder to match.</source>
-<target>Създай огледално копие на лявата папка, привеждайки дясната папка в съответствие.</target>
+<target>Създаване на огледално копие на лявата папка, привеждайки дясната папка в съответствие.</target>
<source>Copy new and updated files to the right folder.</source>
-<target>Копирай новите и актуализирани файлове към дясната папка.</target>
+<target>Копиране на новите и актуализирани файлове към дясната папка.</target>
<source>Configure your own synchronization rules.</source>
-<target>Дефинирай свои правила за синхронизация.</target>
+<target>Създаване на собствени правила за синхронизация.</target>
<source>Today</source>
<target>Днес</target>
@@ -1451,63 +1570,45 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>Процент</target>
-<source>Cannot monitor directory %x.</source>
-<target>Директория %x не може да се следи.</target>
+<source>Unable to register to receive system messages.</source>
+<target>Регистрацията за получаване на системни съобщения е невъзможна.</target>
-<source>Cannot delete file %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 move file %x to %y.</source>
-<target>Файл %x не може да се премести в %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Директория %x не може да се изтрие.</target>
-
<source>Cannot write file attributes of %x.</source>
-<target>Файловите атрибути на %x не могат да се запишат.</target>
-
-<source>Cannot write modification time of %x.</source>
-<target>Времето на промяна на %x не може да се запише.</target>
+<target>Не могат да се запишат файловите атрибути на %x.</target>
<source>Cannot read security context of %x.</source>
-<target>Контекста на сигурност на %x не може да се прочете.</target>
+<target>Не може да се прочете контекста за сигурност на %x.</target>
<source>Cannot write security context of %x.</source>
-<target>Контекста на сигурност на %x не може да се запише.</target>
+<target>Не може да се запише контекста за сигурност на %x.</target>
<source>Cannot read permissions of %x.</source>
-<target>Правата за достъп на %x не могат да се прочетат.</target>
-
-<source>Cannot write permissions of %x.</source>
-<target>Правата за достъп на %x не могат да се запишат.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Директория %x не може да се създаде.</target>
+<target>Не могат да се прочетат правата за достъп на %x.</target>
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Символната връзка %x не може да се копира в %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Не могат да се копират правата за достъп от %x в %y.</target>
<source>Cannot find system function %x.</source>
-<target>Системната функция %x не може да се намери.</target>
+<target>Не е намерена системната функция %x.</target>
+
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Не могат да се копират атрибутите от %x в %y.</target>
<source>Cannot copy file %x to %y.</source>
-<target>Файл %x не може да се копира в %y.</target>
+<target>Не може да се копира файл %x в %y.</target>
<source>Type of item %x is not supported:</source>
<target>Типа на елемент %x не се поддържа:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Символната връзка %x не може да се проследи.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Директория %x не може да се отвори.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Директория %x не може да се попълни.</target>
-
<source>%x TB</source>
<target>%x ТБ</target>
@@ -1541,9 +1642,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x дена</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Регистрацията за получаване на системни съобщения е невъзможна.</target>
-
<source>Cannot set privilege %x.</source>
<target>Привилегията %x не може да се зададе.</target>
@@ -1553,23 +1651,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>I/O-приоритета на процеса не може да се измени.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>%x не може да се премести в кошчето.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Проверката на кошчето за папка %x е неуспешна.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Крайния път на %x не може да се определи.</target>
-
-<source>Error Code %x:</source>
-<target>Код на грешка %x:</target>
-
-<source>Cannot read the following XML elements:</source>
+<source>The following XML elements could not be read:</source>
<target>Следните XML-елементи не могат да се прочетат:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Конфигурационния файл %x се зареди само частично.</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>
diff --git a/FreeFileSync/Build/Languages/chinese_simple.lng b/FreeFileSync/Build/Languages/chinese_simple.lng
index 64db8dc5..4c581f19 100644
--- a/FreeFileSync/Build/Languages/chinese_simple.lng
+++ b/FreeFileSync/Build/Languages/chinese_simple.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>语法错误</target>
-<source>Cannot open file %x.</source>
-<target>无法打开文件 %x.</target>
+<source>Cannot find file %x.</source>
+<target>无法找到文件 %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>文件 %x 并未包含合法的配置.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>任意数量的替代目录对的最多一个配置文件.</target>
-<source>Open configuration for edit without executing.</source>
-<target>打开配置用于编辑而不执行.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>打开配置文件进行编辑而不执行它.</target>
<source>Cannot find the following folders:</source>
<target>无法找到如下文件夹:</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>更新右侧的文件属性</target>
+<source>Cannot read file %x.</source>
+<target>无法读取文件 %x .</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+意外大小的数据流.
+预期: %x 字节
+实际: %y 字节
+</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 write file %x.</source>
+<target>无法写入文件 %x .</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>无法复制符号连接 %x 到 %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>无法移动文件 %x 到 %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>无法列举目录 %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>无法读取 %x 的文件属性.</target>
+
+<source>Cannot find %x.</source>
+<target>无法找到 %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>无法打开文件 %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>无法找到设备 %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>无法确定 %x 上的可用磁盘空间.</target>
+
+<source>Cannot create directory %x.</source>
+<target>无法创建目录 %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>无法删除目录 %x.</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>无法打开目录 %x.</target>
+
+<source>Incorrect command line:</source>
+<target>不正确的命令行:</target>
+
+<source>Error Code %x:</source>
+<target>错误代码 %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>无法连接到SFTP服务器 %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -234,20 +314,14 @@
<source>Database file is corrupt:</source>
<target>数据库文件已损坏:</target>
-<source>Cannot write file %x.</source>
-<target>无法写入文件 %x .</target>
-
-<source>Cannot read file %x.</source>
-<target>无法读取文件 %x .</target>
-
<source>Database files do not share a common session.</source>
<target>数据库文件并未共享一个公共会话.</target>
<source>Searching for folder %x...</source>
<target>正在搜索文件夹 %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>无法读取 %x 的文件属性.</target>
+<source>Time out while searching for folder %x.</source>
+<target>搜索文件夹 %x 超时.</target>
<source>Cannot get process information.</source>
<target>无法取得进程信息.</target>
@@ -334,6 +408,15 @@
<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>
+
<source>&Open...</source>
<target>打开(&O)...</target>
@@ -382,9 +465,6 @@
<source>Browse</source>
<target>浏览</target>
-<source>Select a folder</source>
-<target>选择一个文件夹</target>
-
<source>Idle time (in seconds):</source>
<target>空闲时间(秒):</target>
@@ -438,9 +518,6 @@ The command is triggered if:
<source>&Quit</source>
<target>退出(&Q)</target>
-<source>Incorrect command line:</source>
-<target>不正确的命令行:</target>
-
<source>&Retry</source>
<target>重试(&R)</target>
@@ -475,7 +552,7 @@ The command is triggered if:
<target>正在移动符号连接 %x 到 %y</target>
<source>Removing old versions...</source>
-<target>移除旧版本</target>
+<target>移除旧版本...</target>
<source>Creating symbolic link %x</source>
<target>正在创建符号连接 %x</target>
@@ -495,18 +572,18 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>正在为 %x 创建一个卷影副本...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>数据校验错误: %x 和 %y 有不同的内容.</target>
-
<source>Target folder %x already existing.</source>
<target>目标文件夹 %x 已经存在.</target>
-<source>Cannot find folder %x.</source>
-<target>无法找到文件夹 %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>目标文件夹输入框必须不为空.</target>
@@ -519,8 +596,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>如下项目有无法解决的冲突并将不会被同步:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>如下的文件夹有显著的不同. 请确认你为同步配对了正确的文件夹.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>下列文件夹有明显的不同. 请确认你已选择了正确的文件夹来进行同步.</target>
<source>Not enough free disk space available in:</source>
<target>没有足够的可用磁盘空间用于:</target>
@@ -546,12 +623,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>同步已停止</target>
+<source>Stopped</source>
+<target>已停止</target>
+
<source>Synchronization completed with errors</source>
<target>同步已完成但有错误</target>
<source>Synchronization completed with warnings</source>
<target>同步已完成但有警告</target>
+<source>Warning</source>
+<target>警告</target>
+
<source>Nothing to synchronize</source>
<target>没有什么可同步</target>
@@ -561,9 +644,6 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>正在清理旧日志文件...</target>
-<source>Stopped</source>
-<target>已停止</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>你可以切换至 FreeFileSync 的主窗口来解决这个问题.</target>
@@ -653,9 +733,6 @@ The command is triggered if:
<source>Action</source>
<target>动作</target>
-<source>Drag && drop</source>
-<target>拖放</target>
-
<source>Local comparison settings</source>
<target>本地比较设置</target>
@@ -686,6 +763,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>本地同步设置</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>已选择的文件夹 %x 无法用于FreeFileSync. 请选择在本地文件系统, 网络或MTP设备上的文件夹.</target>
+
<source>&New</source>
<target>新建(&N)</target>
@@ -693,7 +773,7 @@ The command is triggered if:
<target>保存(&S)</target>
<source>Save as &batch job...</source>
-<target>另存为批处理作业(&B)</target>
+<target>另存为批处理作业(&B)...</target>
<source>Start &comparison</source>
<target>开始比较(&C)</target>
@@ -720,7 +800,7 @@ The command is triggered if:
<target>切换语言(&L)</target>
<source>&Find...</source>
-<target>查找...(&F)</target>
+<target>查找(&F)...</target>
<source>&Reset layout</source>
<target>重置布局(&R)</target>
@@ -755,6 +835,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>移除文件夹对</target>
+<source>Select SFTP folder</source>
+<target>选择SFTP文件夹</target>
+
<source>Swap sides</source>
<target>两侧互换</target>
@@ -812,8 +895,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>以比较文件内容来识别相同的文件.</target>
-<source>Ignore time shift (in hours)</source>
-<target>忽略时间偏移(以小时计)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>忽略时间转换(以小时为单位)(&I)</target>
<source>Consider file times with specified offset as equal</source>
<target>将文件时间有指定的偏移时视为相等</target>
@@ -821,14 +904,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>处理夏令时</target>
-<source>Include symbolic links:</source>
-<target>包括符号连接:</target>
+<source>Include &symbolic links:</source>
+<target>包括符号连接(&S):</target>
-<source>Direct</source>
-<target>直接</target>
+<source>&Follow</source>
+<target>跟随(&F)</target>
-<source>Follow</source>
-<target>跟随</target>
+<source>&Direct</source>
+<target>直接(&D)</target>
<source>More information</source>
<target>更多信息</target>
@@ -867,14 +950,14 @@ The command is triggered if:
<target>检测被移动的文件</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- 检测在初始化同步之后生效
-- 需要并且会创建数据库文件
-- 不被所有文件系统支持
+- 不被所有文件系统所支持
+- 需要创建数据库文件
+- 首次同步时检测不可用
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -922,6 +1005,27 @@ The command is triggered if:
<source>OK</source>
<target>确定</target>
+<source>Enter your SFTP login details:</source>
+<target>输入你的SFTP登录详情:</target>
+
+<source>Server name or IP address:</source>
+<target>服务器名称或IP地址:</target>
+
+<source>Examples:</source>
+<target>例如:</target>
+
+<source>User name:</source>
+<target>用户名:</target>
+
+<source>Password:</source>
+<target>密码:</target>
+
+<source>&Show password</source>
+<target>显示密码(&S)</target>
+
+<source>Directory on server:</source>
+<target>服务器上的目录:</target>
+
<source>Start synchronization now?</source>
<target>现在开始同步吗?</target>
@@ -931,6 +1035,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>不要再显示这个对话框(&D)</target>
+<source>Arrange folder pair</source>
+<target>排列文件夹对</target>
+
<source>Items found:</source>
<target>已找到的项目:</target>
@@ -1060,6 +1167,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>非常感谢以下本地化翻译者:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH文件传输协议</target>
+
<source>Save as Batch Job</source>
<target>另存为批处理作业</target>
@@ -1072,9 +1182,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>选择时间跨度</target>
-<source>&Preferences...</source>
+<source>&Preferences</source>
<target>首选项(&P)</target>
+<source>Main Bar</source>
+<target>主工具栏</target>
+
<source>Folder Pairs</source>
<target>文件夹对</target>
@@ -1090,9 +1203,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>摘要</target>
-<source>Main Bar</source>
-<target>主工具栏</target>
-
<source>Confirm</source>
<target>确认</target>
@@ -1197,8 +1307,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>不保存(&N)</target>
-<source>Delete selected configurations</source>
-<target>删除已选定的配置文件</target>
+<source>Remove entry from list</source>
+<target>从列表中移除此项</target>
<source>Synchronization Settings</source>
<target>同步设置</target>
@@ -1251,8 +1361,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>显示已被过滤或被临时排除的文件</target>
-<source>Set as default</source>
-<target>设置为默认值</target>
+<source>Save as default</source>
+<target>保存为默认值</target>
<source>Filter</source>
<target>过滤器</target>
@@ -1263,6 +1373,12 @@ This guarantees a consistent state even in case of a serious error.
<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>逗号分割的数值(CSV)</target>
@@ -1275,18 +1391,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>关闭进度对话框</target>
-<source>Standby</source>
-<target>待机</target>
-
<source>Log off</source>
<target>注销</target>
+<source>Standby</source>
+<target>待机</target>
+
<source>Shut down</source>
<target>关机</target>
-<source>Hibernate</source>
-<target>休眠</target>
-
<source>Scanning...</source>
<target>正扫描...</target>
@@ -1296,9 +1409,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>信息</target>
-<source>Warning</source>
-<target>警告</target>
-
<source>Select all</source>
<target>选择全部</target>
@@ -1342,8 +1452,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>首选项</target>
-<source>Copy NTFS permissions</source>
-<target>复制NTFS权限</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>复制DACL, SACL, 所有者, 群组</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>集成外部应用程序到右键菜单. 如下宏可用:</target>
@@ -1438,27 +1548,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>百分比</target>
+<source>Unable to register to receive system messages.</source>
+<target>无法注册以接收系统信息.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>无法为 %x 注册设备通知.</target>
+
<source>Cannot monitor directory %x.</source>
<target>无法监视目录 %x.</target>
-<source>Cannot delete file %x.</source>
-<target>无法删除文件 %x.</target>
-
<source>The file is locked by another process:</source>
<target>此文件被另一进程锁定:</target>
-<source>Cannot move file %x to %y.</source>
-<target>无法移动文件 %x 到 %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>无法删除目录 %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>无法写入 %x 的文件属性.</target>
-<source>Cannot write modification time of %x.</source>
-<target>无法写入 %x 的最后修改时间.</target>
-
<source>Cannot read security context of %x.</source>
<target>无法读取 %x 的安全上下文.</target>
@@ -1468,33 +1572,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>无法读取 %x 的权限.</target>
-<source>Cannot write permissions of %x.</source>
-<target>无法写入 %x 的权限.</target>
-
-<source>Cannot create directory %x.</source>
-<target>无法创建目录 %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>无法复制符号连接 %x 到 %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>无法从 %x 复制权限到 %y.</target>
<source>Cannot find system function %x.</source>
<target>无法找到系统功能 %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>无法从 %x 复制属性到 %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>无法复制文件 %x 到 %y.</target>
<source>Type of item %x is not supported:</source>
<target>%x 的类型不被支持:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>无法解决符号连接 %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>无法打开目录 %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>无法列举目录 %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1525,9 +1617,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x 天</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>无法注册以接收系统信息.</target>
-
<source>Cannot set privilege %x.</source>
<target>无法设置 %x 的特权.</target>
@@ -1537,23 +1626,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>无法更改进程的I/O优先级.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>无法将 %x 移动到回收站.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>为文件夹 %x 检查回收站失败.</target>
-<source>Cannot determine final path for %x.</source>
-<target>无法确定 %x 的最终路径.</target>
-
-<source>Error Code %x:</source>
-<target>错误代码 %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>无法读取如下XML元素:</target>
+<source>The following XML elements could not be read:</source>
+<target>下列的XML元素无法被读取:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>配置文件 %x 只是部分载入.</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>
diff --git a/FreeFileSync/Build/Languages/chinese_traditional.lng b/FreeFileSync/Build/Languages/chinese_traditional.lng
index 52d401c3..01d388d8 100644
--- a/FreeFileSync/Build/Languages/chinese_traditional.lng
+++ b/FreeFileSync/Build/Languages/chinese_traditional.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>語法錯誤</target>
-<source>Cannot open file %x.</source>
-<target>無法開啟檔案 %x。</target>
+<source>Cannot find file %x.</source>
+<target>找不到檔案 %x。</target>
<source>File %x does not contain a valid configuration.</source>
<target>檔案 %x 不包含一個有效的配置。</target>
@@ -77,10 +77,10 @@
<target>語法:</target>
<source>global config file:</source>
-<target>整體配置檔案</target>
+<target>整體配置檔案:</target>
<source>config files:</source>
-<target>配置檔案</target>
+<target>配置檔案:</target>
<source>directory</source>
<target>目錄</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>任意數量的替代配對目錄為最多一個配置檔案。</target>
-<source>Open configuration for edit without executing.</source>
-<target>只開啟配置來編輯而不執行。</target>
+<source>Open configuration for editing without executing it.</source>
+<target>開啟配置進行編輯而不執行。</target>
<source>Cannot find the following folders:</source>
<target>找不到下列資料夾:</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>更新右邊的屬性</target>
+<source>Cannot read file %x.</source>
+<target>無法讀取檔案 %x。</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+非預期的資料流大小。
+預期:%x 位元組
+實際:%y 位元組
+</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 write file %x.</source>
+<target>無法寫入檔案 %x。</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>無法複製符號連結 %x 到 %y。</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>無法移動檔案 %x 到 %y。</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>無法枚舉目錄 %x。</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>無法讀取 %x 的檔案屬性。</target>
+
+<source>Cannot find %x.</source>
+<target>找不到 %x。</target>
+
+<source>Cannot open file %x.</source>
+<target>無法開啟檔案 %x。</target>
+
+<source>Cannot find device %x.</source>
+<target>找不到裝置 %x。</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>無法確定 %x 的可用磁碟空間。</target>
+
+<source>Cannot create directory %x.</source>
+<target>無法新建目錄 %x。</target>
+
+<source>Cannot delete directory %x.</source>
+<target>無法刪除目錄 %x。</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>無法開啟目錄 %x。</target>
+
+<source>Incorrect command line:</source>
+<target>不正確的命令列:</target>
+
+<source>Error Code %x:</source>
+<target>錯誤代碼 %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>無法連接到SFTP伺服器 %x。</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -234,26 +314,20 @@
<source>Database file is corrupt:</source>
<target>資料庫檔案已損毀:</target>
-<source>Cannot write file %x.</source>
-<target>無法寫入檔案 %x。</target>
-
-<source>Cannot read file %x.</source>
-<target>無法讀取檔案 %x。</target>
-
<source>Database files do not share a common session.</source>
<target>資料庫檔案不會共享一個共同的連線。</target>
<source>Searching for folder %x...</source>
<target>正在搜尋資料夾 %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>無法讀取 %x 的檔案屬性。</target>
+<source>Time out 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>
+<target>等待同時目錄被鎖定:</target>
<source>Lock owner:</source>
<target>鎖定擁有者:</target>
@@ -334,6 +408,15 @@
<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>
+
<source>&Open...</source>
<target>開啟(&O)...</target>
@@ -382,11 +465,8 @@
<source>Browse</source>
<target>瀏覽</target>
-<source>Select a folder</source>
-<target>選擇一個資料夾</target>
-
<source>Idle time (in seconds):</source>
-<target>閒置時間(以秒為單位)</target>
+<target>閒置時間(以秒為單位):</target>
<source>Idle time between last detected change and execution of command</source>
<target>最後檢測到變更和執行命令之間的閒置時間</target>
@@ -438,9 +518,6 @@ The command is triggered if:
<source>&Quit</source>
<target>離開(&Q)</target>
-<source>Incorrect command line:</source>
-<target>不正確的命令列:</target>
-
<source>&Retry</source>
<target>重試(&R)</target>
@@ -495,18 +572,18 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>正在新建卷影複製為 %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>資料驗證錯誤:%x 和 %y 內容不同!</target>
-
<source>Target folder %x already existing.</source>
<target>目標資料夾 %x 已存在。</target>
-<source>Cannot find folder %x.</source>
-<target>找不到資料夾 %x。</target>
-
<source>Target folder input field must not be empty.</source>
<target>目標資料夾輸入欄位不能為空。</target>
@@ -519,8 +596,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>下列項目有未解決的衝突,將不會同步:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>下列資料夾明顯不同。請確定要進行同步的資料夾匹配正確。</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>下列資料夾明顯不同。請確保同步中所選資料夾是正確的。</target>
<source>Not enough free disk space available in:</source>
<target>沒有足夠的可用空間:</target>
@@ -546,12 +623,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>同步已停止。</target>
+<source>Stopped</source>
+<target>已停止</target>
+
<source>Synchronization completed with errors</source>
<target>同步完成但有錯誤</target>
<source>Synchronization completed with warnings</source>
<target>同步已完成,但出現警告</target>
+<source>Warning</source>
+<target>警告</target>
+
<source>Nothing to synchronize</source>
<target>沒有什麼東西可同步</target>
@@ -561,9 +644,6 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>清理舊日誌檔...</target>
-<source>Stopped</source>
-<target>已停止</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>您可以切換到FreeFileSync的主視窗中來解決此問題。</target>
@@ -615,7 +695,7 @@ The command is triggered if:
<target>無法連接到www.freefilesync.org。</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
-<target>找不到目前線上FreeFileSync版號!是否要手動檢查?</target>
+<target>找不到線上目前FreeFileSync版號!是否要手動檢查?</target>
<source>&Check</source>
<target>檢查(&C)</target>
@@ -653,9 +733,6 @@ The command is triggered if:
<source>Action</source>
<target>動作</target>
-<source>Drag && drop</source>
-<target>拖放</target>
-
<source>Local comparison settings</source>
<target>本機比對設定</target>
@@ -686,6 +763,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>本機同步設定</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>所選資料夾 %x 不能用在FreeFileSync。請選擇一個本機檔案系統、網路或MTP裝置上的資料夾。</target>
+
<source>&New</source>
<target>新增(&N)</target>
@@ -693,7 +773,7 @@ The command is triggered if:
<target>儲存(&S)</target>
<source>Save as &batch job...</source>
-<target>另存為批次處理作業(&b)</target>
+<target>另存為批次處理作業(&b)...</target>
<source>Start &comparison</source>
<target>開始比對(&c)</target>
@@ -720,7 +800,7 @@ The command is triggered if:
<target>語言(&L)</target>
<source>&Find...</source>
-<target>尋找(&F)</target>
+<target>尋找(&F)...</target>
<source>&Reset layout</source>
<target>重置佈局(&R)</target>
@@ -755,6 +835,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>移除配對資料夾</target>
+<source>Select SFTP folder</source>
+<target>選擇SFTP資料夾</target>
+
<source>Swap sides</source>
<target>兩邊交換</target>
@@ -812,8 +895,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>由比對檔案內容來判斷相同檔案。</target>
-<source>Ignore time shift (in hours)</source>
-<target>忽略時間的轉變(以小時為單位)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>忽略時間轉變(小時)(&I)</target>
<source>Consider file times with specified offset as equal</source>
<target>考慮檔案時間和相等的指定偏移量</target>
@@ -821,14 +904,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>日光節約時間處理</target>
-<source>Include symbolic links:</source>
-<target>包括的符號連結:</target>
+<source>Include &symbolic links:</source>
+<target>包括符號連結(&s):</target>
-<source>Direct</source>
-<target>直接</target>
+<source>&Follow</source>
+<target>按照(&F)</target>
-<source>Follow</source>
-<target>遵從</target>
+<source>&Direct</source>
+<target>直接(&D)</target>
<source>More information</source>
<target>詳細資訊</target>
@@ -861,20 +944,20 @@ The command is triggered if:
<target>選擇從同步中排除某些檔案的篩選器規則。輸入相對於其對應的配對資料夾路徑。</target>
<source>C&lear</source>
-<target>清除(&C)</target>
+<target>清除(&l)</target>
<source>Detect moved files</source>
<target>檢測被移動的檔案</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- 初始化同步後檢測活動
-- 要求並新建資料庫檔案
- 不支援所有檔案系統
+- 需要新建資料庫檔案
+- 檢測不可用於第一次同步
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -922,6 +1005,27 @@ The command is triggered if:
<source>OK</source>
<target>確定</target>
+<source>Enter your SFTP login details:</source>
+<target>請輸入您的SFTP登錄詳細資訊:</target>
+
+<source>Server name or IP address:</source>
+<target>伺服器名稱或IP位址:</target>
+
+<source>Examples:</source>
+<target>範例:</target>
+
+<source>User name:</source>
+<target>使用者名稱:</target>
+
+<source>Password:</source>
+<target>密碼:</target>
+
+<source>&Show password</source>
+<target>顯示密碼(&S):</target>
+
+<source>Directory on server:</source>
+<target>在伺服器上的目錄:</target>
+
<source>Start synchronization now?</source>
<target>現在開始同步?</target>
@@ -931,6 +1035,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>不要再顯示此對話框(&D)</target>
+<source>Arrange folder pair</source>
+<target>排列配對資料夾</target>
+
<source>Items found:</source>
<target>尋找項目:</target>
@@ -947,7 +1054,7 @@ The command is triggered if:
<target>最小化到通知區域</target>
<source>Bytes copied:</source>
-<target>已複製的位元組:</target>
+<target>已複製的位元組:</target>
<source>Close</source>
<target>關閉</target>
@@ -971,7 +1078,7 @@ The command is triggered if:
<target>最小化執行</target>
<source>Save log:</source>
-<target>儲存日誌</target>
+<target>儲存日誌:</target>
<source>Limit:</source>
<target>限制:</target>
@@ -1004,7 +1111,7 @@ This guarantees a consistent state even in case of a serious error.
<target>複製被鎖定的檔案</target>
<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target>共用的副本或鎖定的檔案使用卷影複製服務</target>
+<target>共用的副本或鎖定的檔案使用卷影複製服務。</target>
<source>(requires administrator rights)</source>
<target>(需要管理員權限)</target>
@@ -1040,10 +1147,10 @@ This guarantees a consistent state even in case of a serious error.
<target>預設(&D)</target>
<source>Source code written in C++ using:</source>
-<target>使用C++編寫的原始碼</target>
+<target>使用C++編寫的原始碼:</target>
<source>If you like FreeFileSync:</source>
-<target>如果您喜歡FreeFileSync:</target>
+<target>如果您喜歡FreeFileSync:</target>
<source>Donate with PayPal</source>
<target>使用PayPal捐款</target>
@@ -1063,6 +1170,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>非常感謝本地化語系翻譯工作人員:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH檔案傳輸協議</target>
+
<source>Save as Batch Job</source>
<target>另存為批次處理作業</target>
@@ -1075,9 +1185,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>選擇時間間隔</target>
-<source>&Preferences...</source>
+<source>&Preferences</source>
<target>偏好設定(&P)</target>
+<source>Main Bar</source>
+<target>主欄位</target>
+
<source>Folder Pairs</source>
<target>配對資料夾</target>
@@ -1093,9 +1206,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>摘要</target>
-<source>Main Bar</source>
-<target>主欄位</target>
-
<source>Confirm</source>
<target>確認</target>
@@ -1195,13 +1305,13 @@ This guarantees a consistent state even in case of a serious error.
<target>是否要儲存變更到 %x?</target>
<source>Never save &changes</source>
-<target>都不保存更改(&c)</target>
+<target>不儲存變更(&c)</target>
<source>Do&n't save</source>
<target>不儲存(&N)</target>
-<source>Delete selected configurations</source>
-<target>刪除選定的配置</target>
+<source>Remove entry from list</source>
+<target>從清單中項目刪除</target>
<source>Synchronization Settings</source>
<target>同步設定</target>
@@ -1254,8 +1364,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>顯示已篩選或暫時排除的檔案</target>
-<source>Set as default</source>
-<target>設為預設值</target>
+<source>Save as default</source>
+<target>儲存為預設值</target>
<source>Filter</source>
<target>篩選器</target>
@@ -1266,6 +1376,12 @@ This guarantees a consistent state even in case of a serious error.
<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>
@@ -1278,18 +1394,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>關閉進度對話框</target>
-<source>Standby</source>
-<target>待機</target>
-
<source>Log off</source>
<target>登出</target>
+<source>Standby</source>
+<target>待機</target>
+
<source>Shut down</source>
<target>關機</target>
-<source>Hibernate</source>
-<target>休眠</target>
-
<source>Scanning...</source>
<target>正在掃瞄...</target>
@@ -1299,9 +1412,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>訊息</target>
-<source>Warning</source>
-<target>警告</target>
-
<source>Select all</source>
<target>全選</target>
@@ -1345,8 +1455,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>偏好設定</target>
-<source>Copy NTFS permissions</source>
-<target>複製NTFS權限</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>複製DACL、SACL、擁有者、群組</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>整合內容功能表中的外部應用程式。可以使用下面的巨集:</target>
@@ -1441,27 +1551,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>百分比</target>
+<source>Unable to register to receive system messages.</source>
+<target>無法登錄接收系統訊息。</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>%x 無法註冊裝置通知。</target>
+
<source>Cannot monitor directory %x.</source>
<target>無法監測目錄 %x。</target>
-<source>Cannot delete file %x.</source>
-<target>無法刪除目錄 %x。</target>
-
<source>The file is locked by another process:</source>
<target>檔案被另一個進程鎖定:</target>
-<source>Cannot move file %x to %y.</source>
-<target>無法移動檔案 %x 到 %y。</target>
-
-<source>Cannot delete directory %x.</source>
-<target>無法刪除目錄 %x。</target>
-
<source>Cannot write file attributes of %x.</source>
<target>無法寫入 %x 的檔案屬性。</target>
-<source>Cannot write modification time of %x.</source>
-<target>無法寫入 %x 的修改時間。</target>
-
<source>Cannot read security context of %x.</source>
<target>無法讀取 %x 的安全內容。</target>
@@ -1471,33 +1575,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>無法讀取 %x 的權限。</target>
-<source>Cannot write permissions of %x.</source>
-<target>無法寫入 %x 的權限。</target>
-
-<source>Cannot create directory %x.</source>
-<target>無法新建目錄 %x。</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>無法複製符號連結 %x 到 %y。</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>無法從 %x 複製權限到 %y。</target>
<source>Cannot find system function %x.</source>
<target>找不到系統函數 %x。</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>無法從 %x 複製屬性到 %y。</target>
+
<source>Cannot copy file %x to %y.</source>
-<target>無法複製檔案 %x 到 %y。</target>
+<target>無法從 %x 複製檔案到 %y。</target>
<source>Type of item %x is not supported:</source>
<target>項目類型 %x 不被支援:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>無法解析符號連結 %x。</target>
-
-<source>Cannot open directory %x.</source>
-<target>無法開啟目錄 %x。</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>無法枚舉目錄 %x。</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1528,9 +1620,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x 天</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>無法登錄接收系統訊息。</target>
-
<source>Cannot set privilege %x.</source>
<target>無法設定權限 %x。</target>
@@ -1540,23 +1629,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>無法更改I/O處理優先順序。</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>無法將 %x 移動到資源回收筒。</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>正在檢查資源回收筒的資料夾 %x 失敗。</target>
-<source>Cannot determine final path for %x.</source>
-<target>無法確定最後路徑為 %x。</target>
-
-<source>Error Code %x:</source>
-<target>錯誤代碼 %x:</target>
-
-<source>Cannot read the following XML elements:</source>
+<source>The following XML elements could not be read:</source>
<target>無法讀取下列XML元素:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>只載入設定檔 %x 的一部份。</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>
@@ -1577,7 +1657,7 @@ This guarantees a consistent state even in case of a serious error.
<target>建議</target>
<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target>儲存到"%APPDATA%\FreeFileSync"</target>
+<target>儲存到 "%APPDATA%\FreeFileSync"</target>
<source>Register FreeFileSync file extensions</source>
<target>註冊FreeFileSync檔案副檔名</target>
diff --git a/FreeFileSync/Build/Languages/croatian.lng b/FreeFileSync/Build/Languages/croatian.lng
index 883956b8..e96b1fbe 100644
--- a/FreeFileSync/Build/Languages/croatian.lng
+++ b/FreeFileSync/Build/Languages/croatian.lng
@@ -11,7 +11,7 @@
<target>Obje strane su promjenjene nakon zadnje sinkronizacije.</target>
<source>Cannot determine sync-direction:</source>
-<target>Ne mogu odrediti smjer sinkronizacije.</target>
+<target>Ne mogu odrediti smjer sinkronizacije:</target>
<source>No change since last synchronization.</source>
<target>Nema promjena od zadnje sinkronizacije.</target>
@@ -55,11 +55,11 @@
<source>Syntax error</source>
<target>Greška sintakse</target>
-<source>Cannot open file %x.</source>
-<target>Ne mogu otvoriti datoteku %x.</target>
+<source>Cannot find file %x.</source>
+<target>Nije moguće pronaći datoteku %x.</target>
<source>File %x does not contain a valid configuration.</source>
-<target>Datoteka %x ne sadrži valjane postavke</target>
+<target>Datoteka %x ne sadrži valjane postavke.</target>
<source>Unequal number of left and right directories specified.</source>
<target>Naveden je nejednak broj lijevih i desnih direktorija.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Bilo koji broj alternativnih parova mapa za najmanje jednu config datoteku.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Otvori postavke za uređivanje bez pokretanja.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Otvori postavke za izmjenu bez pokretanja.</target>
<source>Cannot find the following folders:</source>
<target>Ne mogu pronaći slijedeće mape:</target>
@@ -202,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Neočekivana veličina podataka.
+Očekivano: %x bajta
+Stvarno: %y bajta
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Ne mogu zapisati dopuštenja za %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Ne može se kopirati simbolična poveznica %x prema %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Ne mogu premjestiti datoteku %x u %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Ne mogu specificirati direktorij %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Ne mogu pročitati osobine od %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Nije moguće pronaći %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Ne mogu otvoriti datoteku %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Nije moguće pronaći uređaj %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Nije moguće izračunati slobodan prostor diska za %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Ne mogu izraditi mapu %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Ne mogu izbrisati mapu %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Ne mogu izbrisati datoteku %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Ne mogu zapisati vrijeme izmjene %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Ne mogu odrediti završnu putanju za %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Ne mogu odrediti simboličnu poveznicu %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Nije moguće premjestiti %x u koš za smeće.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Ne mogu otvoriti mapu %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Netočna naredbena linija:</target>
+
+<source>Error Code %x:</source>
+<target>Pogreška broj %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Neuspjelo povezivanje na SFTP server %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -231,28 +311,22 @@
<target>Početna sinkronizacija:</target>
<source>Database file %x does not yet exist.</source>
-<target>Datoteka baze %x još ne postoji</target>
+<target>Datoteka baze %x još ne postoji.</target>
<source>Database file is corrupt:</source>
<target>Baza 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>Database files do not share a common session.</source>
<target>Datoteke baze podataka ne dijele zajedničku sesiju.</target>
<source>Searching for folder %x...</source>
<target>Tražim mapu %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Ne mogu pročitati osobine od %x.</target>
+<source>Time out 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>
+<target>Ne mogu dobit informacije o procesu.</target>
<source>Waiting while directory is locked:</source>
<target>Čekam dok se mapa zaključa:</target>
@@ -326,7 +400,7 @@
<target>Ne mogu pristupiti Voulme Shadow Copy servisu.</target>
<source>Please use FreeFileSync 64-bit version to create shadow copies on this system.</source>
-<target>Molimo koristite FreeFileSync 64-bitnu verziju za izradu shadow kopija na ovom sustavu</target>
+<target>Molimo koristite FreeFileSync 64-bitnu verziju za izradu shadow kopija na ovom sustavu.</target>
<source>Cannot determine volume name for %x.</source>
<target>Ne mogu utvrditi naziv spremnika za %x.</target>
@@ -340,6 +414,15 @@
<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>
+
<source>&Open...</source>
<target>&Otvori...</target>
@@ -388,9 +471,6 @@
<source>Browse</source>
<target>Odaberi</target>
-<source>Select a folder</source>
-<target>Odaberite mapu</target>
-
<source>Idle time (in seconds):</source>
<target>Vrijeme pripravnosti (u sekundama):</target>
@@ -444,9 +524,6 @@ Naredba će biti pokrenuta ako se:
<source>&Quit</source>
<target>&Izlaz</target>
-<source>Incorrect command line:</source>
-<target>Netočna naredbena linija:</target>
-
<source>&Retry</source>
<target>&Ponovi</target>
@@ -501,18 +578,18 @@ Naredba će biti pokrenuta ako se:
<source>Updating attributes of %x</source>
<target>Obnavljam atribute 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>Creating a Volume Shadow Copy for %x...</source>
<target>Kreiranje Volume Shadow Copy za %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Greška prilikom provjere podataka: %x i %y imaju različit sadržaj.</target>
-
<source>Target folder %x already existing.</source>
<target>Odredišna mapa %x već postoji.</target>
-<source>Cannot find folder %x.</source>
-<target>Ne mogu pronaći mapu %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Odredišna mapa ne može biti prazna.</target>
@@ -520,13 +597,13 @@ Naredba će biti pokrenuta ako se:
<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>
+<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>Navedene mape se značajno razlikuju. Provjerite da li uspoređujete odgovarajuće mape za sinkronizaciju.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Navedene mape su značajno različite. Provjerite dali ste odabrali točne mape za sinkronizaciju.</target>
<source>Not enough free disk space available in:</source>
<target>Nedovoljno prostora na disku:</target>
@@ -552,12 +629,18 @@ Naredba će biti pokrenuta ako se:
<source>Synchronization stopped</source>
<target>Sinkronizacija zaustavljena</target>
+<source>Stopped</source>
+<target>Zaustavljeno</target>
+
<source>Synchronization completed with errors</source>
<target>Sinkronizacija dovršena s greškama</target>
<source>Synchronization completed with warnings</source>
<target>Sinkronizacija dovršena s upozorenjima</target>
+<source>Warning</source>
+<target>Upozorenje</target>
+
<source>Nothing to synchronize</source>
<target>Ništa za sinkronizirati</target>
@@ -567,9 +650,6 @@ Naredba će biti pokrenuta ako se:
<source>Cleaning up old log files...</source>
<target>Čistim stare datoteke o izvješću...</target>
-<source>Stopped</source>
-<target>Zaustavljeno</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Možete prijeći na glavni prozor FreeFileSynca da bi rješili ovaj problem.</target>
@@ -661,9 +741,6 @@ Naredba će biti pokrenuta ako se:
<source>Action</source>
<target>Radnja</target>
-<source>Drag && drop</source>
-<target>Povuci && ispusti</target>
-
<source>Local comparison settings</source>
<target>Lokalne postavke usporedbe</target>
@@ -694,6 +771,9 @@ Naredba će biti pokrenuta ako se:
<source>Local Synchronization Settings</source>
<target>Lokalne Sinkronizacijske Postavke</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Odabrana mapa %x ne može biti korištena u FreeFileSync-u. Molimo odaberite mapu na lokalnom disku, mreži ili MTP uređaju.</target>
+
<source>&New</source>
<target>&Novo</target>
@@ -763,6 +843,9 @@ Naredba će biti pokrenuta ako se:
<source>Remove folder pair</source>
<target>Ukloni ovu mapu</target>
+<source>Select SFTP folder</source>
+<target>Odaberite SFTP mapu</target>
+
<source>Swap sides</source>
<target>Zamjeni strane</target>
@@ -815,13 +898,13 @@ Naredba će biti pokrenuta ako se:
<target>Odaberi opciju:</target>
<source>Identify equal files by comparing modification time and size.</source>
-<target>Ustanovi jednake datoteke uspoređujući vrijeme izmjene i veličinu</target>
+<target>Ustanovi jednake datoteke uspoređujući vrijeme izmjene i veličinu.</target>
<source>Identify equal files by comparing the file content.</source>
<target>Ustanovi jednake datoteke uspoređujući sadržaj datoteke.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignoriraj vremensku razliku (u satima)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignoriraj vremenski pomak (u satima)</target>
<source>Consider file times with specified offset as equal</source>
<target>Smatraj vrijeme datoteke u ovom razmaku istima</target>
@@ -829,14 +912,14 @@ Naredba će biti pokrenuta ako se:
<source>Handle daylight saving time</source>
<target>Upravljaj ljetnim računanjem vremena</target>
-<source>Include symbolic links:</source>
-<target>Uključi simbolične poveznice:</target>
+<source>Include &symbolic links:</source>
+<target>Koristi &simbolične poveznice:</target>
-<source>Direct</source>
-<target>Direktno</target>
+<source>&Follow</source>
+<target>&Prati</target>
-<source>Follow</source>
-<target>Slijedi</target>
+<source>&Direct</source>
+<target>&Direktno</target>
<source>More information</source>
<target>Više informacija</target>
@@ -845,7 +928,7 @@ Naredba će biti pokrenuta ako se:
<target>Lokalne postavke:</target>
<source>Include:</source>
-<target>Obuhvati</target>
+<target>Obuhvati:</target>
<source>Exclude:</source>
<target>Odvojiti:</target>
@@ -875,14 +958,14 @@ Naredba će biti pokrenuta ako se:
<target>Otkrij premještene datoteke</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Otkrivanje aktivno nakon početne sinkronizacije
-- Zahtjeva te izrađuje baze podataka
- Nije podržano kod svih datotečnih sustava
+- Zahtjeva i stvara bazu podataka
+- Otkrivanje nije dostupno za prvu sinkronizaciju
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -930,6 +1013,27 @@ Naredba će biti pokrenuta ako se:
<source>OK</source>
<target>U redu</target>
+<source>Enter your SFTP login details:</source>
+<target>Unesite SFTP pristupne podatke:</target>
+
+<source>Server name or IP address:</source>
+<target>Naziv servera ili IP adresa:</target>
+
+<source>Examples:</source>
+<target>Primjeri:</target>
+
+<source>User name:</source>
+<target>Korisničko ime:</target>
+
+<source>Password:</source>
+<target>Lozinka:</target>
+
+<source>&Show password</source>
+<target>&Prikaži lozinku</target>
+
+<source>Directory on server:</source>
+<target>Mapa na serveru:</target>
+
<source>Start synchronization now?</source>
<target>Započeti sinkronizaciju sada?</target>
@@ -939,6 +1043,9 @@ Naredba će biti pokrenuta ako se:
<source>&Don't show this dialog again</source>
<target>&Nemoj više prikazivati ovaj dijaloški prozor</target>
+<source>Arrange folder pair</source>
+<target>Rasporedi par mapa</target>
+
<source>Items found:</source>
<target>Pronađene stavke:</target>
@@ -991,7 +1098,7 @@ Naredba će biti pokrenuta ako se:
<target>Kako zakazati slijedni zadatak?</target>
<source>The following settings are used for all synchronization jobs.</source>
-<target>Ove postavke se koriste za sve sinkronizacijske zadatke</target>
+<target>Ove postavke se koriste za sve sinkronizacijske zadatke.</target>
<source>Fail-safe file copy</source>
<target>Kopiranje zaštićeno od grešaka</target>
@@ -1033,7 +1140,7 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<target>Odgoda (u sekundama) :</target>
<source>Customize context menu:</source>
-<target>Prilagodite kontekstni izbornik</target>
+<target>Prilagodite kontekstni izbornik:</target>
<source>Description</source>
<target>Opis</target>
@@ -1071,6 +1178,9 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Many thanks for localization:</source>
<target>Velike zahvale idu:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH Protokol prijenosa datoteka</target>
+
<source>Save as Batch Job</source>
<target>Spremi kao slijedni zadatak</target>
@@ -1083,8 +1193,11 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Select Time Span</source>
<target>Odaberite vremenski raspon</target>
-<source>&Preferences...</source>
-<target>&Prioriteti...</target>
+<source>&Preferences</source>
+<target>&Perfomanse</target>
+
+<source>Main Bar</source>
+<target>Glavna traka</target>
<source>Folder Pairs</source>
<target>Parovi mapa</target>
@@ -1101,9 +1214,6 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Overview</source>
<target>Pregled</target>
-<source>Main Bar</source>
-<target>Glavna traka</target>
-
<source>Confirm</source>
<target>Potvrdi</target>
@@ -1216,8 +1326,8 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Do&n't save</source>
<target>&Nemoj spremiti</target>
-<source>Delete selected configurations</source>
-<target>Izbriši odabrane postavke</target>
+<source>Remove entry from list</source>
+<target>Ukloni stavku iz liste</target>
<source>Synchronization Settings</source>
<target>Postavke Sinkronizacije</target>
@@ -1270,8 +1380,8 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Show filtered or temporarily excluded files</source>
<target>Prikaži filtrirane ili privremeno odvojene datoteke</target>
-<source>Set as default</source>
-<target>Postavi kao zadano</target>
+<source>Save as default</source>
+<target>Spremi kao standardno</target>
<source>Filter</source>
<target>Filtriranje</target>
@@ -1282,6 +1392,12 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Cannot find %x</source>
<target>Ne mogu pronaći %x</target>
+<source>Move up</source>
+<target>Premjesti gore</target>
+
+<source>Move down</source>
+<target>Premjesti dolje</target>
+
<source>Comma-separated values</source>
<target>Zarezom odvojene vrijednosti</target>
@@ -1294,18 +1410,15 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Close progress dialog</source>
<target>Zatvori prozor zadatka</target>
-<source>Standby</source>
-<target>Spavaj</target>
-
<source>Log off</source>
<target>Odlogiraj se</target>
+<source>Standby</source>
+<target>Spavaj</target>
+
<source>Shut down</source>
<target>Isključi računalo</target>
-<source>Hibernate</source>
-<target>Hibernacija</target>
-
<source>Scanning...</source>
<target>Tražim...</target>
@@ -1315,9 +1428,6 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Upozorenje</target>
-
<source>Select all</source>
<target>Odaberi sve</target>
@@ -1365,8 +1475,8 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Preferences</source>
<target>Prioriteti</target>
-<source>Copy NTFS permissions</source>
-<target>Kopiraj NTFS dopuštenja</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Kopiraj DACL, SACL, Vlasnika, Grupu</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integriraj vanjske aplikacije u kontekstni meni. Sljedeći makroi su dostupni:</target>
@@ -1461,27 +1571,21 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Percentage</source>
<target>Postotak</target>
+<source>Unable to register to receive system messages.</source>
+<target>Nije moguće registriranje za primanje sistemskih poruka.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Nije moguće registrirati prijavu uređaja za %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Ne mogu nadzirati direktorij %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Ne mogu izbrisati datoteku %x.</target>
-
<source>The file is locked by another process:</source>
<target>Datoteku koristi drugi proces:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Ne mogu premjestiti datoteku %x u %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Ne mogu izbrisati mapu %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Ne mogu zapisati svojstva od %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Ne mogu zapisati vrijeme izmjene %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Ne mogu čitati zaštićeni sadržaj %x.</target>
@@ -1491,33 +1595,21 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<source>Cannot read permissions of %x.</source>
<target>Ne mogu čitati dopuštenja od %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Ne mogu zapisati dopuštenja za %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Ne mogu izraditi mapu %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Ne može se kopirati simbolična poveznica %x prema %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Nije moguće kopiranje dozvola za %x prema %y.</target>
<source>Cannot find system function %x.</source>
<target>Ne mogu pronaći sistemsku funkciju %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Nije moguće kopiranje atributa od %x prema %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Ne mogu kopirati datoteku %x na %y.</target>
<source>Type of item %x is not supported:</source>
<target>Vrsta stavke %x koji nije podržan:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Ne mogu odrediti simboličnu poveznicu %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Ne mogu otvoriti mapu %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Ne mogu specificirati direktorij %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1554,41 +1646,29 @@ Ovo garantira čvrsto stanje čak u slučaju ozbiljne greške.
<pluralform>%x dana</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Nije moguće registriranje za primanje sistemskih poruka</target>
-
<source>Cannot set privilege %x.</source>
<target>Ne mogu postaviti prava za %x.</target>
<source>Unable to suspend system sleep mode.</source>
-<target>Nije moguće obustaviti sistemsko stanje pripravnosti</target>
+<target>Nije moguće obustaviti sistemsko stanje pripravnosti.</target>
<source>Cannot change process I/O priorities.</source>
-<target>Ne može se promjeniti proces I/O prioriteta</target>
-
-<source>Unable to move %x to the recycle bin.</source>
-<target>Nije moguće premjestiti %x u koš za smeće.</target>
+<target>Ne može se promjeniti proces I/O prioriteta.</target>
<source>Checking recycle bin failed for folder %x.</source>
<target>Provjeravanje koša za smeće neuspješno za mapu %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Ne mogu odrediti završnu putanju za %x.</target>
-
-<source>Error Code %x:</source>
-<target>Pogreška broj %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Ne mogu čitati slijedeće XML elemente</target>
+<source>The following XML elements could not be read:</source>
+<target>Slijedeći XML elementi se nisu mogli učitati:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Datoteka postavki %x učitana samo djelomično</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Konfiguracijska datoteka %x je nepotpuna. Nedostajući elementi će biti postavljeni na početne vrijednosti.</target>
<source>Prepare installation</source>
<target>Pripremam instalaciju</target>
<source>Choose which components you want to install.</source>
-<target>Odaberite koje komponente želite instalirati.</target>
+<target>Odaberite komponente koje želite instalirati.</target>
<source>Select installation type:</source>
<target>Odaberite vrstu instalacije:</target>
diff --git a/FreeFileSync/Build/Languages/czech.lng b/FreeFileSync/Build/Languages/czech.lng
index f8939b2c..820acad3 100644
--- a/FreeFileSync/Build/Languages/czech.lng
+++ b/FreeFileSync/Build/Languages/czech.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Chyba syntaxe</target>
-<source>Cannot open file %x.</source>
-<target>Nelze otevřít soubor %x.</target>
+<source>Cannot find file %x.</source>
+<target>Nelze najít soubor %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Soubor %x neobsahuje platnou konfiguraci.</target>
@@ -77,10 +77,10 @@
<target>Syntaxe:</target>
<source>global config file:</source>
-<target>konfigurační soubory</target>
+<target>konfigurační soubory:</target>
<source>config files:</source>
-<target>konfigurační soubory</target>
+<target>konfigurační soubory:</target>
<source>directory</source>
<target>adresář</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Libovolný počet alternativních párů adresářů na alespoň jednu konfiguraci.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Otevřít konfiguraci pro úpravu bez spuštění.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Otevřít konfiguraci pro editaci bez jejího spuštění.</target>
<source>Cannot find the following folders:</source>
<target>Nelze najít následující složky:</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>Nastavit vlastnosti vpravo</target>
+<source>Cannot read file %x.</source>
+<target>Nelze číst soubor %x.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
++Neočekávaná velikost dat.
+Očekáváno: %x b
+Aktuálně: %y b
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Nelze zapsat oprávnění pro %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Nelze kopírovat symbolický odkaz %x do %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Nelze přesunout soubor %x do %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Nelze procházet adresář %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Nelze číst atributy souboru %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Nelze najít %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Nelze otevřít soubor %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Nelze nalézt zařízení %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Nelze zjistit volné místo na disku %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Nelze vytvořit adresář %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Nelze smazat adresář %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Nelze smazat soubor %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Nelze nastavit atribut času změny pro %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Nelze určit výslednou cestu pro %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Nelze najít odkaz zástupce %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Není možné přesunout %x do Koše.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Nelze otevřít adresář %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Neplatný příkaz:</target>
+
+<source>Error Code %x:</source>
+<target>Chybový kód %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Nepodařilo se připojit k SFTP servru %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -236,20 +316,14 @@
<source>Database file is corrupt:</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>Database files do not share a common session.</source>
<target>Databázové soubory nejsou navzájem komplementární.</target>
<source>Searching for folder %x...</source>
-<target>Otevírání složky %x</target>
+<target>Otevírání složky %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Nelze číst atributy souboru %x.</target>
+<source>Time out 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>
@@ -289,7 +363,7 @@
<target>Celkový čas:</target>
<source>Error parsing file %x, row %y, column %z.</source>
-<target>Chyba zpracování souboru %x: na řádku %y ve sloupci %z</target>
+<target>Chyba zpracování souboru %x: na řádku %y ve sloupci %z.</target>
<source>Cannot set directory lock for %x.</source>
<target>Nelze nastavit zámek adresáře %x.</target>
@@ -340,6 +414,15 @@
<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>
+
<source>&Open...</source>
<target>&Otevřít...</target>
@@ -371,10 +454,10 @@
<target>2. Zadejte příkazovou řádku.</target>
<source>3. Press 'Start'.</source>
-<target>3. Zmáčkněte 'Start'</target>
+<target>3. Zmáčkněte 'Start'.</target>
<source>To get started just import a .ffs_batch file.</source>
-<target>Můžete načíst také konfigurační soubor .ffs_batch</target>
+<target>Můžete načíst také konfigurační soubor .ffs_batch.</target>
<source>Folders to watch:</source>
<target>Sledovaná složka:</target>
@@ -388,9 +471,6 @@
<source>Browse</source>
<target>Procházet</target>
-<source>Select a folder</source>
-<target>Vyberte adresář</target>
-
<source>Idle time (in seconds):</source>
<target>Prodleva (v sekundách):</target>
@@ -444,9 +524,6 @@ Příkaz je spuštěn když:
<source>&Quit</source>
<target>U&končit</target>
-<source>Incorrect command line:</source>
-<target>Neplatný příkaz:</target>
-
<source>&Retry</source>
<target>&Opakovat</target>
@@ -501,18 +578,18 @@ Příkaz je spuštěn když:
<source>Updating attributes of %x</source>
<target>Aktualizace atributů 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>Creating a Volume Shadow Copy for %x...</source>
<target>Vytváření Stínové kopie pro %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Chyba porovnání dat: %x má jiný obsah než %y</target>
-
<source>Target folder %x already existing.</source>
<target>Cílová složka %x již existuje.</target>
-<source>Cannot find folder %x.</source>
-<target>Nelze najít složku %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Cílová složka nesmí být prázdná.</target>
@@ -525,17 +602,17 @@ Příkaz je spuštěn když:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>Následující složky se významně liší. Zkontrolujte zda porovnáváte správnou dvojici složek pro synchronizaci.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders 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>
+<target>Požadováno:</target>
<source>Available:</source>
-<target>K dispozici</target>
+<target>K dispozici:</target>
<source>Multiple folder pairs write to a common subfolder. Please review your configuration.</source>
<target>Více složek obsahuje společnou podsložku. Prosím zkontrolujte si nastavení synchronizace.</target>
@@ -552,12 +629,18 @@ Příkaz je spuštěn když:
<source>Synchronization stopped</source>
<target>Synchronizace zastavena</target>
+<source>Stopped</source>
+<target>Zastaveno</target>
+
<source>Synchronization completed with errors</source>
<target>Synchronizace dokončena s chybami</target>
<source>Synchronization completed with warnings</source>
<target>Synchronizace dokončena s varováními</target>
+<source>Warning</source>
+<target>Varování</target>
+
<source>Nothing to synchronize</source>
<target>Není co synchronizovat</target>
@@ -567,9 +650,6 @@ Příkaz je spuštěn když:
<source>Cleaning up old log files...</source>
<target>Odstraňování starých žurnálů...</target>
-<source>Stopped</source>
-<target>Zastaveno</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>K odstranění tohoto problému se přepněte do hlavního okna FreeFileSync.</target>
@@ -661,9 +741,6 @@ Příkaz je spuštěn když:
<source>Action</source>
<target>Akce</target>
-<source>Drag && drop</source>
-<target>Přetáhni sem && pusť</target>
-
<source>Local comparison settings</source>
<target>Nastavení porovnání</target>
@@ -694,6 +771,9 @@ Příkaz je spuštěn když:
<source>Local Synchronization Settings</source>
<target>Nastavení porovnání</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Vybranou složku %x nelze použít pro FreeFileSync. Prosím vyberte složku na místním souborovém systému, síti nebo multimediální zařízení.</target>
+
<source>&New</source>
<target>&Nový</target>
@@ -701,7 +781,7 @@ Příkaz je spuštěn když:
<target>&Uložit</target>
<source>Save as &batch job...</source>
-<target>Uložit jako &dávku</target>
+<target>Uložit jako &dávku...</target>
<source>Start &comparison</source>
<target>Začít &porovnání</target>
@@ -763,6 +843,9 @@ Příkaz je spuštěn když:
<source>Remove folder pair</source>
<target>Odstranit dvojici adresářů</target>
+<source>Select SFTP folder</source>
+<target>Vyberte SFTP složku</target>
+
<source>Swap sides</source>
<target>Změna stran</target>
@@ -794,7 +877,7 @@ Příkaz je spuštěn když:
<target>Výběr zobrazení:</target>
<source>Statistics:</source>
-<target>Statistika</target>
+<target>Statistika:</target>
<source>Number of files and folders that will be deleted</source>
<target>Počet souborů a složek ke smazání</target>
@@ -820,8 +903,8 @@ Příkaz je spuštěn když:
<source>Identify equal files by comparing the file content.</source>
<target>Rozpoznat shodné soubory porovnáním jejich obsahu.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignorovat časový posun (v hodinách)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignorovat časový posun (v hodinách)</target>
<source>Consider file times with specified offset as equal</source>
<target>Považovat časy souborů s daným posunem jako stejné</target>
@@ -829,14 +912,14 @@ Příkaz je spuštěn když:
<source>Handle daylight saving time</source>
<target>Používat letní čas</target>
-<source>Include symbolic links:</source>
-<target>Zahrnout symbolické odkazy:</target>
+<source>Include &symbolic links:</source>
+<target>&Symbolické odkazy:</target>
-<source>Direct</source>
-<target>Zachovat</target>
+<source>&Follow</source>
+<target>&Použít cíl</target>
-<source>Follow</source>
-<target>Použít cíl</target>
+<source>&Direct</source>
+<target>&Zachovat</target>
<source>More information</source>
<target>Více informací</target>
@@ -875,14 +958,14 @@ Příkaz je spuštěn když:
<target>Detekce přesunutých souborů</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- je k dispozici po prvotní synchronizaci
-- vyžaduje a vytváří soubor databáze
-- není dostupné na všech systémech
+- Není podporováno všemi souborovými systémy
+- Vyžaduje vytvoření databázového souboru
+- Detekce rozdílů až po první synchronizaci
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -930,6 +1013,27 @@ Příkaz je spuštěn když:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Zadejte přihlašovací údaje k SFTP:</target>
+
+<source>Server name or IP address:</source>
+<target>Jméno sevru nebo jeho IP adresa:</target>
+
+<source>Examples:</source>
+<target>Například:</target>
+
+<source>User name:</source>
+<target>Uživatelské jméno:</target>
+
+<source>Password:</source>
+<target>Heslo:</target>
+
+<source>&Show password</source>
+<target>&Zobraz</target>
+
+<source>Directory on server:</source>
+<target>Adresář na servru:</target>
+
<source>Start synchronization now?</source>
<target>Začít synchronizovat nyní?</target>
@@ -939,6 +1043,9 @@ Příkaz je spuštěn když:
<source>&Don't show this dialog again</source>
<target>Tento dialog již &nezobrazovat</target>
+<source>Arrange folder pair</source>
+<target>Uspořádat složky</target>
+
<source>Items found:</source>
<target>Nalezeno položek:</target>
@@ -1009,7 +1116,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Kopírovat zamčené soubory</target>
<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target>Kopírovat sdílené nebo zamčené soubory pomocí služby Stínové kopie</target>
+<target>Kopírovat sdílené nebo zamčené soubory pomocí služby Stínové kopie.</target>
<source>(requires administrator rights)</source>
<target>(vyžaduje administrátorská oprávnění)</target>
@@ -1018,7 +1125,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Kopírovat přístupová oprávnění k souborům</target>
<source>Transfer file and folder permissions.</source>
-<target>Přenést přístupová oprávnění souborů a složek</target>
+<target>Přenést přístupová oprávnění souborů a složek.</target>
<source>Automatic retry on error:</source>
<target>Automaticky opakovat při chybě:</target>
@@ -1068,6 +1175,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>Poděkování za překlad FreeFileSync:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH protokol</target>
+
<source>Save as Batch Job</source>
<target>Uložit jako dávku</target>
@@ -1080,9 +1190,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Časové rozmezí</target>
-<source>&Preferences...</source>
+<source>&Preferences</source>
<target>&Předvolby...</target>
+<source>Main Bar</source>
+<target>Hlavní lišta</target>
+
<source>Folder Pairs</source>
<target>Adresářové páry</target>
@@ -1098,9 +1211,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>Přehled</target>
-<source>Main Bar</source>
-<target>Hlavní lišta</target>
-
<source>Confirm</source>
<target>Potvrdit</target>
@@ -1213,8 +1323,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&Neukládat</target>
-<source>Delete selected configurations</source>
-<target>Smazat vybrané konfigurace</target>
+<source>Remove entry from list</source>
+<target>Odstranit položku ze seznamu</target>
<source>Synchronization Settings</source>
<target>Nastavení synchronizace</target>
@@ -1267,8 +1377,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>Zobrazit filtrované nebo dočasně vynechané soubory</target>
-<source>Set as default</source>
-<target>Nastavit jako výchozí</target>
+<source>Save as default</source>
+<target>Uložit jako výchozí</target>
<source>Filter</source>
<target>Filtr</target>
@@ -1279,6 +1389,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot find %x</source>
<target>Nelze najít %x</target>
+<source>Move up</source>
+<target>Nahoru</target>
+
+<source>Move down</source>
+<target>Dolů</target>
+
<source>Comma-separated values</source>
<target>Text oddělený čárkami</target>
@@ -1291,18 +1407,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>Zavřít průběh zpracování</target>
-<source>Standby</source>
-<target>Přepnout do úsporného režimu</target>
-
<source>Log off</source>
<target>Odhlásit uživatele</target>
+<source>Standby</source>
+<target>Přepnout do úsporného režimu</target>
+
<source>Shut down</source>
<target>Vypnout počítač</target>
-<source>Hibernate</source>
-<target>Přepnout do režimu spánku</target>
-
<source>Scanning...</source>
<target>Zpracovávání...</target>
@@ -1312,9 +1425,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Varování</target>
-
<source>Select all</source>
<target>Vybrat vše</target>
@@ -1362,8 +1472,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>Předvolby</target>
-<source>Copy NTFS permissions</source>
-<target>Kopírovat oprávnění NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Kopírovat DACL, SACL, Owner, Group</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrace externí aplikace do kontextového menu. K dispozici jsou následující makra:</target>
@@ -1458,27 +1568,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>Procentní podíl</target>
+<source>Unable to register to receive system messages.</source>
+<target>Nepodařilo se zaregistrovat k odběru systémových zpráv.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Nepodařilo se zaregistrovat zprávy zařízení %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Nelze nastavit monitorování adresáře %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Nelze smazat soubor %x.</target>
-
<source>The file is locked by another process:</source>
<target>Soubor je uzamčen jiným procesem:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Nelze přesunout soubor %x do %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Nelze smazat adresář %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Nelze zapsat atributy souboru %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Nelze nastavit atribut času změny pro %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Nelze číst přístupová práva pro %x.</target>
@@ -1488,33 +1592,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>Nelze číst oprávnění pro %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Nelze zapsat oprávnění pro %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Nelze vytvořit adresář %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Nelze kopírovat symbolický odkaz %x do %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Nelze kopírovat oprávnění z %x do %y.</target>
<source>Cannot find system function %x.</source>
<target>Nelze najít systémovou funkci %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Nelze kopírovat atributy z %x do %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Nelze kopírovat soubor %x do %y.</target>
<source>Type of item %x is not supported:</source>
<target>Typ položky %x není podporován:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Nelze najít odkaz zástupce %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Nelze otevřít adresář %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Nelze procházet adresář %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1551,9 +1643,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x dnů</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Nepodařilo se zaregistrovat k odběru systémových zpráv.</target>
-
<source>Cannot set privilege %x.</source>
<target>Nelze nastavit práva pro %x.</target>
@@ -1563,23 +1652,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>Nelze nastavit priority procesu.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Není možné přesunout %x do Koše.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
-<target>Selhala kontrola Koše pro složku %x</target>
-
-<source>Cannot determine final path for %x.</source>
-<target>Nelze určit výslednou cestu pro %x.</target>
-
-<source>Error Code %x:</source>
-<target>Chybový kód %x</target>
+<target>Selhala kontrola Koše pro složku %x.</target>
-<source>Cannot read the following XML elements:</source>
+<source>The following XML elements could not be read:</source>
<target>Nelze načíst následující XML elementy:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Konfigurace ze souboru %x byla načtena jen částečně.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Konfigurační soubor %x je nekompletní. Chybějicí položky budou nahrazeny výchozími hodnotami.</target>
<source>Prepare installation</source>
<target>Příprava instalace</target>
diff --git a/FreeFileSync/Build/Languages/danish.lng b/FreeFileSync/Build/Languages/danish.lng
index e954c5bf..074e3ea7 100644
--- a/FreeFileSync/Build/Languages/danish.lng
+++ b/FreeFileSync/Build/Languages/danish.lng
@@ -50,13 +50,13 @@
<target>Undtagelse opstod</target>
<source>A directory path is expected after %x.</source>
-<target>Der forventes en mappestil efter %x.</target>
+<target>Der forventes en mappesti efter %x.</target>
<source>Syntax error</source>
<target>Syntaksfejl</target>
-<source>Cannot open file %x.</source>
-<target>Filen %x kan ikke åbnes.</target>
+<source>Cannot find file %x.</source>
+<target>Kan ikke finde filen %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Filen %x indeholder ikke gyldige indstillinger.</target>
@@ -77,7 +77,7 @@
<target>Syntaks:</target>
<source>global config file:</source>
-<target>global indstillingsfil</target>
+<target>global indstillingsfil:</target>
<source>config files:</source>
<target>indstillingsfiler:</target>
@@ -92,10 +92,10 @@
<target>Vilkårligt antal FreeFileSync .ffs_gui og/eller .ffs_batch indstillingsfiler.</target>
<source>Any number of alternative directory pairs for at most one config file.</source>
-<target>Vilkårligt antal alternative mappepar til højst en indstillingsfil</target>
+<target>Vilkårligt antal alternative mappepar til højst en indstillingsfil.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Åben indstillingsfil for redigering</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Redigér indstillingsfil.</target>
<source>Cannot find the following folders:</source>
<target>Kan ikke finde følgende mapper:</target>
@@ -125,7 +125,7 @@
<target>Størrelse:</target>
<source>Content comparison was skipped for excluded files %x.</source>
-<target>Indholdsanalyse udeladt for ekskluderede filer %x</target>
+<target>Indholdsanalyse udeladt for ekskluderede filer %x.</target>
<source>Items differ in attributes only</source>
<target>Enhederne har kun attributter til forskel</target>
@@ -185,7 +185,7 @@
<target>Flyt filen til venstre</target>
<source>Move file on right</source>
-<target>flyt filen til højre</target>
+<target>Flyt filen til højre</target>
<source>Update left item</source>
<target>Opdater venstre emne</target>
@@ -202,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Uventet datastørrelse.
+Forventet: %x byte
+Aktuel: %y byte
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Kan ikke skrive tilladelserne til %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Kan ikke kopiere symlink fra %x til %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Kan ikke flytte filen %x til %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Kan ikke optælle mappen %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Kan ikke læse filattributterne på %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Kan ikke finde %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Filen %x kan ikke åbnes.</target>
+
+<source>Cannot find device %x.</source>
+<target>Kan ikke finde enheden %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Kan ikke definere ledig plads på %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Kan ikke oprette mappen %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Kan ikke slette mappen %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Kan ikke slette filen %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Kan ikke opdatere tidsændring på %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Kan ikke bestemme endelig sti for %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Kan ikke følge symlinket %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Kunne ikke flytte %x til papirkurv.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Kan ikke åbne mappen %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Ugyldig kommando:</target>
+
+<source>Error Code %x:</source>
+<target>Fejlkode %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Kunne ikke kontakte SFTP serveren %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +315,14 @@
<source>Database file is corrupt:</source>
<target>Databasefilen er ødelagt:</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>Database files do not share a common session.</source>
<target>Databasefiler kan ikke dele handling.</target>
<source>Searching for folder %x...</source>
<target>Søger efter mappen %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Kan ikke læse filattributterne på %x.</target>
+<source>Time out 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>
@@ -257,7 +331,7 @@
<target>Venter mens mappe låses:</target>
<source>Lock owner:</source>
-<target>Låsens ejer</target>
+<target>Låsens ejer:</target>
<source>
<pluralform>1 sec</pluralform>
@@ -320,7 +394,7 @@
<target>Gennemse mappe</target>
<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>VSS tjenesten er ikke tilgængelig</target>
+<target>VSS tjenesten er ikke tilgængelig.</target>
<source>Please use FreeFileSync 64-bit version to create shadow copies on this system.</source>
<target>Brug FreeFileSync 64-bit til at lave VSS kopier på dette system.</target>
@@ -337,6 +411,15 @@
<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>
+
<source>&Open...</source>
<target>&Åben...</target>
@@ -385,14 +468,11 @@
<source>Browse</source>
<target>Gennemse</target>
-<source>Select a folder</source>
-<target>Vælg en mappe</target>
-
<source>Idle time (in seconds):</source>
-<target>Efter PC tomgang i (sek)</target>
+<target>Efter PC tomgang (sek):</target>
<source>Idle time between last detected change and execution of command</source>
-<target>Tid imellem sidst fundne ændring og udførsel</target>
+<target>Tid mellem sidst fundne ændring og udførsel</target>
<source>Command line:</source>
<target>Kommando:</target>
@@ -405,7 +485,7 @@ The command is triggered if:
<target>
Kommandoen udføres hvis:
- filer eller undermapper ændres
-- nye mapper findes (f.eks USB nøgle)
+- nye mapper findes (f.eks. USB nøgle)
</target>
<source>&Start</source>
@@ -441,9 +521,6 @@ Kommandoen udføres hvis:
<source>&Quit</source>
<target>&Afslut</target>
-<source>Incorrect command line:</source>
-<target>Ugyldig kommando:</target>
-
<source>&Retry</source>
<target>&Prøv igen</target>
@@ -498,18 +575,18 @@ Kommandoen udføres hvis:
<source>Updating attributes of %x</source>
<target>Opdaterer attributter for %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>Creating a Volume Shadow Copy for %x...</source>
<target>Opretter VSS kopi for %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Godkendelsesfejl: %x og %y har forskelligt indhold</target>
-
<source>Target folder %x already existing.</source>
<target>Destinationsmappen %x findes allerede.</target>
-<source>Cannot find folder %x.</source>
-<target>Kan ikke finde mappen %x</target>
-
<source>Target folder input field must not be empty.</source>
<target>Destinationsmappen skal angives.</target>
@@ -522,8 +599,8 @@ Kommandoen udføres hvis:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>Følgende mapper har markante forskelle. Kontroller at du synkroniserer de rigtige mapper</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Følgende mapper er meget forskellige. Kontrollér at du har valgt at synkronisere de rigtige mapper.</target>
<source>Not enough free disk space available in:</source>
<target>Ikke nok ledig diskplads på:</target>
@@ -535,7 +612,7 @@ Kommandoen udføres hvis:
<target>Tilgængeligt:</target>
<source>Multiple folder pairs write to a common subfolder. Please review your configuration.</source>
-<target>Flere mappepar skriver til en almen undermappe. Kontroller dine indstillinger</target>
+<target>Flere mappepar skriver til en almen undermappe. Kontroller dine indstillinger.</target>
<source>Synchronizing folder pair:</source>
<target>Synkroniserer mappepar:</target>
@@ -549,12 +626,18 @@ Kommandoen udføres hvis:
<source>Synchronization stopped</source>
<target>Synkronisering afbrudt</target>
+<source>Stopped</source>
+<target>Afbrudt</target>
+
<source>Synchronization completed with errors</source>
<target>Synkronisering gennemført med fejl</target>
<source>Synchronization completed with warnings</source>
<target>Synkronisering gennemført med advarsel</target>
+<source>Warning</source>
+<target>Advarsel</target>
+
<source>Nothing to synchronize</source>
<target>Alt er synkroniseret</target>
@@ -564,9 +647,6 @@ Kommandoen udføres hvis:
<source>Cleaning up old log files...</source>
<target>Fjerner gamle logfiler...</target>
-<source>Stopped</source>
-<target>Afbrudt</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Skift til FreeFileSyncs hovedvindue for at løse problemet.</target>
@@ -657,9 +737,6 @@ Kommandoen udføres hvis:
<source>Action</source>
<target>Handling</target>
-<source>Drag && drop</source>
-<target>Træk emner hertil</target>
-
<source>Local comparison settings</source>
<target>Lokale analyseindstillinger</target>
@@ -690,6 +767,9 @@ Kommandoen udføres hvis:
<source>Local Synchronization Settings</source>
<target>Lokale synkindstillinger</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Mappen %x kan ikke bruges i FreeFileSync. Vælg en mappe på computeren, netværket eller en MTP enhed.</target>
+
<source>&New</source>
<target>&Ny</target>
@@ -697,7 +777,7 @@ Kommandoen udføres hvis:
<target>&Gem</target>
<source>Save as &batch job...</source>
-<target>Gem som &batchfil</target>
+<target>Gem som &batchfil...</target>
<source>Start &comparison</source>
<target>Start &analyse</target>
@@ -724,7 +804,7 @@ Kommandoen udføres hvis:
<target>&Sprog</target>
<source>&Find...</source>
-<target>S&øg</target>
+<target>S&øg...</target>
<source>&Reset layout</source>
<target>N&ulstil layout</target>
@@ -759,6 +839,9 @@ Kommandoen udføres hvis:
<source>Remove folder pair</source>
<target>Fjern mappepar</target>
+<source>Select SFTP folder</source>
+<target>Vælg SFTP mappe</target>
+
<source>Swap sides</source>
<target>Byt side</target>
@@ -805,7 +888,7 @@ Kommandoen udføres hvis:
<target>Antal bytes der kopieres</target>
<source>Use local settings:</source>
-<target>Brug lokale indstillinger</target>
+<target>Brug lokale indstillinger:</target>
<source>Select a variant:</source>
<target>Vælg metode:</target>
@@ -816,8 +899,8 @@ Kommandoen udføres hvis:
<source>Identify equal files by comparing the file content.</source>
<target>Genkend ens filer efter indhold.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignorer tidsskift (i timer)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignorer tidsskift (timer)</target>
<source>Consider file times with specified offset as equal</source>
<target>Betragt filer med defineret tidsskift som uændrede</target>
@@ -825,14 +908,14 @@ Kommandoen udføres hvis:
<source>Handle daylight saving time</source>
<target>Tag hensyn til sommertid</target>
-<source>Include symbolic links:</source>
-<target>Medtag symlinks:</target>
+<source>Include &symbolic links:</source>
+<target>Medtag &symbolske link:</target>
-<source>Direct</source>
-<target>Direkte</target>
+<source>&Follow</source>
+<target>&Følg</target>
-<source>Follow</source>
-<target>Følg</target>
+<source>&Direct</source>
+<target>&Henvis</target>
<source>More information</source>
<target>Mere information</target>
@@ -862,7 +945,7 @@ Kommandoen udføres hvis:
<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 til ekskludering af bestemte filer fra synkroniseringen. Filstier skal relatere til kildemapperne.</target>
+<target>Angiv filterregler der udelukker bestemte filer fra synkroniseringen. Filstier skal relatere til kildemapperne.</target>
<source>C&lear</source>
<target>R&yd</target>
@@ -871,14 +954,14 @@ Kommandoen udføres hvis:
<target>Genkend flyttede filer</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Overvågning akiv efter første synk
-- Kræver og opretter databasefiler
-- Støttes ikke af alle filsystemer
+- Understøtter ikke alle filsystemer
+- Opretter nødvendige databasefiler
+- Genkender ikke ved første synk
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -897,7 +980,7 @@ Kommandoen udføres hvis:
<target>&Papirkurv</target>
<source>Back up deleted and overwritten files in the recycle bin</source>
-<target>Backup slettede og overskrevne filer i papirkurven</target>
+<target>Flyt slettede og overskrevne filer til papirkurven</target>
<source>&Versioning</source>
<target>&Versionering</target>
@@ -926,6 +1009,27 @@ Kommandoen udføres hvis:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Angiv SFTP detaljer:</target>
+
+<source>Server name or IP address:</source>
+<target>Servernavn eller IP adresse:</target>
+
+<source>Examples:</source>
+<target>F.eks:</target>
+
+<source>User name:</source>
+<target>Brugernavn:</target>
+
+<source>Password:</source>
+<target>Kodeord:</target>
+
+<source>&Show password</source>
+<target>Vis &kodeord</target>
+
+<source>Directory on server:</source>
+<target>Servermappe:</target>
+
<source>Start synchronization now?</source>
<target>Synkroniser nu?</target>
@@ -935,6 +1039,9 @@ Kommandoen udføres hvis:
<source>&Don't show this dialog again</source>
<target>&Vis ikke igen</target>
+<source>Arrange folder pair</source>
+<target>Arrangér mappepar</target>
+
<source>Items found:</source>
<target>Emner fundet:</target>
@@ -963,7 +1070,7 @@ Kommandoen udføres hvis:
<target>Stop</target>
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
-<target>Opret batchfil til automatisk synkronisering. Start ved at dobbeltklikke på filen eller planlæg via opgavestyring: %x</target>
+<target>Opret batchfil til automatisk synkronisering. Start med dobbeltklik på filen eller planlæg via opgavestyring: %x</target>
<source>&Stop</source>
<target>&Stop</target>
@@ -996,7 +1103,10 @@ Kommandoen udføres hvis:
Copy to a temporary file (*.ffs_tmp) before overwriting target.
This guarantees a consistent state even in case of a serious error.
</source>
-<target>Kopiér til midlertidig fil (*.ffs_tmp) før overskrivning. Sikrer processen ved alvorlige fejl.</target>
+<target>
+Kopiér til midlertidig fil (*.ffs_tmp) før overskrivning.
+Sikrer processen ved alvorlige fejl.
+</target>
<source>(recommended)</source>
<target>(anbefalet)</target>
@@ -1062,7 +1172,10 @@ This guarantees a consistent state even in case of a serious error.
<target>Udgivet under GNU General Public Licence</target>
<source>Many thanks for localization:</source>
-<target>Tak for oversættelse:</target>
+<target>Tak for oversættelse til:</target>
+
+<source>SSH File Transfer Protocol</source>
+<target>SSH FTP</target>
<source>Save as Batch Job</source>
<target>Gem som batchfil</target>
@@ -1076,8 +1189,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Vælg tidsinterval</target>
-<source>&Preferences...</source>
-<target>I&ndstillinger</target>
+<source>&Preferences</source>
+<target>&Indstillinger</target>
+
+<source>Main Bar</source>
+<target>Hovedlinie</target>
<source>Folder Pairs</source>
<target>Mappepar</target>
@@ -1094,9 +1210,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>Oversigt</target>
-<source>Main Bar</source>
-<target>Hovedlinie</target>
-
<source>Confirm</source>
<target>Bekræft</target>
@@ -1146,7 +1259,7 @@ This guarantees a consistent state even in case of a serious error.
<target>vælg flere</target>
<source>Include via filter:</source>
-<target>Inkludér via filter:</target>
+<target>Inkludér m. filter:</target>
<source>Exclude via filter:</source>
<target>Ekskluder m. filter:</target>
@@ -1205,8 +1318,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&Gem ikke</target>
-<source>Delete selected configurations</source>
-<target>Slet valgte indstillinger</target>
+<source>Remove entry from list</source>
+<target>Fjern fra liste</target>
<source>Synchronization Settings</source>
<target>Synkroniseringsindstillinger</target>
@@ -1259,8 +1372,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>Vis filtrerede eller midlertidigt ekskluderede filer</target>
-<source>Set as default</source>
-<target>Sæt som standard</target>
+<source>Save as default</source>
+<target>Gem som standard</target>
<source>Filter</source>
<target>Filter</target>
@@ -1271,6 +1384,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot find %x</source>
<target>Kan ikke finde %x</target>
+<source>Move up</source>
+<target>Flyt op</target>
+
+<source>Move down</source>
+<target>Flyt ned</target>
+
<source>Comma-separated values</source>
<target>Kommaopdelte værdier</target>
@@ -1283,18 +1402,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>Luk dialogen</target>
-<source>Standby</source>
-<target>Standby</target>
-
<source>Log off</source>
<target>Log af</target>
+<source>Standby</source>
+<target>Standby</target>
+
<source>Shut down</source>
<target>Luk ned</target>
-<source>Hibernate</source>
-<target>Dvale</target>
-
<source>Scanning...</source>
<target>Skanner...</target>
@@ -1304,9 +1420,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Advarsel</target>
-
<source>Select all</source>
<target>Vælg alt</target>
@@ -1352,8 +1465,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>Indstillinger</target>
-<source>Copy NTFS permissions</source>
-<target>Kopier NTFS tilladelser</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Kopiér DACL, SACL, ejer, gruppe</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrer eksterne programmer i kontekstmenu. Brug følgende macroer:</target>
@@ -1380,7 +1493,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Find og udbred ændringer på begge sider. Sletninger, omdøbninger og konflikter findes automatisk i en database.</target>
<source>Create a mirror backup of the left folder by adapting the right folder to match.</source>
-<target>Opret spejling af venstre mappe ved at tilpasse den højre mappe</target>
+<target>Opret spejling af venstre mappe ved at tilpasse den højre mappe.</target>
<source>Copy new and updated files to the right folder.</source>
<target>Kopier nye og opdaterede filer til højre mappe.</target>
@@ -1448,27 +1561,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>Procent</target>
+<source>Unable to register to receive system messages.</source>
+<target>Kunne ikke registrere modtagelse af systembeskeder.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Kan ikke registrere beskeder for %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Kan ikke overvåge mappen %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Kan ikke slette filen %x.</target>
-
<source>The file is locked by another process:</source>
<target>Filen er låst af en anden process:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Kan ikke flytte filen %x til %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Kan ikke slette mappen %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Kan ikke skrive filattributter til %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Kan ikke opdatere tidsændring på %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Kan ikke læse sikkerhedsindstillinger på %x.</target>
@@ -1478,33 +1585,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>Kan ikke læse tilladelserne på %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Kan ikke skrive tilladelserne til %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Kan ikke oprette mappen %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Kan ikke kopiere symlink fra %x til %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Kan ikke kopiere tilladelser fra %x til %y.</target>
<source>Cannot find system function %x.</source>
<target>Kan ikke finde systemfunktionen %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Kan ikke kopiere attributter fra %x til %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Kan ikke kopiere filen %x til %y.</target>
<source>Type of item %x is not supported:</source>
<target>Filtypen %x understøttes ikke:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Kan ikke følge symlinket %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Kan ikke åbne mappen %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Kan ikke optælle mappen %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1538,9 +1633,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x dage</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Kunne ikke registrere modtagelse af systembeskeder.</target>
-
<source>Cannot set privilege %x.</source>
<target>Kan ikke sætte %x privilegier.</target>
@@ -1550,23 +1642,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>Kan ikke ændre I/O prioriteter.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Kunne ikke flytte %x til papirkurv.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
-<target>Check papirkurv fejlede for mappen %x</target>
-
-<source>Cannot determine final path for %x.</source>
-<target>Kan ikke bestemme endelig sti for %x</target>
-
-<source>Error Code %x:</source>
-<target>Fejlkode %x:</target>
+<target>Check papirkurv fejlede for mappen %x.</target>
-<source>Cannot read the following XML elements:</source>
-<target>Kan ikke læse følgende XML emner:</target>
+<source>The following XML elements could not be read:</source>
+<target>Kunne ikke læse følgende XML emner:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Indstillingsfilen %x er kun delvist indlæst.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Indstillingsfilen %x er ikke komplet. Manglende elementer sættes til standard.</target>
<source>Prepare installation</source>
<target>Forbereder installering</target>
@@ -1593,7 +1676,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Registrerer FreeFileSync filtyper</target>
<source>Create Explorer context menu entries</source>
-<target>Føj til Stifinders højrekliksmenu</target>
+<target>Vises i Stifinders højrekliksmenu</target>
<source>Save settings in installation directory</source>
<target>Gemmer indstillinger i programmets mappe</target>
diff --git a/FreeFileSync/Build/Languages/dutch.lng b/FreeFileSync/Build/Languages/dutch.lng
index 273b40a1..3bfeab10 100644
--- a/FreeFileSync/Build/Languages/dutch.lng
+++ b/FreeFileSync/Build/Languages/dutch.lng
@@ -47,7 +47,7 @@
<target>De prullenbak is niet beschikbaar voor de volgende mappen. De bestanden worden permanent verwijderd:</target>
<source>An exception occurred</source>
-<target>Een uitzondering is opgetreden</target>
+<target>Er is een uitzondering opgetreden</target>
<source>A directory path is expected after %x.</source>
<target>Een mappad wordt na %x verwacht.</target>
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Syntaxisfout</target>
-<source>Cannot open file %x.</source>
-<target>Het bestand %x kan niet geopend worden.</target>
+<source>Cannot find file %x.</source>
+<target>Kan bestand %x niet vinden.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Het bestand %x bevat geen geldige configuratie.</target>
@@ -94,11 +94,11 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Een willekeurig aantal alternatieve directoryparen voor maximaal een configuratiebestand.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Open configuratie voor het bewerken zonder uit te voeren.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Open configuratie voor het bewerken, zonder het uit te voeren.</target>
<source>Cannot find the following folders:</source>
-<target>De volgende mappen kon niet worden gevonden:</target>
+<target>De volgende mappen konden niet worden gevonden:</target>
<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
<target>Deze fout kan worden genegeerd, om de mappen als leeg te zien en de folders automatisch te creëren wanneer u synchroniseert.</target>
@@ -202,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Onverwachte grootte van de gegevensstroom.
+Verwacht: %x bytes
+Werkelijk: %y bytes
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Kan de aangegeven machtigingen van %x niet schrijven.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Kan de symbolische koppeling %x niet kopiëren naar %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Het bestand %x kan niet naar %y verplaatst worden.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Kan de folder %x niet opsommen.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Kan de bestandskenmerken van %x niet lezen.</target>
+
+<source>Cannot find %x.</source>
+<target>Kan %x niet vinden.</target>
+
+<source>Cannot open file %x.</source>
+<target>Het bestand %x kan niet geopend worden.</target>
+
+<source>Cannot find device %x.</source>
+<target>Kan apparaat %x niet vinden.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Kan de vrije schijfruimte voor %x niet bepalen.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Kan de map %x niet maken.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>De map %x kan niet verwijderd worden.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Kan bestand %x niet verwijderen.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>De modificatie-tijd van %x kan niet geschreven worden.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Kan het uiteindelijke pad voor %x niet bepalen.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Kan de symbolische koppeling %x niet oplossen.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Niet in staat om %x naar de prullenbak te verplaatsen.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Kan de folder %x niet openen.</target>
+
+<source>Incorrect command line:</source>
+<target>Onjuiste opdrachtregel:</target>
+
+<source>Error Code %x:</source>
+<target>Foutcode %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Kan geen verbinding maken met SFTP server %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +315,14 @@
<source>Database file is corrupt:</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>Database files do not share a common session.</source>
<target>Database bestanden kunnen geen gemeenschappelijke sessie delen.</target>
<source>Searching for folder %x...</source>
<target>Zoek naar map %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Kan de bestandskenmerken van %x niet lezen.</target>
+<source>Time out 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>
@@ -337,6 +411,15 @@
<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>
+
<source>&Open...</source>
<target>&Openen...</target>
@@ -385,9 +468,6 @@
<source>Browse</source>
<target>Bladeren</target>
-<source>Select a folder</source>
-<target>Selecteer een map</target>
-
<source>Idle time (in seconds):</source>
<target>Inactieve tijd (in seconden):</target>
@@ -441,9 +521,6 @@ De opdracht wordt geactiveerd als:
<source>&Quit</source>
<target>&Stoppen</target>
-<source>Incorrect command line:</source>
-<target>Onjuiste opdrachtregel:</target>
-
<source>&Retry</source>
<target>&Probeer opnieuw</target>
@@ -498,18 +575,18 @@ De opdracht wordt geactiveerd als:
<source>Updating attributes of %x</source>
<target>Kenmerken van %x bijwerken</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>Creating a Volume Shadow Copy for %x...</source>
<target>Maken van een volume schaduwkopie voor %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Gegevens verificatiefout: %x en %y hebben verschillende inhoud.</target>
-
<source>Target folder %x already existing.</source>
<target>Doelmap %x bestaat reeds.</target>
-<source>Cannot find folder %x.</source>
-<target>Kan de map %x niet vinden.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Het invoerveld van de doelmap moet niet leeg zijn.</target>
@@ -522,8 +599,8 @@ De opdracht wordt geactiveerd als:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>De volgende mappen zijn beduidend verschillend. Zorg ervoor dat u de juiste mappen voor synchronisatie geselecteerd hebt.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>De volgende mappen zijn aanzienlijk verschillend. Zorg ervoor dat u de juiste mappen voor synchronisatie hebt geselecteerd.</target>
<source>Not enough free disk space available in:</source>
<target>Er is onvoldoende vrije schijfruimte beschikbaar in:</target>
@@ -549,12 +626,18 @@ De opdracht wordt geactiveerd als:
<source>Synchronization stopped</source>
<target>Synchronisatie gestopt</target>
+<source>Stopped</source>
+<target>Gestopt</target>
+
<source>Synchronization completed with errors</source>
<target>Synchronisatie met fouten voltooid</target>
<source>Synchronization completed with warnings</source>
<target>Synchronisatie met waarschuwingen voltooid</target>
+<source>Warning</source>
+<target>Waarschuwing</target>
+
<source>Nothing to synchronize</source>
<target>Niets om te synchroniseren</target>
@@ -564,9 +647,6 @@ De opdracht wordt geactiveerd als:
<source>Cleaning up old log files...</source>
<target>Opruimen oude logboekbestanden...</target>
-<source>Stopped</source>
-<target>Gestopt</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>U kunt overschakelen naar het hoofdvenster van FreeFileSync om dit probleem op te lossen.</target>
@@ -657,9 +737,6 @@ De opdracht wordt geactiveerd als:
<source>Action</source>
<target>Actie</target>
-<source>Drag && drop</source>
-<target>Slepen && neerzetten</target>
-
<source>Local comparison settings</source>
<target>Lokale vergelijking instellingen</target>
@@ -670,7 +747,7 @@ De opdracht wordt geactiveerd als:
<target>Lokale filter</target>
<source>Active</source>
-<target>Actieve</target>
+<target>Actief</target>
<source>None</source>
<target>Geen</target>
@@ -690,6 +767,9 @@ De opdracht wordt geactiveerd als:
<source>Local Synchronization Settings</source>
<target>Lokale synchronisatie-instellingen</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>De geselecteerde map %x kan niet worden gebruikt met FreeFileSync. Selecteer een map op een lokaal bestandssysteem, netwerk of een MTP-apparaat.</target>
+
<source>&New</source>
<target>&Nieuw</target>
@@ -703,7 +783,7 @@ De opdracht wordt geactiveerd als:
<target>Start &vergelijking</target>
<source>C&omparison settings</source>
-<target>V&ergelijking instellingen</target>
+<target>V&ergelijkings instellingen</target>
<source>&Filter settings</source>
<target>&Filter instellingen</target>
@@ -759,6 +839,9 @@ De opdracht wordt geactiveerd als:
<source>Remove folder pair</source>
<target>Verwijder map-paar</target>
+<source>Select SFTP folder</source>
+<target>Selecteer SFTP map</target>
+
<source>Swap sides</source>
<target>Verwisselen van zijden</target>
@@ -784,7 +867,7 @@ De opdracht wordt geactiveerd als:
<target>Opslaan als...</target>
<source>View type:</source>
-<target>Weergavetype:</target>
+<target>Type bekijken:</target>
<source>Select view:</source>
<target>Selecteer weergave:</target>
@@ -816,8 +899,8 @@ De opdracht wordt geactiveerd als:
<source>Identify equal files by comparing the file content.</source>
<target>Identificeer gelijke bestanden door het vergelijken van de bestandsinhoud.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Negeer tijdverschuiving (in uren)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Negeer tijdsverschuiving (in uren)</target>
<source>Consider file times with specified offset as equal</source>
<target>Overweeg bestand-tijden met gespecificeerde verspringing als gelijkwaardig te beschouwen</target>
@@ -825,14 +908,14 @@ De opdracht wordt geactiveerd als:
<source>Handle daylight saving time</source>
<target>Zomertijd gebruiken</target>
-<source>Include symbolic links:</source>
-<target>Omvat symbolische koppelingen</target>
+<source>Include &symbolic links:</source>
+<target>Inclusief &symbolische links:</target>
-<source>Direct</source>
-<target>Direct</target>
+<source>&Follow</source>
+<target>&Volgen</target>
-<source>Follow</source>
-<target>Volgen</target>
+<source>&Direct</source>
+<target>&Direct</target>
<source>More information</source>
<target>Meer informatie</target>
@@ -841,7 +924,7 @@ De opdracht wordt geactiveerd als:
<target>Lokale instellingen:</target>
<source>Include:</source>
-<target>Omvatten:</target>
+<target>Inclusief:</target>
<source>Exclude:</source>
<target>Uitgesloten:</target>
@@ -871,14 +954,14 @@ De opdracht wordt geactiveerd als:
<target>Detecteren van verplaatste bestanden</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Detectie actief na eerste synchronisatie
-- Vereist en maakt databasebestanden
- Niet ondersteund door alle bestandssystemen
+- Vereist en maakt database bestanden
+- Detectie niet beschikbaar voor de eerste synchronisatie
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -926,6 +1009,27 @@ De opdracht wordt geactiveerd als:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Vul uw SFTP login gegevens in:</target>
+
+<source>Server name or IP address:</source>
+<target>Servernaam of IP-adres:</target>
+
+<source>Examples:</source>
+<target>Voorbeelden:</target>
+
+<source>User name:</source>
+<target>Gebruikersnaam:</target>
+
+<source>Password:</source>
+<target>Wachtwoord:</target>
+
+<source>&Show password</source>
+<target>&Toon wachtwoord</target>
+
+<source>Directory on server:</source>
+<target>Map op de server:</target>
+
<source>Start synchronization now?</source>
<target>Synchronisatie nu starten?</target>
@@ -935,6 +1039,9 @@ De opdracht wordt geactiveerd als:
<source>&Don't show this dialog again</source>
<target>&Dit dialoogvenster niet opnieuw weergeven</target>
+<source>Arrange folder pair</source>
+<target>Rangschik folder-paar</target>
+
<source>Items found:</source>
<target>Gevonden objecten:</target>
@@ -1067,6 +1174,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Many thanks for localization:</source>
<target>Hartelijk dank voor de lokalisatie:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH File Transfer Protocol</target>
+
<source>Save as Batch Job</source>
<target>Opslaan als batch opdracht</target>
@@ -1079,8 +1189,11 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Select Time Span</source>
<target>Selecteer tijdsduur</target>
-<source>&Preferences...</source>
-<target>&Voorkeuren...</target>
+<source>&Preferences</source>
+<target>&Voorkeuren</target>
+
+<source>Main Bar</source>
+<target>Hoofd balk</target>
<source>Folder Pairs</source>
<target>Map-paren</target>
@@ -1097,9 +1210,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Overview</source>
<target>Overzicht</target>
-<source>Main Bar</source>
-<target>Hoofd balk</target>
-
<source>Confirm</source>
<target>Bevestigen</target>
@@ -1149,7 +1259,7 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<target>meervoudige selectie</target>
<source>Include via filter:</source>
-<target>Opnemen via filter:</target>
+<target>Inclusief via filter:</target>
<source>Exclude via filter:</source>
<target>Uitsluiten via filter:</target>
@@ -1197,7 +1307,7 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<target>Configuratie opgeslagen</target>
<source>FreeFileSync batch</source>
-<target>FreeFileSync Batch</target>
+<target>FreeFileSync batch</target>
<source>Do you want to save changes to %x?</source>
<target>Wilt u de wijzigingen in %x opslaan?</target>
@@ -1208,8 +1318,8 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Do&n't save</source>
<target>&Niet opslaan</target>
-<source>Delete selected configurations</source>
-<target>Verwijder geselecteerde configuraties</target>
+<source>Remove entry from list</source>
+<target>Vermelding verwijderen uit de lijst</target>
<source>Synchronization Settings</source>
<target>Synchronisatie-instellingen</target>
@@ -1262,8 +1372,8 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Show filtered or temporarily excluded files</source>
<target>Toon gefilterde of tijdelijk uitgesloten bestanden</target>
-<source>Set as default</source>
-<target>Als standaard instellen</target>
+<source>Save as default</source>
+<target>Opslaan als standaard</target>
<source>Filter</source>
<target>Filter</target>
@@ -1274,6 +1384,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Cannot find %x</source>
<target>Kan %x niet vinden.</target>
+<source>Move up</source>
+<target>Omhoog</target>
+
+<source>Move down</source>
+<target>Omlaag</target>
+
<source>Comma-separated values</source>
<target>Door komma gescheiden waarden</target>
@@ -1286,18 +1402,15 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Close progress dialog</source>
<target>Voortgang dialoogvenster sluiten</target>
-<source>Standby</source>
-<target>Standby</target>
-
<source>Log off</source>
<target>Afmelden</target>
+<source>Standby</source>
+<target>Standby</target>
+
<source>Shut down</source>
<target>Afsluiten</target>
-<source>Hibernate</source>
-<target>Slaapstand</target>
-
<source>Scanning...</source>
<target>Scannen...</target>
@@ -1307,9 +1420,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Waarschuwing</target>
-
<source>Select all</source>
<target>Alles selecteren</target>
@@ -1355,8 +1465,8 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Preferences</source>
<target>Voorkeuren</target>
-<source>Copy NTFS permissions</source>
-<target>Kopieëren van NTFS-machtigingen</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Kopiëren DACL, SACL, Eigenaar, Groep</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Externe applicaties integreren in het contextmenu. De volgende macro's zijn beschikbaar:</target>
@@ -1451,27 +1561,21 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Percentage</source>
<target>Percentage</target>
+<source>Unable to register to receive system messages.</source>
+<target>Niet in staat om de ontvangen systeemberichten te registreren.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Niet in staat om apparaat meldingen te registreren voor %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Kan map %x niet bewaken.</target>
-<source>Cannot delete file %x.</source>
-<target>Kan bestand %x niet verwijderen.</target>
-
<source>The file is locked by another process:</source>
<target>Het bestand is vergrendeld door een ander proces:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Het bestand %x kan niet naar %y verplaatst worden.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>De map %x kan niet verwijderd worden.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>De bestandskenmerken voor %x kunnen niet geschreven worden.</target>
-<source>Cannot write modification time of %x.</source>
-<target>De modificatie-tijd van %x kan niet geschreven worden.</target>
-
<source>Cannot read security context of %x.</source>
<target>Kan de beveiligingscontext van %x niet lezen.</target>
@@ -1481,33 +1585,21 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Cannot read permissions of %x.</source>
<target>Kan de aangegeven machtigingen van %x niet lezen.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Kan de aangegeven machtigingen van %x niet schrijven.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Kan de map %x niet maken.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Kan de symbolische koppeling %x niet kopiëren naar %y</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Kan de toegangsrechten van %x niet kopiëren naar %y.</target>
<source>Cannot find system function %x.</source>
<target>Kan de systeemfunctie %x niet vinden.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Kan de attributen van %x niet kopiëren naar %y.</target>
+
<source>Cannot copy file %x to %y.</source>
-<target>Kan bestand %x niet kopieëren naar %y.</target>
+<target>Kan bestand %x niet kopiëren naar %y.</target>
<source>Type of item %x is not supported:</source>
<target>Dit itemtype %x wordt niet ondersteund:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Kan de symbolische koppeling %x niet oplossen.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Kan de folder %x niet openen.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Kan de folder %x niet opsommen.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1541,9 +1633,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<pluralform>%x dagen</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Niet in staat om de ontvangen systeemberichten te registreren.</target>
-
<source>Cannot set privilege %x.</source>
<target>Kan geen privileges %x instellen.</target>
@@ -1553,23 +1642,14 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Cannot change process I/O priorities.</source>
<target>De input/output prioriteiten kunnen niet gewijzigd worden.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Niet in staat om %x naar de prullenbak te verplaatsen.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Controle van de prullenbak voor map %x is mislukt.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Kan niet het uiteindelijke pad voor %x bepalen.</target>
-
-<source>Error Code %x:</source>
-<target>Foutcode %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Kan de volgende XML onderdelen niet lezen:</target>
+<source>The following XML elements could not be read:</source>
+<target>De volgende XML-elementen kunnen niet worden gelezen:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Configuratiebestand %x alleen gedeeltelijk ingelezen.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Configuratiebestand %x is onvolledig. De ontbrekende elementen worden ingesteld op hun standaardwaarden.</target>
<source>Prepare installation</source>
<target>Installatie voorbereiden</target>
diff --git a/FreeFileSync/Build/Languages/english_uk.lng b/FreeFileSync/Build/Languages/english_uk.lng
index 7edbd19b..ba5160de 100644
--- a/FreeFileSync/Build/Languages/english_uk.lng
+++ b/FreeFileSync/Build/Languages/english_uk.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Syntax error</target>
-<source>Cannot open file %x.</source>
-<target>Cannot open file %x.</target>
+<source>Cannot find file %x.</source>
+<target>Cannot find file %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>File %x does not contain a valid configuration.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Any number of alternative directory pairs for at most one config file.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Open configuration for edit without executing.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Open configuration for editing without executing it.</target>
<source>Cannot find the following folders:</source>
<target>Cannot find the following folders:</target>
@@ -202,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Cannot write permissions of %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Cannot copy symbolic link %x to %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Cannot move file %x to %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Cannot enumerate directory %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Cannot read file attributes of %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Cannot find %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Cannot open file %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Cannot find device %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Cannot determine free disk space for %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Cannot create directory %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Cannot delete directory %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Cannot delete file %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Cannot write modification time of %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Cannot determine final path for %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Cannot resolve symbolic link %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Unable to move %x to the recycle bin.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Cannot open directory %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Incorrect command line:</target>
+
+<source>Error Code %x:</source>
+<target>Error Code %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Failed to connect to SFTP server %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +315,14 @@
<source>Database file is corrupt:</source>
<target>Database file is corrupt:</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>Database files do not share a common session.</source>
<target>Database files do not share a common session.</target>
<source>Searching for folder %x...</source>
<target>Searching for folder %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Cannot read file attributes of %x.</target>
+<source>Time out 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>
@@ -337,6 +411,15 @@
<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>
+
<source>&Open...</source>
<target>&Open...</target>
@@ -385,9 +468,6 @@
<source>Browse</source>
<target>Browse</target>
-<source>Select a folder</source>
-<target>Select a folder</target>
-
<source>Idle time (in seconds):</source>
<target>Idle time (in seconds):</target>
@@ -441,9 +521,6 @@ The command is triggered if:
<source>&Quit</source>
<target>&Quit</target>
-<source>Incorrect command line:</source>
-<target>Incorrect command line:</target>
-
<source>&Retry</source>
<target>&Retry</target>
@@ -498,18 +575,18 @@ The command is triggered if:
<source>Updating attributes of %x</source>
<target>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>Creating a Volume Shadow Copy for %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Data verification error: %x and %y have different content.</target>
-
<source>Target folder %x already existing.</source>
<target>Target folder %x already existing.</target>
-<source>Cannot find folder %x.</source>
-<target>Cannot find folder %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Target folder input field must not be empty.</target>
@@ -522,8 +599,8 @@ The command is triggered if:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>The following folders are significantly different. Make sure you are matching the correct folders for synchronisation.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>The following folders are significantly different. Make sure you have selected the correct folders for synchronisation.</target>
<source>Not enough free disk space available in:</source>
<target>Not enough free disk space available in:</target>
@@ -549,12 +626,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>Synchronisation stopped</target>
+<source>Stopped</source>
+<target>Stopped</target>
+
<source>Synchronization completed with errors</source>
<target>Synchronisation completed with errors</target>
<source>Synchronization completed with warnings</source>
<target>Synchronisation completed with warnings</target>
+<source>Warning</source>
+<target>Warning</target>
+
<source>Nothing to synchronize</source>
<target>Nothing to synchronise</target>
@@ -564,9 +647,6 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>Cleaning up old log files...</target>
-<source>Stopped</source>
-<target>Stopped</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>You can switch to FreeFileSync's main window to resolve this issue.</target>
@@ -657,9 +737,6 @@ The command is triggered if:
<source>Action</source>
<target>Action</target>
-<source>Drag && drop</source>
-<target>Drag && drop</target>
-
<source>Local comparison settings</source>
<target>Local comparison settings</target>
@@ -690,6 +767,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>Local Synchronisation Settings</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</target>
+
<source>&New</source>
<target>&New</target>
@@ -759,6 +839,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>Remove folder pair</target>
+<source>Select SFTP folder</source>
+<target>Select SFTP folder</target>
+
<source>Swap sides</source>
<target>Swap sides</target>
@@ -816,8 +899,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>Identify equal files by comparing the file content.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignore time shift (in hours)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignore time shift (in hours)</target>
<source>Consider file times with specified offset as equal</source>
<target>Consider file times with specified offset as equal</target>
@@ -825,14 +908,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>Handle daylight saving time</target>
-<source>Include symbolic links:</source>
-<target>Include symbolic links:</target>
+<source>Include &symbolic links:</source>
+<target>Include &symbolic links:</target>
-<source>Direct</source>
-<target>Direct</target>
+<source>&Follow</source>
+<target>&Follow</target>
-<source>Follow</source>
-<target>Follow</target>
+<source>&Direct</source>
+<target>&Direct</target>
<source>More information</source>
<target>More information</target>
@@ -871,14 +954,14 @@ The command is triggered if:
<target>Detect moved files</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -926,6 +1009,27 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Enter your SFTP login details:</target>
+
+<source>Server name or IP address:</source>
+<target>Server name or IP address:</target>
+
+<source>Examples:</source>
+<target>Examples:</target>
+
+<source>User name:</source>
+<target>User name:</target>
+
+<source>Password:</source>
+<target>Password:</target>
+
+<source>&Show password</source>
+<target>&Show password</target>
+
+<source>Directory on server:</source>
+<target>Directory on server:</target>
+
<source>Start synchronization now?</source>
<target>Start synchronisation now?</target>
@@ -935,6 +1039,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>&Don't show this dialogue again</target>
+<source>Arrange folder pair</source>
+<target>Arrange folder pair</target>
+
<source>Items found:</source>
<target>Elements found:</target>
@@ -1067,6 +1174,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>Many thanks for localisation:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH File Transfer Protocol</target>
+
<source>Save as Batch Job</source>
<target>Save as Batch Job</target>
@@ -1079,8 +1189,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Select Time Span</target>
-<source>&Preferences...</source>
-<target>&Preferences...</target>
+<source>&Preferences</source>
+<target>&Preferences</target>
+
+<source>Main Bar</source>
+<target>Main Bar</target>
<source>Folder Pairs</source>
<target>Folder Pairs</target>
@@ -1097,9 +1210,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>Overview</target>
-<source>Main Bar</source>
-<target>Main Bar</target>
-
<source>Confirm</source>
<target>Confirm</target>
@@ -1208,8 +1318,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>Do&n't save</target>
-<source>Delete selected configurations</source>
-<target>Delete selected configurations</target>
+<source>Remove entry from list</source>
+<target>Remove entry from list</target>
<source>Synchronization Settings</source>
<target>Synchronisation Settings</target>
@@ -1262,8 +1372,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>Show filtered or temporarily excluded files</target>
-<source>Set as default</source>
-<target>Set as default</target>
+<source>Save as default</source>
+<target>Save as default</target>
<source>Filter</source>
<target>Filter</target>
@@ -1274,6 +1384,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot find %x</source>
<target>Cannot find %x</target>
+<source>Move up</source>
+<target>Move up</target>
+
+<source>Move down</source>
+<target>Move down</target>
+
<source>Comma-separated values</source>
<target>Comma-separated values</target>
@@ -1286,18 +1402,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>Close progress dialogue</target>
-<source>Standby</source>
-<target>Standby</target>
-
<source>Log off</source>
<target>Log off</target>
+<source>Standby</source>
+<target>Standby</target>
+
<source>Shut down</source>
<target>Shut down</target>
-<source>Hibernate</source>
-<target>Hibernate</target>
-
<source>Scanning...</source>
<target>Scanning...</target>
@@ -1307,9 +1420,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Warning</target>
-
<source>Select all</source>
<target>Select all</target>
@@ -1355,8 +1465,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>Preferences</target>
-<source>Copy NTFS permissions</source>
-<target>Copy NTFS permissions</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Copy DACL, SACL, Owner, Group</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrate external applications into context menu. The following macros are available:</target>
@@ -1451,27 +1561,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>Percentage</target>
+<source>Unable to register to receive system messages.</source>
+<target>Unable to register to receive system messages.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Unable to register device notifications for %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Cannot monitor directory %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Cannot delete file %x.</target>
-
<source>The file is locked by another process:</source>
<target>The file is locked by another process:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Cannot move file %x to %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Cannot delete directory %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Cannot write file attributes of %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Cannot write modification time of %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Cannot read security context of %x.</target>
@@ -1481,33 +1585,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>Cannot read permissions of %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Cannot write permissions of %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Cannot create directory %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Cannot copy symbolic link %x to %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Cannot copy permissions from %x to %y.</target>
<source>Cannot find system function %x.</source>
<target>Cannot find system function %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Cannot copy attributes from %x to %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Cannot copy file %x to %y.</target>
<source>Type of item %x is not supported:</source>
<target>Type of item %x is not supported:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Cannot resolve symbolic link %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Cannot open directory %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Cannot enumerate directory %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1541,9 +1633,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x days</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Unable to register to receive system messages.</target>
-
<source>Cannot set privilege %x.</source>
<target>Cannot set privilege %x.</target>
@@ -1553,23 +1642,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>Cannot change process I/O priorities.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Unable to move %x to the recycle bin.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Checking recycle bin failed for folder %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Cannot determine final path for %x.</target>
-
-<source>Error Code %x:</source>
-<target>Error Code %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Cannot read the following XML elements:</target>
+<source>The following XML elements could not be read:</source>
+<target>The following XML elements could not be read:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Configuration file %x loaded partially only.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Configuration file %x is incomplete. The missing elements will be set to their default values.</target>
<source>Prepare installation</source>
<target>Prepare installation</target>
diff --git a/FreeFileSync/Build/Languages/finnish.lng b/FreeFileSync/Build/Languages/finnish.lng
index ae9c9b71..4069361b 100644
--- a/FreeFileSync/Build/Languages/finnish.lng
+++ b/FreeFileSync/Build/Languages/finnish.lng
@@ -55,14 +55,14 @@
<source>Syntax error</source>
<target>Muotovirhe</target>
-<source>Cannot open file %x.</source>
-<target>Tiedosto %x ei aukea.</target>
+<source>Cannot find file %x.</source>
+<target>Tiedosto %x ei löydy.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Tiedosto %x ei sisällä kelvollista kokoonpanoa.</target>
<source>Unequal number of left and right directories specified.</source>
-<target>Oikealla ja vasemmalla määriteltyjen hakemistojen määrä poikkeaa.</target>
+<target>Oikealla ja vasemmalla eri määrä hakemistoja.</target>
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Määrittely ei saa sisältää hakemistoparitason asetuksia, jos hakemistot määritellään komentoriviltä.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Vapaa määrä eri hakemistopareja yhdessä tietyssä määrittelyssä.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Avaa määrittely muutoksia varten, ei suoriteta.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Avaa määrittely muutoksia varten, sitä suorittamatta.</target>
<source>Cannot find the following folders:</source>
<target>Seuraavia hakemistoja ei löydy:</target>
@@ -110,7 +110,7 @@
<target>Vastaava hakemisto tulkitaan tyhjäksi.</target>
<source>The following folder paths are dependent from each other:</source>
-<target>Nämä polut ovat ovat riippuvaisia toisistaan:</target>
+<target>Nämä polut ovat riippuvaisia toisistaan:</target>
<source>File %x has an invalid date.</source>
<target>Tiedostolla %x on virheellinen päiväys.</target>
@@ -128,7 +128,7 @@
<target>Sisällön vertailu sivutettiin poissuljetuille tiedostoille %x.</target>
<source>Items differ in attributes only</source>
-<target>Kohteet eroavat vain attribuuttien osalta</target>
+<target>Kohteet eroavat vain ominaisuuksiltaan</target>
<source>Resolving symbolic link %x</source>
<target>Tulkitaan pikakuvike %x</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>Päivitä oikeudet oikealla</target>
+<source>Cannot read file %x.</source>
+<target>Tiedoston %x lukeminen ei onnistu.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Tietovuon suuruus yllätti.
+Oletettu: %x tavua
+Todellinen: %y tavua
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Ei voi tallentaa %x:n oikeuksia.</target>
+
+<source>Operation not supported for different base folder types.</source>
+<target>Toiminto ei tue eri lähde hakemistoja.</target>
+
+<source>Cannot write file %x.</source>
+<target>Tiedoston %x kirjoittaminen ei onnistu.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Pikakuvike %x - %y kopiointi epäonnistui.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Tiedostoa %x ei voida siirtää kohtaan %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Hakemistoa %x ei voi luetella.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Tiedoston %x määritteitä ei voitu lukea.</target>
+
+<source>Cannot find %x.</source>
+<target>%x ei löydy.</target>
+
+<source>Cannot open file %x.</source>
+<target>Tiedosto %x ei aukea.</target>
+
+<source>Cannot find device %x.</source>
+<target>Laite %x ei löydy.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>%x:n vaapaan tilan määrittely ei onnistu.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Hakemistoa %x ei voitu luoda.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Hakemistoa %x ei voida poistaa.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Ei voi poistaa tiedostoa %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Tiedoston %x aikaleimaa ei voida kirjoittaa.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>%x:n lopullista polkua ei voida määrittää.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Pikakuvike %x on virheellinen.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>%x:n siirto Roskakoriin epäonnistui.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Hakemistoa %x ei voi avata.</target>
+
+<source>Incorrect command line:</source>
+<target>Virheellinen komento:</target>
+
+<source>Error Code %x:</source>
+<target>Virhekoodi %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>SFTP palvelimeen %x ei saada yhteyttä.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +315,14 @@
<source>Database file is corrupt:</source>
<target>Tietokanta on viottunut:</target>
-<source>Cannot write file %x.</source>
-<target>Tiedoston %x kirjoittaminen ei onnistu.</target>
-
-<source>Cannot read file %x.</source>
-<target>Tiedoston %x lukeminen ei onnistu.</target>
-
<source>Database files do not share a common session.</source>
<target>Tietokannan tiedostot ovat eri istunnoista.</target>
<source>Searching for folder %x...</source>
<target>Etsitään hakemistoa %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Tiedoston %x määritteitä ei voitu lukea.</target>
+<source>Time out while searching for folder %x.</source>
+<target>Aikaviive hakiessa hakemistoa %x.</target>
<source>Cannot get process information.</source>
<target>Prosessin tietoja ei saada.</target>
@@ -337,6 +411,15 @@
<source>Unable to create time stamp for versioning:</source>
<target>Versionhallinnan aikaleimaa ei voida luoda:</target>
+<source>Drag && drop</source>
+<target>Vedä ja pudota</target>
+
+<source>Cannot find folder %x.</source>
+<target>Hakemistoa %x ei löydy.</target>
+
+<source>Select a folder</source>
+<target>Valitse hakemisto</target>
+
<source>&Open...</source>
<target>&Avaa...</target>
@@ -365,7 +448,7 @@
<target>1. Valitse seurattavat hakemistot.</target>
<source>2. Enter a command line.</source>
-<target>2. Anna komentokehote</target>
+<target>2. Anna komentokehote.</target>
<source>3. Press 'Start'.</source>
<target>3. Paina 'Käynnistä'.</target>
@@ -385,9 +468,6 @@
<source>Browse</source>
<target>Selaa</target>
-<source>Select a folder</source>
-<target>Valitse hakemisto</target>
-
<source>Idle time (in seconds):</source>
<target>Joutoaika (s):</target>
@@ -395,7 +475,7 @@
<target>Joutoaika edellisen havaitun muutoksen ja käskyn suorittamisen välillä</target>
<source>Command line:</source>
-<target>Komentokehoite</target>
+<target>Komentokehoite:</target>
<source>
The command is triggered if:
@@ -441,9 +521,6 @@ Käsky suoritetaan jos:
<source>&Quit</source>
<target>&Lopeta</target>
-<source>Incorrect command line:</source>
-<target>Virheellinen komento:</target>
-
<source>&Retry</source>
<target>&Uudestaan</target>
@@ -496,20 +573,20 @@ Käsky suoritetaan jos:
<target>Tarkistetaan tiedostoa %x</target>
<source>Updating attributes of %x</source>
-<target>Päivitetään %x:n attribuutit</target>
+<target>Päivitetään %x:n ominaisuuksia</target>
+
+<source>%x and %y have different content.</source>
+<target>Eri sisältö %x:llä ja %y:llä.</target>
+
+<source>Data verification error:</source>
+<target>Tiedon tarkistusvirhe:</target>
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Luodaan %x:lle Volume Shadow Copy ...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Tiedon tarkistusvirhe: %x:n ja %y:n sisältö ovat erilaiset.</target>
-
<source>Target folder %x already existing.</source>
<target>Kohdehakemisto %x on jo olemassa.</target>
-<source>Cannot find folder %x.</source>
-<target>Hakemistoa %x ei löydy.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Kohde hakemiston kenttä on annettava.</target>
@@ -522,8 +599,8 @@ Käsky suoritetaan jos:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Näissä kohteissa on selvittämättömiä ristiriitoja, niitä ei täsmäytetä:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Hakemistoissa on oleellisia eroja. Varmista, että olet valinnut hakemistot oikein.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Hakemistoissa on oleellisia eroja. Varmista, että olet valinnut oikeat hakemistot täsmäytykseen.</target>
<source>Not enough free disk space available in:</source>
<target>Vapaa levytila ei riitä:</target>
@@ -549,12 +626,18 @@ Käsky suoritetaan jos:
<source>Synchronization stopped</source>
<target>Täsmäytys on pysäytetty</target>
+<source>Stopped</source>
+<target>Keskeytys</target>
+
<source>Synchronization completed with errors</source>
<target>Täsmäys päättyi virheisiin</target>
<source>Synchronization completed with warnings</source>
<target>Täsmäys päättyi varoituksin</target>
+<source>Warning</source>
+<target>Varoitus</target>
+
<source>Nothing to synchronize</source>
<target>Ei mitään täsmäytettävää</target>
@@ -562,10 +645,7 @@ Käsky suoritetaan jos:
<target>Täsmäys päättyi onnistuneesti</target>
<source>Cleaning up old log files...</source>
-<target>Siivotaan vanhat lokitiedostot..</target>
-
-<source>Stopped</source>
-<target>Keskeytys</target>
+<target>Siivotaan vanhat lokitiedostot...</target>
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Voit siirtyä FreeFileSyncin pääikkunaan korjataksesi tämä virhe.</target>
@@ -657,9 +737,6 @@ Käsky suoritetaan jos:
<source>Action</source>
<target>Toiminto</target>
-<source>Drag && drop</source>
-<target>Vedä ja pudota</target>
-
<source>Local comparison settings</source>
<target>Vertaillun paikalliset asetukset</target>
@@ -690,6 +767,9 @@ Käsky suoritetaan jos:
<source>Local Synchronization Settings</source>
<target>Täsmäytyksen paikalliset asetukset</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Valittu kansio %x ei ole yhteensopiva FreeFileSync:n kanssa. Valitse paikallinenhakemisto, verkko tai mobiili laitteen hakemisto.</target>
+
<source>&New</source>
<target>&Uusi</target>
@@ -759,6 +839,9 @@ Käsky suoritetaan jos:
<source>Remove folder pair</source>
<target>Poista hakemistopari</target>
+<source>Select SFTP folder</source>
+<target>Valitse SFTP hakemisto</target>
+
<source>Swap sides</source>
<target>Puoltenvaihto</target>
@@ -816,8 +899,8 @@ Käsky suoritetaan jos:
<source>Identify equal files by comparing the file content.</source>
<target>Tunnista identtiset tiedostot sisältöä vertailemalla.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Sivuta aikasiirtymä (tuntia)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Älä huomioi aikaeroa (tunteja)</target>
<source>Consider file times with specified offset as equal</source>
<target>Oleta tiedostoja tietyllä aikasiirtymällä olevan vastaavia</target>
@@ -825,14 +908,14 @@ Käsky suoritetaan jos:
<source>Handle daylight saving time</source>
<target>Käsittele kesäaika</target>
-<source>Include symbolic links:</source>
-<target>Sisällytä pikalinkit:</target>
+<source>Include &symbolic links:</source>
+<target>Sisällytä &pikalinkit:</target>
-<source>Direct</source>
-<target>Suoraan</target>
+<source>&Follow</source>
+<target>&Seuraa</target>
-<source>Follow</source>
-<target>Seuraa</target>
+<source>&Direct</source>
+<target>S&uoraan</target>
<source>More information</source>
<target>Lisää tietoa</target>
@@ -871,14 +954,14 @@ Käsky suoritetaan jos:
<target>Tunnista siirretyt tiedostot</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Tunnistus alkaa ensimmäisestä täsmäyksestä
+- Ei tueta kaikissa tiedostojärjestelmissä
- Vaatii ja luo tarvittavat tietokannat
-- Ei toimi kaikissa tiedostojärjestelmissä
+- Tunnistus alkaa ensimmäisestä täsmäyksestä
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -926,6 +1009,27 @@ Käsky suoritetaan jos:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Anna SFTP kirjautumis tietosi:</target>
+
+<source>Server name or IP address:</source>
+<target>Palvelimen nimi ja IP:</target>
+
+<source>Examples:</source>
+<target>Malli:</target>
+
+<source>User name:</source>
+<target>Käyttäjä:</target>
+
+<source>Password:</source>
+<target>Salasana:</target>
+
+<source>&Show password</source>
+<target>&Näytä salasana</target>
+
+<source>Directory on server:</source>
+<target>Palvelimen hakemisto:</target>
+
<source>Start synchronization now?</source>
<target>Käynnistetäänkö täsmäytys?</target>
@@ -935,6 +1039,9 @@ Käsky suoritetaan jos:
<source>&Don't show this dialog again</source>
<target>&Älä näytä tätä ruutua uudestaan</target>
+<source>Arrange folder pair</source>
+<target>Järjestä hakemistoparit</target>
+
<source>Items found:</source>
<target>Osioita löytyi:</target>
@@ -1008,7 +1115,7 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<target>Kopioi lukitut tiedostot</target>
<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target>Jaettujen tai lukittujen tiedostojen kopiointi käyttäen Volume Shadow Copy Service</target>
+<target>Jaettujen tai lukittujen tiedostojen kopiointi käyttäen Volume Shadow Copy Service.</target>
<source>(requires administrator rights)</source>
<target>(edellyttää pääkäyttäjän oikeuksia)</target>
@@ -1067,6 +1174,9 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Many thanks for localization:</source>
<target>Paljon kiitoksia kääntäjille:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH tidostosiirto protokolla</target>
+
<source>Save as Batch Job</source>
<target>Tallenna eräajona</target>
@@ -1079,9 +1189,12 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Select Time Span</source>
<target>Valitse aikajakso</target>
-<source>&Preferences...</source>
+<source>&Preferences</source>
<target>&Ominaisuudet</target>
+<source>Main Bar</source>
+<target>Pääpalkki</target>
+
<source>Folder Pairs</source>
<target>Hakemistoparit</target>
@@ -1097,9 +1210,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Overview</source>
<target>Yleiskatsaus</target>
-<source>Main Bar</source>
-<target>Pääpalkki</target>
-
<source>Confirm</source>
<target>Vahvista</target>
@@ -1208,8 +1318,8 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Do&n't save</source>
<target>Äl&ä tallenna</target>
-<source>Delete selected configurations</source>
-<target>Poista valitus määrittelyt</target>
+<source>Remove entry from list</source>
+<target>Poista valittu määrittely listalta</target>
<source>Synchronization Settings</source>
<target>Täsmäyksen asetukset</target>
@@ -1262,8 +1372,8 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Show filtered or temporarily excluded files</source>
<target>Näytä suodatetut tai tilapäisesti pois suljetut tiedostot</target>
-<source>Set as default</source>
-<target>Aseta oletukseksi</target>
+<source>Save as default</source>
+<target>Tallenna oletukseksi</target>
<source>Filter</source>
<target>Suodin</target>
@@ -1274,6 +1384,12 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Cannot find %x</source>
<target>En löydä %x</target>
+<source>Move up</source>
+<target>Siirrä ylös</target>
+
+<source>Move down</source>
+<target>Siirrä alas</target>
+
<source>Comma-separated values</source>
<target>Pilkulla erotetut arvot</target>
@@ -1286,18 +1402,15 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Close progress dialog</source>
<target>Sulje etenämän dialoogi</target>
-<source>Standby</source>
-<target>Lepotila</target>
-
<source>Log off</source>
<target>Kirjaudu ulos</target>
+<source>Standby</source>
+<target>Lepotila</target>
+
<source>Shut down</source>
<target>Sulje</target>
-<source>Hibernate</source>
-<target>Horrostila</target>
-
<source>Scanning...</source>
<target>Tiedostoja haetaan...</target>
@@ -1307,9 +1420,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Varoitus</target>
-
<source>Select all</source>
<target>Valitse kaikki</target>
@@ -1355,8 +1465,8 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Preferences</source>
<target>Ominaisuudet</target>
-<source>Copy NTFS permissions</source>
-<target>Kopioi NTFS-oikeudet</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Monista DACL, SACL, omistaja, ryhmä</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Liitä ulkoinen sovellus kontekstivalikkoon. Seuraavat makrot ovat valittavissa:</target>
@@ -1451,27 +1561,21 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Percentage</source>
<target>Prosenttia</target>
+<source>Unable to register to receive system messages.</source>
+<target>Kirjautuminen järjestelmäviestien vastaanottamiseksi ei onnistu.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>%x laiteviestien kirjaaminen ei onnistu.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Hakemistoa %x ei voida tarkkaila.</target>
-<source>Cannot delete file %x.</source>
-<target>Ei voi poistaa tiedostoa %x.</target>
-
<source>The file is locked by another process:</source>
<target>Tiedosto on toisen prosessin lukitsema:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Tiedostoa %x ei voida siirtää kohtaan %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Hakemistoa %x ei voida poistaa.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Tiedoston %x ominaisuuksia ei voitu tallentaa.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Tiedoston %x aikaleimaa ei voida kirjoittaa.</target>
-
<source>Cannot read security context of %x.</source>
<target>Ei voi lukea %x:n suojauskontekstia.</target>
@@ -1481,33 +1585,21 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Cannot read permissions of %x.</source>
<target>Ei voi lukea %x:n oikeuksia.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Ei voi tallentaa %x:n oikeuksia.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Hakemistoa %x ei voitu luoda.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Pikakuvike %x - %y kopiointi epäonnistui.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Oikeuksien monistus %x:ltä %y:lle ei onnistu.</target>
<source>Cannot find system function %x.</source>
<target>Järjestelmäfunktiota %x ei löydy.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Ominaisuuksien monistus %x:ltä %y:lle ei onnistu.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Tiedostoa %x ei voida kopioida kohtaan %y.</target>
<source>Type of item %x is not supported:</source>
<target>Kohteen %x tyyppiä ei tueta:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Pikakuvike %x on virheellinen.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Hakemistoa %x ei voi avata.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Hakemistoa %x ei voi luetella.</target>
-
<source>%x TB</source>
<target>%x Tt</target>
@@ -1541,9 +1633,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<pluralform>%x päivää</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Kirjautuminen järjestelmäviestien vastaanottamiseksi ei onnistu.</target>
-
<source>Cannot set privilege %x.</source>
<target>Oikeutta %x ei voitu asettaa.</target>
@@ -1553,29 +1642,20 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Cannot change process I/O priorities.</source>
<target>Prosessin I/O-prioriteetin muutos ei onnistu.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>%x:n siirto Roskakoriin epäonnistui.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Roskakorin tarkistus hakemistolle %x epäonnistui.</target>
-<source>Cannot determine final path for %x.</source>
-<target>%x:n lopullista polkua ei voida määrittää.</target>
-
-<source>Error Code %x:</source>
-<target>Virhekoodi %x:</target>
-
-<source>Cannot read the following XML elements:</source>
+<source>The following XML elements could not be read:</source>
<target>Nämä XML elementit ovat lukukelvottimia:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Kokoonpanotiedosto %x ladattu vain osittain.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Kokoonpanotiedosto %x ladattu vain osittain. Puuttuvat asetetaan oletusarvoihin.</target>
<source>Prepare installation</source>
<target>Alusta asennus</target>
<source>Choose which components you want to install.</source>
-<target>Valitse asennettavat osiot</target>
+<target>Valitse asennettavat osiot.</target>
<source>Select installation type:</source>
<target>Valitse asennustapa:</target>
@@ -1593,7 +1673,7 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<target>Tallenna asetukset "%APPDATA%\FreeFileSync"</target>
<source>Register FreeFileSync file extensions</source>
-<target>Rekisterö FreeFileSync tiedostoliitteet</target>
+<target>Rekisterö FreeFileSync tiedostopäätteet</target>
<source>Create Explorer context menu entries</source>
<target>Luo merkinnät Explorer-apuvalikoon</target>
@@ -1620,10 +1700,10 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<target>Käynnistä-valikkoon</target>
<source>Registering FreeFileSync file extensions</source>
-<target>Liitään FreeFileSync tiedostoliitteet</target>
+<target>Liitään FreeFileSync tiedostopäätteet</target>
<source>Unregistering FreeFileSync file extensions</source>
-<target>Poistetaan liitos, FreeFileSync tiedostoliite</target>
+<target>Poistetaan liitos, FreeFileSync tiedostopääte</target>
<source>FreeFileSync Configuration</source>
<target>FreeFileSync määrittelyt</target>
diff --git a/FreeFileSync/Build/Languages/french.lng b/FreeFileSync/Build/Languages/french.lng
index c495428d..2a3aa60a 100644
--- a/FreeFileSync/Build/Languages/french.lng
+++ b/FreeFileSync/Build/Languages/french.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Erreur de syntaxe</target>
-<source>Cannot open file %x.</source>
-<target>Impossible d'ouvrir le fichier %x.</target>
+<source>Cannot find file %x.</source>
+<target>Impossible de trouver le fichier %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Le fichier %x ne contient pas une configuration valide.</target>
@@ -77,25 +77,25 @@
<target>Syntaxe :</target>
<source>global config file:</source>
-<target>fichier de configuration globale</target>
+<target>fichier de configuration globale :</target>
<source>config files:</source>
-<target>fichier de configuration</target>
+<target>fichier de configuration :</target>
<source>directory</source>
<target>répertoire</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
-<target>Chemin d'un fichier GlobalSettings.xml distinct</target>
+<target>Chemin d'un fichier GlobalSettings.xml distinct.</target>
<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
<target>N'importe quel nombre de fichiers FreeFileSync .ffs_gui et/ou .ffs_batch.</target>
<source>Any number of alternative directory pairs for at most one config file.</source>
-<target>N'importe quel nombre de paires de répertoires distincts pour au plus un fichier de configuration</target>
+<target>N'importe quel nombre de paires de répertoires distincts pour au plus un fichier de configuration.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Ouvrir la configuration pour la modifier sans l'exécuter</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Ouvre la configuration pour une mise à jour sans exécution.</target>
<source>Cannot find the following folders:</source>
<target>Impossible de trouver les dossiers suivants :</target>
@@ -110,7 +110,7 @@
<target>Le dossier correspondant sera considéré comme vide.</target>
<source>The following folder paths are dependent from each other:</source>
-<target>Les chemins des dossiers suivants dépendent les uns des autres</target>
+<target>Les chemins des dossiers suivants dépendent les uns des autres :</target>
<source>File %x has an invalid date.</source>
<target>Le fichier %x a une date invalide.</target>
@@ -202,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Le flux de données a une taille inattendue :
+Attendu : %x octets
+Trouvé : %y octets
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Impossible d'écrire les permissions de %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Impossible de copier le lien symbolique %x vers %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Impossible de déplacer le fichier %x vers %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Impossible de parcourir 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 find %x.</source>
+<target>Impossible de trouver %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Impossible d'ouvrir le fichier %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Impossible de trouver le périphérique %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Impossible de calculer l'espace disque libre de %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Impossible de créer le répertoire %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Impossible de supprimer le répertoire %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Impossible de supprimer le fichier %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Impossible d'écrire la date de modification de %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Impossible de déterminer le chemin pour %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Impossible de résoudre le lien symbolique %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Impossible de déplacer %x dans la Corbeille.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Impossible d'ouvrir le répertoire %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Ligne de commande incorrecte :</target>
+
+<source>Error Code %x:</source>
+<target>Code erreur %x :</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Impossible de se connecter au server SFTP %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +315,14 @@
<source>Database file is corrupt:</source>
<target>Le fichier Base de données est endommagé :</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>Database files do not share a common session.</source>
<target>Les fichiers de la base de données ne font pas partie de la même session.</target>
<source>Searching for folder %x...</source>
<target>Recherche du dossier %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Impossible de lire les attributs du fichier %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target>Timeout lors de la recherche du dossier %x.</target>
<source>Cannot get process information.</source>
<target>Impossible d'obtenir les informations du traitement.</target>
@@ -290,7 +364,7 @@
<target>Erreur lors de l'analyse du fichier %x, ligne %y, colonne %z.</target>
<source>Cannot set directory lock for %x.</source>
-<target>Impossible de verrouiller le dossier %x</target>
+<target>Impossible de verrouiller le dossier %x.</target>
<source>Scanning:</source>
<target>Lecture en cours :</target>
@@ -335,7 +409,16 @@
<target>Arrêt demandé : En attente de la fin de l'opération en cours...</target>
<source>Unable to create time stamp for versioning:</source>
-<target>Impossible de générer l'horodatage pour la gestion des versions.</target>
+<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>
<source>&Open...</source>
<target>&Ouvrir...</target>
@@ -385,9 +468,6 @@
<source>Browse</source>
<target>Parcourir</target>
-<source>Select a folder</source>
-<target>Choisissez un dossier</target>
-
<source>Idle time (in seconds):</source>
<target>Durée d'inactivité (en secondes) :</target>
@@ -441,9 +521,6 @@ La commande est déclenchée si :
<source>&Quit</source>
<target>&Quitter</target>
-<source>Incorrect command line:</source>
-<target>Ligne de commande incorrecte :</target>
-
<source>&Retry</source>
<target>&Réessayer</target>
@@ -498,18 +575,18 @@ La commande est déclenchée si :
<source>Updating attributes of %x</source>
<target>Mise à jour des attributs 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>Creating a Volume Shadow Copy for %x...</source>
<target>Création d'un Volume Shadow Copy pour %x ...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Erreur lors de la vérification des données : %x et %y ont des contenus différents.</target>
-
<source>Target folder %x already existing.</source>
<target>Le dossier destination %x existe déjà.</target>
-<source>Cannot find folder %x.</source>
-<target>Dossier %x introuvable.</target>
-
<source>Target folder input field must not be empty.</source>
<target>L'entrée dossier de destination ne doit pas être vide.</target>
@@ -522,8 +599,8 @@ La commande est déclenchée si :
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Les éléments suivants sont en conflit non résolu et ne seront pas synchronisés :</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Les dossiers suivants sont significativement différents. Assurez-vous que les dossiers correspondent avant de lancer la synchronisation.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Les dossiers suivants sont très différentes. Assurez-vous que vous avez sélectionné les bons dossiers pour la synchronisation.</target>
<source>Not enough free disk space available in:</source>
<target>Espace disque insuffisant sur :</target>
@@ -538,7 +615,7 @@ La commande est déclenchée si :
<target>Plusieurs dossiers multiples écrivent dans un sous-dossier commun. Veuillez vérifier votre configuration.</target>
<source>Synchronizing folder pair:</source>
-<target>Synchronisation de la paire de dossiers</target>
+<target>Synchronisation de la paire de dossiers :</target>
<source>Generating database...</source>
<target>Génération de la base de données...</target>
@@ -549,12 +626,18 @@ La commande est déclenchée si :
<source>Synchronization stopped</source>
<target>Synchronisation arrêtée</target>
+<source>Stopped</source>
+<target>Arrêté</target>
+
<source>Synchronization completed with errors</source>
<target>Synchronisation terminée avec des erreurs</target>
<source>Synchronization completed with warnings</source>
<target>Synchronisation terminée avec avertissements</target>
+<source>Warning</source>
+<target>Attention</target>
+
<source>Nothing to synchronize</source>
<target>Rien à synchroniser</target>
@@ -564,9 +647,6 @@ La commande est déclenchée si :
<source>Cleaning up old log files...</source>
<target>Nettoyage des anciens fichiers log ...</target>
-<source>Stopped</source>
-<target>Arrêté</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Vous pouvez basculer vers la fenêtre principale de FreeFileSync pour résoudre ce problème.</target>
@@ -604,7 +684,7 @@ La commande est déclenchée si :
<target>Recherche des Mises à Jour</target>
<source>A new version of FreeFileSync is available:</source>
-<target>Une nouvelle version de FreeFileSync est disponible</target>
+<target>Une nouvelle version de FreeFileSync est disponible :</target>
<source>Download now?</source>
<target>Télécharger maintenant ?</target>
@@ -616,7 +696,7 @@ La commande est déclenchée si :
<target>FreeFileSync est à jour.</target>
<source>Unable to connect to www.freefilesync.org.</source>
-<target>Impossible de se connecter à www.freefilesync.org</target>
+<target>Impossible de se connecter à www.freefilesync.org.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Impossible de trouver en ligne une nouvelle version de FreeFileSync.Voulez-vous le faire manuellement ?</target>
@@ -657,9 +737,6 @@ La commande est déclenchée si :
<source>Action</source>
<target>Action</target>
-<source>Drag && drop</source>
-<target>Glisser && Déposer</target>
-
<source>Local comparison settings</source>
<target>Paramètres de comparaison locaux</target>
@@ -690,6 +767,9 @@ La commande est déclenchée si :
<source>Local Synchronization Settings</source>
<target>Paramètres de synchronisation locaux</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Le dossier sélectionné %x ne peut pas être utilisé avec FreeFileSync. Veuillez choisir un dossier sur un système de fichier local, sur le réseau ou sur un périphérique MTP.</target>
+
<source>&New</source>
<target>&Nouveau</target>
@@ -759,6 +839,9 @@ La commande est déclenchée si :
<source>Remove folder pair</source>
<target>Supprimer le couple de dossiers</target>
+<source>Select SFTP folder</source>
+<target>Sélectionner un dossier SFTP</target>
+
<source>Swap sides</source>
<target>Permuter les côtés</target>
@@ -805,7 +888,7 @@ La commande est déclenchée si :
<target>Nombre total d'octets à copier</target>
<source>Use local settings:</source>
-<target>Utiliser les paramètres locaux</target>
+<target>Utiliser les paramètres locaux :</target>
<source>Select a variant:</source>
<target>Choisir une variante :</target>
@@ -816,8 +899,8 @@ La commande est déclenchée si :
<source>Identify equal files by comparing the file content.</source>
<target>Reconnaître les fichiers identiques à l'aide de leur contenu.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignorer les décalages temporels (en heures)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignorer le décalage horaire (en heures)</target>
<source>Consider file times with specified offset as equal</source>
<target>Considérer comme identiques les dates de fichiers avec un décalage spécifié</target>
@@ -825,20 +908,20 @@ La commande est déclenchée si :
<source>Handle daylight saving time</source>
<target>Gérer l'heure d'été</target>
-<source>Include symbolic links:</source>
-<target>Inclure les liens symboliques :</target>
+<source>Include &symbolic links:</source>
+<target>Inclure les liens &symboliques :</target>
-<source>Direct</source>
-<target>Direct</target>
+<source>&Follow</source>
+<target>&Poursuivre</target>
-<source>Follow</source>
-<target>Suivre</target>
+<source>&Direct</source>
+<target>&Direct</target>
<source>More information</source>
<target>Plus d'informations</target>
<source>Local settings:</source>
-<target>Paramètres locaux</target>
+<target>Paramètres locaux :</target>
<source>Include:</source>
<target>Inclure :</target>
@@ -871,14 +954,14 @@ La commande est déclenchée si :
<target>Détection des fichiers déplacés</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Détection active après la synchronisation initiale
-- Nécessite et crée les fichiers de la base de données
-- Non supporté par tous les systèmes de fichiers
+- Non pris en charge par tous les systèmes de fichiers
+- Nécessite et crée la base de données
+- Détection impossible lors de la première synchronisation
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -926,6 +1009,27 @@ La commande est déclenchée si :
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Entrer vos identifiants SFTP :</target>
+
+<source>Server name or IP address:</source>
+<target>Nom du serveur ou adresse IP :</target>
+
+<source>Examples:</source>
+<target>Exemples :</target>
+
+<source>User name:</source>
+<target>Nom de l'utilisateur :</target>
+
+<source>Password:</source>
+<target>Mot de passe :</target>
+
+<source>&Show password</source>
+<target>&Affiche le mot de passe</target>
+
+<source>Directory on server:</source>
+<target>Répertoire sur le serveur :</target>
+
<source>Start synchronization now?</source>
<target>Démarrer la synchronisation maintenant ?</target>
@@ -935,6 +1039,9 @@ La commande est déclenchée si :
<source>&Don't show this dialog again</source>
<target>&Ne plus afficher cette boîte de dialogue</target>
+<source>Arrange folder pair</source>
+<target>Coordonne la paire de dossiers</target>
+
<source>Items found:</source>
<target>Élements trouvés :</target>
@@ -1067,6 +1174,9 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Many thanks for localization:</source>
<target>Un grand merci pour la traduction à :</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH File Transfer Protocol</target>
+
<source>Save as Batch Job</source>
<target>Sauvegarder comme Job Batch</target>
@@ -1079,8 +1189,11 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Select Time Span</source>
<target>Sélection de l'Intervalle de Temps</target>
-<source>&Preferences...</source>
-<target>&Préférences...</target>
+<source>&Preferences</source>
+<target>&Préférences</target>
+
+<source>Main Bar</source>
+<target>Barre Principale</target>
<source>Folder Pairs</source>
<target>Paires de Dossiers</target>
@@ -1097,9 +1210,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Overview</source>
<target>Aperçu</target>
-<source>Main Bar</source>
-<target>Barre Principale</target>
-
<source>Confirm</source>
<target>Confirmer</target>
@@ -1208,8 +1318,8 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Do&n't save</source>
<target>&Ne pas Sauvegarder</target>
-<source>Delete selected configurations</source>
-<target>Supprimer les configurations sélectionnées</target>
+<source>Remove entry from list</source>
+<target>Enlever un élément de la liste</target>
<source>Synchronization Settings</source>
<target>Configuration de la Synchronisation</target>
@@ -1262,8 +1372,8 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Show filtered or temporarily excluded files</source>
<target>Afficher les fichiers filtrés ou temporairement exclus</target>
-<source>Set as default</source>
-<target>Définir par défaut</target>
+<source>Save as default</source>
+<target>Sauvegarde par défaut</target>
<source>Filter</source>
<target>Filtre</target>
@@ -1274,6 +1384,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Cannot find %x</source>
<target>Impossible de trouver %x</target>
+<source>Move up</source>
+<target>Monter</target>
+
+<source>Move down</source>
+<target>Descendre</target>
+
<source>Comma-separated values</source>
<target>Valeurs séparées par une virgule</target>
@@ -1286,18 +1402,15 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Close progress dialog</source>
<target>Fermer la fenêtre de progression</target>
-<source>Standby</source>
-<target>Pause</target>
-
<source>Log off</source>
<target>Quitter</target>
+<source>Standby</source>
+<target>Pause</target>
+
<source>Shut down</source>
<target>Arrêter</target>
-<source>Hibernate</source>
-<target>Figer</target>
-
<source>Scanning...</source>
<target>Lecture en cours...</target>
@@ -1307,9 +1420,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Attention</target>
-
<source>Select all</source>
<target>Tout sélectionner</target>
@@ -1355,8 +1465,8 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Preferences</source>
<target>Préférences</target>
-<source>Copy NTFS permissions</source>
-<target>Copie des droits NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Cpoie les éléments de sécurité DACL, SACL, propriétaire et groupe</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Inclure les applications externes dans le menu contextuel. Les macros suivantes sont disponibles :</target>
@@ -1451,27 +1561,21 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Percentage</source>
<target>Pourcentage</target>
+<source>Unable to register to receive system messages.</source>
+<target>Impossible d'enregistrer la réception des messages système.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Impossible d'enregistrer les notifications de périphérique pour %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Impossible de gérer le répertoire %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Impossible de supprimer le fichier %x.</target>
-
<source>The file is locked by another process:</source>
<target>Le fichier est verrouillé par un autre process :</target>
-<source>Cannot move file %x to %y.</source>
-<target>Impossible de déplacer le fichier %x vers %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Impossible de supprimer le répertoire %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Impossible d'écrire les attributs de fichier de %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Impossible d'écrire la date de modification de %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Impossible de lire les paramètres de sécurité de %x.</target>
@@ -1481,33 +1585,21 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Cannot read permissions of %x.</source>
<target>Impossible de lire les permissions de %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Impossible d'écrire les permissions de %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Impossible de créer le répertoire %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Impossible de copier le lien symbolique %x vers %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Impossible de copier les permissions de %x à %y.</target>
<source>Cannot find system function %x.</source>
<target>Impossible de trouver la fonction système %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Impossible de copier les attributs de %x à %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Impossible de copier le fichier %x vers %y.</target>
<source>Type of item %x is not supported:</source>
<target>Le type de l'élément %x n'est pas accepté :</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Impossible de résoudre le lien symbolique %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Impossible d'ouvrir le répertoire %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Impossible de parcourir le répertoire %x.</target>
-
<source>%x TB</source>
<target>%x To</target>
@@ -1541,9 +1633,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<pluralform>%x jours</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Impossible d'enregistrer la réception des messages système.</target>
-
<source>Cannot set privilege %x.</source>
<target>Impossible de fixer le privilège %x.</target>
@@ -1551,25 +1640,16 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<target>Impossible de suspendre le mode veille du système.</target>
<source>Cannot change process I/O priorities.</source>
-<target>Impossible de modifier les priorités E/S des tâches</target>
-
-<source>Unable to move %x to the recycle bin.</source>
-<target>Impossible de déplacer %x dans la Corbeille.</target>
+<target>Impossible de modifier les priorités E/S des tâches.</target>
<source>Checking recycle bin failed for folder %x.</source>
<target>Echec de la vérification de la corbeille pour le dossier %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Impossible de déterminer le chemin pour %x.</target>
-
-<source>Error Code %x:</source>
-<target>Code erreur %x :</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Impossible de lire les données XML suivantes :</target>
+<source>The following XML elements could not be read:</source>
+<target>Les éléments XML suivants ne peuvent être lus :</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Le fichier de configuration %x a été chargé seulement partiellement.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Le fichier de configuration %x est incomplet. Les éléments manquants sont fixés à leur valeur par défaut.</target>
<source>Prepare installation</source>
<target>Préparation de l'installation</target>
diff --git a/FreeFileSync/Build/Languages/german.lng b/FreeFileSync/Build/Languages/german.lng
index c0b55797..a0b4ecaa 100644
--- a/FreeFileSync/Build/Languages/german.lng
+++ b/FreeFileSync/Build/Languages/german.lng
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Beliebige Anzahl von alternativen Verzeichnispaaren für maximal eine Konfigurationsdatei.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Konfiguration zum Editieren öffnen ohne auszuführen.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Konfiguration zum Editieren öffnen ohne sie auszuführen.</target>
<source>Cannot find the following folders:</source>
<target>Die folgenden Ordner wurden nicht gefunden:</target>
@@ -273,6 +273,15 @@ Tatsächlich: %y bytes
<source>Cannot open directory %x.</source>
<target>Das Verzeichnis %x kann nicht geöffnet werden.</target>
+<source>Incorrect command line:</source>
+<target>Ungültige Befehlszeile:</target>
+
+<source>Error Code %x:</source>
+<target>Fehlercode %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Die Verbindung zum SFTP-Server %x ist fehlgeschlagen.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -405,6 +414,9 @@ Tatsächlich: %y bytes
<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>
@@ -509,9 +521,6 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>&Quit</source>
<target>&Beenden</target>
-<source>Incorrect command line:</source>
-<target>Ungültige Befehlszeile:</target>
-
<source>&Retry</source>
<target>&Wiederholen</target>
@@ -578,9 +587,6 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Target folder %x already existing.</source>
<target>Der Zielordner %x existiert bereits.</target>
-<source>Cannot find folder %x.</source>
-<target>Der Ordner %x wurde nicht gefunden.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Das Eingabefeld für den Zielordner darf nicht leer sein.</target>
@@ -593,7 +599,7 @@ Die Befehlszeile wird ausgelöst, wenn:
<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. Make sure you are matching the correct folders for synchronization.</source>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
<target>Die folgenden Ordner unterscheiden sich erheblich. Stellen Sie sicher, dass die richtigen Ordner für die Synchronisation ausgewählt sind.</target>
<source>Not enough free disk space available in:</source>
@@ -620,12 +626,18 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Synchronization stopped</source>
<target>Synchronisation unterbrochen</target>
+<source>Stopped</source>
+<target>Unterbrochen</target>
+
<source>Synchronization completed with errors</source>
<target>Synchronisation mit Fehlern abgeschlossen</target>
<source>Synchronization completed with warnings</source>
<target>Synchronisation mit Warnungen abgeschlossen</target>
+<source>Warning</source>
+<target>Warnung</target>
+
<source>Nothing to synchronize</source>
<target>Es gibt nichts zu synchronisieren</target>
@@ -635,12 +647,6 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Cleaning up old log files...</source>
<target>Bereinige alte Protokolldateien...</target>
-<source>Stopped</source>
-<target>Unterbrochen</target>
-
-<source>Warning</source>
-<target>Warnung</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Sie können auf FreeFileSyncs Hauptfenster wechseln, um das Problem zu beheben.</target>
@@ -833,6 +839,9 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Remove folder pair</source>
<target>Ordnerpaar entfernen</target>
+<source>Select SFTP folder</source>
+<target>SFTP-Ordner auswählen</target>
+
<source>Swap sides</source>
<target>Seiten vertauschen</target>
@@ -890,8 +899,8 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Identify equal files by comparing the file content.</source>
<target>Erkenne gleiche Dateien durch Vergleich des Dateiinhaltes.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Zeitversatz ignorieren (in Stunden)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Zeitversatz ignorieren (in Stunden)</target>
<source>Consider file times with specified offset as equal</source>
<target>Dateizeiten mit angegebenem Versatz als gleich ansehen</target>
@@ -899,14 +908,14 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Handle daylight saving time</source>
<target>Sommerzeit berücksichtigen</target>
-<source>Include symbolic links:</source>
-<target>Symbolische Verknüpfungen einschließen:</target>
+<source>Include &symbolic links:</source>
+<target>Symbolische &Verknüpfungen einschließen:</target>
-<source>Follow</source>
-<target>Folgen</target>
+<source>&Follow</source>
+<target>&Folgen</target>
-<source>Direct</source>
-<target>Direkt</target>
+<source>&Direct</source>
+<target>&Direkt</target>
<source>More information</source>
<target>Mehr Information</target>
@@ -945,14 +954,14 @@ Die Befehlszeile wird ausgelöst, wenn:
<target>Verschobene Dateien erkennen</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Erkennung nach erstmaliger Synchronisation aktiv.
-- Benötigt und erstellt Datenbankdateien.
- Wird nicht von allen Dateisystemen unterstützt.
+- Benötigt und erstellt Datenbankdateien.
+- Erkennung bei erster Synchronisation nicht verfügbar.
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -1000,6 +1009,27 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>SFTP Anmeldedaten eingeben:</target>
+
+<source>Server name or IP address:</source>
+<target>Servername oder IP-Adresse:</target>
+
+<source>Examples:</source>
+<target>Beispiele:</target>
+
+<source>User name:</source>
+<target>Benutzername:</target>
+
+<source>Password:</source>
+<target>Passwort:</target>
+
+<source>&Show password</source>
+<target>&Passwort zeigen</target>
+
+<source>Directory on server:</source>
+<target>Verzeichnis auf Server:</target>
+
<source>Start synchronization now?</source>
<target>Synchronisation jetzt starten?</target>
@@ -1144,6 +1174,9 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Many thanks for localization:</source>
<target>Vielen Dank für die Lokalisation:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH File Transfer Protocol</target>
+
<source>Save as Batch Job</source>
<target>Als Batchauftrag speichern</target>
@@ -1285,8 +1318,8 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Do&n't save</source>
<target>&Nicht speichern</target>
-<source>Delete selected configurations</source>
-<target>Ausgewählte Konfigurationen löschen</target>
+<source>Remove entry from list</source>
+<target>Eintrag aus Liste entfernen</target>
<source>Synchronization Settings</source>
<target>Synchronisationseinstellungen</target>
@@ -1339,8 +1372,8 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Show filtered or temporarily excluded files</source>
<target>Gefilterte oder temporär ausgeschlossene Dateien zeigen</target>
-<source>Set as default</source>
-<target>Als Standard festlegen</target>
+<source>Save as default</source>
+<target>Als Standard speichern</target>
<source>Filter</source>
<target>Filter</target>
@@ -1432,8 +1465,8 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Preferences</source>
<target>Einstellungen</target>
-<source>Copy NTFS permissions</source>
-<target>NTFS Berechtigungen kopieren</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>DACL, SACL, Besitzer und Gruppe kopieren</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integriert externe Anwendungen in das Kontextmenü. Die folgenden Makros stehen zur Verfügung:</target>
@@ -1612,14 +1645,11 @@ Dadurch wird ein konsistenter Datenstand auch im schweren Fehlerfall garantiert.
<source>Checking recycle bin failed for folder %x.</source>
<target>Die Prüfung des Papierkorbs für Ordner %x ist fehlgeschlagen.</target>
-<source>Error Code %x:</source>
-<target>Fehlercode %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Die folgenden XML-Elemente können nicht gelesen werden:</target>
+<source>The following XML elements could not be read:</source>
+<target>Die folgenden XML-Elemente konnten nicht gelesen werden:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Die Konfigurationsdatei %x wurde nur teilweise geladen.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Die Konfigurationsdatei %x ist unvollständig. Die fehlenden Elemente werden auf ihre Standardwerte gesetzt.</target>
<source>Prepare installation</source>
<target>Installation vorbereiten</target>
diff --git a/FreeFileSync/Build/Languages/greek.lng b/FreeFileSync/Build/Languages/greek.lng
index 9dfb724b..55679030 100644
--- a/FreeFileSync/Build/Languages/greek.lng
+++ b/FreeFileSync/Build/Languages/greek.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Σφάλμα σύνταξης</target>
-<source>Cannot open file %x.</source>
-<target>Δεν είναι δυνατό το άνοιγμα του αρχείου %x.</target>
+<source>Cannot find file %x.</source>
+<target>Το αρχείο %x δεν μπορεί να βρεθεί.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Το αρχείο %x δεν περιέχει μια έγκυρη διάταξη.</target>
@@ -86,16 +86,16 @@
<target>υποκατάλογος</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
-<target>Διαδρομή σε ένα εναλλακτικό αρχείο GlobalSettings.xml</target>
+<target>Διαδρομή σε ένα εναλλακτικό αρχείο GlobalSettings.xml.</target>
<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
-<target>Οποιοσδήποτε αριθμός αρχείων διάταξης .ffs_gui ή/και .ffs_batch του FreeFileSync</target>
+<target>Οποιοσδήποτε αριθμός αρχείων διάταξης .ffs_gui ή/και .ffs_batch του FreeFileSync.</target>
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Οποιοσδήποτε αριθμός από εναλλακτικά ζεύγη υποκαταλόγων για το πολύ ένα αρχείο ρυθμίσεων.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Άνοιγμα των ρυθμίσεων προς επεξεργασία χωρίς εκτέλεση.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Άνοιγμα της διάταξης για διόρθωση χωρίς να εκτελεστεί.</target>
<source>Cannot find the following folders:</source>
<target>Οι ακόλουθοι υποκατάλογοι δεν ήταν δυνατό να βρεθούν:</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>Ενημέρωση των στοιχείων στα δεξιά</target>
+<source>Cannot read file %x.</source>
+<target>Δεν μπορεί να γίνει ανάγνωση του αρχείου %x.</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 write file %x.</source>
+<target>Δεν μπορεί να γίνει εγγραφή του αρχείου %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Αδυναμία αντιγραφής του συμβολικού δεσμού %x στο %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Δεν μπορεί το αρχείο %x να μεταφερθεί στο %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Δεν είναι δυνατή η καταλογογράφηση του υποκαταλόγου %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Δεν μπορεί να γίνει ανάγνωση των χαρακτηριστικών του αρχείου %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Το %x δεν μπορεί να βρεθεί.</target>
+
+<source>Cannot open file %x.</source>
+<target>Δεν είναι δυνατό το άνοιγμα του αρχείου %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Η συσχευή %x δεν μπορεί να βρεθεί.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Δεν μπορεί να υπολογιστεί ο ελεύθερος χώρος του δίσκου %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Δεν μπορεί να δημιουργηθεί ο υποκατάλογος %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Δεν μπορεί να διαγραφεί ο υποκατάλογος %x.</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Εσφαλμένη γραμμή εντολών:</target>
+
+<source>Error Code %x:</source>
+<target>Κωδικός Σφάλματος %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Αποτυχία σύνδεσης με τον διακομιστή SFTP %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -224,7 +304,7 @@
<target>Το αρχείο %x δεν ήταν δυνατόν να φορτωθεί.</target>
<source>Database file %x is incompatible.</source>
-<target>Το αρχείο βάσης δεδομένων %x δεν είναι συμβατό</target>
+<target>Το αρχείο βάσης δεδομένων %x δεν είναι συμβατό.</target>
<source>Initial synchronization:</source>
<target>Αρχικός συγχρονισμός:</target>
@@ -235,20 +315,14 @@
<source>Database file is corrupt:</source>
<target>Το αρχείο βάσης δεδομένων είναι αλλοιωμένο:</target>
-<source>Cannot write file %x.</source>
-<target>Δεν μπορεί να γίνει εγγραφή του αρχείου %x.</target>
-
-<source>Cannot read file %x.</source>
-<target>Δεν μπορεί να γίνει ανάγνωση του αρχείου %x.</target>
-
<source>Database files do not share a common session.</source>
<target>Τα αρχεία βάσης δεδομένων δεν έχουν χρησιμοποιηθεί από κοινού σε συγχρονισμό.</target>
<source>Searching for folder %x...</source>
<target>Αναζήτηση του υποκαταλόγου %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Δεν μπορεί να γίνει ανάγνωση των χαρακτηριστικών του αρχείου %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target>Λήξη χρονικού ορίου αναζήτησης του υποκαταλόγου %x.</target>
<source>Cannot get process information.</source>
<target>Δεν μπορούν να ληφθούν πληροφορίες για τις τρέχουσες διαδικασίες.</target>
@@ -337,6 +411,15 @@
<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>
+
<source>&Open...</source>
<target>Ά&νοιγμα...</target>
@@ -385,9 +468,6 @@
<source>Browse</source>
<target>Αναζήτηση</target>
-<source>Select a folder</source>
-<target>Επιλογή υποκαταλόγου</target>
-
<source>Idle time (in seconds):</source>
<target>Λανθάνων χρόνος (σε δευτερόλεπτα):</target>
@@ -395,7 +475,7 @@
<target>Λανθάνων χρόνος μεταξύ τελευταίας αλλαγής που ανιχνεύθηκε και εκτέλεσης της εντολής</target>
<source>Command line:</source>
-<target>Γραμμή εντολών</target>
+<target>Γραμμή εντολών:</target>
<source>
The command is triggered if:
@@ -441,9 +521,6 @@ The command is triggered if:
<source>&Quit</source>
<target>Έ&ξοδος</target>
-<source>Incorrect command line:</source>
-<target>Εσφαλμένη γραμμή εντολών:</target>
-
<source>&Retry</source>
<target>&Επανάληψη</target>
@@ -498,18 +575,18 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>Δημιουργία Σκιώδους Αντίγραφου Τόμου για το %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Σφάλμα επαλήθευσης δεδομένων: το %x και το %y έχουν διαφορετικό περιεχόμενο.</target>
-
<source>Target folder %x already existing.</source>
<target>Ο υποκατάλογος-στόχος %x υπάρχει ήδη.</target>
-<source>Cannot find folder %x.</source>
-<target>Ο υποκατάλογος %x δεν μπορεί να βρεθεί.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Το πεδίο εισαγωγής του υποκαταλόγου-στόχου πρέπει να μην είναι κενό.</target>
@@ -522,8 +599,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Τα ακόλουθα στοιχεία έχουν ανεπίλυτες διενέξεις και δε θα συγχρονιστούν:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Οι ακόλουθοι υποκατάλογοι είναι σημαντικά διαφορετικοί. Σιγουρευτείτε ότι έχετε επιλέξει τους κατάλληλους υποκαταλόγους για συγχρονισμό.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Οι παρακάτω υποκατάλογοι έχουν σημαντικές διαφορές. Σιγουρευτείτε ότι έχετε επιλέξει να συγχρονίσετε τους σωστούς υποκαταλόγους.</target>
<source>Not enough free disk space available in:</source>
<target>Δεν υπάρχει αρκετός διαθέσιμος χώρος στο δίσκο:</target>
@@ -535,7 +612,7 @@ The command is triggered if:
<target>Διαθέσιμος:</target>
<source>Multiple folder pairs write to a common subfolder. Please review your configuration.</source>
-<target>Πολλά ζεύγη υποκαταλόγων γράφουν σε έναν κοινό υποκατάλογο. Παρακαλούμε ελέγξτε ξανά τις ρυθμίσεις.</target>
+<target>Πολλά ζεύγη υποκαταλόγων γράφουν σε έναν κοινό υποκατάλογο. Παρακαλούμε ελέγξτε ξανά τη διάταξη που επιλέξατε.</target>
<source>Synchronizing folder pair:</source>
<target>Συγχρονίζεται το ζευγάρι υποκαταλόγων:</target>
@@ -549,12 +626,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>Ο συγχρονισμός διακόπηκε</target>
+<source>Stopped</source>
+<target>Διεκόπη</target>
+
<source>Synchronization completed with errors</source>
<target>Ο συγχρονισμός ολοκληρώθηκε με σφάλματα</target>
<source>Synchronization completed with warnings</source>
<target>Ο συγχρονισμός ολοκληρώθηκε με προειδοποιήσεις</target>
+<source>Warning</source>
+<target>Προειδοποίηση</target>
+
<source>Nothing to synchronize</source>
<target>Δεν υπάρχει τίποτα προς συγχρονισμό</target>
@@ -564,9 +647,6 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>Καθαρισμός των παλιών αρχείων καταγραφής...</target>
-<source>Stopped</source>
-<target>Διεκόπη</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Μπορείτε να επιστρέψετε στο κύριο παράθυρο του FreeFileSync για να επιλύσετε αυτό το θέμα.</target>
@@ -657,9 +737,6 @@ The command is triggered if:
<source>Action</source>
<target>Ενέργεια</target>
-<source>Drag && drop</source>
-<target>Μεταφορά && Απόθεση</target>
-
<source>Local comparison settings</source>
<target>Τοπικές ρυθμίσεις σύγκρισης</target>
@@ -690,6 +767,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>Τοπικές Ρυθμίσεις Συγχρονισμού</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Ο επιλεγμένος υποκατάλογος %x δεν μπορεί να χρησιμοποιηθεί από το FreeFileSync. Παρακαλούμε επιλέξτε έναν υποκατάλογο στο τοπικό σύστημα αρχείων, δίκτυο ή σε μια συσκευή MTP.</target>
+
<source>&New</source>
<target>&Δημιουργία</target>
@@ -724,7 +804,7 @@ The command is triggered if:
<target>&Γλώσσα</target>
<source>&Find...</source>
-<target>Εύ&ρεση</target>
+<target>Εύ&ρεση...</target>
<source>&Reset layout</source>
<target>&Αρχικοποίηση εμφάνισης</target>
@@ -759,6 +839,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>Διαγραφή του ζεύγους υποκαταλόγων</target>
+<source>Select SFTP folder</source>
+<target>Επιλογή υποκαταλόγου SFTP</target>
+
<source>Swap sides</source>
<target>Ανταλλαγή πλευρών</target>
@@ -816,8 +899,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>Αναγνώριση των ταυτόσημων αρχείων με σύγκριση του περιεχομένου τους.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Αγνόηση χρονικής μετατόπισης (σε ώρες)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Παράβλεψη χρονικής διαφοράς (σε ώρες)</target>
<source>Consider file times with specified offset as equal</source>
<target>Αρχεία με τη συγκεκριμένη χρονική διαφορά θα θεωρούνται ίδια</target>
@@ -825,14 +908,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>Διαχείριση θερινής ώρας</target>
-<source>Include symbolic links:</source>
-<target>Συμπερίληψη των συμβολικών δεσμών:</target>
+<source>Include &symbolic links:</source>
+<target>Συμπερίληψη των &συμβολικών δεσμών:</target>
-<source>Direct</source>
-<target>Ως δεσμοί</target>
+<source>&Follow</source>
+<target><Α&κολούθηση</target>
-<source>Follow</source>
-<target>Ως περιεχόμενο</target>
+<source>&Direct</source>
+<target>Άμε&ση αξιολόγηση</target>
<source>More information</source>
<target>Περισσότερες πληροφορίες</target>
@@ -859,7 +942,7 @@ The command is triggered if:
<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>
@@ -871,14 +954,14 @@ The command is triggered if:
<target>Ανίχνευση των αρχείων που μεταφέρθηκαν</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Η ανίχνευση είναι ενεργή μετά από τον αρχικό συγχρονισμό
-- Απαιτεί και δημιουργεί αρχεία βάσεων δεδομένων
- Δεν υποστηρίζεται από όλα τα συστήματα αρχείων
+- Απαιτεί και δημιουργεί αρχεία βάσης δεδομένων
+- Η ανίχνευση δεν είναι διαθέσιμη κατά τον πρώτο συγχρονισμό
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -926,6 +1009,27 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Εισάγετε τα στοιχεία σύνδεσης SFTP:</target>
+
+<source>Server name or IP address:</source>
+<target>Όνομα του διακομιστή ή διεύθυνση IP:</target>
+
+<source>Examples:</source>
+<target>Παραδείγματα:</target>
+
+<source>User name:</source>
+<target>Όνομα χρήστη:</target>
+
+<source>Password:</source>
+<target>Συνθηματικό:</target>
+
+<source>&Show password</source>
+<target>&Εμφάνιση συνθηματικού</target>
+
+<source>Directory on server:</source>
+<target>Υποκατάλογος στον διακομιστή:</target>
+
<source>Start synchronization now?</source>
<target>Να ξεκινήσει ο συγχρονισμός τώρα;</target>
@@ -935,6 +1039,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>&Να μην εμφανιστεί ξανά αυτό το μήνυμα</target>
+<source>Arrange folder pair</source>
+<target>Οργάνωση του ζεύγους υποκαταλόγων:</target>
+
<source>Items found:</source>
<target>Βρέθηκαν στοιχεία:</target>
@@ -1067,6 +1174,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>Πολλές ευχαριστίες για τις μεταφράσεις:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH File Transfer Protocol</target>
+
<source>Save as Batch Job</source>
<target>Αποθήκευση ως Δέσμη Εργασιών</target>
@@ -1079,8 +1189,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Επιλογή Χρονικού Εύρους</target>
-<source>&Preferences...</source>
-<target>&Προτιμήσεις...</target>
+<source>&Preferences</source>
+<target>&Προτιμήσεις</target>
+
+<source>Main Bar</source>
+<target>Κύρια Γραμμή</target>
<source>Folder Pairs</source>
<target>Ζεύγη Υποκαταλόγων</target>
@@ -1097,9 +1210,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>Σύνοψη</target>
-<source>Main Bar</source>
-<target>Κύρια Γραμμή</target>
-
<source>Confirm</source>
<target>Επιβεβαίωση</target>
@@ -1208,8 +1318,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>Να &μην αποθηκευθούν</target>
-<source>Delete selected configurations</source>
-<target>Διαγραφή επιλεγμένων διατάξεων</target>
+<source>Remove entry from list</source>
+<target>Αφαίρεση καταχώρησης από τον κατάλογο</target>
<source>Synchronization Settings</source>
<target>Ρυθμίσεις συγχρονισμού</target>
@@ -1262,8 +1372,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>Εμφάνιση φιλτραρισμένων ή προσωρινά εξαιρεθέντων αρχείων</target>
-<source>Set as default</source>
-<target>Ορισμός ως προεπιλογής</target>
+<source>Save as default</source>
+<target>Αποθήκευση ως προεπιλογής</target>
<source>Filter</source>
<target>Φίλτρο</target>
@@ -1274,6 +1384,12 @@ This guarantees a consistent state even in case of a serious error.
<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>
@@ -1286,18 +1402,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>Κλείσιμο του παράθυρου αναφοράς</target>
-<source>Standby</source>
-<target>Αναστολή λειτουργίας</target>
-
<source>Log off</source>
<target>Αποσύνδεση</target>
+<source>Standby</source>
+<target>Αναστολή λειτουργίας</target>
+
<source>Shut down</source>
<target>Τερματισμός λειτουργίας</target>
-<source>Hibernate</source>
-<target>Αδρανοποίηση</target>
-
<source>Scanning...</source>
<target>Ανίχνευση...</target>
@@ -1307,9 +1420,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Πληροφορίες</target>
-<source>Warning</source>
-<target>Προειδοποίηση</target>
-
<source>Select all</source>
<target>Επιλογή όλων</target>
@@ -1355,8 +1465,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>Προτιμήσεις</target>
-<source>Copy NTFS permissions</source>
-<target>Αντιγραφή αδειών προσπέλασης NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Αντιγραφή των DACL, SACL, Κατόχου, Ομάδας</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Ένταξη εξωτερικών εφαρμογών στο μενού περιβάλλοντος. Οι ακόλουθες μακροεντολές είναι διαθέσιμες:</target>
@@ -1451,27 +1561,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>Ποσοστό</target>
+<source>Unable to register to receive system messages.</source>
+<target>Δεν μπορεί να καταχωρηθεί η λήψη μηνυμάτων συστήματος.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Δεν μπορούν να καταχωρηθεί η ειδοποίηση για τη συσκευή %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Δεν είναι δυνατή η παρακολύθηση του υποκαταλόγου %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Δεν μπορεί να διαγραφεί το αρχείο %x.</target>
-
<source>The file is locked by another process:</source>
<target>Το αρχείο είναι κλειδωμένο από μια άλλη διαδικασία:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Δεν μπορεί το αρχείο %x να μεταφερθεί στο %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Δεν μπορεί να διαγραφεί ο υποκατάλογος %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Δεν μπορεί να γίνει εγγραφή των χαρακτηριστικών αρχείου του %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Δεν μπορεί να γίνει εγγραφή της ώρας τροποποίησης του %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Δεν μπορεί να αναγνωσθεί το περιβάλλον ασφαλείας του %x.</target>
@@ -1481,33 +1585,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>Δεν μπορούν να αναγνωσθούν οι άδειες προσπέλασης του %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Δεν μπορεί να γίνει εγγραφή των αδειών προσπέλασης του %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Δεν μπορεί να δημιουργηθεί ο υποκατάλογος %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Αδυναμία αντιγραφής του συμβολικού δεσμού %x στο %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Δεν μπορούν να αντιγραφούν οι άδειες προσπέλασης του %x στο %y.</target>
<source>Cannot find system function %x.</source>
<target>Δεν ανευρίσκεται η λειτουργία συστήματος %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Δεν μπορούν να αντιγραφούν τα χαρακτηριστικά του %x στο %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Δεν μπορεί να αντιγραφεί το αρχείο %x στο %y.</target>
<source>Type of item %x is not supported:</source>
<target>Ο τύπος του στοιχείου %x δεν υποστηρίζεται:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Ο συμβολικός δεσμός %x δεν μπορεί να επιλυθεί</target>
-
-<source>Cannot open directory %x.</source>
-<target>Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Δεν είναι δυνατή η καταλογογράφηση του υποκαταλόγου %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1541,9 +1633,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x μέρες</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Δεν μπορεί να καταχωρηθεί η λήψη μηνυμάτων συστήματος.</target>
-
<source>Cannot set privilege %x.</source>
<target>Τα δικαιώματα %x δεν μπορούν να οριστούν.</target>
@@ -1553,29 +1642,20 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>Δεν μπορούν να αλλάξουν οι προτεραιότητες I/O της διεργασίας.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Δεν ήταν δυνατή η μεταφορά του %x στον κάδο ανακύκλωσης.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Ο έλεγχος του κάδου ανακύκλωσης απέτυχε για τον υποκατάλογο %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Δεν μπορεί να προσδιοριστεί η τελική διαδρομή για το %x.</target>
-
-<source>Error Code %x:</source>
-<target>Κωδικός Σφάλματος %x</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Δεν ήταν δυνατό να αναγνωσθούν τα ακόλουθα στοιχεία XML:</target>
+<source>The following XML elements could not be read:</source>
+<target>Τα ακόλουθα στοιχεία XML δεν ήταν δυνατό να αναγνωσθούν:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Το αρχείο διάταξης %x έχει φορτωθεί μόνο κατά ένα μέρος.</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>
+<target>Επιλέξτε ποια στοιχεία θέλετε να εγκαταστήσετε.</target>
<source>Select installation type:</source>
<target>Επιλογή τύπου εγκατάστασης:</target>
diff --git a/FreeFileSync/Build/Languages/hebrew.lng b/FreeFileSync/Build/Languages/hebrew.lng
index 190861f4..497064da 100644
--- a/FreeFileSync/Build/Languages/hebrew.lng
+++ b/FreeFileSync/Build/Languages/hebrew.lng
@@ -23,7 +23,7 @@
<target>בחר ברירת מחדל של סנכרון: קבצים ישנים ידרסו ע"י קבצים חדשים יותר.</target>
<source>Checking recycle bin availability for folder %x...</source>
-<target>בודק זמינות סל מחזור עבור מחיצה %x...</target>
+<target>בודק זמינות סל מחזור עבור תיקייה %x...</target>
<source>Moving file %x to the recycle bin</source>
<target>מעביר קובץ %x לסל המיחזור</target>
@@ -38,7 +38,7 @@
<target>מוחק קובץ %x</target>
<source>Deleting folder %x</source>
-<target>מוחק מחיצה %x</target>
+<target>מוחק תיקייה %x</target>
<source>Deleting symbolic link %x</source>
<target>מוחק קישור סימבולי %x</target>
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>שגיאת תחביר</target>
-<source>Cannot open file %x.</source>
-<target>לא יכול לפתוח קובץ %x.</target>
+<source>Cannot find file %x.</source>
+<target>לא מוצא קובץ %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>קובץ %x אינו כולל תצורה תקינה.</target>
@@ -65,7 +65,7 @@
<target>מספר בלתי שווה של מחיצות ימין ושמאל צוין.</target>
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
-<target>קבצי הקונפיגורציה אינם יכולים לכלול הגדרות של זוגות מחיצות כאשר מחיצות מוגדרות באמצעות שורת הפקודה</target>
+<target>קבצי הקונפיגורציה אינם יכולים לכלול הגדרות של זוגות מחיצות כאשר מחיצות מוגדרות באמצעות שורת הפקודה.</target>
<source>Directories cannot be set for more than one configuration file.</source>
<target>מחיצות אינו יכולות להיות מוגדרות עבור יותר מקובץ קונפיגורציה אחד.</target>
@@ -77,16 +77,16 @@
<target>תחביר:</target>
<source>global config file:</source>
-<target>קבצי תצורה גלובליים</target>
+<target>קבצי תצורה גלובליים:</target>
<source>config files:</source>
-<target>קבצי תצורה</target>
+<target>קבצי תצורה:</target>
<source>directory</source>
<target>מחיצה</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
-<target>נתיב אל קובץ GlobalSettingd.xml אלטרנטיבי</target>
+<target>נתיב אל קובץ GlobalSettingd.xml אלטרנטיבי.</target>
<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
<target>כל כמות של קבצי FreeFileSync .ffs_gui ו\או קבצי קונפיגורציה .ffs_batch.</target>
@@ -94,11 +94,11 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>כל כמות של זוגות מחיצות אלטרנטיביות עבור קובץ תצורה אחד לפחות.</target>
-<source>Open configuration for edit without executing.</source>
-<target>פתח תצורה לעריכה ללא ביצוע.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>פתח הגדרות תצורה לעריכה ללא החלתם.</target>
<source>Cannot find the following folders:</source>
-<target>לא יכול למצוא את המחיצות הבאות:</target>
+<target>לא יכול למצוא את התיקיות הבאות:</target>
<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
<target>אפשר להתעלם משגיאה זו ולהחשיב כל תיקיה כריקה. התיקיות יווצרו אוטומטית בזמן הסינכרון.</target>
@@ -107,7 +107,7 @@
<target>שדה קלט תיקייה ריק.</target>
<source>The corresponding folder will be considered as empty.</source>
-<target>המחיצה המתאימה תחשב כריקה.</target>
+<target>התקייה המתאימה תחשב כריקה.</target>
<source>The following folder paths are dependent from each other:</source>
<target>נתיבי התיקיות הבאים תלויים זה בזה:</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>עדכן תכונות בצד שמאל</target>
+<source>Cannot read file %x.</source>
+<target>לא יכול לקרוא קובץ %x.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+גודל בלתי צפוי של זרם נתונים.
+צפוי: %x בתים
+בפועל: %y בתים
+</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 write file %x.</source>
+<target>לא יכול לכתוב קובץ %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>לא יכול להעתיק קישור סימבולי %x אל %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>לא יכול להעביר קובץ %x אל %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>לא יכול למספר מחיצה %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>לא יכול לקרוא תכונות של קובץ %x.</target>
+
+<source>Cannot find %x.</source>
+<target>לא מוצא %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>לא יכול לפתוח קובץ %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>לא מוצא התקן %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>לא ניתן לקבוע שטח דיסק פנוי עבור %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>לא יכול ליצור מחיצה %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>לא יכול למחוק מחיצה %x.</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>לא יכול לפתוח מחיצה %x.</target>
+
+<source>Incorrect command line:</source>
+<target>שורת פקודה לא תקינה:</target>
+
+<source>Error Code %x:</source>
+<target>קוד שגיאה %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>התחברות נכשלה אל שרת SFTP %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +315,14 @@
<source>Database file is corrupt:</source>
<target>קובץ מסד נתונים משובש:</target>
-<source>Cannot write file %x.</source>
-<target>לא יכול לכתוב קובץ %x.</target>
-
-<source>Cannot read file %x.</source>
-<target>לא יכול לקרוא קובץ %x.</target>
-
<source>Database files do not share a common session.</source>
<target>קבצי הנתונים אינם כוללים מופע פעילות משותף.</target>
<source>Searching for folder %x...</source>
<target>מחפש את תיקייה %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>לא יכול לקרוא תכונות של קובץ %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target>פקע הזמן עבור חיפוש של תיקייה %x.</target>
<source>Cannot get process information.</source>
<target>לא יכול לקבל את נתוני התהליך.</target>
@@ -320,7 +394,7 @@
<target>עיין במחיצה</target>
<source>Cannot access the Volume Shadow Copy Service.</source>
-<target>לא ניתן לגשת אל שרות Volume Shadow Copy</target>
+<target>לא ניתן לגשת אל שרות Volume Shadow Copy.</target>
<source>Please use FreeFileSync 64-bit version to create shadow copies on this system.</source>
<target>אנא השתמש בגירסת 64-bit של FreeFileSync על מנת ליצר shadow copies במערכת הפעלה זו.</target>
@@ -337,6 +411,15 @@
<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>
+
<source>&Open...</source>
<target>&פתח...</target>
@@ -371,23 +454,20 @@
<target>3. לחץ 'הפעל'.</target>
<source>To get started just import a .ffs_batch file.</source>
-<target>בכדי להתחיל יבא קובץ .ffs_batch</target>
+<target>בכדי להתחיל יבא קובץ .ffs_batch.</target>
<source>Folders to watch:</source>
<target>תיקיות לצפייה:</target>
<source>Add folder</source>
-<target>הוסף מחיצה</target>
+<target>הוסף תיקייה</target>
<source>Remove folder</source>
-<target>הסר מחיצה</target>
+<target>הסר תיקייה</target>
<source>Browse</source>
<target>עיין</target>
-<source>Select a folder</source>
-<target>בחר מחיצה</target>
-
<source>Idle time (in seconds):</source>
<target>זמן המתנה (בשניות):</target>
@@ -441,9 +521,6 @@ The command is triggered if:
<source>&Quit</source>
<target>&יציאה</target>
-<source>Incorrect command line:</source>
-<target>שורת פקודה לא תקינה:</target>
-
<source>&Retry</source>
<target>&נסה שנית</target>
@@ -472,7 +549,7 @@ The command is triggered if:
<target>מעביר קובץ %x אל %y</target>
<source>Moving folder %x to %y</source>
-<target>מעביר מחיצה %x אל %y</target>
+<target>מעביר תיקייה %x אל %y</target>
<source>Moving symbolic link %x to %y</source>
<target>מעביר קישור סימבולי %x אל %y</target>
@@ -484,7 +561,7 @@ The command is triggered if:
<target>יוצר קישור סימבולי %x</target>
<source>Creating folder %x</source>
-<target>יוצר מחיצה %x</target>
+<target>יוצר תיקייה %x</target>
<source>Updating file %x</source>
<target>מעדכן קובץ %x</target>
@@ -498,18 +575,18 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>מייצר Volume Shadow Copy עבור %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>שגיאת אימות נתונים. ל %x ו %y יש תוכן שונה.</target>
-
<source>Target folder %x already existing.</source>
<target>תיקיית מטרה %x כבר קיימת.</target>
-<source>Cannot find folder %x.</source>
-<target>לא מוצא תיקייה %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>קלט תיקיית מטרה אינה יכול להיות ריק.</target>
@@ -522,8 +599,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>לפריטים הבאים יש קונפליקטים בלתי פתורים והם לא יסונכרנו:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>התיקיות הבאות שונות באופן מהותי. ודא את התאמת התיקיות לסינכרון.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>התיקיות הבאות שונות באופן מהותי. ודא כי בחרת את התקיות הנכונות לסינכרון.</target>
<source>Not enough free disk space available in:</source>
<target>אין מספיק מקום דיסק פנוי ב:</target>
@@ -549,12 +626,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>סנכרון הופסק</target>
+<source>Stopped</source>
+<target>נעצר</target>
+
<source>Synchronization completed with errors</source>
<target>סנכרון הושלם עם שגיאות</target>
<source>Synchronization completed with warnings</source>
<target>סנכרון הסתיים עם אזהרות</target>
+<source>Warning</source>
+<target>אזהרה</target>
+
<source>Nothing to synchronize</source>
<target>אין מה לסנכרן</target>
@@ -564,9 +647,6 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>מנקה קבצי יומן ישנים...</target>
-<source>Stopped</source>
-<target>נעצר</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>ניתן לעבור לחלון הראשי של FreeFileSybc כדי לפתור את הסוגיה הזו.</target>
@@ -616,7 +696,7 @@ The command is triggered if:
<target>FreeFileSync מעודכן לגירסה האחרונה.</target>
<source>Unable to connect to www.freefilesync.org.</source>
-<target>אין תקשורת אל www.freefilesync.org</target>
+<target>אין תקשורת אל www.freefilesync.org.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>לא מוצא מספר גירסה עדכנית של FreeFileSync באופן מכוון. האם אתה רוצה לבדוק באופן ידני?</target>
@@ -657,9 +737,6 @@ The command is triggered if:
<source>Action</source>
<target>פעולה</target>
-<source>Drag && drop</source>
-<target>גרור ושחרר</target>
-
<source>Local comparison settings</source>
<target>הגדרות השוואה מקומיות</target>
@@ -690,6 +767,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>הגדרות סינכרון מקומיות</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>התיקייה שנבחרה %x אינה ניתנת לשחמוש עם FreeFileSync. אנא בחר תיקייה במערכת קבצים מקומית, רשת או התקן MTP.</target>
+
<source>&New</source>
<target>&חדש</target>
@@ -697,7 +777,7 @@ The command is triggered if:
<target>&שמור</target>
<source>Save as &batch job...</source>
-<target>שמור כעבודת &אצווה</target>
+<target>שמור כעבודת &אצווה...</target>
<source>Start &comparison</source>
<target>התחל &והשווה</target>
@@ -724,7 +804,7 @@ The command is triggered if:
<target>&שפה</target>
<source>&Find...</source>
-<target>&מצא</target>
+<target>&מצא...</target>
<source>&Reset layout</source>
<target>&אפס פריסה</target>
@@ -754,10 +834,13 @@ The command is triggered if:
<target>סנכרן</target>
<source>Add folder pair</source>
-<target>הוסף זוג מחיצות</target>
+<target>הוסף זוג תיקיות</target>
<source>Remove folder pair</source>
-<target>הסר זוג מחיצות</target>
+<target>הסר זוג תיקיות</target>
+
+<source>Select SFTP folder</source>
+<target>בחר תיקיית SFTP</target>
<source>Swap sides</source>
<target>החלף צדדים</target>
@@ -816,8 +899,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>זהה קבצים זהים באמצעות השוואת תוכן.</target>
-<source>Ignore time shift (in hours)</source>
-<target>התעלם מהפרש זמן (שעות)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&התעלם מסטיית זמן (בשעות)</target>
<source>Consider file times with specified offset as equal</source>
<target>החשב זמני קובץ עם תזוזת זמן שנקבעה כשווים</target>
@@ -825,14 +908,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>התמודד עם שעון קיץ</target>
-<source>Include symbolic links:</source>
-<target>כלול קישורים סימבוליים:</target>
+<source>Include &symbolic links:</source>
+<target>כלול &קישורים סימבוליים:</target>
-<source>Direct</source>
-<target>כוון</target>
+<source>&Follow</source>
+<target>&עקוב</target>
-<source>Follow</source>
-<target>עקוב</target>
+<source>&Direct</source>
+<target>&כוון</target>
<source>More information</source>
<target>מידע נוסף</target>
@@ -871,14 +954,14 @@ The command is triggered if:
<target>גלה קבצים מועברים</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- גילוי פעיל לאחר סינכרון ראשוני
-- דורש ויוצר קבצי בסיס נתונים
-- לא נתמך ע"י כל מערכות הקבצים
+- לא נתמך ע"י כל מערכת קבצים
+- דורש ומייצר קבצי בסיס נתונים
+- גילוי לא זמין עבור סינכרון ראשוני
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -926,6 +1009,27 @@ The command is triggered if:
<source>OK</source>
<target>אשר</target>
+<source>Enter your SFTP login details:</source>
+<target>הכנס את נתוני הכניסה שלך ל-SFTP:</target>
+
+<source>Server name or IP address:</source>
+<target>שם שרת או כתובת IP:</target>
+
+<source>Examples:</source>
+<target>דוגמאות:</target>
+
+<source>User name:</source>
+<target>שם משתמש:</target>
+
+<source>Password:</source>
+<target>סיסמה:</target>
+
+<source>&Show password</source>
+<target>&הצג סיסמה</target>
+
+<source>Directory on server:</source>
+<target>מחיצה על שרת:</target>
+
<source>Start synchronization now?</source>
<target>האם להתחיל סנכרון עכשיו?</target>
@@ -935,6 +1039,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>&אל תראה דושיח זה שנית</target>
+<source>Arrange folder pair</source>
+<target>סדר זוג תיקיות</target>
+
<source>Items found:</source>
<target>אלמנטים נמצאו:</target>
@@ -1017,7 +1124,7 @@ This guarantees a consistent state even in case of a serious error.
<target>העתק הרשאות גישה של הקובץ</target>
<source>Transfer file and folder permissions.</source>
-<target>הרשאות העברת קובץ ומחיצה.</target>
+<target>הרשאות העברת קובץ ותיקייה.</target>
<source>Automatic retry on error:</source>
<target>נסיון חוזר אוטומטי במקרה שגיאה:</target>
@@ -1067,6 +1174,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>תודות עבור תרגום שפות:</target>
+<source>SSH File Transfer Protocol</source>
+<target>פרוטוקול העברת קבצים SSH</target>
+
<source>Save as Batch Job</source>
<target>שמור כמשימת אצווה</target>
@@ -1079,8 +1189,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>בחר טווח זמן</target>
-<source>&Preferences...</source>
-<target>&העדפות...</target>
+<source>&Preferences</source>
+<target>&העדפות</target>
+
+<source>Main Bar</source>
+<target>סרגל ראשי</target>
<source>Folder Pairs</source>
<target>זוגות תיקיות</target>
@@ -1097,9 +1210,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>מבט כללי</target>
-<source>Main Bar</source>
-<target>סרגל ראשי</target>
-
<source>Confirm</source>
<target>אשר</target>
@@ -1191,7 +1301,7 @@ This guarantees a consistent state even in case of a serious error.
<target>פעילות אחרונה</target>
<source>Folder Comparison and Synchronization</source>
-<target>סנכרון קבצים ומחיצות</target>
+<target>סנכרון קבצים ותיקיות</target>
<source>Configuration saved</source>
<target>תצורה נשמרה</target>
@@ -1208,8 +1318,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>אל &תשמור</target>
-<source>Delete selected configurations</source>
-<target>מחק קופיגורציות שנבחרו</target>
+<source>Remove entry from list</source>
+<target>הסר פריט מרשימה</target>
<source>Synchronization Settings</source>
<target>הגדרות סנכרון</target>
@@ -1262,8 +1372,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>הראה קבצים שסוננו או לא נכללו זמנית</target>
-<source>Set as default</source>
-<target>הגדר כברירת מחדל</target>
+<source>Save as default</source>
+<target>שמור כברירת מחדל</target>
<source>Filter</source>
<target>מסנן</target>
@@ -1274,6 +1384,12 @@ This guarantees a consistent state even in case of a serious error.
<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>
@@ -1286,18 +1402,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>סגור שיח התקדמות</target>
-<source>Standby</source>
-<target>עבור למצב המתנה</target>
-
<source>Log off</source>
<target>התנתק כמשתמש</target>
+<source>Standby</source>
+<target>עבור למצב המתנה</target>
+
<source>Shut down</source>
<target>כבה מחשב</target>
-<source>Hibernate</source>
-<target>עבור למצב שינה</target>
-
<source>Scanning...</source>
<target>סורק...</target>
@@ -1307,9 +1420,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>מידע</target>
-<source>Warning</source>
-<target>אזהרה</target>
-
<source>Select all</source>
<target>בחר הכל</target>
@@ -1355,8 +1465,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>העדפות</target>
-<source>Copy NTFS permissions</source>
-<target>העתק הרשאות NTFS</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>
@@ -1451,27 +1561,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>אחוז</target>
+<source>Unable to register to receive system messages.</source>
+<target>לא ניתן להרשם לקבלת הודעות מערכת.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>לא יכול לרשום הודעות עבור התקן %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>לא יכול לנטר מחיצה %x.</target>
-<source>Cannot delete file %x.</source>
-<target>לא יכול למחוק קובץ %x.</target>
-
<source>The file is locked by another process:</source>
<target>הקובץ נעול ע"י תהליך:</target>
-<source>Cannot move file %x to %y.</source>
-<target>לא יכול להעביר קובץ %x אל %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>לא יכול למחוק מחיצה %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>לא יכול לכתוב תכונות קובץ של %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>לא יכול לרשום זמן שינוי של %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>לא יכול לקרוא הקשר בטיחות של %x.</target>
@@ -1481,33 +1585,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>לא יכול לקרוא הרשאות של %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>לא יכול לכתוב הרשאות של %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>לא יכול ליצור מחיצה %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>לא יכול להעתיק קישור סימבולי %x אל %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>לא יכול להעתיק הרשאות מ- %x אל %y.</target>
<source>Cannot find system function %x.</source>
<target>לא יכול למצוא פונקצית מערכת %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>לא יכול להעתיק תכונות מ- %x אל %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>לא יכול להעתיק קובץ %x אל %y.</target>
<source>Type of item %x is not supported:</source>
<target>סוג של פריט %x אינו נתמך:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>לא יכול לפענח את הקישור הסימבולי %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>לא יכול לפתוח מחיצה %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>לא יכול למספר מחיצה %x.</target>
-
<source>%x TB</source>
<target>%x טרה בייט</target>
@@ -1541,9 +1633,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x ימים</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>לא ניתן להרשם לקבלת הודעות מערכת.</target>
-
<source>Cannot set privilege %x.</source>
<target>לא יכול להגדיר זבות %x.</target>
@@ -1553,23 +1642,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>לא יכול לשנות קדימויות של תהליך קלט פלט.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>לא יכול להעביר את %x לסל המחזור</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>בודק כשלון בתא מחזור עבור תיקייה %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>לא יכול לקבוע את המסלול הסופי ל %x.</target>
-
-<source>Error Code %x:</source>
-<target>קוד שגיאה %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>לא יכול לקרוא את שמות צמתי XML:</target>
+<source>The following XML elements could not be read:</source>
+<target>לא ניתן לקרוא את רכיבי XML הבאים:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>קובץ תצורה %x נטען חלקית בלבד.</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>
@@ -1608,10 +1688,10 @@ This guarantees a consistent state even in case of a serious error.
<target>העתק קבצים בלבד</target>
<source>Choose a directory for installation:</source>
-<target>בחר תיקיה להתקנה</target>
+<target>בחר תיקיה להתקנה:</target>
<source>Create shortcuts:</source>
-<target>צור קיצורי דרך</target>
+<target>צור קיצורי דרך:</target>
<source>Desktop</source>
<target>שולחן עבודה</target>
diff --git a/FreeFileSync/Build/Languages/hindi.lng b/FreeFileSync/Build/Languages/hindi.lng
index 9e008c91..7f97b984 100644
--- a/FreeFileSync/Build/Languages/hindi.lng
+++ b/FreeFileSync/Build/Languages/hindi.lng
@@ -11,7 +11,7 @@
<target>पिछ्ले सिंक्रनाइज़ेशन के बाद से दोनो तरफ बदलाव है।</target>
<source>Cannot determine sync-direction:</source>
-<target>सिंक्रनाइज़ेशन-दिशा का निर्धारण नहीं किया जा सकता :</target>
+<target>सिंक्रनाइज़ेशन-दिशा का निर्धारण नहीं किया जा सकता:</target>
<source>No change since last synchronization.</source>
<target>पिछ्ले सिंक्रनाइज़ेशन के बाद से कोई बदलाव नहीं है।</target>
@@ -20,7 +20,7 @@
<target>वर्तमान सेटिंग्स के अनुसार डेटाबेस प्रविष्टि सिंक्रनाइज़्ड नहीं है।</target>
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
-<target>डिफ़ॉल्ट सिंक्रनाइज़ेशन दिशाएँ सेट हो रही हैं : पुरानी फ़ाइल्स नई फ़ाइल्स से अधिलेखित होंगी।</target>
+<target>डिफ़ॉल्ट सिंक्रनाइज़ेशन दिशाएँ सेट हो रही हैं: पुराने फ़ाइल्स नए फ़ाइल्स से अधिलेखित होंगे।</target>
<source>Checking recycle bin availability for folder %x...</source>
<target>%x फ़ोल्डर के लिए रीसायकल बिन की उपलब्धता की जाँच हो रही है...</target>
@@ -44,7 +44,7 @@
<target>%x प्रतीकात्मक कड़ी हटाया जा रहा है</target>
<source>The recycle bin is not available for the following folders. Files will be deleted permanently instead:</source>
-<target>रीसायकल बिन निम्न फ़ोलडर्स के लिए उपलब्ध नहीं है। फ़ाइल्स को स्थायी रूप से हटाया जाएगा :</target>
+<target>रीसायकल बिन निम्न फ़ोलडर्स के लिए उपलब्ध नहीं है। फ़ाइल्स को स्थायी रूप से हटाया जाएगा:</target>
<source>An exception occurred</source>
<target>कोई अपवाद हुआ</target>
@@ -74,13 +74,13 @@
<target>आदेश-पंक्ति</target>
<source>Syntax:</source>
-<target>वाक्य-विन्यास :</target>
+<target>वाक्य-विन्यास:</target>
<source>global config file:</source>
-<target>सार्वत्रिक कॉन्फ़िग फ़ाइल :</target>
+<target>सार्वत्रिक कॉन्फ़िग फ़ाइल:</target>
<source>config files:</source>
-<target>कॉन्फ़िग फ़ाइल्स :</target>
+<target>कॉन्फ़िग फ़ाइल्स:</target>
<source>directory</source>
<target>निर्देशिका</target>
@@ -94,11 +94,11 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>कितने भी वैकलपिक निर्देशिका जोडे अधिक से अधिक एक कॉन्फ़िग फ़ाइल के लिए।</target>
-<source>Open configuration for edit without executing.</source>
+<source>Open configuration for editing without executing it.</source>
<target>कॉन्फ़िगरेशन को बिना निष्पादित किए संपादन के लिए खोलें।</target>
<source>Cannot find the following folders:</source>
-<target>निम्न फ़ोलडर्स नहीं मिले :</target>
+<target>निम्न फ़ोलडर्स नहीं मिले:</target>
<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
<target>हर फ़ोल्डर को खाली समझकर आप इस त्रुटि को अनदेखा कर सकते हो। फिर सिंक्रनाइज़ेशन के दौरान फ़ोलडर्स अपने आप बनेंगे।</target>
@@ -110,7 +110,7 @@
<target>तद्नुरूप फ़ोल्डर को खाली माना जाएगा।</target>
<source>The following folder paths are dependent from each other:</source>
-<target>निम्न फ़ोलडर्स के पथ एक दूसरे पर निर्भर हैं :</target>
+<target>निम्न फ़ोलडर्स के पथ एक दूसरे पर निर्भर हैं:</target>
<source>File %x has an invalid date.</source>
<target>%x फ़ाइल का दिनांक अवैध है।</target>
@@ -170,22 +170,22 @@
<target>विरोध/आइटम को वर्गीकृत नहीं किया जा सकता</target>
<source>Copy new item to left</source>
-<target>नए आइटम की बाईं तरफ प्रतिलिपि बनाएँ</target>
+<target>नए आइटम की बाईं तरफ प्रतिलिपि बनाएं</target>
<source>Copy new item to right</source>
-<target>नए आइटम की दाईं तरफ प्रतिलिपि बनाएँ</target>
+<target>नए आइटम की दाईं तरफ प्रतिलिपि बनाएं</target>
<source>Delete left item</source>
-<target>बायां आइटम हटाएँ</target>
+<target>बायां आइटम हटाएं</target>
<source>Delete right item</source>
-<target>दायां आइटम हटाएँ</target>
+<target>दायां आइटम हटाएं</target>
<source>Move file on left</source>
-<target>फ़ाइल को बाईं तरफ खिसकाएँ</target>
+<target>फ़ाइल को बाईं तरफ खिसकाएं</target>
<source>Move file on right</source>
-<target>फ़ाइल को दाईं तरफ खिसकाएँ</target>
+<target>फ़ाइल को दाईं तरफ खिसकाएं</target>
<source>Update left item</source>
<target>बायां आइटम अद्यतन करें</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>दाईं तरफ के गुण अद्यतन करें</target>
+<source>Cannot read file %x.</source>
+<target>फ़ाइल %x पढ़ने में असमर्थ।</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+डेटा स्ट्रीम का आकार अनपेक्षित।
+अपेक्षित: %x बाइट्स
+वास्तविक: %y बाइट्स
+</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 write file %x.</source>
+<target>फ़ाइल %x लिखने में असमर्थ।</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>सिंबॉलिक लिंक %x से %y प्रतिलिपित नहीं कर सकते।</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>फ़ाइल %x से %y ले जा नाहीं सकते।</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>निर्देशिका %x इन्यूमरेट नहीं कर सकते।</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x के फ़ाइल गुण पढ़ने में असमर्थ।</target>
+
+<source>Cannot find %x.</source>
+<target>%x नहीं मिला।</target>
+
+<source>Cannot open file %x.</source>
+<target>%x फ़ाइल को खोलने में असमर्थ।</target>
+
+<source>Cannot find device %x.</source>
+<target>डिवाइस %x नहीं मिला।</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>%x के लिए खाली डिस्क जगह निर्धारित नहीं कर सकते।</target>
+
+<source>Cannot create directory %x.</source>
+<target>%x निर्देशिका बना नहीं सकते।</target>
+
+<source>Cannot delete directory %x.</source>
+<target>निर्देशिका %x हटा नहीं सकते।</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>निर्देशिका %x खोल नहीं सकते।</target>
+
+<source>Incorrect command line:</source>
+<target>अनुचित आदेश-पंक्ति:</target>
+
+<source>Error Code %x:</source>
+<target>त्रुटि कोड %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>SFTP सर्वर %x को कनेक्ट करने में विफल।</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -227,46 +307,31 @@
<target>डेटाबेस फ़ाइल %x विसंगत है।</target>
<source>Initial synchronization:</source>
-<target>प्रारंभिक सिंक्रनाइज़ेशन :</target>
+<target>प्रारंभिक सिंक्रनाइज़ेशन:</target>
<source>Database file %x does not yet exist.</source>
<target>डेटाबेस फ़ाइल %x अभी तक मौजूद नहीं है।</target>
<source>Database file is corrupt:</source>
-<target>डेटाबेस फ़ाइल दूषित है :</target>
-
-<source>Cannot write file %x.</source>
-<target>फ़ाइल %x लिखने में असमर्थ।</target>
-
-<source>Cannot read file %x.</source>
-<target>फ़ाइल %x पढ़ने में असमर्थ।</target>
+<target>डेटाबेस फ़ाइल दूषित है:</target>
<source>Database files do not share a common session.</source>
<target>डेटाबेस फ़ाइल्स कोई आम सत्र साझा नहीं करते।</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>सिंबॉलिक लिंक %x को हल नहीं कर सकते।</target>
-
-<source>Cannot open directory %x.</source>
-<target>निर्देशिका %x खोल नहीं सकते।</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>निर्देशिका %x इन्यूमरेट नहीं कर सकते।</target>
-
-<source>Cannot read file attributes of %x.</source>
-<target>%x के फ़ाइल गुण पढ़ने में असमर्थ।</target>
-
<source>Searching for folder %x...</source>
<target>फ़ोल्डर %x की खोज हो रही है...</target>
+<source>Time out 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>
+<target>प्रतीक्षारत जब कि निर्देशिका अवरोधित है:</target>
<source>Lock owner:</source>
-<target>स्वामी अवरोध करें :</target>
+<target>स्वामी अवरोध करें:</target>
<source>
<pluralform>1 sec</pluralform>
@@ -287,13 +352,13 @@
<target>फ़ाइल %x सहेजी जा रही है...</target>
<source>Items processed:</source>
-<target>संसाधित आइटम्स :</target>
+<target>संसाधित आइटम्स:</target>
<source>Items remaining:</source>
-<target>शेष आइटम्स :</target>
+<target>शेष आइटम्स:</target>
<source>Total time:</source>
-<target>कुल समय :</target>
+<target>कुल समय:</target>
<source>Error parsing file %x, row %y, column %z.</source>
<target>फ़ाइल %x, पंक्ति %y, स्तंभ %z पदच्छेदन में त्रुटि।</target>
@@ -302,7 +367,7 @@
<target>%x के लिए निर्देशिका अवरोध सेट नहीं कर सकते।</target>
<source>Scanning:</source>
-<target>स्कैनिंग :</target>
+<target>स्कैनिंग:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -320,7 +385,7 @@
<target>%x आइटम्स/सेकंड</target>
<source>Show in Explorer</source>
-<target>एक्सप्लोरर में दिखाएँ</target>
+<target>एक्सप्लोरर में दिखाएं</target>
<source>Open with default application</source>
<target>डिफ़ॉल्ट अ‍ॅप्लिकेशन के साथ खोलें</target>
@@ -341,10 +406,19 @@
<target>%x वॉल्यूम नाम %y फ़ाइल पथ का हिस्सा नहीं है।</target>
<source>Stop requested: Waiting for current operation to finish...</source>
-<target>रोकने का अनुरोध हुआ: वर्तमान कार्य पूर्ण होने की प्रतीक्षा में...</target>
+<target>रोकने का अनुरोध हुआ: वर्तमान कार्यवाई पूर्ण होने की प्रतीक्षा में...</target>
<source>Unable to create time stamp for versioning:</source>
-<target>संस्करण के लिए समय मोहर बनाने में असमर्थ :</target>
+<target>संस्करण के लिए समय मोहर बनाने में असमर्थ:</target>
+
+<source>Drag && drop</source>
+<target>ड्रॅग एण्ड ड्रॉप</target>
+
+<source>Cannot find folder %x.</source>
+<target>फ़ोल्डर %x नहीं मिला।</target>
+
+<source>Select a folder</source>
+<target>फ़ोल्डर चुनें</target>
<source>&Open...</source>
<target>खोलें (&O)...</target>
@@ -368,7 +442,7 @@
<target>मदद (&H)</target>
<source>Usage:</source>
-<target>प्रयोग :</target>
+<target>प्रयोग:</target>
<source>1. Select folders to watch.</source>
<target>1. निगरानी के लिए फ़ोलडर्स चुनिए।</target>
@@ -377,7 +451,7 @@
<target>2. आदेश-पंक्ति प्रविष्ट करें।</target>
<source>3. Press 'Start'.</source>
-<target>3. 'प्रारंभ' दबाएँ.</target>
+<target>3. 'प्रारंभ' दबाएं.</target>
<source>To get started just import a .ffs_batch file.</source>
<target>प्रारंभ करने के लिए केवल कोई .ffs_batch फ़ाइल आयात करें।</target>
@@ -394,9 +468,6 @@
<source>Browse</source>
<target>ब्राउज़</target>
-<source>Select a folder</source>
-<target>फ़ोल्डर चुनें</target>
-
<source>Idle time (in seconds):</source>
<target>निष्क्रिय समय (सेकंड में):</target>
@@ -404,7 +475,7 @@
<target>पिछ्ला पता लगाया हुआ परिवर्तन और आदेश के निष्पादन के बीच का निष्क्रिय समय</target>
<source>Command line:</source>
-<target>आदेश-पंक्ति :</target>
+<target>आदेश-पंक्ति:</target>
<source>
The command is triggered if:
@@ -445,14 +516,11 @@ The command is triggered if:
<target>पुनर्स्थापित करें (&R)</target>
<source>&Show error</source>
-<target>त्रुटि दिखाएँ (&S)</target>
+<target>त्रुटि दिखाएं (&S)</target>
<source>&Quit</source>
<target>बाहर निकलें (&Q)</target>
-<source>Incorrect command line:</source>
-<target>अनुचित आदेश-पंक्ति :</target>
-
<source>&Retry</source>
<target>पुनः प्रयास (&R)</target>
@@ -507,18 +575,18 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>%x के लिए वॉल्यूम शॅडो कॉपी बनाया जा रहा है...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>डेटा सत्यापन त्रुटि: %x और %y की सामग्री भिन्न है।</target>
-
<source>Target folder %x already existing.</source>
<target>गंतव्य फ़ोल्डर %x पहले से ही विद्यमान।</target>
-<source>Cannot find folder %x.</source>
-<target>फ़ोल्डर %x नहीं मिला।</target>
-
<source>Target folder input field must not be empty.</source>
<target>गंतव्य फ़ोल्डर प्रविष्टि खाली नहीं हो सकती।</target>
@@ -529,19 +597,19 @@ The command is triggered if:
<target>कृपया संस्करण करने के लिए गंतव्य फ़ोल्डर प्रविष्ट करें।</target>
<source>The following items have unresolved conflicts and will not be synchronized:</source>
-<target>निम्न आइटम्स में हल नहीं किये गए विरोध हैं और वे सिंक्रनाइज़ नहीं होंगे :</target>
+<target>निम्न आइटम्स में हल नहीं किये गए विरोध हैं और वे सिंक्रनाइज़ नहीं होंगे:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>निम्न फ़ोलडर्स उल्लेखनीय ढंग से भिन्न हैं। सुनिश्चित करें की आप सिंक्रनाइज़ेशन के लिए सही फ़ोल्डर्स मिला रहे हैं।</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>निम्न फ़ोल्डर्स उल्लेखनीय रूप से भिन्न हैं। सुनिश्चित करें की आपने सिंक्रनाइज़ेशन के लिए उचित फ़ोल्डर्स चुने हैं।</target>
<source>Not enough free disk space available in:</source>
-<target>यहाँ पर्याप्त खाली डिस्क जगह उपलब्ध नहीं :</target>
+<target>यहाँ पर्याप्त खाली डिस्क जगह उपलब्ध नहीं:</target>
<source>Required:</source>
-<target>आवश्यक :</target>
+<target>आवश्यक:</target>
<source>Available:</source>
-<target>उपलब्ध :</target>
+<target>उपलब्ध:</target>
<source>Multiple folder pairs write to a common subfolder. Please review your configuration.</source>
<target>एकाधिक फ़ोल्डर जोडें समान उपफ़ोल्डर में लिखते हैं। कृपया अपने कॉन्फ़िगरेशन की समीक्षा करें।</target>
@@ -558,12 +626,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>सिंक्रनाइज़ेशन बंद कर दिया गया</target>
+<source>Stopped</source>
+<target>रुका</target>
+
<source>Synchronization completed with errors</source>
<target>सिंक्रनाइज़ेशन त्रुटियों सहित पूरा हुआ</target>
<source>Synchronization completed with warnings</source>
<target>सिंक्रनाइज़ेशन चेतावनियों सहित पूरा हुआ</target>
+<source>Warning</source>
+<target>चेतावनी</target>
+
<source>Nothing to synchronize</source>
<target>सिंक्रनाइज़ करने के लिए कुछ नहीं</target>
@@ -573,17 +647,11 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>पुराने लॉग फ़ाइल्स की सफाई हो रही है...</target>
-<source>Stopped</source>
-<target>रुका</target>
-
-<source>Warning</source>
-<target>चेतावनी</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>इस चेतावनी को दोबारा न दिखाएँ (&D)</target>
+<target>इस चेतावनी को दोबारा न दिखाएं (&D)</target>
<source>&Ignore</source>
<target>अनदेखा करें (&I)</target>
@@ -592,7 +660,7 @@ The command is triggered if:
<target>अदला-बदली करें (स्विच) (&S)</target>
<source>Switching to FreeFileSync's main window</source>
-<target>FreeFileSync के मुख्य विंडो में जाएँ</target>
+<target>FreeFileSync के मुख्य विंडो में जाएं</target>
<source>
<pluralform>Automatic retry in 1 second...</pluralform>
@@ -607,7 +675,7 @@ The command is triggered if:
<target>आगामी त्रुटियों को अनदेखा करें (&I)</target>
<source>Retrying operation...</source>
-<target>कार्य का पुनःप्रयास हो रहा है...</target>
+<target>कार्यवाई का पुनःप्रयास हो रहा है...</target>
<source>Serious Error</source>
<target>गंभीर त्रुटि</target>
@@ -616,7 +684,7 @@ The command is triggered if:
<target>प्रोग्राम अद्यतनों के लिए जाँच करें</target>
<source>A new version of FreeFileSync is available:</source>
-<target>FreeFileSync का नया संस्करण उपलब्ध है :</target>
+<target>FreeFileSync का नया संस्करण उपलब्ध है:</target>
<source>Download now?</source>
<target>अभी डाउनलोड करें?</target>
@@ -667,10 +735,7 @@ The command is triggered if:
<target>वर्ग</target>
<source>Action</source>
-<target>कार्य</target>
-
-<source>Drag && drop</source>
-<target>ड्रॅग एण्ड ड्रॉप</target>
+<target>क्रिया</target>
<source>Local comparison settings</source>
<target>स्थानीय तुलना सेटिंग्स</target>
@@ -691,17 +756,20 @@ The command is triggered if:
<target>स्थानीय सेटिंग्स निकालें</target>
<source>Clear local filter</source>
-<target>स्थानीय फ़िल्टर हटाएँ</target>
+<target>स्थानीय फ़िल्टर हटाएं</target>
<source>Copy</source>
<target>प्रतिलिपि</target>
<source>Paste</source>
-<target>चिपकाएँ</target>
+<target>चिपकाएं</target>
<source>Local Synchronization Settings</source>
<target>स्थानीय सिंक्रनाइज़ेशन सेटिंग्स</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>चुना फ़ोल्डर %x FreeFileSync के साथ प्रयोग नहीं किया जा सकता। कृपया स्थानीय फ़ाइल सिस्टम, नेट्वर्क या किसी MTP डिवाइस से फ़ोल्डर चुनें।</target>
+
<source>&New</source>
<target>नया (&N)</target>
@@ -727,7 +795,7 @@ The command is triggered if:
<target>सिंक्रनाइज़ेशन शुरू करें (&s)</target>
<source>&Actions</source>
-<target>कार्य (&A)</target>
+<target>क्रियाएँ (&A)</target>
<source>&Options</source>
<target>विकल्प (&O)</target>
@@ -771,6 +839,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>फ़ोल्डर जोडा निकालें</target>
+<source>Select SFTP folder</source>
+<target>SFTP फ़ोल्डर चुनें</target>
+
<source>Swap sides</source>
<target>पक्ष गमागम करें</target>
@@ -778,10 +849,10 @@ The command is triggered if:
<target>खोज पट्टी बंद करें</target>
<source>Find:</source>
-<target>ढूंढें :</target>
+<target>ढूंढें:</target>
<source>Match case</source>
-<target>केस मिलाएँ</target>
+<target>केस मिलाएं</target>
<source>New</source>
<target>नया</target>
@@ -796,13 +867,13 @@ The command is triggered if:
<target>इस रूप से सहेजें...</target>
<source>View type:</source>
-<target>दृश्य प्रकार :</target>
+<target>दृश्य प्रकार:</target>
<source>Select view:</source>
-<target>दृश्य चुनें :</target>
+<target>दृश्य चुनें:</target>
<source>Statistics:</source>
-<target>आंकड़े :</target>
+<target>आंकड़े:</target>
<source>Number of files and folders that will be deleted</source>
<target>जिन फ़ाइल्स और फ़ोलडर्स को हटाया जाएगा उनकी संख्या</target>
@@ -817,10 +888,10 @@ The command is triggered if:
<target>कॉपी करने के लिए कुल बाइट्स</target>
<source>Use local settings:</source>
-<target>स्थानीय सेटिंग्स का उपयोग करें :</target>
+<target>स्थानीय सेटिंग्स का उपयोग करें:</target>
<source>Select a variant:</source>
-<target>प्रकार चुने :</target>
+<target>प्रकार चुने:</target>
<source>Identify equal files by comparing modification time and size.</source>
<target>समान फ़ाइल्स पहचानने के लिए संशोधन समय और आकार की तुलना करें।</target>
@@ -828,8 +899,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>समान फ़ाइल्स पहचानने के लिए फ़ाइल सामग्री की तुलना करें।</target>
-<source>Ignore time shift (in hours)</source>
-<target>समय परिवर्तन अनदेखा करें (घंटों में)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>समय बदलाव (घंटों में) को अनदेखा करें (&I)</target>
<source>Consider file times with specified offset as equal</source>
<target>निर्दिष्ट खसका में फ़ाइल समयों को समान समझें</target>
@@ -837,73 +908,73 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>दिवालोक बचत समय (डेलाईट सेविंग टाइम) प्रहस्तन करें</target>
-<source>Include symbolic links:</source>
-<target>प्रतीकात्मक कडियां शामिल करें :</target>
+<source>Include &symbolic links:</source>
+<target>प्रतीकात्मक कड़ीयाँ शामिल करें (&s):</target>
-<source>Direct</source>
-<target>प्रत्यक्ष</target>
+<source>&Follow</source>
+<target>अनुसरण करें (&F)</target>
-<source>Follow</source>
-<target>अनुगमन करें</target>
+<source>&Direct</source>
+<target>प्रत्यक्ष (&D)</target>
<source>More information</source>
<target>अधिक जानकारी</target>
<source>Local settings:</source>
-<target>स्थानीय सेटिंग्स :</target>
+<target>स्थानीय सेटिंग्स:</target>
<source>Include:</source>
-<target>शामिल करें :</target>
+<target>शामिल करें:</target>
<source>Exclude:</source>
-<target>वर्जित करें :</target>
+<target>वर्जित करें:</target>
<source>Show examples</source>
-<target>उदाहरण दिखाएँ</target>
+<target>उदाहरण दिखाएं</target>
<source>Time span:</source>
-<target>समय अवधि :</target>
+<target>समय अवधि:</target>
<source>File size:</source>
-<target>फ़ाइल आकार :</target>
+<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>C&lear</source>
-<target>हटाएँ (&l)</target>
+<target>हटाएं (&l)</target>
<source>Detect moved files</source>
-<target>ले जाई गई फ़ाइल्स का पता लगाएँ</target>
+<target>ले जाई गई फ़ाइल्स का पता लगाएं</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- प्रारंभिक सिंक्रनाइज़ेशन के बाद पता लगाना सक्रिय
+- सभी फ़ाइल सिस्टम्स द्वारा समर्थित नहीं
- डेटाबेस फ़ाइल्स आवश्यक हैं और बनाता है
-- सभी फ़ाइल सिस्टम के द्वारा समर्थित नहीं
+- पहले सिंक्रनाइज़ेशन के लिए खोज उपलब्ध नहीं
</target>
<source>Detect synchronization directions with the help of database files</source>
-<target>डेटाबेस फ़ाइल्स की मदद से सिंक्रनाइज़ेशन दिशाओं का पता लगाएँ</target>
+<target>डेटाबेस फ़ाइल्स की मदद से सिंक्रनाइज़ेशन दिशाओं का पता लगाएं</target>
<source>Delete files:</source>
-<target>फ़ाइल्स हटाएँ :</target>
+<target>फ़ाइल्स हटाएं:</target>
<source>&Permanent</source>
<target>स्थायी (&P)</target>
<source>Delete or overwrite files permanently</source>
-<target>फ़ाइल्स स्थायी रूप से हटाएँ या अधिलेखित करें</target>
+<target>फ़ाइल्स स्थायी रूप से हटाएं या अधिलेखित करें</target>
<source>&Recycle bin</source>
<target>रीसायकल बिन (&R)</target>
@@ -915,22 +986,22 @@ The command is triggered if:
<target>संस्करण (&V)</target>
<source>Move files to a user-defined folder</source>
-<target>फ़ाइल्स उपयोगकर्ता-परिभाषित फ़ोल्डर में ले जाएँ</target>
+<target>फ़ाइल्स उपयोगकर्ता-परिभाषित फ़ोल्डर में ले जाएं</target>
<source>Naming convention:</source>
-<target>नामकरण नीति :</target>
+<target>नामकरण नीति:</target>
<source>Handle errors:</source>
-<target>त्रुटियां प्रहस्तन करें :</target>
+<target>त्रुटियां प्रहस्तन करें:</target>
<source>Hide all error and warning messages</source>
-<target>सभी त्रुटि और चेतावनी संदेशों को छुपाएँ</target>
+<target>सभी त्रुटि और चेतावनी संदेशों को छुपाएं</target>
<source>&Pop-up</source>
<target>पॉप-अप (&P)</target>
<source>Show pop-up on errors or warnings</source>
-<target>त्रुटियों या चेतावनियों पर पॉप-अप दिखाएँ</target>
+<target>त्रुटियों या चेतावनियों पर पॉप-अप दिखाएं</target>
<source>On completion:</source>
<target>समापन उपरांत:</target>
@@ -938,6 +1009,27 @@ The command is triggered if:
<source>OK</source>
<target>ठीक</target>
+<source>Enter your SFTP login details:</source>
+<target>आपके SFTP लॉगइन विवरण प्रविष्ट करें:</target>
+
+<source>Server name or IP address:</source>
+<target>सर्वर नाम या IP पता:</target>
+
+<source>Examples:</source>
+<target>उदाहरण:</target>
+
+<source>User name:</source>
+<target>उपयोगकर्ता नाम:</target>
+
+<source>Password:</source>
+<target>पासवर्ड:</target>
+
+<source>&Show password</source>
+<target>पासवर्ड दिखाएं (&S)</target>
+
+<source>Directory on server:</source>
+<target>सर्वर पर निर्देशिका:</target>
+
<source>Start synchronization now?</source>
<target>अब सिंक्रनाइज़ेशन शुरू करें?</target>
@@ -945,28 +1037,28 @@ The command is triggered if:
<target>प्रकार:</target>
<source>&Don't show this dialog again</source>
-<target>यह संवाद बॉक्स दोबारा न दिखाएँ (&D)</target>
+<target>यह संवाद बॉक्स दोबारा न दिखाएं (&D)</target>
<source>Arrange folder pair</source>
<target>फ़ोल्डर जोडा व्यवस्थित करें</target>
<source>Items found:</source>
-<target>आइटम बरामद :</target>
+<target>आइटम बरामद:</target>
<source>Time remaining:</source>
-<target>शेष समय :</target>
+<target>शेष समय:</target>
<source>Time elapsed:</source>
-<target>बीता समय :</target>
+<target>बीता समय:</target>
<source>Synchronizing...</source>
<target>सिंक्रनाइज़ हो रहा है...</target>
<source>Minimize to notification area</source>
-<target>अधिसूचना क्षेत्र में मिनिमाइज़ करें</target>
+<target>सूचना क्षेत्र में मिनिमाइज़ करें</target>
<source>Bytes copied:</source>
-<target>बाइट प्रतिलिपित :</target>
+<target>बाइट प्रतिलिपित:</target>
<source>Close</source>
<target>बंद करें</target>
@@ -978,7 +1070,7 @@ The command is triggered if:
<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>
+<target>उपस्थिति निरपेक्ष सिंक्रनाइज़ेशन के लिए बॅच फ़ाइल बनाएं। शुरू करने के लिए, किसी कार्य योजनाकार में यह फ़ाइल या अनुसूची डबल क्लिक करें: %x</target>
<source>&Stop</source>
<target>रोकें (&S)</target>
@@ -987,13 +1079,13 @@ The command is triggered if:
<target>पहली त्रुटि पर सिंक्रनाइज़ेशन रोकें</target>
<source>Run minimized</source>
-<target>छोटा (मिनिमाइज़) कर के चलाएँ</target>
+<target>छोटा (मिनिमाइज़) कर के चलाएं</target>
<source>Save log:</source>
-<target>लॉग सहेजें :</target>
+<target>लॉग सहेजें:</target>
<source>Limit:</source>
-<target>सीमा :</target>
+<target>सीमा:</target>
<source>Limit maximum number of log files</source>
<target>लॉग फ़ाइल्स की अधिकतम संख्या सीमित करें</target>
@@ -1035,31 +1127,34 @@ This guarantees a consistent state even in case of a serious error.
<target>फ़ाइल और फ़ोल्डर अनुमतियाँ स्थानांतर करें।</target>
<source>Automatic retry on error:</source>
-<target>त्रुटि पर स्वचालित पुनः प्रयास करें :</target>
+<target>त्रुटि पर स्वचालित पुनः प्रयास करें:</target>
<source>Retry count:</source>
-<target>पुनः प्रयास गणनांक :</target>
+<target>पुनः प्रयास गणनांक:</target>
<source>Delay (in seconds):</source>
<target>विलंब (सेकंड में):</target>
<source>Customize context menu:</source>
-<target>प्रासंगिक मेनू अनुकूलित करें :</target>
+<target>प्रासंगिक मेनू अनुकूलित करें:</target>
<source>Description</source>
<target>विवरण</target>
<source>Show hidden dialogs again</source>
-<target>छिपाये संवाद बक्से फिर से देखाएँ</target>
+<target>छिपाये संवाद बक्से फिर से देखाएं</target>
<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>स्थायी रूप से छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएँ</target>
+<target>स्थायी रूप से छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएं</target>
<source>&Default</source>
<target>डिफ़ॉल्ट (&D)</target>
<source>Source code written in C++ using:</source>
-<target>स्रोत कोड C++ में लिखा गया इनके प्रयोग से :</target>
+<target>स्रोत कोड C++ में लिखा गया इनके प्रयोग से:</target>
+
+<source>If you like FreeFileSync:</source>
+<target>यदि आपको FreeFileSync पसंद है:</target>
<source>Donate with PayPal</source>
<target>PayPal (पेपॉल) द्वारा दान करें</target>
@@ -1077,13 +1172,16 @@ This guarantees a consistent state even in case of a serious error.
<target>जीएनयू जनरल पब्लिक लाइसेंस (GNU General Public License) के अंतर्गत प्रकाशित</target>
<source>Many thanks for localization:</source>
-<target>स्थानीयकरण के लिए अनेक आभार :</target>
+<target>स्थानीयकरण के लिए अनेक आभार:</target>
+
+<source>SSH File Transfer Protocol</source>
+<target>SSH फ़ाइल स्थानांतरण प्रोटोकॉल</target>
<source>Save as Batch Job</source>
<target>बॅच जॉब के रूप में सहेजें</target>
<source>Delete Items</source>
-<target>आइटम हटाएँ</target>
+<target>आइटम हटाएं</target>
<source>Options</source>
<target>विकल्प</target>
@@ -1091,8 +1189,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>समय अवधि चुनें</target>
-<source>&Preferences...</source>
-<target>प्राथमिकताएँ (&P)...</target>
+<source>&Preferences</source>
+<target>प्राथमिकताएँ (&P)</target>
<source>Main Bar</source>
<target>मुख्य पट्टी</target>
@@ -1155,16 +1253,16 @@ This guarantees a consistent state even in case of a serious error.
</target>
<source>Set direction:</source>
-<target>दिशा सेट करें :</target>
+<target>दिशा सेट करें:</target>
<source>multiple selection</source>
<target>एकाधिक चयन</target>
<source>Include via filter:</source>
-<target>फ़िल्टर के द्वारा शामिल करें :</target>
+<target>फ़िल्टर के द्वारा शामिल करें:</target>
<source>Exclude via filter:</source>
-<target>फ़िल्टर के द्वारा अपवर्जित करें :</target>
+<target>फ़िल्टर के द्वारा अपवर्जित करें:</target>
<source>Include temporarily</source>
<target>अस्थायी रूप से शामिल करें</target>
@@ -1173,7 +1271,7 @@ This guarantees a consistent state even in case of a serious error.
<target>अस्थायी रूप से अपवर्जित करें</target>
<source>Delete</source>
-<target>हटाएँ</target>
+<target>हटाएं</target>
<source>Include all</source>
<target>सभी शामिल करें</target>
@@ -1182,7 +1280,7 @@ This guarantees a consistent state even in case of a serious error.
<target>सभी अपवर्जित करें</target>
<source>Show icons:</source>
-<target>चिन्ह दिखाएँ :</target>
+<target>चिन्ह दिखाएं:</target>
<source>Small</source>
<target>छोटा</target>
@@ -1197,7 +1295,7 @@ This guarantees a consistent state even in case of a serious error.
<target>समय अवधि चुनें...</target>
<source>Show "%x"</source>
-<target>"%x" दिखाएँ</target>
+<target>"%x" दिखाएं</target>
<source>Last session</source>
<target>पिछला सत्र</target>
@@ -1220,62 +1318,62 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>नहीं सहेजें (&n)</target>
-<source>Delete selected configurations</source>
-<target>चुना कॉन्फ़िगरेशन हटाएँ</target>
+<source>Remove entry from list</source>
+<target>सूचि से प्रविष्टि निकालें</target>
<source>Synchronization Settings</source>
<target>सिंक्रनाइज़ेशन सेटिंग्स</target>
<source>Clear filter</source>
-<target>फ़िल्टर हटाएँ</target>
+<target>फ़िल्टर हटाएं</target>
<source>Show files that exist on left side only</source>
-<target>केवल बाईं तरफ़ मौजूद फ़ाइल्स दिखाएँ</target>
+<target>केवल बाईं तरफ़ मौजूद फ़ाइल्स दिखाएं</target>
<source>Show files that exist on right side only</source>
-<target>केवल दाईं तरफ़ मौजूद फ़ाइल्स दिखाएँ</target>
+<target>केवल दाईं तरफ़ मौजूद फ़ाइल्स दिखाएं</target>
<source>Show files that are newer on left</source>
-<target>नवीन फ़ाइल्स को बाईं तरफ़ दिखाएँ</target>
+<target>नवीन फ़ाइल्स को बाईं तरफ़ दिखाएं</target>
<source>Show files that are newer on right</source>
-<target>नवीन फ़ाइल्स को दाईं तरफ़ दिखाएँ</target>
+<target>नवीन फ़ाइल्स को दाईं तरफ़ दिखाएं</target>
<source>Show files that are equal</source>
-<target>समान फ़ाइल्स दिखाएँ</target>
+<target>समान फ़ाइल्स दिखाएं</target>
<source>Show files that are different</source>
-<target>असमान फ़ाइल्स दिखाएँ</target>
+<target>असमान फ़ाइल्स दिखाएं</target>
<source>Show conflicts</source>
-<target>विरोध दिखाएँ</target>
+<target>विरोध दिखाएं</target>
<source>Show files that will be created on the left side</source>
-<target>जो फ़ाइल्स बनाई जाएंगी वो बाईं तरफ़ दिखाएँ</target>
+<target>जो फ़ाइल्स बनाई जाएंगी वो बाईं तरफ़ दिखाएं</target>
<source>Show files that will be created on the right side</source>
-<target>जो फ़ाइल्स बनाई जाएंगी वो दाईं तरफ़ दिखाएँ</target>
+<target>जो फ़ाइल्स बनाई जाएंगी वो दाईं तरफ़ दिखाएं</target>
<source>Show files that will be deleted on the left side</source>
-<target>जो फ़ाइल्स हटाई जाएंगी वो बाईं तरफ़ दिखाएँ</target>
+<target>जो फ़ाइल्स हटाई जाएंगी वो बाईं तरफ़ दिखाएं</target>
<source>Show files that will be deleted on the right side</source>
-<target>जो फ़ाइल्स हटाई जाएंगी वो दाईं तरफ़ दिखाएँ</target>
+<target>जो फ़ाइल्स हटाई जाएंगी वो दाईं तरफ़ दिखाएं</target>
<source>Show files that will be updated on the left side</source>
-<target>जिन फ़ाइल्स का अद्यतन होगा वो बाईं तरफ़ दिखाएँ</target>
+<target>जिन फ़ाइल्स का अद्यतन होगा वो बाईं तरफ़ दिखाएं</target>
<source>Show files that will be updated on the right side</source>
-<target>जिन फ़ाइल्स का अद्यतन होगा वो दाईं तरफ़ दिखाएँ</target>
+<target>जिन फ़ाइल्स का अद्यतन होगा वो दाईं तरफ़ दिखाएं</target>
<source>Show files that won't be copied</source>
-<target>जिन फ़ाइल्स की प्रतिलिपि नहीं बनेगी वो दिखाएँ</target>
+<target>जिन फ़ाइल्स की प्रतिलिपि नहीं बनेगी वो दिखाएं</target>
<source>Show filtered or temporarily excluded files</source>
-<target>फ़िल्टर किए या अस्थायी रूप से अपवर्जित फ़ाइल्स दिखाएँ</target>
+<target>फ़िल्टर किए या अस्थायी रूप से अपवर्जित फ़ाइल्स दिखाएं</target>
-<source>Set as default</source>
-<target>डिफ़ॉल्ट के रूप में सेट करें</target>
+<source>Save as default</source>
+<target>डिफ़ॉल्ट के रूप में सहेजें</target>
<source>Filter</source>
<target>फ़िल्टर</target>
@@ -1353,7 +1451,7 @@ This guarantees a consistent state even in case of a serious error.
</target>
<source>Move</source>
-<target>ले जाएँ</target>
+<target>ले जाएं</target>
<source>
<pluralform>Do you really want to delete the following item?</pluralform>
@@ -1367,11 +1465,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>प्राथमिकताएँ</target>
-<source>Copy NTFS permissions</source>
-<target>NTFS अनुमतियाँ प्रतिलिपित करें</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<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 name</source>
<target>- पूर्ण फ़ाइल या फ़ोल्डर का नाम</target>
@@ -1386,16 +1484,16 @@ This guarantees a consistent state even in case of a serious error.
<target>- %item_folder% के लिए दूसरी तरफ़ का समकक्ष</target>
<source>Show hidden dialogs and warning messages again?</source>
-<target>छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएँ?</target>
+<target>छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएं?</target>
<source>&Show</source>
-<target>दिखाएँ (&S)</target>
+<target>दिखाएं (&S)</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>
+<target>मिलाए जाने वाले दाए फ़ोल्डर के अनुकूल बाए फ़ोल्डर का प्रतिबिंबित बैकअप बनाएं।</target>
<source>Copy new and updated files to the right folder.</source>
<target>नए और अद्यतित फ़ाइल्स दाए फ़ोल्डर में प्रतिलिपित करें।</target>
@@ -1431,7 +1529,7 @@ This guarantees a consistent state even in case of a serious error.
<target>बदलें</target>
<source>Move files and replace if existing</source>
-<target>फ़ाइल्स ले जाएँ और मौजूद हों तो अधिलेखित करें</target>
+<target>फ़ाइल्स ले जाएं और मौजूद हों तो अधिलेखित करें</target>
<source>Time stamp</source>
<target>समय मोहर</target>
@@ -1463,27 +1561,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>प्रतिशत</target>
+<source>Unable to register to receive system messages.</source>
+<target>सिस्टम संदेशों को प्राप्त करने के लिए पंजीकृत करने में असमर्थ।</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>%x के लिए डिवाइस सूचनाएँ पंजिकृत करने में असमर्थ।</target>
+
<source>Cannot monitor directory %x.</source>
<target>निर्देशिका %x की निगरानी कर नहीं सकते।</target>
-<source>Cannot delete file %x.</source>
-<target>फ़ाइल %x हटा नहीं सकते।</target>
-
<source>The file is locked by another process:</source>
-<target>फ़ाइल किसी अन्य प्रक्रिया द्वारा अवरोधित है :</target>
-
-<source>Cannot move file %x to %y.</source>
-<target>फ़ाइल %x से %y ले जा नाहीं सकते।</target>
-
-<source>Cannot delete directory %x.</source>
-<target>निर्देशिका %x हटा नहीं सकते।</target>
+<target>फ़ाइल किसी अन्य प्रक्रिया द्वारा अवरोधित है:</target>
<source>Cannot write file attributes of %x.</source>
<target>%x के फ़ाइल गुण लिख नहीं सकते।</target>
-<source>Cannot write modification time of %x.</source>
-<target>%x का संशोधन समय लिख नहीं सकते।</target>
-
<source>Cannot read security context of %x.</source>
<target>%x का सुरक्षा संदर्भ पढ़ नहीं सकते।</target>
@@ -1493,18 +1585,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>%x की अनुमतियां पढ़ नहीं सकते।</target>
-<source>Cannot write permissions of %x.</source>
-<target>%x की अनुमतियां लिख नहीं सकते।</target>
-
<source>Cannot copy permissions from %x to %y.</source>
<target>%x से %y अनुमतियां प्रतिलिपित नहीं कर सकते।</target>
-<source>Cannot create directory %x.</source>
-<target>%x निर्देशिका बना नहीं सकते।</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>सिंबॉलिक लिंक %x से %y प्रतिलिपित नहीं कर सकते।</target>
-
<source>Cannot find system function %x.</source>
<target>सिस्टम फ़ंकशन %x ढूंढ नहीं सकते।</target>
@@ -1515,10 +1598,7 @@ This guarantees a consistent state even in case of a serious error.
<target>फ़ाइल %x से %y प्रतिलिपित नहीं कर सकते।</target>
<source>Type of item %x is not supported:</source>
-<target>%x प्रकार का आइटम समर्थित नहीं है :</target>
-
-<source>Cannot open file %x.</source>
-<target>%x फ़ाइल को खोलने में असमर्थ।</target>
+<target>%x प्रकार का आइटम समर्थित नहीं है:</target>
<source>%x TB</source>
<target>%x TB</target>
@@ -1553,9 +1633,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x दिन</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>सिस्टम संदेशों को प्राप्त करने के लिए पंजीकृत करने में असमर्थ।</target>
-
<source>Cannot set privilege %x.</source>
<target>विशेषाधिकार %x सेट नहीं कर सकते।</target>
@@ -1565,23 +1642,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>प्रक्रिया I/O प्राथमिकताओं को बदल नहीं सकते।</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>%x को रीसायकल बिन ले जाने में असमर्थ।</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>फ़ोल्डर %x के लिए रीसायकल बिन की जाँच विफल।</target>
-<source>Cannot determine final path for %x.</source>
-<target>%x का अंतिम पथ निर्धारित नहीं कर सकते।</target>
-
-<source>Error Code %x:</source>
-<target>त्रुटि कोड %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>निम्न XML तत्व पढ़ नहीं सकते :</target>
+<source>The following XML elements could not be read:</source>
+<target>निम्न XML तत्वों को पढा नहीं जा सका:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>कॉन्फ़िगरेशन फ़ाइल %x आंशिक रूप से ही लोड हुई है।</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>
@@ -1590,7 +1658,7 @@ This guarantees a consistent state even in case of a serious error.
<target>जिन घटकों को आप स्थापित करना चाहते हैं उन्हें चुनें।</target>
<source>Select installation type:</source>
-<target>स्थापना प्रकार चुनें :</target>
+<target>स्थापना प्रकार चुनें:</target>
<source>Local</source>
<target>स्थानीय</target>
@@ -1608,7 +1676,7 @@ This guarantees a consistent state even in case of a serious error.
<target>FreeFileSync फ़ाइल ऐक्सटेंशंस पंजिकृत करें</target>
<source>Create Explorer context menu entries</source>
-<target>एक्सप्लोरर प्रसंग मेनू प्रविष्टियां बनाएँ</target>
+<target>एक्सप्लोरर प्रसंग मेनू प्रविष्टियां बनाएं</target>
<source>Save settings in installation directory</source>
<target>स्थापना निर्देशिका में सेटिंग्ज़ सहेजें</target>
@@ -1620,10 +1688,10 @@ This guarantees a consistent state even in case of a serious error.
<target>फ़ाइल्स केवल प्रतिलिपित करें</target>
<source>Choose a directory for installation:</source>
-<target>स्थापना के लिए निर्देशिका चुनें :</target>
+<target>स्थापना के लिए निर्देशिका चुनें:</target>
<source>Create shortcuts:</source>
-<target>शॉर्टकट्‍स बनाएँ :</target>
+<target>शॉर्टकट्‍स बनाएं:</target>
<source>Desktop</source>
<target>डेस्कटॉप</target>
diff --git a/FreeFileSync/Build/Languages/hungarian.lng b/FreeFileSync/Build/Languages/hungarian.lng
index 1e8b0bc7..aedfeffd 100644
--- a/FreeFileSync/Build/Languages/hungarian.lng
+++ b/FreeFileSync/Build/Languages/hungarian.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Szintaktikai hiba</target>
-<source>Cannot open file %x.</source>
-<target>%x fájl nem nyitható.</target>
+<source>Cannot find file %x.</source>
+<target>Nem található a %x fájl.</target>
<source>File %x does not contain a valid configuration.</source>
<target>%x fájl nem tartalmaz érvényes beállításokat.</target>
@@ -68,7 +68,7 @@
<target>A konfigurációs fájl nem tartalmazhat beállításokat könyvár-pár szinten, ha a könyvtárakat parancssorban állítjuk be.</target>
<source>Directories cannot be set for more than one configuration file.</source>
-<target>A könyvtárakat nem lehet egynél több konfigurációs fájlra beállítani</target>
+<target>A könyvtárakat nem lehet egynél több konfigurációs fájlra beállítani.</target>
<source>Command line</source>
<target>Parancssor</target>
@@ -89,13 +89,13 @@
<target>Útvonal egy alternatív GlobalSettings.xml fájlhoz.</target>
<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
-<target>Tetszőleges számú .ffs_gui és/vagy .ffs_batch konfigurációs fájl készíthető a FreeFileSync-hez</target>
+<target>Tetszőleges számú .ffs_gui és/vagy .ffs_batch konfigurációs fájl készíthető a FreeFileSync-hez.</target>
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Tetszőleges számú alternatív könyvtár-pár legfeljebb egy konfigurációs fájlban.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Nyisd meg a konfigurációt szerkesztésre végrehajtás nélkül.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Nyissa meg a konfigurációt szerkesztésre annak végrehajtása nélkül.</target>
<source>Cannot find the following folders:</source>
<target>A következő könyvtárak nem találhatóak:</target>
@@ -125,13 +125,13 @@
<target>Méret:</target>
<source>Content comparison was skipped for excluded files %x.</source>
-<target>A tartalom összehasonlítását átugrotta a(z) %x kizárt fájlok esetében</target>
+<target>%x kizárt fájlok esetében a tartalom összehasonlítását átugrotta.</target>
<source>Items differ in attributes only</source>
<target>Az elemek csak attribútumaikban különböznek</target>
<source>Resolving symbolic link %x</source>
-<target>A %x szimbolikus hivatkozás feloldása</target>
+<target>%x szimbolikus hivatkozás feloldása</target>
<source>Comparing content of files %x</source>
<target>%x fájlok tartalmának összehasonlítása</target>
@@ -194,7 +194,7 @@
<target>Jobb oldal frissítése</target>
<source>Do nothing</source>
-<target>Nincs mit csinálni</target>
+<target>Nincs mit végrehajtani</target>
<source>Update attributes on left</source>
<target>Attribútumok frissítése a bal oldalon</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>Attribútumok frissítése a jobb oldalon</target>
+<source>Cannot read file %x.</source>
+<target>%x fájl olvasása nem sikerült.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Az adatfolyam mérete eltér a várttól
+Várt: %x bájt
+Jelenlegi: %y bájt
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>%x jogosultságait nem lehet felírni.</target>
+
+<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 fájl írása nem sikerült.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>%x szimbolikus linket nem tudja %y-ba másolni.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Nem sikerült %x fájl mozgatása %y fájlba.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>%x könyvtárat nem sikerült besorolni.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x fájl attribútumainak olvasása nem sikerült.</target>
+
+<source>Cannot find %x.</source>
+<target>%x nem található.</target>
+
+<source>Cannot open file %x.</source>
+<target>%x fájl nem nyitható.</target>
+
+<source>Cannot find device %x.</source>
+<target>%x eszköz nem található.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>%x-en nem lehet a szabad tárterületet meghatározni.</target>
+
+<source>Cannot create directory %x.</source>
+<target>%x könyvtár létrehozása nem sikerült.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>%x könyvtár törlése nem sikerült.</target>
+
+<source>Cannot delete file %x.</source>
+<target>%x fájl törlése nem sikerült.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>%x esetében nem sikerült felírni az utolsó módosítás dátumát.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>%x számára nem lehet a végső útvonalat meghatározni.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>%x szimbolikus hivatkozás feloldása nem sikerült.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>%x nem helyezhető a Lomtárba.</target>
+
+<source>Cannot open directory %x.</source>
+<target>%x könyvtár megnyitása nem sikerült.</target>
+
+<source>Incorrect command line:</source>
+<target>Hibás parancssor:</target>
+
+<source>Error Code %x:</source>
+<target>Hibakód %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Nem sikerült csatlakozni a(z) %x SFTP szerverhez.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +315,14 @@
<source>Database file is corrupt:</source>
<target>Sérült adatbázisfájl:</target>
-<source>Cannot write file %x.</source>
-<target>A következő fájl írása nem sikerült: %x.</target>
-
-<source>Cannot read file %x.</source>
-<target>A következő fájl olvasása nem sikerült: %x.</target>
-
<source>Database files do not share a common session.</source>
<target>Az adatbázisfájloknak nincs közös munkafolyamatuk.</target>
<source>Searching for folder %x...</source>
<target>%x könyvtár keresése...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>%x fájl attribútumainak olvasása nem sikerült.</target>
+<source>Time out 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 processz-információkat.</target>
@@ -275,7 +349,7 @@
<target>%x fájl létrehozása</target>
<source>Saving file %x...</source>
-<target>%x fájl mentése</target>
+<target>%x fájl mentése...</target>
<source>Items processed:</source>
<target>Feldolgozott elemek száma:</target>
@@ -326,10 +400,10 @@
<target>Kérjük, használd a FreeFileSync 64 bites verzióját az árnyékmásolatok készítéséhez ezen a rendszeren.</target>
<source>Cannot determine volume name for %x.</source>
-<target>Nem lehet meghatározni a kötet-nevet a(z) %x számára</target>
+<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 fájl elérési útvonalnak</target>
+<target>%x kötet-név nem része a(z) %y fájl elérési útvonalának.</target>
<source>Stop requested: Waiting for current operation to finish...</source>
<target>Megállás szükséges: várakozás a jelenlegi művelet befejezésére...</target>
@@ -337,6 +411,15 @@
<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>
+
<source>&Open...</source>
<target>&Megnyitás...</target>
@@ -385,9 +468,6 @@
<source>Browse</source>
<target>Tallóz</target>
-<source>Select a folder</source>
-<target>Könyvtárat kiválaszt</target>
-
<source>Idle time (in seconds):</source>
<target>Üresjárat időtartama (másodperc):</target>
@@ -441,9 +521,6 @@ A parancs végrehajtódik, ha:
<source>&Quit</source>
<target>&Kilépés</target>
-<source>Incorrect command line:</source>
-<target>Hibás parancssor:</target>
-
<source>&Retry</source>
<target>&Ismét</target>
@@ -466,7 +543,7 @@ A parancs végrehajtódik, ha:
<target>Egyedi</target>
<source>Multiple...</source>
-<target>Sokszoroz</target>
+<target>Sokszoroz...</target>
<source>Moving file %x to %y</source>
<target>%x fájl mozgatása ide: %y</target>
@@ -498,18 +575,18 @@ A parancs végrehajtódik, ha:
<source>Updating attributes of %x</source>
<target>%x attribútumainak frissítése</target>
-<source>Creating a Volume Shadow Copy for %x...</source>
-<target>Készít egy árnyékmásolat-kötetet %x számára</target>
+<source>%x and %y have different content.</source>
+<target>%x és %y tartalma különböző.</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Adat-ellenőrzési hiba: %x és %y tartalma különböző.</target>
+<source>Data verification error:</source>
+<target>Adat ellenőrzési hiba:</target>
+
+<source>Creating a Volume Shadow Copy for %x...</source>
+<target>Árnyékmásolat-kötetet készít %x számára...</target>
<source>Target folder %x already existing.</source>
<target>%x célkönyvtár már létezik.</target>
-<source>Cannot find folder %x.</source>
-<target>%x könyvtárat nem találom.</target>
-
<source>Target folder input field must not be empty.</source>
<target>A célkönyvtárat meghatározó beviteli mező nem lehet üres.</target>
@@ -520,10 +597,10 @@ A parancs végrehajtódik, ha:
<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ő elemek feloldatlan ütközést tartalmaznak, így nem lesznek szinkronizálva:</target>
+<target>A következő tételek feloldatlan ütközést tartalmaznak, így nem lesznek szinkronizálva:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>A következő könyvtárak lényegileg különböznek. Győződjön meg róla, hogy a megfelelő könyvtárakat illesztette-e össze szinkronizáláshoz.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Az érintett könyvtárak lényegileg különbözőek. Győződjön meg arról, hogy a megfelelő könyvtárakat választotta ki szinkronizálásra.</target>
<source>Not enough free disk space available in:</source>
<target>Nincs elég szabad lemezterület:</target>
@@ -549,12 +626,18 @@ A parancs végrehajtódik, ha:
<source>Synchronization stopped</source>
<target>Szinkronizálás leállítva</target>
+<source>Stopped</source>
+<target>Leállítva</target>
+
<source>Synchronization completed with errors</source>
<target>A szinkronizálás befejeződött, de történtek hibák</target>
<source>Synchronization completed with warnings</source>
<target>A szinkronizálás befejeződött, de figyelmeztetésekkel</target>
+<source>Warning</source>
+<target>Figyelmeztetés</target>
+
<source>Nothing to synchronize</source>
<target>Nincs mit szinkronizálni</target>
@@ -562,10 +645,7 @@ A parancs végrehajtódik, ha:
<target>A szinkronizálás sikeresen befejeződött</target>
<source>Cleaning up old log files...</source>
-<target>Régi log fájlok törlése</target>
-
-<source>Stopped</source>
-<target>Leállítva</target>
+<target>Régi log fájlok törlése...</target>
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>E jelenség megoldásához kapcsoljon át a FreeFileSync fő ablakába.</target>
@@ -616,7 +696,7 @@ A parancs végrehajtódik, ha:
<target>A FreeFileSync naprakész.</target>
<source>Unable to connect to www.freefilesync.org.</source>
-<target>Nem tudok csatlakozni a www.freefilesync.org-hoz</target>
+<target>Nem lehet csatlakozni a www.freefilesync.org-hoz.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Nem lehet online megtalálni a jelenlegi FreeFileSync verziószámot. Meg akarod keresni manuálisan?</target>
@@ -657,9 +737,6 @@ A parancs végrehajtódik, ha:
<source>Action</source>
<target>Művelet</target>
-<source>Drag && drop</source>
-<target>Húzd && Ejtsd</target>
-
<source>Local comparison settings</source>
<target>Helyi összehasonlítási beállítások</target>
@@ -690,6 +767,9 @@ A parancs végrehajtódik, ha:
<source>Local Synchronization Settings</source>
<target>Helyi Szinkronizálási Beállítások</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>A választott %x könyvtárat nem lehet a FreeFileSyc-kel használni. Válasszon egy könyvtárat a helyi fájlrendszerben, hálózaton vagy egy MTP-t használó eszközön.</target>
+
<source>&New</source>
<target>&Új</target>
@@ -759,6 +839,9 @@ A parancs végrehajtódik, ha:
<source>Remove folder pair</source>
<target>Távolítsa el a könyvtár-párt</target>
+<source>Select SFTP folder</source>
+<target>Válassza ki az SFTP könyvtárat</target>
+
<source>Swap sides</source>
<target>Cserélje fel az oldalakat</target>
@@ -816,8 +899,8 @@ A parancs végrehajtódik, ha:
<source>Identify equal files by comparing the file content.</source>
<target>Tartalom összehasonlítása alapján azonosítsa az azonos fájlokat.</target>
-<source>Ignore time shift (in hours)</source>
-<target>(óra) időkülönbséget figyelmen kívül hagy</target>
+<source>&Ignore time shift (in hours)</source>
+<target>Óra időeltolást hagyjon f&igyelmen kívül</target>
<source>Consider file times with specified offset as equal</source>
<target>A meghatározott eltolású fájlidőket egyenlőnek tekinti</target>
@@ -825,14 +908,14 @@ A parancs végrehajtódik, ha:
<source>Handle daylight saving time</source>
<target>Kezelje a nyári időszámítás különbségét</target>
-<source>Include symbolic links:</source>
-<target>Csatolja a szimbolikus linkeket:</target>
+<source>Include &symbolic links:</source>
+<target>Tartalmazza a &szimbolikus linkeket:</target>
-<source>Direct</source>
-<target>Közvetlen</target>
+<source>&Follow</source>
+<target>&Folytassa</target>
-<source>Follow</source>
-<target>Követ</target>
+<source>&Direct</source>
+<target>&Direkt</target>
<source>More information</source>
<target>További információ</target>
@@ -871,14 +954,14 @@ A parancs végrehajtódik, ha:
<target>Érzékelje a mozgatott fájlokat</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Az érzékelés a kezdeti szinkronizálás után aktív
-- Adatbázisok fájlokat hoz létre és használ
- Nem minden fájlrendszer támogatja
+- Adatbázis fájlokat igényel és készít
+- Az érzékelés az első szinkronizálásnál nem biztosított
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -926,6 +1009,27 @@ A parancs végrehajtódik, ha:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Adja meg SFTP bejelentkezésének részletei:</target>
+
+<source>Server name or IP address:</source>
+<target>Szerver neve vagy IP címe:</target>
+
+<source>Examples:</source>
+<target>Példák:</target>
+
+<source>User name:</source>
+<target>Felhasználó név:</target>
+
+<source>Password:</source>
+<target>Jelszó:</target>
+
+<source>&Show password</source>
+<target>Muta&ssa a jelszót</target>
+
+<source>Directory on server:</source>
+<target>Könyvtár az alábbi szerveren:</target>
+
<source>Start synchronization now?</source>
<target>Megkezdje a szinkronizálást?</target>
@@ -935,6 +1039,9 @@ A parancs végrehajtódik, ha:
<source>&Don't show this dialog again</source>
<target>&Ne mutassa ismételten ezt a párbeszédablakot</target>
+<source>Arrange folder pair</source>
+<target>Rendezze a könyvtár-párt</target>
+
<source>Items found:</source>
<target>Talált elemek száma:</target>
@@ -1067,6 +1174,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Many thanks for localization:</source>
<target>Köszönet a lokalizációért:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH fájlátviteli protokoll</target>
+
<source>Save as Batch Job</source>
<target>Mentse kötegelt feladatként</target>
@@ -1079,8 +1189,11 @@ 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>&Preferences...</source>
-<target>&Beállítások...</target>
+<source>&Preferences</source>
+<target>&Preferenciák</target>
+
+<source>Main Bar</source>
+<target>Fő sáv</target>
<source>Folder Pairs</source>
<target>Könyvtár-párok</target>
@@ -1097,9 +1210,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Overview</source>
<target>Áttekintés</target>
-<source>Main Bar</source>
-<target>Fő sáv</target>
-
<source>Confirm</source>
<target>Jóváhagy</target>
@@ -1149,10 +1259,10 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<target>többszörös kijelölés</target>
<source>Include via filter:</source>
-<target>A szűrőt figyelembe véve adja hozzá</target>
+<target>Adja hozzá a következő szűrő igénybe vételével:</target>
<source>Exclude via filter:</source>
-<target>Zárja ki szűrő segítségével:</target>
+<target>Zárja ki következő szűrő igénybe vételével:</target>
<source>Include temporarily</source>
<target>Csatolja ideiglenesen</target>
@@ -1208,8 +1318,8 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Do&n't save</source>
<target>&ne mentse</target>
-<source>Delete selected configurations</source>
-<target>Törölje a kiválasztott beállításokat</target>
+<source>Remove entry from list</source>
+<target>Törölje a bejegyzést a listáról</target>
<source>Synchronization Settings</source>
<target>Szinkronizálási beállítások</target>
@@ -1262,8 +1372,8 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Show filtered or temporarily excluded files</source>
<target>Mutassa a szűrt vagy ideiglenesen kizárt fájlokat</target>
-<source>Set as default</source>
-<target>Beállítás alapértelmezettként</target>
+<source>Save as default</source>
+<target>Mentse mint alapértelmezést</target>
<source>Filter</source>
<target>Szűrő</target>
@@ -1274,6 +1384,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Cannot find %x</source>
<target>Nem található: %x</target>
+<source>Move up</source>
+<target>Mozgassa felfelé</target>
+
+<source>Move down</source>
+<target>Mozgassa lefelé</target>
+
<source>Comma-separated values</source>
<target>Vesszővel elválasztott értékek (CSV)</target>
@@ -1286,18 +1402,15 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Close progress dialog</source>
<target>Zárja be a folyamatjelző párbeszédablakot</target>
-<source>Standby</source>
-<target>Készenléti állapot</target>
-
<source>Log off</source>
<target>Kijelentkezik</target>
+<source>Standby</source>
+<target>Készenléti állapot</target>
+
<source>Shut down</source>
<target>Leállítja a gépet</target>
-<source>Hibernate</source>
-<target>Hibernál</target>
-
<source>Scanning...</source>
<target>Vizsgálat folyamatban...</target>
@@ -1307,9 +1420,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Info</source>
<target>Információ</target>
-<source>Warning</source>
-<target>Figyelmeztetés</target>
-
<source>Select all</source>
<target>Összeset kiválasztja</target>
@@ -1355,8 +1465,8 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Preferences</source>
<target>Beállítások</target>
-<source>Copy NTFS permissions</source>
-<target>Másolja az NTFS jogosultságokat</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Másolja át DACL-t, SACL-t, tulajdonost és csoportot</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integráljon a helyi menübe külső alkalmazásokat. A következő makrók érhetők el:</target>
@@ -1383,13 +1493,13 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<target>Változások keresése és bemutatása mindkét oldalon. A törléseket, mozgatásokat és ütközéseket automatikusan ismeri fel egy adatbázis segítségével.</target>
<source>Create a mirror backup of the left folder by adapting the right folder to match.</source>
-<target>A baloldali könyvtár tükörmásolatát készíti el úgy, hogy a jobb oldali könyvtár egyezzen meg</target>
+<target>A baloldali könyvtár tükörmásolatát készíti el úgy, hogy a jobb oldali könyvtár egyezzen meg.</target>
<source>Copy new and updated files to the right folder.</source>
<target>Másolja az új és módosult fájlokat a jobb oldali könyvtárba.</target>
<source>Configure your own synchronization rules.</source>
-<target>Állítsd be a saját szinkronizálási szabályaidat</target>
+<target>Állítsa be a saját szinkronizálási szabályait.</target>
<source>Today</source>
<target>Mai</target>
@@ -1451,47 +1561,38 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Percentage</source>
<target>Százalék</target>
-<source>Cannot monitor directory %x.</source>
-<target>Nem sikerült monitorozni a(z) %x könyvtárat.</target>
+<source>Unable to register to receive system messages.</source>
+<target>Nem tud regisztrálni hogy megkapja a rendszerüzeneteket.</target>
-<source>Cannot delete file %x.</source>
-<target>Nem sikerült a(z) %x fájl törlése.</target>
+<source>Unable to register device notifications for %x.</source>
+<target>%x-hez nem lehet eszköz-értesítéseket regisztrálni.</target>
+
+<source>Cannot monitor directory %x.</source>
+<target>%x könyvtárat nem sikerült monitorozni.</target>
<source>The file is locked by another process:</source>
<target>A fájlt egy másik processz zárolta:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Nem sikerült %x fájl mozgatása %y fájlba.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Nem sikerült a %x könyvtár törlése.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Nem sikerült %x fájl attribútumainak írása.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Nem sikerült felírni az utolsó módosítás dátumát a következőnél: %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Nem sikerült a biztonsági környezet olvasása a következőnél: %x.</target>
<source>Cannot write security context of %x.</source>
-<target>Nem sikerült a biztonsági környezet írása a következőnél: %x.</target>
+<target>%x esetében nem sikerült a biztonsági környezet írása.</target>
<source>Cannot read permissions of %x.</source>
-<target>Nem sikerült a jogosultságok olvasása a következőnél: %x.</target>
+<target>%x esetében nem sikerült a jogosultságok olvasása.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Nem sikerült a jogosultságok írása a következőnél: %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Nem sikerült a következő könyvtár létrehozása: %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Nem tudja másolni a(z) %x szimbolikus linket %y-ba.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Nem lehet az jogosultságokat %x-ből %y-ba másolni.</target>
<source>Cannot find system function %x.</source>
-<target>Nem található a következő rendszerfunkció: %x.</target>
+<target>%x rendszerfunkció nem elérhető.</target>
+
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Nem lehet az attribútumokat %x-ből %y-ba másolni.</target>
<source>Cannot copy file %x to %y.</source>
<target>%x fájl másolása a(z) %y fájlba nem sikerült.</target>
@@ -1499,15 +1600,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Type of item %x is not supported:</source>
<target>A(z) %x elem típusa nem támogatott:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Nem sikerült a következő szimbolikus hivatkozás feloldása: %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>A %x könyvtár megnyitása nem sikerült.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Nem sikerült besorolni a(z) %x könyvtárat.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1541,9 +1633,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<pluralform>%x nap</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Nem tud regisztrálni hogy megkapja a rendszerüzeneteket.</target>
-
<source>Cannot set privilege %x.</source>
<target>A következő privilégium beállítása sikertelen: %x.</target>
@@ -1553,29 +1642,20 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Cannot change process I/O priorities.</source>
<target>Nem sikerült a folyamatok I/O prioritását megváltoztatni.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>%x nem helyezhető a Lomtárba</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>A lomtár ellenőrzése meghiúsult a(z) %x könyvtár esetében.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Nem lehet meghatározni a végső útvonalat a(z) %x számára.</target>
-
-<source>Error Code %x:</source>
-<target>Hibakód %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Nem sikerült a következő XML elemek olvasása:</target>
+<source>The following XML elements could not be read:</source>
+<target>A következő XML elemeket nem lehet olvasni:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>%x konfigurációs fájl csak részlegesen töltődött be.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>A %x konfigurációs fájl nem teljes. A hiányzó elemeket az alapértelmezés szerinti értékekkel helyettesíti.</target>
<source>Prepare installation</source>
<target>Telepítés előkészítése</target>
<source>Choose which components you want to install.</source>
-<target>Válassza ki, mely komponenseket akarja telepíteni</target>
+<target>Válassza ki, mely komponenseket akarja telepíteni.</target>
<source>Select installation type:</source>
<target>Válassza ki a telepítési módot:</target>
diff --git a/FreeFileSync/Build/Languages/italian.lng b/FreeFileSync/Build/Languages/italian.lng
index 0da1aa99..c76c3bf7 100644
--- a/FreeFileSync/Build/Languages/italian.lng
+++ b/FreeFileSync/Build/Languages/italian.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Errore di sintassi</target>
-<source>Cannot open file %x.</source>
-<target>Impossibile aprire il file %x.</target>
+<source>Cannot find file %x.</source>
+<target></target>
<source>File %x does not contain a valid configuration.</source>
<target>Il file %x non contiene una configurazione valida.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Qualsiasi numero di coppie di directory alternative per al massimo un file di configurazione.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Configurazione aperta per la modifica senza eseguire.</target>
+<source>Open configuration for editing without executing it.</source>
+<target></target>
<source>Cannot find the following folders:</source>
<target>Impossibile trovare le seguenti cartelle:</target>
@@ -202,6 +202,82 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target></target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Impossibile scrivere i permessi di %x.</target>
+
+<source>Operation not supported for different base folder types.</source>
+<target></target>
+
+<source>Cannot write file %x.</source>
+<target>Impossibile scrivere il file %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Impossibile copiare collegamento %x per %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Impossibile spostare il file %x in %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Impossibile enumerare la cartella %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Impossibile leggere gli attributi del file %x.</target>
+
+<source>Cannot find %x.</source>
+<target></target>
+
+<source>Cannot open file %x.</source>
+<target>Impossibile aprire il file %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Impossibile eliminare la directory %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Impossibile eliminare il file %x.</target>
+
+<source>Cannot find device %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target></target>
+
+<source>Cannot create directory %x.</source>
+<target>Impossibile creare la cartella %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Impossibile scrivere data e ora di modifica di %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Impossibile determinare il percorso finale per %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Impossibile risolvere collegamento %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Impossibile spostare %x nel cestino.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Impossibile aprire la cartella %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Linea di comando non corretta:</target>
+
+<source>Error Code %x:</source>
+<target>Codice Errore %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target></target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +311,14 @@
<source>Database file is corrupt:</source>
<target>Il file del database è corrotto:</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>Database files do not share a common session.</source>
<target>I file del database non condividono una sessione comune.</target>
<source>Searching for folder %x...</source>
<target>Ricerca della cartella %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Impossibile leggere gli attributi del file %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target></target>
<source>Cannot get process information.</source>
<target>Impossibile ottenere informazioni sul processo.</target>
@@ -337,6 +407,15 @@
<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>
+
<source>&Open...</source>
<target>&Apri...</target>
@@ -385,9 +464,6 @@
<source>Browse</source>
<target>Sfoglia</target>
-<source>Select a folder</source>
-<target>Seleziona una cartella</target>
-
<source>Idle time (in seconds):</source>
<target>Tempo di inattività (in secondi):</target>
@@ -441,9 +517,6 @@ Il comando è attivato se:
<source>&Quit</source>
<target>&Esci</target>
-<source>Incorrect command line:</source>
-<target>Linea di comando non corretta:</target>
-
<source>&Retry</source>
<target>&Riprova</target>
@@ -498,18 +571,18 @@ Il comando è attivato se:
<source>Updating attributes of %x</source>
<target>Aggiornamento attributi di %x</target>
+<source>%x and %y have different content.</source>
+<target></target>
+
+<source>Data verification error:</source>
+<target></target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Creazione di un Volume Shadow Copy per %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Dati di verifica errore: %x e %y hanno un contenuto diverso.</target>
-
<source>Target folder %x already existing.</source>
<target>La cartella di destinazione %x è già esistente.</target>
-<source>Cannot find folder %x.</source>
-<target>Impossibile trovare la cartella %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Il campo per la cartella di destinazione non può essere vuoto.</target>
@@ -522,8 +595,8 @@ Il comando è attivato se:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>Le seguenti cartelle sono significativamente differenti. Assicurarsi che si sta confrontando le cartelle corrette per la sincronizzazione.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target></target>
<source>Not enough free disk space available in:</source>
<target>Spazio libero su disco insufficiente in:</target>
@@ -549,12 +622,18 @@ Il comando è attivato se:
<source>Synchronization stopped</source>
<target>Sincronizzazione fermata</target>
+<source>Stopped</source>
+<target>Arrestato</target>
+
<source>Synchronization completed with errors</source>
<target>Sincronizzazione completata con errori</target>
<source>Synchronization completed with warnings</source>
<target>Sincronizzazione completata con avvisi</target>
+<source>Warning</source>
+<target>Attenzione</target>
+
<source>Nothing to synchronize</source>
<target>Non c'è nulla da sincronizzare</target>
@@ -564,9 +643,6 @@ Il comando è attivato se:
<source>Cleaning up old log files...</source>
<target>Pulizia vecchi file di log ...</target>
-<source>Stopped</source>
-<target>Arrestato</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>È possibile passare alla finestra principale di FreeFileSync per risolvere questo problema.</target>
@@ -657,9 +733,6 @@ Il comando è attivato se:
<source>Action</source>
<target>Azioni</target>
-<source>Drag && drop</source>
-<target>Trascina e rilascia</target>
-
<source>Local comparison settings</source>
<target>Impostazioni di confronto locali</target>
@@ -690,6 +763,9 @@ Il comando è attivato se:
<source>Local Synchronization Settings</source>
<target>Impostazioni di sincronizzazione locale</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target></target>
+
<source>&New</source>
<target>&Nuovo</target>
@@ -759,6 +835,9 @@ Il comando è attivato se:
<source>Remove folder pair</source>
<target>Elimina la coppia di cartelle</target>
+<source>Select SFTP folder</source>
+<target></target>
+
<source>Swap sides</source>
<target>Inverti i lati</target>
@@ -816,8 +895,8 @@ Il comando è attivato se:
<source>Identify equal files by comparing the file content.</source>
<target>Identificare i file uguali confrontando il contenuto del file.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignora tempo spostamento (in ore)</target>
+<source>&Ignore time shift (in hours)</source>
+<target></target>
<source>Consider file times with specified offset as equal</source>
<target>Considerare i tempi dei file con specifico offset o uguale</target>
@@ -825,14 +904,14 @@ Il comando è attivato se:
<source>Handle daylight saving time</source>
<target>Maneggiare l'ora legale</target>
-<source>Include symbolic links:</source>
-<target>Include i collegamenti:</target>
+<source>Include &symbolic links:</source>
+<target></target>
-<source>Direct</source>
-<target>Diretto</target>
+<source>&Follow</source>
+<target></target>
-<source>Follow</source>
-<target>Segui</target>
+<source>&Direct</source>
+<target></target>
<source>More information</source>
<target>Maggiori informazioni</target>
@@ -871,15 +950,11 @@ Il comando è attivato se:
<target>Rileva file spostati</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
-<target>
-- Rilevamento attivo dopo la sincronizzazione iniziale
-- Richiede e crea file di database
-- Non è supportato da tutti i sistemi
-</target>
+<target></target>
<source>Detect synchronization directions with the help of database files</source>
<target>Rileva indicazioni sincronizzazione con l'aiuto del file di database</target>
@@ -926,6 +1001,29 @@ Il comando è attivato se:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target></target>
+
+<source>Server name or IP address:</source>
+<target></target>
+
+<source>Examples:</source>
+<target></target>
+
+<source>User name:</source>
+<target></target>
+
+<source>Password:</source>
+<target></target>
+
+<source>&Show password</source>
+<target></target>
+
+<source>Directory on server:</source>
+<target></target>
+
+
+
<source>Start synchronization now?</source>
<target>Avviare la sincronizzazione ora?</target>
@@ -935,6 +1033,9 @@ Il comando è attivato se:
<source>&Don't show this dialog again</source>
<target>&Non mostrare più questo avviso</target>
+<source>Arrange folder pair</source>
+<target></target>
+
<source>Items found:</source>
<target>Oggetti trovati:</target>
@@ -1067,6 +1168,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Many thanks for localization:</source>
<target>Ringraziamenti per la traduzione:</target>
+<source>SSH File Transfer Protocol</source>
+<target></target>
+
<source>Save as Batch Job</source>
<target>Salva come Processo Batch</target>
@@ -1079,8 +1183,11 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Select Time Span</source>
<target>Selezionare Intervallo di Tempo</target>
-<source>&Preferences...</source>
-<target>&Preferenze...</target>
+<source>&Preferences</source>
+<target></target>
+
+<source>Main Bar</source>
+<target>Barra Principale</target>
<source>Folder Pairs</source>
<target>Coppie di Cartelle</target>
@@ -1097,9 +1204,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Overview</source>
<target>Anteprima</target>
-<source>Main Bar</source>
-<target>Barra Principale</target>
-
<source>Confirm</source>
<target>Confermare</target>
@@ -1208,8 +1312,8 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Do&n't save</source>
<target>No&n salvare</target>
-<source>Delete selected configurations</source>
-<target>Elimina configurazioni selezionate</target>
+<source>Remove entry from list</source>
+<target></target>
<source>Synchronization Settings</source>
<target>Impostazioni di Sincronizzazione</target>
@@ -1262,8 +1366,8 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Show filtered or temporarily excluded files</source>
<target>Mostra file filtrati o temporaneamente esclusi</target>
-<source>Set as default</source>
-<target>Imposta come predefinito</target>
+<source>Save as default</source>
+<target></target>
<source>Filter</source>
<target>Filtro</target>
@@ -1274,6 +1378,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Cannot find %x</source>
<target>Impossibile trovare %x</target>
+<source>Move up</source>
+<target></target>
+
+<source>Move down</source>
+<target></target>
+
<source>Comma-separated values</source>
<target>Valori separati da virgole</target>
@@ -1286,18 +1396,15 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Close progress dialog</source>
<target>Chiudi stato di avanzamento</target>
-<source>Standby</source>
-<target>Sospendi</target>
-
<source>Log off</source>
<target>Termina sessione</target>
+<source>Standby</source>
+<target>Sospendi</target>
+
<source>Shut down</source>
<target>Arresta</target>
-<source>Hibernate</source>
-<target>Iberna</target>
-
<source>Scanning...</source>
<target>Scansione...</target>
@@ -1307,9 +1414,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Attenzione</target>
-
<source>Select all</source>
<target>Seleziona tutto</target>
@@ -1355,8 +1459,8 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Preferences</source>
<target>Preferenze</target>
-<source>Copy NTFS permissions</source>
-<target>Copia permessi NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target></target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integra applicazioni esterne nel menu contestuale. Sono disponibili le seguenti macro:</target>
@@ -1451,27 +1555,21 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Percentage</source>
<target>Percentuale</target>
+<source>Unable to register to receive system messages.</source>
+<target>Impossibile registrarsi per ricevere i messaggi di sistema.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target></target>
+
<source>Cannot monitor directory %x.</source>
<target>Impossibile monitorare la directory %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Impossibile eliminare il file %x.</target>
-
<source>The file is locked by another process:</source>
<target>Il file è bloccato da un altro processo:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Impossibile spostare il file %x in %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Impossibile eliminare la directory %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Impossibile scrivere gli attributi del file %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Impossibile scrivere data e ora di modifica di %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Impossibile leggere il contesto di protezione di %x.</target>
@@ -1481,33 +1579,21 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Cannot read permissions of %x.</source>
<target>Impossibile leggere i permessi di %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Impossibile scrivere i permessi di %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Impossibile creare la cartella %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Impossibile copiare collegamento %x per %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target></target>
<source>Cannot find system function %x.</source>
<target>Impossibile trovare la funzione di sistema %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target></target>
+
<source>Cannot copy file %x to %y.</source>
<target>Impossibile copiare il file %x in %y.</target>
<source>Type of item %x is not supported:</source>
<target>Il tipo di oggetto %x non è supportato:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Impossibile risolvere collegamento %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Impossibile aprire la cartella %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Impossibile enumerare la cartella %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1541,9 +1627,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<pluralform>%x giorni</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Impossibile registrarsi per ricevere i messaggi di sistema.</target>
-
<source>Cannot set privilege %x.</source>
<target>Impossibile impostare privilegi %x.</target>
@@ -1553,23 +1636,14 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Cannot change process I/O priorities.</source>
<target>Impossibile modificare le priorità I/O del processo.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Impossibile spostare %x nel cestino.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Controllo cestino non riuscito per la cartella %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Impossibile determinare il percorso finale per %x.</target>
-
-<source>Error Code %x:</source>
-<target>Codice Errore %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Impossibile leggere i seguenti elementi XML:</target>
+<source>The following XML elements could not be read:</source>
+<target></target>
-<source>Configuration file %x loaded partially only.</source>
-<target>File di configurazione %x caricato solo parzialmente.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target></target>
<source>Prepare installation</source>
<target>Preparare l'installazione</target>
diff --git a/FreeFileSync/Build/Languages/japanese.lng b/FreeFileSync/Build/Languages/japanese.lng
index cdd85e92..60a08657 100644
--- a/FreeFileSync/Build/Languages/japanese.lng
+++ b/FreeFileSync/Build/Languages/japanese.lng
@@ -20,7 +20,7 @@
<target>現在の設定により、このデータベースエントリの同期は行われていません.</target>
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
-<target>同期方向のデフォルト設定: 古いファイルに新しいファイルを上書き</target>
+<target>同期方向のデフォルト設定: 古いファイルに新しいファイルを上書き.</target>
<source>Checking recycle bin availability for folder %x...</source>
<target>フォルダ %x をゴミ箱として使用できるかを確認中...</target>
@@ -50,13 +50,13 @@
<target>例外が発生しました</target>
<source>A directory path is expected after %x.</source>
-<target>%x の後にはディレクトリ・パスが必要です</target>
+<target>%x の後にはディレクトリ・パスが必要です.</target>
<source>Syntax error</source>
<target>構文エラー</target>
-<source>Cannot open file %x.</source>
-<target>ファイル %x を開けません</target>
+<source>Cannot find file %x.</source>
+<target>ファイル %x がみつかりません.</target>
<source>File %x does not contain a valid configuration.</source>
<target>ファイル %x には有効な構成が含まれていません.</target>
@@ -77,25 +77,25 @@
<target>構文:</target>
<source>global config file:</source>
-<target>グローバル構成ファイル</target>
+<target>グローバル構成ファイル:</target>
<source>config files:</source>
-<target>構成ファイル</target>
+<target>構成ファイル:</target>
<source>directory</source>
<target>ディレクトリ</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
-<target>代替グローバル設定.xml ファイルのパス</target>
+<target>代替グローバル設定.xml ファイルのパス.</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>
+<target>任意の数の代替ディレクトリペア(ひとつの構成ファイル).</target>
-<source>Open configuration for edit without executing.</source>
-<target>実行しないで構成ファイルを編集用に開く.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>実行しないで編集のために構成設定を開く.</target>
<source>Cannot find the following folders:</source>
<target>以下のフォルダがみつかりません:</target>
@@ -107,10 +107,10 @@
<target>フォルダ入力欄が空白です.</target>
<source>The corresponding folder will be considered as empty.</source>
-<target>対応するフォルダは空であるとみなされます</target>
+<target>対応するフォルダは空であるとみなされます.</target>
<source>The following folder paths are dependent from each other:</source>
-<target>以下のフォルダパスは互いに依存関係にあります。</target>
+<target>以下のフォルダパスは互いに依存関係にあります:</target>
<source>File %x has an invalid date.</source>
<target>ファイル %x の日付は無効なものです.</target>
@@ -125,7 +125,7 @@
<target>サイズ:</target>
<source>Content comparison was skipped for excluded files %x.</source>
-<target>除外されたファイル %x の内容の比較をスキップ</target>
+<target>除外されたファイル %x の内容の比較をスキップ.</target>
<source>Items differ in attributes only</source>
<target>属性のみ異なる項目</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>右の属性を更新</target>
+<source>Cannot read file %x.</source>
+<target>ファイル %x を読み込めません.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+予期しないデータストリームのサイズ.
+予測された値: %x バイト
+実際の値: %y バイト
+</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 write file %x.</source>
+<target>ファイル %x に書き込めません.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>シンボリックリンク %x を %y にコピーできません.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>ファイル %x を %y に移動できません.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>ディレクトリ %x を列挙できません.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x のファイル属性を読み込めません.</target>
+
+<source>Cannot find %x.</source>
+<target>%x がみつかりません.</target>
+
+<source>Cannot open file %x.</source>
+<target>ファイル %x を開けません.</target>
+
+<source>Cannot find device %x.</source>
+<target>デバイス %x がみつかりません.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>%x の空きディスク領域を検出できません.</target>
+
+<source>Cannot create directory %x.</source>
+<target>ディレクトリ %x を作成できません.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>ディレクトリ %x を削除できません.</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>ディレクトリ %x を開けません.</target>
+
+<source>Incorrect command line:</source>
+<target>不正なコマンドライン:</target>
+
+<source>Error Code %x:</source>
+<target>エラーコード %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>SFTP サーバ %x への接続に失敗.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -234,20 +314,14 @@
<source>Database file is corrupt:</source>
<target>破損しているデータベース:</target>
-<source>Cannot write file %x.</source>
-<target>ファイル %x に書き込めません.</target>
-
-<source>Cannot read file %x.</source>
-<target>ファイル %x を読み込めません.</target>
-
<source>Database files do not share a common session.</source>
<target>データベースは一般セッションで共有できません.</target>
<source>Searching for folder %x...</source>
<target>フォルダ %x を検索中...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>%x のファイル属性を読み込めません.</target>
+<source>Time out while searching for folder %x.</source>
+<target>フォルダ %x 検索中にタイムアウト.</target>
<source>Cannot get process information.</source>
<target>プロセス情報を取得できません.</target>
@@ -323,7 +397,7 @@
<target>FreeFileSync 64-bit 版を使用してこのシステムにシャドウコピーを作成してください.</target>
<source>Cannot determine volume name for %x.</source>
-<target>%x のボリューム名が決定されていません</target>
+<target>%x のボリューム名が決定されていません.</target>
<source>Volume name %x is not part of file path %y.</source>
<target>ボリューム名 %x は、ファイルパス %y の一部ではありません.</target>
@@ -334,6 +408,15 @@
<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>
+
<source>&Open...</source>
<target>開く(&O)...</target>
@@ -359,16 +442,16 @@
<target>使用方法:</target>
<source>1. Select folders to watch.</source>
-<target>1. 監視するフォルダを選択</target>
+<target>1. 監視するフォルダを選択.</target>
<source>2. Enter a command line.</source>
-<target>2. コマンドラインを入力</target>
+<target>2. コマンドラインを入力.</target>
<source>3. Press 'Start'.</source>
-<target>3. 'スタート'をクリック</target>
+<target>3. 'スタート'をクリック.</target>
<source>To get started just import a .ffs_batch file.</source>
-<target>一括ファイル(.ffs)からインポートして開始</target>
+<target>一括ファイル(.ffs)からインポートして開始.</target>
<source>Folders to watch:</source>
<target>監視するフォルダ:</target>
@@ -382,9 +465,6 @@
<source>Browse</source>
<target>参照</target>
-<source>Select a folder</source>
-<target>フォルダを選択</target>
-
<source>Idle time (in seconds):</source>
<target>待機時間(秒で指定):</target>
@@ -438,9 +518,6 @@ The command is triggered if:
<source>&Quit</source>
<target>終了(&Q)</target>
-<source>Incorrect command line:</source>
-<target>不正なコマンドライン:</target>
-
<source>&Retry</source>
<target>再試行(&R)</target>
@@ -495,32 +572,32 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>ボリュームシャドウコピーを作成中 %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>データ検証エラー: %x と %y には異なる内容が含まれています.</target>
-
<source>Target folder %x already existing.</source>
<target>対象フォルダ %x は既に存在します.</target>
-<source>Cannot find folder %x.</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>
+<target>ソース フォルダ %x がみつかりません.</target>
<source>Please enter a target folder for versioning.</source>
-<target>バージョン付けをする対象フォルダを入力</target>
+<target>バージョン付けをする対象フォルダを入力.</target>
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>以下の項目は、未解決の競合が存在するため同期処理を実行できませんでした:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>以下のフォルダには大量の差異が存在します。同期フォルダの双方が正確にセットされているかどうかをもう一度慎重にご確認ください.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>以下のフォルダは内容が大幅に異なっています。同期フォルダの設定に誤りがないかどうかをご確認ください.</target>
<source>Not enough free disk space available in:</source>
<target>利用可能なディスク空き容量が足りません:</target>
@@ -532,7 +609,7 @@ The command is triggered if:
<target>利用可能:</target>
<source>Multiple folder pairs write to a common subfolder. Please review your configuration.</source>
-<target>共通サブフォルダに複数フォルダペアの書き込みがあります。構成を確認してください。</target>
+<target>共通サブフォルダに複数フォルダペアの書き込みがあります。構成を確認してください.</target>
<source>Synchronizing folder pair:</source>
<target>フォルダペアを同期処理:</target>
@@ -546,12 +623,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>同期処理を停止</target>
+<source>Stopped</source>
+<target>停止</target>
+
<source>Synchronization completed with errors</source>
<target>同期処理はエラーで終了しています</target>
<source>Synchronization completed with warnings</source>
<target>同期処理は警告で終了しています</target>
+<source>Warning</source>
+<target>警告</target>
+
<source>Nothing to synchronize</source>
<target>同期対象がありません</target>
@@ -561,11 +644,8 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>古いログファイルをクリーン...</target>
-<source>Stopped</source>
-<target>停止</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
-<target>FreeFileSync のメインウィンドウを切り替えることでこの問題を解決</target>
+<target>FreeFileSync のメインウィンドウを切り替えることでこの問題を解決.</target>
<source>&Don't show this warning again</source>
<target>次回からこの警告を表示しない(&D)</target>
@@ -621,7 +701,7 @@ The command is triggered if:
<target>チェック(&C)</target>
<source>Symlink</source>
-<target>シンボリックリンク</target>
+<target>Symリンク</target>
<source>Folder</source>
<target>フォルダ</target>
@@ -653,9 +733,6 @@ The command is triggered if:
<source>Action</source>
<target>操作</target>
-<source>Drag && drop</source>
-<target>ドラッグ && ドロップ</target>
-
<source>Local comparison settings</source>
<target>ローカルの比較設定</target>
@@ -686,6 +763,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>ローカルの同期設定</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>選択したフォルダ %x は、FreeFileSync で使用できません。ローカルファイルシステム、ネットワークまたは MTP デバイス上で選択してください.</target>
+
<source>&New</source>
<target>新規(&N)</target>
@@ -755,6 +835,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>フォルダペアを除去</target>
+<source>Select SFTP folder</source>
+<target>SFTPフォルダを選択</target>
+
<source>Swap sides</source>
<target>パネルを入れ替え</target>
@@ -783,7 +866,7 @@ The command is triggered if:
<target>表示形式:</target>
<source>Select view:</source>
-<target>選択表示</target>
+<target>選択表示:</target>
<source>Statistics:</source>
<target>統計情報:</target>
@@ -801,19 +884,19 @@ The command is triggered if:
<target>コピーの合計バイト</target>
<source>Use local settings:</source>
-<target>ローカル設定を使用</target>
+<target>ローカル設定を使用:</target>
<source>Select a variant:</source>
-<target>バリアントを選択:</target>
+<target>方法を選択:</target>
<source>Identify equal files by comparing modification time and size.</source>
-<target>更新時刻とサイズを比較して、同一ファイルを識別します</target>
+<target>更新時刻とサイズを比較して、同一ファイルを識別します.</target>
<source>Identify equal files by comparing the file content.</source>
-<target>ファイルの内容を比較して、同一ファイルを識別します</target>
+<target>ファイルの内容を比較して、同一ファイルを識別します.</target>
-<source>Ignore time shift (in hours)</source>
-<target>指定時間内のズレは無視</target>
+<source>&Ignore time shift (in hours)</source>
+<target>タイムシフトを無視(&I)</target>
<source>Consider file times with specified offset as equal</source>
<target>指定されたオフセット値でファイル時刻を考慮</target>
@@ -821,14 +904,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>夏時間の取り扱い</target>
-<source>Include symbolic links:</source>
-<target>Sym リンクを含める:</target>
+<source>Include &symbolic links:</source>
+<target>Symリンクを含める(&S):</target>
-<source>Direct</source>
-<target>直接</target>
+<source>&Follow</source>
+<target>フォロー(&F)</target>
-<source>Follow</source>
-<target>考慮</target>
+<source>&Direct</source>
+<target>ダイレクト(&D)</target>
<source>More information</source>
<target>更に詳細な情報</target>
@@ -867,14 +950,14 @@ The command is triggered if:
<target>移動済みのファイルを検出する</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- 初期同期の後、アクティブを検出
-- 必要なデータベースファイルを作成
-- すべてのシステムには対応していません
+- すべてのファイルシステムで対応していません
+- 必要、データベースファイルを作成
+- 最初の同期では検知できません
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -922,6 +1005,27 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>SFTP ログインの詳細を入力:</target>
+
+<source>Server name or IP address:</source>
+<target>サーバ名、または IP アドレス:</target>
+
+<source>Examples:</source>
+<target>入力例:</target>
+
+<source>User name:</source>
+<target>ユーザ名:</target>
+
+<source>Password:</source>
+<target>パスワード:</target>
+
+<source>&Show password</source>
+<target>パスワードを表示(&S)</target>
+
+<source>Directory on server:</source>
+<target>サーバ上のディレクトリ:</target>
+
<source>Start synchronization now?</source>
<target>今すぐ同期を開始しますか?</target>
@@ -931,6 +1035,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>次回以降から表示しない(&D)</target>
+<source>Arrange folder pair</source>
+<target>フォルダ ペアの配置</target>
+
<source>Items found:</source>
<target>見つかった要素:</target>
@@ -938,7 +1045,7 @@ The command is triggered if:
<target>残り時間:</target>
<source>Time elapsed:</source>
-<target>経過時間</target>
+<target>経過時間:</target>
<source>Synchronizing...</source>
<target>同期処理中...</target>
@@ -983,7 +1090,7 @@ The command is triggered if:
<target>一括ジョブ スケジュールの作成方法</target>
<source>The following settings are used for all synchronization jobs.</source>
-<target>以下の設定は、すべての同期ジョブで使用されます</target>
+<target>以下の設定は、すべての同期ジョブで使用されます.</target>
<source>Fail-safe file copy</source>
<target>安全なファイルコピーを実施</target>
@@ -1004,7 +1111,7 @@ This guarantees a consistent state even in case of a serious error.
<target>ロックされたファイルをコピーする</target>
<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target>共有、ロックされたファイルをボリュームシャドウコピーサービスを使用してコピー</target>
+<target>共有、ロックされたファイルをボリュームシャドウコピーサービスを使用してコピー.</target>
<source>(requires administrator rights)</source>
<target>(管理者権限が必要)</target>
@@ -1013,7 +1120,7 @@ This guarantees a consistent state even in case of a serious error.
<target>ファイルのアクセスパーミッションをコピーする</target>
<source>Transfer file and folder permissions.</source>
-<target>ファイルとフォルダのパーミッションを転送します</target>
+<target>ファイルとフォルダのパーミッションを転送します.</target>
<source>Automatic retry on error:</source>
<target>エラー時の自動再試行:</target>
@@ -1040,7 +1147,7 @@ This guarantees a consistent state even in case of a serious error.
<target>デフォルト(&D)</target>
<source>Source code written in C++ using:</source>
-<target>ソースコードは C++ で書かれています</target>
+<target>ソースコードは C++ で書かれています:</target>
<source>If you like FreeFileSync:</source>
<target>FreeFileSync を気に入ってくれた方へ:</target>
@@ -1063,6 +1170,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>ローカライズのご協力に感謝します:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH ファイル転送プロトコル</target>
+
<source>Save as Batch Job</source>
<target>一括ジョブを保存</target>
@@ -1075,8 +1185,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>タイムスパンを選択</target>
-<source>&Preferences...</source>
-<target>プリファレンス(&P)...</target>
+<source>&Preferences</source>
+<target>環境設定(&P)</target>
+
+<source>Main Bar</source>
+<target>メインバー</target>
<source>Folder Pairs</source>
<target>フォルダ ペア</target>
@@ -1093,9 +1206,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>概要</target>
-<source>Main Bar</source>
-<target>メインバー</target>
-
<source>Confirm</source>
<target>確認</target>
@@ -1144,7 +1254,7 @@ This guarantees a consistent state even in case of a serious error.
<target>フィルター経由で含める:</target>
<source>Exclude via filter:</source>
-<target>フィルターを経由して除外</target>
+<target>フィルター経由で除外:</target>
<source>Include temporarily</source>
<target>一時的に含める</target>
@@ -1200,8 +1310,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>保存しない(&N)</target>
-<source>Delete selected configurations</source>
-<target>選択された構成設定を削除</target>
+<source>Remove entry from list</source>
+<target>一覧からエントリを除去</target>
<source>Synchronization Settings</source>
<target>同期の設定</target>
@@ -1254,8 +1364,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>フィルター済、または一時除外ファイルを表示</target>
-<source>Set as default</source>
-<target>デフォルトにセット</target>
+<source>Save as default</source>
+<target>既定として保存</target>
<source>Filter</source>
<target>フィルター</target>
@@ -1266,6 +1376,12 @@ This guarantees a consistent state even in case of a serious error.
<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>
@@ -1278,18 +1394,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>進捗ダイアログを閉じる</target>
-<source>Standby</source>
-<target>スリープ</target>
-
<source>Log off</source>
<target>ログオフ</target>
+<source>Standby</source>
+<target>スリープ</target>
+
<source>Shut down</source>
<target>シャットダウン</target>
-<source>Hibernate</source>
-<target>休止状態</target>
-
<source>Scanning...</source>
<target>スキャン中...</target>
@@ -1299,9 +1412,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>情報</target>
-<source>Warning</source>
-<target>警告</target>
-
<source>Select all</source>
<target>すべて選択</target>
@@ -1339,14 +1449,14 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>Do you really want to delete the following %x items?</pluralform>
</source>
<target>
-<pluralform>本当に以下の %x 個の項目を削除しますか</pluralform>
+<pluralform>本当に以下の %x 個の項目を削除しますか?</pluralform>
</target>
<source>Preferences</source>
<target>プリファレンス</target>
-<source>Copy NTFS permissions</source>
-<target>NTFS パーミッションをコピーする</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>DACL, SACL, 所有者, グループをコピー</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>外部のアプリケーションをコンテキストメニューに統合、以下のマクロが利用できます:</target>
@@ -1370,16 +1480,16 @@ This guarantees a consistent state even in case of a serious error.
<target>表示(&S)</target>
<source>Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database.</source>
-<target>変更箇所を識別して両側に変更を反映します。データベースを使用することで、削除/移動/競合などは自動的に検出されます。</target>
+<target>変更箇所を識別して両側に変更を反映します。データベースを使用することで、削除/移動/競合などは自動的に検出されます.</target>
<source>Create a mirror backup of the left folder by adapting the right folder to match.</source>
-<target>右側フォルダにマッチングを適合することで、左側フォルダのミラーリングバックアップを作成します。</target>
+<target>右側フォルダにマッチングを適合することで、左側フォルダのミラーリングバックアップを作成します.</target>
<source>Copy new and updated files to the right folder.</source>
-<target>新しい、または更新されたファイルを右側フォルダにコピーします。</target>
+<target>新しい、または更新されたファイルを右側フォルダにコピーします.</target>
<source>Configure your own synchronization rules.</source>
-<target>あなたが使用する同期規則を設定します。</target>
+<target>あなたが使用する同期規則を設定します.</target>
<source>Today</source>
<target>今日</target>
@@ -1441,27 +1551,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>パーセント</target>
+<source>Unable to register to receive system messages.</source>
+<target>システム受信メッセージに登録できません.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>%x のデバイス通知を登録できません.</target>
+
<source>Cannot monitor directory %x.</source>
<target>ディレクトリ %x を監視できません.</target>
-<source>Cannot delete file %x.</source>
-<target>ファイル %x を削除出来ません.</target>
-
<source>The file is locked by another process:</source>
<target>次のファイルは別のプロセスで使用中です:</target>
-<source>Cannot move file %x to %y.</source>
-<target>ファイル %x を %y に移動できません.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>ディレクトリ %x を削除できません.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>%x のファイル属性を書き込めません.</target>
-<source>Cannot write modification time of %x.</source>
-<target>%x の更新時刻を書き込めませんでした.</target>
-
<source>Cannot read security context of %x.</source>
<target>%x のセキュリティコンテキストを読み込めません.</target>
@@ -1471,33 +1575,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>>%x のパーミッションを読み込めません.</target>
-<source>Cannot write permissions of %x.</source>
-<target>%x のパーミッションを書き込めません.</target>
-
-<source>Cannot create directory %x.</source>
-<target>ディレクトリ %x を作成出来ません.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>シンボリックリンク %x を %y にコピーできません.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>パーミッション を %x から %y にコピーできません.</target>
<source>Cannot find system function %x.</source>
<target>システム関数 %x がみつかりません.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>属性 を %x から %y にコピーできません.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>%x から %y にコピーできません.</target>
<source>Type of item %x is not supported:</source>
<target>項目 %x には対応していません:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>シンボリックリンク %x を解決できません.</target>
-
-<source>Cannot open directory %x.</source>
-<target>ディレクトリ %x を開けません.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>ディレクトリ %x を列挙できません</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1528,44 +1620,32 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x 日</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>システム受信メッセージに登録できません</target>
-
<source>Cannot set privilege %x.</source>
<target>%x の特権をセットできません.</target>
<source>Unable to suspend system sleep mode.</source>
-<target>システム スリープモードを中断できません</target>
+<target>システム スリープモードを中断できません.</target>
<source>Cannot change process I/O priorities.</source>
-<target>プロセスの I/O 優先度を変更できません</target>
-
-<source>Unable to move %x to the recycle bin.</source>
-<target>%x をゴミ箱に移動できません.</target>
+<target>プロセスの I/O 優先度を変更できません.</target>
<source>Checking recycle bin failed for folder %x.</source>
-<target>フォルダ %x のゴミ箱のチェックに失敗</target>
-
-<source>Cannot determine final path for %x.</source>
-<target>%x の最終的なパスを決定できません.</target>
-
-<source>Error Code %x:</source>
-<target>エラーコード %x:</target>
+<target>フォルダ %x のゴミ箱のチェックに失敗.</target>
-<source>Cannot read the following XML elements:</source>
-<target>次の XML要素を読み込めません:</target>
+<source>The following XML elements could not be read:</source>
+<target>次の XML 要素は読み取ることができません:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>構成ファイル %x は部分的のみ読み込まれます.</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>
+<target>インストールするコンポーネントを選択.</target>
<source>Select installation type:</source>
-<target>インストールの種類を選択</target>
+<target>インストールの種類を選択:</target>
<source>Local</source>
<target>ローカル</target>
diff --git a/FreeFileSync/Build/Languages/korean.lng b/FreeFileSync/Build/Languages/korean.lng
index 5a6b8533..59ebc2b7 100644
--- a/FreeFileSync/Build/Languages/korean.lng
+++ b/FreeFileSync/Build/Languages/korean.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>구문 오류</target>
-<source>Cannot open file %x.</source>
-<target>파일 %x을(를) 열 수 없습니다.</target>
+<source>Cannot find file %x.</source>
+<target>파일 %x을(를) 찾을 수 없습니다.</target>
<source>File %x does not contain a valid configuration.</source>
<target>파일 %x 의 구성이 유효하지 않습니다.</target>
@@ -86,16 +86,16 @@
<target>디렉토리</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
-<target>GlobalSettings.xml 대체 파일에 대한 경로</target>
+<target>GlobalSettings.xml 대체 파일에 대한 경로.</target>
<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
-<target>FreeFileSync .ffs_gui 또는 .ffs_batch 설정 파일 개수</target>
+<target>FreeFileSync .ffs_gui 또는 .ffs_batch 설정 파일 개수.</target>
<source>Any number of alternative directory pairs for at most one config file.</source>
-<target>최대 1개 설정파일에 대한 대체 디렉토리 페어 개수</target>
+<target>최대 1개 설정파일에 대한 대체 디렉토리 페어 개수.</target>
-<source>Open configuration for edit without executing.</source>
-<target>실행하지 않은 상태로 편집 구성 열기</target>
+<source>Open configuration for editing without executing it.</source>
+<target>실행하지 않은 상태로 편집 구성 열기.</target>
<source>Cannot find the following folders:</source>
<target>다음 폴더를 찾을 수 없습니다:</target>
@@ -146,7 +146,7 @@
<target>동기화 방향을 계산 중...</target>
<source>Out of memory.</source>
-<target>메모리 부족</target>
+<target>메모리 부족.</target>
<source>Item exists on left side only</source>
<target>항목이 좌측에만 존재합니다.</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>우측 속성 업데이트</target>
+<source>Cannot read file %x.</source>
+<target>파일 %x을(를) 읽을 수 없습니다.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+예상 밖의 데이터 스트림 사이즈
+예상 사이즈: %x 바이트
+실제 사이즈: %y 바이트
+</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 write file %x.</source>
+<target>파일 %x을(를) 쓸 수 없습니다.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>심볼릭 링크 %x을(를) %y(으)로 복사할 수 없습니다.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>파일 %x을(를) %y(으)로 이동할 수 없습니다.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>디렉토리 %x을(를) 열거할 수 없습니다.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x의 파일 속성을 읽을 수 없습니다.</target>
+
+<source>Cannot find %x.</source>
+<target>%x을(를) 찾을 수 없습니다.</target>
+
+<source>Cannot open file %x.</source>
+<target>파일 %x을(를) 열 수 없습니다.</target>
+
+<source>Cannot find device %x.</source>
+<target>장치 %x을(를) 찾을 수 없습니다.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>%x에 대한 사용 가능한 디스크 공간을 확인할 수 없습니다.</target>
+
+<source>Cannot create directory %x.</source>
+<target>디렉토리 %x을(를) 생성할 수 없습니다.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>디렉토리 %x을(를) 삭제할 수 없습니다.</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>디렉토리 %x을(를) 열 수 없습니다.</target>
+
+<source>Incorrect command line:</source>
+<target>부정확한 명령줄:</target>
+
+<source>Error Code %x:</source>
+<target>오류 코드 %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>SFTP 서버 %x로의 연결 실패.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -234,20 +314,14 @@
<source>Database file is corrupt:</source>
<target>데이터베이스 파일 손상:</target>
-<source>Cannot write file %x.</source>
-<target>파일 %x을(를) 쓸 수 없습니다.</target>
-
-<source>Cannot read file %x.</source>
-<target>파일 %x을(를) 읽을 수 없습니다.</target>
-
<source>Database files do not share a common session.</source>
<target>데이터베이스 파일이 일반/공동 세션을 공유하지 않습니다.</target>
<source>Searching for folder %x...</source>
<target>폴더 %x 검색 중...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>%x의 파일 속성을 읽을 수 없습니다.</target>
+<source>Time out while searching for folder %x.</source>
+<target>폴더 %x을(를) 검색하는 동안 타임아웃 됨.</target>
<source>Cannot get process information.</source>
<target>프로세스 정보를 얻을 수 없습니다.</target>
@@ -285,7 +359,7 @@
<target>전체 시간:</target>
<source>Error parsing file %x, row %y, column %z.</source>
-<target>분석 오류 - 파일: %x; 행: %y; 열: %z</target>
+<target>분석 오류 - 파일: %x; 행: %y; 열: %z.</target>
<source>Cannot set directory lock for %x.</source>
<target>%x 에 대한 디렉토리 잠금을 설정할 수 없습니다.</target>
@@ -334,11 +408,20 @@
<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>
+
<source>&Open...</source>
-<target>열기(&O)</target>
+<target>열기(&O)...</target>
<source>Save &as...</source>
-<target>다른 이름으로 저장(&a)</target>
+<target>다른 이름으로 저장(&a)...</target>
<source>E&xit</source>
<target>나가기(&x)</target>
@@ -382,11 +465,8 @@
<source>Browse</source>
<target>찾아보기</target>
-<source>Select a folder</source>
-<target>폴더 선택</target>
-
<source>Idle time (in seconds):</source>
-<target>유휴 시간 (초 단위)</target>
+<target>유휴 시간 (초 단위):</target>
<source>Idle time between last detected change and execution of command</source>
<target>마지막으로 감지된 변화와 명령 실행 간의 유휴 시간</target>
@@ -438,9 +518,6 @@ The command is triggered if:
<source>&Quit</source>
<target>종료(&Q)</target>
-<source>Incorrect command line:</source>
-<target>부정확한 명령줄:</target>
-
<source>&Retry</source>
<target>다시 시도(&R)</target>
@@ -495,18 +572,18 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>%x을(를) 위한 Volume Shadow Copy 생성 중...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>데이터 확인 오류: %x 및 %y 의 내용이 서로 다릅니다.</target>
-
<source>Target folder %x already existing.</source>
<target>대상 폴더 %x이(가) 이미 존재함.</target>
-<source>Cannot find folder %x.</source>
-<target>%x 폴더를 찾을 수 없습니다.</target>
-
<source>Target folder input field must not be empty.</source>
<target>대상 폴더 입력 필드가 비어 있어서는 안 됩니다.</target>
@@ -519,8 +596,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>아래의 항목들은 해결치 못 한 충돌로 인해 동기화할 수 없습니다:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>다음 폴더들은 차이가 상당합니다. 동기화를 위해 올바른 폴더들이 매치되었는지 확인해 보십시오.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>다음 폴더들은 서로 간의 차이가 상당합니다. 동기화를 위해 올바른 폴더들이 매치되었는지 확인해 보십시오.</target>
<source>Not enough free disk space available in:</source>
<target>사용 가능한 디스크 여유 공간이 부족합니다:</target>
@@ -535,7 +612,7 @@ The command is triggered if:
<target>공통 하위 폴더에 다중 폴더 페어를 기록합니다. 구성을 재검토 하시기 바랍니다.</target>
<source>Synchronizing folder pair:</source>
-<target>폴더 페어 동기화 진행 중</target>
+<target>폴더 페어 동기화 진행 중:</target>
<source>Generating database...</source>
<target>데이터베이스 생성 중...</target>
@@ -546,12 +623,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>동기화 중단</target>
+<source>Stopped</source>
+<target>중단</target>
+
<source>Synchronization completed with errors</source>
<target>동기화가 완료되긴 했으나, 오류가 있습니다</target>
<source>Synchronization completed with warnings</source>
<target>경고 메세지와 함께 동기화 완료</target>
+<source>Warning</source>
+<target>경고</target>
+
<source>Nothing to synchronize</source>
<target>동기화 할 항목이 없습니다</target>
@@ -561,9 +644,6 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>이전 로그 파일 정리 중...</target>
-<source>Stopped</source>
-<target>중단</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>이 문제는 FreeFileSync 기본 창으로 전환해서 해결 가능합니다.</target>
@@ -653,9 +733,6 @@ The command is triggered if:
<source>Action</source>
<target>실행</target>
-<source>Drag && drop</source>
-<target>드래그 앤 드랍(&&) [마우스로 파일 끌어다 놓기]</target>
-
<source>Local comparison settings</source>
<target>로컬 비교 설정</target>
@@ -686,6 +763,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>로컬 동기화 설정</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>선택하신 폴더 %x은(는) FreeFileSync와 함께 사용할 수 없습니다. 로컬 파일 시스템, 네트워크 또는 MTP 장치 폴더를 선택하십시오.</target>
+
<source>&New</source>
<target>새로 만들기(&N)</target>
@@ -693,7 +773,7 @@ The command is triggered if:
<target>저장(&S)</target>
<source>Save as &batch job...</source>
-<target>일괄 작업으로 저장(&b)</target>
+<target>일괄 작업으로 저장(&b)...</target>
<source>Start &comparison</source>
<target>비교 시작(&C)</target>
@@ -720,13 +800,13 @@ The command is triggered if:
<target>언어 선택(&L)</target>
<source>&Find...</source>
-<target>찾기(&F)</target>
+<target>찾기(&F)...</target>
<source>&Reset layout</source>
<target>레이아웃 리셋(&R)</target>
<source>&Export file list...</source>
-<target>파일 리스트 내보내기(&E)</target>
+<target>파일 리스트 내보내기(&E)...</target>
<source>&Tools</source>
<target>도구(&T)</target>
@@ -755,6 +835,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>폴더 페어 제거</target>
+<source>Select SFTP folder</source>
+<target>SFTP 폴더 선택</target>
+
<source>Swap sides</source>
<target>양측 위치 바꾸기</target>
@@ -771,13 +854,13 @@ The command is triggered if:
<target>새로 만들기</target>
<source>Open...</source>
-<target>열기</target>
+<target>열기...</target>
<source>Save</source>
<target>저장</target>
<source>Save as...</source>
-<target>다른 이름으로 저장</target>
+<target>다른 이름으로 저장...</target>
<source>View type:</source>
<target>유형 보기:</target>
@@ -807,13 +890,13 @@ The command is triggered if:
<target>베어리언트 선택:</target>
<source>Identify equal files by comparing modification time and size.</source>
-<target>수정 시간 및 크기를 비교하여 동일한 파일을 식별</target>
+<target>수정 시간 및 크기를 비교하여 동일한 파일을 식별.</target>
<source>Identify equal files by comparing the file content.</source>
-<target>파일 내용을 비교하여 동일한 파일을 식별</target>
+<target>파일 내용을 비교하여 동일한 파일을 식별.</target>
-<source>Ignore time shift (in hours)</source>
-<target>타임 쉬프트 무시 (시간 단위)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>타임 쉬프트 무시(&I) [시간 단위]</target>
<source>Consider file times with specified offset as equal</source>
<target>특정 오프셋 파일 시간은 동일한 것으로 간주</target>
@@ -821,14 +904,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>서머타임 설정</target>
-<source>Include symbolic links:</source>
-<target>심볼릭 링크 포함:</target>
+<source>Include &symbolic links:</source>
+<target>심볼릭 링크 포함(&s):</target>
-<source>Direct</source>
-<target>다이렉트</target>
+<source>&Follow</source>
+<target>팔로우(&F)</target>
-<source>Follow</source>
-<target>팔로우</target>
+<source>&Direct</source>
+<target>다이렉트(&D)</target>
<source>More information</source>
<target>상세 정보</target>
@@ -867,14 +950,14 @@ The command is triggered if:
<target>이동 파일 탐지</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- 초기 동기화 이후 탐지기능 활성화
-- 데이터베이스 파일 요청 및 생성
- 모든 파일 시스템에서 지원되지는 않음
+- 데이터베이스 파일 요청 및 생성
+- 첫 번째 동기화를 위한 탐지기능 사용불가
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -922,6 +1005,27 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>귀하의 SFTP 로그인 정보 입력:</target>
+
+<source>Server name or IP address:</source>
+<target>서버 이름 또는 IP 주소:</target>
+
+<source>Examples:</source>
+<target>예시:</target>
+
+<source>User name:</source>
+<target>사용자 이름:</target>
+
+<source>Password:</source>
+<target>비밀번호:</target>
+
+<source>&Show password</source>
+<target>비밀번호 표시(&S)</target>
+
+<source>Directory on server:</source>
+<target>서버 디렉토리:</target>
+
<source>Start synchronization now?</source>
<target>지금 동기화를 시작하시겠습니까?</target>
@@ -931,6 +1035,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>이 대화 창을 다시 표시 안 함(&D)</target>
+<source>Arrange folder pair</source>
+<target>폴더 페어 정렬</target>
+
<source>Items found:</source>
<target>발견된 항목:</target>
@@ -1004,7 +1111,7 @@ This guarantees a consistent state even in case of a serious error.
<target>락 걸린 파일 복사</target>
<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target>Volume Shadow Copy Service를 사용하여 공유 또는 잠긴 파일 복사</target>
+<target>Volume Shadow Copy Service를 사용하여 공유 또는 잠긴 파일 복사.</target>
<source>(requires administrator rights)</source>
<target>(관리자 권한 필요)</target>
@@ -1013,7 +1120,7 @@ This guarantees a consistent state even in case of a serious error.
<target>파일 접근 권한 복사</target>
<source>Transfer file and folder permissions.</source>
-<target>파일 및 폴더 권한 전송</target>
+<target>파일 및 폴더 권한 전송.</target>
<source>Automatic retry on error:</source>
<target>오류 발생 시 자동 재시도:</target>
@@ -1063,6 +1170,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>현지화 작업에 깊은 감사 드립니다:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH 파일 전송 프로토콜</target>
+
<source>Save as Batch Job</source>
<target>일괄 작업으로 저장</target>
@@ -1075,9 +1185,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>시간간격(타임스팬) 선택</target>
-<source>&Preferences...</source>
+<source>&Preferences</source>
<target>환경설정(&P)</target>
+<source>Main Bar</source>
+<target>메인 바</target>
+
<source>Folder Pairs</source>
<target>폴더 페어</target>
@@ -1093,9 +1206,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>개요</target>
-<source>Main Bar</source>
-<target>메인 바</target>
-
<source>Confirm</source>
<target>확인</target>
@@ -1200,8 +1310,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>저장 안 함(&n)</target>
-<source>Delete selected configurations</source>
-<target>선택한 구성 삭제</target>
+<source>Remove entry from list</source>
+<target>목록에서 입력항목 제거</target>
<source>Synchronization Settings</source>
<target>동기화 설정</target>
@@ -1254,8 +1364,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>필터링 또는 일시적으로 제외된 파일 보이기</target>
-<source>Set as default</source>
-<target>기본 값으로 설정</target>
+<source>Save as default</source>
+<target>기본 값으로 저장</target>
<source>Filter</source>
<target>필터</target>
@@ -1266,6 +1376,12 @@ This guarantees a consistent state even in case of a serious error.
<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>
@@ -1278,18 +1394,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>진행 표시 창 닫기</target>
-<source>Standby</source>
-<target>대기</target>
-
<source>Log off</source>
<target>로그오프</target>
+<source>Standby</source>
+<target>대기</target>
+
<source>Shut down</source>
<target>종료</target>
-<source>Hibernate</source>
-<target>최대절전모드</target>
-
<source>Scanning...</source>
<target>스캔 중...</target>
@@ -1299,9 +1412,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>정보</target>
-<source>Warning</source>
-<target>경고</target>
-
<source>Select all</source>
<target>모두 선택</target>
@@ -1345,8 +1455,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>환경설정</target>
-<source>Copy NTFS permissions</source>
-<target>NTFS 권한 복사</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>DACL, SACL, 소유자, 그룹 복사</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>외부 응용 프로그램을 Context Menu에 통합. 다음 매크로가 사용 가능합니다:</target>
@@ -1376,10 +1486,10 @@ This guarantees a consistent state even in case of a serious error.
<target>좌측 폴더의 미러 백업을 만듭니다. 우측 폴더는 좌측 폴더와 완전히 일치하게 됩니다.</target>
<source>Copy new and updated files to the right folder.</source>
-<target>신규 또는 업데이트 된 파일을 우측 폴더로 복사</target>
+<target>신규 또는 업데이트 된 파일을 우측 폴더로 복사.</target>
<source>Configure your own synchronization rules.</source>
-<target>개인 동기화 규칙 설정</target>
+<target>개인 동기화 규칙 설정.</target>
<source>Today</source>
<target>오늘</target>
@@ -1441,27 +1551,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>퍼센티지(%)</target>
+<source>Unable to register to receive system messages.</source>
+<target>시스템 메시지 수신을 위한 등록을 할 수 없습니다.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>%x에 대한 장치 알림 등록을 할 수 없습니다.</target>
+
<source>Cannot monitor directory %x.</source>
<target>디렉토리 %x을(를) 모니터링 할 수 없습니다.</target>
-<source>Cannot delete file %x.</source>
-<target>파일 %x을(를) 삭제할 수 없습니다.</target>
-
<source>The file is locked by another process:</source>
<target>파일이 다른 프로세스에 의해 잠겨 있습니다:</target>
-<source>Cannot move file %x to %y.</source>
-<target>파일 %x을(를) %y(으)로 이동할 수 없습니다.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>디렉토리 %x을(를) 삭제할 수 없습니다.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>%x의 파일 속성을 쓸 수 없습니다.</target>
-<source>Cannot write modification time of %x.</source>
-<target>%x의 수정 시간을 쓸 수 없습니다.</target>
-
<source>Cannot read security context of %x.</source>
<target>%x의 보안 컨텍스트를 읽을 수 없습니다.</target>
@@ -1471,33 +1575,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>%x의 권한을 읽을 수 없습니다.</target>
-<source>Cannot write permissions of %x.</source>
-<target>%x의 권한을 쓸 수 없습니다.</target>
-
-<source>Cannot create directory %x.</source>
-<target>디렉토리 %x을(를) 생성할 수 없습니다.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>심볼릭 링크 %x을(를) %y(으)로 복사할 수 없습니다.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>%x에서 %y(으)로의 권한을 복사할 수 없습니다.</target>
<source>Cannot find system function %x.</source>
<target>시스템 함수 %x을(를) 찾을 수 없습니다.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>%x에서 %y(으)로의 속성을 복사할 수 없습니다.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>파일 %x을(를) %y(으)로 복사할 수 없습니다.</target>
<source>Type of item %x is not supported:</source>
<target>항목 %x의 형식은 지원되지 않습니다:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>심볼릭 링크 %x을(를) 해결할 수 없습니다.</target>
-
-<source>Cannot open directory %x.</source>
-<target>디렉토리 %x을(를) 열 수 없습니다.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>디렉토리 %x을(를) 열거할 수 없습니다.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1528,9 +1620,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x일</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>시스템 메시지 수신을 위한 등록을 할 수 없습니다.</target>
-
<source>Cannot set privilege %x.</source>
<target>권한 %x을(를) 설정할 수 없습니다.</target>
@@ -1540,23 +1629,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>프로세스 I/O 우선순위 변경을 할 수 없습니다.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>휴지통으로 %x을(를) 이동할 수 없습니다.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
-<target>폴더 %x 실패에 관한 휴지통 확인</target>
-
-<source>Cannot determine final path for %x.</source>
-<target>%x에 대한 최종 경로를 결정할 수 없습니다.</target>
-
-<source>Error Code %x:</source>
-<target>오류 코드 %x</target>
+<target>폴더 %x에 관한 휴지통 실패 확인 중.</target>
-<source>Cannot read the following XML elements:</source>
+<source>The following XML elements could not be read:</source>
<target>다음 XML 요소를 읽을 수 없습니다:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>구성 파일 %x이(가) 부분적으로만 로드 되었음.</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>
@@ -1595,10 +1675,10 @@ This guarantees a consistent state even in case of a serious error.
<target>파일만 복사</target>
<source>Choose a directory for installation:</source>
-<target>설치할 디렉토리를 선택하세요 :</target>
+<target>설치할 디렉토리를 선택하세요:</target>
<source>Create shortcuts:</source>
-<target>바로가기 생성 :</target>
+<target>바로가기 생성:</target>
<source>Desktop</source>
<target>바탕화면</target>
diff --git a/FreeFileSync/Build/Languages/lithuanian.lng b/FreeFileSync/Build/Languages/lithuanian.lng
index 2c43b1ca..29994868 100644
--- a/FreeFileSync/Build/Languages/lithuanian.lng
+++ b/FreeFileSync/Build/Languages/lithuanian.lng
@@ -7,15 +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>Cannot copy attributes from %x to %y.</source>
-<target></target>
-
-<source>Cannot copy permissions from %x to %y.</source>
-<target></target>
-
-<source>Cannot find file %x.</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>Abi pusės buvo pakeistos nuo paskutinio suvienodinimo.</target>
@@ -59,11 +50,14 @@
<target>Atsirado išimtis</target>
<source>A directory path is expected after %x.</source>
-<target>Reikalingas katalogo kelias po %x</target>
+<target>Reikalingas katalogo kelias po %x.</target>
<source>Syntax error</source>
<target>Sintaksės klaida</target>
+<source>Cannot find file %x.</source>
+<target>Negalima surasti failo %x.</target>
+
<source>File %x does not contain a valid configuration.</source>
<target>Failas %x neturi tinkamų nustatymų.</target>
@@ -83,25 +77,25 @@
<target>Sintaksė:</target>
<source>global config file:</source>
-<target>bendrinis konfigūracinis failas</target>
+<target>bendrinis konfigūracinis failas:</target>
<source>config files:</source>
-<target>konfigūracinis failas</target>
+<target>konfigūracinis failas:</target>
<source>directory</source>
<target>katalogas</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
-<target>Kelias iki alternatyvaus GlobalSettings.xml failo</target>
+<target>Kelias iki alternatyvaus GlobalSettings.xml failo.</target>
<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
-<target>Neribotas kiekis FreeFileSync .ffs_gui ir/arba .ffs_batch konfigūracinių failų</target>
+<target>Neribotas kiekis FreeFileSync .ffs_gui ir/arba .ffs_batch konfigūracinių failų.</target>
<source>Any number of alternative directory pairs for at most one config file.</source>
-<target>Bet koks skaičius alternatyvių katalogų grupuojams tik su vienu konfigūraciniu failu</target>
+<target>Bet koks skaičius alternatyvių katalogų grupuojams tik su vienu konfigūraciniu failu.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Atidaryti ir koreguoti pasirinkimus be programos vykdymo</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Atidaryti parinktis ir keisti jų konfiguraciją, ne aktyvuojant jų.</target>
<source>Cannot find the following folders:</source>
<target>Nepavyksta rasti šių aplankų:</target>
@@ -116,7 +110,7 @@
<target>Atitinkamas aplankas bus laikomas tuščiu.</target>
<source>The following folder paths are dependent from each other:</source>
-<target>Sekančios aplankų nuorodos yra priklausomos viena nuo kitos</target>
+<target>Sekančios aplankų nuorodos yra priklausomos viena nuo kitos:</target>
<source>File %x has an invalid date.</source>
<target>Failas %x turi netinkamą datą.</target>
@@ -208,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Nenumatytas duomenų srautas.
+Numatytas: %x baitai
+Esamas: %y baitai
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Nepavyksta įrašyti leidimų %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Nepavyko nukopijuoti simbolinės nuorodos %x į %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Nepavyksta perkelti failo %x į %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Nepavyksta sunumeruoti direktorijos %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Nepavyko perskaityti failo %x atributų.</target>
+
+<source>Cannot find %x.</source>
+<target>Negalima surasti %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>%x failo nepavyko atidaryti.</target>
+
+<source>Cannot find device %x.</source>
+<target>Negalima surasti įrenginio %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Negalima nustatyti laisvos disko dalies %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Nepavyksta sukurti katalogo %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Nepavyksta ištrinti katalogo %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Nepavyksta ištrinti failo %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Nepavyksta šrašyti pakeitimo datos %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Galutinio %x kelio rasti nepavyko.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Nepavyko rasti simbolinės nuorodos %x reikšmės.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>%x į šiukšliadėžę perkelti nepavyko.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Nepavyksta atversti direktorijos %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Netaisyklinga Komandinė eilutė:</target>
+
+<source>Error Code %x:</source>
+<target>Klaidos kodas %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Nepavyko prisijungti prie SFTP serverio %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -240,13 +314,7 @@
<target>Duomenų bazės failo %x dar nėra.</target>
<source>Database file is corrupt:</source>
-<target>Duomenų bazės failas 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>
+<target>Duomenų bazės failas sugadintas:</target>
<source>Database files do not share a common session.</source>
<target>Duomenų bazės failai nesidalina bendros sesijos.</target>
@@ -254,14 +322,14 @@
<source>Searching for folder %x...</source>
<target>Ieškoma aplanko %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Nepavyko perskaityti failo %x atributų</target>
+<source>Time out 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>
+<target>Laukiama kol katalogas yra užrakintas:</target>
<source>Lock owner:</source>
<target>Užrakto savininkas:</target>
@@ -317,7 +385,7 @@
<target>/sek.</target>
<source>%x items/sec</source>
-<target>%x elementų/sekundę</target>
+<target>%x elementų/sek.</target>
<source>Show in Explorer</source>
<target>Rodyti naršyklėje</target>
@@ -335,7 +403,7 @@
<target>Prašome naudoti 64-bit FreeFileSync versiją, kad sukurti šėšėlines kopijas šioje sistemoje.</target>
<source>Cannot determine volume name for %x.</source>
-<target>Vietos vardo %x nustatyti nepavyko</target>
+<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>
@@ -344,7 +412,16 @@
<target>Stabdymo užklausa: Laukiama, kol pasibaigs einamasis procesas...</target>
<source>Unable to create time stamp for versioning:</source>
-<target>Nepavyko sukurti versijos laiko žymą</target>
+<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>
<source>&Open...</source>
<target>&Atversti...</target>
@@ -383,7 +460,7 @@
<target>Kad pradėti tiesiog importuokite .ffs_batch failą.</target>
<source>Folders to watch:</source>
-<target>Stebimi aplankai</target>
+<target>Stebimi aplankai:</target>
<source>Add folder</source>
<target>Pridėti aplanką</target>
@@ -394,17 +471,14 @@
<source>Browse</source>
<target>Naršyti</target>
-<source>Select a folder</source>
-<target>Pažymėti aplanką</target>
-
<source>Idle time (in seconds):</source>
-<target>Nenaudojamas laikas (sekundėmis)</target>
+<target>Nenaudojamas laikas (sekundėmis):</target>
<source>Idle time between last detected change and execution of command</source>
<target>Neveiklus laikas tarp paskutinio aptikto pokyčio ir komandos įvykdymo</target>
<source>Command line:</source>
-<target>Komandinė eilutė</target>
+<target>Komandinė eilutė:</target>
<source>
The command is triggered if:
@@ -450,9 +524,6 @@ Komanda inicijuojama jei:
<source>&Quit</source>
<target>&Išeiti</target>
-<source>Incorrect command line:</source>
-<target>Netaisyklinga Komandinė eilutė:</target>
-
<source>&Retry</source>
<target>&Bandyti vėl</target>
@@ -507,18 +578,18 @@ Komanda inicijuojama jei:
<source>Updating attributes of %x</source>
<target>Atnaujinami atributai %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>Creating a Volume Shadow Copy for %x...</source>
<target>%x kuriamas Duomenų Šešėlinė Kopija...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Duomenų patikros klaida: %x ir %y turinys yra skirtingas.</target>
-
<source>Target folder %x already existing.</source>
<target>Tikslo aplankas %x jau yra.</target>
-<source>Cannot find folder %x.</source>
-<target>Negalima rasti aplanko %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Tikslo aplanko įvesties laukas negali būti tuščias.</target>
@@ -526,13 +597,13 @@ Komanda inicijuojama jei:
<target>Šaltinio aplankas %x nerastas.</target>
<source>Please enter a target folder for versioning.</source>
-<target>Prašome nurodyti aplanką kitoms versijoms</target>
+<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>Šie katalogai yra labai skirtingi. Įsitikinkite, kad suvienodinimui pasirinkote teisingus katalogus.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Sekantys aplankai yra su žyniais skirtumais. Įsitikinkite, kad pasirinkote suvienodinimui teisingus aplankus.</target>
<source>Not enough free disk space available in:</source>
<target>Nepakanka laisvos disko vietos:</target>
@@ -544,7 +615,7 @@ Komanda inicijuojama jei:
<target>Pasiekiama:</target>
<source>Multiple folder pairs write to a common subfolder. Please review your configuration.</source>
-<target>Aplankai grupuojami į vieną poaplankį. Prašome patikrinti jūsų pasirinkimus</target>
+<target>Aplankai grupuojami į vieną poaplankį. Prašome patikrinti jūsų pasirinkimus.</target>
<source>Synchronizing folder pair:</source>
<target>Suvienodinama aplankų pora:</target>
@@ -558,12 +629,18 @@ Komanda inicijuojama jei:
<source>Synchronization stopped</source>
<target>Suvienodinimas sustabdytas</target>
+<source>Stopped</source>
+<target>Sustabdyta</target>
+
<source>Synchronization completed with errors</source>
<target>Suvienodinimas baigtas su klaidomis</target>
<source>Synchronization completed with warnings</source>
<target>Suvienodinimas baigtas su perspėjimais</target>
+<source>Warning</source>
+<target>Perspėjimas</target>
+
<source>Nothing to synchronize</source>
<target>Nėra ko suvienodinti</target>
@@ -573,11 +650,8 @@ Komanda inicijuojama jei:
<source>Cleaning up old log files...</source>
<target>Išvalomi seni žurnalo įrašai...</target>
-<source>Stopped</source>
-<target>Sustabdyta</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
-<target>Sprendžiant šią problemą, galite persijungti i FreeFileSync pagrindinį langą,</target>
+<target>Sprendžiant šią problemą, galite persijungti i FreeFileSync pagrindinį langą.</target>
<source>&Don't show this warning again</source>
<target>& Nerodyti daugiau šio perspįpėjimo</target>
@@ -626,7 +700,7 @@ Komanda inicijuojama jei:
<target>FreeFileSync yra naujausia.</target>
<source>Unable to connect to www.freefilesync.org.</source>
-<target>Nepavyko prisijungti prie www.freefilesync.org</target>
+<target>Nepavyko prisijungti prie www.freefilesync.org.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Dabartinės FreeFileSync versijos numeris internete nerastas. Ar norėtumėte patikrinti rankiniu būdu?</target>
@@ -667,9 +741,6 @@ Komanda inicijuojama jei:
<source>Action</source>
<target>Veiksmas</target>
-<source>Drag && drop</source>
-<target>Vilkti && Numesti</target>
-
<source>Local comparison settings</source>
<target>Vietiniai palyginimo parametrai</target>
@@ -700,6 +771,9 @@ Komanda inicijuojama jei:
<source>Local Synchronization Settings</source>
<target>Vietiniai Suvienodinimo Parametrai</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>FreeFileSync negali naudoti pasirinkto aplanko %x. Prašome pasirinkti aplanką vietinėje failų sistemoje, tinkle arba MTP įrenginį.</target>
+
<source>&New</source>
<target>&Naujas</target>
@@ -769,6 +843,9 @@ Komanda inicijuojama jei:
<source>Remove folder pair</source>
<target>Pašalinti aplankų porą</target>
+<source>Select SFTP folder</source>
+<target>Pasirinkti SFTP aplanką</target>
+
<source>Swap sides</source>
<target>Sukeisti puses</target>
@@ -794,7 +871,7 @@ Komanda inicijuojama jei:
<target>Išsaugoti kaip...</target>
<source>View type:</source>
-<target>Rodymo būdai</target>
+<target>Rodymo būdai:</target>
<source>Select view:</source>
<target>Pasirinkti rodymo būdą:</target>
@@ -815,10 +892,10 @@ Komanda inicijuojama jei:
<target>Viso baitų kopijuoti</target>
<source>Use local settings:</source>
-<target>Naudoti vietinius nustatymus</target>
+<target>Naudoti vietinius nustatymus:</target>
<source>Select a variant:</source>
-<target>Pasirinkti variantą</target>
+<target>Pasirinkti variantą:</target>
<source>Identify equal files by comparing modification time and size.</source>
<target>Sutapatinti vienodus failus lyginant failų modifikavimo laiką ir dydį.</target>
@@ -826,8 +903,8 @@ Komanda inicijuojama jei:
<source>Identify equal files by comparing the file content.</source>
<target>Sutapatinti vienodus failus lyginant failų turinį.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignoruoti laiko pasikeitimą (valandomis)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignoruoti laiko skirtumą (valandomis)</target>
<source>Consider file times with specified offset as equal</source>
<target>Failai su tam tikra paklaida skaitomi kaip lygūs</target>
@@ -835,20 +912,20 @@ Komanda inicijuojama jei:
<source>Handle daylight saving time</source>
<target>Naudoti vasaros laiką</target>
-<source>Include symbolic links:</source>
-<target>Pridėti simbolines nuorodas:</target>
+<source>Include &symbolic links:</source>
+<target>Pridėti &simbolines nuorodas:</target>
-<source>Direct</source>
-<target>Tiesiogiai</target>
+<source>&Follow</source>
+<target>&Sekti</target>
-<source>Follow</source>
-<target>Sekti</target>
+<source>&Direct</source>
+<target>&Tiesiogiai</target>
<source>More information</source>
<target>Daugiau informacijos</target>
<source>Local settings:</source>
-<target>Vietiniai nustatymai</target>
+<target>Vietiniai nustatymai:</target>
<source>Include:</source>
<target>Įtraukti:</target>
@@ -881,14 +958,14 @@ Komanda inicijuojama jei:
<target>Rasti perkeltus failus</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Aptikimas aktyvuosis pradėjus suvienodinimui
-- Sukuriami būtini duomenų bazės failai
- Nesuderinama su visomis failų sistemomis
+- Būtini ir sukuriami duomenų bazės failai
+- Pirmame suderinime aptikimas negalimas
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -936,6 +1013,27 @@ Komanda inicijuojama jei:
<source>OK</source>
<target>Gerai</target>
+<source>Enter your SFTP login details:</source>
+<target>Įveskite jūsų SFTP prisijungimo duomenis:</target>
+
+<source>Server name or IP address:</source>
+<target>Serverio vardas arba IP adresas:</target>
+
+<source>Examples:</source>
+<target>Pavyzdžiai:</target>
+
+<source>User name:</source>
+<target>Vartotojo vardas:</target>
+
+<source>Password:</source>
+<target>Slaptažodis:</target>
+
+<source>&Show password</source>
+<target>&Rodyti slaptažodį</target>
+
+<source>Directory on server:</source>
+<target>Katalogas serveryje:</target>
+
<source>Start synchronization now?</source>
<target>Dabar pradėti suvienodinimą?</target>
@@ -945,6 +1043,9 @@ Komanda inicijuojama jei:
<source>&Don't show this dialog again</source>
<target>&Nerodyti pakartotinai šio dialogo lango</target>
+<source>Arrange folder pair</source>
+<target>Sulygiuoti pagal aplanko porą</target>
+
<source>Items found:</source>
<target>Rasta elementų:</target>
@@ -994,7 +1095,7 @@ Komanda inicijuojama jei:
<target>Apriboti ataskaitų failų skaičių</target>
<source>How can I schedule a batch job?</source>
-<target>Kaip aš galiu užduočių paketą įtraukti į tvarkaraštį ?</target>
+<target>Kaip aš galiu užduočių paketą įtraukti į tvarkaraštį?</target>
<source>The following settings are used for all synchronization jobs.</source>
<target>Sekantys parametrai yra naudojami visiems suvienodinimo darbams.</target>
@@ -1077,6 +1178,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Many thanks for localization:</source>
<target>Labai dėkojame už vertimą:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH Failų Persiuntimo Protokolas</target>
+
<source>Save as Batch Job</source>
<target>Išsaugoti kaip užduočių paketą</target>
@@ -1089,8 +1193,8 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Select Time Span</source>
<target>Pasirinkti laiko atkarpą</target>
-<source>&Preferences...</source>
-<target>&Pirmenybė...</target>
+<source>&Preferences</source>
+<target>&Pirmenybės</target>
<source>Main Bar</source>
<target>Pagrindinė įrankinė</target>
@@ -1222,8 +1326,8 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Do&n't save</source>
<target>&Nesaugoti</target>
-<source>Delete selected configurations</source>
-<target>Ištrinti pasirinktus parametrus</target>
+<source>Remove entry from list</source>
+<target>Pašalinti įrašą iš sarašo</target>
<source>Synchronization Settings</source>
<target>Suvienodinimo parametrai</target>
@@ -1276,8 +1380,8 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Show filtered or temporarily excluded files</source>
<target>Rodyti išfiltruotus ar laikinai išskirtus failus</target>
-<source>Set as default</source>
-<target>Nustatyti kaip numatytą</target>
+<source>Save as default</source>
+<target>Išsaugoti kaip pagrindinį</target>
<source>Filter</source>
<target>Filtras</target>
@@ -1288,6 +1392,12 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Cannot find %x</source>
<target>Nepavyksta rasti %x</target>
+<source>Move up</source>
+<target>Perkelti į viršų</target>
+
+<source>Move down</source>
+<target>Perkelti į apačią</target>
+
<source>Comma-separated values</source>
<target>Kableliu atskirtos reikšmės</target>
@@ -1318,9 +1428,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Info</source>
<target>Informacija</target>
-<source>Warning</source>
-<target>Perspėjimas</target>
-
<source>Select all</source>
<target>Pažymėti visus</target>
@@ -1368,8 +1475,8 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Preferences</source>
<target>Pirmenybės</target>
-<source>Copy NTFS permissions</source>
-<target>Kopijuoti NTFS leidimus</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Kopijuoti DACL, SACL, Owner, Group</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integruoti išorines programas į kontekstinį meniu. Sekantys makro galimi:</target>
@@ -1387,7 +1494,7 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<target>- Kitos pusės atitikmuo %item_folder%</target>
<source>Show hidden dialogs and warning messages again?</source>
-<target>Ar vėl rodyti visus paslėptus dialogo langus ir įspėjamuosius pranešimus</target>
+<target>Ar vėl rodyti visus paslėptus dialogo langus ir įspėjamuosius pranešimus?</target>
<source>&Show</source>
<target>&Rodyti</target>
@@ -1464,27 +1571,21 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Percentage</source>
<target>Procentai</target>
+<source>Unable to register to receive system messages.</source>
+<target>Nepavyko aktyvuoti sisteminių žinučių gavimo funkciją.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Nepavyko priregistruoti %x įrenginio pranešimų.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Nepavyko stebėti katalogo %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Nepavyksta ištrinti failo %x.</target>
-
<source>The file is locked by another process:</source>
<target>Failas yra užrakintas kito procceso:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Nepavyksta perkelti failo %x į %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Nepavyksta ištrinti katalogo %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Nepavyksta įrašyti atributų failui %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Nepavyksta šrašyti pakeitimo datos %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Nepavyksta perskaityti %x saugumo konteksto.</target>
@@ -1494,36 +1595,21 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Cannot read permissions of %x.</source>
<target>Nepavyksta perskaityti %x leidimų.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Nepavyksta įrašyti leidimų %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Nepavyksta sukurti katalogo %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Nepavyko nukopijuoti simbolinės nuorodos %x į %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Nepavyko nukopijuoti leidimų iš %x į %y.</target>
<source>Cannot find system function %x.</source>
<target>Nepavyksta rasti sisteminės funkcijos %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Nepavyko nukopijuoti atributų iš %x į %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Nepavyksta nukopijuoti failų %x į %y.</target>
<source>Type of item %x is not supported:</source>
<target>Elemento tipas %x nepalaikomas:</target>
-<source>Cannot open file %x.</source>
-<target>%x failo nepavyko atidaryti.</target>
-
-<source>Cannot resolve symbolic link %x.</source>
-<target>Nepavyko rasti simbolinės nuorodos %x reikšmės</target>
-
-<source>Cannot open directory %x.</source>
-<target>Nepavyksta atversti direktorijos %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Nepavyksta sunumeruoti direktorijos %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1560,9 +1646,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<pluralform>%x dienų</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Nepavyko aktyvuoti sisteminių žinučių gavimo funkciją.</target>
-
<source>Cannot set privilege %x.</source>
<target>Nepavyksta nustatyti privilegijos %x.</target>
@@ -1572,32 +1655,23 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Cannot change process I/O priorities.</source>
<target>Nepavyksta pakeisti proceso I/O prioritetų.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>%x į šiukšliadėžę perkelti nepavyko</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Tikrinama šiukšliadėžė. Failas %x nerastas.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Galutinio %x kelio rasti nepavyko</target>
-
-<source>Error Code %x:</source>
-<target>Klaidos kodas %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Nepavyksta perskaityti sekančių XML elementų:</target>
+<source>The following XML elements could not be read:</source>
+<target>Šie XML elementai yra neperskaitomi:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Nustatymų failas %x įkeltas tik dalinai.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Konfiguracinis failas %x yra neužbaigtas. Trūkstamiems elementams bus priskirtos pradinės rekšmės.</target>
<source>Prepare installation</source>
<target>Ruošiamasi įdiegimui</target>
<source>Choose which components you want to install.</source>
-<target>Pasirinkite kuriuos komponentus norėtumėte įdiegti</target>
+<target>Pasirinkite kuriuos komponentus norėtumėte įdiegti.</target>
<source>Select installation type:</source>
-<target>Pasirinkti įdiegimo būdą</target>
+<target>Pasirinkti įdiegimo būdą:</target>
<source>Local</source>
<target>Vietoje</target>
diff --git a/FreeFileSync/Build/Languages/norwegian.lng b/FreeFileSync/Build/Languages/norwegian.lng
index 1f857220..37efb208 100644
--- a/FreeFileSync/Build/Languages/norwegian.lng
+++ b/FreeFileSync/Build/Languages/norwegian.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Syntaksfeil</target>
-<source>Cannot open file %x.</source>
-<target>Filen %x kan ikke åpnes.</target>
+<source>Cannot find file %x.</source>
+<target></target>
<source>File %x does not contain a valid configuration.</source>
<target>Filen %x inneholder ikke gyldige innstillinger.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Et ubegrenset antall alternative kataloger for maksimalt én konfigurasjonsfil</target>
-<source>Open configuration for edit without executing.</source>
-<target>Åpne konfigurasjon for å redigere, uten å kjøre den</target>
+<source>Open configuration for editing without executing it.</source>
+<target></target>
<source>Cannot find the following folders:</source>
<target>Kan ikke finne følgende mapper:</target>
@@ -202,6 +202,82 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target></target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Kan ikke skrive tillatelsene til %x.</target>
+
+<source>Operation not supported for different base folder types.</source>
+<target></target>
+
+<source>Cannot write file %x.</source>
+<target>Kan ikke opprette filen %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Kan ikke kopiere symolsk link %x til %y</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Kan ikke flytte filen %x til %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Kan ikke telle mappen %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Kan ikke lese filattributterne på %x.</target>
+
+<source>Cannot find %x.</source>
+<target></target>
+
+<source>Cannot open file %x.</source>
+<target>Filen %x kan ikke åpnes.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Kan ikke slette mappen %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Kan ikke slette filen %x.</target>
+
+<source>Cannot find device %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target></target>
+
+<source>Cannot create directory %x.</source>
+<target>Kan ikke opprette mappen %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Kan ikke oppdatere tidsendring på %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Kan ikke bestemme endelig sti for %x</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Kan ikke følge symlinken %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Kunne ikke flytte %x til papirkurv.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Kan ikke åpne mappen %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Ugyldig kommando:</target>
+
+<source>Error Code %x:</source>
+<target>Feilkode %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target></target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +311,14 @@
<source>Database file is corrupt:</source>
<target>Databasefilen er ødelagt:</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>Database files do not share a common session.</source>
<target>Databasefiler kan ikke dele handling.</target>
<source>Searching for folder %x...</source>
<target>Søker etter mappen %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Kan ikke lese filattributterne på %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target></target>
<source>Cannot get process information.</source>
<target>Kan ikke hente prosessinformasjon.</target>
@@ -337,6 +407,15 @@
<source>Unable to create time stamp for versioning:</source>
<target>Kan ikke opprette tidsstempel til versionering:</target>
+<source>Drag && drop</source>
+<target>Trekk mapper hit</target>
+
+<source>Cannot find folder %x.</source>
+<target>Finner ikke mappen %x.</target>
+
+<source>Select a folder</source>
+<target>Velg en mappe</target>
+
<source>&Open...</source>
<target>&Åpne...</target>
@@ -385,9 +464,6 @@
<source>Browse</source>
<target><Søk</target>
-<source>Select a folder</source>
-<target>Velg en mappe</target>
-
<source>Idle time (in seconds):</source>
<target>PC ikke brukt i (sek)</target>
@@ -441,9 +517,6 @@ Kommandoen utføres hvis:
<source>&Quit</source>
<target>&Avslutt</target>
-<source>Incorrect command line:</source>
-<target>Ugyldig kommando:</target>
-
<source>&Retry</source>
<target>&Prøv igjen</target>
@@ -498,18 +571,18 @@ Kommandoen utføres hvis:
<source>Updating attributes of %x</source>
<target>Oppdaterer attributter for %x</target>
+<source>%x and %y have different content.</source>
+<target></target>
+
+<source>Data verification error:</source>
+<target></target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Oppretter VSS kopi for %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Godkjennelsesfeil: %x og %y har forskellig innhold</target>
-
<source>Target folder %x already existing.</source>
<target>Destinasjonsmappen %x finnes allerede.</target>
-<source>Cannot find folder %x.</source>
-<target>Finner ikke mappen %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Destinasjonsmappen skal angis.</target>
@@ -522,8 +595,8 @@ Kommandoen utføres hvis:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Følgende mapper har uløste konflikter og synkroniseres ikke:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Følgende mapper har markante forskeller. Kontroller at du synkroniserer de rigtige mapper</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target></target>
<source>Not enough free disk space available in:</source>
<target>Ikke nok ledig diskplass på:</target>
@@ -549,12 +622,18 @@ Kommandoen utføres hvis:
<source>Synchronization stopped</source>
<target>Synkronisering avbrudt</target>
+<source>Stopped</source>
+<target>Avbrutt</target>
+
<source>Synchronization completed with errors</source>
<target>Synkronisering gjennomført med feil</target>
<source>Synchronization completed with warnings</source>
<target>Synkronisering gjennomført med advarsel</target>
+<source>Warning</source>
+<target>Advarsel</target>
+
<source>Nothing to synchronize</source>
<target>Alt er synkronisert</target>
@@ -564,9 +643,6 @@ Kommandoen utføres hvis:
<source>Cleaning up old log files...</source>
<target>Fjerner gamle loggfiler</target>
-<source>Stopped</source>
-<target>Avbrutt</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Skift til FreeFileSyncs hovedvindu for at løse problemet.</target>
@@ -657,9 +733,6 @@ Kommandoen utføres hvis:
<source>Action</source>
<target>Handling</target>
-<source>Drag && drop</source>
-<target>Trekk mapper hit</target>
-
<source>Local comparison settings</source>
<target>Lokale sammenlignings-instillinger</target>
@@ -690,6 +763,9 @@ Kommandoen utføres hvis:
<source>Local Synchronization Settings</source>
<target>Lokale synkroniseringsinstillinger</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target></target>
+
<source>&New</source>
<target>&Ny</target>
@@ -759,6 +835,9 @@ Kommandoen utføres hvis:
<source>Remove folder pair</source>
<target>Fjern mappepar</target>
+<source>Select SFTP folder</source>
+<target></target>
+
<source>Swap sides</source>
<target>Bytt side</target>
@@ -816,8 +895,8 @@ Kommandoen utføres hvis:
<source>Identify equal files by comparing the file content.</source>
<target>Gjennkjenn like filer etter innhold.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignorer tidsbytte (i timer)</target>
+<source>&Ignore time shift (in hours)</source>
+<target></target>
<source>Consider file times with specified offset as equal</source>
<target>Vurder filtidspunkt med spesifisert oppstilling som like</target>
@@ -825,14 +904,14 @@ Kommandoen utføres hvis:
<source>Handle daylight saving time</source>
<target>Behandle sommertid</target>
-<source>Include symbolic links:</source>
-<target>Inkluder symbolske linker:</target>
+<source>Include &symbolic links:</source>
+<target></target>
-<source>Direct</source>
-<target>Direkte</target>
+<source>&Follow</source>
+<target></target>
-<source>Follow</source>
-<target>Følg</target>
+<source>&Direct</source>
+<target></target>
<source>More information</source>
<target>Mer informasjon</target>
@@ -871,15 +950,11 @@ Kommandoen utføres hvis:
<target>Gjennkjenn flyttede filer</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
-<target>
-- Detektering er aktiv etter første synkronisering
-- Krever og skaper databasefiler
-- Ikke støttet av alle filsystemer
-</target>
+<target></target>
<source>Detect synchronization directions with the help of database files</source>
<target>Gjennkjenn synkretninger ved hjelp av databasefiler</target>
@@ -926,6 +1001,29 @@ Kommandoen utføres hvis:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target></target>
+
+<source>Server name or IP address:</source>
+<target></target>
+
+<source>Examples:</source>
+<target></target>
+
+<source>User name:</source>
+<target></target>
+
+<source>Password:</source>
+<target></target>
+
+<source>&Show password</source>
+<target></target>
+
+<source>Directory on server:</source>
+<target></target>
+
+
+
<source>Start synchronization now?</source>
<target>Synkroniser nå?</target>
@@ -935,6 +1033,9 @@ Kommandoen utføres hvis:
<source>&Don't show this dialog again</source>
<target>&Ikke vis igjen</target>
+<source>Arrange folder pair</source>
+<target></target>
+
<source>Items found:</source>
<target>Mapper funnet:</target>
@@ -1064,6 +1165,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>Takk for oversettelse:</target>
+<source>SSH File Transfer Protocol</source>
+<target></target>
+
<source>Save as Batch Job</source>
<target>Lagre som batchfil</target>
@@ -1076,8 +1180,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Velg tidsintervall</target>
-<source>&Preferences...</source>
-<target>&Egenskaper</target>
+<source>&Preferences</source>
+<target></target>
+
+<source>Main Bar</source>
+<target>Hovedlinje</target>
<source>Folder Pairs</source>
<target>Mappepar</target>
@@ -1094,9 +1201,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>Oversikt</target>
-<source>Main Bar</source>
-<target>Hovedlinje</target>
-
<source>Confirm</source>
<target>Bekreft</target>
@@ -1205,8 +1309,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&Ikke lagre</target>
-<source>Delete selected configurations</source>
-<target>Slett valgte innstillinger</target>
+<source>Remove entry from list</source>
+<target></target>
<source>Synchronization Settings</source>
<target>Synkroniseringsinnstillinger</target>
@@ -1259,8 +1363,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>Vis filtrerte eller midlertidig ekskluderte filer</target>
-<source>Set as default</source>
-<target>Sett som standard</target>
+<source>Save as default</source>
+<target></target>
<source>Filter</source>
<target>Filter</target>
@@ -1271,6 +1375,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot find %x</source>
<target>Kan ikke finne %x</target>
+<source>Move up</source>
+<target></target>
+
+<source>Move down</source>
+<target></target>
+
<source>Comma-separated values</source>
<target>Kommaoppdelte verdier</target>
@@ -1283,18 +1393,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>Lukk dialogen</target>
-<source>Standby</source>
-<target>Standby</target>
-
<source>Log off</source>
<target>Logg av</target>
+<source>Standby</source>
+<target>Standby</target>
+
<source>Shut down</source>
<target>Avslutt</target>
-<source>Hibernate</source>
-<target>Dvale</target>
-
<source>Scanning...</source>
<target>Skanner...</target>
@@ -1304,9 +1411,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Advarsel</target>
-
<source>Select all</source>
<target>Velg alt</target>
@@ -1352,8 +1456,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>Egenskaper</target>
-<source>Copy NTFS permissions</source>
-<target>Kopier NTFS tillatelser</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target></target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrer eksterne programmer i kontekstmeny. Bruk følgende makroer:</target>
@@ -1448,27 +1552,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>Prosent</target>
+<source>Unable to register to receive system messages.</source>
+<target>Kunne ikke registrere mottakelse av systembesjkeder.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target></target>
+
<source>Cannot monitor directory %x.</source>
<target>Kan ikke overvåke mappen %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Kan ikke slette filen %x.</target>
-
<source>The file is locked by another process:</source>
<target>Filen er låst av en annen prosess:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Kan ikke flytte filen %x til %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Kan ikke slette mappen %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Kan ikke skrive filattributter til %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Kan ikke oppdatere tidsendring på %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Kan ikke lese sikkerhetsinnstillinger på %x.</target>
@@ -1478,33 +1576,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>Kan ikke lese tillatelsene på %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Kan ikke skrive tillatelsene til %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Kan ikke opprette mappen %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Kan ikke kopiere symolsk link %x til %y</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target></target>
<source>Cannot find system function %x.</source>
<target>Kan ikke finne systemfunksjonen %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target></target>
+
<source>Cannot copy file %x to %y.</source>
<target>Kan ikke kopiere filen %x til %y.</target>
<source>Type of item %x is not supported:</source>
<target>Filtypen %x støttes ikke:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Kan ikke følge symlinken %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Kan ikke åpne mappen %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Kan ikke telle mappen %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1538,9 +1624,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x dager</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Kunne ikke registrere mottakelse av systembesjkeder.</target>
-
<source>Cannot set privilege %x.</source>
<target>Kan ikke sette %x privilegier.</target>
@@ -1550,23 +1633,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>Kan ikke endre I/O prioriteter.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Kunne ikke flytte %x til papirkurv.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Sjekk papirkurv-feil for mappen %x</target>
-<source>Cannot determine final path for %x.</source>
-<target>Kan ikke bestemme endelig sti for %x</target>
-
-<source>Error Code %x:</source>
-<target>Feilkode %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Kan ikke lese følgende XML mapper:</target>
+<source>The following XML elements could not be read:</source>
+<target></target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Konfigureringsfilen %x er delvis innlastet</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target></target>
<source>Prepare installation</source>
<target>Forbered installering</target>
diff --git a/FreeFileSync/Build/Languages/outdated/scottish_gaelic.lng b/FreeFileSync/Build/Languages/outdated/scottish_gaelic.lng
index 97797069..26b5f438 100644
--- a/FreeFileSync/Build/Languages/outdated/scottish_gaelic.lng
+++ b/FreeFileSync/Build/Languages/outdated/scottish_gaelic.lng
@@ -1,12 +1,257 @@
<header>
<language>Gàidhlig</language>
- <translator>Michael Bauer aka Akerbeltz</translator>
+ <translator>enter your name here</translator>
<locale>gd</locale>
<image>flag_scotland.png</image>
<plural_count>4</plural_count>
<plural_definition>(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3</plural_definition>
</header>
+<source>Edit with FreeFileSync</source>
+<target></target>
+
+<source>RealtimeSync Configuration</source>
+<target></target>
+
+<source>FreeFileSync Synchronization Database</source>
+<target></target>
+
+<source>FreeFileSync Batch File</source>
+<target></target>
+
+<source>FreeFileSync Configuration</source>
+<target></target>
+
+<source>Unregistering FreeFileSync file extensions</source>
+<target></target>
+
+<source>Registering FreeFileSync file extensions</source>
+<target></target>
+
+<source>Start menu</source>
+<target></target>
+
+<source>Desktop</source>
+<target></target>
+
+<source>Create shortcuts:</source>
+<target></target>
+
+<source>Choose a directory for installation:</source>
+<target></target>
+
+<source>Just copy the files</source>
+<target></target>
+
+<source>Do not write to Registry</source>
+<target></target>
+
+<source>Save settings in installation directory</source>
+<target></target>
+
+<source>Create Explorer context menu entries</source>
+<target></target>
+
+<source>Register FreeFileSync file extensions</source>
+<target></target>
+
+<source>Save settings to "%APPDATA%\FreeFileSync"</source>
+<target></target>
+
+<source>recommended</source>
+<target></target>
+
+<source>Portable</source>
+<target></target>
+
+<source>Local</source>
+<target></target>
+
+<source>Select installation type:</source>
+<target></target>
+
+<source>Choose which components you want to install.</source>
+<target></target>
+
+<source>Prepare installation</source>
+<target></target>
+
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target></target>
+
+<source>The following XML elements could not be read:</source>
+<target></target>
+
+<source>Cannot copy attributes from %x to %y.</source>
+<target></target>
+
+<source>Cannot copy permissions from %x to %y.</source>
+<target></target>
+
+<source>Unable to register device notifications for %x.</source>
+<target></target>
+
+<source>Copy DACL, SACL, Owner, Group</source>
+<target></target>
+
+<source>Move down</source>
+<target></target>
+
+<source>Move up</source>
+<target></target>
+
+<source>Save as default</source>
+<target></target>
+
+<source>Show files that will be updated on the right side</source>
+<target></target>
+
+<source>Show files that will be updated on the left side</source>
+<target></target>
+
+<source>Remove entry from list</source>
+<target></target>
+
+<source>&Preferences</source>
+<target></target>
+
+<source>SSH File Transfer Protocol</source>
+<target></target>
+
+<source>Donate with PayPal</source>
+<target></target>
+
+<source>Arrange folder pair</source>
+<target></target>
+
+<source>Directory on server:</source>
+<target></target>
+
+<source>&Show password</source>
+<target></target>
+
+<source>Password:</source>
+<target></target>
+
+<source>User name:</source>
+<target></target>
+
+<source>Examples:</source>
+<target></target>
+
+<source>Server name or IP address:</source>
+<target></target>
+
+<source>Enter your SFTP login details:</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>&Direct</source>
+<target></target>
+
+<source>&Follow</source>
+<target></target>
+
+<source>Include &symbolic links:</source>
+<target></target>
+
+<source>&Ignore time shift (in hours)</source>
+<target></target>
+
+<source>Number of files that will be updated</source>
+<target></target>
+
+<source>Select SFTP folder</source>
+<target></target>
+
+<source>&Actions</source>
+<target></target>
+
+<source>S&ynchronization settings</source>
+<target></target>
+
+<source>&Filter settings</source>
+<target></target>
+
+<source>C&omparison settings</source>
+<target></target>
+
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target></target>
+
+<source>Unable to connect to www.freefilesync.org.</source>
+<target></target>
+
+<source>Cleaning up old log files...</source>
+<target></target>
+
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target></target>
+
+<source>Data verification error:</source>
+<target></target>
+
+<source>%x and %y have different content.</source>
+<target></target>
+
+<source>Updating symbolic link %x</source>
+<target></target>
+
+<source>Updating file %x</source>
+<target></target>
+
+<source>E&xit</source>
+<target></target>
+
+<source>Saving file %x...</source>
+<target></target>
+
+<source>Time out while searching for folder %x.</source>
+<target></target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target></target>
+
+<source>Cannot find device %x.</source>
+<target></target>
+
+<source>Cannot find %x.</source>
+<target></target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target></target>
+
+<source>Operation not supported for different base folder types.</source>
+<target></target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target></target>
+
+<source>Update right item</source>
+<target></target>
+
+<source>Update left item</source>
+<target></target>
+
+<source>Open configuration for editing without executing it.</source>
+<target></target>
+
+<source>Cannot find file %x.</source>
+<target></target>
+
<source>Both sides have changed since last synchronization.</source>
<target>Chaidh an dà thaobh atharrachadh on t-sioncronachadh mu dheireadh.</target>
@@ -55,9 +300,6 @@
<source>Syntax error</source>
<target>Mearachd co-chàraidh</target>
-<source>Cannot open file %x.</source>
-<target>Cha ghabh am faidhle %x fhosgladh.</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Chan eil rèiteachadh dligheach san fhaidhle %x.</target>
@@ -94,9 +336,6 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Àireamh sam bith de phaidhrichean pasgain eile airson aon fhaidhle rèiteachaidh air a’ char as fhaide</target>
-<source>Open configuration for edit without executing.</source>
-<target></target>
-
<source>Cannot find the following folders:</source>
<target>Chan urrainn dhuinn na pasgain a leanas a lorg:</target>
@@ -187,12 +426,6 @@
<source>Move file on right</source>
<target>Gluais am faidhle a tha air an taobh deas</target>
-<source>Update left item</source>
-<target></target>
-
-<source>Update right item</source>
-<target></target>
-
<source>Do nothing</source>
<target>Na dèan dad</target>
@@ -202,6 +435,57 @@
<source>Update attributes on right</source>
<target>Ùraich na buadhan air an taobh deas</target>
+<source>Cannot read file %x.</source>
+<target>Cha ghabh am faidhle %x a leughadh.</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Cha ghabh ceadan %x a sgrìobhadh.</target>
+
+<source>Cannot write file %x.</source>
+<target>Cha ghabh am faidhle %x a sgrìobhadh.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Cha ghabh am faidhle %x a ghluasad dha %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Cha ghabh am pasgan %x àireamhachadh.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Cha ghabh buadhan an fhaidhle %x a leughadh.</target>
+
+<source>Cannot open file %x.</source>
+<target>Cha ghabh am faidhle %x fhosgladh.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Cha ghabh am pasgan %x a chruthachadh.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Cha ghabh am pasgan %x a sguabadh às.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Cha ghabh am faidhle %x a sguabadh às.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Cha ghabh àm atharrachaidh %x a sgrìobhadh.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Chan urrainn dhuinn an t-slighe dheireannach airson %x a dhearbhadh.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Cha ghabh an symbolic link %x fhuasgladh.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Cha ghabh %x a ghluasad dhan bhiona.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Cha ghabh am pasgan %x fhosgladh.</target>
+
+<source>Incorrect command line:</source>
+<target>Loidhne-àithne chearr:</target>
+
+<source>Error Code %x:</source>
+<target>Còd na mearachd %x:</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -237,21 +521,12 @@
<source>Database file is corrupt:</source>
<target>Tha am faidhle stòir-dhàta coirbte:</target>
-<source>Cannot write file %x.</source>
-<target>Cha ghabh am faidhle %x a sgrìobhadh.</target>
-
-<source>Cannot read file %x.</source>
-<target>Cha ghabh am faidhle %x a leughadh.</target>
-
<source>Database files do not share a common session.</source>
<target>Chan eil seisean an cumantas aig na faidhlichean stòir-dhàta.</target>
<source>Searching for folder %x...</source>
<target>A’ lorg a’ phasgain %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Cha ghabh buadhan an fhaidhle %x a leughadh.</target>
-
<source>Cannot get process information.</source>
<target>Chan urrainn dhuinn greim fhaighinn air fiosrachadh a’ phròiseis.</target>
@@ -278,9 +553,6 @@
<source>Creating file %x</source>
<target>A’ cruthachadh an fhaidhle %x</target>
-<source>Saving file %x...</source>
-<target></target>
-
<source>Items processed:</source>
<target>Nithean a tha deiseil:</target>
@@ -343,15 +615,21 @@
<source>Unable to create time stamp for versioning:</source>
<target>Cha ghabh stampa ama a chruthachadh airson versioning:</target>
+<source>Drag && drop</source>
+<target>Slaod ⁊ leig às</target>
+
+<source>Cannot find folder %x.</source>
+<target>Chan urrainn dhuinn am pasgan %x a lorg</target>
+
+<source>Select a folder</source>
+<target>Tagh pasgan</target>
+
<source>&Open...</source>
<target>F&osgail...</target>
<source>Save &as...</source>
<target>Sàbhail &mar...</target>
-<source>E&xit</source>
-<target></target>
-
<source>&File</source>
<target>&Faidhle</target>
@@ -391,9 +669,6 @@
<source>Browse</source>
<target>Rùraich</target>
-<source>Select a folder</source>
-<target>Tagh pasgan</target>
-
<source>Idle time (in seconds):</source>
<target>Ùine ’na thàmh (ann an diogan):</target>
@@ -447,9 +722,6 @@ Thèid an loidhne-àithne a chur gu dol:
<source>&Quit</source>
<target>&Fàg</target>
-<source>Incorrect command line:</source>
-<target>Loidhne-àithne chearr:</target>
-
<source>&Retry</source>
<target>&Feuch ris a-rithist</target>
@@ -492,12 +764,6 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Creating folder %x</source>
<target>A’ cruthachadh a’ phasgain %x</target>
-<source>Updating file %x</source>
-<target></target>
-
-<source>Updating symbolic link %x</source>
-<target></target>
-
<source>Verifying file %x</source>
<target>A’ dearbhadh an fhaidhle %x</target>
@@ -507,15 +773,9 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Creating a Volume Shadow Copy for %x...</source>
<target>A’ cruthachadh lethbhreac sgàil draibh airson %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Mearachd le dearbhadh an dàta: tha susbaint eadar-dhealaichte ann an %x agus %y.</target>
-
<source>Target folder %x already existing.</source>
<target>Tha am pasgan-uidhe %x ann mu thràth.</target>
-<source>Cannot find folder %x.</source>
-<target>Chan urrainn dhuinn am pasgan %x a lorg</target>
-
<source>Target folder input field must not be empty.</source>
<target>Chan fhaod raon a’ phasgain a bhith falamh.</target>
@@ -528,9 +788,6 @@ Thèid an loidhne-àithne a chur gu dol:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Tha còmstrithean aig na nithean a leanas fhathast is cha dèid an sioncronachadh:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Tha diofar mòr eadar na pasganan a leanas. Dèan cinnteach gu bheil thu a’ maidseadh nam pasganan ceart airson sioncronachadh.</target>
-
<source>Not enough free disk space available in:</source>
<target>Chan eil rùm saor gu leòr air an diosga:</target>
@@ -555,24 +812,24 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Synchronization stopped</source>
<target>Sguireadh dhen t-sioncronachadh</target>
+<source>Stopped</source>
+<target>Chaidh stad a chur air</target>
+
<source>Synchronization completed with errors</source>
<target>Chaidh an sioncronachadh a choileanadh ach bha mearachdan ann</target>
<source>Synchronization completed with warnings</source>
<target>Chaidh a shioncronachadh ach bha rabhaidhean ann</target>
+<source>Warning</source>
+<target>Rabhadh</target>
+
<source>Nothing to synchronize</source>
<target>Chan eil dad ri shioncronachadh</target>
<source>Synchronization completed successfully</source>
<target>Chaidh a shioncronachadh</target>
-<source>Cleaning up old log files...</source>
-<target></target>
-
-<source>Stopped</source>
-<target>Chaidh stad a chur air</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>’S urrainn dhut leum a ghearradh gu prìomh-uinneag FreeFileSync gus an duilgheadas seo fhuasgladh.</target>
@@ -623,9 +880,6 @@ Thèid an loidhne-àithne a chur gu dol:
<source>FreeFileSync is up to date.</source>
<target>Tha FreeFileSync cho ùr ’s a ghabhas.</target>
-<source>Unable to connect to www.freefilesync.org.</source>
-<target></target>
-
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Chan urrainn dhuinn àireamh an tionndaidh làithrich aig FreeFileSync a lorg air loidhne. A bheil thu airson sùil a thoirt thu fhèin?</target>
@@ -665,9 +919,6 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Action</source>
<target>Gnìomh</target>
-<source>Drag && drop</source>
-<target>Slaod ⁊ leig às</target>
-
<source>Local comparison settings</source>
<target>Roghainnean coimeis ionadail</target>
@@ -710,21 +961,9 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Start &comparison</source>
<target>Tòisich air a’ &choimheas</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>Tòisich air an t-&sioncronachadh</target>
-<source>&Actions</source>
-<target></target>
-
<source>&Options</source>
<target>R&oghainnean</target>
@@ -803,9 +1042,6 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Number of files and folders that will be deleted</source>
<target>Àireamh nam faidhle ’s nam pasgan a thèid a sguabadh às</target>
-<source>Number of files that will be updated</source>
-<target></target>
-
<source>Number of files and folders that will be created</source>
<target>Àireamh nam faidhle ’s nam pasgan a thèid a chruthachadh</target>
@@ -824,24 +1060,12 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Identify equal files by comparing the file content.</source>
<target>Lorg faidhlichean a tha co-ionnann le bhith a’ dèanamh coimeas eadar susbaint nam faidhlichean.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Leig seachad sioft an ama (ann an uairean a thìde)</target>
-
<source>Consider file times with specified offset as equal</source>
<target>Làimhsich amannan fhaidhlichean aig a bheil an offset sin mar gum biodh iad co-ionnann</target>
<source>Handle daylight saving time</source>
<target>Aire ri tìde an t-samhraidh</target>
-<source>Include symbolic links:</source>
-<target></target>
-
-<source>Direct</source>
-<target>Dìreach</target>
-
-<source>Follow</source>
-<target>Lean</target>
-
<source>More information</source>
<target>Barrachd fiosrachaidh</target>
@@ -878,13 +1102,6 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Detect moved files</source>
<target>Mothaich do dh’fhaidhlichean a chaidh a ghluasad</target>
-<source>
-- Detection active after initial sync
-- Requires and creates database files
-- Not supported by all file systems
-</source>
-<target></target>
-
<source>Detect synchronization directions with the help of database files</source>
<target>Mothaich do chomhair an t-sioncronachaidh le taic o fhaidhlichean stòir-dhàta</target>
@@ -1080,8 +1297,8 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Select Time Span</source>
<target>Tagh an rainse ama</target>
-<source>&Preferences...</source>
-<target>&Roghainnean</target>
+<source>Main Bar</source>
+<target>Am prìomh-bhàr</target>
<source>Folder Pairs</source>
<target>Paidhrichean nam pasganan</target>
@@ -1098,9 +1315,6 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Overview</source>
<target>Foir-shealladh</target>
-<source>Main Bar</source>
-<target>Am prìomh-bhàr</target>
-
<source>Confirm</source>
<target>Dearbh</target>
@@ -1217,9 +1431,6 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Do&n't save</source>
<target>&Na sàbhail</target>
-<source>Delete selected configurations</source>
-<target>Sguab às na rèiteachaidhean a thagh thu</target>
-
<source>Synchronization Settings</source>
<target>Roghainnean an t-sioncronachaidh</target>
@@ -1259,21 +1470,12 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Show files that will be deleted on the right side</source>
<target>Seall faidhlichean a thèid a sguabadh às air an taobh deas</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>Seall faidhlichean nach dèid lethbhreac a dhèanamh dhiubh</target>
<source>Show filtered or temporarily excluded files</source>
<target>Seall faidhlichean a tha ’gan dùnadh a-mach no air an criathradh a-mach an-dràsta fhèin</target>
-<source>Set as default</source>
-<target>Suidhich mar a’ bhun-roghainn</target>
-
<source>Filter</source>
<target>Criathrag</target>
@@ -1295,18 +1497,15 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Close progress dialog</source>
<target>Dùin còmhradh an adhartais</target>
-<source>Standby</source>
-<target>Cuir ’na fhuireachas</target>
-
<source>Log off</source>
<target>Clàraich a-mach</target>
+<source>Standby</source>
+<target>Cuir ’na fhuireachas</target>
+
<source>Shut down</source>
<target>Dùin sìos an siostam</target>
-<source>Hibernate</source>
-<target>Geamhraich</target>
-
<source>Scanning...</source>
<target>’Ga sganadh...</target>
@@ -1316,9 +1515,6 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Info</source>
<target>Fiosrachadh</target>
-<source>Warning</source>
-<target>Rabhadh</target>
-
<source>Select all</source>
<target>Tagh na h-uile</target>
@@ -1368,9 +1564,6 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Preferences</source>
<target>Roghainnean</target>
-<source>Copy NTFS permissions</source>
-<target>Dèan lethbhreac de cheadan NTFS</target>
-
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Amalaichidh seo aplacaidean air an taobh a-muigh dhan chlàr-taice cho-theacsail. Tha na macrothan a leanas ri làimh:</target>
@@ -1464,27 +1657,18 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Percentage</source>
<target>Ceudad</target>
+<source>Unable to register to receive system messages.</source>
+<target>Chan urrainn dhuinn clàradh gus teachdaireachdan an t-siostaim fhaighinn.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Chan urrainn dhuinn sùil a chumail air %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Cha ghabh am faidhle %x a sguabadh às.</target>
-
<source>The file is locked by another process:</source>
<target>Tha am faidhle glaiste aig pròiseas eile:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Cha ghabh am faidhle %x a ghluasad dha %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Cha ghabh am pasgan %x a sguabadh às.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Chan urrainn dhuinn buadhan an fhaidhle %x a sgrìobhadh.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Cha ghabh àm atharrachaidh %x a sgrìobhadh.</target>
-
<source>Cannot read security context of %x.</source>
<target>Cha ghabh susbaint tèarainteachd %x a leughadh.</target>
@@ -1494,15 +1678,6 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Cannot read permissions of %x.</source>
<target>Cha ghabh ceadan %x a leughadh.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Cha ghabh ceadan %x a sgrìobhadh.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Cha ghabh am pasgan %x a chruthachadh.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target></target>
-
<source>Cannot find system function %x.</source>
<target>Chan urrainn dhuinn foincsean an t-siostaim %x a lorg.</target>
@@ -1512,15 +1687,6 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Type of item %x is not supported:</source>
<target>Chan eil taic ri nì dhen t-seòrsa %x:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Cha ghabh an symbolic link %x fhuasgladh.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Cha ghabh am pasgan %x fhosgladh.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Cha ghabh am pasgan %x àireamhachadh.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1560,9 +1726,6 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<pluralform>%x latha</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Chan urrainn dhuinn clàradh gus teachdaireachdan an t-siostaim fhaighinn.</target>
-
<source>Cannot set privilege %x.</source>
<target>Cha ghabh a’ phribhleid %x a shuidheachadh.</target>
@@ -1572,90 +1735,6 @@ Nì seo cinnteach gum bi fuasgladh ann ma thachras mearachd mhòr.
<source>Cannot change process I/O priorities.</source>
<target>Chan urrainn dhuinn na prìomhachasan I/O atharrachadh.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Cha ghabh %x a ghluasad dhan bhiona.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Dh’fhàillig sgrùdadh a’ bhiona airson a’ phasgain %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Chan urrainn dhuinn an t-slighe dheireannach airson %x a dhearbhadh.</target>
-
-<source>Error Code %x:</source>
-<target>Còd na mearachd %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Chan urrainn dhuinn na h-eileamaidean XML a leanas a leughadh:</target>
-
-<source>Configuration file %x loaded partially only.</source>
-<target>Cha deach faidhle an rèiteachaidh %x a luchdadh gu tur.</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>recommended</source>
-<target></target>
-
-<source>Save settings to "%APPDATA%\FreeFileSync"</source>
-<target></target>
-
-<source>Register FreeFileSync file extensions</source>
-<target></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>Registering FreeFileSync file extensions</source>
-<target></target>
-
-<source>Unregistering FreeFileSync file extensions</source>
-<target></target>
-
-<source>FreeFileSync Configuration</source>
-<target></target>
-
-<source>FreeFileSync Batch File</source>
-<target></target>
-
-<source>FreeFileSync Synchronization Database</source>
-<target></target>
-
-<source>RealtimeSync Configuration</source>
-<target></target>
-
-<source>Edit with FreeFileSync</source>
-<target></target>
-
diff --git a/FreeFileSync/Build/Languages/outdated/slovenian.lng b/FreeFileSync/Build/Languages/outdated/slovenian.lng
index fb47d8b0..64c79e47 100644
--- a/FreeFileSync/Build/Languages/outdated/slovenian.lng
+++ b/FreeFileSync/Build/Languages/outdated/slovenian.lng
@@ -1,12 +1,206 @@
<header>
<language>Slovenščina</language>
- <translator>Matej Badalič, Tine Mlakar</translator>
+ <translator>enter your name here</translator>
<locale>sl_SI</locale>
<image>flag_slovenia.png</image>
<plural_count>4</plural_count>
<plural_definition>n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3</plural_definition>
</header>
+<source>Edit with FreeFileSync</source>
+<target></target>
+
+<source>RealtimeSync Configuration</source>
+<target></target>
+
+<source>FreeFileSync Synchronization Database</source>
+<target></target>
+
+<source>FreeFileSync Batch File</source>
+<target></target>
+
+<source>FreeFileSync Configuration</source>
+<target></target>
+
+<source>Create Explorer context menu entries</source>
+<target></target>
+
+<source>Select installation type:</source>
+<target></target>
+
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target></target>
+
+<source>The following XML elements could not be read:</source>
+<target></target>
+
+<source>Cannot copy attributes from %x to %y.</source>
+<target></target>
+
+<source>Cannot copy permissions from %x to %y.</source>
+<target></target>
+
+<source>Unable to register device notifications for %x.</source>
+<target></target>
+
+<source>Copy DACL, SACL, Owner, Group</source>
+<target></target>
+
+<source>Move down</source>
+<target></target>
+
+<source>Move up</source>
+<target></target>
+
+<source>Save as default</source>
+<target></target>
+
+<source>Show files that will be updated on the right side</source>
+<target></target>
+
+<source>Show files that will be updated on the left side</source>
+<target></target>
+
+<source>Remove entry from list</source>
+<target></target>
+
+<source>&Preferences</source>
+<target></target>
+
+<source>SSH File Transfer Protocol</source>
+<target></target>
+
+<source>Arrange folder pair</source>
+<target></target>
+
+<source>Directory on server:</source>
+<target></target>
+
+<source>&Show password</source>
+<target></target>
+
+<source>Password:</source>
+<target></target>
+
+<source>User name:</source>
+<target></target>
+
+<source>Examples:</source>
+<target></target>
+
+<source>Server name or IP address:</source>
+<target></target>
+
+<source>Enter your SFTP login details:</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>&Direct</source>
+<target></target>
+
+<source>&Follow</source>
+<target></target>
+
+<source>Include &symbolic links:</source>
+<target></target>
+
+<source>&Ignore time shift (in hours)</source>
+<target></target>
+
+<source>Number of files that will be updated</source>
+<target></target>
+
+<source>Select SFTP folder</source>
+<target></target>
+
+<source>&Actions</source>
+<target></target>
+
+<source>S&ynchronization settings</source>
+<target></target>
+
+<source>&Filter settings</source>
+<target></target>
+
+<source>C&omparison settings</source>
+<target></target>
+
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target></target>
+
+<source>Unable to connect to www.freefilesync.org.</source>
+<target></target>
+
+<source>Cleaning up old log files...</source>
+<target></target>
+
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target></target>
+
+<source>Data verification error:</source>
+<target></target>
+
+<source>%x and %y have different content.</source>
+<target></target>
+
+<source>Updating symbolic link %x</source>
+<target></target>
+
+<source>Updating file %x</source>
+<target></target>
+
+<source>E&xit</source>
+<target></target>
+
+<source>Saving file %x...</source>
+<target></target>
+
+<source>Time out while searching for folder %x.</source>
+<target></target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target></target>
+
+<source>Cannot find device %x.</source>
+<target></target>
+
+<source>Cannot find %x.</source>
+<target></target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target></target>
+
+<source>Operation not supported for different base folder types.</source>
+<target></target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target></target>
+
+<source>Update right item</source>
+<target></target>
+
+<source>Update left item</source>
+<target></target>
+
+<source>Open configuration for editing without executing it.</source>
+<target></target>
+
+<source>Cannot find file %x.</source>
+<target></target>
+
<source>Both sides have changed since last synchronization.</source>
<target>Obe strani sta se spremenili od zadnje sinhronizacije.</target>
@@ -55,9 +249,6 @@
<source>Syntax error</source>
<target>Sintaktična napaka</target>
-<source>Cannot open file %x.</source>
-<target>Ne morem odpreti datoteke %x.</target>
-
<source>File %x does not contain a valid configuration.</source>
<target>Datoteka %x ne vsebuje veljavnih nastavitev</target>
@@ -94,9 +285,6 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Poljubno število alternativnih parov imenikov za največ eno nastavitveno datoteko.</target>
-<source>Open configuration for edit without executing.</source>
-<target></target>
-
<source>Cannot find the following folders:</source>
<target>Ne morem najti naslednjih map:</target>
@@ -187,12 +375,6 @@
<source>Move file on right</source>
<target>Premakni datoteko na desno</target>
-<source>Update left item</source>
-<target></target>
-
-<source>Update right item</source>
-<target></target>
-
<source>Do nothing</source>
<target>Ne naredi ničesar</target>
@@ -202,6 +384,57 @@
<source>Update attributes on right</source>
<target>Posodobi atribute na desni</target>
+<source>Cannot read file %x.</source>
+<target>Ne morem prebrati datoteke %x.</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Ne morem zapisati dovoljenj od %x.</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 enumerate directory %x.</source>
+<target>Ne morem oštevilčiti imenika %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Ne morem brati datotečnih atributov od %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Ne morem odpreti datoteke %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Ne morem ustvariti imenika %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Ne morem izbrisati imenika %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Ne morem izbrisati datoteke %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Ne morem zapisati časa spremembe od %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Ne morem določiti končne poti za %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Ne morem razrešiti simbolične povezave %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Ne morem premakniti %x v koš-</target>
+
+<source>Cannot open directory %x.</source>
+<target>Ne morem odpreti imenika %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Napačna ukazna vrstica:</target>
+
+<source>Error Code %x:</source>
+<target>Koda napake %x:</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -237,21 +470,12 @@
<source>Database file is corrupt:</source>
<target>Datoteka podatkovne baze 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>Database files do not share a common session.</source>
<target>Datoteke podatkovne baze si ne delijo skupne seje.</target>
<source>Searching for folder %x...</source>
<target>Iskanje mape %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Ne morem brati datotečnih atributov od %x.</target>
-
<source>Cannot get process information.</source>
<target>Ne morem pridobiti informacij o procesu.</target>
@@ -278,9 +502,6 @@
<source>Creating file %x</source>
<target>Ustvarjam datoteko %x</target>
-<source>Saving file %x...</source>
-<target></target>
-
<source>Items processed:</source>
<target>Obdelanih elementov:</target>
@@ -343,15 +564,21 @@
<source>Unable to create time stamp for versioning:</source>
<target>Časovnega žiga za verzioniranje 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>
+
<source>&Open...</source>
<target>&Odpri...</target>
<source>Save &as...</source>
<target>Shr&ani kot...</target>
-<source>E&xit</source>
-<target></target>
-
<source>&File</source>
<target>&Datoteka</target>
@@ -391,9 +618,6 @@
<source>Browse</source>
<target>Brskaj</target>
-<source>Select a folder</source>
-<target>Izberite imenik</target>
-
<source>Idle time (in seconds):</source>
<target>Nedejavni čas (v sekundah):</target>
@@ -447,9 +671,6 @@ Ukaz se sproži če:
<source>&Quit</source>
<target>&Zapri</target>
-<source>Incorrect command line:</source>
-<target>Napačna ukazna vrstica:</target>
-
<source>&Retry</source>
<target>&Ponovi</target>
@@ -492,12 +713,6 @@ Ukaz se sproži če:
<source>Creating folder %x</source>
<target>Ustvarjam mapo %x</target>
-<source>Updating file %x</source>
-<target></target>
-
-<source>Updating symbolic link %x</source>
-<target></target>
-
<source>Verifying file %x</source>
<target>Preverjam datoteko %x</target>
@@ -507,15 +722,9 @@ Ukaz se sproži če:
<source>Creating a Volume Shadow Copy for %x...</source>
<target>Ustvarjam Volume Shadow Copy za %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Napaka pri preverjanju podatkov: %x in %y imata drugačno vsebino.</target>
-
<source>Target folder %x already existing.</source>
<target>Ciljna mapa %x že obstaja.</target>
-<source>Cannot find folder %x.</source>
-<target>Ne najdem mape %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Vnosno polje za ciljno mapo ne sme biti prazno.</target>
@@ -528,9 +737,6 @@ Ukaz se sproži če:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Naslednji elementi imajo nerešene konflikte in ne bodo sinhronizirani:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Naslednji imeniki so občutno različni. Preverite, če primerjate pravilne imenike za sinhnorizacijo.</target>
-
<source>Not enough free disk space available in:</source>
<target>Na voljo ni dovolj prostega prostora na disku v:</target>
@@ -555,24 +761,24 @@ Ukaz se sproži če:
<source>Synchronization stopped</source>
<target>Sinhnorizacija ustavljena</target>
+<source>Stopped</source>
+<target>Ustavljen</target>
+
<source>Synchronization completed with errors</source>
<target>Sinhronizacija se je končala z napakami</target>
<source>Synchronization completed with warnings</source>
<target>Sinhronizacija se je končala z opozorili</target>
+<source>Warning</source>
+<target>Pozor</target>
+
<source>Nothing to synchronize</source>
<target>Nič za sinhronizirati</target>
<source>Synchronization completed successfully</source>
<target>Sinhronizacija se je uspešno končala</target>
-<source>Cleaning up old log files...</source>
-<target></target>
-
-<source>Stopped</source>
-<target>Ustavljen</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Preklopite na FreeFileSync glavno okno za odpravo težave.</target>
@@ -623,9 +829,6 @@ Ukaz se sproži če:
<source>FreeFileSync is up to date.</source>
<target>FreeFileSync je posodobljen.</target>
-<source>Unable to connect to www.freefilesync.org.</source>
-<target></target>
-
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Na omrežju ne najdem obstoječe verzije FreeFileSync-a. Ali želite preveriti lastnoročno?</target>
@@ -665,9 +868,6 @@ Ukaz se sproži če:
<source>Action</source>
<target>Ukrep</target>
-<source>Drag && drop</source>
-<target>Povleci && spusti</target>
-
<source>Local comparison settings</source>
<target>Lokalne primerjalne nastavitve</target>
@@ -710,21 +910,9 @@ Ukaz se sproži če:
<source>Start &comparison</source>
<target>Začni &primerjavo</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>Začni &sinhnorizacijo</target>
-<source>&Actions</source>
-<target></target>
-
<source>&Options</source>
<target>&Možnosti</target>
@@ -803,9 +991,6 @@ Ukaz se sproži če:
<source>Number of files and folders that will be deleted</source>
<target>Število datotek in map, ki bodo izbrisane</target>
-<source>Number of files that will be updated</source>
-<target></target>
-
<source>Number of files and folders that will be created</source>
<target>Število datotek in map, ki bodo ustvarjene</target>
@@ -824,24 +1009,12 @@ Ukaz se sproži če:
<source>Identify equal files by comparing the file content.</source>
<target>Določi enake datoteke s primerjavo vsebine.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignorirani časovni okvir (v urah)</target>
-
<source>Consider file times with specified offset as equal</source>
<target>Čas datotek znotraj izbranga časovnega okvirja je upoštevan kot isti</target>
<source>Handle daylight saving time</source>
<target>Upoštevaj poletni in zimski čas</target>
-<source>Include symbolic links:</source>
-<target></target>
-
-<source>Direct</source>
-<target>Neposredno</target>
-
-<source>Follow</source>
-<target>Sledi</target>
-
<source>More information</source>
<target>Več informacij</target>
@@ -878,13 +1051,6 @@ Ukaz se sproži če:
<source>Detect moved files</source>
<target>Zaznaj premaknjene datoteke</target>
-<source>
-- Detection active after initial sync
-- Requires and creates database files
-- Not supported by all file systems
-</source>
-<target></target>
-
<source>Detect synchronization directions with the help of database files</source>
<target>Zaznaj smer sinhnorizacije s pomočjo datotek podatkovne baze</target>
@@ -1083,8 +1249,8 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Select Time Span</source>
<target>Izberi časovno obdobje</target>
-<source>&Preferences...</source>
-<target>&Nastavitve...</target>
+<source>Main Bar</source>
+<target>Glavna vrstica</target>
<source>Folder Pairs</source>
<target>Pari imenikov</target>
@@ -1101,9 +1267,6 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Overview</source>
<target>Pregled</target>
-<source>Main Bar</source>
-<target>Glavna vrstica</target>
-
<source>Confirm</source>
<target>Potrdi</target>
@@ -1220,9 +1383,6 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Do&n't save</source>
<target>Ne shra&ni</target>
-<source>Delete selected configurations</source>
-<target>Izbriši izbrane konfiguracije</target>
-
<source>Synchronization Settings</source>
<target>Nastavitve sinhnorizacije</target>
@@ -1262,21 +1422,12 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Show files that will be deleted on the right side</source>
<target>Prikaži datoteke, ki bodo izbrisane na desni strani</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>Prikaži datoteke, ki ne bodo kopirane</target>
<source>Show filtered or temporarily excluded files</source>
<target>Pokaži filtrirane ali začasno izključene datoteke</target>
-<source>Set as default</source>
-<target>Nastavi kot privzeto</target>
-
<source>Filter</source>
<target>Filter</target>
@@ -1298,18 +1449,15 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Close progress dialog</source>
<target>Zapri pogovorno okno z napredkom</target>
-<source>Standby</source>
-<target>V pripravljenost</target>
-
<source>Log off</source>
<target>Odjavi</target>
+<source>Standby</source>
+<target>V pripravljenost</target>
+
<source>Shut down</source>
<target>Ugasni</target>
-<source>Hibernate</source>
-<target>Hibernacija</target>
-
<source>Scanning...</source>
<target>Pregledujem...</target>
@@ -1319,9 +1467,6 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Pozor</target>
-
<source>Select all</source>
<target>Izberi vse</target>
@@ -1371,9 +1516,6 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Preferences</source>
<target>Nastavitve</target>
-<source>Copy NTFS permissions</source>
-<target>Kopiraj NTFS dovoljenja</target>
-
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integriraj zunanje aplikacije v kontekstni menu. Na voljo so naslednji makri:</target>
@@ -1467,27 +1609,18 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Percentage</source>
<target>Odstotek</target>
+<source>Unable to register to receive system messages.</source>
+<target>Ne morem se registriratiza prejem sistemskih sporočil.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Ne morem nadzorovati imenika %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Ne morem izbrisati datoteke %x.</target>
-
<source>The file is locked by another process:</source>
<target>Datoteka je zaklenjena s strani drugega procesa:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Ne morem premakniti datoteko %x v %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Ne morem izbrisati imenika %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Ne morem zapisati datotečnih atributov od %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Ne morem zapisati časa spremembe od %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Ne morem prebrati varnostnega konteksta od %x.</target>
@@ -1497,15 +1630,6 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Cannot read permissions of %x.</source>
<target>Ne morem prebrati dovoljenja od %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Ne morem zapisati dovoljenj od %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Ne morem ustvariti imenika %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target></target>
-
<source>Cannot find system function %x.</source>
<target>Ne morem najti sistemske funkcije %x.</target>
@@ -1515,15 +1639,6 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Type of item %x is not supported:</source>
<target>Element tipa %x ni podprt:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Ne morem razrešiti simbolične povezave %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Ne morem odpreti imenika %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Ne morem oštevilčiti imenika %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1563,9 +1678,6 @@ To zagotavlja konsistenco podatkov v primeru napake.
<pluralform>%x dni</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Ne morem se registriratiza prejem sistemskih sporočil.</target>
-
<source>Cannot set privilege %x.</source>
<target>Ne morem nastaviti privilegija %x.</target>
@@ -1575,33 +1687,15 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Cannot change process I/O priorities.</source>
<target>Ne morem spremeniti V/I prioritet procesa.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Ne morem premakniti %x v koš-</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Preverjanje koša za mapo %x ni uspelo.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Ne morem določiti končne poti za %x.</target>
-
-<source>Error Code %x:</source>
-<target>Koda napake %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Ne morem brati naslednje XML elemente:</target>
-
-<source>Configuration file %x loaded partially only.</source>
-<target>Nastavitvena datoteka %x naložena samo delno.</target>
-
<source>Prepare installation</source>
<target>Pripravljam namestitev</target>
<source>Choose which components you want to install.</source>
<target>Izberite komponente za inštalacijo</target>
-<source>Select installation type:</source>
-<target></target>
-
<source>Local</source>
<target>Lokalna</target>
@@ -1617,9 +1711,6 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Register FreeFileSync file extensions</source>
<target>Registracija FreeFileSync datotečnih razširitev</target>
-<source>Create Explorer context menu entries</source>
-<target></target>
-
<source>Save settings in installation directory</source>
<target>Shrani nastavitve v namestitveni imenik</target>
@@ -1647,18 +1738,3 @@ To zagotavlja konsistenco podatkov v primeru napake.
<source>Unregistering FreeFileSync file extensions</source>
<target>Odregistriram FreeFileSync datotečne končnice</target>
-<source>FreeFileSync Configuration</source>
-<target></target>
-
-<source>FreeFileSync Batch File</source>
-<target></target>
-
-<source>FreeFileSync Synchronization Database</source>
-<target></target>
-
-<source>RealtimeSync Configuration</source>
-<target></target>
-
-<source>Edit with FreeFileSync</source>
-<target></target>
-
diff --git a/FreeFileSync/Build/Languages/polish.lng b/FreeFileSync/Build/Languages/polish.lng
index a4d8410b..97d7249c 100644
--- a/FreeFileSync/Build/Languages/polish.lng
+++ b/FreeFileSync/Build/Languages/polish.lng
@@ -55,11 +55,11 @@
<source>Syntax error</source>
<target>Błąd składni</target>
-<source>Cannot open file %x.</source>
-<target>Nie można otworzyć pliku %x.</target>
+<source>Cannot find file %x.</source>
+<target>Nie można odnaleźć pliku %x.</target>
<source>File %x does not contain a valid configuration.</source>
-<target>Plik %x nie zawiera prawidłowej konfiguracji</target>
+<target>Plik %x nie zawiera prawidłowej konfiguracji.</target>
<source>Unequal number of left and right directories specified.</source>
<target>Wprowadzona liczba katalogów do synchronizacji jest nierówna.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Dowolna liczba alternatywnych par katalogów dla najwyżej jednego pliku konfiguracyjnego.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Otwórz konfigurację do edycji bez uruchamiania synchronizacji.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Otwórz konfigurację do edycji.</target>
<source>Cannot find the following folders:</source>
<target>Nie można znaleźć następujących katalogów:</target>
@@ -202,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Niespodziewany rozmiar strumienia danych.
+Oczekiwany: %x bajtów
+Przesłany: %y bajtów
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Nie można zapisać uprawnień %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Nie można skopiować linku symbolicznego %x do %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Nie można przenieść pliku %x do %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Nie można wyliczyć katalogu %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Nie można odczytać atrybutów pliku %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Nie można odnaleźć %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Nie można otworzyć pliku %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Nie można odnaleźć urządzenia %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Nie można określić wolnego miejsca na %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Nie można utworzyć katalogu %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Nie można usunąć katalogu %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Nie można usunąć pliku %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Nie można zapisać czasu modyfikacji %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Nie można określić ostatecznej ścieżki dla %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Nie można określić położenia dowiązania symbolicznego %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Nie można przenieść %x do kosza.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Nie można otworzyć katalogu %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Niepoprawne polecenie:</target>
+
+<source>Error Code %x:</source>
+<target>Kod błędu %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Błąd podczas łączenia z serwerem %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -236,20 +316,14 @@
<source>Database file is corrupt:</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>Database files do not share a common session.</source>
<target>Pliki bazy danych nie współdzielą sesji.</target>
<source>Searching for folder %x...</source>
<target>Wyszukiwanie katalogu %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Nie można odczytać atrybutów pliku %x.</target>
+<source>Time out 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>
@@ -340,6 +414,15 @@
<source>Unable to create time stamp for versioning:</source>
<target>Nie można utworzyć znacznika czasu:</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>
+
<source>&Open...</source>
<target>&Otwórz...</target>
@@ -388,9 +471,6 @@
<source>Browse</source>
<target>Przeglądaj</target>
-<source>Select a folder</source>
-<target>Wybierz katalog</target>
-
<source>Idle time (in seconds):</source>
<target>Czas bezczynności (w sekundach):</target>
@@ -444,9 +524,6 @@ Komenda jest wykonywana gdy:
<source>&Quit</source>
<target>Zam&knij</target>
-<source>Incorrect command line:</source>
-<target>Niepoprawne polecenie:</target>
-
<source>&Retry</source>
<target>&Powtórz</target>
@@ -501,18 +578,18 @@ Komenda jest wykonywana gdy:
<source>Updating attributes of %x</source>
<target>Aktualizowanie 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>Creating a Volume Shadow Copy for %x...</source>
<target>Tworzenie Volume Shadow Copy dla %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Nastąpił błąd weryfikacji: %x oraz %y różnią się zawartością.</target>
-
<source>Target folder %x already existing.</source>
<target>Katalog docelowy %x już istnieje.</target>
-<source>Cannot find folder %x.</source>
-<target>Nie można znaleźć katalogu %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Pole katalog docelowy nie może być puste.</target>
@@ -525,8 +602,8 @@ Komenda jest wykonywana gdy:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>Poniższe katalogi znacznie się różnią. Upewnij się, że określone zostały prawiłowe katalogi.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Poniższe katalogi znacząco się różnią. Upewnij się, że określone zostały poprawne katalogi do synchronizacji.</target>
<source>Not enough free disk space available in:</source>
<target>Brak wystarczającej przestrzeni dyskowej na:</target>
@@ -552,12 +629,18 @@ Komenda jest wykonywana gdy:
<source>Synchronization stopped</source>
<target>Synchronizacja przerwana</target>
+<source>Stopped</source>
+<target>Zatrzymana</target>
+
<source>Synchronization completed with errors</source>
<target>Synchronizacja zakończona z błędami</target>
<source>Synchronization completed with warnings</source>
<target>Synchronizacja zakończona z ostrzeżeniami</target>
+<source>Warning</source>
+<target>Ostrzeżenie</target>
+
<source>Nothing to synchronize</source>
<target>Brak plików do synchronizacji</target>
@@ -567,9 +650,6 @@ Komenda jest wykonywana gdy:
<source>Cleaning up old log files...</source>
<target>Usuwanie starych plików logów...</target>
-<source>Stopped</source>
-<target>Zatrzymana</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Możesz przejść do głównego okna FreeFileSync abe rozwiązać ten problem.</target>
@@ -620,7 +700,7 @@ Komenda jest wykonywana gdy:
<target>Posiadasz aktualną wersję FreeFileSync.</target>
<source>Unable to connect to www.freefilesync.org.</source>
-<target>Nie można połączyć się z www.freefilesync.org</target>
+<target>Nie można połączyć się z www.freefilesync.org.</target>
<source>Cannot find current FreeFileSync version number online. Do you want to check manually?</source>
<target>Nie można znaleźć obecnej wersji FreeFileSync. Czy chcesz sprawdzić ręcznie?</target>
@@ -661,9 +741,6 @@ Komenda jest wykonywana gdy:
<source>Action</source>
<target>Akcja</target>
-<source>Drag && drop</source>
-<target>Drag && Drop</target>
-
<source>Local comparison settings</source>
<target>Lokalne ustawienia porównywania</target>
@@ -694,6 +771,9 @@ Komenda jest wykonywana gdy:
<source>Local Synchronization Settings</source>
<target>Lokalne Ustawienia Synchronizacji</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Katalog %x nie może być użyty przez FreeFileSync. Określ katalog znajdujący się lokalnie na komputerze, katalog sieciowy lub urządzenie MTP.</target>
+
<source>&New</source>
<target>&Nowy</target>
@@ -763,6 +843,9 @@ Komenda jest wykonywana gdy:
<source>Remove folder pair</source>
<target>Usuń katalogi</target>
+<source>Select SFTP folder</source>
+<target>Określ katalog SFTP</target>
+
<source>Swap sides</source>
<target>Zamień stronami</target>
@@ -820,8 +903,8 @@ Komenda jest wykonywana gdy:
<source>Identify equal files by comparing the file content.</source>
<target>Określ różnice w plikach na podstawie ich zawartości.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignoruj różnice w czasie (w godzinach)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignoruj różnice czasu (w godzinach)</target>
<source>Consider file times with specified offset as equal</source>
<target>Traktuje czasy dwóch plików jako równe w określonych granicach</target>
@@ -829,14 +912,14 @@ Komenda jest wykonywana gdy:
<source>Handle daylight saving time</source>
<target>Uwzględniaj przesunięcie czasu</target>
-<source>Include symbolic links:</source>
-<target>Uwzględniaj dowiązania symboliczne</target>
+<source>Include &symbolic links:</source>
+<target>Uwzględniaj dowiązania &symboliczne:</target>
-<source>Direct</source>
-<target>Bezpośrednio</target>
+<source>&Follow</source>
+<target>&Podąrzaj</target>
-<source>Follow</source>
-<target>Podążaj</target>
+<source>&Direct</source>
+<target>&Bezpośrednio</target>
<source>More information</source>
<target>Więcej informacji</target>
@@ -872,17 +955,17 @@ Komenda jest wykonywana gdy:
<target>&Wyczyść</target>
<source>Detect moved files</source>
-<target>Wykryj przeniesione pliki.</target>
+<target>Wykryj przeniesione pliki</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Wykrywanie aktywne po pierwszej synchronizacji
-- Wymaga utworzenia plików bazy danych
-- Nie jest wspierana przez wszystkie systemy plików
+- Nie wspierane przez wszystkie systemy plików
+- Wymaga pliku bazy danych
+- Wykrywanie niedostępne podczas pierwszej synchronizacji
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -901,7 +984,7 @@ Komenda jest wykonywana gdy:
<target>&Kosz systemowy</target>
<source>Back up deleted and overwritten files in the recycle bin</source>
-<target>Przechowuj pliki, które zostały usunięte lub nadpisane w koszu.</target>
+<target>Przechowuj pliki, które zostały usunięte lub nadpisane w koszu</target>
<source>&Versioning</source>
<target>&Wersjonowanie</target>
@@ -930,6 +1013,27 @@ Komenda jest wykonywana gdy:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Wprowadź dane logowania do serwera SFTP:</target>
+
+<source>Server name or IP address:</source>
+<target>Nazwa serwera lub adres IP:</target>
+
+<source>Examples:</source>
+<target>Przykład:</target>
+
+<source>User name:</source>
+<target>Nazwa użytkownika:</target>
+
+<source>Password:</source>
+<target>Hasło:</target>
+
+<source>&Show password</source>
+<target>&Pokaż hasło</target>
+
+<source>Directory on server:</source>
+<target>Katalog na serwerze:</target>
+
<source>Start synchronization now?</source>
<target>Rozpocząć teraz synchronizację?</target>
@@ -939,6 +1043,9 @@ Komenda jest wykonywana gdy:
<source>&Don't show this dialog again</source>
<target>&Nie pokazuj więcej tego okna</target>
+<source>Arrange folder pair</source>
+<target>Uporządkuj parę katalogów</target>
+
<source>Items found:</source>
<target>Znalezione elementy:</target>
@@ -1042,7 +1149,7 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<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>
+<target>Przywróć wszystkie, stale ukryte dialogi i powiadomienia</target>
<source>&Default</source>
<target>&Domyślne</target>
@@ -1050,6 +1157,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Source code written in C++ using:</source>
<target>Kod stworzony w C++ z wykorzystaniem:</target>
+<source>If you like FreeFileSync:</source>
+<target>Jeżeli lubisz FreeFileSync:</target>
+
<source>Donate with PayPal</source>
<target>Wesprzyj z PayPal</target>
@@ -1068,6 +1178,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Many thanks for localization:</source>
<target>Podziękowania za tłumaczenia:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH File Transfer Protocol</target>
+
<source>Save as Batch Job</source>
<target>Zapisz w trybie wsadowym</target>
@@ -1080,8 +1193,11 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Select Time Span</source>
<target>Określ</target>
-<source>&Preferences...</source>
-<target>&Preferencje...</target>
+<source>&Preferences</source>
+<target>&Ustawienia</target>
+
+<source>Main Bar</source>
+<target>Główny pasek</target>
<source>Folder Pairs</source>
<target>Pary katalogów</target>
@@ -1098,9 +1214,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Overview</source>
<target>Przegląd</target>
-<source>Main Bar</source>
-<target>Główny pasek</target>
-
<source>Confirm</source>
<target>Potwierdź</target>
@@ -1213,8 +1326,8 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Do&n't save</source>
<target>&Nie zapisuj</target>
-<source>Delete selected configurations</source>
-<target>Usuń wybrane konfiguracje</target>
+<source>Remove entry from list</source>
+<target>Usuń wpis z listy</target>
<source>Synchronization Settings</source>
<target>Ustawienia synchronizacji</target>
@@ -1267,7 +1380,7 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Show filtered or temporarily excluded files</source>
<target>Pokaż pliki wykluczone tymczasowo lub pliki wykluczone tymczasowo</target>
-<source>Set as default</source>
+<source>Save as default</source>
<target>Zapisz jako domyślne</target>
<source>Filter</source>
@@ -1279,6 +1392,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Cannot find %x</source>
<target>Nie można znaleźć %x</target>
+<source>Move up</source>
+<target>Przesuń w górę</target>
+
+<source>Move down</source>
+<target>Przesuń w dół</target>
+
<source>Comma-separated values</source>
<target>Wartości rozdzielone przecinkiem</target>
@@ -1291,18 +1410,15 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Close progress dialog</source>
<target>Zamknij okno postępu</target>
-<source>Standby</source>
-<target>Przejdź w stan uśpienia</target>
-
<source>Log off</source>
<target>Wyloguj użytkownika</target>
+<source>Standby</source>
+<target>Przejdź w stan uśpienia</target>
+
<source>Shut down</source>
<target>Wyłącz komputer</target>
-<source>Hibernate</source>
-<target>Przejdź w stan hibernacji</target>
-
<source>Scanning...</source>
<target>Skanowanie...</target>
@@ -1312,9 +1428,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Ostrzeżenie</target>
-
<source>Select all</source>
<target>Zaznacz wszystko</target>
@@ -1362,8 +1475,8 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Preferences</source>
<target>Preferencje</target>
-<source>Copy NTFS permissions</source>
-<target>Kopiuj uprawnienia NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Kopiuj DACL, SACL, Użytkownik, Grupa</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Dołącz zewnętrzną aplikację do menu kontekstowego. Dostępne makra:</target>
@@ -1458,27 +1571,21 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Percentage</source>
<target>Procentowo</target>
+<source>Unable to register to receive system messages.</source>
+<target>Błąd podczas rejestrowania do odbioru komunikatów systemowych.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Nie można zarejestrować powiadomień urządzenia dla %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Nie można monitorować katalogu %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Nie można usunąć pliku %x.</target>
-
<source>The file is locked by another process:</source>
<target>Plik jest zablokowany przez inny proces:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Nie można przenieść pliku %x do %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Nie można usunąć katalogu %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Nie można zapisać atrybutów %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Nie można zapisać czasu modyfikacji %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Nie można odczytać ustawień bezpieczeństwa %x.</target>
@@ -1488,33 +1595,21 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Cannot read permissions of %x.</source>
<target>Nie można odczytać uprawnień %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Nie można zapisać uprawnień %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Nie można utworzyć katalogu %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Nie można skopiować linku symbolicznego %x do %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Nie można skopiować uprawnień z %x do %y.</target>
<source>Cannot find system function %x.</source>
<target>Nie można odnaleźć funkcji systemowej %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Nie można skopiować atrybutów z %x do %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Nie można skopiować pliku %x do %y.</target>
<source>Type of item %x is not supported:</source>
<target>Element typu %x nie jest wspierany:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Nie można określić położenia dowiązania symbolicznego %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Nie można otworzyć katalogu %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Nie można wyliczyć katalogu %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1551,9 +1646,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<pluralform>%x dni</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Błąd podczas rejestrowania do odbioru komunikatów systemowych.</target>
-
<source>Cannot set privilege %x.</source>
<target>Nie można ustawić uprawnień %x.</target>
@@ -1563,23 +1655,14 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Cannot change process I/O priorities.</source>
<target>Nie można zmienić priorytetu I/O procesu.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Nie można przenieść %x do kosza.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Sprawdzanie kosza systemowego dla katalogu %x zakończone niepowodzeniem.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Nie można określić ostatecznej ścieżki dla %x.</target>
-
-<source>Error Code %x:</source>
-<target>Kod błędu %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Nie można odczytać elementu XML:</target>
+<source>The following XML elements could not be read:</source>
+<target>Poniższy element XML nie może zostać odczytany:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Plik konfiguracyjny %x został wczytany tylko częściowo.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Plik konfiguracyjny %x jest niekompletny. Zostaną ustawione domyśle wartości dla brakujących elementów.</target>
<source>Prepare installation</source>
<target>Przygotuj instalację</target>
diff --git a/FreeFileSync/Build/Languages/portuguese.lng b/FreeFileSync/Build/Languages/portuguese.lng
index 68fb8832..c4e33b9b 100644
--- a/FreeFileSync/Build/Languages/portuguese.lng
+++ b/FreeFileSync/Build/Languages/portuguese.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Erro de sintaxe</target>
-<source>Cannot open file %x.</source>
-<target>Não é possível abrir o ficheiro %x.</target>
+<source>Cannot find file %x.</source>
+<target></target>
<source>File %x does not contain a valid configuration.</source>
<target>Ficheiro %x não tem uma configuração válida.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Qualquer número de pares de directórios alternativos para apenas um ficheiro de configuração.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Abrir a configuração para editar sem executar.</target>
+<source>Open configuration for editing without executing it.</source>
+<target></target>
<source>Cannot find the following folders:</source>
<target>Não é possível encontrar as seguintes pastas:</target>
@@ -202,6 +202,82 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target></target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Não é possível escrever as permissões de %x.</target>
+
+<source>Operation not supported for different base folder types.</source>
+<target></target>
+
+<source>Cannot write file %x.</source>
+<target>Não é possível escrever o ficheiro %x.</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>Cannot move file %x to %y.</source>
+<target>Não é possível mover o ficheiro %x para %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Não é possível enumerar 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 find %x.</source>
+<target></target>
+
+<source>Cannot open file %x.</source>
+<target>Não é possível abrir o ficheiro %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Não é possível eliminar o directório %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Não é possível eliminar o ficheiro %x.</target>
+
+<source>Cannot find device %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target></target>
+
+<source>Cannot create directory %x.</source>
+<target>Não é possível criar o directório %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Não é possível alterar a data de modificação a %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Não é possível determinar o caminho final de %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Não é possível resolver o link simbólico %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Não é possível mover %x para a reciclagem.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Não é possível abrir o directório %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Linha de comandos incorrecta:</target>
+
+<source>Error Code %x:</source>
+<target>Código de erro %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target></target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +311,14 @@
<source>Database file is corrupt:</source>
<target>Ficheiro de 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>Database files do not share a common session.</source>
<target>As bases de dados são de sessões diferentes.</target>
<source>Searching for folder %x...</source>
<target>À procura da pasta %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Não é possível ler os atributos do ficheiro %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target></target>
<source>Cannot get process information.</source>
<target>Não é possível obter informação sobre o processo.</target>
@@ -337,6 +407,15 @@
<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>Selecione uma pasta</target>
+
<source>&Open...</source>
<target>&Abrir...</target>
@@ -385,9 +464,6 @@
<source>Browse</source>
<target>Procurar</target>
-<source>Select a folder</source>
-<target>Selecione uma pasta</target>
-
<source>Idle time (in seconds):</source>
<target>Tempo de espera (em segundos):</target>
@@ -441,9 +517,6 @@ O comando é executado se:
<source>&Quit</source>
<target>&Sair</target>
-<source>Incorrect command line:</source>
-<target>Linha de comandos incorrecta:</target>
-
<source>&Retry</source>
<target>&Tentar de Novo</target>
@@ -498,18 +571,18 @@ O comando é executado se:
<source>Updating attributes of %x</source>
<target>Actualizar atributos de %x</target>
+<source>%x and %y have different content.</source>
+<target></target>
+
+<source>Data verification error:</source>
+<target></target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>A criar Volume Shadow Copy para %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Erro de verificação de dados: %x e %y têm conteúdo diferente.</target>
-
<source>Target folder %x already existing.</source>
<target>Directório de destino %x já existe.</target>
-<source>Cannot find folder %x.</source>
-<target>Não é possível encontrar a pasta %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Campo de directório de destino não deve estar vazio.</target>
@@ -522,8 +595,8 @@ O comando é executado se:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>As seguintes pastas são significativamente diferentes. Verifique se está a usar as pastas correctas na sincronização.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target></target>
<source>Not enough free disk space available in:</source>
<target>Não há espaço livre suficiente em:</target>
@@ -549,12 +622,18 @@ O comando é executado se:
<source>Synchronization stopped</source>
<target>Sincronização parada</target>
+<source>Stopped</source>
+<target>Parado</target>
+
<source>Synchronization completed with errors</source>
<target>Sincronização completa com erros</target>
<source>Synchronization completed with warnings</source>
<target>Sincronização completa com avisos</target>
+<source>Warning</source>
+<target>Atenção</target>
+
<source>Nothing to synchronize</source>
<target>Nada a sincronizar</target>
@@ -564,9 +643,6 @@ O comando é executado se:
<source>Cleaning up old log files...</source>
<target>A limpar ficheiros log antigos...</target>
-<source>Stopped</source>
-<target>Parado</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Pode mudar para a janela principal do FreeFileSync para resovler este problema.</target>
@@ -657,9 +733,6 @@ O comando é executado se:
<source>Action</source>
<target>Ação</target>
-<source>Drag && drop</source>
-<target>Arrastar && Largar</target>
-
<source>Local comparison settings</source>
<target>Opções locais de comparação</target>
@@ -690,6 +763,9 @@ O comando é executado se:
<source>Local Synchronization Settings</source>
<target>Opções Locais Sincronização</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target></target>
+
<source>&New</source>
<target>&Novo</target>
@@ -759,6 +835,9 @@ O comando é executado se:
<source>Remove folder pair</source>
<target>Remover o par de pastas</target>
+<source>Select SFTP folder</source>
+<target></target>
+
<source>Swap sides</source>
<target>Trocar lados</target>
@@ -816,8 +895,8 @@ O comando é executado se:
<source>Identify equal files by comparing the file content.</source>
<target>Identificar ficheiros iguais ao comparar o conteúdo.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignorar mudança de tempo (em horas)</target>
+<source>&Ignore time shift (in hours)</source>
+<target></target>
<source>Consider file times with specified offset as equal</source>
<target>Considerar ficheiros com o desvio de tempo especificado como iguais</target>
@@ -825,14 +904,14 @@ O comando é executado se:
<source>Handle daylight saving time</source>
<target>Lidar com horário de verão</target>
-<source>Include symbolic links:</source>
-<target>Incluir links simbólicos:</target>
+<source>Include &symbolic links:</source>
+<target></target>
-<source>Direct</source>
-<target>Direto</target>
+<source>&Follow</source>
+<target></target>
-<source>Follow</source>
-<target>Seguir</target>
+<source>&Direct</source>
+<target></target>
<source>More information</source>
<target>Mais informação</target>
@@ -871,15 +950,11 @@ O comando é executado se:
<target>Detectar ficheiros movidos</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
-<target>
-- Detecção ativa após sincronização inicial
-- Requer e cria ficheiro de base de dados
-- Não é suportado por todos os sistemas de ficheiros
-</target>
+<target></target>
<source>Detect synchronization directions with the help of database files</source>
<target>Detectar a direcção de sincronização com a ajuda de base de dados</target>
@@ -926,6 +1001,29 @@ O comando é executado se:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target></target>
+
+<source>Server name or IP address:</source>
+<target></target>
+
+<source>Examples:</source>
+<target></target>
+
+<source>User name:</source>
+<target></target>
+
+<source>Password:</source>
+<target></target>
+
+<source>&Show password</source>
+<target></target>
+
+<source>Directory on server:</source>
+<target></target>
+
+
+
<source>Start synchronization now?</source>
<target>Iniciar sincronização agora?</target>
@@ -935,6 +1033,9 @@ O comando é executado se:
<source>&Don't show this dialog again</source>
<target>&Não mostrar este diálogo novamente</target>
+<source>Arrange folder pair</source>
+<target></target>
+
<source>Items found:</source>
<target>Elementos encontrados:</target>
@@ -1067,6 +1168,9 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Many thanks for localization:</source>
<target>Muito obrigado pela localização:</target>
+<source>SSH File Transfer Protocol</source>
+<target></target>
+
<source>Save as Batch Job</source>
<target>Guardar como Ficheiro Batch</target>
@@ -1079,8 +1183,11 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Select Time Span</source>
<target>Seleccionar Intervalo de Tempo</target>
-<source>&Preferences...</source>
-<target>&Preferências...</target>
+<source>&Preferences</source>
+<target></target>
+
+<source>Main Bar</source>
+<target>Barra principal</target>
<source>Folder Pairs</source>
<target>Par de Pastas</target>
@@ -1097,9 +1204,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Overview</source>
<target>Vista</target>
-<source>Main Bar</source>
-<target>Barra principal</target>
-
<source>Confirm</source>
<target>Confirmar</target>
@@ -1208,8 +1312,8 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Do&n't save</source>
<target>Não g&uardar</target>
-<source>Delete selected configurations</source>
-<target>Eliminar configurações seleccionadas</target>
+<source>Remove entry from list</source>
+<target></target>
<source>Synchronization Settings</source>
<target>Definições de Sincronização</target>
@@ -1262,8 +1366,8 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Show filtered or temporarily excluded files</source>
<target>Mostrar ficheiros filtrados ou temporariamente excluidos</target>
-<source>Set as default</source>
-<target>Definir como padrão</target>
+<source>Save as default</source>
+<target></target>
<source>Filter</source>
<target>Filtro</target>
@@ -1274,6 +1378,12 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Cannot find %x</source>
<target>Não é possível descobrir %x</target>
+<source>Move up</source>
+<target></target>
+
+<source>Move down</source>
+<target></target>
+
<source>Comma-separated values</source>
<target>Valores separados por virgula</target>
@@ -1286,18 +1396,15 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Close progress dialog</source>
<target>Fechar diálogo de progresso</target>
-<source>Standby</source>
-<target>Standby</target>
-
<source>Log off</source>
<target>Terminar sessão</target>
+<source>Standby</source>
+<target>Standby</target>
+
<source>Shut down</source>
<target>Desligar</target>
-<source>Hibernate</source>
-<target>Hibernar</target>
-
<source>Scanning...</source>
<target>A pesquisar...</target>
@@ -1307,9 +1414,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Atenção</target>
-
<source>Select all</source>
<target>Seleccionar tudo</target>
@@ -1355,8 +1459,8 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Preferences</source>
<target>Preferências</target>
-<source>Copy NTFS permissions</source>
-<target>Copiar permissões NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target></target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrar aplicações externas no menu de contexto. As seguintes macros estão disponíveis:</target>
@@ -1451,27 +1555,21 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Percentage</source>
<target>Percentagem</target>
+<source>Unable to register to receive system messages.</source>
+<target>Não foi possível registar para receber mensagens do sistema.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target></target>
+
<source>Cannot monitor directory %x.</source>
<target>Não é possível monitorizar o directório %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Não é possível eliminar o ficheiro %x.</target>
-
<source>The file is locked by another process:</source>
<target>O ficheiro está bloqueado por outro processo:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Não é possível mover o ficheiro %x para %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Não é possível eliminar o directório %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Não é possível escrever os atributos de %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Não é possível alterar a data de modificação a %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Não é possível ler o contexto de segurança %x.</target>
@@ -1481,33 +1579,21 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Cannot read permissions of %x.</source>
<target>Não é possível ler as permissões de %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Não é possível escrever as permissões de %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Não é possível criar o directório %x.</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>Cannot copy permissions from %x to %y.</source>
+<target></target>
<source>Cannot find system function %x.</source>
<target>Não é possível encontrar a função do sistema %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target></target>
+
<source>Cannot copy file %x to %y.</source>
<target>Não é possível copiar o ficheiro %x para %y.</target>
<source>Type of item %x is not supported:</source>
<target>Tipo de item %x não é suportado:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Não é possível resolver o link simbólico %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Não é possível abrir o directório %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Não é possível enumerar o directório %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1541,9 +1627,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<pluralform>%x dias</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Não foi possível registar para receber mensagens do sistema.</target>
-
<source>Cannot set privilege %x.</source>
<target>Não é possível definir o privilégio %x.</target>
@@ -1553,23 +1636,14 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Cannot change process I/O priorities.</source>
<target>Não é possível alterar as prioridades de E / S do processo.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Não é possível mover %x para a reciclagem.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Verificar a reciclagem falhou no directório %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Não é possível determinar o caminho final de %x.</target>
-
-<source>Error Code %x:</source>
-<target>Código de erro %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Não é possível ler os elementos XML:</target>
+<source>The following XML elements could not be read:</source>
+<target></target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Ficheiro de configuração %x carregado parcialmente.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target></target>
<source>Prepare installation</source>
<target>A preparar a instalação</target>
diff --git a/FreeFileSync/Build/Languages/portuguese_br.lng b/FreeFileSync/Build/Languages/portuguese_br.lng
index ddd5735f..e047d1eb 100644
--- a/FreeFileSync/Build/Languages/portuguese_br.lng
+++ b/FreeFileSync/Build/Languages/portuguese_br.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Erro de sintaxe</target>
-<source>Cannot open file %x.</source>
-<target>Não foi possível abrir o arquivo %x.</target>
+<source>Cannot find file %x.</source>
+<target>Não foi possível encontrar o arquivo %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>O arquivo %x não contém uma configuração válida.</target>
@@ -94,7 +94,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Qualquer número de pares alternativos de diretórios para no máximo um arquivo de configuração.</target>
-<source>Open configuration for edit without executing.</source>
+<source>Open configuration for editing without executing it.</source>
<target>Abrir configuração para editar sem executar.</target>
<source>Cannot find the following folders:</source>
@@ -125,7 +125,7 @@
<target>Tamanho:</target>
<source>Content comparison was skipped for excluded files %x.</source>
-<target>A comparação por conteúdo foi ingorada para os arquivos excluídos %x.</target>
+<target>A comparação por conteúdo foi ignorada para os arquivos excluídos %x.</target>
<source>Items differ in attributes only</source>
<target>Os itens diferem apenas nos atributos</target>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>Atualizar atributos à direita</target>
+<source>Cannot read file %x.</source>
+<target>Não foi possível ler o arquivo %x.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Tamanho inesperado do fluxo de dados.
+Esperado: %x bytes
+Atual: %y bytes
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Não foi possível escrever as permissões de %x.</target>
+
+<source>Operation not supported for different base folder types.</source>
+<target>Operação não suportada para tipos de pastas de base diferentes.</target>
+
+<source>Cannot write file %x.</source>
+<target>Não foi possível escrever o arquivo %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Não foi possível copiar o link simbólico %x para %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Não foi possível mover o arquivo %x para %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Não foi possível enumerar o diretório %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Não foi possível ler os atributos do arquivo %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Não foi possível encontrar %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Não foi possível abrir o arquivo %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Não foi possível encontrar o dispositivo %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Não foi possível determinar o espaço livre em disco para %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Não foi possível criar o diretório %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Não foi possível apagar o diretório %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Não foi possível apagar o arquivo %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Não foi possível escrever a data de modificação de %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Não foi possível determinar o caminho final para %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Não foi possível resolver o link simbólico %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Não foi possível mover %x para a Lixeira.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Não foi possível abrir o diretório %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Linha de comando incorreta:</target>
+
+<source>Error Code %x:</source>
+<target>Código do Erro %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Falha ao conectar ao servidor SFTP %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -233,13 +313,7 @@
<target>O arquivo de banco de dados %x ainda não existe.</target>
<source>Database file is corrupt:</source>
-<target>O arquivo de banco de dados está corrompido</target>
-
-<source>Cannot write file %x.</source>
-<target>Não foi possível escrever o arquivo %x.</target>
-
-<source>Cannot read file %x.</source>
-<target>Não foi possível ler o arquivo %x.</target>
+<target>O arquivo de banco de dados está corrompido:</target>
<source>Database files do not share a common session.</source>
<target>Os arquivos de banco de dados são de sessões diferentes.</target>
@@ -247,8 +321,8 @@
<source>Searching for folder %x...</source>
<target>Buscando pela pasta %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Não foi possível ler os atributos do arquivo %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target>Tempo esgotado na procura pela pasta %x.</target>
<source>Cannot get process information.</source>
<target>Não foi possível obter as informações do processo.</target>
@@ -337,6 +411,15 @@
<source>Unable to create time stamp for versioning:</source>
<target>Não foi 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 foi possível encontrar a pasta %x.</target>
+
+<source>Select a folder</source>
+<target>Selecionar uma pasta</target>
+
<source>&Open...</source>
<target>&Abrir...</target>
@@ -374,7 +457,7 @@
<target>Para iniciar importe um arquivo .ffs_batch.</target>
<source>Folders to watch:</source>
-<target>Pastas para comparar</target>
+<target>Pastas para monitorar:</target>
<source>Add folder</source>
<target>Adicionar pasta</target>
@@ -385,9 +468,6 @@
<source>Browse</source>
<target>Procurar</target>
-<source>Select a folder</source>
-<target>Selecionar uma pasta</target>
-
<source>Idle time (in seconds):</source>
<target>Tempo de espera (em segundos):</target>
@@ -405,7 +485,7 @@ The command is triggered if:
<target>
O comando é disparado se:
- arquivos ou subpastas são alterados
-- novas pastas aparecem (p. ex. Uma pendrive é inserida)
+- novas pastas aparecem (p. ex. Pen drive inserido)
</target>
<source>&Start</source>
@@ -441,9 +521,6 @@ O comando é disparado se:
<source>&Quit</source>
<target>Sai&r</target>
-<source>Incorrect command line:</source>
-<target>Linha de comando incorreta:</target>
-
<source>&Retry</source>
<target>&Tentar Novamente</target>
@@ -498,18 +575,18 @@ O comando é disparado se:
<source>Updating attributes of %x</source>
<target>Atualizando atributos 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>Creating a Volume Shadow Copy for %x...</source>
<target>Criando uma Cópia de Sombra de Volume para %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Erro na verificação dos dados: %x e %y têm conteúdo diferente.</target>
-
<source>Target folder %x already existing.</source>
<target>Pasta de destino %x já existe.</target>
-<source>Cannot find folder %x.</source>
-<target>Não foi possível encontrar a pasta %x.</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>
@@ -522,8 +599,8 @@ O comando é disparado se:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>As seguintes pastas são significativamente diferentes. Tenha certeza que está comparando as pastas corretas para sincronização.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>As seguintes pastas são significativamente diferentes. Tenha certeza que você selecionou as pastas corretas para sincronização.</target>
<source>Not enough free disk space available in:</source>
<target>Espaço em disco insuficiente em:</target>
@@ -549,12 +626,18 @@ O comando é disparado se:
<source>Synchronization stopped</source>
<target>Sincronização interrompida</target>
+<source>Stopped</source>
+<target>Interrompido</target>
+
<source>Synchronization completed with errors</source>
<target>Sincronização finalizada com erros</target>
<source>Synchronization completed with warnings</source>
<target>Sincronização finalizada com avisos</target>
+<source>Warning</source>
+<target>Avisos</target>
+
<source>Nothing to synchronize</source>
<target>Nada para sincronizar</target>
@@ -564,9 +647,6 @@ O comando é disparado se:
<source>Cleaning up old log files...</source>
<target>Limpando arquivo de log antigo...</target>
-<source>Stopped</source>
-<target>Interrompido</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Você pode alternar para a janela principal do FreeFileSync para resolver este problema.</target>
@@ -587,8 +667,8 @@ O comando é disparado se:
<pluralform>Automatic retry in %x seconds...</pluralform>
</source>
<target>
-<pluralform>Nova tentativa autompatica em 1 segundo...</pluralform>
-<pluralform>Nova tentativa autompatica em %x segundos...</pluralform>
+<pluralform>Nova tentativa em 1 segundo...</pluralform>
+<pluralform>Nova tentativa em %x segundos...</pluralform>
</target>
<source>&Ignore subsequent errors</source>
@@ -657,9 +737,6 @@ O comando é disparado se:
<source>Action</source>
<target>Ação</target>
-<source>Drag && drop</source>
-<target>Arrastar && Soltar</target>
-
<source>Local comparison settings</source>
<target>Configurações de comparação local</target>
@@ -690,6 +767,9 @@ O comando é disparado se:
<source>Local Synchronization Settings</source>
<target>Configurações de Sincronização Local</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>A pasta %x selecionada não pode ser usada com o FreeFileSync. Por favor, selecione uma pasta em seu sistema de arquivos local, na rede ou em um dispositivo MTP.</target>
+
<source>&New</source>
<target>&Novo</target>
@@ -754,10 +834,13 @@ O comando é disparado se:
<target>Sincronizar</target>
<source>Add folder pair</source>
-<target>Adicionar um par de pastas</target>
+<target>Adicionar par de pastas</target>
<source>Remove folder pair</source>
-<target>Remover o par de pastas</target>
+<target>Remover par de pastas</target>
+
+<source>Select SFTP folder</source>
+<target>Selecionar pasta SFTP</target>
<source>Swap sides</source>
<target>Inverter lados</target>
@@ -787,7 +870,7 @@ O comando é disparado se:
<target>Tipo de visualização:</target>
<source>Select view:</source>
-<target>Selecione visualização:</target>
+<target>Selecionar visualização:</target>
<source>Statistics:</source>
<target>Estatísticas:</target>
@@ -816,8 +899,8 @@ O comando é disparado se:
<source>Identify equal files by comparing the file content.</source>
<target>Identifica arquivos iguais comparando o conteúdo do arquivo.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignora mudança de horário (em horas)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignorar mudança de horário (em horas)</target>
<source>Consider file times with specified offset as equal</source>
<target>Considera horário de arquivos com uma diferença especificada como iguais</target>
@@ -825,17 +908,17 @@ O comando é disparado se:
<source>Handle daylight saving time</source>
<target>Como lidar com horário de verão</target>
-<source>Include symbolic links:</source>
-<target>Incluir links simbólicos:</target>
+<source>Include &symbolic links:</source>
+<target>Incluir &links simbólicos:</target>
-<source>Direct</source>
-<target>Direto</target>
+<source>&Follow</source>
+<target>&Seguir</target>
-<source>Follow</source>
-<target>Seguir</target>
+<source>&Direct</source>
+<target>&Direto</target>
<source>More information</source>
-<target>Mais informação</target>
+<target>Mais informações</target>
<source>Local settings:</source>
<target>Configurações locais:</target>
@@ -862,7 +945,7 @@ O comando é disparado se:
<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 exlcuir certos arquivos da sincronização. Entre com os caminhos relativos dos pares de pastas correspondentes.</target>
+<target>Selecione regras de filtro para excluir certos arquivos da sincronização. Entre com os caminhos relativos dos pares de pastas correspondentes.</target>
<source>C&lear</source>
<target>&Limpar</target>
@@ -871,14 +954,14 @@ O comando é disparado se:
<target>Detectar arquivos movidos</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Detecção ativa após sincronização inicial
-- Requer e cria arquivos de banco de dados
-- Não suportado por todos os sistemas
+- Não suportado por todos os tipos de sistemas de arquivo
+- Requer e cria arquivo de banco de dados
+- Detecção não disponível para a primeira sincronização
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -926,6 +1009,27 @@ O comando é disparado se:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Entre com seus detalhes de login do SFTP:</target>
+
+<source>Server name or IP address:</source>
+<target>Nome do servidor ou endereço IP:</target>
+
+<source>Examples:</source>
+<target>Exemplos:</target>
+
+<source>User name:</source>
+<target>Nome do usuário:</target>
+
+<source>Password:</source>
+<target>Senha:</target>
+
+<source>&Show password</source>
+<target>&Mostrar senha</target>
+
+<source>Directory on server:</source>
+<target>Diretório no servidor:</target>
+
<source>Start synchronization now?</source>
<target>Iniciar sincronização agora?</target>
@@ -935,6 +1039,9 @@ O comando é disparado se:
<source>&Don't show this dialog again</source>
<target>&Não mostrar este diálogo novamente</target>
+<source>Arrange folder pair</source>
+<target>Organizar par de pastas</target>
+
<source>Items found:</source>
<target>Elementos encontrados:</target>
@@ -1020,7 +1127,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Transfere permissões de arquivos e pastas.</target>
<source>Automatic retry on error:</source>
-<target>Nova tentativa automática em caso de erro:</target>
+<target>Nova tentativa em caso de erro:</target>
<source>Retry count:</source>
<target>Número de tentativas:</target>
@@ -1067,6 +1174,9 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Many thanks for localization:</source>
<target>Pela tradução, um agradecimento a:</target>
+<source>SSH File Transfer Protocol</source>
+<target>Protocolo de Transferência de Arquivos SSH</target>
+
<source>Save as Batch Job</source>
<target>Salvar como Tarefa em Lote</target>
@@ -1079,11 +1189,14 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Select Time Span</source>
<target>Selecionar Intervalo de Tempo</target>
-<source>&Preferences...</source>
-<target>&Preferências...</target>
+<source>&Preferences</source>
+<target>&Preferências</target>
+
+<source>Main Bar</source>
+<target>Barra Principal</target>
<source>Folder Pairs</source>
-<target>Pares de Pastas</target>
+<target>Pares de Pasta</target>
<source>Find</source>
<target>Localizar</target>
@@ -1097,9 +1210,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Overview</source>
<target>Parâmetros</target>
-<source>Main Bar</source>
-<target>Barra Principal</target>
-
<source>Confirm</source>
<target>Confirmar</target>
@@ -1143,7 +1253,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
</target>
<source>Set direction:</source>
-<target>Configurar direção</target>
+<target>Configurar direção:</target>
<source>multiple selection</source>
<target>seleção múltipla</target>
@@ -1208,8 +1318,8 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Do&n't save</source>
<target>&Não salvar</target>
-<source>Delete selected configurations</source>
-<target>Apagar configurações selecionadas</target>
+<source>Remove entry from list</source>
+<target>Remover entrada da lista</target>
<source>Synchronization Settings</source>
<target>Configurações de Sincronização</target>
@@ -1262,18 +1372,24 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Show filtered or temporarily excluded files</source>
<target>Mostra arquivos que foram filtrados ou excluídos temporariamente</target>
-<source>Set as default</source>
-<target>Definir como padrão</target>
+<source>Save as default</source>
+<target>Salvar como padrão</target>
<source>Filter</source>
<target>Filtro</target>
<source>All files are in sync</source>
-<target>Todos os arquivos estão em sincronia</target>
+<target>Todos os arquivos estão sincronizados</target>
<source>Cannot find %x</source>
<target>Não foi possível localizar %x</target>
+<source>Move up</source>
+<target>Mover para cima</target>
+
+<source>Move down</source>
+<target>Mover para baixo</target>
+
<source>Comma-separated values</source>
<target>Valores separados por vírgula</target>
@@ -1286,18 +1402,15 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Close progress dialog</source>
<target>Fechar indicador de progresso</target>
-<source>Standby</source>
-<target>Em espera</target>
-
<source>Log off</source>
<target>Fazer logoff</target>
+<source>Standby</source>
+<target>Em espera</target>
+
<source>Shut down</source>
<target>Desligar</target>
-<source>Hibernate</source>
-<target>Hibernar</target>
-
<source>Scanning...</source>
<target>Pesquisando...</target>
@@ -1307,9 +1420,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Info</source>
<target>Informações</target>
-<source>Warning</source>
-<target>Avisos</target>
-
<source>Select all</source>
<target>Seleciona todos</target>
@@ -1355,8 +1465,8 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Preferences</source>
<target>Preferências</target>
-<source>Copy NTFS permissions</source>
-<target>Copiar permissões NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Copiar DACL, SACL, Proprietário, Grupo</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrar aplicações externas no menu de contexto. As seguintes macros estão disponíveis:</target>
@@ -1374,7 +1484,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>- Contrapartida do outro lado para %item_folder%</target>
<source>Show hidden dialogs and warning messages again?</source>
-<target>Mostrar diálogos e mensanges de alerta ocultados novamente?</target>
+<target>Mostrar diálogos e mensagens de alerta ocultados novamente?</target>
<source>&Show</source>
<target>&Mostrar</target>
@@ -1451,27 +1561,21 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Percentage</source>
<target>Percentual</target>
+<source>Unable to register to receive system messages.</source>
+<target>Não foi possível registrar para receber mensagens do sistema.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Não foi possível registrar notificações para %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Não foi possível monitorar o diretório %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Não foi possível apagar o arquivo %x.</target>
-
<source>The file is locked by another process:</source>
<target>O arquivo está bloqueado por outro processo:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Não foi possível mover o arquivo %x para %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Não foi possível apagar o diretório %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Não foi possível escrever os atributos de arquivo de %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Não foi possível escrever a data de modificação de %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Não foi possível ler o contexto de segurança de %x.</target>
@@ -1481,33 +1585,21 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Cannot read permissions of %x.</source>
<target>Não foi possível ler as permissões de %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Não foi possível escrever as permissões de %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Não foi possível criar o diretório %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Não foi possível copiar o link simbólico %x para %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Não foi possível copiar as permissões de %x para %y.</target>
<source>Cannot find system function %x.</source>
<target>Não foi possível localizar a função de sistema %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Não foi possível copiar os atributos de %x para %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Não foi possível copiar o arquivo %x para %y.</target>
<source>Type of item %x is not supported:</source>
<target>Tipo de item %x não é suportado:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Não foi possível resolver o link simbólico %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Não foi possível abrir o diretório %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Não foi possível enumerar o diretório %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1541,9 +1633,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<pluralform>%x dias</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Não foi possível registrar para receber mensagens do sistema.</target>
-
<source>Cannot set privilege %x.</source>
<target>Não foi possível estabelecer o privilégio %x.</target>
@@ -1553,23 +1642,14 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Cannot change process I/O priorities.</source>
<target>Não foi possível mudar a prioridade de E/S do processo.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Não foi possível mover %x para a Lixeira.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Verificando falha na Lixeira para pasta %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Não foi possível determinar o caminho final para %x.</target>
-
-<source>Error Code %x:</source>
-<target>Código do Erro %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Não foi possível ler os seguintes elementos XML:</target>
+<source>The following XML elements could not be read:</source>
+<target>Os seguintes elementos XML não puderam ser lidos:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>O arquivo de configuração %x foi carregado parcialmente.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Arquivo de configuração %x está incompleto. Os elementos faltantes serão configurados com seus valores padrões.</target>
<source>Prepare installation</source>
<target>Preparando a instalação</target>
@@ -1587,7 +1667,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Portátil</target>
<source>recommended</source>
-<target>recomendada</target>
+<target>recomendado</target>
<source>Save settings to "%APPDATA%\FreeFileSync"</source>
<target>Salva as configurações em "%APPDATA%\FreeFileSync"</target>
@@ -1623,7 +1703,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Registrando as extensões de arquivos do FreeFileSync</target>
<source>Unregistering FreeFileSync file extensions</source>
-<target>Desregistrando as extensões de arquivos do FreeFileSync</target>
+<target>Desfazendo registro das extensões de arquivos do FreeFileSync</target>
<source>FreeFileSync Configuration</source>
<target>Configuração do FreeFileSync</target>
diff --git a/FreeFileSync/Build/Languages/romanian.lng b/FreeFileSync/Build/Languages/romanian.lng
index 25ae1c43..9ad6dcea 100644
--- a/FreeFileSync/Build/Languages/romanian.lng
+++ b/FreeFileSync/Build/Languages/romanian.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Eroare de sintaxă</target>
-<source>Cannot open file %x.</source>
-<target>Nu pot deschide fila %x.</target>
+<source>Cannot find file %x.</source>
+<target>Nu pot găsi fila %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Fila %x nu conține o configurație validă.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Orice număr de perechi alternative de dosare pentru cel mult o filă de configurare.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Deschide configurația pentru editare fără executarea ei.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Deschide configurația pentru editare fără a o executa.</target>
<source>Cannot find the following folders:</source>
<target>Nu pot găsi dosarele următoare:</target>
@@ -202,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Mărime neașteptată a fluxului de date.
+Așteptată: %x baiți
+Actuală: %y baiți
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Nu pot scrie permisiunile lui %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Nu pot copia legătura simbolică %x în %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Nu pot muta fila %x în %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Nu pot enumera dosarul %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Nu pot citi atributele filei %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Nu pot găsi %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Nu pot deschide fila %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Nu pot găsi dispozitivul %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Nu pot determina spațiul liber de stocare pentru %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Nu pot crea dosarul %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Nu pot șterge dosarul %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Nu pot șterge fila %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Nu pot scrie modificarea timpului pentru %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Nu pot determina calea finală pentru %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Nu pot rezolva legătura simbolică %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Nu pot muta %x în Reciclator.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Nu pot deschide dosarul %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Linie de comandă incorectă:</target>
+
+<source>Error Code %x:</source>
+<target>Cod de Eroare %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Conectare eșuată la serverul SFTP %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -234,13 +314,7 @@
<target>Fila cu baza de date %x nu există încă.</target>
<source>Database file is corrupt:</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>
+<target>Fila bazei de date este stricată (coruptă):</target>
<source>Database files do not share a common session.</source>
<target>Filele cu baze de date nu partajează o sesiune comună.</target>
@@ -248,8 +322,8 @@
<source>Searching for folder %x...</source>
<target>Caut dosarul %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Nu pot citi atributele filei %x.</target>
+<source>Time out 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>
@@ -340,6 +414,15 @@
<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>
+
<source>&Open...</source>
<target>&Deschide...</target>
@@ -388,9 +471,6 @@
<source>Browse</source>
<target>Explorează</target>
-<source>Select a folder</source>
-<target>Selectează un Dosar</target>
-
<source>Idle time (in seconds):</source>
<target>Timp de inactivitate (în secunde):</target>
@@ -444,9 +524,6 @@ Comanda este declanșată dacă:
<source>&Quit</source>
<target>&Ieși</target>
-<source>Incorrect command line:</source>
-<target>Linie de comandă incorectă:</target>
-
<source>&Retry</source>
<target>&Reîncearcă</target>
@@ -501,18 +578,18 @@ Comanda este declanșată dacă:
<source>Updating attributes of %x</source>
<target>Actualizez atributele 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>Creating a Volume Shadow Copy for %x...</source>
<target>Creez o Conservare a Volumului [Volume Shadow Copy] pentru %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Eroare la verificarea datelor: %x și %y au conținut diferit.</target>
-
<source>Target folder %x already existing.</source>
<target>Dosarul țintă %x există deja.</target>
-<source>Cannot find folder %x.</source>
-<target>Nu pot găsi dosarul %x.</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>
@@ -525,8 +602,8 @@ Comanda este declanșată dacă:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>Dosarele următoare diferă foarte mult. Asigură-te că ai ales pentru sincronizare dosarele corecte.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders 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>
@@ -552,12 +629,18 @@ Comanda este declanșată dacă:
<source>Synchronization stopped</source>
<target>Sincronizare oprită</target>
+<source>Stopped</source>
+<target>Oprită</target>
+
<source>Synchronization completed with errors</source>
<target>Sincronizare terminată cu erori</target>
<source>Synchronization completed with warnings</source>
<target>Sincronizare realizată, dar cu avertismente</target>
+<source>Warning</source>
+<target>Atenție</target>
+
<source>Nothing to synchronize</source>
<target>Nu e nimic de sincronizat</target>
@@ -567,9 +650,6 @@ Comanda este declanșată dacă:
<source>Cleaning up old log files...</source>
<target>Curăț filele de jurnalizare vechi...</target>
-<source>Stopped</source>
-<target>Oprită</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Poți comuta la fereastra principală FreeFileSync pentru a rezolva această problemă.</target>
@@ -661,9 +741,6 @@ Comanda este declanșată dacă:
<source>Action</source>
<target>Acțiune</target>
-<source>Drag && drop</source>
-<target>Trage și pune un dosar mai jos sau explorează către el</target>
-
<source>Local comparison settings</source>
<target>Setările locale de comparare</target>
@@ -694,6 +771,9 @@ Comanda este declanșată dacă:
<source>Local Synchronization Settings</source>
<target>Setările Locale de Sincronizare</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Dosarul selectat %x nu poate fi folosit cu FreeFileSync. Selectează un dosar de pe un sistem de file local, din rețea sau de pe un dispozitiv MTP (dispozitiv media portabil).</target>
+
<source>&New</source>
<target>Configurație &Nouă</target>
@@ -746,7 +826,7 @@ Comanda este declanșată dacă:
<target>&Caută Acum</target>
<source>Check &automatically once a week</source>
-<target>Caută &Automat în Fiecare Săptămînă</target>
+<target>Caută &Automat Săptămînal</target>
<source>Cancel</source>
<target>Anulează</target>
@@ -763,6 +843,9 @@ Comanda este declanșată dacă:
<source>Remove folder pair</source>
<target>Înlătură Perechea de Dosare</target>
+<source>Select SFTP folder</source>
+<target>Selectează un Dosar SFTP</target>
+
<source>Swap sides</source>
<target>Schimbă compartimentele stîng și drept între ele</target>
@@ -809,7 +892,7 @@ Comanda este declanșată dacă:
<target>Numărul total de baiți copiați</target>
<source>Use local settings:</source>
-<target>Folosește setările locale</target>
+<target>Folosește setările locale:</target>
<source>Select a variant:</source>
<target>Selectează o variantă:</target>
@@ -820,23 +903,23 @@ Comanda este declanșată dacă:
<source>Identify equal files by comparing the file content.</source>
<target>Filele identice sînt descoperite prin compararea conținutului filelor.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignoră decalajul temporal (în ore)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignoră decalajul temporal (în ore)</target>
<source>Consider file times with specified offset as equal</source>
-<target>Consideră ca identice timpurile filelor cu decalajul specificat</target>
+<target>Consideră ca identice timpurile filelor avînd decalajul specificat</target>
<source>Handle daylight saving time</source>
<target>Gestionarea timpului de vară (DST)</target>
-<source>Include symbolic links:</source>
-<target>Include legăturile simbolice:</target>
+<source>Include &symbolic links:</source>
+<target>Include legăturile &simbolice:</target>
-<source>Direct</source>
-<target>Direcționează</target>
+<source>&Follow</source>
+<target>&Prin Urmărirea Lor</target>
-<source>Follow</source>
-<target>Urmărește</target>
+<source>&Direct</source>
+<target>&Direct</target>
<source>More information</source>
<target>Mai multe informații</target>
@@ -875,14 +958,14 @@ Comanda este declanșată dacă:
<target>Detectează filele mutate</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Detectare activă după sincronizarea inițială
+- Nesuportat de toate sistemele de file
- Necesită și creează file cu bază de date
-- Nu-i suportat de toate sistemele de file
+- Detectarea nu-i disponibilă la prima sincronizare
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -930,6 +1013,27 @@ Comanda este declanșată dacă:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Introdu detaliile tale de logare la serverul SFTP:</target>
+
+<source>Server name or IP address:</source>
+<target>Numele Serverului sau Adresa IP:</target>
+
+<source>Examples:</source>
+<target>Exemple:</target>
+
+<source>User name:</source>
+<target>Utilizator:</target>
+
+<source>Password:</source>
+<target>Parolă:</target>
+
+<source>&Show password</source>
+<target>&Arată parola</target>
+
+<source>Directory on server:</source>
+<target>Dosarul de pe server:</target>
+
<source>Start synchronization now?</source>
<target>Pornesc sincronizarea acum?</target>
@@ -939,6 +1043,9 @@ Comanda este declanșată dacă:
<source>&Don't show this dialog again</source>
<target>Nu arăta acest &dialog din nou</target>
+<source>Arrange folder pair</source>
+<target>Aranjează perechea de dosare</target>
+
<source>Items found:</source>
<target>Elemente Găsite:</target>
@@ -1021,7 +1128,7 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<target>Copiază permisiunile de acces ale filelor</target>
<source>Transfer file and folder permissions.</source>
-<target>Permisiunile filelor și dosarelor sînt și ele transferate.</target>
+<target>Sînt transferate și permisiunile de accesare NTFS ale filelor și dosarelor (Atenție: doar pentru utilizatorii avansați!).</target>
<source>Automatic retry on error:</source>
<target>Reîncearcă automat în caz de eroare:</target>
@@ -1071,6 +1178,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Many thanks for localization:</source>
<target>Multe mulțumiri pentru localizare:</target>
+<source>SSH File Transfer Protocol</source>
+<target>Protocol de Transfer al Filelor SSH</target>
+
<source>Save as Batch Job</source>
<target>Salvează ca Sarcină Set</target>
@@ -1083,8 +1193,11 @@ 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>&Preferences...</source>
-<target>&Preferințe...</target>
+<source>&Preferences</source>
+<target>&Preferințe</target>
+
+<source>Main Bar</source>
+<target>Bara Principală</target>
<source>Folder Pairs</source>
<target>Perechi de Dosare</target>
@@ -1101,9 +1214,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Overview</source>
<target>Panoramă</target>
-<source>Main Bar</source>
-<target>Bara Principală</target>
-
<source>Confirm</source>
<target>Confirmă</target>
@@ -1216,8 +1326,8 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Do&n't save</source>
<target>&Nu salva</target>
-<source>Delete selected configurations</source>
-<target>Șterge Configurațiile Selectate</target>
+<source>Remove entry from list</source>
+<target>Înlătură intrarea din listă</target>
<source>Synchronization Settings</source>
<target>Setările Sincronizării</target>
@@ -1270,8 +1380,8 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Show filtered or temporarily excluded files</source>
<target>Arată filele filtrate sau excluse temporar</target>
-<source>Set as default</source>
-<target>Setează ca implicit</target>
+<source>Save as default</source>
+<target>Salvează ca implicit</target>
<source>Filter</source>
<target>Filtrare</target>
@@ -1282,6 +1392,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Cannot find %x</source>
<target>Nu pot găsi %x</target>
+<source>Move up</source>
+<target>Mută în Sus</target>
+
+<source>Move down</source>
+<target>Mută în Jos</target>
+
<source>Comma-separated values</source>
<target>Valori separate prin virgulă</target>
@@ -1294,18 +1410,15 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Close progress dialog</source>
<target>Închide Fereastra cu Progresul Sincr.</target>
-<source>Standby</source>
-<target>Pune PC-ul în Stare de Veghe [Stand-by]</target>
-
<source>Log off</source>
<target>Deloghează Utilizatorul [Log off]</target>
+<source>Standby</source>
+<target>Pune PC-ul în Stare de Veghe [Stand-by]</target>
+
<source>Shut down</source>
<target>Închide PC-ul [Shut down]</target>
-<source>Hibernate</source>
-<target>Pune Calculatorul în Hibernare</target>
-
<source>Scanning...</source>
<target>Scanez...</target>
@@ -1315,9 +1428,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Info</source>
<target>Informații</target>
-<source>Warning</source>
-<target>Atenție</target>
-
<source>Select all</source>
<target>Selectează Tot</target>
@@ -1365,8 +1475,8 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Preferences</source>
<target>Preferințe</target>
-<source>Copy NTFS permissions</source>
-<target>Copiază permisiunile NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Copiază permisiunile DACL, SACL, Proprietar, Grup</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Comenzi pentru aplicații externe incluse în meniul contextual al softului. Sînt disponibile următoarele macrocomenzi:</target>
@@ -1461,27 +1571,21 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Percentage</source>
<target>Procent</target>
+<source>Unable to register to receive system messages.</source>
+<target>Nu pot înregistra softul pentru a primi mesaje de la sistemul de operare.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Nu pot înregistra notificările dispozitivului pentru %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Nu pot monitoriza dosarul %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Nu pot șterge fila %x.</target>
-
<source>The file is locked by another process:</source>
<target>Fila este zăvorîtă [locked] de alt proces:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Nu pot muta fila %x în %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Nu pot șterge dosarul %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Nu pot scrie atributele de filă ale lui %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Nu pot scrie modificarea timpului pentru %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Nu pot citi contextul de securitate pentru %x.</target>
@@ -1491,33 +1595,21 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Cannot read permissions of %x.</source>
<target>Nu pot citi permisiunile lui %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Nu pot scrie permisiunile lui %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Nu pot crea dosarul %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Nu pot copia legătura simbolică %x în %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Nu pot copia permisiunile de pe %x pe %y.</target>
<source>Cannot find system function %x.</source>
<target>Nu pot găsi funcția de sistem %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Nu pot copia atributele de pe %x pe %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Nu pot copia fila %x în %y.</target>
<source>Type of item %x is not supported:</source>
<target>Tipul de element %x nu e suportat:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Nu pot rezolva legătura simbolică %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Nu pot deschide dosarul %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Nu pot enumera dosarul %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1554,9 +1646,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<pluralform>%x de zile</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Nu pot înregistra softul pentru a primi mesaje de la sistemul de operare.</target>
-
<source>Cannot set privilege %x.</source>
<target>Nu pot seta privilegiul %x.</target>
@@ -1566,23 +1655,14 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Cannot change process I/O priorities.</source>
<target>Nu pot schimba prioritățile I/O ale procesului.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Nu pot muta %x în Reciclator.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Verificarea disponibilității Reciclatorului a eșuat pentru dosarul %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Nu pot determina calea finală pentru %x.</target>
-
-<source>Error Code %x:</source>
-<target>Cod de Eroare %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Nu pot citi următoarele elemente XML:</target>
+<source>The following XML elements could not be read:</source>
+<target>Elementele XML următoare nu pot fi citite:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Fila de configurație %x a fost deschisă doar parțial.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Fila configurație %x este incompletă. Elementele lipsă vor fi setate la valorile implicite.</target>
<source>Prepare installation</source>
<target>Pregătirea Instalării</target>
diff --git a/FreeFileSync/Build/Languages/russian.lng b/FreeFileSync/Build/Languages/russian.lng
index c994d27c..04efa1d4 100644
--- a/FreeFileSync/Build/Languages/russian.lng
+++ b/FreeFileSync/Build/Languages/russian.lng
@@ -58,8 +58,8 @@
<source>Syntax error</source>
<target>Синтаксическая ошибка</target>
-<source>Cannot open file %x.</source>
-<target>Невозможно открыть файл %x.</target>
+<source>Cannot find file %x.</source>
+<target>Невозможно найти файл %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Файл %x не содержит действительной конфигурации.</target>
@@ -97,8 +97,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Любое количество альтернативных пар папок для не более одного конфигурационного файла.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Открыть конфигурацию для редактирования без выполнения.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Открыть конфигурацию для редактирования программы без ее выполнения.</target>
<source>Cannot find the following folders:</source>
<target>Невозможно найти следующие папки:</target>
@@ -205,6 +205,86 @@
<source>Update attributes on right</source>
<target>Обновление атрибутов справа</target>
+<source>Cannot read file %x.</source>
+<target>Невозможно прочитать файл %x.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Неожиданный размер потока данных.
+Ожидаемый: %x байт
+Фактический: %y байт
+</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 write file %x.</source>
+<target>Невозможно записать файл %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Невозможно скопировать символьную ссылку %x в %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Невозможно перенести файл %x в %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Невозможно прочесть папку %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Невозможно прочитать атрибуты файла %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Невозможно найти %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Невозможно открыть файл %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Невозможно найти устройство %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Невозможно определить свободное место на диске для %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Невозможно создать папку %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Невозможно удалить папку %x.</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>Невозможно открыть папку %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Неверная командная строка:</target>
+
+<source>Error Code %x:</source>
+<target>Код ошибки %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Не удается соединиться с SFTP сервером %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -239,20 +319,14 @@
<source>Database file is corrupt:</source>
<target>Файл базы данных поврежден:</target>
-<source>Cannot write file %x.</source>
-<target>Невозможно записать файл %x.</target>
-
-<source>Cannot read file %x.</source>
-<target>Невозможно прочитать файл %x.</target>
-
<source>Database files do not share a common session.</source>
<target>Файлы баз данных не имеют общей сессии.</target>
<source>Searching for folder %x...</source>
<target>Поиск папки %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Невозможно прочитать атрибуты файла %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target>Тайм-аут при поиске папки %x.</target>
<source>Cannot get process information.</source>
<target>Невозможно получить информацию о процессе.</target>
@@ -343,6 +417,15 @@
<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>
+
<source>&Open...</source>
<target>&Открыть...</target>
@@ -368,10 +451,10 @@
<target>Инструкция:</target>
<source>1. Select folders to watch.</source>
-<target>1. Выберите папки для наблюдения;</target>
+<target>1. Выберите папки для наблюдения.</target>
<source>2. Enter a command line.</source>
-<target>2. Введите командную строку;</target>
+<target>2. Введите командную строку.</target>
<source>3. Press 'Start'.</source>
<target>3. Нажмите 'Старт'.</target>
@@ -391,9 +474,6 @@
<source>Browse</source>
<target>Обзор</target>
-<source>Select a folder</source>
-<target>Выбрать папку</target>
-
<source>Idle time (in seconds):</source>
<target>Время ожидания (в секундах):</target>
@@ -447,9 +527,6 @@ The command is triggered if:
<source>&Quit</source>
<target>&Выход</target>
-<source>Incorrect command line:</source>
-<target>Неверная командная строка:</target>
-
<source>&Retry</source>
<target>&Повторить</target>
@@ -472,7 +549,7 @@ The command is triggered if:
<target>Выборочно</target>
<source>Multiple...</source>
-<target>Различные варианты синхронизации</target>
+<target>Различные варианты синхронизации...</target>
<source>Moving file %x to %y</source>
<target>Перемещение файла %x в %y</target>
@@ -504,18 +581,18 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>Создание Тома Теневого Копирования для %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Ошибка проверки данных: %x и %y имеют разное содержание!</target>
-
<source>Target folder %x already existing.</source>
<target>Целевая папка %x уже существует.</target>
-<source>Cannot find folder %x.</source>
-<target>Невозможно найти папку %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Поле ввода целевой папки не должно быть пустым.</target>
@@ -528,11 +605,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Следующие элементы имеют неурегулированные конфликты и не будут синхронизированы:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>
-Следующие папки существенно различаются.
-Убедитесь, что вы указали соответствующие папки для синхронизации.
-</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Следующие папки значительно отличаются. Убедитесь, что вы выбрали правильные папки для синхронизации.</target>
<source>Not enough free disk space available in:</source>
<target>Не достаточно свободного места в:</target>
@@ -558,12 +632,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>Синхронизация остановлена</target>
+<source>Stopped</source>
+<target>Остановлено</target>
+
<source>Synchronization completed with errors</source>
<target>Синхронизация завершена. В процессе синхронизации возникли ошибки</target>
<source>Synchronization completed with warnings</source>
<target>Синхронизация завершена. В процессе синхронизации возникли проблемы</target>
+<source>Warning</source>
+<target>Внимание</target>
+
<source>Nothing to synchronize</source>
<target>Ничего нет для синхронизации</target>
@@ -571,10 +651,7 @@ The command is triggered if:
<target>Синхронизация завершена успешно</target>
<source>Cleaning up old log files...</source>
-<target>Очистка старых лог-файлов (журналов)</target>
-
-<source>Stopped</source>
-<target>Остановлено</target>
+<target>Очистка старых лог-файлов (журналов)...</target>
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Вы можете переключиться на главное окно FreeFileSync для решения этой проблемы.</target>
@@ -667,9 +744,6 @@ The command is triggered if:
<source>Action</source>
<target>Действие</target>
-<source>Drag && drop</source>
-<target>Drag && drop</target>
-
<source>Local comparison settings</source>
<target>Локальные настройки сравнения</target>
@@ -700,6 +774,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>Локальные настройки синхронизации</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Выбранная папка %x не может быть использована с FreeFileSync. Пожалуйста, выберите папку в локальной файловой системе, сетевую папку или MTP устройство.</target>
+
<source>&New</source>
<target>&Новая</target>
@@ -707,7 +784,7 @@ The command is triggered if:
<target>&Сохранить</target>
<source>Save as &batch job...</source>
-<target>Сохранить как пакетное &задание</target>
+<target>Сохранить как пакетное &задание...</target>
<source>Start &comparison</source>
<target>Начать с&равнение</target>
@@ -769,6 +846,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>Удалить пару папок</target>
+<source>Select SFTP folder</source>
+<target>Выберите папку SFTP</target>
+
<source>Swap sides</source>
<target>Поменять направление</target>
@@ -826,8 +906,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>Определять одинаковые файлы путем сравнения содержания файла.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Игнорировать временной сдвиг (в часах)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Игнорировать временной сдвиг (в часах)</target>
<source>Consider file times with specified offset as equal</source>
<target>Считать время файлов с указанным смещением равным</target>
@@ -835,14 +915,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>Ручной переход на летнее время</target>
-<source>Include symbolic links:</source>
-<target>Включать символьные ссылки:</target>
+<source>Include &symbolic links:</source>
+<target>Включая &символьные ссылки:</target>
-<source>Direct</source>
-<target>Прямое</target>
+<source>&Follow</source>
+<target>Пос&ледовательные</target>
-<source>Follow</source>
-<target>Последовательное</target>
+<source>&Direct</source>
+<target>&Прямые</target>
<source>More information</source>
<target>Больше информации</target>
@@ -881,14 +961,14 @@ The command is triggered if:
<target>Обнаруживать перемещенные файлы</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Обнаружение активируется после первой синхронизации
-- Требует и создает базы данных в синхронизируемых папках
-- Поддерживается не всеми файловыми системами
+- Не поддерживается всеми файловыми системами
+- Требует и создает файлы баз данных
+- Обнаружение не доступно для первой синхронизации
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -936,6 +1016,27 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Введите свои регистрационные данные SFTP:</target>
+
+<source>Server name or IP address:</source>
+<target>Имя сервера или IP адрес:</target>
+
+<source>Examples:</source>
+<target>Пример:</target>
+
+<source>User name:</source>
+<target>Имя пользователя:</target>
+
+<source>Password:</source>
+<target>Пароль:</target>
+
+<source>&Show password</source>
+<target>&Показать пароль</target>
+
+<source>Directory on server:</source>
+<target>Каталог на сервере:</target>
+
<source>Start synchronization now?</source>
<target>Начать синхронизацию сейчас?</target>
@@ -945,6 +1046,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>Больше &не показывать это окно</target>
+<source>Arrange folder pair</source>
+<target>Упорядочить пару папок</target>
+
<source>Items found:</source>
<target>Элементов найдено:</target>
@@ -1022,7 +1126,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Копирование заблокированных файлов</target>
<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target>Копирование общих или заблокированных файлов с использованием службы Теневого Копирования Тома</target>
+<target>Копирование общих или заблокированных файлов с использованием службы Теневого Копирования Тома.</target>
<source>(requires administrator rights)</source>
<target>(требуются права Администратора)</target>
@@ -1031,7 +1135,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Копирование прав доступа к файлам</target>
<source>Transfer file and folder permissions.</source>
-<target>Передача прав доступа к файлам/папкам</target>
+<target>Передача прав доступа к файлам/папкам.</target>
<source>Automatic retry on error:</source>
<target>Автоматическое повторение при ошибках:</target>
@@ -1081,6 +1185,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>Большое спасибо за перевод:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH протокол передачи файлов</target>
+
<source>Save as Batch Job</source>
<target>Сохранение пакетного задания</target>
@@ -1093,8 +1200,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Выбор промежутка времени</target>
-<source>&Preferences...</source>
-<target>&Предпочтения...</target>
+<source>&Preferences</source>
+<target>&Предпочтения</target>
+
+<source>Main Bar</source>
+<target>Главная панель</target>
<source>Folder Pairs</source>
<target>Пары папок для синхронизации</target>
@@ -1111,9 +1221,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>Главная</target>
-<source>Main Bar</source>
-<target>Главная панель</target>
-
<source>Confirm</source>
<target>Подтвердить</target>
@@ -1226,8 +1333,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&Не сохранять</target>
-<source>Delete selected configurations</source>
-<target>Удалить выделенные конфигурации</target>
+<source>Remove entry from list</source>
+<target>Удалить запись из листа</target>
<source>Synchronization Settings</source>
<target>Настройки синхронизации</target>
@@ -1280,8 +1387,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>Показать отфильтрованные или временно исключенные файлы</target>
-<source>Set as default</source>
-<target>Установить по умолчанию</target>
+<source>Save as default</source>
+<target>Сохранить по умолчанию</target>
<source>Filter</source>
<target>Фильтр</target>
@@ -1292,6 +1399,12 @@ This guarantees a consistent state even in case of a serious error.
<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>
@@ -1304,18 +1417,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>Закрыть окно процесса</target>
-<source>Standby</source>
-<target>Перейти в ожидании</target>
-
<source>Log off</source>
<target>Выйти из системы (разлогиниться)</target>
+<source>Standby</source>
+<target>Перейти в ожидании</target>
+
<source>Shut down</source>
<target>Выключить компьютер</target>
-<source>Hibernate</source>
-<target>Гибернация</target>
-
<source>Scanning...</source>
<target>Сканирование...</target>
@@ -1325,9 +1435,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Информация</target>
-<source>Warning</source>
-<target>Внимание</target>
-
<source>Select all</source>
<target>Выделить все</target>
@@ -1375,8 +1482,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>Предпочтения</target>
-<source>Copy NTFS permissions</source>
-<target>Копирование NTFS прав доступа</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Копировать DACL, SACL, владелец, группа</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>
@@ -1474,27 +1581,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>Проценты</target>
+<source>Unable to register to receive system messages.</source>
+<target>Невозможно зарегистрироваться для получения системных сообщений.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Не удалось зарегистрировать уведомления устройств для %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Невозможно наблюдать папку %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Невозможно удалить файл %x.</target>
-
<source>The file is locked by another process:</source>
<target>Файл заблокирован другим процессом:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Невозможно перенести файл %x в %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Невозможно удалить папку %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Невозможно записать атрибуты файла %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Невозможно записать время изменения файла %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Невозможно прочитать контекст безопасности %x.</target>
@@ -1504,33 +1605,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>Невозможно прочитать права доступа %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Невозможно записать права доступа %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Невозможно создать папку %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Невозможно скопировать символьную ссылку %x в %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Невозможно скопировать разрешения от %x к %y.</target>
<source>Cannot find system function %x.</source>
<target>Невозможно найти системную функцию %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Невозможно скопировать атрибуты от %x к %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Невозможно скопировать файл %x в %y.</target>
<source>Type of item %x is not supported:</source>
<target>Тип элемента %x не поддерживается:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Невозможно разрешить символьную ссылку %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Невозможно открыть папку %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Невозможно прочесть папку %x.</target>
-
<source>%x TB</source>
<target>%x ТБ</target>
@@ -1567,9 +1656,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x дней</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Невозможно зарегистрироваться для получения системных сообщений.</target>
-
<source>Cannot set privilege %x.</source>
<target>Невозможно установить привилегии %x.</target>
@@ -1579,23 +1665,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>Невозможно изменить приоритет процесса.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Невозможно переместить %x в "Корзину".</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Проверка "Корзины" не удалась для папки %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Невозможно определить конечный путь для %x.</target>
-
-<source>Error Code %x:</source>
-<target>Код ошибки %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Невозможно прочитать следующие XML элементы:</target>
+<source>The following XML elements could not be read:</source>
+<target>Следующие XML-элементы не могут быть прочитаны:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Конфигурационный файл %x загрузился частично.</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>
diff --git a/FreeFileSync/Build/Languages/serbian.lng b/FreeFileSync/Build/Languages/serbian.lng
index b7542d79..492ca20c 100644
--- a/FreeFileSync/Build/Languages/serbian.lng
+++ b/FreeFileSync/Build/Languages/serbian.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Синтаксичка грешка</target>
-<source>Cannot open file %x.</source>
-<target>Не могу отворити датотеку %x.</target>
+<source>Cannot find file %x.</source>
+<target>Не могу пронаћи датотеку %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Датотека %x не садржи валидну конфигурацију.</target>
@@ -94,7 +94,7 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Било који број алтернативних фолдерских парова за бар једну конфигурациону датотеку.</target>
-<source>Open configuration for edit without executing.</source>
+<source>Open configuration for editing without executing it.</source>
<target>Отвори конфигурацију за уређивање без покретања.</target>
<source>Cannot find the following folders:</source>
@@ -202,6 +202,86 @@
<source>Update attributes on right</source>
<target>Освежи атрибуте десно</target>
+<source>Cannot read file %x.</source>
+<target>Не могу читати датотеку %x.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Неочекивана величина низа података.
+Очекивано: %x бајтова
+Стварно: %y бајтова
+</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 write file %x.</source>
+<target>Не могу уписати датотеку %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Не могу копирати симболичну везу %x у %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Не могу преместити датотеку %x у %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Не могу излистати фолдер %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Не могу прочитати атрибуте од %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Не могу пронаћи %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Не могу отворити датотеку %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Не могу пронаћи уређај %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Не могу одредити слободан простор на диску за %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Не могу креирати фолдер %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Не могу избрисати фолдер %x.</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>Не могу отворити фолдер %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Нетачна командна линија:</target>
+
+<source>Error Code %x:</source>
+<target>Грешка број %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Није успело успостављање везе са SFTP сервером %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -236,20 +316,14 @@
<source>Database file is corrupt:</source>
<target>Датотека базе је оштећена:</target>
-<source>Cannot write file %x.</source>
-<target>Не могу уписати датотеку %x.</target>
-
-<source>Cannot read file %x.</source>
-<target>Не могу читати датотеку %x.</target>
-
<source>Database files do not share a common session.</source>
<target>Датотеке базе не деле заједничку сесију.</target>
<source>Searching for folder %x...</source>
<target>Тражим фолдер %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Не могу прочитати атрибуте од %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target>Дошло је до тајмаута при претрази фолдера %x.</target>
<source>Cannot get process information.</source>
<target>Не могу добити информације о процесу.</target>
@@ -340,6 +414,15 @@
<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>
+
<source>&Open...</source>
<target>&Отвори...</target>
@@ -388,9 +471,6 @@
<source>Browse</source>
<target>Одабери</target>
-<source>Select a folder</source>
-<target>Одаберите фолдер</target>
-
<source>Idle time (in seconds):</source>
<target>Време мировања (у секундама):</target>
@@ -444,9 +524,6 @@ The command is triggered if:
<source>&Quit</source>
<target>&Излаз</target>
-<source>Incorrect command line:</source>
-<target>Нетачна командна линија:</target>
-
<source>&Retry</source>
<target>&Понови</target>
@@ -501,18 +578,18 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>Креирање Volume Shadow Copy за %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Грешка при провери података: %x и %y имају различит садржај.</target>
-
<source>Target folder %x already existing.</source>
<target>Одредишни фолдер %x већ постоји.</target>
-<source>Cannot find folder %x.</source>
-<target>Не могу пронаћи фолдер %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Поље за одабир одредишног фолдера не може бити празно.</target>
@@ -525,8 +602,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Следеће ставке имају неразрешених конфликата и неће бити синхронизоване:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Следећи фолдери су значајно различити. Обезбедите да сигурно упарујете праве фолдере за синхронизацију.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Следећи фолдери су значајно различити. Обезбедите да сте сигурно одабрали праве фолдере за синхронизацију.</target>
<source>Not enough free disk space available in:</source>
<target>Недовољно простора на диску у:</target>
@@ -552,12 +629,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>Синхронизација заустављена</target>
+<source>Stopped</source>
+<target>Заустављено</target>
+
<source>Synchronization completed with errors</source>
<target>Синхронизација завршена с грешкама</target>
<source>Synchronization completed with warnings</source>
<target>Синхронизација завршена с упозорењима</target>
+<source>Warning</source>
+<target>Упозорење</target>
+
<source>Nothing to synchronize</source>
<target>Нема ничега за синхронизацију</target>
@@ -567,9 +650,6 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>Уклањање старих датотека лога...</target>
-<source>Stopped</source>
-<target>Заустављено</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Можете се пребацити на главни прозор FreeFileSync-а да би разрешили ову ствар.</target>
@@ -661,9 +741,6 @@ The command is triggered if:
<source>Action</source>
<target>Акција</target>
-<source>Drag && drop</source>
-<target>Вуци && пусти</target>
-
<source>Local comparison settings</source>
<target>Локална подешавања упоређивања</target>
@@ -694,6 +771,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>Локална подешавања синхронизације</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Одабрани фолдер %x не може бити коришћен од стране FreeFileSync-а. Молимо одаберите фолдер на локалном систему, мрежи или на MTP уређају.</target>
+
<source>&New</source>
<target>&Ново</target>
@@ -763,6 +843,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>Уклони фолдер пар</target>
+<source>Select SFTP folder</source>
+<target>Одаберите SFTP фолдер</target>
+
<source>Swap sides</source>
<target>Замени стране</target>
@@ -820,8 +903,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>Идентификуј једнаке датотеке упоређивањем садржаја датотека.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Игнориши временски помак (у сатима)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Игнориши временски помак (у сатима)</target>
<source>Consider file times with specified offset as equal</source>
<target>Сматрај времена датотека са задатим помаком као једнака</target>
@@ -829,14 +912,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>Руковођење сезонским рачунањем времена</target>
-<source>Include symbolic links:</source>
-<target>Укључи симболичне везе:</target>
+<source>Include &symbolic links:</source>
+<target>Укључи &симболичне везе:</target>
-<source>Direct</source>
-<target>Непосредно</target>
+<source>&Follow</source>
+<target>&Следи</target>
-<source>Follow</source>
-<target>Следи</target>
+<source>&Direct</source>
+<target>&Непосредно</target>
<source>More information</source>
<target>Више информација</target>
@@ -875,14 +958,14 @@ The command is triggered if:
<target>Уочи премештене датотеке</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Детекција активна после почетне синхронизације
-- Потребује и креира датотеке базе
- Није подржано од свих система датотека
+- Потребује и креира датотеке базе
+- Детекција није доступна за прву синхронизацију
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -930,6 +1013,27 @@ The command is triggered if:
<source>OK</source>
<target>У реду</target>
+<source>Enter your SFTP login details:</source>
+<target>Унесите ваше SFTP податке логовања:</target>
+
+<source>Server name or IP address:</source>
+<target>Име сервера или IP адресу:</target>
+
+<source>Examples:</source>
+<target>Примери:</target>
+
+<source>User name:</source>
+<target>Корисничко име:</target>
+
+<source>Password:</source>
+<target>Лозинка:</target>
+
+<source>&Show password</source>
+<target>&Прикажи лозинку</target>
+
+<source>Directory on server:</source>
+<target>Фолдер на серверу:</target>
+
<source>Start synchronization now?</source>
<target>Почни синхронизацију сада?</target>
@@ -939,6 +1043,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>&Не приказуј овај диалог поновно</target>
+<source>Arrange folder pair</source>
+<target>Поређај фолдерски пар</target>
+
<source>Items found:</source>
<target>Пронађене ставке:</target>
@@ -1071,6 +1178,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>Велике похвале за локализацију:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH протокол трансфера</target>
+
<source>Save as Batch Job</source>
<target>Сачувај као беч задатак</target>
@@ -1083,8 +1193,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Изаберите временски распон</target>
-<source>&Preferences...</source>
-<target>&Преференце...</target>
+<source>&Preferences</source>
+<target>&Преференце</target>
+
+<source>Main Bar</source>
+<target>Главна трака</target>
<source>Folder Pairs</source>
<target>Фолдерски парови</target>
@@ -1101,9 +1214,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>Преглед</target>
-<source>Main Bar</source>
-<target>Главна трака</target>
-
<source>Confirm</source>
<target>Потврди</target>
@@ -1216,8 +1326,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>Не&мој сачувати</target>
-<source>Delete selected configurations</source>
-<target>Обриши селектоване конфигурације</target>
+<source>Remove entry from list</source>
+<target>Уклони унос из листе</target>
<source>Synchronization Settings</source>
<target>Подешавања синхронизације</target>
@@ -1270,8 +1380,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>Прикажи филтриране или привремено искључене датотеке</target>
-<source>Set as default</source>
-<target>Постави као подразумевано</target>
+<source>Save as default</source>
+<target>Сачувај као подразумевано</target>
<source>Filter</source>
<target>Филтрирање</target>
@@ -1280,7 +1390,13 @@ This guarantees a consistent state even in case of a serious error.
<target>Све датотеке су синхронизоване</target>
<source>Cannot find %x</source>
-<target>Немогу пронаћи %x</target>
+<target>Не могу пронаћи %x</target>
+
+<source>Move up</source>
+<target>Помери на горе</target>
+
+<source>Move down</source>
+<target>Помери на доле</target>
<source>Comma-separated values</source>
<target>Зарезом одвојене вредности</target>
@@ -1294,18 +1410,15 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>Затвори дијалог прогреса</target>
-<source>Standby</source>
-<target>Пређи у стање приправности</target>
-
<source>Log off</source>
<target>Одјави се</target>
+<source>Standby</source>
+<target>Пређи у стање приправности</target>
+
<source>Shut down</source>
<target>Искључи рачунар</target>
-<source>Hibernate</source>
-<target>Хибернација</target>
-
<source>Scanning...</source>
<target>Прегледавање...</target>
@@ -1315,9 +1428,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Инфо</target>
-<source>Warning</source>
-<target>Упозорење</target>
-
<source>Select all</source>
<target>Одабери све</target>
@@ -1365,8 +1475,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>Преференце</target>
-<source>Copy NTFS permissions</source>
-<target>Копирај NTFS овлашћења</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Копирај DACL, SACL, Власника, Групу</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Интегриши спољне апликације у контекстни мени. Следећи макрои су доступни:</target>
@@ -1461,26 +1571,20 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>Проценат</target>
+<source>Unable to register to receive system messages.</source>
+<target>Није могућа регистрација примања системских порука.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Не могу регистровати нотификацију уређаја за %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Не могу надгледати фолдер %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Не могу избрисати датотеку %x.</target>
-
<source>The file is locked by another process:</source>
<target>Датотека је блокирана другим процесом:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Не могу преместити датотеку %x у %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Не могу избрисати фолдер %x.</target>
-
<source>Cannot write file attributes of %x.</source>
-<target>Не могу уписати својства од %x.</target>
-
-<source>Cannot write modification time of %x.</source>
-<target>Не могу уписати време промене %x.</target>
+<target>Не могу уписати атрибуте од %x.</target>
<source>Cannot read security context of %x.</source>
<target>Не могу читати безбедносни садржај %x.</target>
@@ -1491,33 +1595,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>Не могу читати овлашћења од %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Не могу уписати овлашћења за %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Не могу креирати фолдер %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Не могу копирати симболичну везу %x у %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Не могу копирати овлашћења од %x у %y.</target>
<source>Cannot find system function %x.</source>
<target>Не могу пронаћи системску функцију %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Не могу копирати атрибуте од %x у %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Не могу копирати датотеку %x на %y.</target>
<source>Type of item %x is not supported:</source>
<target>Тип ставке %x није подржан:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Не могу разрешити симболичну везу %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Не могу отворити фолдер %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Не могу излистати фолдер %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1554,9 +1646,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x дана</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Није могућа регистрација примања системских порука.</target>
-
<source>Cannot set privilege %x.</source>
<target>Не могу поставити права за %x.</target>
@@ -1564,25 +1653,16 @@ This guarantees a consistent state even in case of a serious error.
<target>Није могуће суспендовање мода спавања система.</target>
<source>Cannot change process I/O priorities.</source>
-<target>Не може се променити процес I/O приоритета</target>
-
-<source>Unable to move %x to the recycle bin.</source>
-<target>Није могуће преместити %x у Корпи за смеће.</target>
+<target>Не може се променити процес I/O приоритета.</target>
<source>Checking recycle bin failed for folder %x.</source>
<target>Провера доступности Корпе за смеће није успела за фолдер %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Не могу утврдити коначну путању за %x.</target>
-
-<source>Error Code %x:</source>
-<target>Грешка број %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Не могу прочитати следеће XML елементе:</target>
+<source>The following XML elements could not be read:</source>
+<target>Следећи XML елементи не могу бити прочитани:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Датотека подешавања %x учитана само делимично.</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>
diff --git a/FreeFileSync/Build/Languages/spanish.lng b/FreeFileSync/Build/Languages/spanish.lng
index 3d1cc018..119b88e7 100644
--- a/FreeFileSync/Build/Languages/spanish.lng
+++ b/FreeFileSync/Build/Languages/spanish.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Error de sintaxis</target>
-<source>Cannot open file %x.</source>
-<target>No se puede abrir el archivo %x.</target>
+<source>Cannot find file %x.</source>
+<target>No se encuentra el archivo %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>El archivo %x no contiene una configuración válida.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Cualquier número de pares de directorios alternativos para un archivo de configuración como máximo.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Abrir en edición sin ejecutar la configuración.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Abrir la configuración para su modicación sin ejecutarla.</target>
<source>Cannot find the following folders:</source>
<target>No se pudieron encontrar las siguiente carpetas:</target>
@@ -202,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Tamaño no esperado del flujo de datos.
+Esperados: %x bytes
+Reales: %y bytes
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>No se pueden escribir los permisos de %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>No se puede copiar el vínculo simbólico %x a %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>No se puede mover el archivo %x a %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>No se puede enumerar 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 find %x.</source>
+<target>No se encuentra %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>No se puede abrir el archivo %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>No se encuentra el dispositivo %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>No se puede determinar el espacio libre en disco para %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>No se puede crear el directorio %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>No se puede eliminar el directorio %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>No se puede eliminar el archivo %x.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>No se puede escribir el tiempo de modificación de %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>No se puede determinar la ruta final de %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>No se puede resolver el vínculo simbólico %x.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Incapaz de mover %x a la papelera de reciclaje.</target>
+
+<source>Cannot open directory %x.</source>
+<target>No se puede abrir el directorio %x.</target>
+
+<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>Failed to connect to SFTP server %x.</source>
+<target>Fallo de conexión con el servidor SFTP %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -218,7 +298,7 @@
<target>%x KB</target>
<source>%x GB</source>
-<target>%x GB</target>
+<target>%x Gb</target>
<source>Cannot load file %x.</source>
<target>No se puede cargar el archivo %x.</target>
@@ -235,20 +315,14 @@
<source>Database file is corrupt:</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>Database files do not share a common session.</source>
<target>Los archivos de base de datos no comparten una sesión común.</target>
<source>Searching for folder %x...</source>
<target>Buscando carpeta %x…</target>
-<source>Cannot read file attributes of %x.</source>
-<target>No se puede leer archivo de atributos de %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target>Tiempo agotado buscando la carpeta %x.</target>
<source>Cannot get process information.</source>
<target>No se puede obtener información del proceso.</target>
@@ -337,6 +411,15 @@
<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>
+
<source>&Open...</source>
<target>&Abrir…</target>
@@ -385,9 +468,6 @@
<source>Browse</source>
<target>Examinar</target>
-<source>Select a folder</source>
-<target>Seleccione una carpeta</target>
-
<source>Idle time (in seconds):</source>
<target>Tiempo de inactividad (en segundos):</target>
@@ -441,9 +521,6 @@ El comando es disparado si:
<source>&Quit</source>
<target>&Salir</target>
-<source>Incorrect command line:</source>
-<target>Línea de comandos incorrecta:</target>
-
<source>&Retry</source>
<target>&Reintentar</target>
@@ -498,18 +575,18 @@ El comando es disparado si:
<source>Updating attributes of %x</source>
<target>Actualizar atributos 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>Creating a Volume Shadow Copy for %x...</source>
<target>Creando una Instantánea de volumen para %x…</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Error al comprobar los datos: %x y %y tienen contenidos diferentes.</target>
-
<source>Target folder %x already existing.</source>
<target>La carpeta de destino %x ya existe.</target>
-<source>Cannot find folder %x.</source>
-<target>No se puede encontrar la carpeta %x</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>
@@ -522,8 +599,8 @@ El comando es disparado si:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>Las carpetas siguientes muestran diferencias significativas. Compruebe que hace coincidir las carpetas correctas para su sincronización.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Las carpetas siguientes presentan diferencias importantes. 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>
@@ -549,12 +626,18 @@ El comando es disparado si:
<source>Synchronization stopped</source>
<target>Sincronización detenida</target>
+<source>Stopped</source>
+<target>Detenido</target>
+
<source>Synchronization completed with errors</source>
<target>Sincronización completada con errores</target>
<source>Synchronization completed with warnings</source>
<target>Sincronización completada con avisos</target>
+<source>Warning</source>
+<target>Atención</target>
+
<source>Nothing to synchronize</source>
<target>Nada que sincronizar</target>
@@ -564,9 +647,6 @@ El comando es disparado si:
<source>Cleaning up old log files...</source>
<target>Limpiando antiguos archivos de registro…</target>
-<source>Stopped</source>
-<target>Detenido</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Puede cambiar a la ventana principal de FreeFileSync para resolver este problema.</target>
@@ -657,9 +737,6 @@ El comando es disparado si:
<source>Action</source>
<target>Acción</target>
-<source>Drag && drop</source>
-<target>Arrastrar y soltar</target>
-
<source>Local comparison settings</source>
<target>Opciones de comparación local</target>
@@ -690,6 +767,9 @@ El comando es disparado si:
<source>Local Synchronization Settings</source>
<target>Opciones de sincronización local</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>No se puede utilizar la carpeta %x seleccionada con FreeFileSync. Seleccione una carpeta situada en un sistema de archivos local, en una red o en un dispositivo MTP.</target>
+
<source>&New</source>
<target>&Nuevo</target>
@@ -759,6 +839,9 @@ El comando es disparado si:
<source>Remove folder pair</source>
<target>Eliminar un par de carpetas</target>
+<source>Select SFTP folder</source>
+<target>Seleccione una carpeta SFTP</target>
+
<source>Swap sides</source>
<target>Intercambiar lados</target>
@@ -816,8 +899,8 @@ El comando es disparado si:
<source>Identify equal files by comparing the file content.</source>
<target>Comparar archivos iguales por el contenido.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignorar desfase horario (en horas)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignorar desfases temporales (en horas)</target>
<source>Consider file times with specified offset as equal</source>
<target>Considerar que las fechas con el desfase indicado son idénticas</target>
@@ -825,14 +908,14 @@ El comando es disparado si:
<source>Handle daylight saving time</source>
<target>Tener en cuenta la hora de verano</target>
-<source>Include symbolic links:</source>
-<target>Incluir vínculos simbólicos:</target>
+<source>Include &symbolic links:</source>
+<target>Incluir vínculos &simbólicos:</target>
-<source>Direct</source>
-<target>Directo</target>
+<source>&Follow</source>
+<target>&Seguir</target>
-<source>Follow</source>
-<target>Seguir</target>
+<source>&Direct</source>
+<target>&Directo</target>
<source>More information</source>
<target>Más información</target>
@@ -871,14 +954,14 @@ El comando es disparado si:
<target>Detectar archivos movidos</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Detección activa tras sync. inicial
-- Requiere y crea archivos de base de datos
- No compatible con todos los sistemas de archivos
+- Requiere y crea archivos de bases de datos
+- Detección no disponible en primera sincronización
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -926,6 +1009,27 @@ El comando es disparado si:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Escriba sus datos de conexión SFTP:</target>
+
+<source>Server name or IP address:</source>
+<target>Nombre o dirección IP del servidor:</target>
+
+<source>Examples:</source>
+<target>Ejemplos:</target>
+
+<source>User name:</source>
+<target>Usuario:</target>
+
+<source>Password:</source>
+<target>Contraseña:</target>
+
+<source>&Show password</source>
+<target>Mo&strar constraseña</target>
+
+<source>Directory on server:</source>
+<target>Directorio del servidor:</target>
+
<source>Start synchronization now?</source>
<target>¿Iniciar la sincronización ahora?</target>
@@ -935,6 +1039,9 @@ El comando es disparado si:
<source>&Don't show this dialog again</source>
<target>&No volver a mostrar este diálogo</target>
+<source>Arrange folder pair</source>
+<target>Reorganizar pares de carpetas</target>
+
<source>Items found:</source>
<target>Elementos encontrados:</target>
@@ -987,7 +1094,7 @@ El comando es disparado si:
<target>Cómo puedo programar una tarea por lotes?</target>
<source>The following settings are used for all synchronization jobs.</source>
-<target>Las opciones siguientes se utilizan para todas las tareas de sincronización.</target>
+<target>Las opciones siguientes son comunes a todas las tareas de sincronización.</target>
<source>Fail-safe file copy</source>
<target>Copia de archivo a prueba de fallos</target>
@@ -1046,11 +1153,14 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Source code written in C++ using:</source>
<target>Código fuente C++ con soporte de :</target>
+<source>If you like FreeFileSync:</source>
+<target>Si te resulta útil FreeFileSync:</target>
+
<source>Donate with PayPal</source>
<target>Haz una donación por PayPal</target>
<source>Feedback and suggestions are welcome</source>
-<target>Sus comentarios y sugerencias son bienvenidos :</target>
+<target>Tus comentarios y sugerencias son bienvenidos :</target>
<source>Homepage</source>
<target>Página de inicio</target>
@@ -1059,11 +1169,14 @@ Se garantiza un estado coherente incluso en caso de error grave.
<target>Correo electrónico</target>
<source>Published under the GNU General Public License</source>
-<target>Publicado con derechos GNU General Public License :</target>
+<target>Publicado bajo régimen de derechos GNU General Public License :</target>
<source>Many thanks for localization:</source>
<target>Agradecimientos a los traductores :</target>
+<source>SSH File Transfer Protocol</source>
+<target>Protocolo de transferencia de archivos SSH</target>
+
<source>Save as Batch Job</source>
<target>Guardar como tarea por lotes</target>
@@ -1076,8 +1189,11 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Select Time Span</source>
<target>Seleccionar duración</target>
-<source>&Preferences...</source>
-<target>&Preferencias…</target>
+<source>&Preferences</source>
+<target>&Preferencias</target>
+
+<source>Main Bar</source>
+<target>Barra principal</target>
<source>Folder Pairs</source>
<target>Pares de carpetas</target>
@@ -1094,9 +1210,6 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Overview</source>
<target>Vista general</target>
-<source>Main Bar</source>
-<target>Barra principal</target>
-
<source>Confirm</source>
<target>Confirmar</target>
@@ -1205,8 +1318,8 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Do&n't save</source>
<target>&No guardar</target>
-<source>Delete selected configurations</source>
-<target>Eliminar las configuraciones seleccionadas</target>
+<source>Remove entry from list</source>
+<target>Retirar la entrada de la lista</target>
<source>Synchronization Settings</source>
<target>Opciones de sincronización</target>
@@ -1259,8 +1372,8 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Show filtered or temporarily excluded files</source>
<target>Mostrar archivos excluidos temporalmente o filtrados</target>
-<source>Set as default</source>
-<target>Predeterminado</target>
+<source>Save as default</source>
+<target>Guardar como predeterminado</target>
<source>Filter</source>
<target>Filtro</target>
@@ -1271,6 +1384,12 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Cannot find %x</source>
<target>No se puede encontrar %x</target>
+<source>Move up</source>
+<target>Subir</target>
+
+<source>Move down</source>
+<target>Bajar</target>
+
<source>Comma-separated values</source>
<target>Valores separados por comas</target>
@@ -1283,18 +1402,15 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Close progress dialog</source>
<target>Cerrar diálogo de progreso</target>
-<source>Standby</source>
-<target>Suspender</target>
-
<source>Log off</source>
<target>Finalizar sesión</target>
+<source>Standby</source>
+<target>Suspender</target>
+
<source>Shut down</source>
<target>Apagar</target>
-<source>Hibernate</source>
-<target>Hibernar</target>
-
<source>Scanning...</source>
<target>Escaneando…</target>
@@ -1304,9 +1420,6 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Atención</target>
-
<source>Select all</source>
<target>Seleccionar todo</target>
@@ -1352,11 +1465,11 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Preferences</source>
<target>Preferencias</target>
-<source>Copy NTFS permissions</source>
-<target>Copiar permisos NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Copiar permisos DACL, SACL, Owner, Group</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
-<target>Integrar aplicaciones externas en el menú de contexto. Los siguientes macros están disponibles:</target>
+<target>Integrar aplicaciones externas en el menú de contexto. Las macros siguientes están disponibles:</target>
<source>- full file or folder name</source>
<target>- nombre completo de archivo o carpeta</target>
@@ -1448,27 +1561,21 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Percentage</source>
<target>Porcentaje</target>
+<source>Unable to register to receive system messages.</source>
+<target>No es posible registrar la recepción de mensajes sistema.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>No es posible registrar las notificaciones de dispositivo para %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>No se puede monitorizar el directorio %x.</target>
-<source>Cannot delete file %x.</source>
-<target>No se puede eliminar el archivo %x.</target>
-
<source>The file is locked by another process:</source>
<target>El archivo está bloqueado por otro proceso:</target>
-<source>Cannot move file %x to %y.</source>
-<target>No se puede mover el archivo %x a %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>No se puede eliminar el directorio %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>No se pueden escribir los atributos de archivo de %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>No se puede escribir el tiempo de modificación de %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>No se puede leer el contexto de seguridad de %x.</target>
@@ -1478,33 +1585,21 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Cannot read permissions of %x.</source>
<target>No se pueden leer los permisos de %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>No se pueden escribir los permisos de %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>No se puede crear el directorio %x.</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>Cannot copy permissions from %x to %y.</source>
+<target>No se puedem copiar los permisos desde %x hacia %y.</target>
<source>Cannot find system function %x.</source>
<target>No se puede encontrar la función del sistema %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>No se puedem copiar los atributos desde %x hacia %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>No se puede copiar el archivo %x a %y.</target>
<source>Type of item %x is not supported:</source>
<target>El tipo de objeto %x no esta soportado:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>No se puede resolver el vínculo simbólico %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>No se puede abrir el directorio %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>No se puede enumerar el directorio %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1538,9 +1633,6 @@ Se garantiza un estado coherente incluso en caso de error grave.
<pluralform>%x días</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>No es posible registrar la recepción de mensajes sistema.</target>
-
<source>Cannot set privilege %x.</source>
<target>No se puede asignar el privilegio %x.</target>
@@ -1550,23 +1642,14 @@ Se garantiza un estado coherente incluso en caso de error grave.
<source>Cannot change process I/O priorities.</source>
<target>No se pudieron cambiar las prioridades de E/S del proceso.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Incapaz de mover %x a la papelera de reciclaje.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Fallo al comprobar la papelera de reciclaje para la carpeta %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>No se puede determinar la ruta final de %x.</target>
-
-<source>Error Code %x:</source>
-<target>Error: %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>No se pueden leer los siguientes elementos XML:</target>
+<source>The following XML elements could not be read:</source>
+<target>No se pueden leer los siguientes elementos XML :</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Archivo de configuración %x cargado sólo parcialmente.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>El archivo de configuración %x está incompleto. Los elementos ausentes se definirán con valores predeterminados.</target>
<source>Prepare installation</source>
<target>Preparar la instalación</target>
diff --git a/FreeFileSync/Build/Languages/swedish.lng b/FreeFileSync/Build/Languages/swedish.lng
index 74d6745c..fb5e9cd9 100644
--- a/FreeFileSync/Build/Languages/swedish.lng
+++ b/FreeFileSync/Build/Languages/swedish.lng
@@ -17,7 +17,7 @@
<target>Inga ändringar sedan senaste synkronisering.</target>
<source>The database entry is not in sync considering current settings.</source>
-<target>Databasposten är inte synkroniserad, i förhållande till aktuella inställningar</target>
+<target>Databasposten är inte synkroniserad, i förhållande till aktuella inställningar.</target>
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner.</target>
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Syntaxfel</target>
-<source>Cannot open file %x.</source>
-<target>Kan inte öppna %x</target>
+<source>Cannot find file %x.</source>
+<target>Kan inte hitta filen %x.</target>
<source>File %x does not contain a valid configuration.</source>
<target>Filen %x innehåller ingen giltig konfiguration.</target>
@@ -68,7 +68,7 @@
<target>Konfigurationsfilen kan inte innehålla inställningar på katalogparnivå när mappar anges via kommandorad.</target>
<source>Directories cannot be set for more than one configuration file.</source>
-<target>Mappar kan inte anges för mer än en konfigurationsfil</target>
+<target>Mappar kan inte anges för mer än en konfigurationsfil.</target>
<source>Command line</source>
<target>Kommandofält</target>
@@ -86,25 +86,25 @@
<target>mapp</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
-<target>Sökväg till en alternativ GlobalSettings.xml-fil</target>
+<target>Sökväg till en alternativ GlobalSettings.xml-fil.</target>
<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
<target>Valfritt antal FreeFileSync .ffs_gui och/eller .ffs_batch konfigurationsfiler.</target>
<source>Any number of alternative directory pairs for at most one config file.</source>
-<target>Valfritt antal alternativa katalogpar för som mest, en konfigurationsfil</target>
+<target>Valfritt antal alternativa katalogpar för som mest, en konfigurationsfil.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Öppna konfigurationen för redigering utan exekvering</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Öppna konfigurationen för redigering utan att köra det.</target>
<source>Cannot find the following folders:</source>
<target>Kan inte hitta följande mappar:</target>
<source>You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.</source>
-<target>Du kan bortse från detta fel, och betrakta varje mapp som tom. Mapparna kommer då att skapas automatiskt, under synkroniseringen</target>
+<target>Du kan bortse från detta fel, och betrakta varje mapp som tom. Mapparna kommer då att skapas automatiskt, under synkroniseringen.</target>
<source>A folder input field is empty.</source>
-<target>Ett inmatningsfält är tomt</target>
+<target>Ett inmatningsfält är tomt.</target>
<source>The corresponding folder will be considered as empty.</source>
<target>Motsvarande mapp kommer att betraktas som tom.</target>
@@ -202,6 +202,86 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Oväntad storlek på dataström.
+Förväntad: %x byte
+Aktuell: %y byte
+</target>
+
+<source>Cannot write permissions of %x.</source>
+<target>Kan inte skriva behörigheter för %x.</target>
+
+<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 copy symbolic link %x to %y.</source>
+<target>Kan inte kopiera den symboliska länken %x till %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Kan inte flytta filen %x till %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Kan inte räkna upp %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Kan inte läsa filattribut för %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Kan inte hitta %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Kan inte öppna %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Kan inte hitta enheten %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Kan inte avgöra ledigt utrymme på %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Kan inte skapa mappen %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Kan inte ta bort mappen %x.</target>
+
+<source>Cannot delete file %x.</source>
+<target>Filen %x kan inte tas bort.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>Kan inte ändra tidsangivelsen för %x.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Kan inte utläsa slutlig sökväg för %x.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>Den symboliska länken %x kan inte matchas.</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>Kan inte att flytta %x till papperskorgen.</target>
+
+<source>Cannot open directory %x.</source>
+<target>Kan inte öppna %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Felaktig kommandorad:</target>
+
+<source>Error Code %x:</source>
+<target>Felkod %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Kunde inte ansluta till SFTP-server %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -221,37 +301,31 @@
<target>%x GB</target>
<source>Cannot load file %x.</source>
-<target>Kan inte läsa in %x</target>
+<target>Kan inte läsa in %x.</target>
<source>Database file %x is incompatible.</source>
-<target>Databasfilen %x är inkompatibel</target>
+<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>
+<target>Databasfilen %x finns ännu inte.</target>
<source>Database file is corrupt:</source>
-<target>Databafilen är korrupt</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>
+<target>Databafilen är korrupt:</target>
<source>Database files do not share a common session.</source>
-<target>Databasfilerna har ingen gemensam session</target>
+<target>Databasfilerna har ingen gemensam session.</target>
<source>Searching for folder %x...</source>
<target>Söker efter mappen %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Kan inte läsa filattribut för %x</target>
+<source>Time out 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>
+<target>Processinformation kan inte inhämtas.</target>
<source>Waiting while directory is locked:</source>
<target>Väntar medan mappen låses:</target>
@@ -278,7 +352,7 @@
<target>Sparar %x...</target>
<source>Items processed:</source>
-<target>Processade poster</target>
+<target>Processade poster:</target>
<source>Items remaining:</source>
<target>Återstående poster:</target>
@@ -320,13 +394,13 @@
<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>
+<target>Kan inte komma åt tjänsten 'Volume Shadow Copy'.</target>
<source>Please use FreeFileSync 64-bit version to create shadow copies on this system.</source>
<target>Använd FreeFileSync 64-bitarsversion 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>
+<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>
@@ -337,6 +411,15 @@
<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>
+
<source>&Open...</source>
<target>&Öppna...</target>
@@ -371,7 +454,7 @@
<target>3. Tryck 'Start'.</target>
<source>To get started just import a .ffs_batch file.</source>
-<target>Importera en .ffs_batch-fil för att komma igång</target>
+<target>Importera en .ffs_batch-fil för att komma igång.</target>
<source>Folders to watch:</source>
<target>Mappar att övervaka:</target>
@@ -385,11 +468,8 @@
<source>Browse</source>
<target>Bläddra</target>
-<source>Select a folder</source>
-<target>Välj en mapp</target>
-
<source>Idle time (in seconds):</source>
-<target>Vilotid (i sekunder)</target>
+<target>Vilotid (i sekunder):</target>
<source>Idle time between last detected change and execution of command</source>
<target>Väntetid mellan senast upptäckta förändring och kommandoexekvering</target>
@@ -441,9 +521,6 @@ Kommandot triggas om:
<source>&Quit</source>
<target>&Avsluta</target>
-<source>Incorrect command line:</source>
-<target>Felaktig kommandorad:</target>
-
<source>&Retry</source>
<target>&Försök igen</target>
@@ -498,18 +575,18 @@ Kommandot triggas om:
<source>Updating attributes of %x</source>
<target>Uppdaterar attribut 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>Creating a Volume Shadow Copy for %x...</source>
<target>Skapar en 'Volume Shadow Copy' för %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Dataverifieringsfel: %x och %y har olika innehåll.</target>
-
<source>Target folder %x already existing.</source>
<target>Målmappen %x finns redan.</target>
-<source>Cannot find folder %x.</source>
-<target>Kan inte hitta mappen %x</target>
-
<source>Target folder input field must not be empty.</source>
<target>Indatafältet för målmapp får inte vara tomt.</target>
@@ -522,8 +599,8 @@ Kommandot triggas om:
<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. Make sure you are matching the correct folders for synchronization.</source>
-<target>Följande mappar är signifikant olika. Kontrollera att du jämför rätt mappar för synkronisering.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Följande mappar är signifikant olika. Tillse att du har valt rätt mappar för synkronisering.</target>
<source>Not enough free disk space available in:</source>
<target>Ej tillräckligt ledigt diskutrymme på:</target>
@@ -549,12 +626,18 @@ Kommandot triggas om:
<source>Synchronization stopped</source>
<target>Synkroniseringen stoppad</target>
+<source>Stopped</source>
+<target>Stoppad</target>
+
<source>Synchronization completed with errors</source>
<target>Synkronisering slutförd med fel</target>
<source>Synchronization completed with warnings</source>
<target>Synkronisering slutförd med varningar</target>
+<source>Warning</source>
+<target>Varning</target>
+
<source>Nothing to synchronize</source>
<target>Det finns inget att synkronisera</target>
@@ -564,9 +647,6 @@ Kommandot triggas om:
<source>Cleaning up old log files...</source>
<target>Rensar ut gamla loggfiler...</target>
-<source>Stopped</source>
-<target>Stoppad</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Du kan växla till FreeFileSyncs programfönster för att lösa problemet.</target>
@@ -604,7 +684,7 @@ Kommandot triggas om:
<target>Sök efter programuppdateringar</target>
<source>A new version of FreeFileSync is available:</source>
-<target>Det finns en ny version av FreeFileSync</target>
+<target>Det finns en ny version av FreeFileSync:</target>
<source>Download now?</source>
<target>Ladda ner nu?</target>
@@ -657,9 +737,6 @@ Kommandot triggas om:
<source>Action</source>
<target>Aktivitet</target>
-<source>Drag && drop</source>
-<target>Dra && släpp</target>
-
<source>Local comparison settings</source>
<target>Lokala jämförelseinställningar</target>
@@ -690,6 +767,9 @@ Kommandot triggas om:
<source>Local Synchronization Settings</source>
<target>Lokala synkroniseringsinställningar</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Den valda mappen %x, kan inte användas med FreeFileSync.Välj en mapp på ett lokalt filsystem, nätverk eller en MTP-enhet.</target>
+
<source>&New</source>
<target>&Nytt</target>
@@ -759,6 +839,9 @@ Kommandot triggas om:
<source>Remove folder pair</source>
<target>Ta bort katalogpar</target>
+<source>Select SFTP folder</source>
+<target>Välj SFTP-mapp</target>
+
<source>Swap sides</source>
<target>Byt sida</target>
@@ -816,8 +899,8 @@ Kommandot triggas om:
<source>Identify equal files by comparing the file content.</source>
<target>Identifiera likadana filer genom att jämföra filinnehåll.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ignorera tidsförskjutning (i timmar)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ignorera tidsförskjutning (i timmar)</target>
<source>Consider file times with specified offset as equal</source>
<target>Betrakta filtider med specificerad förskjutning som lika</target>
@@ -825,14 +908,14 @@ Kommandot triggas om:
<source>Handle daylight saving time</source>
<target>Hantera sommartid</target>
-<source>Include symbolic links:</source>
-<target>Inkludera symboliska länkar:</target>
+<source>Include &symbolic links:</source>
+<target>Inkludera &symboliska länkar:</target>
-<source>Direct</source>
-<target>Direkt</target>
+<source>&Follow</source>
+<target>&Följ</target>
-<source>Follow</source>
-<target>Följ</target>
+<source>&Direct</source>
+<target>&Direkt</target>
<source>More information</source>
<target>Mer information</target>
@@ -862,7 +945,7 @@ Kommandot triggas om:
<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>
+<target>Skapa filtreringsregler för att undanta vissa filer från synkronisering. Sökvägar relateras till motsvarande katalogpar.</target>
<source>C&lear</source>
<target>&Rensa</target>
@@ -871,14 +954,14 @@ Kommandot triggas om:
<target>Hitta flyttade filer</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Detektion aktiv efter inledande synkronisering
-- Kräver och skapar databasfiler
- Stöds inte av alla filsystem
+- Kräver och skapar databasfiler
+- Identifiering ej tillgänglig för första synkronisering
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -906,7 +989,7 @@ Kommandot triggas om:
<target>Flytta filer till en fördefinierad mapp</target>
<source>Naming convention:</source>
-<target>Regler för namngivning</target>
+<target>Regler för namngivning:</target>
<source>Handle errors:</source>
<target>Felhantering:</target>
@@ -926,6 +1009,27 @@ Kommandot triggas om:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Ange dina SFTP-inloggningsuppgifter:</target>
+
+<source>Server name or IP address:</source>
+<target>Servernamn eller IP-adress:</target>
+
+<source>Examples:</source>
+<target>Exempel:</target>
+
+<source>User name:</source>
+<target>Användarnamn:</target>
+
+<source>Password:</source>
+<target>Lösenord:</target>
+
+<source>&Show password</source>
+<target>&Visa lösenordet</target>
+
+<source>Directory on server:</source>
+<target>Målmapp på servern:</target>
+
<source>Start synchronization now?</source>
<target>Vill du starta synkroniseringen nu?</target>
@@ -935,6 +1039,9 @@ Kommandot triggas om:
<source>&Don't show this dialog again</source>
<target>&Visa inte den här dialogen igen</target>
+<source>Arrange folder pair</source>
+<target>Arrangera katalogpar</target>
+
<source>Items found:</source>
<target>Funna poster:</target>
@@ -987,7 +1094,7 @@ Kommandot triggas om:
<target>Hur schemalägger jag en batch-fil?</target>
<source>The following settings are used for all synchronization jobs.</source>
-<target>Följande inställningar används för all synkronisering</target>
+<target>Följande inställningar används för all synkronisering.</target>
<source>Fail-safe file copy</source>
<target>Felsäker filkopiering</target>
@@ -1008,7 +1115,7 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<target>Kopiera låsta filer</target>
<source>Copy shared or locked files using the Volume Shadow Copy Service.</source>
-<target>Kopierar delade eller låsta filer med hjälp av tjänsten 'Volume Shadow Copy'</target>
+<target>Kopierar delade eller låsta filer med hjälp av tjänsten 'Volume Shadow Copy'.</target>
<source>(requires administrator rights)</source>
<target>(kräver administratörsbehörighet)</target>
@@ -1017,7 +1124,7 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<target>Kopiera filåtkomstbehörigheter</target>
<source>Transfer file and folder permissions.</source>
-<target>Överför behörighetsinställningar</target>
+<target>Överför behörighetsinställningar.</target>
<source>Automatic retry on error:</source>
<target>Automatiska återförsök vid fel:</target>
@@ -1026,7 +1133,7 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<target>Antal försök:</target>
<source>Delay (in seconds):</source>
-<target>Fördröjning (i sekunder)</target>
+<target>Fördröjning (i sekunder):</target>
<source>Customize context menu:</source>
<target>Anpassad kontextmeny:</target>
@@ -1067,6 +1174,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Many thanks for localization:</source>
<target>Tack för översättning:</target>
+<source>SSH File Transfer Protocol</source>
+<target>SSH filöverföringsprotokoll</target>
+
<source>Save as Batch Job</source>
<target>Spara som batch-fil</target>
@@ -1079,8 +1189,11 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Select Time Span</source>
<target>Välj tidsrymd</target>
-<source>&Preferences...</source>
-<target>&Inställningar...</target>
+<source>&Preferences</source>
+<target>&Inställningar</target>
+
+<source>Main Bar</source>
+<target>Primärt verktygsfält</target>
<source>Folder Pairs</source>
<target>Katalogpar</target>
@@ -1097,9 +1210,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Overview</source>
<target>Översikt</target>
-<source>Main Bar</source>
-<target>Primärt verktygsfält</target>
-
<source>Confirm</source>
<target>Bekräfta</target>
@@ -1170,7 +1280,7 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<target>Exkludera alla</target>
<source>Show icons:</source>
-<target>Visa ikoner</target>
+<target>Visa ikoner:</target>
<source>Small</source>
<target>Liten</target>
@@ -1208,8 +1318,8 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Do&n't save</source>
<target>Spara &inte</target>
-<source>Delete selected configurations</source>
-<target>Ta bort markerade konfigurationer</target>
+<source>Remove entry from list</source>
+<target>Ta bort post från listan</target>
<source>Synchronization Settings</source>
<target>Synkroniseringsinställningar</target>
@@ -1262,8 +1372,8 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Show filtered or temporarily excluded files</source>
<target>Dölj filtrerade eller temporärt undantagna filer</target>
-<source>Set as default</source>
-<target>Ange som standard</target>
+<source>Save as default</source>
+<target>Spara som standard</target>
<source>Filter</source>
<target>Filter</target>
@@ -1274,6 +1384,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Cannot find %x</source>
<target>Kan inte hitta %x</target>
+<source>Move up</source>
+<target>Flytta upp</target>
+
+<source>Move down</source>
+<target>Flytta ner</target>
+
<source>Comma-separated values</source>
<target>Kommaseparerade värden</target>
@@ -1286,18 +1402,15 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Close progress dialog</source>
<target>Stäng förloppsindikator</target>
-<source>Standby</source>
-<target>Strömsparläge</target>
-
<source>Log off</source>
<target>Logga ut</target>
+<source>Standby</source>
+<target>Strömsparläge</target>
+
<source>Shut down</source>
<target>Stäng av datorn</target>
-<source>Hibernate</source>
-<target>Viloläge</target>
-
<source>Scanning...</source>
<target>Skannar...</target>
@@ -1307,9 +1420,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Info</source>
<target>Info</target>
-<source>Warning</source>
-<target>Varning</target>
-
<source>Select all</source>
<target>Markera alla</target>
@@ -1355,8 +1465,8 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Preferences</source>
<target>Inställningar</target>
-<source>Copy NTFS permissions</source>
-<target>Kopiera NTFS-behörigheter</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Kopiera DACL, SACL, Ägare, Grupp</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrera externa program i högerklicksmeny. Följande variabler finns tillgängliga:</target>
@@ -1383,7 +1493,7 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<target>Identifierar och sprider förändringar på båda sidor. Borttagningar, förflyttningar och konflikter detekteras automatiskt med hjälp av en databas.</target>
<source>Create a mirror backup of the left folder by adapting the right folder to match.</source>
-<target>Skapar en speglad säkerhetskopia av vänstra mappen genom att anpassa den högra</target>
+<target>Skapar en speglad säkerhetskopia av vänstra mappen genom att anpassa den högra.</target>
<source>Copy new and updated files to the right folder.</source>
<target>Kopierar nya och uppdaterade filer till höger mapp.</target>
@@ -1451,27 +1561,21 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Percentage</source>
<target>Procent</target>
+<source>Unable to register to receive system messages.</source>
+<target>Det gick inte att registrera mottagning av systemmeddelanden.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Kunde inte registrera enhetsavisering för %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Mappen %x kan inte övervakas.</target>
-<source>Cannot delete file %x.</source>
-<target>Filen %x kan inte tas bort.</target>
-
<source>The file is locked by another process:</source>
<target>Filen är låst av en annan process:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Kan inte flytta filen %x till %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Kan inte ta bort mappen %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Kan inte skriva filattribut för %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Kan inte ändra tidsangivelsen för %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Kan inte läsa säkerhetskontext för %x.</target>
@@ -1481,17 +1585,14 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Cannot read permissions of %x.</source>
<target>Kan inte läsa behörigheter för %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Kan inte skriva behörigheter för %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Kan inte skapa mappen %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Kan inte kopiera den symboliska länken %x till %y</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Kan inte kopiera rättigheter från %x till %y.</target>
<source>Cannot find system function %x.</source>
-<target>Kan inte hitta systemfunktion %x</target>
+<target>Kan inte hitta systemfunktion %x.</target>
+
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Kan inte kopiera attribut från %x till %y.</target>
<source>Cannot copy file %x to %y.</source>
<target>Kan inte kopiera %x till %y.</target>
@@ -1499,15 +1600,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Type of item %x is not supported:</source>
<target>Objekttyp %x stöds ej:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Den symboliska länken %x kan inte matchas.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Kan inte öppna %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Kan inte räkna upp %x.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1541,41 +1633,29 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<pluralform>%x dagar</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Det gick inte att registrera mottagning av systemmeddelanden</target>
-
<source>Cannot set privilege %x.</source>
<target>Kan inte att ange behörigheten %x.</target>
<source>Unable to suspend system sleep mode.</source>
-<target>Det går inte att avbryta systemets viloläge</target>
+<target>Det går inte att avbryta systemets viloläge.</target>
<source>Cannot change process I/O priorities.</source>
<target>Kan inte ändra I/O-prioritet.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Kan inte att flytta %x till papperskorgen</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Kontroll av papperskorgen misslyckades för %x.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Kan inte utläsa slutlig sökväg för %x.</target>
-
-<source>Error Code %x:</source>
-<target>Felkod %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Kan inte läsa följande XML-element:</target>
+<source>The following XML elements could not be read:</source>
+<target>Följande XML-element kunde inte läsas:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Konfigurationsfilen %x lästes bara delvis in.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target>Konfigurationsfilen %x är inte komplett. De saknade elementen kommer att anges till standardvärdet.</target>
<source>Prepare installation</source>
<target>Förbered installation</target>
<source>Choose which components you want to install.</source>
-<target>Välj vilka komponenter du vill installera</target>
+<target>Välj vilka komponenter du vill installera.</target>
<source>Select installation type:</source>
<target>Välj installationstyp:</target>
diff --git a/FreeFileSync/Build/Languages/turkish.lng b/FreeFileSync/Build/Languages/turkish.lng
index de4300ac..1ecec53a 100644
--- a/FreeFileSync/Build/Languages/turkish.lng
+++ b/FreeFileSync/Build/Languages/turkish.lng
@@ -55,8 +55,8 @@
<source>Syntax error</source>
<target>Yazım hatası</target>
-<source>Cannot open file %x.</source>
-<target>%x dosyası açılamıyor.</target>
+<source>Cannot find file %x.</source>
+<target></target>
<source>File %x does not contain a valid configuration.</source>
<target>%x dosyası geçerli ayar bilgilerini içermiyor.</target>
@@ -94,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Bir ayar dosyasındaki en fazla alternatif klasör çifti sayısı.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Ayarları çalıştırmadan düzenlemek için açın.</target>
+<source>Open configuration for editing without executing it.</source>
+<target></target>
<source>Cannot find the following folders:</source>
<target>Aşağıdaki klasörler bulunamadı:</target>
@@ -202,6 +202,82 @@
<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>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target></target>
+
+<source>Cannot write permissions of %x.</source>
+<target>%x izinleri yazılamadı.</target>
+
+<source>Operation not supported for different base folder types.</source>
+<target></target>
+
+<source>Cannot write file %x.</source>
+<target>%x dosyası yazılamadı.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>%x sembolik bağlantısı %y olarak kopyalanamıyor.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>%x dosyası %y üzerine taşınamadı.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>%x klasörü sayılamadı.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>%x dosyasının özellikleri okunamadı.</target>
+
+<source>Cannot find %x.</source>
+<target></target>
+
+<source>Cannot open file %x.</source>
+<target>%x dosyası açılamıyor.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>%x klasörü silinemedi.</target>
+
+<source>Cannot delete file %x.</source>
+<target>%x dosyası silinemiyor.</target>
+
+<source>Cannot find device %x.</source>
+<target></target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target></target>
+
+<source>Cannot create directory %x.</source>
+<target>%x klasörü eklenemedi.</target>
+
+<source>Cannot write modification time of %x.</source>
+<target>%x son değişiklik zamanı yazılamadı.</target>
+
+<source>Cannot determine final path for %x.</source>
+<target>Son %x yolu belirlenemedi.</target>
+
+<source>Cannot resolve symbolic link %x.</source>
+<target>%x simge bağlantısı çözümlenemedi</target>
+
+<source>Unable to move %x to the recycle bin.</source>
+<target>%x Geri Dönüşüm Kutusuna atılamıyor.</target>
+
+<source>Cannot open directory %x.</source>
+<target>%x klasörü açılamadı.</target>
+
+<source>Incorrect command line:</source>
+<target>Geçersiz komut satırı:</target>
+
+<source>Error Code %x:</source>
+<target>Hata Kodu %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target></target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -235,20 +311,14 @@
<source>Database file is corrupt:</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>Database files do not share a common session.</source>
<target>Veritabanı dosyaları ortak bir oturumu paylaşamaz.</target>
<source>Searching for folder %x...</source>
<target>%x klasörü aranıyor...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>%x dosyasının özellikleri okunamadı.</target>
+<source>Time out while searching for folder %x.</source>
+<target></target>
<source>Cannot get process information.</source>
<target>İşlem bilgisi alınamadı.</target>
@@ -337,6 +407,15 @@
<source>Unable to create time stamp for versioning:</source>
<target>Sürüm izlemesi için zaman damgası oluşturulamadı:</target>
+<source>Drag && drop</source>
+<target>Dosyaları sürükleyip buraya bırakabilirsiniz</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>
+
<source>&Open...</source>
<target>&Açın...</target>
@@ -385,9 +464,6 @@
<source>Browse</source>
<target>Gözatın</target>
-<source>Select a folder</source>
-<target>Bir klasör seçin</target>
-
<source>Idle time (in seconds):</source>
<target>Boşta bekleme süresi (saniye):</target>
@@ -441,9 +517,6 @@ Komut şu durumlarda yürütülür:
<source>&Quit</source>
<target>Çı&kın</target>
-<source>Incorrect command line:</source>
-<target>Geçersiz komut satırı:</target>
-
<source>&Retry</source>
<target>&Yeniden deneyin</target>
@@ -498,18 +571,18 @@ Komut şu durumlarda yürütülür:
<source>Updating attributes of %x</source>
<target>%x öznitelikleri güncelleniyor</target>
+<source>%x and %y have different content.</source>
+<target></target>
+
+<source>Data verification error:</source>
+<target></target>
+
<source>Creating a Volume Shadow Copy for %x...</source>
<target>%x için Birim Gölge Hizmeti oluşturuluyor...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Veri doğrulama hatası: %x ve %y farklı içeriklere sahip.</target>
-
<source>Target folder %x already existing.</source>
<target>%x hedef klasörü zaten var.</target>
-<source>Cannot find folder %x.</source>
-<target>%x klasörü bulunamadı.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Hedef klasör giriş alanı boş olmamalı.</target>
@@ -522,8 +595,8 @@ Komut şu durumlarda yürütülür:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Uyuşmazlığı çözülmemiş şu ögeler eşleştirilmeyecek:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Şu klasörler arasında oldukça büyük farklar var. Eşleştirme için doğru klasörleri seçtiğinize emin olun.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target></target>
<source>Not enough free disk space available in:</source>
<target>Şurada yeterli disk alanı yok :</target>
@@ -549,12 +622,18 @@ Komut şu durumlarda yürütülür:
<source>Synchronization stopped</source>
<target>Eşleştirme durduruldu</target>
+<source>Stopped</source>
+<target>Durduruldu</target>
+
<source>Synchronization completed with errors</source>
<target>Eşleştirme bazı hatalarla tamamlandı</target>
<source>Synchronization completed with warnings</source>
<target>Eşleştirme işlemi bazı uyarılarla tamamlandı</target>
+<source>Warning</source>
+<target>Uyarı</target>
+
<source>Nothing to synchronize</source>
<target>Eşleştirilecek bir şey yok</target>
@@ -564,9 +643,6 @@ Komut şu durumlarda yürütülür:
<source>Cleaning up old log files...</source>
<target>Eski günlük dosyaları temizleniyor...</target>
-<source>Stopped</source>
-<target>Durduruldu</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Bu sorunu çözmek için FreeFileSync ana penceresine geçebilirsiniz.</target>
@@ -657,9 +733,6 @@ Komut şu durumlarda yürütülür:
<source>Action</source>
<target>İşlem</target>
-<source>Drag && drop</source>
-<target>Dosyaları sürükleyip buraya bırakabilirsiniz</target>
-
<source>Local comparison settings</source>
<target>Yerel karşılaştırma ayarları</target>
@@ -690,6 +763,9 @@ Komut şu durumlarda yürütülür:
<source>Local Synchronization Settings</source>
<target>Yerel Eşleştirme Ayarları</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target></target>
+
<source>&New</source>
<target>Ye&ni</target>
@@ -759,6 +835,9 @@ Komut şu durumlarda yürütülür:
<source>Remove folder pair</source>
<target>Klasör çiftini silin</target>
+<source>Select SFTP folder</source>
+<target></target>
+
<source>Swap sides</source>
<target>Sağ ve sol tarafları değiştirin</target>
@@ -816,8 +895,8 @@ Komut şu durumlarda yürütülür:
<source>Identify equal files by comparing the file content.</source>
<target>Dosyaların aynı olup olmadığı, içeriklerine göre belirlensin.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Yoksayılacak zaman kayması (saat olarak)</target>
+<source>&Ignore time shift (in hours)</source>
+<target></target>
<source>Consider file times with specified offset as equal</source>
<target>Belirtilen saat kadar zaman farkı yoksayılır</target>
@@ -825,14 +904,14 @@ Komut şu durumlarda yürütülür:
<source>Handle daylight saving time</source>
<target>Yaz saati uygulamasına bakın</target>
-<source>Include symbolic links:</source>
-<target>Katılacak sembolik bağlantılar:</target>
+<source>Include &symbolic links:</source>
+<target></target>
-<source>Direct</source>
-<target>Doğrudan</target>
+<source>&Follow</source>
+<target></target>
-<source>Follow</source>
-<target>Hedefler</target>
+<source>&Direct</source>
+<target></target>
<source>More information</source>
<target>Ek bilgilere bakın</target>
@@ -871,15 +950,11 @@ Komut şu durumlarda yürütülür:
<target>Taşınmış dosyalar algılansın</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
-<target>
-- İlk eşleştirmeden sonra algılama etkinleştirilir
-- Veritabanı dosyalarının kullanılması gerekir
-- Tüm dosya sistemleri tarafından desteklenmez
-</target>
+<target></target>
<source>Detect synchronization directions with the help of database files</source>
<target>Eşleştirme yönü, veritabanı dosyaları yardımı ile belirlensin</target>
@@ -926,6 +1001,29 @@ Komut şu durumlarda yürütülür:
<source>OK</source>
<target>Tamam</target>
+<source>Enter your SFTP login details:</source>
+<target></target>
+
+<source>Server name or IP address:</source>
+<target></target>
+
+<source>Examples:</source>
+<target></target>
+
+<source>User name:</source>
+<target></target>
+
+<source>Password:</source>
+<target></target>
+
+<source>&Show password</source>
+<target></target>
+
+<source>Directory on server:</source>
+<target></target>
+
+
+
<source>Start synchronization now?</source>
<target>Eşleştirme başlatılsın mı?</target>
@@ -935,6 +1033,9 @@ Komut şu durumlarda yürütülür:
<source>&Don't show this dialog again</source>
<target>Bu pencere bir daha &görüntülenmesin</target>
+<source>Arrange folder pair</source>
+<target></target>
+
<source>Items found:</source>
<target>Bulunan öge:</target>
@@ -1067,6 +1168,9 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Many thanks for localization:</source>
<target>Çeviriler için çok teşekkürler:</target>
+<source>SSH File Transfer Protocol</source>
+<target></target>
+
<source>Save as Batch Job</source>
<target>Toplu İş Olarak Kaydedin</target>
@@ -1079,8 +1183,11 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Select Time Span</source>
<target>Zaman Aralığı</target>
-<source>&Preferences...</source>
-<target>&Tercihler...</target>
+<source>&Preferences</source>
+<target></target>
+
+<source>Main Bar</source>
+<target>Ana Çubuk</target>
<source>Folder Pairs</source>
<target>Klasör Çiftleri</target>
@@ -1097,9 +1204,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Overview</source>
<target>Genel</target>
-<source>Main Bar</source>
-<target>Ana Çubuk</target>
-
<source>Confirm</source>
<target>Onaylayın</target>
@@ -1208,8 +1312,8 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Do&n't save</source>
<target>Kaydedilmesi&n</target>
-<source>Delete selected configurations</source>
-<target>Seçili ayarları silin</target>
+<source>Remove entry from list</source>
+<target></target>
<source>Synchronization Settings</source>
<target>Eşleştirme Ayarları</target>
@@ -1262,8 +1366,8 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Show filtered or temporarily excluded files</source>
<target>Süzülmüş ya da geçici olarak katılmayan dosyalar görüntülensin</target>
-<source>Set as default</source>
-<target>Varsayılan olarak belirleyin</target>
+<source>Save as default</source>
+<target></target>
<source>Filter</source>
<target>Süzgeç</target>
@@ -1274,6 +1378,12 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Cannot find %x</source>
<target>%x bulunamadı</target>
+<source>Move up</source>
+<target></target>
+
+<source>Move down</source>
+<target></target>
+
<source>Comma-separated values</source>
<target>Virgül ile ayrılmış değerler</target>
@@ -1286,18 +1396,15 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Close progress dialog</source>
<target>İşlem penceresi kapatılsın</target>
-<source>Standby</source>
-<target>Uykuya dalınsın</target>
-
<source>Log off</source>
<target>Oturum kapatılsın</target>
+<source>Standby</source>
+<target>Uykuya dalınsın</target>
+
<source>Shut down</source>
<target>Bilgisayar kapatılsın</target>
-<source>Hibernate</source>
-<target>Hazırda bekletilsin</target>
-
<source>Scanning...</source>
<target>Taranıyor...</target>
@@ -1307,9 +1414,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Info</source>
<target>Bilgi</target>
-<source>Warning</source>
-<target>Uyarı</target>
-
<source>Select all</source>
<target>Tümünü seçin</target>
@@ -1355,8 +1459,8 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Preferences</source>
<target>Tercihler</target>
-<source>Copy NTFS permissions</source>
-<target>NTFS izinleri de kopyalansın</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target></target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Sağ tık menüsüne dış uygulamalar eklenebilir. Şu etiketler kullanılabilir:</target>
@@ -1451,27 +1555,21 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Percentage</source>
<target>Yüzde</target>
+<source>Unable to register to receive system messages.</source>
+<target>Sistem iletilerini alabilmek için gerekli kayıt eklenemedi.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target></target>
+
<source>Cannot monitor directory %x.</source>
<target>%x klasörü izlenemiyor.</target>
-<source>Cannot delete file %x.</source>
-<target>%x dosyası silinemiyor.</target>
-
<source>The file is locked by another process:</source>
<target>Dosya başka bir işlem tarafından kilitlenmiş:</target>
-<source>Cannot move file %x to %y.</source>
-<target>%x dosyası %y üzerine taşınamadı.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>%x klasörü silinemedi.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>%x dosya öznitelikleri yazılamadı.</target>
-<source>Cannot write modification time of %x.</source>
-<target>%x son değişiklik zamanı yazılamadı.</target>
-
<source>Cannot read security context of %x.</source>
<target>%x için güvenlik bağlamı okunamadı.</target>
@@ -1481,33 +1579,21 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Cannot read permissions of %x.</source>
<target>%x izinleri okunamadı.</target>
-<source>Cannot write permissions of %x.</source>
-<target>%x izinleri yazılamadı.</target>
-
-<source>Cannot create directory %x.</source>
-<target>%x klasörü eklenemedi.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>%x sembolik bağlantısı %y olarak kopyalanamıyor.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target></target>
<source>Cannot find system function %x.</source>
<target>%x sistem işlevi bulunamadı.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target></target>
+
<source>Cannot copy file %x to %y.</source>
<target>%x dosyası %y olarak kopyalanamadı.</target>
<source>Type of item %x is not supported:</source>
<target>%x ögesi tipi desteklenmiyor:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>%x simge bağlantısı çözümlenemedi</target>
-
-<source>Cannot open directory %x.</source>
-<target>%x klasörü açılamadı.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>%x klasörü sayılamadı.</target>
-
<source>%x TB</source>
<target>%x TB</target>
@@ -1541,9 +1627,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<pluralform>%x gün</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Sistem iletilerini alabilmek için gerekli kayıt eklenemedi.</target>
-
<source>Cannot set privilege %x.</source>
<target>%x izni verilemedi.</target>
@@ -1553,23 +1636,14 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Cannot change process I/O priorities.</source>
<target>Giriş/Çıkış işlemi öncelikleri değiştirilemedi</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>%x Geri Dönüşüm Kutusuna atılamıyor.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>%x klasörü için geri dönüşüm kutusu denetlenemedi.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Son %x yolu belirlenemedi.</target>
-
-<source>Error Code %x:</source>
-<target>Hata Kodu %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Şu XML elemanları okunamadı:</target>
+<source>The following XML elements could not be read:</source>
+<target></target>
-<source>Configuration file %x loaded partially only.</source>
-<target>%x ayarlar dosyası kısmen yüklendi.</target>
+<source>Configuration file %x is incomplete. The missing elements will be set to their default values.</source>
+<target></target>
<source>Prepare installation</source>
<target>Yüklemeye hazırlanılıyor</target>
diff --git a/FreeFileSync/Build/Languages/ukrainian.lng b/FreeFileSync/Build/Languages/ukrainian.lng
index 5a89d999..d26a3c98 100644
--- a/FreeFileSync/Build/Languages/ukrainian.lng
+++ b/FreeFileSync/Build/Languages/ukrainian.lng
@@ -7,12 +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>Cannot copy attributes from %x to %y.</source>
-<target></target>
-
-<source>Cannot copy permissions from %x to %y.</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
<target>З моменту останньої синхронізації з обох сторін відбулися зміни.</target>
@@ -61,14 +55,14 @@
<source>Syntax error</source>
<target>Синтаксична помилка</target>
-<source>Cannot open file %x.</source>
-<target>Не вдається відкрити файл %x.</target>
+<source>Cannot find file %x.</source>
+<target>Неможливо знайти файл %x.</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>
+<target>Вказано різну кількість лівих і правих папок.</target>
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
<target>Конфігураційний файл не повинен містити налаштувань на рівні пар папок, якщо папки задаються командним рядком.</target>
@@ -100,8 +94,8 @@
<source>Any number of alternative directory pairs for at most one config file.</source>
<target>Будь-яка кількість альтернативних пар папок для не більше одного конфігураційного файлу.</target>
-<source>Open configuration for edit without executing.</source>
-<target>Відкрити конфігурацію для редагування без виконання.</target>
+<source>Open configuration for editing without executing it.</source>
+<target>Відкрити конфігурацію для редагування без її запуску.</target>
<source>Cannot find the following folders:</source>
<target>Не вдається знайти такі папки:</target>
@@ -208,6 +202,86 @@
<source>Update attributes on right</source>
<target>Оновити атрибути праворуч</target>
+<source>Cannot read file %x.</source>
+<target>Не вдається прочитати файл %x.</target>
+
+<source>
+Unexpected size of data stream.
+Expected: %x bytes
+Actual: %y bytes
+</source>
+<target>
+Неочікуваний розмір потоку даних.
+Очікуваний: %x байт
+Дійсний: %y байт
+</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 write file %x.</source>
+<target>Не вдається записати файл %x.</target>
+
+<source>Cannot copy symbolic link %x to %y.</source>
+<target>Не вдається скопіювати символьне посилання %x до %y.</target>
+
+<source>Cannot move file %x to %y.</source>
+<target>Не вдається перемістити файл %x до %y.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Не вдається прочитати вміст папки %x.</target>
+
+<source>Cannot read file attributes of %x.</source>
+<target>Не вдається прочитати атрибути файлу %x.</target>
+
+<source>Cannot find %x.</source>
+<target>Не вдається знайти %x.</target>
+
+<source>Cannot open file %x.</source>
+<target>Не вдається відкрити файл %x.</target>
+
+<source>Cannot find device %x.</source>
+<target>Не вдається знайти пристрій %x.</target>
+
+<source>Cannot determine free disk space for %x.</source>
+<target>Не вдається визначити об'єм вільного місця для %x.</target>
+
+<source>Cannot create directory %x.</source>
+<target>Не вдається створити папку %x.</target>
+
+<source>Cannot delete directory %x.</source>
+<target>Не вдається видалити папку %x.</target>
+
+<source>Cannot delete file %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 open directory %x.</source>
+<target>Не вдається відкрити папку %x.</target>
+
+<source>Incorrect command line:</source>
+<target>Неправильний командний рядок:</target>
+
+<source>Error Code %x:</source>
+<target>Код помилки %x:</target>
+
+<source>Failed to connect to SFTP server %x.</source>
+<target>Не вдається з'єднатися з SFTP сервером %x.</target>
+
<source>
<pluralform>1 byte</pluralform>
<pluralform>%x bytes</pluralform>
@@ -242,23 +316,17 @@
<source>Database file is corrupt:</source>
<target>Файл бази даних пошкоджений:</target>
-<source>Cannot write file %x.</source>
-<target>Не вдається записати файл %x.</target>
-
-<source>Cannot read file %x.</source>
-<target>Не вдається прочитати файл %x.</target>
-
<source>Database files do not share a common session.</source>
<target>Файли баз даних не мають спільної сесії.</target>
<source>Searching for folder %x...</source>
<target>Пошук папки %x...</target>
-<source>Cannot read file attributes of %x.</source>
-<target>Не вдається прочитати атрибути файлу %x.</target>
+<source>Time out while searching for folder %x.</source>
+<target>Вичерпався час пошуку папки %x.</target>
<source>Cannot get process information.</source>
-<target>Не вдається отримати інформацію процесу</target>
+<target>Не вдається отримати інформацію про процес.</target>
<source>Waiting while directory is locked:</source>
<target>Очікування поки папка заблокована:</target>
@@ -346,6 +414,15 @@
<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>
+
<source>&Open...</source>
<target>&Відкрити...</target>
@@ -371,10 +448,10 @@
<target>Використання:</target>
<source>1. Select folders to watch.</source>
-<target>1. Виберіть папки для моніторингу;</target>
+<target>1. Виберіть папки для моніторингу.</target>
<source>2. Enter a command line.</source>
-<target>2. Уведіть рядок команди;</target>
+<target>2. Введіть рядок команди.</target>
<source>3. Press 'Start'.</source>
<target>3. Натисніть 'Старт'.</target>
@@ -383,7 +460,7 @@
<target>Щоб розпочати імпортуйте .ffs_batch файл.</target>
<source>Folders to watch:</source>
-<target>Папки для спостереження</target>
+<target>Папки для спостереження:</target>
<source>Add folder</source>
<target>Додати папку</target>
@@ -394,9 +471,6 @@
<source>Browse</source>
<target>Переглянути</target>
-<source>Select a folder</source>
-<target>Вибрати папку</target>
-
<source>Idle time (in seconds):</source>
<target>Час очікування (секунд):</target>
@@ -450,9 +524,6 @@ The command is triggered if:
<source>&Quit</source>
<target>В&ихід</target>
-<source>Incorrect command line:</source>
-<target>Неправильний командний рядок:</target>
-
<source>&Retry</source>
<target>&Повторити</target>
@@ -507,18 +578,18 @@ The command is triggered if:
<source>Updating 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>Creating a Volume Shadow Copy for %x...</source>
<target>Створення Тіньової Копії для %x...</target>
-<source>Data verification error: %x and %y have different content.</source>
-<target>Помилка перевірки даних: %x та %y мають різний вміст.</target>
-
<source>Target folder %x already existing.</source>
<target>Цільова папка %x вже існує.</target>
-<source>Cannot find folder %x.</source>
-<target>Неможливо знайти папку %x.</target>
-
<source>Target folder input field must not be empty.</source>
<target>Поле цільової папки не повинно бути порожнім.</target>
@@ -531,8 +602,8 @@ The command is triggered if:
<source>The following items have unresolved conflicts and will not be synchronized:</source>
<target>Наступні елементи мають невирішені конфлікти і не будуть синхронізовані:</target>
-<source>The following folders are significantly different. Make sure you are matching the correct folders for synchronization.</source>
-<target>Ці папки істотно відрізняються. Переконайтеся, що ви вказали відповідні папки для синхронізації.</target>
+<source>The following folders are significantly different. Make sure you have selected the correct folders for synchronization.</source>
+<target>Наступні папки значно відрізняються. Впевніться що Ви вибрали правильні папки для синхронізації.</target>
<source>Not enough free disk space available in:</source>
<target>Не достатньо вільного місця на:</target>
@@ -558,12 +629,18 @@ The command is triggered if:
<source>Synchronization stopped</source>
<target>Синхронізацію зупинено</target>
+<source>Stopped</source>
+<target>Зупинено</target>
+
<source>Synchronization completed with errors</source>
<target>Синхронізація закінчилася з помилками</target>
<source>Synchronization completed with warnings</source>
<target>Синхронізація завершена з попередженнями</target>
+<source>Warning</source>
+<target>Увага</target>
+
<source>Nothing to synchronize</source>
<target>Нічого синхронізувати</target>
@@ -573,9 +650,6 @@ The command is triggered if:
<source>Cleaning up old log files...</source>
<target>Очистка старих журналів...</target>
-<source>Stopped</source>
-<target>Зупинено</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Ви можете перейти до головного вікна FreeFileSync щоб вирішити це питання.</target>
@@ -667,9 +741,6 @@ The command is triggered if:
<source>Action</source>
<target>Дія</target>
-<source>Drag && drop</source>
-<target>Drag && drop</target>
-
<source>Local comparison settings</source>
<target>Налаштування локального порівняння</target>
@@ -700,6 +771,9 @@ The command is triggered if:
<source>Local Synchronization Settings</source>
<target>Налаштування Локальної Синхронізації</target>
+<source>The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device.</source>
+<target>Вибрана папка %x не може бути використана з FreeFileSync. Будь ласка, виберіть папку з локальної файлової системи, мережі чи MTP пристрою.</target>
+
<source>&New</source>
<target>&Створити</target>
@@ -707,7 +781,7 @@ The command is triggered if:
<target>&Зберегти</target>
<source>Save as &batch job...</source>
-<target>Зберегти як &пакетне завдання</target>
+<target>Зберегти як &пакетне завдання...</target>
<source>Start &comparison</source>
<target>Запуск по&рівняння</target>
@@ -769,6 +843,9 @@ The command is triggered if:
<source>Remove folder pair</source>
<target>Вилучити пару папок</target>
+<source>Select SFTP folder</source>
+<target>Вибрати SFTP папку</target>
+
<source>Swap sides</source>
<target>Поміняти місцями</target>
@@ -826,8 +903,8 @@ The command is triggered if:
<source>Identify equal files by comparing the file content.</source>
<target>Визначати однакові файли порівнюючи їх вміст.</target>
-<source>Ignore time shift (in hours)</source>
-<target>Ігнорувати зсув у часі в годинах)</target>
+<source>&Ignore time shift (in hours)</source>
+<target>&Ігнорувати зсув часу (в годинах)</target>
<source>Consider file times with specified offset as equal</source>
<target>Враховувати час файлів зі вказаним зсувом рівним</target>
@@ -835,14 +912,14 @@ The command is triggered if:
<source>Handle daylight saving time</source>
<target>Перехід на літній час вручну</target>
-<source>Include symbolic links:</source>
-<target>Включити символьні посилання:</target>
+<source>Include &symbolic links:</source>
+<target>Включити &символьні посилання:</target>
-<source>Direct</source>
-<target>Прямо</target>
+<source>&Follow</source>
+<target>&Переходити</target>
-<source>Follow</source>
-<target>Послідовно</target>
+<source>&Direct</source>
+<target>&Безпосередньо</target>
<source>More information</source>
<target>Додаткова інформація</target>
@@ -851,7 +928,7 @@ The command is triggered if:
<target>Локальні налаштування:</target>
<source>Include:</source>
-<target>Включити</target>
+<target>Включити:</target>
<source>Exclude:</source>
<target>Виключити:</target>
@@ -881,14 +958,14 @@ The command is triggered if:
<target>Виявляти переміщені файли</target>
<source>
-- Detection active after initial sync
-- Requires and creates database files
- Not supported by all file systems
+- Requires and creates database files
+- Detection not available for first sync
</source>
<target>
-- Виявлення активно після початкової синхронізації
-- Потребує і створює файли бази даних
-- Підтримується не всіма файловими системами
+- Не підтримується всіма файловими системами
+- Вимагає та створює файли баз даних
+- Визначення недоступне для першої синхронізації
</target>
<source>Detect synchronization directions with the help of database files</source>
@@ -936,6 +1013,27 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
+<source>Enter your SFTP login details:</source>
+<target>Введіть дані для входу SFTP:</target>
+
+<source>Server name or IP address:</source>
+<target>Ім'я серверу чи IP адреса:</target>
+
+<source>Examples:</source>
+<target>Приклади:</target>
+
+<source>User name:</source>
+<target>Ім'я користувача:</target>
+
+<source>Password:</source>
+<target>Пароль:</target>
+
+<source>&Show password</source>
+<target>&Показати пароль</target>
+
+<source>Directory on server:</source>
+<target>Папка на сервері:</target>
+
<source>Start synchronization now?</source>
<target>Розпочати синхронізацію?</target>
@@ -945,6 +1043,9 @@ The command is triggered if:
<source>&Don't show this dialog again</source>
<target>Більше &не показувати цей діалог</target>
+<source>Arrange folder pair</source>
+<target>Упорядкувати пару папок</target>
+
<source>Items found:</source>
<target>Елементів знайдено:</target>
@@ -1077,6 +1178,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Many thanks for localization:</source>
<target>Подяка за локалізацію:</target>
+<source>SSH File Transfer Protocol</source>
+<target>Протокол передачі файлів SSH</target>
+
<source>Save as Batch Job</source>
<target>Зберегти як пакетне завдання</target>
@@ -1089,8 +1193,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Select Time Span</source>
<target>Виберіть Інтервал Часу</target>
-<source>&Preferences...</source>
-<target>&Уподобання...</target>
+<source>&Preferences</source>
+<target>&Уподобання</target>
+
+<source>Main Bar</source>
+<target>Головна панель</target>
<source>Folder Pairs</source>
<target>Пари Папок</target>
@@ -1107,9 +1214,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Overview</source>
<target>Огляд</target>
-<source>Main Bar</source>
-<target>Головна панель</target>
-
<source>Confirm</source>
<target>Підтвердити</target>
@@ -1222,8 +1326,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&Не зберігати</target>
-<source>Delete selected configurations</source>
-<target>Вилучити вибрану конфігурацію</target>
+<source>Remove entry from list</source>
+<target>Видалити запис зі списку</target>
<source>Synchronization Settings</source>
<target>Налаштування Синхронізації</target>
@@ -1276,8 +1380,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Show filtered or temporarily excluded files</source>
<target>Показати відфільтровані чи тимчасово виключені елементи</target>
-<source>Set as default</source>
-<target>Встановити за замовчуванням</target>
+<source>Save as default</source>
+<target>Зберегти як замовчування</target>
<source>Filter</source>
<target>Фільтр</target>
@@ -1288,6 +1392,12 @@ This guarantees a consistent state even in case of a serious error.
<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>
@@ -1300,12 +1410,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Close progress dialog</source>
<target>Закрити вікно прогресу</target>
-<source>Standby</source>
-<target>Сплячий режим</target>
-
<source>Log off</source>
<target>Вийти із системи</target>
+<source>Standby</source>
+<target>Сплячий режим</target>
+
<source>Shut down</source>
<target>Вимкнути комп'ютер</target>
@@ -1318,9 +1428,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Info</source>
<target>Інформація</target>
-<source>Warning</source>
-<target>Увага</target>
-
<source>Select all</source>
<target>Виділити все</target>
@@ -1368,8 +1475,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Preferences</source>
<target>Уподобання</target>
-<source>Copy NTFS permissions</source>
-<target>Копіювати права доступу NTFS</target>
+<source>Copy DACL, SACL, Owner, Group</source>
+<target>Скопіювати DACL, SACL, власника, групу</target>
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Інтеграція зовнішніх додатків до контекстного меню. Наступні макроси доступні:</target>
@@ -1464,27 +1571,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Percentage</source>
<target>Проценти</target>
+<source>Unable to register to receive system messages.</source>
+<target>Не вдається зареєструватися для отримання системних повідомлень.</target>
+
+<source>Unable to register device notifications for %x.</source>
+<target>Не вдається зареєструвати повідомлення пристрою для %x.</target>
+
<source>Cannot monitor directory %x.</source>
<target>Не вдається спостереження за папкою %x.</target>
-<source>Cannot delete file %x.</source>
-<target>Не вдається видалити файл %x.</target>
-
<source>The file is locked by another process:</source>
<target>Файл заблоковано іншим процесом:</target>
-<source>Cannot move file %x to %y.</source>
-<target>Не вдається перемістити файл %x до %y.</target>
-
-<source>Cannot delete directory %x.</source>
-<target>Не вдається видалити папку %x.</target>
-
<source>Cannot write file attributes of %x.</source>
<target>Не вдається записати атрибути файлу %x.</target>
-<source>Cannot write modification time of %x.</source>
-<target>Не вдається записати час модифікації %x.</target>
-
<source>Cannot read security context of %x.</source>
<target>Не вдається прочитати контекст безпеки %x.</target>
@@ -1494,33 +1595,21 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot read permissions of %x.</source>
<target>Не вдається прочитати права доступу до %x.</target>
-<source>Cannot write permissions of %x.</source>
-<target>Не вдається записати права доступу до %x.</target>
-
-<source>Cannot create directory %x.</source>
-<target>Не вдається створити папку %x.</target>
-
-<source>Cannot copy symbolic link %x to %y.</source>
-<target>Не вдається скопіювати символьне посилання %x до %y.</target>
+<source>Cannot copy permissions from %x to %y.</source>
+<target>Не вдається скопіювати права доступу з %x до %y.</target>
<source>Cannot find system function %x.</source>
<target>Не вдається знайти системну функцію %x.</target>
+<source>Cannot copy attributes from %x to %y.</source>
+<target>Не вдається скопіювати атрибути з %x до %y.</target>
+
<source>Cannot copy file %x to %y.</source>
<target>Не вдається скопіювати файл %x до %y.</target>
<source>Type of item %x is not supported:</source>
<target>Тип елемента %x не підтримується:</target>
-<source>Cannot resolve symbolic link %x.</source>
-<target>Не вдається вирішити символьне посилання %x.</target>
-
-<source>Cannot open directory %x.</source>
-<target>Не вдається відкрити папку %x.</target>
-
-<source>Cannot enumerate directory %x.</source>
-<target>Не вдається прочитати вміст папки %x.</target>
-
<source>%x TB</source>
<target>%x ТБ</target>
@@ -1557,9 +1646,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x днів</pluralform>
</target>
-<source>Unable to register to receive system messages.</source>
-<target>Не вдається зареєструватися для отримання системних повідомлень.</target>
-
<source>Cannot set privilege %x.</source>
<target>Не вдається встановити привілеї %x.</target>
@@ -1569,23 +1655,14 @@ This guarantees a consistent state even in case of a serious error.
<source>Cannot change process I/O priorities.</source>
<target>Не вдалося змінити пріоритетів Вх/Вих процесу.</target>
-<source>Unable to move %x to the recycle bin.</source>
-<target>Не вдається перемістити %x до Корзини.</target>
-
<source>Checking recycle bin failed for folder %x.</source>
<target>Перевірка Корзини для папки %x не вдалася.</target>
-<source>Cannot determine final path for %x.</source>
-<target>Не вдається визначити кінцевого шляху для %x.</target>
-
-<source>Error Code %x:</source>
-<target>Код помилки %x:</target>
-
-<source>Cannot read the following XML elements:</source>
-<target>Не вдається прочитати такі елементи XML:</target>
+<source>The following XML elements could not be read:</source>
+<target>Наступні XML елементи не вдалося прочитати:</target>
-<source>Configuration file %x loaded partially only.</source>
-<target>Файл конфігурації %x завантажено лише частково.</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>
diff --git a/FreeFileSync/Build/Resources.zip b/FreeFileSync/Build/Resources.zip
index 8fe13125..c660cc0e 100644
--- a/FreeFileSync/Build/Resources.zip
+++ b/FreeFileSync/Build/Resources.zip
Binary files differ
diff --git a/FreeFileSync/Source/LICENSE b/FreeFileSync/Source/LICENSE
index 94a04532..88b549b5 100644
--- a/FreeFileSync/Source/LICENSE
+++ b/FreeFileSync/Source/LICENSE
@@ -1,4 +1,7 @@
- GNU GENERAL PUBLIC LICENSE
+A. GNU GENERAL PUBLIC LICENSE
+B. libssh2 License
+
+A. GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
@@ -618,4 +621,48 @@ an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
+
+B. 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/FreeFileSync/Source/Makefile b/FreeFileSync/Source/Makefile
index a50270eb..81dd2aaf 100644
--- a/FreeFileSync/Source/Makefile
+++ b/FreeFileSync/Source/Makefile
@@ -8,7 +8,7 @@ DOCSHAREDIR = $(SHAREDIR)/doc/$(APPNAME)
CXXFLAGS = -std=c++11 -pipe -DWXINTL_NO_GETTEXT_MACRO -I../.. -I../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" -Wall \
-O3 -DNDEBUG `wx-config --cxxflags --debug=no` -DZEN_LINUX -pthread
-LINKFLAGS = -s `wx-config --libs std, aui --debug=no` -lboost_thread -lboost_system -lz -pthread
+LINKFLAGS = -s `wx-config --libs std, aui --debug=no` -lboost_thread -lboost_chrono -lboost_system -lz -pthread
#Gtk - support recycler/icon loading/no button border/grid scrolling
CXXFLAGS += `pkg-config --cflags gtk+-2.0`
diff --git a/FreeFileSync/Source/RealtimeSync/Makefile b/FreeFileSync/Source/RealtimeSync/Makefile
index a69c668b..a83e711d 100644
--- a/FreeFileSync/Source/RealtimeSync/Makefile
+++ b/FreeFileSync/Source/RealtimeSync/Makefile
@@ -5,7 +5,7 @@ BINDIR = $(DESTDIR)$(prefix)/bin
CXXFLAGS = -std=c++11 -pipe -DWXINTL_NO_GETTEXT_MACRO -I../../.. -I../../../zenXml -include "zen/i18n.h" -include "zen/warn_static.h" -Wall \
-O3 -DNDEBUG `wx-config --cxxflags --debug=no` -DZEN_LINUX -pthread
-LINKFLAGS = -s `wx-config --libs std, aui --debug=no` -lboost_thread -lboost_system -lz -pthread
+LINKFLAGS = -s `wx-config --libs std, aui --debug=no` -lboost_thread -lboost_chrono -lboost_system -lz -pthread
#Gtk - support "no button border"
CXXFLAGS += `pkg-config --cflags gtk+-2.0`
diff --git a/FreeFileSync/Source/RealtimeSync/application.cpp b/FreeFileSync/Source/RealtimeSync/application.cpp
index 20fdefea..5dd5fe91 100644
--- a/FreeFileSync/Source/RealtimeSync/application.cpp
+++ b/FreeFileSync/Source/RealtimeSync/application.cpp
@@ -139,7 +139,7 @@ void Application::onEnterEventLoop(wxEvent& event)
filepath += Zstr(".ffs_batch");
else
{
- showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(replaceCpy(_("Cannot find file %x."), L"%x", fmtFileName(filepath))));
+ showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(replaceCpy(_("Cannot find file %x."), L"%x", fmtPath(filepath))));
return;
}
}
diff --git a/FreeFileSync/Source/RealtimeSync/folder_selector2.cpp b/FreeFileSync/Source/RealtimeSync/folder_selector2.cpp
index 9482f003..be9f505a 100644
--- a/FreeFileSync/Source/RealtimeSync/folder_selector2.cpp
+++ b/FreeFileSync/Source/RealtimeSync/folder_selector2.cpp
@@ -98,7 +98,7 @@ void FolderSelector2::onFilesDropped(FileDropEvent& event)
setFolderPath(filePath, &dirpath_, dirpath_, staticText_);
else
{
- Zstring parentName = beforeLast(filePath, FILE_NAME_SEPARATOR); //returns empty string if ch not found
+ Zstring parentName = beforeLast(filePath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
#ifdef ZEN_WIN
if (endsWith(parentName, L":")) //volume root
parentName += FILE_NAME_SEPARATOR;
@@ -125,7 +125,7 @@ bool onIFileDialogAcceptFolder(HWND wnd, const Zstring& folderPath)
if (dirExists(folderPath))
return true;
- const std::wstring msg = replaceCpy(_("Cannot find folder %x."), L"%x", fmtFileName(folderPath));
+ const std::wstring msg = replaceCpy(_("Cannot find folder %x."), L"%x", fmtPath(folderPath));
::MessageBox(wnd, msg.c_str(), (_("Select a folder")).c_str(), MB_ICONWARNING);
//showNotificationDialog would not support HWND parent
return false;
@@ -141,10 +141,9 @@ void FolderSelector2::onSelectDir(wxCommandEvent& event)
const Zstring folderPath = getResolvedDirectoryPath(getPath());
if (!folderPath.empty())
{
+ auto ft = runAsync([folderPath] { return dirExists(folderPath); });
- auto ft = async([folderPath] { return dirExists(folderPath); });
-
- if (ft.timed_wait(boost::posix_time::milliseconds(200)) && ft.get()) //potentially slow network access: wait 200ms at most
+ if (ft.wait_for(boost::chrono::milliseconds(200)) == boost::future_status::ready && ft.get()) //potentially slow network access: wait 200ms at most
defaultFolderPath = folderPath;
}
}
diff --git a/FreeFileSync/Source/RealtimeSync/gui_generated.cpp b/FreeFileSync/Source/RealtimeSync/gui_generated.cpp
index 696ef5be..b7e80742 100644
--- a/FreeFileSync/Source/RealtimeSync/gui_generated.cpp
+++ b/FreeFileSync/Source/RealtimeSync/gui_generated.cpp
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 5 2014)
+// C++ code generated with wxFormBuilder (version Jun 17 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
diff --git a/FreeFileSync/Source/RealtimeSync/gui_generated.h b/FreeFileSync/Source/RealtimeSync/gui_generated.h
index 728758c9..0fa06488 100644
--- a/FreeFileSync/Source/RealtimeSync/gui_generated.h
+++ b/FreeFileSync/Source/RealtimeSync/gui_generated.h
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 5 2014)
+// C++ code generated with wxFormBuilder (version Jun 17 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
diff --git a/FreeFileSync/Source/RealtimeSync/main_dlg.cpp b/FreeFileSync/Source/RealtimeSync/main_dlg.cpp
index 3e200819..1472a301 100644
--- a/FreeFileSync/Source/RealtimeSync/main_dlg.cpp
+++ b/FreeFileSync/Source/RealtimeSync/main_dlg.cpp
@@ -257,13 +257,13 @@ void MainDialog::OnConfigSave(wxCommandEvent& event)
Zstring defaultFileName = currentConfigFileName.empty() ? Zstr("Realtime.ffs_real") : currentConfigFileName;
//attention: currentConfigFileName may be an imported *.ffs_batch file! We don't want to overwrite it with a GUI config!
if (pathEndsWith(defaultFileName, Zstr(".ffs_batch")))
- defaultFileName = beforeLast(defaultFileName, Zstr(".")) + Zstr(".ffs_real");
+ defaultFileName = beforeLast(defaultFileName, Zstr("."), IF_MISSING_RETURN_NONE) + Zstr(".ffs_real");
wxFileDialog filePicker(this,
wxEmptyString,
//OS X really needs dir/file separated like this:
- utfCvrtTo<wxString>(beforeLast(defaultFileName, FILE_NAME_SEPARATOR)), //default dir; empty string if / not found
- utfCvrtTo<wxString>(afterLast (defaultFileName, FILE_NAME_SEPARATOR)), //default file; whole string if / not found
+ utfCvrtTo<wxString>(beforeLast(defaultFileName, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)), //default dir
+ utfCvrtTo<wxString>(afterLast (defaultFileName, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)), //default file
wxString(L"RealtimeSync (*.ffs_real)|*.ffs_real") + L"|" +_("All files") + L" (*.*)|*",
wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
if (filePicker.ShowModal() != wxID_OK)
@@ -328,7 +328,7 @@ void MainDialog::OnConfigLoad(wxCommandEvent& event)
{
wxFileDialog filePicker(this,
wxEmptyString,
- utfCvrtTo<wxString>(beforeLast(currentConfigFileName, FILE_NAME_SEPARATOR)), //default dir; empty string if / not found
+ utfCvrtTo<wxString>(beforeLast(currentConfigFileName, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)), //default dir
wxEmptyString,
wxString(L"RealtimeSync (*.ffs_real; *.ffs_batch)|*.ffs_real;*.ffs_batch") + L"|" +_("All files") + L" (*.*)|*",
wxFD_OPEN);
diff --git a/FreeFileSync/Source/RealtimeSync/monitor.cpp b/FreeFileSync/Source/RealtimeSync/monitor.cpp
index 87716012..42e74eef 100644
--- a/FreeFileSync/Source/RealtimeSync/monitor.cpp
+++ b/FreeFileSync/Source/RealtimeSync/monitor.cpp
@@ -69,9 +69,9 @@ WaitResult waitForChanges(const std::vector<Zstring>& dirpathPhrases, //throw Fi
try
{
//a non-existent network path may block, so check existence asynchronously!
- auto ftDirExists = async([=] { return zen::dirExists(dirpathFmt); });
+ auto ftDirExists = runAsync([=] { return zen::dirExists(dirpathFmt); });
//we need to check dirExists(), not somethingExists(): it's not clear if DirWatcher detects a type clash (file instead of directory!)
- while (!ftDirExists.timed_wait(boost::posix_time::milliseconds(rts::UI_UPDATE_INTERVAL / 2)))
+ while (ftDirExists.wait_for(boost::chrono::milliseconds(rts::UI_UPDATE_INTERVAL / 2)) != boost::future_status::ready)
onRefreshGui(false); //may throw!
if (!ftDirExists.get())
return WaitResult(dirpathFmt);
@@ -139,7 +139,7 @@ WaitResult waitForChanges(const std::vector<Zstring>& dirpathPhrases, //throw Fi
}
}
- boost::this_thread::sleep(boost::posix_time::milliseconds(rts::UI_UPDATE_INTERVAL / 2));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(rts::UI_UPDATE_INTERVAL / 2)); //throw boost::thread_interrupted
onRefreshGui(true); //throw ?: may start sync at this presumably idle time
}
}
@@ -155,7 +155,7 @@ void waitForMissingDirs(const std::vector<Zstring>& dirpathPhrases, //throw File
//support specifying volume by name => call getResolvedDirectoryPath() repeatedly
for (const Zstring& dirpathFmt : getFormattedDirs(dirpathPhrases)) //throw FileError
{
- auto ftDirExisting = async([=]() -> bool
+ auto ftDirExisting = runAsync([=]() -> bool
{
#ifdef ZEN_WIN
//1. login to network share, if necessary -> we probably do NOT want multiple concurrent runs: GUI!?
@@ -164,7 +164,7 @@ void waitForMissingDirs(const std::vector<Zstring>& dirpathPhrases, //throw File
//2. check dir existence
return zen::dirExists(dirpathFmt);
});
- while (!ftDirExisting.timed_wait(boost::posix_time::milliseconds(rts::UI_UPDATE_INTERVAL / 2)))
+ while (ftDirExisting.wait_for(boost::chrono::milliseconds(rts::UI_UPDATE_INTERVAL / 2)) != boost::future_status::ready)
onRefreshGui(dirpathFmt); //may throw!
if (!ftDirExisting.get())
@@ -176,7 +176,7 @@ void waitForMissingDirs(const std::vector<Zstring>& dirpathPhrases, //throw File
for (int i = 0; i < CHECK_DIR_INTERVAL * 1000 / refreshInterval; ++i)
{
onRefreshGui(dirpathFmt); //may throw!
- boost::this_thread::sleep(boost::posix_time::milliseconds(refreshInterval));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(refreshInterval)); //throw boost::thread_interrupted
}
break;
}
diff --git a/FreeFileSync/Source/RealtimeSync/tray_menu.cpp b/FreeFileSync/Source/RealtimeSync/tray_menu.cpp
index 0604ac21..6eb71946 100644
--- a/FreeFileSync/Source/RealtimeSync/tray_menu.cpp
+++ b/FreeFileSync/Source/RealtimeSync/tray_menu.cpp
@@ -319,7 +319,7 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf
case ConfirmationButton::CANCEL:
throw AbortMonitoring(SHOW_GUI);
}
- boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(UI_UPDATE_INTERVAL)); //throw boost::thread_interrupted
}
}
diff --git a/FreeFileSync/Source/RealtimeSync/xml_proc.cpp b/FreeFileSync/Source/RealtimeSync/xml_proc.cpp
index 73b543c1..fdd3b507 100644
--- a/FreeFileSync/Source/RealtimeSync/xml_proc.cpp
+++ b/FreeFileSync/Source/RealtimeSync/xml_proc.cpp
@@ -43,7 +43,7 @@ void xmlAccess::readConfig(const Zstring& filepath, XmlRealConfig& config, std::
XmlDoc doc = loadXmlDocument(filepath); //throw FileError
if (!isXmlTypeRTS(doc))
- throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filepath)));
+ throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filepath)));
XmlIn in(doc);
::readConfig(in, config);
diff --git a/FreeFileSync/Source/algorithm.cpp b/FreeFileSync/Source/algorithm.cpp
index adc33fc2..e49fd0a0 100644
--- a/FreeFileSync/Source/algorithm.cpp
+++ b/FreeFileSync/Source/algorithm.cpp
@@ -1081,24 +1081,24 @@ void zen::applyTimeSpanFilter(FolderComparison& folderCmp, std::int64_t timeFrom
//############################################################################################################
-std::pair<Zstring, int> zen::deleteFromGridAndHDPreview(const std::vector<FileSystemObject*>& selectionLeft,
- const std::vector<FileSystemObject*>& selectionRight)
+std::pair<std::wstring, int> zen::deleteFromGridAndHDPreview(const std::vector<FileSystemObject*>& selectionLeft,
+ const std::vector<FileSystemObject*>& selectionRight)
{
- //don't use wxString here, it's linear allocation strategy would bring perf down to a crawl; Zstring: exponential growth!
- Zstring fileList;
+ //don't use wxString! its imprudent linear allocation strategy brings perf down to a crawl!
+ std::wstring fileList; //
int totalDelCount = 0;
for (const FileSystemObject* fsObj : selectionLeft)
if (!fsObj->isEmpty<LEFT_SIDE>())
{
- fileList += ABF::getDisplayPath(fsObj->getAbstractPath<LEFT_SIDE>()) + Zstr('\n');
+ fileList += ABF::getDisplayPath(fsObj->getAbstractPath<LEFT_SIDE>()) + L'\n';
++totalDelCount;
}
for (const FileSystemObject* fsObj : selectionRight)
if (!fsObj->isEmpty<RIGHT_SIDE>())
{
- fileList += ABF::getDisplayPath(fsObj->getAbstractPath<RIGHT_SIDE>()) + Zstr('\n');
+ fileList += ABF::getDisplayPath(fsObj->getAbstractPath<RIGHT_SIDE>()) + L'\n';
++totalDelCount;
}
@@ -1148,7 +1148,7 @@ void categorize(const std::set<FileSystemObject*>& rowsIn,
return it->second;
const std::wstring msg = replaceCpy(_("Checking recycle bin availability for folder %x..."), L"%x",
- fmtFileName(ABF::getDisplayPath(baseFolder.getAbstractPath())));
+ fmtPath(ABF::getDisplayPath(baseFolder.getAbstractPath())));
bool recSupported = false;
tryReportingError([&]{
recSupported = baseFolder.supportsRecycleBin([&] { callback.reportStatus(msg); /*may throw*/ }); //throw FileError
@@ -1208,7 +1208,7 @@ struct ItemDeleter : public FSObjectVisitor //throw FileError, but nothrow const
else
{
if (ABF::dirExists(linkObj.getAbstractPath<side>())) //dir symlink
- ABF::removeFolder(linkObj.getAbstractPath<side>()); //throw FileError
+ ABF::removeFolderSimple(linkObj.getAbstractPath<side>()); //throw FileError
else //file symlink, broken symlink
ABF::removeFile(linkObj.getAbstractPath<side>()); //throw FileError
}
@@ -1222,21 +1222,21 @@ struct ItemDeleter : public FSObjectVisitor //throw FileError, but nothrow const
ABF::recycleItemDirectly(dirObj.getAbstractPath<side>()); //throw FileError
else
{
- auto onBeforeFileDeletion = [&](const Zstring& displayPath) { this->notifyFileDeletion (displayPath); }; //without "this->" GCC 4.7.2 runtime crash on Debian
- auto onBeforeDirDeletion = [&](const Zstring& displayPath) { this->notifyDirectoryDeletion(displayPath ); };
+ auto onBeforeFileDeletion = [&](const std::wstring& displayPath) { this->notifyFileDeletion (displayPath); }; //without "this->" GCC 4.7.2 runtime crash on Debian
+ auto onBeforeDirDeletion = [&](const std::wstring& displayPath) { this->notifyDirectoryDeletion(displayPath); };
- ABF::removeFolder(dirObj.getAbstractPath<side>(), onBeforeFileDeletion, onBeforeDirDeletion); //throw FileError
+ ABF::removeFolderRecursively(dirObj.getAbstractPath<side>(), onBeforeFileDeletion, onBeforeDirDeletion); //throw FileError
}
}
private:
- void notifyFileDeletion (const Zstring& displayPath) { notifyItemDeletion(txtRemovingFile , displayPath); }
- void notifyDirectoryDeletion(const Zstring& displayPath) { notifyItemDeletion(txtRemovingDirectory, displayPath); }
- void notifySymlinkDeletion (const Zstring& displayPath) { notifyItemDeletion(txtRemovingSymlink , displayPath); }
+ void notifyFileDeletion (const std::wstring& displayPath) { notifyItemDeletion(txtRemovingFile , displayPath); }
+ void notifyDirectoryDeletion(const std::wstring& displayPath) { notifyItemDeletion(txtRemovingDirectory, displayPath); }
+ void notifySymlinkDeletion (const std::wstring& displayPath) { notifyItemDeletion(txtRemovingSymlink , displayPath); }
- void notifyItemDeletion(const std::wstring& statusText, const Zstring& displayPath)
+ void notifyItemDeletion(const std::wstring& statusText, const std::wstring& displayPath)
{
- handler_.reportStatus(replaceCpy(statusText, L"%x", fmtFileName(displayPath)));
+ handler_.reportStatus(replaceCpy(statusText, L"%x", fmtPath(displayPath)));
}
DeleteFilesHandler& handler_;
@@ -1345,7 +1345,7 @@ void zen::deleteFromGridAndHD(const std::vector<FileSystemObject*>& rowsToDelete
for (const auto& item : recyclerSupported)
if (!item.second)
- msg += std::wstring(L"\n") + ABF::getDisplayPath(item.first->getAbstractPath());
+ msg += L"\n" + ABF::getDisplayPath(item.first->getAbstractPath());
statusHandler.reportWarning(msg, warningRecyclerMissing); //throw?
}
diff --git a/FreeFileSync/Source/algorithm.h b/FreeFileSync/Source/algorithm.h
index 6c6cca18..aab41ae1 100644
--- a/FreeFileSync/Source/algorithm.h
+++ b/FreeFileSync/Source/algorithm.h
@@ -43,7 +43,7 @@ void setActiveStatus(bool newStatus, FileSystemObject& fsObj); //activate or
//manual deletion of files on main grid
-std::pair<Zstring, int> deleteFromGridAndHDPreview( //returns string with elements to be deleted and total count of selected(!) objects, NOT total files/dirs!
+std::pair<std::wstring, int> deleteFromGridAndHDPreview( //returns string with elements to be deleted and total count of selected(!) objects, NOT total files/dirs!
const std::vector<FileSystemObject*>& selectionLeft, //all pointers need to be bound!
const std::vector<FileSystemObject*>& selectionRight); //
diff --git a/FreeFileSync/Source/application.cpp b/FreeFileSync/Source/application.cpp
index 0e858350..14aadc03 100644
--- a/FreeFileSync/Source/application.cpp
+++ b/FreeFileSync/Source/application.cpp
@@ -357,7 +357,7 @@ void Application::launch(const std::vector<Zstring>& commandArgs)
filepath += Zstr(".xml");
else
{
- notifyError(replaceCpy(_("Cannot find file %x."), L"%x", fmtFileName(filepath)), std::wstring());
+ notifyError(replaceCpy(_("Cannot find file %x."), L"%x", fmtPath(filepath)), std::wstring());
return;
}
}
@@ -376,7 +376,7 @@ void Application::launch(const std::vector<Zstring>& commandArgs)
globalConfigFile = filepath;
break;
case XML_TYPE_OTHER:
- notifyError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filepath)), std::wstring());
+ notifyError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filepath)), std::wstring());
return;
}
}
@@ -564,7 +564,7 @@ void showSyntaxHelp()
_("Any number of alternative directory pairs for at most one config file.") + L"\n\n" +
L"-Edit" + L"\n" +
- _("Open configuration for edit without executing.")));
+ _("Open configuration for editing without executing it.")));
}
diff --git a/FreeFileSync/Source/comparison.cpp b/FreeFileSync/Source/comparison.cpp
index b68c3a0c..1d554449 100644
--- a/FreeFileSync/Source/comparison.cpp
+++ b/FreeFileSync/Source/comparison.cpp
@@ -65,14 +65,6 @@ struct ResolvedBaseFolders
std::set<const ABF*, ABF::LessItemPath> existingBaseFolders; //references resolvedPairs variable!!!
};
-struct LessItemPathSharedPtr
-{
- bool operator()(const std::shared_ptr<ABF>& lhs, const std::shared_ptr<ABF>& rhs) const
- {
- return ABF::LessItemPath()(lhs.get(), rhs.get());
- }
-};
-
ResolvedBaseFolders initializeBaseFolders(const std::vector<FolderPairCfg>& cfgList,
bool allowUserInteraction,
@@ -82,7 +74,7 @@ ResolvedBaseFolders initializeBaseFolders(const std::vector<FolderPairCfg>& cfgL
tryReportingError([&]
{
- std::set<std::shared_ptr<ABF>, LessItemPathSharedPtr> uniqueBaseFolders;
+ std::set<const ABF*, ABF::LessItemPath> uniqueBaseFolders;
//support "retry" for environment variable and and variable driver letter resolution!
output.resolvedPairs.clear();
@@ -91,20 +83,13 @@ ResolvedBaseFolders initializeBaseFolders(const std::vector<FolderPairCfg>& cfgL
std::shared_ptr<ABF> abfLeft = createAbstractBaseFolder(fpCfg.dirpathPhraseLeft);
std::shared_ptr<ABF> abfRight = createAbstractBaseFolder(fpCfg.dirpathPhraseRight);
- auto rv1 = uniqueBaseFolders.insert(abfLeft);
- if (!rv1.second) abfLeft = *rv1.first; //use same instance for all identical base paths => e.g. single FTP connect attempt for all!
-
- auto rv2 = uniqueBaseFolders.insert(abfRight);
- if (!rv2.second) abfRight = *rv2.first;
+ uniqueBaseFolders.insert(abfLeft .get());
+ uniqueBaseFolders.insert(abfRight.get());
output.resolvedPairs.emplace_back(abfLeft, abfRight);
}
- std::set<const ABF*, ABF::LessItemPath> uniqueBaseFolders2;
- for (const auto& item : uniqueBaseFolders)
- uniqueBaseFolders2.insert(item.get());
-
- const DirectoryStatus status = checkFolderExistenceUpdating(uniqueBaseFolders2, allowUserInteraction, callback); //re-check *all* directories on each try!
+ const DirectoryStatus status = checkFolderExistenceUpdating(uniqueBaseFolders, allowUserInteraction, callback); //re-check *all* directories on each try!
output.existingBaseFolders = status.existingBaseFolder;
if (!status.missingBaseFolder.empty() || !status.failedChecks.empty())
@@ -112,19 +97,22 @@ ResolvedBaseFolders initializeBaseFolders(const std::vector<FolderPairCfg>& cfgL
std::wstring errorMsg = _("Cannot find the following folders:") + L"\n";
for (const auto& baseFolder : status.missingBaseFolder)
- errorMsg += std::wstring(L"\n") + ABF::getDisplayPath(baseFolder->getAbstractPath());
+ errorMsg += L"\n" + ABF::getDisplayPath(baseFolder->getAbstractPath());
for (const auto& fc : status.failedChecks)
- errorMsg += std::wstring(L"\n") + ABF::getDisplayPath(fc.first->getAbstractPath());
+ errorMsg += L"\n" + ABF::getDisplayPath(fc.first->getAbstractPath());
+
+ errorMsg += L"\n\n";
+ errorMsg += _("You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization.");
if (!status.failedChecks.empty())
{
- errorMsg += L"\n";
+ errorMsg += L"\n___________________________________________";
for (const auto& fc : status.failedChecks)
- errorMsg += std::wstring(L"\n") + fc.second.toString();
+ errorMsg += std::wstring(L"\n\n") + replaceCpy(fc.second.toString(), L"\n\n", L"\n");
}
- throw FileError(errorMsg, _("You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization."));
+ throw FileError(errorMsg);
}
}, callback); //throw X?
@@ -165,7 +153,7 @@ void checkFolderDependency(const std::vector<ResolvedFolderPair>& folderPairs, b
{
std::wstring warningMsg = _("The following folder paths are dependent from each other:");
for (const ResolvedFolderPair& pair : dependentFolderPairs)
- warningMsg += std::wstring(L"\n\n") +
+ warningMsg += L"\n\n" +
ABF::getDisplayPath(pair.abfLeft ->getAbstractPath()) + L"\n" +
ABF::getDisplayPath(pair.abfRight->getAbstractPath());
@@ -252,9 +240,9 @@ const wchar_t arrowRight[] = L"-->";
//check for very old dates or dates in the future
-std::wstring getConflictInvalidDate(const Zstring& displayPath, std::int64_t utcTime)
+std::wstring getConflictInvalidDate(const std::wstring& displayPath, std::int64_t utcTime)
{
- return replaceCpy(_("File %x has an invalid date."), L"%x", fmtFileName(displayPath)) + L"\n" +
+ return replaceCpy(_("File %x has an invalid date."), L"%x", fmtPath(displayPath)) + L"\n" +
_("Date:") + L" " + utcToLocalTimeString(utcTime);
}
@@ -262,7 +250,7 @@ std::wstring getConflictInvalidDate(const Zstring& displayPath, std::int64_t utc
//check for changed files with same modification date
std::wstring getConflictSameDateDiffSize(const FilePair& fileObj)
{
- return replaceCpy(_("Files %x have the same date but a different size."), L"%x", fmtFileName(fileObj.getPairRelativePath())) + L"\n" +
+ return replaceCpy(_("Files %x have the same date but a different size."), L"%x", fmtPath(fileObj.getPairRelativePath())) + L"\n" +
L" " + arrowLeft + L" " + _("Date:") + L" " + utcToLocalTimeString(fileObj.getLastWriteTime<LEFT_SIDE >()) + L" " + _("Size:") + L" " + toGuiString(fileObj.getFileSize<LEFT_SIDE>()) + L"\n" +
L" " + arrowRight + L" " + _("Date:") + L" " + utcToLocalTimeString(fileObj.getLastWriteTime<RIGHT_SIDE>()) + L" " + _("Size:") + L" " + toGuiString(fileObj.getFileSize<RIGHT_SIDE>());
}
@@ -270,15 +258,15 @@ std::wstring getConflictSameDateDiffSize(const FilePair& fileObj)
std::wstring getConflictSkippedBinaryComparison(const FilePair& fileObj)
{
- return replaceCpy(_("Content comparison was skipped for excluded files %x."), L"%x", fmtFileName(fileObj.getPairRelativePath()));
+ return replaceCpy(_("Content comparison was skipped for excluded files %x."), L"%x", fmtPath(fileObj.getPairRelativePath()));
}
std::wstring getDescrDiffMetaShortnameCase(const FileSystemObject& fsObj)
{
return _("Items differ in attributes only") + L"\n" +
- L" " + arrowLeft + L" " + fmtFileName(fsObj.getItemName<LEFT_SIDE >()) + L"\n" +
- L" " + arrowRight + L" " + fmtFileName(fsObj.getItemName<RIGHT_SIDE>());
+ L" " + arrowLeft + L" " + fmtPath(fsObj.getItemName<LEFT_SIDE >()) + L"\n" +
+ L" " + arrowRight + L" " + fmtPath(fsObj.getItemName<RIGHT_SIDE>());
}
@@ -389,11 +377,11 @@ void categorizeSymlinkByContent(SymlinkPair& linkObj, int fileTimeTolerance, uns
Zstring targetPathRawR;
Opt<std::wstring> errMsg = tryReportingError([&]
{
- callback.reportStatus(replaceCpy(_("Resolving symbolic link %x"), L"%x", fmtFileName(ABF::getDisplayPath(linkObj.getAbstractPath<LEFT_SIDE>()))));
+ callback.reportStatus(replaceCpy(_("Resolving symbolic link %x"), L"%x", fmtPath(ABF::getDisplayPath(linkObj.getAbstractPath<LEFT_SIDE>()))));
targetPathRawL = ABF::getSymlinkContentBuffer(linkObj.getAbstractPath<LEFT_SIDE>()); //throw FileError
- callback.reportStatus(replaceCpy(_("Resolving symbolic link %x"), L"%x", fmtFileName(ABF::getDisplayPath(linkObj.getAbstractPath<RIGHT_SIDE>()))));
+ callback.reportStatus(replaceCpy(_("Resolving symbolic link %x"), L"%x", fmtPath(ABF::getDisplayPath(linkObj.getAbstractPath<RIGHT_SIDE>()))));
targetPathRawR = ABF::getSymlinkContentBuffer(linkObj.getAbstractPath<RIGHT_SIDE>()); //throw FileError
}, callback); //throw X?
@@ -485,7 +473,7 @@ std::list<std::shared_ptr<BaseDirPair>> ComparisonBuffer::compareByContent(const
//compare files (that have same size) bytewise...
for (FilePair* fileObj : filesToCompareBytewise)
{
- callback_.reportStatus(replaceCpy(txtComparingContentOfFiles, L"%x", fmtFileName(fileObj->getPairRelativePath())));
+ callback_.reportStatus(replaceCpy(txtComparingContentOfFiles, L"%x", fmtPath(fileObj->getPairRelativePath())));
//check files that exist in left and right model but have different content
diff --git a/FreeFileSync/Source/file_hierarchy.cpp b/FreeFileSync/Source/file_hierarchy.cpp
index 50d5ee1b..0cbd241a 100644
--- a/FreeFileSync/Source/file_hierarchy.cpp
+++ b/FreeFileSync/Source/file_hierarchy.cpp
@@ -383,8 +383,8 @@ std::wstring zen::getSyncOpDescription(const FileSystemObject& fsObj)
if (shortNameOld != shortNameNew) //detected change in case
return getSyncOpDescription(op) + L"\n" +
- fmtFileName(shortNameOld) + L" ->\n" + //show short name only
- fmtFileName(shortNameNew);
+ fmtPath(shortNameOld) + L" ->\n" + //show short name only
+ fmtPath(shortNameNew);
}
//fallback:
return getSyncOpDescription(op);
@@ -408,13 +408,14 @@ std::wstring zen::getSyncOpDescription(const FileSystemObject& fsObj)
const Zstring relTarget = getRelName(*targetFile, !onLeft);
return getSyncOpDescription(op) + L"\n" +
- (EqualFilePath()(beforeLast(relSource, FILE_NAME_SEPARATOR), beforeLast(relTarget, FILE_NAME_SEPARATOR)) ? //returns empty string if ch not found
+ (EqualFilePath()(beforeLast(relSource, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE),
+ beforeLast(relTarget, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)) ?
//detected pure "rename"
- fmtFileName(afterLast(relSource, FILE_NAME_SEPARATOR)) + L" ->\n" + //show short name only
- fmtFileName(afterLast(relTarget, FILE_NAME_SEPARATOR)) :
+ fmtPath(afterLast(relSource, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)) + L" ->\n" + //show short name only
+ fmtPath(afterLast(relTarget, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)) :
//"move" or "move + rename"
- fmtFileName(relSource) + L" ->\n" +
- fmtFileName(relTarget));
+ fmtPath(relSource) + L" ->\n" +
+ fmtPath(relTarget));
//attention: ::SetWindowText() doesn't handle tab characters correctly in combination with certain file names, so don't use them
}
break;
diff --git a/FreeFileSync/Source/fs/abstract.cpp b/FreeFileSync/Source/fs/abstract.cpp
index ee1c0f8c..ffdf286a 100644
--- a/FreeFileSync/Source/fs/abstract.cpp
+++ b/FreeFileSync/Source/fs/abstract.cpp
@@ -5,11 +5,12 @@
// **************************************************************************
#include "abstract.h"
-//#include <zen/string_tools.h>
using namespace zen;
using ABF = AbstractBaseFolder;
+const Zchar* ABF::TEMP_FILE_ENDING = Zstr(".ffs_tmp");
+
ABF::FileAttribAfterCopy ABF::copyFileAsStream(const AbstractPathRef& apSource, const AbstractPathRef& apTarget, //throw FileError, ErrorTargetExisting, ErrorFileLocked
const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus)
@@ -43,8 +44,9 @@ ABF::FileAttribAfterCopy ABF::copyFileAsStream(const AbstractPathRef& apSource,
break;
}
+ //important check: catches corrupt sftp download with libssh2!
if (bytesWritten != fileSizeExpected)
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(ABF::getDisplayPath(apSource))),
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(ABF::getDisplayPath(apSource))),
replaceCpy(replaceCpy(_("Unexpected size of data stream.\nExpected: %x bytes\nActual: %y bytes"), L"%x", numberTo<std::wstring>(fileSizeExpected)), L"%y", numberTo<std::wstring>(bytesWritten)));
//modification time should be set here!
@@ -60,9 +62,6 @@ ABF::FileAttribAfterCopy ABF::copyFileAsStream(const AbstractPathRef& apSource,
}
-const Zchar* ABF::TEMP_FILE_ENDING = Zstr(".ffs_tmp");
-
-
ABF::FileAttribAfterCopy ABF::copyFileTransactional(const AbstractPathRef& apSource, const AbstractPathRef& apTarget, //throw FileError, ErrorFileLocked
bool copyFilePermissions,
bool transactionalCopy,
@@ -77,7 +76,7 @@ ABF::FileAttribAfterCopy ABF::copyFileTransactional(const AbstractPathRef& apSou
//fall back to stream-based file copy:
if (copyFilePermissions)
- throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(getDisplayPath(apTargetTmp))),
+ throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(getDisplayPath(apTargetTmp))),
_("Operation not supported for different base folder types."));
return copyFileAsStream(apSource, apTargetTmp, onNotifyCopyStatus); //throw FileError, ErrorTargetExisting, ErrorFileLocked
@@ -136,3 +135,118 @@ ABF::FileAttribAfterCopy ABF::copyFileTransactional(const AbstractPathRef& apSou
return copyFileBestEffort(apTarget); //throw FileError, ErrorTargetExisting, ErrorFileLocked
}
}
+
+
+void ABF::createFolderRecursively(const AbstractPathRef& ap) //throw FileError
+{
+ try
+ {
+ AbstractBaseFolder::createFolderSimple(ap); //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
+ }
+ catch (ErrorTargetExisting&) {}
+ catch (ErrorTargetPathMissing&)
+ {
+ if (const Opt<Zstring> parentPathImpl = ap.abf->getParentFolderPathImpl(ap.itemPathImpl))
+ {
+ //recurse...
+ createFolderRecursively(AbstractPathRef(*ap.abf, *parentPathImpl)); //throw FileError
+
+ //now try again...
+ ABF::createFolderSimple(ap); //throw FileError, (ErrorTargetExisting), (ErrorTargetPathMissing)
+ return;
+ }
+ throw;
+ }
+}
+
+
+namespace
+{
+struct FlatTraverserCallback: public ABF::TraverserCallback
+{
+ FlatTraverserCallback(const AbstractPathRef& folderPath) : folderPath_(folderPath) {}
+
+ void onFile (const FileInfo& fi) override { fileNames_ .push_back(fi.shortName); }
+ std::unique_ptr<TraverserCallback> onDir (const DirInfo& di) override { folderNames_.push_back(di.shortName); return nullptr; }
+ HandleLink onSymlink(const SymlinkInfo& si) override
+ {
+ if (ABF::dirExists(ABF::appendRelPath(folderPath_, si.shortName))) //dir symlink
+ folderLinkNames_.push_back(si.shortName);
+ else //file symlink, broken symlink
+ fileNames_.push_back(si.shortName);
+ 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 Zchar* shortName) override { throw FileError(msg); }
+
+ const std::vector<Zstring>& refFileNames () const { return fileNames_; }
+ const std::vector<Zstring>& refFolderNames () const { return folderNames_; }
+ const std::vector<Zstring>& refFolderLinkNames() const { return folderLinkNames_; }
+
+private:
+ const AbstractPathRef folderPath_;
+ std::vector<Zstring> fileNames_;
+ std::vector<Zstring> folderNames_;
+ std::vector<Zstring> folderLinkNames_;
+};
+
+
+void removeFolderRecursivelyImpl(const AbstractPathRef& 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!
+{
+ assert(!ABF::symlinkExists(folderPath)); //[!] no symlinks in this context!!!
+ assert(ABF::dirExists(folderPath)); //Do NOT traverse into it deleting contained files!!!
+
+ FlatTraverserCallback ft(folderPath); //traverse source directory one level deep
+ ABF::traverseFolder(folderPath, ft); //throw FileError
+
+ for (const Zstring& fileName : ft.refFileNames())
+ {
+ const AbstractPathRef filePath = ABF::appendRelPath(folderPath, fileName);
+ if (onBeforeFileDeletion)
+ onBeforeFileDeletion(ABF::getDisplayPath(filePath));
+
+ ABF::removeFile(filePath); //throw FileError
+ }
+
+ for (const Zstring& folderLinkName : ft.refFolderLinkNames())
+ {
+ const AbstractPathRef linkPath = ABF::appendRelPath(folderPath, folderLinkName);
+ if (onBeforeFolderDeletion)
+ onBeforeFolderDeletion(ABF::getDisplayPath(linkPath));
+
+ ABF::removeFolderSimple(linkPath); //throw FileError
+ }
+
+ //remove folders recursively:
+ for (const Zstring& folderName : ft.refFolderNames())
+ removeFolderRecursivelyImpl(ABF::appendRelPath(folderPath, folderName), //throw FileError
+ onBeforeFileDeletion, onBeforeFolderDeletion);
+
+ if (onBeforeFolderDeletion)
+ onBeforeFolderDeletion(ABF::getDisplayPath(folderPath));
+
+ ABF::removeFolderSimple(folderPath); //throw FileError
+}
+}
+
+
+void ABF::removeFolderRecursively(const AbstractPathRef& 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 *existing* object!
+{
+ if (ABF::symlinkExists(ap))
+ {
+ if (onBeforeFolderDeletion)
+ onBeforeFolderDeletion(ABF::getDisplayPath(ap));
+
+ ABF::removeFolderSimple(ap); //throw FileError
+ }
+ else
+ {
+ //no error situation if directory is not existing! manual deletion relies on it!
+ if (ABF::somethingExists(ap))
+ removeFolderRecursivelyImpl(ap, onBeforeFileDeletion, onBeforeFolderDeletion); //throw FileError
+ }
+}
diff --git a/FreeFileSync/Source/fs/abstract.h b/FreeFileSync/Source/fs/abstract.h
index 6c2c6c7f..1b951089 100644
--- a/FreeFileSync/Source/fs/abstract.h
+++ b/FreeFileSync/Source/fs/abstract.h
@@ -37,7 +37,9 @@ private:
struct AbstractBaseFolder
{
- static Zstring getDisplayPath(const AbstractPathRef& ap) { return ap.abf->getDisplayPath(ap.itemPathImpl); }
+ virtual Zstring getInitPathPhrase() const = 0; //noexcept
+
+ static std::wstring getDisplayPath(const AbstractPathRef& ap) { return ap.abf->getDisplayPath(ap.itemPathImpl); }
static Zstring getFileShortName(const AbstractPathRef& ap) { return ap.abf->getFileShortName(ap.itemPathImpl); }
@@ -57,26 +59,26 @@ struct AbstractBaseFolder
static bool somethingExists(const AbstractPathRef& ap) { return ap.abf->somethingExists(ap.itemPathImpl); } //noexcept; check whether any object with this name exists
//----------------------------------------------------------------------------------------------------------------
- //if parent directory is not existing: create recursively
//should provide for single ATOMIC folder creation!
- static void createNewFolder(const AbstractPathRef& ap) { return ap.abf->createNewFolder(ap.itemPathImpl); } //throw FileError, ErrorTargetExisting
+ static void createFolderSimple(const AbstractPathRef& ap) { ap.abf->createFolderSimple(ap.itemPathImpl); }; //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
- static bool removeFile(const AbstractPathRef& ap) { return ap.abf->removeFile(ap.itemPathImpl); }; //throw FileError; return "false" if file is not existing
+ //non-recursive folder deletion:
+ static void removeFolderSimple(const AbstractPathRef& ap) { ap.abf->removeFolderSimple(ap.itemPathImpl); }; //throw FileError
- static void removeFolder(const AbstractPathRef& ap, //throw FileError
- const std::function<void (const Zstring& displayPath)>& onBeforeFileDeletion = nullptr, //optional;
- const std::function<void (const Zstring& displayPath)>& onBeforeDirDeletion = nullptr) //one call for each *existing* object!
- { return ap.abf->removeFolder(ap.itemPathImpl, onBeforeFileDeletion, onBeforeDirDeletion); };
+ //- no error if already existing
+ //- create recursively if parent directory is not existing
+ static void createFolderRecursively(const AbstractPathRef& ap); //throw FileError
- //----------------------------------------------------------------------------------------------------------------
+ static void removeFolderRecursively(const AbstractPathRef& 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 *existing* object!
- enum class SymlinkHandling
- {
- DIRECT,
- FOLLOW
- };
+ static bool removeFile(const AbstractPathRef& ap) { return ap.abf->removeFile(ap.itemPathImpl); }; //throw FileError; return "false" if file is not existing
+
+ //----------------------------------------------------------------------------------------------------------------
- static void setFileTime(const AbstractPathRef& ap, std::int64_t modificationTime, SymlinkHandling procSl) { return ap.abf->setFileTime(ap.itemPathImpl, modificationTime, procSl); } //throw FileError
+ static void setModTime (const AbstractPathRef& ap, std::int64_t modificationTime) { ap.abf->setModTime (ap.itemPathImpl, modificationTime); } //throw FileError, follows symlinks
+ static void setModTimeSymlink(const AbstractPathRef& ap, std::int64_t modificationTime) { ap.abf->setModTimeSymlink(ap.itemPathImpl, modificationTime); } //throw FileError
static AbstractPathRef getResolvedSymlinkPath(const AbstractPathRef& ap) { return ap.abf->getResolvedSymlinkPath(ap.itemPathImpl); } //throw FileError
@@ -93,7 +95,7 @@ struct AbstractBaseFolder
//- THREAD-SAFETY: must be thread-safe like an int! => no dangling references to this instance!
static IconLoader getAsyncIconLoader(const AbstractPathRef& ap) { return ap.abf->getAsyncIconLoader(ap.itemPathImpl); } //noexcept!
virtual std::function<void()> /*throw FileError*/ getAsyncConnectFolder(bool allowUserInteraction) const = 0; //noexcept, optional return value
- static std::function<bool()> /*noexcept*/ getAsyncCheckDirExists(const AbstractPathRef& ap) { return ap.abf->getAsyncCheckDirExists(ap.itemPathImpl); } //noexcept
+ static std::function<bool()> /*throw FileError*/ getAsyncCheckDirExists(const AbstractPathRef& ap) { return ap.abf->getAsyncCheckDirExists(ap.itemPathImpl); } //noexcept
//----------------------------------------------------------------------------------------------------------------
using FileId = Zbase<char>;
@@ -114,11 +116,13 @@ struct AbstractBaseFolder
InputStream& operator=(InputStream&) = delete;
};
- struct OutputStream //TRANSACTIONAL output stream! => call finalize when done!
+ //TRANSACTIONAL output stream! => call finalize when done!
+ //- takes ownership and deletes on errors!!!! => transactionally create output stream first if not existing!!
+ struct OutputStream
{
virtual ~OutputStream();
- void write(const void* buffer, size_t bytesToWrite); //throw FileError
- FileId finalize(const std::function<void()>& onUpdateStatus); //throw FileError
+ void write(const void* buffer, size_t bytesToWrite); //throw FileError
+ FileId finalize(const std::function<void()>& onUpdateStatus); //throw FileError
virtual size_t optimalBlockSize() const = 0; //non-zero block size is ABF contract!
protected:
@@ -181,11 +185,10 @@ struct AbstractBaseFolder
ON_ERROR_IGNORE
};
- virtual void onFile (const FileInfo& fi) = 0;
- virtual TraverserCallback* onDir (const DirInfo& di) = 0;
- virtual HandleLink onSymlink(const SymlinkInfo& si) = 0;
- //nullptr: ignore directory, non-nullptr: traverse into using the (new) callback => implement releaseDirTraverser() if necessary!
- virtual void releaseDirTraverser(TraverserCallback* trav) {}
+ virtual void onFile (const FileInfo& fi) = 0;
+ virtual HandleLink onSymlink(const SymlinkInfo& si) = 0;
+ virtual std::unique_ptr<TraverserCallback> onDir (const DirInfo& di) = 0;
+ //nullptr: ignore directory, non-nullptr: traverse into, using the (new) callback
virtual HandleError reportDirError (const std::wstring& msg, size_t retryNumber) = 0; //failed directory traversal -> consider directory data at current level as incomplete!
virtual HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zchar* shortName) = 0; //failed to get data for single file/dir/symlink only!
@@ -250,7 +253,7 @@ struct AbstractBaseFolder
{
virtual ~RecycleSession() {};
virtual bool recycleItem(const AbstractPathRef& ap, const Zstring& logicalRelPath) = 0; //throw FileError; return true if item existed
- virtual void tryCleanup(const std::function<void (const Zstring& displayPath)>& notifyDeletionStatus /*optional; currentItem may be empty*/) = 0; //throw FileError
+ virtual void tryCleanup(const std::function<void (const std::wstring& displayPath)>& notifyDeletionStatus /*optional; currentItem may be empty*/) = 0; //throw FileError
};
virtual std::unique_ptr<RecycleSession> createRecyclerSession() const = 0; //throw FileError, precondition: supportsRecycleBin(); return value must be bound!
@@ -262,7 +265,7 @@ struct AbstractBaseFolder
//no need to protect access:
static const AbstractBaseFolder& getAbf(const AbstractPathRef& ap) { return *ap.abf; }
- static Zstring appendPaths(const Zstring& basePath, const Zstring& relPath);
+ static Zstring appendPaths(const Zstring& basePath, const Zstring& relPath, Zchar pathSep);
protected: //grant derived classes access to AbstractPathRef:
static Zstring getItemPathImpl(const AbstractPathRef& ap) { return ap.itemPathImpl; }
@@ -272,7 +275,7 @@ private:
virtual bool isNativeFileSystem() const { return false; };
//- THREAD-SAFETY: expect accesses from multiple threads to the same instance => synchronize internally!!!
- virtual Zstring getDisplayPath(const Zstring& itemPathImpl) const = 0;
+ virtual std::wstring getDisplayPath(const Zstring& itemPathImpl) const = 0;
//- THREAD-SAFETY: expect accesses from multiple threads to the same instance => synchronize internally!!!
virtual Zstring appendRelPathToItemPathImpl(const Zstring& itemPathImpl, const Zstring& relPath) const = 0;
@@ -280,6 +283,9 @@ private:
//- THREAD-SAFETY: expect accesses from multiple threads to the same instance => synchronize internally!!!
virtual Zstring getBasePathImpl() const = 0;
+ //used during folder creation if parent folder is missing
+ virtual Opt<Zstring> getParentFolderPathImpl(const Zstring& itemPathImpl) const = 0;
+
virtual Zstring getFileShortName(const Zstring& itemPathImpl) const = 0;
virtual bool lessItemPathSameAbfType(const Zstring& itemPathImplLhs, const AbstractPathRef& apRhs) const = 0;
@@ -292,16 +298,18 @@ private:
virtual bool symlinkExists (const Zstring& itemPathImpl) const = 0; //noexcept
virtual bool somethingExists(const Zstring& itemPathImpl) const = 0; //noexcept
//----------------------------------------------------------------------------------------------------------------
- //should provide for single ATOMIC folder creation! creates recursively!
- virtual void createNewFolder(const Zstring& itemPathImpl) const = 0; //throw FileError, ErrorTargetExisting
+
+ //should provide for single ATOMIC folder creation!
+ virtual void createFolderSimple(const Zstring& itemPathImpl) const = 0; //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
+
+ //non-recursive folder deletion:
+ virtual void removeFolderSimple(const Zstring& itemPathImpl) const = 0; //throw FileError
virtual bool removeFile(const Zstring& itemPathImpl) const = 0; //throw FileError
- virtual void removeFolder(const Zstring& itemPathImpl, //throw FileError
- const std::function<void (const Zstring& displayPath)>& onBeforeFileDeletion, //optional;
- const std::function<void (const Zstring& displayPath)>& onBeforeDirDeletion) const = 0;
//----------------------------------------------------------------------------------------------------------------
- virtual void setFileTime(const Zstring& itemPathImpl, std::int64_t modificationTime, SymlinkHandling procSl) const = 0; //throw FileError
+ virtual void setModTime (const Zstring& itemPathImpl, std::int64_t modificationTime) const = 0; //throw FileError, follows symlinks
+ virtual void setModTimeSymlink(const Zstring& itemPathImpl, std::int64_t modificationTime) const = 0; //throw FileError
virtual AbstractPathRef getResolvedSymlinkPath(const Zstring& itemPathImpl) const = 0; //throw FileError
@@ -312,7 +320,7 @@ private:
//----------------------------------------------------------------------------------------------------------------
//- THREAD-SAFETY: must be thread-safe like an int! => no dangling references to this instance!
virtual IconLoader getAsyncIconLoader(const Zstring& itemPathImpl) const = 0; //noexcept!
- virtual std::function<bool()> /*noexcept*/ getAsyncCheckDirExists(const Zstring& itemPathImpl) const = 0; //noexcept
+ virtual std::function<bool()> /*throw FileError*/ getAsyncCheckDirExists(const Zstring& itemPathImpl) const = 0; //noexcept
//----------------------------------------------------------------------------------------------------------------
virtual std::unique_ptr<InputStream > getInputStream (const Zstring& itemPathImpl) const = 0; //throw FileError, ErrorFileLocked
virtual std::unique_ptr<OutputStream> getOutputStream(const Zstring& itemPathImpl, //throw FileError, ErrorTargetExisting
@@ -434,22 +442,24 @@ bool AbstractBaseFolder::havePathDependency(const AbstractBaseFolder& lhs, const
inline
-Zstring AbstractBaseFolder::appendPaths(const Zstring& basePath, const Zstring& relPath)
+Zstring AbstractBaseFolder::appendPaths(const Zstring& basePath, const Zstring& relPath, Zchar pathSep)
{
if (relPath.empty())
return basePath;
if (basePath.empty())
return relPath;
- if (!startsWith(relPath, FILE_NAME_SEPARATOR))
- return appendSeparator(basePath) + relPath;
-
- assert(false);
- if (relPath.size() == 1)
- return basePath;
+ if (startsWith(relPath, pathSep))
+ {
+ assert(false);
+ if (relPath.size() == 1)
+ return basePath;
- if (endsWith(basePath, FILE_NAME_SEPARATOR))
- return Zstring(basePath.begin(), basePath.end() - 1) + relPath;
+ if (endsWith(basePath, pathSep))
+ return basePath + (relPath.c_str() + 1);
+ }
+ else if (!endsWith(basePath, pathSep))
+ return basePath + pathSep + relPath;
return basePath + relPath;
}
@@ -485,7 +495,7 @@ inline
AbstractBaseFolder::FileId AbstractBaseFolder::OutputStream::finalize(const std::function<void()>& onUpdateStatus) //throw FileError
{
if (bytesExpected && bytesWritten != *bytesExpected)
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getDisplayPath(filePath_))),
+ throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getDisplayPath(filePath_))),
replaceCpy(replaceCpy(_("Unexpected size of data stream.\nExpected: %x bytes\nActual: %y bytes"), L"%x", numberTo<std::wstring>(*bytesExpected)), L"%y", numberTo<std::wstring>(bytesWritten)));
const FileId fileId = finalizeImpl(onUpdateStatus); //throw FileError
@@ -504,10 +514,10 @@ void AbstractBaseFolder::copyNewFolder(const AbstractPathRef& apSource, const Ab
//fall back:
if (copyFilePermissions)
- throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(getDisplayPath(apTarget))),
+ throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(getDisplayPath(apTarget))),
_("Operation not supported for different base folder types."));
- createNewFolder(apTarget); //throw FileError, ErrorTargetExisting
+ createFolderSimple(apTarget); //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
}
@@ -518,8 +528,8 @@ void AbstractBaseFolder::copySymlink(const AbstractPathRef& apSource, const Abst
return apSource.abf->copySymlinkForSameAbfType(apSource.itemPathImpl, apTarget, copyFilePermissions); //throw FileError
throw FileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."), L"%x",
- L"\n" + fmtFileName(getDisplayPath(apSource))), L"%y",
- L"\n" + fmtFileName(getDisplayPath(apTarget))), _("Operation not supported for different base folder types."));
+ L"\n" + fmtPath(getDisplayPath(apSource))), L"%y",
+ L"\n" + fmtPath(getDisplayPath(apTarget))), _("Operation not supported for different base folder types."));
}
@@ -530,8 +540,8 @@ void AbstractBaseFolder::renameItem(const AbstractPathRef& apSource, const Abstr
return apSource.abf->renameItemForSameAbfType(apSource.itemPathImpl, apTarget); //throw FileError, ErrorTargetExisting, ErrorDifferentVolume
throw ErrorDifferentVolume(replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x",
- L"\n" + fmtFileName(getDisplayPath(apSource))), L"%y",
- L"\n" + fmtFileName(getDisplayPath(apTarget))), _("Operation not supported for different base folder types."));
+ L"\n" + fmtPath(getDisplayPath(apSource))), L"%y",
+ L"\n" + fmtPath(getDisplayPath(apTarget))), _("Operation not supported for different base folder types."));
}
diff --git a/FreeFileSync/Source/fs/concrete.cpp b/FreeFileSync/Source/fs/concrete.cpp
index 7777955e..67605d03 100644
--- a/FreeFileSync/Source/fs/concrete.cpp
+++ b/FreeFileSync/Source/fs/concrete.cpp
@@ -8,6 +8,7 @@
#include "native.h"
#ifdef ZEN_WIN_VISTA_AND_LATER
#include "mtp.h"
+ #include "sftp.h"
#endif
using namespace zen;
@@ -24,14 +25,11 @@ std::unique_ptr<AbstractBaseFolder> zen::createAbstractBaseFolder(const Zstring&
#ifdef ZEN_WIN_VISTA_AND_LATER
if (acceptsFolderPathPhraseMtp(folderPathPhrase)) //noexcept
return createBaseFolderMtp(folderPathPhrase); //noexcept
+
+ if (acceptsFolderPathPhraseSftp(folderPathPhrase)) //noexcept
+ return createBaseFolderSftp(folderPathPhrase); //noexcept
#endif
//no idea? => native!
return createBaseFolderNative(folderPathPhrase);
}
-
-
-Zstring zen::getResolvedDisplayPath(const Zstring& folderPathPhrase) //noexcept
-{
- return ABF::getDisplayPath(createAbstractBaseFolder(folderPathPhrase)->getAbstractPath());
-}
diff --git a/FreeFileSync/Source/fs/concrete.h b/FreeFileSync/Source/fs/concrete.h
index dedbcf56..7b3d171c 100644
--- a/FreeFileSync/Source/fs/concrete.h
+++ b/FreeFileSync/Source/fs/concrete.h
@@ -12,8 +12,6 @@
namespace zen
{
std::unique_ptr<AbstractBaseFolder> createAbstractBaseFolder(const Zstring& folderPathPhrase); //noexcept
-
-Zstring getResolvedDisplayPath(const Zstring& folderPathPhrase); //noexcept
}
#endif //FS_CONCRETE_348787329573243
diff --git a/FreeFileSync/Source/fs/native.cpp b/FreeFileSync/Source/fs/native.cpp
index 11a1e535..3ddc397b 100644
--- a/FreeFileSync/Source/fs/native.cpp
+++ b/FreeFileSync/Source/fs/native.cpp
@@ -29,7 +29,7 @@ public:
RecycleSessionNative(const Zstring baseDirPathPf) : baseDirPathPf_(baseDirPathPf) {}
bool recycleItem(const AbstractPathRef& ap, const Zstring& logicalRelPath) override; //throw FileError
- void tryCleanup(const std::function<void (const Zstring& displayPath)>& notifyDeletionStatus) override; //throw FileError
+ void tryCleanup(const std::function<void (const std::wstring& displayPath)>& notifyDeletionStatus) override; //throw FileError
private:
#ifdef ZEN_WIN
@@ -50,12 +50,12 @@ void evalAttributeByHandle(FileHandle fh, const Zstring& filePath, Function eval
#ifdef ZEN_WIN
BY_HANDLE_FILE_INFORMATION fileInfo = {};
if (!::GetFileInformationByHandle(fh, &fileInfo))
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filePath)), L"GetFileInformationByHandle", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"GetFileInformationByHandle", getLastError());
#elif defined ZEN_LINUX || defined ZEN_MAC
struct ::stat fileInfo = {};
if (::fstat(fh, &fileInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filePath)), L"fstat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"fstat", getLastError());
#endif
evalFileInfo(fileInfo);
}
@@ -109,13 +109,13 @@ void preAllocateSpaceBestEffort(FileHandle fh, const std::uint64_t streamSize, c
fileSize, //__in LARGE_INTEGER liDistanceToMove,
nullptr, //__out_opt PLARGE_INTEGER lpNewFilePointer,
FILE_BEGIN)) //__in DWORD dwMoveMethod
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(displayPath)), L"SetFilePointerEx", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath)), L"SetFilePointerEx", getLastError());
if (!::SetEndOfFile(fh))
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(displayPath)), L"SetEndOfFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath)), L"SetEndOfFile", getLastError());
if (!::SetFilePointerEx(fh, {}, nullptr, FILE_BEGIN))
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(displayPath)), L"SetFilePointerEx", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath)), L"SetFilePointerEx", getLastError());
#elif defined ZEN_LINUX
//don't use potentially inefficient ::posix_fallocate!
@@ -143,7 +143,7 @@ void preAllocateSpaceBestEffort(FileHandle fh, const std::uint64_t streamSize, c
//https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/ftruncate.2.html
//=> file is extended with zeros, file offset is not changed
if (::ftruncate(fh, streamSize) != 0)
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(displayPath)), L"ftruncate", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayPath)), L"ftruncate", getLastError());
//F_PREALLOCATE + ftruncate seems optimal: http://adityaramesh.com/io_benchmark/
#endif
@@ -167,11 +167,12 @@ private:
struct OutputStreamNative : public AbstractBaseFolder::OutputStream
{
- OutputStreamNative(const Zstring& filePath, const AbstractPathRef& abstractFilePath, const std::uint64_t* streamSize, const std::int64_t* modTime) :
+ OutputStreamNative(FileOutput&& fop, const AbstractPathRef& abstractFilePath, const std::uint64_t* streamSize, const std::int64_t* modTime) :
OutputStream(abstractFilePath, streamSize),
- fo(filePath, FileOutput::ACC_CREATE_NEW) //throw FileError, ErrorTargetExisting
+ fo(std::move(fop)) //OutputStream takes ownership and deletes on errors!!!! => transactionally create output stream first if not existing!!
{
- if (modTime) modTime_ = *modTime;
+ if (modTime)
+ modTime_ = *modTime;
if (streamSize) //pre-allocate file space, because we can
preAllocateSpaceBestEffort(fo.getHandle(), *streamSize, fo.getFilePath()); //throw FileError
@@ -217,24 +218,9 @@ class NativeBaseFolder : public AbstractBaseFolder
public:
//itemPathImpl := native full item path as used by OS APIs
- NativeBaseFolder(const Zstring& baseDirPathIn) : baseDirPath(baseDirPathIn), baseDirPathPf(appendSeparator(baseDirPathIn)) {}
+ NativeBaseFolder(const Zstring& baseDirPathIn) : baseDirPath(baseDirPathIn) {}
- //- THREAD-SAFETY: must be thread-safe like an int! => no dangling references to this instance!
- std::function<void()> /*throw FileError*/ getAsyncConnectFolder(bool allowUserInteraction) const override //noexcept
- {
- const Zstring dirPath = baseDirPath; //help lambda capture syntax...
-
- return [dirPath, allowUserInteraction]()
- {
-#ifdef ZEN_WIN
- //login to network share, if necessary
- loginNetworkShare(dirPath, allowUserInteraction);
-#endif
- };
- };
- //----------------------------------------------------------------------------------------------------------------
-
- bool emptyBaseFolderPath() const override { return baseDirPath.empty(); };
+ bool emptyBaseFolderPath() const override { return baseDirPath.empty(); }
std::uint64_t getFreeDiskSpace() const override { return zen::getFreeDiskSpace(baseDirPath); } //throw FileError, returns 0 if not available
@@ -252,8 +238,8 @@ public:
std::unique_ptr<RecycleSession> createRecyclerSession() const override //throw FileError, return value must be bound!
{
assert(supportsRecycleBin(nullptr));
- return make_unique<RecycleSessionNative>(baseDirPathPf);
- };
+ return make_unique<RecycleSessionNative>(appendSeparator(baseDirPath));
+ }
static Zstring getItemPathImplForRecycler(const AbstractPathRef& ap)
{
@@ -263,28 +249,57 @@ public:
}
private:
- bool isNativeFileSystem() const override { return true; };
+ bool isNativeFileSystem() const override { return true; }
+
+ Zstring getInitPathPhrase() const override /*noexcept*/ { return baseDirPath; }
//- THREAD-SAFETY: expect accesses from multiple threads to the same instance => synchronize internally!!!
- Zstring getDisplayPath(const Zstring& itemPathImpl) const override { return itemPathImpl; }
+ std::wstring getDisplayPath(const Zstring& itemPathImpl) const override { return utfCvrtTo<std::wstring>(itemPathImpl); }
//- THREAD-SAFETY: expect accesses from multiple threads to the same instance => synchronize internally!!!
- Zstring appendRelPathToItemPathImpl(const Zstring& itemPathImpl, const Zstring& relPath) const override { return appendPaths(itemPathImpl, relPath); }
+ Zstring appendRelPathToItemPathImpl(const Zstring& itemPathImpl, const Zstring& relPath) const override { return appendPaths(itemPathImpl, relPath, FILE_NAME_SEPARATOR); }
//- THREAD-SAFETY: expect accesses from multiple threads to the same instance => synchronize internally!!!
Zstring getBasePathImpl() const override { return baseDirPath; }
- Zstring getFileShortName(const Zstring& itemPathImpl) const override { return afterLast(itemPathImpl, FILE_NAME_SEPARATOR); /*returns the whole string if term not found*/ }
+ //used during folder creation if parent folder is missing
+ Opt<Zstring> getParentFolderPathImpl(const Zstring& itemPathImpl) const override
+ {
+#ifdef ZEN_WIN
+ //remove trailing separator (even for C:\ root directories)
+ const Zstring itemPathFmt = endsWith(itemPathImpl, FILE_NAME_SEPARATOR) ?
+ beforeLast(itemPathImpl, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE) :
+ itemPathImpl;
+
+ const Zstring parentDir = beforeLast(itemPathFmt, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
+ if (parentDir.empty())
+ return NoValue();
+ if (parentDir.size() == 2 && isAlpha(parentDir[0]) && parentDir[1] == L':')
+ return appendSeparator(parentDir);
+
+#elif defined ZEN_LINUX || defined ZEN_MAC
+ if (itemPathImpl == "/")
+ return NoValue();
+
+ const Zstring parentDir = beforeLast(itemPathImpl, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
+ if (parentDir.empty())
+ return Zstring("/");
+#endif
+ return parentDir;
+ }
+
+ Zstring getFileShortName(const Zstring& itemPathImpl) const override { return afterLast(itemPathImpl, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL); }
bool lessItemPathSameAbfType(const Zstring& itemPathImplLhs, const AbstractPathRef& apRhs) const override { return LessFilePath()(itemPathImplLhs, getItemPathImpl(apRhs)); }
bool havePathDependencySameAbfType(const AbstractBaseFolder& other) const override
{
- const Zstring& lhs = baseDirPathPf;
- const Zstring& rhs = static_cast<const NativeBaseFolder&>(other).baseDirPathPf;
+ const Zstring& lhs = appendSeparator(baseDirPath);
+ const Zstring& rhs = appendSeparator(static_cast<const NativeBaseFolder&>(other).baseDirPath);
const size_t lenMin = std::min(lhs.length(), rhs.length());
- return cmpFilePath(strBegin(lhs), lenMin, strBegin(rhs), lenMin) == 0; //note: don't make this an equivalence relation!
+
+ return cmpFilePath(lhs.c_str(), lenMin, rhs.c_str(), lenMin) == 0; //note: don't make this an equivalence relation!
}
//----------------------------------------------------------------------------------------------------------------
@@ -293,19 +308,24 @@ private:
bool symlinkExists (const Zstring& itemPathImpl) const override { return zen::symlinkExists (itemPathImpl); } //noexcept
bool somethingExists(const Zstring& itemPathImpl) const override { return zen::somethingExists(itemPathImpl); } //noexcept
//----------------------------------------------------------------------------------------------------------------
- //should provide for single ATOMIC folder creation! creates recursively!
- void createNewFolder(const Zstring& itemPathImpl) const override { return zen::makeNewDirectory(itemPathImpl); } //throw FileError, ErrorTargetExisting
+
+ //should provide for single ATOMIC folder creation!
+ void createFolderSimple(const Zstring& itemPathImpl) const override
+ { copyNewDirectory(Zstring(), itemPathImpl, false /*copyFilePermissions*/); } //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
+
+ void removeFolderSimple(const Zstring& itemPathImpl) const override { zen::removeDirectorySimple(itemPathImpl); } //throw FileError
bool removeFile(const Zstring& itemPathImpl) const override { return zen::removeFile(itemPathImpl); } //throw FileError
- void removeFolder(const Zstring& itemPathImpl, //throw FileError
- const std::function<void (const Zstring& displayPath)>& onBeforeFileDeletion, //optional;
- const std::function<void (const Zstring& displayPath)>& onBeforeDirDeletion) const override { zen::removeDirectory(itemPathImpl, onBeforeFileDeletion, onBeforeDirDeletion); }
//----------------------------------------------------------------------------------------------------------------
- void setFileTime(const Zstring& itemPathImpl, std::int64_t modificationTime, SymlinkHandling procSl) const override
- { zen::setFileTime(itemPathImpl, modificationTime, procSl == SymlinkHandling::DIRECT ? ProcSymlink::DIRECT : ProcSymlink::FOLLOW); } //throw FileError
- AbstractPathRef getResolvedSymlinkPath(const Zstring& itemPathImpl) const override { return makeAbstractItem(*this, getResolvedFilePath(itemPathImpl)); }; //throw FileError
+ void setModTime(const Zstring& itemPathImpl, std::int64_t modificationTime) const override //throw FileError, follows symlinks
+ { zen::setFileTime(itemPathImpl, modificationTime, ProcSymlink::FOLLOW); } //throw FileError
+
+ void setModTimeSymlink(const Zstring& itemPathImpl, std::int64_t modificationTime) const override //throw FileError
+ { zen::setFileTime(itemPathImpl, modificationTime, ProcSymlink::DIRECT); } //throw FileError
+
+ AbstractPathRef getResolvedSymlinkPath(const Zstring& itemPathImpl) const override { return makeAbstractItem(*this, getResolvedFilePath(itemPathImpl)); } //throw FileError
Zstring getSymlinkContentBuffer(const Zstring& itemPathImpl) const override { return getSymlinkTargetRaw(itemPathImpl); } //throw FileError
@@ -321,15 +341,39 @@ private:
wl.getThumbnailImage = [itemPathImpl](int pixelSize) { return getThumbnailImage(itemPathImpl, pixelSize); }; //
return wl;
}
+
//- THREAD-SAFETY: must be thread-safe like an int! => no dangling references to this instance!
- std::function<bool()> getAsyncCheckDirExists(const Zstring& itemPathImpl) const override { return [itemPathImpl] { return zen::dirExists(itemPathImpl); }; } //noexcept
+ std::function<void()> /*throw FileError*/ getAsyncConnectFolder(bool allowUserInteraction) const override //noexcept
+ {
+ const Zstring dirPath = baseDirPath; //help lambda capture syntax...
+
+ return [dirPath, allowUserInteraction]()
+ {
+#ifdef ZEN_WIN
+ //login to network share, if necessary
+ loginNetworkShare(dirPath, allowUserInteraction);
+#endif
+ };
+ }
+
+ //- THREAD-SAFETY: must be thread-safe like an int! => no dangling references to this instance!
+ std::function<bool()> /*throw FileError*/ getAsyncCheckDirExists(const Zstring& itemPathImpl) const override //noexcept
+ {
+ warn_static("finish file error handling")
+
+ return [itemPathImpl] { return zen::dirExists(itemPathImpl); };
+ }
//----------------------------------------------------------------------------------------------------------------
//return value always bound:
std::unique_ptr<InputStream > getInputStream (const Zstring& itemPathImpl) const override { return make_unique<InputStreamNative >(itemPathImpl); } //throw FileError, ErrorFileLocked
std::unique_ptr<OutputStream> getOutputStream(const Zstring& itemPathImpl, //throw FileError, ErrorTargetExisting
const std::uint64_t* streamSize, //optional
const std::int64_t* modificationTime) const override //
- { return make_unique<OutputStreamNative>(itemPathImpl, makeAbstractItem(*this, itemPathImpl), streamSize, modificationTime); } //throw FileError, ErrorTargetExisting
+ {
+ //AbstractBaseFolder::OutputStream takes ownership and deletes on errors!!!! => transactionally create output stream first!!
+ auto&& fop = FileOutput(itemPathImpl, FileOutput::ACC_CREATE_NEW); //throw FileError, ErrorTargetExisting
+ return make_unique<OutputStreamNative>(std::move(fop), makeAbstractItem(*this, itemPathImpl), streamSize, modificationTime); //throw FileError
+ }
//----------------------------------------------------------------------------------------------------------------
//- THREAD-SAFETY: expect accesses from multiple threads to the same instance => synchronize internally!!!
void traverseFolder(const Zstring& itemPathImpl, TraverserCallback& sink) const override { DirTraverser::execute(itemPathImpl, sink); }
@@ -362,7 +406,6 @@ private:
bool supportsPermissions() const override { return zen::supportsPermissions(baseDirPath); } //throw FileError
const Zstring baseDirPath;
- const Zstring baseDirPathPf;
};
//===========================================================================================================================
@@ -406,10 +449,15 @@ Zstring RecycleSessionNative::getOrCreateRecyclerTempDirPf() //throw FileError
for (int i = 0;; ++i)
try
{
- makeNewDirectory(dirpath); //throw FileError, ErrorTargetExisting
+ copyNewDirectory(Zstring(), dirpath, false /*copyFilePermissions*/); //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
return dirpath;
}
- catch (const ErrorTargetExisting&)
+ catch (ErrorTargetPathMissing&)
+ {
+ assert(false); //unexpected: base directory should have been created already!
+ throw;
+ }
+ catch (ErrorTargetExisting&)
{
if (i == 10) throw; //avoid endless recursion in pathological cases
dirpath = baseDirPathPf_ + Zstr("RecycleBin") + Zchar('_') + numberTo<Zstring>(i) + ABF::TEMP_FILE_ENDING;
@@ -455,10 +503,10 @@ bool RecycleSessionNative::recycleItem(const AbstractPathRef& ap, const Zstring&
{
if (somethingExists(itemPath))
{
- const Zstring tmpParentDir = beforeLast(tmpPath, FILE_NAME_SEPARATOR); //what if C:\ ?
+ const Zstring tmpParentDir = beforeLast(tmpPath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE); //what if C:\ ?
if (!somethingExists(tmpParentDir))
{
- makeNewDirectory(tmpParentDir); //throw FileError -> may legitimately fail on Linux if permissions are missing
+ makeDirectoryRecursively(tmpParentDir); //throw FileError
moveToTempDir(); //throw FileError -> this should work now!
}
else
@@ -473,7 +521,7 @@ bool RecycleSessionNative::recycleItem(const AbstractPathRef& ap, const Zstring&
}
-void RecycleSessionNative::tryCleanup(const std::function<void (const Zstring& displayPath)>& notifyDeletionStatus) //throw FileError
+void RecycleSessionNative::tryCleanup(const std::function<void (const std::wstring& displayPath)>& notifyDeletionStatus) //throw FileError
{
#ifdef ZEN_WIN
if (!toBeRecycled.empty())
@@ -486,7 +534,7 @@ void RecycleSessionNative::tryCleanup(const std::function<void (const Zstring& d
//clean up temp directory itself (should contain remnant empty directories only)
if (!recyclerTmpDir.empty())
{
- removeDirectory(recyclerTmpDir); //throw FileError
+ removeDirectoryRecursively(recyclerTmpDir); //throw FileError
recyclerTmpDir.clear();
}
#endif
@@ -520,8 +568,8 @@ bool zen::acceptsFolderPathPhraseNative(const Zstring& folderPathPhrase) //noexc
//UNC path
if (startsWith(path, L"\\\\"))
{
- const Zstring server = beforeFirst<Zstring>(path.c_str() + 2, FILE_NAME_SEPARATOR); //returns the whole string if term not found
- const Zstring share = afterFirst <Zstring>(path.c_str() + 2, FILE_NAME_SEPARATOR); //returns empty string if term not found
+ const Zstring server = beforeFirst<Zstring>(path.c_str() + 2, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL);
+ const Zstring share = afterFirst <Zstring>(path.c_str() + 2, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
if (!server.empty() && !share.empty())
return true;
//don't accept paths missing the shared folder! (see drag & drop validation!)
diff --git a/FreeFileSync/Source/fs/native_traverser_impl.h b/FreeFileSync/Source/fs/native_traverser_impl.h
index 30f7fcf8..0a802f32 100644
--- a/FreeFileSync/Source/fs/native_traverser_impl.h
+++ b/FreeFileSync/Source/fs/native_traverser_impl.h
@@ -71,40 +71,40 @@ private:
DIR* dirObj = ::opendir(dirPath.c_str()); //directory must NOT end with path separator, except "/"
if (!dirObj)
- throwFileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(dirPath)), L"opendir", getLastError());
+ throwFileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtPath(dirPath)), L"opendir", getLastError());
ZEN_ON_SCOPE_EXIT(::closedir(dirObj)); //never close nullptr handles! -> crash
for (;;)
{
struct ::dirent* dirEntry = nullptr;
if (::readdir_r(dirObj, reinterpret_cast< ::dirent*>(&buffer[0]), &dirEntry) != 0)
- throwFileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirPath)), L"readdir_r", getLastError());
+ throwFileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtPath(dirPath)), L"readdir_r", getLastError());
//don't retry but restart dir traversal on error! http://blogs.msdn.com/b/oldnewthing/archive/2014/06/12/10533529.aspx
if (!dirEntry) //no more items
return;
//don't return "." and ".."
- const char* shortName = dirEntry->d_name; //evaluate dirEntry *before* going into recursion => we use a single "buffer"!
+ const char* itemName = dirEntry->d_name; //evaluate dirEntry *before* going into recursion => we use a single "buffer"!
- if (shortName[0] == 0) throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirPath)), L"readdir_r: Data corruption, found item without name.");
- if (shortName[0] == '.' &&
- (shortName[1] == 0 || (shortName[1] == '.' && shortName[2] == 0)))
+ if (itemName[0] == 0) throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtPath(dirPath)), L"readdir_r: Data corruption; item is missing a name.");
+ if (itemName[0] == '.' &&
+ (itemName[1] == 0 || (itemName[1] == '.' && itemName[2] == 0)))
continue;
- const Zstring& itempath = appendSeparator(dirPath) + shortName;
+ const Zstring& itemPath = appendSeparator(dirPath) + itemName;
struct ::stat statData = {};
if (!tryReportingItemError([&]
{
- if (::lstat(itempath.c_str(), &statData) != 0) //lstat() does not resolve symlinks
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(itempath)), L"lstat", getLastError());
- }, sink, shortName))
+ if (::lstat(itemPath.c_str(), &statData) != 0) //lstat() does not resolve symlinks
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(itemPath)), L"lstat", getLastError());
+ }, sink, itemName))
continue; //ignore error: skip file
if (S_ISLNK(statData.st_mode)) //on Linux there is no distinction between file and directory symlinks!
{
- const ABF::TraverserCallback::SymlinkInfo linkInfo = { shortName, statData.st_mtime };
+ const ABF::TraverserCallback::SymlinkInfo linkInfo = { itemName, statData.st_mtime };
switch (sink.onSymlink(linkInfo))
{
@@ -112,25 +112,23 @@ private:
{
//try to resolve symlink (and report error on failure!!!)
struct ::stat statDataTrg = {};
+
bool validLink = tryReportingItemError([&]
{
- if (::stat(itempath.c_str(), &statDataTrg) != 0)
- throwFileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(itempath)), L"stat", getLastError());
- }, sink, shortName);
+ if (::stat(itemPath.c_str(), &statDataTrg) != 0)
+ throwFileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(itemPath)), L"stat", getLastError());
+ }, sink, itemName);
if (validLink)
{
if (S_ISDIR(statDataTrg.st_mode)) //a directory
{
- if (ABF::TraverserCallback* trav = sink.onDir({ shortName }))
- {
- ZEN_ON_SCOPE_EXIT(sink.releaseDirTraverser(trav));
- traverse(itempath, *trav);
- }
+ if (std::unique_ptr<ABF::TraverserCallback> trav = sink.onDir({ itemName }))
+ traverse(itemPath, *trav);
}
else //a file or named pipe, ect.
{
- ABF::TraverserCallback::FileInfo fi = { shortName, makeUnsigned(statDataTrg.st_size), statDataTrg.st_mtime, convertToAbstractFileId(extractFileId(statDataTrg)), &linkInfo };
+ ABF::TraverserCallback::FileInfo fi = { itemName, makeUnsigned(statDataTrg.st_size), statDataTrg.st_mtime, convertToAbstractFileId(extractFileId(statDataTrg)), &linkInfo };
sink.onFile(fi);
}
}
@@ -144,15 +142,12 @@ private:
}
else if (S_ISDIR(statData.st_mode)) //a directory
{
- if (ABF::TraverserCallback* trav = sink.onDir({ shortName }))
- {
- ZEN_ON_SCOPE_EXIT(sink.releaseDirTraverser(trav));
- traverse(itempath, *trav);
- }
+ if (std::unique_ptr<ABF::TraverserCallback> trav = sink.onDir({ itemName }))
+ traverse(itemPath, *trav);
}
else //a file or named pipe, ect.
{
- ABF::TraverserCallback::FileInfo fi = { shortName, makeUnsigned(statData.st_size), statData.st_mtime, convertToAbstractFileId(extractFileId(statData)), nullptr };
+ ABF::TraverserCallback::FileInfo fi = { itemName, makeUnsigned(statData.st_size), statData.st_mtime, convertToAbstractFileId(extractFileId(statData)), nullptr /*symlinkInfo*/ };
sink.onFile(fi);
}
/*
diff --git a/FreeFileSync/Source/lib/db_file.cpp b/FreeFileSync/Source/lib/db_file.cpp
index bcc30f3e..b4441604 100644
--- a/FreeFileSync/Source/lib/db_file.cpp
+++ b/FreeFileSync/Source/lib/db_file.cpp
@@ -113,11 +113,11 @@ DbStreams loadStreams(const AbstractPathRef& dbPath, const std::function<void(st
readArray(streamIn, formatDescr, sizeof(formatDescr)); //throw UnexpectedEndOfStreamError
if (!std::equal(FILE_FORMAT_DESCR, FILE_FORMAT_DESCR + sizeof(FILE_FORMAT_DESCR), formatDescr))
- throw FileError(replaceCpy(_("Database file %x is incompatible."), L"%x", fmtFileName(ABF::getDisplayPath(dbPath))));
+ throw FileError(replaceCpy(_("Database file %x is incompatible."), L"%x", fmtPath(ABF::getDisplayPath(dbPath))));
const int version = readNumber<std::int32_t>(streamIn); //throw UnexpectedEndOfStreamError
if (version != DB_FORMAT_CONTAINER) //read file format version number
- throw FileError(replaceCpy(_("Database file %x is incompatible."), L"%x", fmtFileName(ABF::getDisplayPath(dbPath))));
+ throw FileError(replaceCpy(_("Database file %x is incompatible."), L"%x", fmtPath(ABF::getDisplayPath(dbPath))));
DbStreams output;
@@ -137,16 +137,16 @@ DbStreams loadStreams(const AbstractPathRef& dbPath, const std::function<void(st
{
if (!ABF::somethingExists(dbPath)) //a benign(?) race condition with FileError
throw FileErrorDatabaseNotExisting(_("Initial synchronization:") + L" \n" +
- replaceCpy(_("Database file %x does not yet exist."), L"%x", fmtFileName(ABF::getDisplayPath(dbPath))));
+ replaceCpy(_("Database file %x does not yet exist."), L"%x", fmtPath(ABF::getDisplayPath(dbPath))));
throw;
}
catch (UnexpectedEndOfStreamError&)
{
- throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(ABF::getDisplayPath(dbPath)));
+ throw FileError(_("Database file is corrupt:") + L"\n" + fmtPath(ABF::getDisplayPath(dbPath)));
}
catch (const std::bad_alloc& e) //still required?
{
- throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(ABF::getDisplayPath(dbPath)),
+ throw FileError(_("Database file is corrupt:") + L"\n" + fmtPath(ABF::getDisplayPath(dbPath)),
_("Out of memory.") + L" " + utfCvrtTo<std::wstring>(e.what()));
}
}
@@ -157,8 +157,8 @@ class StreamGenerator //for db-file back-wards compatibility we stick with two o
{
public:
static void execute(const InSyncDir& dir, //throw FileError
- const Zstring& displayFilePathL, //used for diagnostics only
- const Zstring& displayFilePathR,
+ const std::wstring& displayFilePathL, //used for diagnostics only
+ const std::wstring& displayFilePathR,
ByteArray& streamL,
ByteArray& streamR)
{
@@ -168,7 +168,7 @@ public:
generator.recurse(dir);
//PERF_STOP
- auto compStream = [](const ByteArray& stream, const Zstring& displayFilePath) -> ByteArray //throw FileError
+ auto compStream = [](const ByteArray& stream, const std::wstring& displayFilePath) -> ByteArray //throw FileError
{
try
{
@@ -188,13 +188,13 @@ public:
}
catch (ZlibInternalError&)
{
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(displayFilePath)), L"zlib internal error");
+ throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(displayFilePath)), L"zlib internal error");
}
};
const ByteArray tmpL = compStream(generator.outputLeft .ref(), displayFilePathL);
const ByteArray tmpR = compStream(generator.outputRight.ref(), displayFilePathR);
- const ByteArray tmpB = compStream(generator.outputBoth .ref(), displayFilePathL + Zstr("/") + displayFilePathR);
+ const ByteArray tmpB = compStream(generator.outputBoth .ref(), displayFilePathL + L"/" + displayFilePathR);
MemStreamOut outL;
MemStreamOut outR;
@@ -282,10 +282,10 @@ class StreamParser
public:
static std::shared_ptr<InSyncDir> execute(const ByteArray& streamL, //throw FileError
const ByteArray& streamR,
- const Zstring& displayFilePathL, //used for diagnostics only
- const Zstring& displayFilePathR)
+ const std::wstring& displayFilePathL, //used for diagnostics only
+ const std::wstring& displayFilePathR)
{
- auto decompStream = [](const ByteArray& stream, const Zstring& displayFilePath) -> ByteArray //throw FileError
+ auto decompStream = [](const ByteArray& stream, const std::wstring& displayFilePath) -> ByteArray //throw FileError
{
try
{
@@ -293,7 +293,7 @@ public:
}
catch (ZlibInternalError&)
{
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(displayFilePath)), L"zlib internal error");
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(displayFilePath)), L"zlib internal error");
}
};
@@ -306,18 +306,18 @@ public:
const int streamVersionR = readNumber<std::int32_t>(inR); //
if (streamVersionL != streamVersionR)
- throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(displayFilePathL) + L"\n" + fmtFileName(displayFilePathR), L"different stream formats");
+ throw FileError(_("Database file is corrupt:") + L"\n" + fmtPath(displayFilePathL) + L"\n" + fmtPath(displayFilePathR), L"different stream formats");
warn_static("remove check for stream version 1 after migration! 2015-05-02")
if (streamVersionL != 1 &&
streamVersionL != DB_FORMAT_STREAM)
- throw FileError(replaceCpy(_("Database file %x is incompatible."), L"%x", fmtFileName(displayFilePathL)), L"unknown stream format");
+ throw FileError(replaceCpy(_("Database file %x is incompatible."), L"%x", fmtPath(displayFilePathL)), L"unknown stream format");
const bool has1stPartL = readNumber<std::int8_t>(inL) != 0; //throw UnexpectedEndOfStreamError
const bool has1stPartR = readNumber<std::int8_t>(inR) != 0; //
if (has1stPartL == has1stPartR)
- throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(displayFilePathL) + L"\n" + fmtFileName(displayFilePathR), L"second part missing");
+ throw FileError(_("Database file is corrupt:") + L"\n" + fmtPath(displayFilePathL) + L"\n" + fmtPath(displayFilePathR), L"second part missing");
MemStreamIn& in1stPart = has1stPartL ? inL : inR;
MemStreamIn& in2ndPart = has1stPartL ? inR : inL;
@@ -337,17 +337,17 @@ public:
StreamParser parser(streamVersionL,
decompStream(tmpL, displayFilePathL),
decompStream(tmpR, displayFilePathR),
- decompStream(tmpB, displayFilePathL + Zstr("/") + displayFilePathR));
+ decompStream(tmpB, displayFilePathL + L"/" + displayFilePathR));
parser.recurse(*output); //throw UnexpectedEndOfStreamError
return output;
}
catch (const UnexpectedEndOfStreamError&)
{
- throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(displayFilePathL) + L"\n" + fmtFileName(displayFilePathR));
+ throw FileError(_("Database file is corrupt:") + L"\n" + fmtPath(displayFilePathL) + L"\n" + fmtPath(displayFilePathR));
}
catch (const std::bad_alloc& e)
{
- throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(displayFilePathL) + L"\n" + fmtFileName(displayFilePathR),
+ throw FileError(_("Database file is corrupt:") + L"\n" + fmtPath(displayFilePathL) + L"\n" + fmtPath(displayFilePathR),
_("Out of memory.") + L" " + utfCvrtTo<std::wstring>(e.what()));
}
}
@@ -682,7 +682,7 @@ std::shared_ptr<InSyncDir> zen::loadLastSynchronousState(const BaseDirPair& base
//https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3531351&group_id=234430
const AbstractPathRef filePath = !baseDirObj.isExisting<LEFT_SIDE>() ? dbPathLeft : dbPathRight;
throw FileErrorDatabaseNotExisting(_("Initial synchronization:") + L" \n" + //it could be due to a to-be-created target directory not yet existing => FileErrorDatabaseNotExisting
- replaceCpy(_("Database file %x does not yet exist."), L"%x", fmtFileName(ABF::getDisplayPath(filePath))));
+ replaceCpy(_("Database file %x does not yet exist."), L"%x", fmtPath(ABF::getDisplayPath(filePath))));
}
//read file data: list of session ID + DirInfo-stream
diff --git a/FreeFileSync/Source/lib/dir_exist_async.h b/FreeFileSync/Source/lib/dir_exist_async.h
index 0341a216..4e376d8b 100644
--- a/FreeFileSync/Source/lib/dir_exist_async.h
+++ b/FreeFileSync/Source/lib/dir_exist_async.h
@@ -56,48 +56,48 @@ DirectoryStatus checkFolderExistenceUpdating(const std::set<const ABF*, ABF::Les
for (const ABF* baseFolder : baseFolders)
if (!baseFolder->emptyBaseFolderPath()) //skip empty dirs
{
- AbstractPathRef apr = baseFolder->getAbstractPath(Zstring());
+ AbstractPathRef folderPath = baseFolder->getAbstractPath(Zstring());
std::function<void()> connectFolder /*throw FileError*/ = baseFolder->getAsyncConnectFolder(allowUserInteraction); //noexcept
- std::function<bool()> dirExists /*noexcept*/ = ABF::getAsyncCheckDirExists(apr); //noexcept
+ std::function<bool()> dirExists /*throw FileError*/ = ABF::getAsyncCheckDirExists(folderPath); //noexcept
- futureInfo.emplace_back(baseFolder, async([connectFolder, dirExists]
+ futureInfo.emplace_back(baseFolder, runAsync([connectFolder, dirExists]
{
- //1. login to network share, open FTP connection, ect.
- if (connectFolder)
- try
- {
+ try
+ {
+ //1. login to network share, open FTP connection, ect.
+ if (connectFolder)
connectFolder(); //throw FileError
- }
- catch (const FileError& e)
- {
- return DirCheckResult(false, make_unique<FileError>(e));
- }
-
- //2. check dir existence
- assert(dirExists);
- return DirCheckResult(dirExists ? dirExists() : false, nullptr);
+
+ //2. check dir existence
+ return DirCheckResult(dirExists(), nullptr); //throw FileError
+ }
+ catch (const FileError& e)
+ {
+ return DirCheckResult(false, make_unique<FileError>(e));
+ }
}));
}
//don't wait (almost) endlessly like win32 would on non-existing network shares:
- const boost::system_time endTime = boost::get_system_time() + boost::posix_time::seconds(20); //consider CD-rom insert or hard disk spin up time from sleep
+ boost::chrono::steady_clock::time_point endTime = boost::chrono::steady_clock::now() + boost::chrono::seconds(20); //consider CD-rom insert or hard disk spin up time from sleep
for (auto& fi : futureInfo)
{
- const std::wstring& displayPathFmt = fmtFileName(ABF::getDisplayPath(fi.first->getAbstractPath(Zstring())));
+ const std::wstring& displayPathFmt = fmtPath(ABF::getDisplayPath(fi.first->getAbstractPath(Zstring())));
procCallback.reportStatus(replaceCpy(_("Searching for folder %x..."), L"%x", displayPathFmt)); //may throw!
- while (boost::get_system_time() < endTime &&
- !fi.second.timed_wait(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL / 2)))
+ while (boost::chrono::steady_clock::now() < endTime &&
+ fi.second.wait_for(boost::chrono::milliseconds(UI_UPDATE_INTERVAL / 2)) != boost::future_status::ready)
procCallback.requestUiRefresh(); //may throw!
if (fi.second.is_ready())
{
- if (fi.second.get().error)
- output.failedChecks.emplace(fi.first, *fi.second.get().error);
- else if (fi.second.get().exists)
+ const DirCheckResult result = fi.second.get(); //call future::get() only *once*! otherwise: undefined behavior!
+ if (result.error)
+ output.failedChecks.emplace(fi.first, *result.error);
+ else if (result.exists)
output.existingBaseFolder.insert(fi.first);
else
output.missingBaseFolder.insert(fi.first);
diff --git a/FreeFileSync/Source/lib/dir_lock.cpp b/FreeFileSync/Source/lib/dir_lock.cpp
index 90c2f5c8..1dc7b8df 100644
--- a/FreeFileSync/Source/lib/dir_lock.cpp
+++ b/FreeFileSync/Source/lib/dir_lock.cpp
@@ -48,7 +48,7 @@ const int LOCK_FORMAT_VER = 2; //lock file format version
using MemStreamOut = MemoryStreamOut<ByteArray>;
using MemStreamIn = MemoryStreamIn <ByteArray>;
-}
+
//worker thread
class LifeSigns
@@ -61,9 +61,9 @@ public:
{
try
{
- while (true)
+ for (;;)
{
- boost::this_thread::sleep(boost::posix_time::seconds(EMIT_LIFE_SIGN_INTERVAL)); //interruption point!
+ boost::this_thread::sleep_for(boost::chrono::seconds(EMIT_LIFE_SIGN_INTERVAL)); //throw boost::thread_interrupted
//actual work
emitLifeSign(); //throw ()
@@ -77,7 +77,6 @@ public:
void emitLifeSign() const //try to append one byte...; throw()
{
- const char buffer[1] = {' '};
#ifdef ZEN_WIN
try { activatePrivilege(SE_BACKUP_NAME); }
catch (const FileError&) {}
@@ -107,7 +106,7 @@ public:
DWORD bytesWritten = 0; //this parameter is NOT optional: http://blogs.msdn.com/b/oldnewthing/archive/2013/04/04/10407417.aspx
if (!::WriteFile(fileHandle, //_In_ HANDLE hFile,
- buffer, //_In_ LPCVOID lpBuffer,
+ " ", //_In_ LPCVOID lpBuffer,
1, //_In_ DWORD nNumberOfBytesToWrite,
&bytesWritten, //_Out_opt_ LPDWORD lpNumberOfBytesWritten,
nullptr)) //_Inout_opt_ LPOVERLAPPED lpOverlapped
@@ -119,7 +118,7 @@ public:
return;
ZEN_ON_SCOPE_EXIT(::close(fileHandle));
- const ssize_t bytesWritten = ::write(fileHandle, buffer, 1);
+ const ssize_t bytesWritten = ::write(fileHandle, " ", 1);
(void)bytesWritten;
#endif
}
@@ -129,15 +128,13 @@ private:
};
-namespace
-{
std::uint64_t getLockFileSize(const Zstring& filepath) //throw FileError
{
#ifdef ZEN_WIN
WIN32_FIND_DATA fileInfo = {};
const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filepath).c_str(), &fileInfo);
if (searchHandle == INVALID_HANDLE_VALUE)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filepath)), L"FindFirstFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filepath)), L"FindFirstFile", getLastError());
::FindClose(searchHandle);
return get64BitUInt(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
@@ -145,20 +142,20 @@ std::uint64_t getLockFileSize(const Zstring& filepath) //throw FileError
#elif defined ZEN_LINUX || defined ZEN_MAC
struct ::stat fileInfo = {};
if (::stat(filepath.c_str(), &fileInfo) != 0) //follow symbolic links
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filepath)), L"stat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filepath)), L"stat", getLastError());
return fileInfo.st_size;
#endif
}
-Zstring deleteAbandonedLockName(const Zstring& lockfilepath) //make sure to NOT change file ending!
+Zstring abandonedLockDeletionName(const Zstring& lockfilepath) //make sure to NOT change file ending!
{
const size_t pos = lockfilepath.rfind(FILE_NAME_SEPARATOR); //search from end
return pos == Zstring::npos ? Zstr("Del.") + lockfilepath :
Zstring(lockfilepath.c_str(), pos + 1) + //include path separator
Zstr("Del.") +
- afterLast(lockfilepath, FILE_NAME_SEPARATOR); //returns the whole string if ch not found
+ afterLast(lockfilepath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL);
}
@@ -382,7 +379,7 @@ LockInformation retrieveLockInfo(const Zstring& lockfilepath) //throw FileError
}
catch (UnexpectedEndOfStreamError&)
{
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(lockfilepath)), L"unexpected end of stream");
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(lockfilepath)), L"unexpected end of stream");
}
}
@@ -425,7 +422,7 @@ const std::int64_t TICKS_PER_SEC = ticksPerSec(); //= 0 on error
void waitOnDirLock(const Zstring& lockfilepath, DirLockCallback* callback) //throw FileError
{
- std::wstring infoMsg = _("Waiting while directory is locked:") + L' ' + fmtFileName(lockfilepath);
+ std::wstring infoMsg = _("Waiting while directory is locked:") + L' ' + fmtPath(lockfilepath);
if (callback)
callback->reportStatus(infoMsg);
@@ -458,7 +455,7 @@ void waitOnDirLock(const Zstring& lockfilepath, DirLockCallback* callback) //thr
std::uint64_t fileSizeOld = 0;
TickVal lastLifeSign = getTicks();
- while (true)
+ for (;;)
{
const TickVal now = getTicks();
const std::uint64_t fileSizeNew = ::getLockFileSize(lockfilepath); //throw FileError
@@ -475,7 +472,7 @@ void waitOnDirLock(const Zstring& lockfilepath, DirLockCallback* callback) //thr
if (lockOwnderDead || //no need to wait any longer...
dist(lastLifeSign, now) / TICKS_PER_SEC > DETECT_ABANDONED_INTERVAL)
{
- DirLock dummy(deleteAbandonedLockName(lockfilepath), callback); //throw FileError
+ DirLock dummy(abandonedLockDeletionName(lockfilepath), callback); //throw FileError
//now that the lock is in place check existence again: meanwhile another process may have deleted and created a new lock!
@@ -495,7 +492,7 @@ void waitOnDirLock(const Zstring& lockfilepath, DirLockCallback* callback) //thr
for (size_t i = 0; i < 1000 * POLL_LIFE_SIGN_INTERVAL / GUI_CALLBACK_INTERVAL; ++i)
{
if (callback) callback->requestUiRefresh();
- boost::this_thread::sleep(boost::posix_time::milliseconds(GUI_CALLBACK_INTERVAL));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(GUI_CALLBACK_INTERVAL)); //throw boost::thread_interrupted
if (callback)
{
@@ -554,7 +551,7 @@ bool tryLock(const Zstring& lockfilepath) //throw FileError
lastError == ERROR_ALREADY_EXISTS) //comment on msdn claims, this one is used on Windows Mobile 6
return false;
else
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(lockfilepath)), L"CreateFile", lastError);
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(lockfilepath)), L"CreateFile", lastError);
}
ScopeGuard guardLockFile = zen::makeGuard([&] { removeFile(lockfilepath); });
FileOutput fileOut(fileHandle, lockfilepath); //pass handle ownership
@@ -574,7 +571,7 @@ bool tryLock(const Zstring& lockfilepath) //throw FileError
if (errno == EEXIST)
return false;
else
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(lockfilepath)), L"open", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(lockfilepath)), L"open", getLastError());
}
ScopeGuard guardLockFile = zen::makeGuard([&] { removeFile(lockfilepath); });
FileOutput fileOut(fileHandle, lockfilepath); //pass handle ownership
@@ -612,7 +609,7 @@ public:
~SharedDirLock()
{
threadObj.interrupt(); //thread lifetime is subset of this instances's life
- threadObj.join(); //we assert precondition "threadObj.joinable()"!!!
+ threadObj.join(); //throw boost::thread_interrupted -> not expected => main thread!
::releaseLock(lockfilepath_); //throw ()
}
@@ -683,7 +680,7 @@ private:
return iterLock != guidToLock.end() ? iterLock->second.lock() : nullptr; //try to get shared_ptr; throw()
}
- void tidyUp() //remove obsolete lock entries
+ void tidyUp() //remove obsolete entries
{
map_remove_if(guidToLock, [ ](const GuidToLockMap::value_type& v) { return !v.second.lock(); });
map_remove_if(fileToGuid, [&](const FileToGuidMap::value_type& v) { return guidToLock.find(v.second) == guidToLock.end(); });
@@ -697,7 +694,7 @@ private:
DirLock::DirLock(const Zstring& lockfilepath, DirLockCallback* callback) //throw FileError
{
if (callback)
- callback->reportStatus(replaceCpy(_("Creating file %x"), L"%x", fmtFileName(lockfilepath)));
+ callback->reportStatus(replaceCpy(_("Creating file %x"), L"%x", fmtPath(lockfilepath)));
#ifdef ZEN_WIN
const DWORD bufferSize = 10000;
diff --git a/FreeFileSync/Source/lib/ffs_paths.cpp b/FreeFileSync/Source/lib/ffs_paths.cpp
index 1c58ce28..818b3763 100644
--- a/FreeFileSync/Source/lib/ffs_paths.cpp
+++ b/FreeFileSync/Source/lib/ffs_paths.cpp
@@ -27,7 +27,7 @@ namespace
inline
Zstring getExecutableDir() //directory containing executable WITH path separator at end
{
- return appendSeparator(beforeLast(utfCvrtTo<Zstring>(wxStandardPaths::Get().GetExecutablePath()), FILE_NAME_SEPARATOR));
+ return appendSeparator(beforeLast(utfCvrtTo<Zstring>(wxStandardPaths::Get().GetExecutablePath()), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE));
}
#endif
@@ -35,7 +35,7 @@ Zstring getExecutableDir() //directory containing executable WITH path separator
inline
Zstring getInstallDir() //root install directory WITH path separator at end
{
- return appendSeparator(beforeLast(beforeLast(getExecutableDir(), FILE_NAME_SEPARATOR), FILE_NAME_SEPARATOR));
+ return appendSeparator(beforeLast(beforeLast(getExecutableDir(), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE));
}
#endif
@@ -102,16 +102,14 @@ Zstring zen::getConfigDir()
//portable apps do not seem common on OS - fine with me: http://theocacao.com/document.page/319
#endif
//use OS' standard paths
- Zstring userDirectory = toZ(wxStandardPathsBase::Get().GetUserDataDir());
-
- if (!dirExists(userDirectory))
- try
- {
- makeNewDirectory(userDirectory); //throw FileError
- }
- catch (const FileError&) { assert(false); }
-
- return appendSeparator(userDirectory);
+ Zstring configDirPath = toZ(wxStandardPathsBase::Get().GetUserDataDir());
+ try
+ {
+ makeDirectoryRecursively(configDirPath); //throw FileError
+ }
+ catch (const FileError&) { assert(false); }
+
+ return appendSeparator(configDirPath);
}
diff --git a/FreeFileSync/Source/lib/generate_logfile.h b/FreeFileSync/Source/lib/generate_logfile.h
index 6bae0a1c..60f33126 100644
--- a/FreeFileSync/Source/lib/generate_logfile.h
+++ b/FreeFileSync/Source/lib/generate_logfile.h
@@ -44,8 +44,8 @@ Zstring getLastSyncsLogfilePath();
struct OnUpdateLogfileStatusNoThrow
{
- OnUpdateLogfileStatusNoThrow(ProcessCallback& pc, const Zstring& logfileDisplayPath) : pc_(pc), logfileDisplayPath_(logfileDisplayPath),
- msg(replaceCpy(_("Saving file %x..."), L"%x", fmtFileName(logfileDisplayPath_))) {}
+ OnUpdateLogfileStatusNoThrow(ProcessCallback& pc, const std::wstring& logfileDisplayPath) : pc_(pc),
+ msg(replaceCpy(_("Saving file %x..."), L"%x", fmtPath(logfileDisplayPath))) {}
void operator()(std::int64_t bytesDelta)
{
@@ -56,7 +56,6 @@ struct OnUpdateLogfileStatusNoThrow
private:
ProcessCallback& pc_;
- const Zstring logfileDisplayPath_;
std::int64_t bytesWritten = 0;
const std::wstring msg;
};
diff --git a/FreeFileSync/Source/lib/hard_filter.cpp b/FreeFileSync/Source/lib/hard_filter.cpp
index d74f349e..d2313f88 100644
--- a/FreeFileSync/Source/lib/hard_filter.cpp
+++ b/FreeFileSync/Source/lib/hard_filter.cpp
@@ -66,7 +66,7 @@ void addFilterEntry(const Zstring& filterPhrase, std::vector<Zstring>& masksFile
if (endsWith(phrase, FILE_NAME_SEPARATOR) || //only relevant for folder filtering
endsWith(phrase, sepAsterisk)) // abc\*
{
- const Zstring dirPhrase = beforeLast(phrase, FILE_NAME_SEPARATOR);
+ const Zstring dirPhrase = beforeLast(phrase, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
if (!dirPhrase.empty())
masksFolder.push_back(dirPhrase);
}
@@ -75,12 +75,12 @@ void addFilterEntry(const Zstring& filterPhrase, std::vector<Zstring>& masksFile
};
if (startsWith(filterFmt, FILE_NAME_SEPARATOR)) // \abc
- processTail(afterFirst(filterFmt, FILE_NAME_SEPARATOR));
+ processTail(afterFirst(filterFmt, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE));
else
{
processTail(filterFmt);
if (startsWith(filterFmt, asteriskSep)) // *\abc
- processTail(afterFirst(filterFmt, asteriskSep));
+ processTail(afterFirst(filterFmt, asteriskSep, IF_MISSING_RETURN_NONE));
}
}
diff --git a/FreeFileSync/Source/lib/icon_buffer.cpp b/FreeFileSync/Source/lib/icon_buffer.cpp
index 1577eb97..01acd175 100644
--- a/FreeFileSync/Source/lib/icon_buffer.cpp
+++ b/FreeFileSync/Source/lib/icon_buffer.cpp
@@ -136,9 +136,7 @@ public:
{
assert(boost::this_thread::get_id() != mainThreadId);
boost::unique_lock<boost::mutex> dummy(lockFiles);
-
- while (workLoad.empty())
- conditionNewWork.timed_wait(dummy, boost::posix_time::milliseconds(100)); //interruption point!
+ conditionNewWork.wait(dummy, [this] { return !workLoad.empty(); }); //throw boost::thread_interrupted
WorkItem workItem = workLoad.back(); //
workLoad.pop_back(); //yes, not std::bad_alloc exception-safe, but bad_alloc is not relevant for us
@@ -385,7 +383,7 @@ void WorkerThread::operator()() //thread entry
{
#ifdef ZEN_WIN
//1. Initialize COM
- if (FAILED(::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE))) //may return S_FALSE, which is NOT failure, see MSDN
+ if (FAILED(::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE))) //may return S_FALSE, which is NO failure, see MSDN
{
assert(false);
return;
@@ -393,7 +391,7 @@ void WorkerThread::operator()() //thread entry
ZEN_ON_SCOPE_EXIT(::CoUninitialize());
#endif
- while (true)
+ for (;;)
{
boost::this_thread::interruption_point();
@@ -429,7 +427,7 @@ IconBuffer::~IconBuffer()
{
setWorkload({}); //make sure interruption point is always reached!
pimpl->worker.interrupt();
- pimpl->worker.join(); //we assume precondition "worker.joinable()"!!!
+ pimpl->worker.join(); //throw boost::thread_interrupted -> not expected => main thread!
}
diff --git a/FreeFileSync/Source/lib/icon_holder.h b/FreeFileSync/Source/lib/icon_holder.h
index 442f01c5..7f1719f3 100644
--- a/FreeFileSync/Source/lib/icon_holder.h
+++ b/FreeFileSync/Source/lib/icon_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 allocated memory
width(w), height(h),
rgb(static_cast<unsigned char*>(::malloc(width * height * 3))),
- alpha(withAlpha ? static_cast<unsigned char*>(::malloc(width * height)) : nullptr) {}
+ alpha(withAlpha ? static_cast<unsigned char*>(::malloc(width * height)) : nullptr) {}
ImageHolder (const ImageHolder&) = delete; //move semantics only!
ImageHolder& operator=(const ImageHolder&) = delete; //
diff --git a/FreeFileSync/Source/lib/icon_loader.cpp b/FreeFileSync/Source/lib/icon_loader.cpp
index 744219b3..e12ac549 100644
--- a/FreeFileSync/Source/lib/icon_loader.cpp
+++ b/FreeFileSync/Source/lib/icon_loader.cpp
@@ -10,14 +10,14 @@
#ifdef ZEN_WIN
#include <zen/dll.h>
#include <zen/win_ver.h>
- #include "../dll/Thumbnail/thumbnail.h"
+ #include "file_icon_win.h"
#elif defined ZEN_LINUX
#include <gtk/gtk.h>
#include <sys/stat.h>
#elif defined ZEN_MAC
- #include "osx_file_icon.h"
+ #include "file_icon_osx.h"
#endif
using namespace zen;
@@ -25,34 +25,7 @@ using namespace zen;
namespace
{
-#ifdef ZEN_WIN
- const bool isXpOrLater = winXpSP3OrLater(); //VS2010 compiled DLLs are not supported on Win 2000: Popup dialog "DecodePointer not found"
-
- #define DEF_DLL_FUN(name) const auto name = isXpOrLater ? DllFun<thumb::FunType_##name>(thumb::getDllName(), thumb::funName_##name) : DllFun<thumb::FunType_##name>();
- DEF_DLL_FUN(getIconByIndex); //
- DEF_DLL_FUN(getThumbnail); //let's spare the boost::call_once hustle and allocate statically
- DEF_DLL_FUN(releaseImageData); //
- #undef DEF_DLL_FUN
-#endif
-
-
-#ifdef ZEN_WIN
-ImageHolder copyToImageHolder(const thumb::ImageData& img)
-{
- assert(img.rgb && img.alpha);
- if (!img.rgb)
- return ImageHolder();
-
- ImageHolder out(img.width, img.height, img.alpha != nullptr);
- ::memcpy(out.getRgb(), img.rgb, img.width * img.height * 3);
-
- if (img.alpha)
- ::memcpy(out.getAlpha(), img.alpha, img.width * img.height);
-
- return out;
-}
-
-#elif defined ZEN_LINUX
+#ifdef ZEN_LINUX
ImageHolder copyToImageHolder(const GdkPixbuf* pixbuf)
{
//see: https://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html
@@ -110,29 +83,13 @@ ImageHolder copyToImageHolder(const GdkPixbuf* pixbuf)
}
return ImageHolder();
}
-
-#elif defined ZEN_MAC
-ImageHolder copyToImageHolder(const osx::ImageData& img)
-{
- assert(!img.rgb.empty() && !img.alpha.empty());
- if (img.rgb.empty())
- return ImageHolder();
-
- ImageHolder out(img.width, img.height, !img.alpha.empty() /*withAlpha*/);
- ::memcpy(out.getRgb(), &img.rgb[0], img.width * img.height * 3);
-
- if (!img.alpha.empty())
- ::memcpy(out.getAlpha(), &img.alpha[0], img.width * img.height);
- return out;
-}
#endif
#ifdef ZEN_WIN
-thumb::IconSizeType getThumbSizeType(int pixelSize)
+IconSizeType getThumbSizeType(int pixelSize)
{
//coordinate with IconBuffer::getSize()!
- using namespace thumb;
if (pixelSize >= 256) return ICON_SIZE_256;
if (pixelSize >= 128) return ICON_SIZE_128;
if (pixelSize >= 48) return ICON_SIZE_48;
@@ -154,12 +111,8 @@ ImageHolder getIconByAttribute(LPCWSTR pszPath, DWORD dwFileAttributes, int pixe
if (!imgList) //not owned: no need for IUnknown::Release()!
return ImageHolder();
- if (getIconByIndex && releaseImageData)
- if (const thumb::ImageData* img = getIconByIndex(fileInfo.iIcon, getThumbSizeType(pixelSize)))
- {
- ZEN_ON_SCOPE_EXIT(releaseImageData(img));
- return copyToImageHolder(*img);
- }
+ if (ImageHolder img = getIconByIndex(fileInfo.iIcon, getThumbSizeType(pixelSize)))
+ return img;
return ImageHolder();
}
@@ -209,8 +162,7 @@ ImageHolder zen::getIconByTemplatePath(const Zstring& templatePath, int pixelSiz
#elif defined ZEN_MAC
try
{
- const osx::ImageData& img = osx::getIconByExtension(getFileExtension(templatePath).c_str(), pixelSize); //throw SysError
- return copyToImageHolder(img);
+ return osx::getIconByExtension(getFileExtension(templatePath).c_str(), pixelSize); //throw SysError
}
catch (SysError&) { return ImageHolder(); }
#endif
@@ -234,7 +186,7 @@ ImageHolder zen::genericFileIcon(int pixelSize)
#elif defined ZEN_MAC
try
{
- return copyToImageHolder(osx::getDefaultFileIcon(pixelSize)); //throw SysError
+ return osx::getDefaultFileIcon(pixelSize); //throw SysError
}
catch (SysError&) { return ImageHolder(); }
#endif
@@ -257,7 +209,7 @@ ImageHolder zen::genericDirIcon(int pixelSize)
#elif defined ZEN_MAC
try
{
- return copyToImageHolder(osx::getDefaultFolderIcon(pixelSize)); //throw SysError
+ return osx::getDefaultFolderIcon(pixelSize); //throw SysError
}
catch (SysError&) { return ImageHolder(); }
#endif
@@ -286,12 +238,8 @@ ImageHolder zen::getFileIcon(const Zstring& filePath, int pixelSize)
//Check for link icon type (= shell links and symlinks): SHGetFileInfo + SHGFI_ATTRIBUTES:
//const bool isLink = (fileInfo.dwAttributes & SFGAO_LINK) != 0;
- if (getIconByIndex && releaseImageData)
- if (const thumb::ImageData* img = getIconByIndex(fileInfo.iIcon, getThumbSizeType(pixelSize)))
- {
- ZEN_ON_SCOPE_EXIT(releaseImageData(img));
- return copyToImageHolder(*img);
- }
+ if (ImageHolder img = getIconByIndex(fileInfo.iIcon, getThumbSizeType(pixelSize)))
+ return img;
}
#elif defined ZEN_LINUX
@@ -309,7 +257,7 @@ ImageHolder zen::getFileIcon(const Zstring& filePath, int pixelSize)
#elif defined ZEN_MAC
try
{
- return copyToImageHolder(osx::getFileIcon(filePath.c_str(), pixelSize)); //throw SysError
+ return osx::getFileIcon(filePath.c_str(), pixelSize); //throw SysError
}
catch (SysError&) { assert(false); }
#endif
@@ -320,12 +268,8 @@ ImageHolder zen::getFileIcon(const Zstring& filePath, int pixelSize)
ImageHolder zen::getThumbnailImage(const Zstring& filePath, int pixelSize) //return null icon on failure
{
#ifdef ZEN_WIN
- if (getThumbnail && releaseImageData)
- if (const thumb::ImageData* img = getThumbnail(filePath.c_str(), pixelSize))
- {
- ZEN_ON_SCOPE_EXIT(releaseImageData(img));
- return copyToImageHolder(*img);
- }
+ if (ImageHolder img = getThumbnail(filePath.c_str(), pixelSize))
+ return img;
#elif defined ZEN_LINUX
struct ::stat fileInfo = {};
@@ -360,7 +304,7 @@ ImageHolder zen::getThumbnailImage(const Zstring& filePath, int pixelSize) //ret
#elif defined ZEN_MAC
try
{
- return copyToImageHolder(osx::getThumbnail(filePath.c_str(), pixelSize)); //throw SysError
+ return osx::getThumbnail(filePath.c_str(), pixelSize); //throw SysError
}
catch (SysError&) {}
#endif
diff --git a/FreeFileSync/Source/lib/localization.cpp b/FreeFileSync/Source/lib/localization.cpp
index 717e4df1..8f53b5b5 100644
--- a/FreeFileSync/Source/lib/localization.cpp
+++ b/FreeFileSync/Source/lib/localization.cpp
@@ -80,8 +80,8 @@ FFSTranslation::FFSTranslation(const Zstring& filepath, wxLanguage languageId) :
}
catch (const FileError& e)
{
- throw lngfile::ParsingError(e.toString(), 0, 0);
- //passing FileError is too high a level for Parsing error, OTOH user is unlikely to see this since file I/O issues are sorted out by ExistingTranslations()!
+ throw lngfile::ParsingError(e.toString(), 0, 0);
+ //passing FileError is too high a level for Parsing error, OTOH user is unlikely to see this since file I/O issues are sorted out by ExistingTranslations()!
}
lngfile::TransHeader header;
@@ -450,7 +450,7 @@ void zen::setLanguage(int language) //throw FileError
catch (lngfile::ParsingError& e)
{
throw FileError(replaceCpy(replaceCpy(replaceCpy(_("Error parsing file %x, row %y, column %z."),
- L"%x", fmtFileName(utfCvrtTo<Zstring>(languageFile))),
+ L"%x", fmtPath(utfCvrtTo<Zstring>(languageFile))),
L"%y", numberTo<std::wstring>(e.row_ + 1)),
L"%z", numberTo<std::wstring>(e.col_ + 1))
+ L"\n\n" + e.msg_);
diff --git a/FreeFileSync/Source/lib/lock_holder.h b/FreeFileSync/Source/lib/lock_holder.h
index 9d110ed3..88b281a4 100644
--- a/FreeFileSync/Source/lib/lock_holder.h
+++ b/FreeFileSync/Source/lib/lock_holder.h
@@ -40,7 +40,7 @@ public:
}
catch (const FileError& e)
{
- const std::wstring msg = replaceCpy(_("Cannot set directory lock for %x."), L"%x", fmtFileName(dirpath)) + L"\n\n" + e.toString();
+ const std::wstring msg = replaceCpy(_("Cannot set directory lock for %x."), L"%x", fmtPath(dirpath)) + L"\n\n" + e.toString();
procCallback.reportWarning(msg, warningDirectoryLockFailed); //may throw!
}
}
diff --git a/FreeFileSync/Source/lib/parallel_scan.cpp b/FreeFileSync/Source/lib/parallel_scan.cpp
index 4d9aa69b..8421821d 100644
--- a/FreeFileSync/Source/lib/parallel_scan.cpp
+++ b/FreeFileSync/Source/lib/parallel_scan.cpp
@@ -9,7 +9,6 @@
#include <zen/thread.h> //includes <boost/thread.hpp>
#include <zen/scope_guard.h>
#include <zen/fixed_list.h>
-#include <boost/detail/atomic_count.hpp>
#include "db_file.h"
#include "lock_holder.h"
@@ -165,17 +164,15 @@ public:
FillBufferCallback::HandleError reportError(const std::wstring& msg, size_t retryNumber) //blocking call: context of worker thread
{
boost::unique_lock<boost::mutex> dummy(lockErrorInfo);
- while (errorInfo.get() || errorResponse.get())
- conditionCanReportError.timed_wait(dummy, boost::posix_time::milliseconds(50)); //interruption point!
+ conditionCanReportError.wait(dummy, [this] { return !errorInfo && !errorResponse; }); //throw boost::thread_interrupted
errorInfo = make_unique<std::pair<BasicWString, size_t>>(BasicWString(msg), retryNumber);
- while (!errorResponse.get())
- conditionGotResponse.timed_wait(dummy, boost::posix_time::milliseconds(50)); //interruption point!
+ conditionGotResponse.wait(dummy, [this] { return static_cast<bool>(errorResponse); }); //throw boost::thread_interrupted
FillBufferCallback::HandleError rv = *errorResponse;
- errorInfo.reset();
+ errorInfo .reset();
errorResponse.reset();
dummy.unlock(); //optimization for condition_variable::notify_all()
@@ -199,48 +196,37 @@ public:
void incrementNotifyingThreadId() { ++notifyingThreadID; } //context of main thread
- void reportCurrentFile(const Zstring& filepath, long threadID) //context of worker thread
- {
- if (threadID != notifyingThreadID) return; //only one thread at a time may report status
-
- boost::lock_guard<boost::mutex> dummy(lockCurrentStatus);
- currentFile = filepath;
- currentStatus.clear();
- }
+ //perf optimization?:
+ bool mayReportCurrentFile(int threadID) const { return threadID == notifyingThreadID; }
- void reportCurrentStatus(const std::wstring& status, long threadID) //context of worker thread
+ void reportCurrentFile(const std::wstring& filepath, int threadID) //context of worker thread
{
- if (threadID != notifyingThreadID) return; //only one thread may report status
+ if (threadID != notifyingThreadID) return; //only one thread at a time may report status
boost::lock_guard<boost::mutex> dummy(lockCurrentStatus);
- currentFile.clear();
- currentStatus = BasicWString(status); //we cannot assume std::wstring to be thread safe (yet)!
+ currentFile = copyStringTo<BasicWString>(filepath);
}
std::wstring getCurrentStatus() //context of main thread, call repreatedly
{
- Zstring filepath;
- std::wstring statusMsg;
+ std::wstring filepath;
{
boost::lock_guard<boost::mutex> dummy(lockCurrentStatus);
- if (!currentFile.empty())
- filepath = currentFile;
- else if (!currentStatus.empty())
- statusMsg = copyStringTo<std::wstring>(currentStatus);
+ filepath = copyStringTo<std::wstring>(currentFile);
}
- if (!filepath.empty())
- {
- std::wstring statusText = copyStringTo<std::wstring>(textScanning);
- const long activeCount = activeWorker;
- if (activeCount >= 2)
- statusText += L" [" + replaceCpy(_P("1 thread", "%x threads", activeCount), L"%x", numberTo<std::wstring>(activeCount)) + L"]";
+ if (filepath.empty())
+ return std::wstring();
- statusText += L" " + fmtFileName(filepath);
- return statusText;
- }
- else
- return statusMsg;
+ std::wstring statusText = copyStringTo<std::wstring>(textScanning);
+
+ const long activeCount = activeWorker;
+ if (activeCount >= 2)
+ statusText += L" [" + replaceCpy(_P("1 thread", "%x threads", activeCount), L"%x", numberTo<std::wstring>(activeCount)) + L"]";
+
+ statusText += L" ";
+ statusText += filepath;
+ return statusText;
}
void incItemsScanned() { ++itemsScanned; } //perf: irrelevant! scanning is almost entirely file I/O bound, not CPU bound! => no prob having multiple threads poking at the same variable!
@@ -259,17 +245,16 @@ private:
std::unique_ptr<FillBufferCallback::HandleError> errorResponse;
//---- status updates ----
- boost::detail::atomic_count notifyingThreadID;
- //CAVEAT: do NOT use boost::thread::id as long as this showstopper exists: https://svn.boost.org/trac/boost/ticket/5754
+ std::atomic<int> notifyingThreadID; //CAVEAT: do NOT use boost::thread::id: https://svn.boost.org/trac/boost/ticket/5754
+
boost::mutex lockCurrentStatus; //use a different lock for current file: continue traversing while some thread may process an error
- Zstring currentFile; //only one of these two is filled at a time!
- BasicWString currentStatus; //
+ BasicWString currentFile;
const BasicWString textScanning; //this one is (currently) not shared and could be made a std::wstring, but we stay consistent and use thread-safe variables in this class only!
//---- status updates II (lock free) ----
- boost::detail::atomic_count itemsScanned;
- boost::detail::atomic_count activeWorker;
+ std::atomic<int> itemsScanned;
+ std::atomic<int> activeWorker;
};
//-------------------------------------------------------------------------------------------------
@@ -277,7 +262,7 @@ private:
struct TraverserShared
{
public:
- TraverserShared(long threadID,
+ TraverserShared(int threadID,
const ABF& abf,
const HardFilter::FilterRef& filter,
SymLinkHandling handleSymlinks,
@@ -300,7 +285,7 @@ public:
std::map<Zstring, std::wstring, LessFilePath>& failedItemReads_;
AsyncCallback& acb_;
- const long threadID_;
+ const int threadID_;
};
@@ -314,11 +299,9 @@ public:
relNameParentPf_(relNameParentPf),
output_(output) {}
- virtual void onFile (const FileInfo& fi) override;
- virtual TraverserCallback* onDir (const DirInfo& di) override;
- virtual HandleLink onSymlink(const SymlinkInfo& li) override;
-
- void releaseDirTraverser(TraverserCallback* trav) override;
+ virtual void onFile (const FileInfo& fi) override;
+ virtual std::unique_ptr<TraverserCallback> onDir (const DirInfo& di) override;
+ virtual HandleLink onSymlink(const SymlinkInfo& li) override;
HandleError reportDirError (const std::wstring& msg, size_t retryNumber) override;
HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zchar* shortName) override;
@@ -344,7 +327,8 @@ void DirCallback::onFile(const FileInfo& fi)
const Zstring relFilePath = relNameParentPf_ + fileNameShort;
//update status information no matter whether object is excluded or not!
- cfg.acb_.reportCurrentFile(ABF::getDisplayPath(cfg.abstractBaseFolder.getAbstractPath(relFilePath)), cfg.threadID_);
+ if (cfg.acb_.mayReportCurrentFile(cfg.threadID_))
+ cfg.acb_.reportCurrentFile(ABF::getDisplayPath(cfg.abstractBaseFolder.getAbstractPath(relFilePath)), cfg.threadID_);
//------------------------------------------------------------------------------------
//apply filter before processing (use relative name!)
@@ -368,14 +352,15 @@ void DirCallback::onFile(const FileInfo& fi)
}
-ABF::TraverserCallback* DirCallback::onDir(const DirInfo& di)
+std::unique_ptr<ABF::TraverserCallback> DirCallback::onDir(const DirInfo& di)
{
boost::this_thread::interruption_point();
const Zstring& relDirPath = relNameParentPf_ + di.shortName;
//update status information no matter whether object is excluded or not!
- cfg.acb_.reportCurrentFile(ABF::getDisplayPath(cfg.abstractBaseFolder.getAbstractPath(relDirPath)), cfg.threadID_);
+ if (cfg.acb_.mayReportCurrentFile(cfg.threadID_))
+ cfg.acb_.reportCurrentFile(ABF::getDisplayPath(cfg.abstractBaseFolder.getAbstractPath(relDirPath)), cfg.threadID_);
//------------------------------------------------------------------------------------
//apply filter before processing (use relative name!)
@@ -389,7 +374,7 @@ ABF::TraverserCallback* DirCallback::onDir(const DirInfo& di)
if (passFilter)
cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator
- return new DirCallback(cfg, relDirPath + FILE_NAME_SEPARATOR, subDir); //releaseDirTraverser() is guaranteed to be called in any case
+ return make_unique<DirCallback>(cfg, relDirPath + FILE_NAME_SEPARATOR, subDir); //releaseDirTraverser() is guaranteed to be called in any case
}
@@ -400,7 +385,8 @@ DirCallback::HandleLink DirCallback::onSymlink(const SymlinkInfo& si)
const Zstring& relLinkPath = relNameParentPf_ + si.shortName;
//update status information no matter whether object is excluded or not!
- cfg.acb_.reportCurrentFile(ABF::getDisplayPath(cfg.abstractBaseFolder.getAbstractPath(relLinkPath)), cfg.threadID_);
+ if (cfg.acb_.mayReportCurrentFile(cfg.threadID_))
+ cfg.acb_.reportCurrentFile(ABF::getDisplayPath(cfg.abstractBaseFolder.getAbstractPath(relLinkPath)), cfg.threadID_);
switch (cfg.handleSymlinks_)
{
@@ -433,20 +419,13 @@ DirCallback::HandleLink DirCallback::onSymlink(const SymlinkInfo& si)
}
-void DirCallback::releaseDirTraverser(TraverserCallback* trav)
-{
- TraverserCallback::releaseDirTraverser(trav); //no-op; introduce compile-time coupling
- delete trav;
-}
-
-
DirCallback::HandleError DirCallback::reportDirError(const std::wstring& msg, size_t retryNumber)
{
//AsyncCallback::reportError() blocks while implementing boost::this_thread::interruption_point()
switch (cfg.acb_.reportError(msg, retryNumber))
{
case FillBufferCallback::ON_ERROR_IGNORE:
- cfg.failedDirReads_[beforeLast(relNameParentPf_, FILE_NAME_SEPARATOR)] = msg;
+ cfg.failedDirReads_[beforeLast(relNameParentPf_, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)] = msg;
return ON_ERROR_IGNORE;
case FillBufferCallback::ON_ERROR_RETRY:
@@ -478,7 +457,7 @@ DirCallback::HandleError DirCallback::reportItemError(const std::wstring& msg, s
class WorkerThread
{
public:
- WorkerThread(long threadID,
+ WorkerThread(int threadID,
const std::shared_ptr<AsyncCallback>& acb,
const DirectoryKey& dirKey,
DirectoryValue& dirOutput) :
@@ -494,7 +473,8 @@ public:
const AbstractPathRef& baseFolderItem = dirKey_.baseFolder_->getAbstractPath();
- acb_->reportCurrentFile(ABF::getDisplayPath(baseFolderItem), threadID_); //just in case first directory access is blocking
+ if (acb_->mayReportCurrentFile(threadID_))
+ acb_->reportCurrentFile(ABF::getDisplayPath(baseFolderItem), threadID_); //just in case first directory access is blocking
TraverserShared travCfg(threadID_,
*dirKey_.baseFolder_,
@@ -512,7 +492,7 @@ public:
}
private:
- long threadID_;
+ const int threadID_;
std::shared_ptr<AsyncCallback> acb_;
const DirectoryKey dirKey_;
DirectoryValue& dirOutput_;
@@ -535,7 +515,7 @@ void zen::fillBuffer(const std::set<DirectoryKey>& keysToRead, //in
wt.interrupt(); //interrupt all at once first, then join
for (boost::thread& wt : worker)
if (wt.joinable()) //= precondition of thread::join(), which throws an exception if violated!
- wt.join(); //in this context it is possible a thread is *not* joinable anymore due to the thread::timed_join() below!
+ wt.join(); //in this context it is possible a thread is *not* joinable anymore due to the thread::try_join_for() below!
});
auto acb = std::make_shared<AsyncCallback>();
@@ -546,7 +526,7 @@ void zen::fillBuffer(const std::set<DirectoryKey>& keysToRead, //in
assert(buf.find(key) == buf.end());
DirectoryValue& dirOutput = buf[key];
- const long threadId = static_cast<long>(worker.size());
+ const int threadId = static_cast<int>(worker.size());
worker.emplace_back(WorkerThread(threadId, acb, key, dirOutput));
}
@@ -561,7 +541,7 @@ void zen::fillBuffer(const std::set<DirectoryKey>& keysToRead, //in
//process errors
acb->processErrors(callback);
}
- while (!wt.timed_join(boost::posix_time::milliseconds(updateInterval)));
+ while (!wt.try_join_for(boost::chrono::milliseconds(updateInterval)));
acb->incrementNotifyingThreadId(); //process info messages of one thread at a time only
}
diff --git a/FreeFileSync/Source/lib/parse_lng.h b/FreeFileSync/Source/lib/parse_lng.h
index 2fe15a27..92ad6929 100644
--- a/FreeFileSync/Source/lib/parse_lng.h
+++ b/FreeFileSync/Source/lib/parse_lng.h
@@ -454,6 +454,8 @@ private:
void validateTranslation(const std::string& original, const std::string& translation) //throw ParsingError
{
+ using namespace zen;
+
if (original.empty())
throw ParsingError(L"Source translation is empty", scn.posRow(), scn.posCol());
@@ -462,9 +464,9 @@ private:
//if original contains placeholder, so must translation!
auto checkPlaceholder = [&](const std::string& placeholder)
{
- if (zen::contains(original, placeholder) &&
- !zen::contains(translation, placeholder))
- throw ParsingError(zen::replaceCpy<std::wstring>(L"Placeholder %x missing in translation", L"%x", zen::utfCvrtTo<std::wstring>(placeholder)), scn.posRow(), scn.posCol());
+ if (contains(original, placeholder) &&
+ !contains(translation, placeholder))
+ throw ParsingError(replaceCpy<std::wstring>(L"Placeholder %x missing in translation", L"%x", utfCvrtTo<std::wstring>(placeholder)), scn.posRow(), scn.posCol());
};
checkPlaceholder("%x");
checkPlaceholder("%y");
@@ -472,7 +474,7 @@ private:
auto ampersandTokenCount = [](const std::string& str) -> size_t
{
- const std::string tmp = zen::replaceCpy(str, "&&", ""); //make sure to not catch && which windows resolves as just one & for display!
+ const std::string tmp = replaceCpy(str, "&&", ""); //make sure to not catch && which windows resolves as just one & for display!
return std::count(tmp.begin(), tmp.end(), '&');
};
@@ -484,31 +486,30 @@ private:
//ampersand at the end makes buggy wxWidgets crash miserably
if (ampCountOrig > 0)
- if ((zen::endsWith(original, "&") && !zen::endsWith(original, "&&")) ||
- (zen::endsWith(translation, "&") && !zen::endsWith(translation, "&&")))
+ if ((endsWith(original, "&") && !endsWith(original, "&&")) ||
+ (endsWith(translation, "&") && !endsWith(translation, "&&")))
throw ParsingError(L"The & character to mark a menu item access key must not occur at the end of a string", scn.posRow(), scn.posCol());
-#if 0
//if source ends with colon, so must translation (note: character seems to be universally used, even for asian and arabic languages)
- if (zen::endsWith(original, ":") &&
- !zen::endsWith(translation, ":") &&
- !zen::endsWith(translation, "\xef\xbc\x9a")) //chinese colon
+ if (endsWith(original, ":") &&
+ !endsWith(translation, ":") &&
+ !endsWith(translation, "\xef\xbc\x9a")) //chinese colon
throw ParsingError(L"Source text ends with a colon character \":\", but translation does not", scn.posRow(), scn.posCol());
- auto endsWithSingleDot = [](const std::string& s) { return zen::endsWith(s, ".") && !zen::endsWith(s, ".."); };
+ auto endsWithSingleDot = [](const std::string& s) { return endsWith(s, ".") && !endsWith(s, ".."); };
//if source ends with a period, so must translation (note: character seems to be universally used, even for asian and arabic languages)
if (endsWithSingleDot(original) &&
!endsWithSingleDot(translation) &&
- !zen::endsWith(translation, "\xe3\x80\x82")) //chinese period
+ !endsWith(translation, "\xe0\xa5\xa4") && //hindi period
+ !endsWith(translation, "\xe3\x80\x82")) //chinese period
throw ParsingError(L"Source text ends with a punctuation mark character \".\", but translation does not", scn.posRow(), scn.posCol());
//if source ends with an ellipsis, so must translation (note: character seems to be universally used, even for asian and arabic languages)
- if (zen::endsWith(original, "...") &&
- !zen::endsWith(translation, "...") &&
- !zen::endsWith(translation, "\xe2\x80\xa6")) //narrow ellipsis (spanish?)
+ if (endsWith(original, "...") &&
+ !endsWith(translation, "...") &&
+ !endsWith(translation, "\xe2\x80\xa6")) //narrow ellipsis (spanish?)
throw ParsingError(L"Source text ends with an ellipsis \"...\", but translation does not", scn.posRow(), scn.posCol());
-#endif
}
}
diff --git a/FreeFileSync/Source/lib/process_xml.cpp b/FreeFileSync/Source/lib/process_xml.cpp
index 6033285d..f90395f2 100644
--- a/FreeFileSync/Source/lib/process_xml.cpp
+++ b/FreeFileSync/Source/lib/process_xml.cpp
@@ -1021,7 +1021,7 @@ void readConfig(const Zstring& filepath, XmlType type, ConfigType& cfg, int curr
XmlDoc doc = loadXmlDocument(filepath); //throw FileError
if (getXmlTypeNoThrow(doc) != type) //noexcept
- throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filepath)));
+ throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filepath)));
XmlIn in(doc);
::readConfig(in, cfg);
@@ -1125,7 +1125,7 @@ void xmlAccess::readAnyConfig(const std::vector<Zstring>& filepaths, XmlGuiConfi
case XML_TYPE_GLOBAL:
case XML_TYPE_OTHER:
- throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filepath)));
+ throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filepath)));
}
}
@@ -1416,7 +1416,7 @@ void xmlAccess::writeConfig(const XmlGlobalSettings& cfg, const Zstring& filepat
std::wstring xmlAccess::extractJobName(const Zstring& configFilename)
{
- const Zstring shortName = afterLast(configFilename, FILE_NAME_SEPARATOR); //returns the whole string if separator not found
- const Zstring jobName = beforeLast(shortName, Zstr('.')); //returns empty string if seperator not found
- return utfCvrtTo<std::wstring>(jobName.empty() ? shortName : jobName);
+ const Zstring shortName = afterLast(configFilename, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL);
+ const Zstring jobName = beforeLast(shortName, Zstr('.'), IF_MISSING_RETURN_ALL);
+ return utfCvrtTo<std::wstring>(jobName);
}
diff --git a/FreeFileSync/Source/lib/resolve_path.cpp b/FreeFileSync/Source/lib/resolve_path.cpp
index 19602740..50f2b260 100644
--- a/FreeFileSync/Source/lib/resolve_path.cpp
+++ b/FreeFileSync/Source/lib/resolve_path.cpp
@@ -65,7 +65,7 @@ Zstring resolveRelativePath(const Zstring& relativePath) //note: ::GetFullPathNa
return relativePath; //error! no further processing!
if (startsWith(relativePath, "~/"))
- return appendSeparator(homeDir) + afterFirst(relativePath, '/');
+ return appendSeparator(homeDir) + afterFirst(relativePath, '/', IF_MISSING_RETURN_NONE);
else if (relativePath == "~")
return homeDir;
}
@@ -204,6 +204,9 @@ private:
};
//caveat: function scope static initialization is not thread-safe in VS 2010!
+#if defined _MSC_VER && _MSC_VER > 1800
+ #error get rid!
+#endif
auto& dummy = CsidlConstants::get();
#endif
@@ -292,12 +295,12 @@ Zstring expandMacros(const Zstring& text, const std::vector<std::pair<Zstring, Z
{
if (contains(text, MACRO_SEP))
{
- Zstring prefix = beforeFirst(text, MACRO_SEP);
- Zstring rest = afterFirst (text, MACRO_SEP);
+ Zstring prefix = beforeFirst(text, MACRO_SEP, IF_MISSING_RETURN_NONE);
+ Zstring rest = afterFirst (text, MACRO_SEP, IF_MISSING_RETURN_NONE);
if (contains(rest, MACRO_SEP))
{
- Zstring potentialMacro = beforeFirst(rest, MACRO_SEP);
- Zstring postfix = afterFirst (rest, MACRO_SEP); //text == prefix + MACRO_SEP + potentialMacro + MACRO_SEP + postfix
+ Zstring potentialMacro = beforeFirst(rest, MACRO_SEP, IF_MISSING_RETURN_NONE);
+ Zstring postfix = afterFirst (rest, MACRO_SEP, IF_MISSING_RETURN_NONE); //text == prefix + MACRO_SEP + potentialMacro + MACRO_SEP + postfix
if (Opt<Zstring> value = resolveMacro(potentialMacro, ext))
return prefix + *value + expandMacros(postfix, ext);
@@ -406,9 +409,9 @@ Zstring expandVolumeName(const Zstring& text) // [volname]:\folder [volna
Zstring rest = Zstring(textTmp.c_str() + posEnd + 1);
if (startsWith(rest, Zstr(':')))
- rest = afterFirst(rest, Zstr(':'));
+ rest = afterFirst(rest, Zstr(':'), IF_MISSING_RETURN_NONE);
if (startsWith(rest, FILE_NAME_SEPARATOR))
- rest = afterFirst(rest, FILE_NAME_SEPARATOR);
+ rest = afterFirst(rest, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
#ifdef ZEN_WIN
//[.*] pattern was found...
if (!volname.empty())
@@ -568,7 +571,7 @@ Zstring zen::getResolvedDirectoryPath(const Zstring& dirpassPhrase) //noexcept
//remove trailing slash, unless volume root:
if (endsWith(dirpath, FILE_NAME_SEPARATOR))
if (!isVolumeRoot(dirpath))
- dirpath = beforeLast(dirpath, FILE_NAME_SEPARATOR);
+ dirpath = beforeLast(dirpath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
return dirpath;
}
diff --git a/FreeFileSync/Source/lib/versioning.cpp b/FreeFileSync/Source/lib/versioning.cpp
index 93db6750..44a6e288 100644
--- a/FreeFileSync/Source/lib/versioning.cpp
+++ b/FreeFileSync/Source/lib/versioning.cpp
@@ -62,26 +62,19 @@ bool impl::isMatchingVersion(const Zstring& shortname, const Zstring& shortnameV
}
-namespace
-{
/*
- handle not existing source
- create target super directories if missing
*/
-template <class Function>
-void moveItemToVersioning(const AbstractPathRef& itemPath, //throw FileError
- const Zstring& relativePath,
- AbstractBaseFolder& versioningFolder,
- const Zstring& timestamp,
- VersioningStyle versioningStyle,
- Function moveItem) //move source -> target; may throw FileError
+void FileVersioner::moveItemToVersioning(const AbstractPathRef& itemPath, const Zstring& relativePath, //throw FileError
+ const std::function<void(const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath)>& moveItem) //move source -> target; may throw FileError
{
assert(!startsWith(relativePath, FILE_NAME_SEPARATOR));
assert(!endsWith (relativePath, FILE_NAME_SEPARATOR));
assert(!relativePath.empty());
Zstring versionedRelPath;
- switch (versioningStyle)
+ switch (versioningStyle_)
{
default:
assert(false);
@@ -89,12 +82,13 @@ void moveItemToVersioning(const AbstractPathRef& itemPath, //throw FileError
versionedRelPath = relativePath;
break;
case VER_STYLE_ADD_TIMESTAMP: //assemble time-stamped version name
- versionedRelPath = relativePath + Zstr(' ') + timestamp + getDotExtension(relativePath);
- assert(impl::isMatchingVersion(afterLast(relativePath, FILE_NAME_SEPARATOR), afterLast(versionedRelPath, FILE_NAME_SEPARATOR))); //paranoid? no!
+ 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!
break;
}
- const AbstractPathRef versionedItemPath = versioningFolder.getAbstractPath(versionedRelPath);
+ const AbstractPathRef versionedItemPath = versioningFolder_->getAbstractPath(versionedRelPath);
try
{
@@ -102,23 +96,25 @@ void moveItemToVersioning(const AbstractPathRef& itemPath, //throw FileError
}
catch (FileError&) //expected to fail if target directory is not yet existing!
{
- if (!ABF::somethingExists(itemPath)) //no source at all is not an error (however a directory as source when a file is expected, *is* an error!)
+ if (!ABF::somethingExists(itemPath)) //missing source file is not an error (however a directory as source when a file is expected, *is* an error!)
return; //object *not* processed
//create intermediate directories if missing
- const AbstractPathRef versionedParentPath = versioningFolder.getAbstractPath(beforeLast(versionedRelPath, FILE_NAME_SEPARATOR)); //returns empty string if term not found
+ const AbstractPathRef versionedParentPath = versioningFolder_->getAbstractPath(beforeLast(versionedRelPath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE));
if (!ABF::somethingExists(versionedParentPath)) //->(minor) file system race condition!
{
- ABF::createNewFolder(versionedParentPath); //throw FileError, (ErrorTargetExisting)
+ ABF::createFolderRecursively(versionedParentPath); //throw FileError
//retry: this should work now!
moveItem(itemPath, versionedItemPath); //throw FileError
+ return;
}
- else
- throw;
+ throw;
}
}
+namespace
+{
//move source to target across volumes
//no need to check if: - super-directories of target exist - source exists: done by moveItemToVersioning()
//if target already exists, it is overwritten, even if it is a different type, e.g. a directory!
@@ -134,8 +130,8 @@ void moveItem(const AbstractPathRef& sourcePath, //throw FileError
//remove target object
if (ABF::dirExists(targetPath)) //directory or dir-symlink
{
- assert(false); //we do not expect targetPath to be a directory in general (but possible!) => no removeFolder() callback required!
- ABF::removeFolder(targetPath); //throw FileError
+ assert(false); //we do not expect targetPath to be a directory in general (but possible!)
+ ABF::removeFolderRecursively(targetPath, nullptr /*onBeforeFileDeletion*/, nullptr /*onBeforeFolderDeletion*/); //throw FileError
}
else //file or (broken) file-symlink
ABF::removeFile(targetPath); //throw FileError
@@ -168,22 +164,19 @@ void moveItem(const AbstractPathRef& sourcePath, //throw FileError
}
-void moveFile(const AbstractPathRef& sourcePath, //throw FileError
- const AbstractPathRef& targetPath,
- const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus) //may be nullptr
+void moveFileOrSymlink(const AbstractPathRef& sourcePath, //throw FileError
+ const AbstractPathRef& targetPath,
+ const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus) //may be nullptr
{
auto copyDelete = [&]
{
assert(!ABF::somethingExists(targetPath));
-
- //create target
if (ABF::symlinkExists(sourcePath))
ABF::copySymlink(sourcePath, targetPath, false /*copy filesystem permissions*/); //throw FileError
else
ABF::copyFileTransactional(sourcePath, targetPath, //throw FileError, (ErrorFileLocked)
false /*copyFilePermissions*/, true /*transactionalCopy*/, nullptr, onNotifyCopyStatus);
- //delete source
ABF::removeFile(sourcePath); //throw FileError; newly copied file is NOT deleted if exception is thrown here!
};
@@ -191,14 +184,41 @@ void moveFile(const AbstractPathRef& sourcePath, //throw FileError
}
-void moveDirSymlink(const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath) //throw FileError
+void moveFile(const AbstractPathRef& sourcePath, //throw FileError
+ const AbstractPathRef& targetPath,
+ const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus) //may be nullptr
{
- auto copyDelete = [&] //throw FileError
+ auto copyDelete = [&]
+ {
+ assert(!ABF::somethingExists(targetPath));
+ ABF::copyFileTransactional(sourcePath, targetPath, //throw FileError, (ErrorFileLocked)
+ false /*copyFilePermissions*/, true /*transactionalCopy*/, nullptr /*onDeleteTargetFile*/, onNotifyCopyStatus);
+ ABF::removeFile(sourcePath); //throw FileError; newly copied file is NOT deleted if exception is thrown here!
+ };
+ moveItem(sourcePath, targetPath, copyDelete); //throw FileError
+}
+
+
+void moveFileSymlink(const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath) //throw FileError
+{
+ auto copyDelete = [&]
{
+ assert(!ABF::somethingExists(targetPath));
ABF::copySymlink(sourcePath, targetPath, false /*copy filesystem permissions*/); //throw FileError
- ABF::removeFolder(sourcePath); //throw FileError; newly copied link is NOT deleted if exception is thrown here!
+ ABF::removeFile(sourcePath); //throw FileError; newly copied file is NOT deleted if exception is thrown here!
};
+ moveItem(sourcePath, targetPath, copyDelete); //throw FileError
+}
+
+void moveFolderSymlink(const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath) //throw FileError
+{
+ auto copyDelete = [&] //throw FileError
+ {
+ assert(!ABF::somethingExists(targetPath));
+ ABF::copySymlink(sourcePath, targetPath, false /*copy filesystem permissions*/); //throw FileError
+ ABF::removeFolderSimple(sourcePath); //throw FileError; newly copied link is NOT deleted if exception is thrown here!
+ };
moveItem(sourcePath, targetPath, copyDelete);
}
@@ -207,55 +227,42 @@ struct FlatTraverserCallback: public ABF::TraverserCallback
{
FlatTraverserCallback(const AbstractPathRef& folderPath) : folderPath_(folderPath) {}
- void onFile (const FileInfo& fi) override { fileNames_ .push_back(fi.shortName); }
- TraverserCallback* onDir (const DirInfo& di) override { folderNames_.push_back(di.shortName); return nullptr; }
- HandleLink onSymlink(const SymlinkInfo& si) override
+ void onFile (const FileInfo& fi) override { fileNames_ .push_back(fi.shortName); }
+ std::unique_ptr<TraverserCallback> onDir (const DirInfo& di) override { folderNames_.push_back(di.shortName); return nullptr; }
+ HandleLink onSymlink(const SymlinkInfo& si) override
{
if (ABF::dirExists(ABF::appendRelPath(folderPath_, si.shortName))) //dir symlink
- folderNames_.push_back(si.shortName);
+ folderLinkNames_.push_back(si.shortName);
else //file symlink, broken symlink
- fileNames_.push_back(si.shortName);
+ fileLinkNames_.push_back(si.shortName);
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 Zchar* shortName) override { throw FileError(msg); }
- const std::vector<Zstring>& refFileNames () const { return fileNames_; }
- const std::vector<Zstring>& refFolderNames() const { return folderNames_; }
+ const std::vector<Zstring>& refFileNames () const { return fileNames_; }
+ const std::vector<Zstring>& refFolderNames () const { return folderNames_; }
+ const std::vector<Zstring>& refFileLinkNames () const { return fileLinkNames_; }
+ const std::vector<Zstring>& refFolderLinkNames() const { return folderLinkNames_; }
private:
- const AbstractPathRef& folderPath_;
+ const AbstractPathRef folderPath_;
std::vector<Zstring> fileNames_;
std::vector<Zstring> folderNames_;
+ std::vector<Zstring> fileLinkNames_;
+ std::vector<Zstring> folderLinkNames_;
};
}
bool FileVersioner::revisionFile(const AbstractPathRef& filePath, const Zstring& relativePath, const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus) //throw FileError
{
- return revisionFileImpl(filePath, relativePath, nullptr, onNotifyCopyStatus); //throw FileError
-}
-
-
-bool FileVersioner::revisionFileImpl(const AbstractPathRef& filePath, //throw FileError
- const Zstring& relativePath,
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeFileMove,
- const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus)
-{
bool moveSuccessful = false;
- moveItemToVersioning(filePath, //throw FileError
- relativePath,
- *versioningFolder_,
- timeStamp_,
- versioningStyle_,
+ moveItemToVersioning(filePath, relativePath, //throw FileError
[&](const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath)
{
- if (onBeforeFileMove)
- onBeforeFileMove(ABF::getDisplayPath(sourcePath), ABF::getDisplayPath(targetPath)); //if we're called by revisionFolderImpl() we know that "source" exists!
- //when called by revisionFile(), "source" might not exist, but onBeforeFileMove() == nullptr in this case anyway
-
- moveFile(sourcePath, targetPath, onNotifyCopyStatus); //throw FileError
+ moveFileOrSymlink(sourcePath, targetPath, onNotifyCopyStatus); //throw FileError
moveSuccessful = true;
});
return moveSuccessful;
@@ -263,64 +270,84 @@ bool FileVersioner::revisionFileImpl(const AbstractPathRef& filePath, //throw Fi
void FileVersioner::revisionFolder(const AbstractPathRef& folderPath, const Zstring& relativePath, //throw FileError
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeFileMove,
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeDirMove,
+ 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,
const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus)
{
- //no error situation if directory is not existing! manual deletion relies on it!
- if (!ABF::somethingExists(folderPath))
- return; //neither directory nor any other object (e.g. broken symlink) with that name existing
- revisionFolderImpl(folderPath, relativePath, onBeforeFileMove, onBeforeDirMove, onNotifyCopyStatus); //throw FileError
-}
-
-
-void FileVersioner::revisionFolderImpl(const AbstractPathRef& folderPath, const Zstring& relativePath, //throw FileError
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeFileMove,
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeDirMove,
- const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus)
-{
- assert(ABF::somethingExists(folderPath)); //[!], see call from revisionFolder()
-
- //create target
if (ABF::symlinkExists(folderPath)) //on Linux there is just one type of symlink, and since we do revision file symlinks, we should revision dir symlinks as well!
{
- moveItemToVersioning(folderPath, //throw FileError
- relativePath,
- *versioningFolder_,
- timeStamp_,
- versioningStyle_,
+ moveItemToVersioning(folderPath, relativePath, //throw FileError
[&](const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath)
{
- if (onBeforeDirMove)
- onBeforeDirMove(ABF::getDisplayPath(sourcePath), ABF::getDisplayPath(targetPath));
- moveDirSymlink(sourcePath, targetPath); //throw FileError
+ if (onBeforeFolderMove)
+ onBeforeFolderMove(ABF::getDisplayPath(sourcePath), ABF::getDisplayPath(targetPath));
+ moveFolderSymlink(sourcePath, targetPath); //throw FileError
});
}
else
{
- //create target directories only when needed in moveFileToVersioning(): avoid empty directories!
+ //no error situation if directory is not existing! manual deletion relies on it!
+ if (ABF::somethingExists(folderPath))
+ revisionFolderImpl(folderPath, relativePath, onBeforeFileMove, onBeforeFolderMove, onNotifyCopyStatus); //throw FileError
+ }
+}
- FlatTraverserCallback ft(folderPath); //traverse source directory one level deep
- ABF::traverseFolder(folderPath, ft);
- const Zstring relPathPf = appendSeparator(relativePath);
+void FileVersioner::revisionFolderImpl(const AbstractPathRef& folderPath, const Zstring& relativePath, //throw FileError
+ 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,
+ const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus)
+{
+ assert(!ABF::symlinkExists(folderPath)); //[!] no symlinks in this context!!!
+ assert(ABF::dirExists(folderPath)); //Do NOT traverse into it deleting contained files!!!
+
+ //create target directories only when needed in moveFileToVersioning(): avoid empty directories!
- //move files
- for (const Zstring& fileName : ft.refFileNames())
- revisionFileImpl(ABF::appendRelPath(folderPath, fileName), //throw FileError
+ FlatTraverserCallback ft(folderPath); //traverse source directory one level deep
+ ABF::traverseFolder(folderPath, ft);
+
+ const Zstring relPathPf = appendSeparator(relativePath);
+
+ for (const Zstring& fileName : ft.refFileNames())
+ moveItemToVersioning(ABF::appendRelPath(folderPath, fileName), //throw FileError
relPathPf + fileName,
- onBeforeFileMove, onNotifyCopyStatus);
-
- //move folders
- for (const Zstring& folderName : ft.refFolderNames())
- revisionFolderImpl(ABF::appendRelPath(folderPath, folderName), //throw FileError
- relPathPf + folderName,
- onBeforeFileMove, onBeforeDirMove, onNotifyCopyStatus);
- //delete source
- if (onBeforeDirMove)
- onBeforeDirMove(ABF::getDisplayPath(folderPath), ABF::getDisplayPath(versioningFolder_->getAbstractPath(relativePath)));
- ABF::removeFolder(folderPath); //throw FileError
- }
+ [&](const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath)
+ {
+ if (onBeforeFileMove)
+ onBeforeFileMove(ABF::getDisplayPath(sourcePath), ABF::getDisplayPath(targetPath));
+ moveFile(sourcePath, targetPath, onNotifyCopyStatus); //throw FileError
+ });
+
+ for (const Zstring& fileLinkName : ft.refFileLinkNames())
+ moveItemToVersioning(ABF::appendRelPath(folderPath, fileLinkName), //throw FileError
+ relPathPf + fileLinkName,
+ [&](const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath)
+ {
+ if (onBeforeFileMove)
+ onBeforeFileMove(ABF::getDisplayPath(sourcePath), ABF::getDisplayPath(targetPath));
+ moveFileSymlink(sourcePath, targetPath); //throw FileError
+ });
+
+ //on Linux there is just one type of symlink, and since we do revision file symlinks, we should revision dir symlinks as well!
+ for (const Zstring& folderLinkName : ft.refFolderLinkNames())
+ moveItemToVersioning(ABF::appendRelPath(folderPath, folderLinkName), //throw FileError
+ relPathPf + folderLinkName,
+ [&](const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath)
+ {
+ if (onBeforeFolderMove)
+ onBeforeFolderMove(ABF::getDisplayPath(sourcePath), ABF::getDisplayPath(targetPath));
+ moveFolderSymlink(sourcePath, targetPath); //throw FileError
+ });
+
+ //move folders recursively
+ for (const Zstring& folderName : ft.refFolderNames())
+ revisionFolderImpl(ABF::appendRelPath(folderPath, folderName), //throw FileError
+ relPathPf + folderName,
+ onBeforeFileMove, onBeforeFolderMove, onNotifyCopyStatus);
+ //delete source
+ if (onBeforeFolderMove)
+ onBeforeFolderMove(ABF::getDisplayPath(folderPath), ABF::getDisplayPath(versioningFolder_->getAbstractPath(relativePath)));
+ ABF::removeFolderSimple(folderPath); //throw FileError
}
diff --git a/FreeFileSync/Source/lib/versioning.h b/FreeFileSync/Source/lib/versioning.h
index 02a6c6e2..9c731007 100644
--- a/FreeFileSync/Source/lib/versioning.h
+++ b/FreeFileSync/Source/lib/versioning.h
@@ -40,7 +40,7 @@ public:
throw std::logic_error("Programming Error: Contract violation! " + std::string(__FILE__) + ":" + numberTo<std::string>(__LINE__));
if (timeStamp_.size() != 17) //formatTime() returns empty string on error; unexpected length: e.g. problem in year 10000!
- throw FileError(_("Unable to create time stamp for versioning:") + L" \"" + timeStamp_ + L"\"");
+ throw FileError(_("Unable to create time stamp for versioning:") + L" \"" + utfCvrtTo<std::wstring>(timeStamp_) + L"\"");
//honor strong exception safety guarantee:
versioningFolder_ = std::move(versioningFolder); //noexcept
@@ -55,23 +55,23 @@ public:
void revisionFolder(const AbstractPathRef& folderPath, const Zstring& relativePath, //throw FileError
//optional callbacks: may be nullptr
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeFileMove, //one call for each *existing* object!
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeDirMove, //
+ const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeFileMove, //one call for each *existing* object!
+ const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeFolderMove, //
//called frequently if move has to revert to copy + delete => see zen::copyFile for limitations when throwing exceptions!
const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus);
//void limitVersions(std::function<void()> updateUI); //throw FileError; call when done revisioning!
private:
- bool revisionFileImpl(const AbstractPathRef& filePath, const Zstring& relativePath,
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeFileMove,
- const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus); //throw FileError
-
void revisionFolderImpl(const AbstractPathRef& folderPath, const Zstring& relativePath,
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeFileMove,
- const std::function<void(const Zstring& displayPathFrom, const Zstring& displayPathTo)>& onBeforeDirMove,
+ 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,
const std::function<void(std::int64_t bytesDelta)>& onNotifyCopyStatus); //throw FileError
+ void moveItemToVersioning(const AbstractPathRef& itemPath, //throw FileError
+ const Zstring& relativePath,
+ const std::function<void(const AbstractPathRef& sourcePath, const AbstractPathRef& targetPath)>& moveItem); //may throw FileError
+
const VersioningStyle versioningStyle_;
const Zstring timeStamp_;
std::unique_ptr<AbstractBaseFolder> versioningFolder_; //always bound!
diff --git a/FreeFileSync/Source/synchronization.cpp b/FreeFileSync/Source/synchronization.cpp
index 7181b3e2..501ef39f 100644
--- a/FreeFileSync/Source/synchronization.cpp
+++ b/FreeFileSync/Source/synchronization.cpp
@@ -408,11 +408,11 @@ DeletionHandling::DeletionHandling(ABF& baseFolder,
case DELETE_TO_VERSIONING:
{
versioningFolder = createAbstractBaseFolder(versioningFolderPhrase); //noexcept
- const std::wstring versioningPathFmt = fmtFileName(ABF::getDisplayPath(versioningFolder->getAbstractPath()));
+ const std::wstring displayPathFmt = fmtPath(ABF::getDisplayPath(versioningFolder->getAbstractPath()));
- txtRemovingFile = replaceCpy(_("Moving file %x to %y" ), L"%y", versioningPathFmt);
- txtRemovingDirectory = replaceCpy(_("Moving folder %x to %y" ), L"%y", versioningPathFmt);
- txtRemovingSymlink = replaceCpy(_("Moving symbolic link %x to %y"), L"%y", versioningPathFmt);
+ txtRemovingFile = replaceCpy(_("Moving file %x to %y" ), L"%y", displayPathFmt);
+ txtRemovingDirectory = replaceCpy(_("Moving folder %x to %y" ), L"%y", displayPathFmt);
+ txtRemovingSymlink = replaceCpy(_("Moving symbolic link %x to %y"), L"%y", displayPathFmt);
}
break;
}
@@ -429,10 +429,10 @@ void DeletionHandling::tryCleanup(bool allowUserCallback) //throw FileError; thr
case DELETE_TO_RECYCLER:
if (recyclerSession.get())
{
- auto notifyDeletionStatus = [&](const Zstring& displayPath)
+ auto notifyDeletionStatus = [&](const std::wstring& displayPath)
{
if (!displayPath.empty())
- procCallback_.reportStatus(replaceCpy(txtRemovingFile, L"%x", fmtFileName(displayPath))); //throw ?
+ procCallback_.reportStatus(replaceCpy(txtRemovingFile, L"%x", fmtPath(displayPath))); //throw ?
else
procCallback_.requestUiRefresh(); //throw ?
};
@@ -471,15 +471,15 @@ void DeletionHandling::removeDirWithCallback(const AbstractPathRef& dirPath,
{
case DELETE_PERMANENTLY:
{
- auto notifyDeletion = [&](const std::wstring& statusText, const Zstring& displayPath)
+ auto notifyDeletion = [&](const std::wstring& statusText, const std::wstring& displayPath)
{
onNotifyItemDeletion(); //it would be more correct to report *after* work was done!
- procCallback_.reportStatus(replaceCpy(statusText, L"%x", fmtFileName(displayPath)));
+ procCallback_.reportStatus(replaceCpy(statusText, L"%x", fmtPath(displayPath)));
};
- auto onBeforeFileDeletion = [&](const Zstring& displayPath) { notifyDeletion(txtRemovingFile, displayPath); };
- auto onBeforeDirDeletion = [&](const Zstring& displayPath) { notifyDeletion(txtRemovingDirectory, displayPath); };
+ auto onBeforeFileDeletion = [&](const std::wstring& displayPath) { notifyDeletion(txtRemovingFile, displayPath); };
+ auto onBeforeDirDeletion = [&](const std::wstring& displayPath) { notifyDeletion(txtRemovingDirectory, displayPath); };
- ABF::removeFolder(dirPath, onBeforeFileDeletion, onBeforeDirDeletion); //throw FileError
+ ABF::removeFolderRecursively(dirPath, onBeforeFileDeletion, onBeforeDirDeletion); //throw FileError
}
break;
@@ -490,15 +490,15 @@ void DeletionHandling::removeDirWithCallback(const AbstractPathRef& dirPath,
case DELETE_TO_VERSIONING:
{
- auto notifyMove = [&](const std::wstring& statusText, const Zstring& displayPathFrom, const Zstring& displayPathTo)
+ auto notifyMove = [&](const std::wstring& statusText, const std::wstring& displayPathFrom, const std::wstring& displayPathTo)
{
onNotifyItemDeletion(); //it would be more correct to report *after* work was done!
- procCallback_.reportStatus(replaceCpy(replaceCpy(statusText, L"%x", L"\n" + fmtFileName(displayPathFrom)), L"%y", L"\n" + fmtFileName(displayPathTo)));
+ procCallback_.reportStatus(replaceCpy(replaceCpy(statusText, L"%x", L"\n" + fmtPath(displayPathFrom)), L"%y", L"\n" + fmtPath(displayPathTo)));
};
- auto onBeforeFileMove = [&](const Zstring& displayPathFrom, const Zstring& displayPathTo) { notifyMove(txtMovingFile, displayPathFrom, displayPathTo); };
- auto onBeforeDirMove = [&](const Zstring& displayPathFrom, const Zstring& displayPathTo) { notifyMove(txtMovingFolder, displayPathFrom, displayPathTo); };
+ auto onBeforeFileMove = [&](const std::wstring& displayPathFrom, const std::wstring& displayPathTo) { notifyMove(txtMovingFile, displayPathFrom, displayPathTo); };
+ auto onBeforeFolderMove = [&](const std::wstring& displayPathFrom, const std::wstring& displayPathTo) { notifyMove(txtMovingFolder, displayPathFrom, displayPathTo); };
- getOrCreateVersioner().revisionFolder(dirPath, relativePath, onBeforeFileMove, onBeforeDirMove, onNotifyCopyStatus); //throw FileError
+ getOrCreateVersioner().revisionFolder(dirPath, relativePath, onBeforeFileMove, onBeforeFolderMove, onNotifyCopyStatus); //throw FileError
}
break;
}
@@ -701,13 +701,13 @@ private:
void synchronizeFolder(DirPair& dirObj);
template <SelectedSide sideTrg> void synchronizeFolderInt(DirPair& dirObj, SyncOperation syncOp);
- void reportStatus(const std::wstring& rawText, const Zstring& objname) const { procCallback_.reportStatus(replaceCpy(rawText, L"%x", fmtFileName(objname))); };
- void reportInfo (const std::wstring& rawText, const Zstring& objname) const { procCallback_.reportInfo (replaceCpy(rawText, L"%x", fmtFileName(objname))); };
+ void reportStatus(const std::wstring& rawText, const std::wstring& displayPath) const { procCallback_.reportStatus(replaceCpy(rawText, L"%x", fmtPath(displayPath))); };
+ void reportInfo (const std::wstring& rawText, const std::wstring& displayPath) const { procCallback_.reportInfo (replaceCpy(rawText, L"%x", fmtPath(displayPath))); };
void reportInfo (const std::wstring& rawText,
- const Zstring& objname1,
- const Zstring& objname2) const
+ const std::wstring& displayPath1,
+ const std::wstring& displayPath2) const
{
- procCallback_.reportInfo(replaceCpy(replaceCpy(rawText, L"%x", L"\n" + fmtFileName(objname1)), L"%y", L"\n" + fmtFileName(objname2)));
+ procCallback_.reportInfo(replaceCpy(replaceCpy(rawText, L"%x", L"\n" + fmtPath(displayPath1)), L"%y", L"\n" + fmtPath(displayPath2)));
};
ABF::FileAttribAfterCopy copyFileWithCallback(const AbstractPathRef& sourcePath,
@@ -820,7 +820,7 @@ void SynchronizeFolderPair::prepare2StepMove(FilePair& sourceObj,
sourceObj.getFileId <side>(),
sourceObj.isFollowedSymlink<side>());
- FilePair& tempFile = sourceObj.root().addSubFile<side>(afterLast(sourceRelPathTmp, FILE_NAME_SEPARATOR), descrSource);
+ FilePair& tempFile = sourceObj.root().addSubFile<side>(afterLast(sourceRelPathTmp, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL), descrSource);
static_assert(IsSameType<FixedList<FilePair>, HierarchyObject::SubFileVec>::value,
"ATTENTION: we're adding to the file list WHILE looping over it! This is only working because FixedList iterators are not invalidated by insertion!");
sourceObj.removeObject<side>(); //remove only *after* evaluating "sourceObj, side"!
@@ -1335,7 +1335,7 @@ void SynchronizeFolderPair::synchronizeFileInt(FilePair& fileObj, SyncOperation
if (fileObj.getLastWriteTime<sideTrg>() != fileObj.getLastWriteTime<sideSrc>())
//- no need to call sameFileTime() or respect 2 second FAT/FAT32 precision in this comparison
//- do NOT read *current* source file time, but use buffered value which corresponds to time of comparison!
- ABF::setFileTime(fileObj.getAbstractPath<sideTrg>(), fileObj.getLastWriteTime<sideSrc>(), ABF::SymlinkHandling::FOLLOW); //throw FileError
+ ABF::setModTime(fileObj.getAbstractPath<sideTrg>(), fileObj.getLastWriteTime<sideSrc>()); //throw FileError
//-> both sides *should* be completely equal now...
assert(fileObj.getFileSize<sideTrg>() == fileObj.getFileSize<sideSrc>());
@@ -1478,7 +1478,7 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymlinkPair& linkObj, SyncOperati
if (linkObj.getLastWriteTime<sideTrg>() != linkObj.getLastWriteTime<sideSrc>())
//- no need to call sameFileTime() or respect 2 second FAT/FAT32 precision in this comparison
//- do NOT read *current* source file time, but use buffered value which corresponds to time of comparison!
- ABF::setFileTime(linkObj.getAbstractPath<sideTrg>(), linkObj.getLastWriteTime<sideSrc>(), ABF::SymlinkHandling::DIRECT); //throw FileError
+ ABF::setModTimeSymlink(linkObj.getAbstractPath<sideTrg>(), linkObj.getLastWriteTime<sideSrc>()); //throw FileError
//-> both sides *should* be completely equal now...
linkObj.setSyncedTo<sideTrg>(linkObj.getItemName<sideSrc>(),
@@ -1531,6 +1531,7 @@ void SynchronizeFolderPair::synchronizeFolderInt(DirPair& dirObj, SyncOperation
if (parentDir->isEmpty<sideTrg>()) //BaseDirPair OTOH is always non-empty and existing in this context => else: fatal error in zen::synchronize()
return; //if parent directory creation failed, there's no reason to show more errors!
+ warn_static("save this file access:")
if (ABF::somethingExists(dirObj.getAbstractPath<sideSrc>())) //do not check on type (symlink, file, folder) -> if there is a type change, FFS should error out!
{
const AbstractPathRef targetPath = dirObj.getABF<sideTrg>().getAbstractPath(dirObj.getRelativePath<sideSrc>());
@@ -1636,20 +1637,20 @@ void verifyFiles(const AbstractPathRef& sourcePath, const AbstractPathRef& targe
FILE_ATTRIBUTE_NORMAL, //_In_ DWORD dwFlagsAndAttributes,
nullptr); //_In_opt_ HANDLE hTemplateFile
if (fileHandle == INVALID_HANDLE_VALUE)
- throwFileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtFileName(*nativeTargetPath)), L"CreateFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(*nativeTargetPath)), L"CreateFile", getLastError());
ZEN_ON_SCOPE_EXIT(::CloseHandle(fileHandle));
if (!::FlushFileBuffers(fileHandle))
- throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(*nativeTargetPath)), L"FlushFileBuffers", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(*nativeTargetPath)), L"FlushFileBuffers", getLastError());
#elif defined ZEN_LINUX || defined ZEN_MAC
const int fileHandle = ::open(nativeTargetPath->c_str(), O_WRONLY);
if (fileHandle == -1)
- throwFileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtFileName(*nativeTargetPath)), L"open", getLastError());
+ throwFileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(*nativeTargetPath)), L"open", getLastError());
ZEN_ON_SCOPE_EXIT(::close(fileHandle));
if (::fsync(fileHandle) != 0)
- throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(*nativeTargetPath)), L"fsync", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(*nativeTargetPath)), L"fsync", getLastError());
#endif
} //close file handles!
@@ -1657,8 +1658,8 @@ void verifyFiles(const AbstractPathRef& sourcePath, const AbstractPathRef& targe
if (!filesHaveSameContent(sourcePath, targetPath, onUpdateStatus)) //throw FileError
throw FileError(replaceCpy(replaceCpy(_("%x and %y have different content."), L"%x", L"\n" +
- fmtFileName(ABF::getDisplayPath(sourcePath))), L"%y", L"\n" +
- fmtFileName(ABF::getDisplayPath(targetPath))));
+ fmtPath(ABF::getDisplayPath(sourcePath))), L"%y", L"\n" +
+ fmtPath(ABF::getDisplayPath(targetPath))));
}
catch (const FileError& e) //add some context to error message
{
@@ -1685,7 +1686,7 @@ ABF::FileAttribAfterCopy SynchronizeFolderPair::copyFileWithCallback(const Abstr
{
auto guardTarget = makeGuard([&] { ABF::removeFile(targetPath); }); //delete target if verification fails
- procCallback_.reportInfo(replaceCpy(txtVerifying, L"%x", fmtFileName(ABF::getDisplayPath(targetPath))));
+ procCallback_.reportInfo(replaceCpy(txtVerifying, L"%x", fmtPath(ABF::getDisplayPath(targetPath))));
verifyFiles(sourcePathTmp, targetPath, [&](std::int64_t bytesDelta) { procCallback_.requestUiRefresh(); }); //throw FileError
guardTarget.dismiss();
@@ -1711,7 +1712,7 @@ ABF::FileAttribAfterCopy SynchronizeFolderPair::copyFileWithCallback(const Abstr
nativeShadowPath = shadowCopyHandler_->makeShadowCopy(*nativeSourcePath, //throw FileError
[&](const Zstring& volumeName)
{
- procCallback_.reportStatus(replaceCpy(_("Creating a Volume Shadow Copy for %x..."), L"%x", fmtFileName(volumeName)));
+ procCallback_.reportStatus(replaceCpy(_("Creating a Volume Shadow Copy for %x..."), L"%x", fmtPath(volumeName)));
});
}
catch (const FileError& e2) //enhance error message
@@ -1744,18 +1745,23 @@ bool createBaseDirectory(BaseDirPair& baseDirObj, ProcessCallback& callback) //n
bool temporaryNetworkDrop = false;
zen::Opt<std::wstring> errMsg = tryReportingError([&]
{
- const AbstractPathRef baseFolder = baseDirObj.getABF<side>().getAbstractPath();
+ const AbstractPathRef baseFolderPath = baseDirObj.getABF<side>().getAbstractPath();
try
{
//a nice race-free check and set operation:
- ABF::createNewFolder(baseFolder); //throw FileError, ErrorTargetExisting
+ ABF::createFolderSimple(baseFolderPath); //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
baseDirObj.setExisting<side>(true); //update our model!
}
- catch (const ErrorTargetExisting&)
+ catch (ErrorTargetPathMissing&)
+ {
+ ABF::createFolderRecursively(baseFolderPath); //throw FileError
+ baseDirObj.setExisting<side>(true); //update our model!
+ }
+ catch (ErrorTargetExisting&)
{
//TEMPORARY network drop! base directory not found during comparison, but reappears during synchronization
//=> sync-directions are based on false assumptions! Abort.
- callback.reportFatalError(replaceCpy(_("Target folder %x already existing."), L"%x", fmtFileName(ABF::getDisplayPath(baseFolder))));
+ callback.reportFatalError(replaceCpy(_("Target folder %x already existing."), L"%x", fmtPath(ABF::getDisplayPath(baseFolderPath))));
temporaryNetworkDrop = true;
//Is it possible we're catching a "false-positive" here, could FFS have created the directory indirectly after comparison?
@@ -1844,7 +1850,7 @@ void zen::synchronize(const TimeComp& timeStamp,
if (Opt<std::wstring> errMsg = tryReportingError([&]
{
if (!folderExistsUpdating(baseFolder, false, callback))
- throw FileError(replaceCpy(_("Cannot find folder %x."), L"%x", fmtFileName(ABF::getDisplayPath(baseFolder.getAbstractPath()))));
+ throw FileError(replaceCpy(_("Cannot find folder %x."), L"%x", fmtPath(ABF::getDisplayPath(baseFolder.getAbstractPath()))));
//should be logged as a "fatal error" if ignored by the user...
}, callback)) //throw X?
return true;
@@ -1973,7 +1979,7 @@ void zen::synchronize(const TimeComp& timeStamp,
//https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3531351&group_id=234430 -> fixed, but still better not consider conflicts!
if (!wasExisting) //avoid race-condition: we need to evaluate existence status from time of comparison!
{
- callback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtFileName(ABF::getDisplayPath(baseFolder.getAbstractPath()))));
+ callback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtPath(ABF::getDisplayPath(baseFolder.getAbstractPath()))));
return true;
}
return false;
@@ -2030,7 +2036,7 @@ void zen::synchronize(const TimeComp& timeStamp,
if (recyclerSupported.find(&baseFolder) == recyclerSupported.end()) //perf: avoid duplicate checks!
{
callback.reportStatus(replaceCpy(_("Checking recycle bin availability for folder %x..."), L"%x",
- fmtFileName(ABF::getDisplayPath(baseFolder.getAbstractPath()))));
+ fmtPath(ABF::getDisplayPath(baseFolder.getAbstractPath()))));
bool recSupported = false;
tryReportingError([&]
{
@@ -2059,7 +2065,7 @@ void zen::synchronize(const TimeComp& timeStamp,
std::wstring msg = _("The following items have unresolved conflicts and will not be synchronized:");
for (const auto& item : statisticsTotal.getConflictMessages()) //show *all* conflicts in warning message
- msg += L"\n\n" + fmtFileName(item.first) + L": " + item.second;
+ msg += L"\n\n" + fmtPath(item.first) + L": " + item.second;
callback.reportWarning(msg, warnings.warningUnresolvedConflicts);
}
@@ -2067,10 +2073,10 @@ void zen::synchronize(const TimeComp& timeStamp,
//check if user accidentally selected wrong directories for sync
if (!significantDiffPairs.empty())
{
- std::wstring msg = _("The following folders are significantly different. Make sure you are matching the correct folders for synchronization.");
+ std::wstring msg = _("The following folders are significantly different. Make sure you have selected the correct folders for synchronization.");
for (const auto& item : significantDiffPairs)
- msg += std::wstring(L"\n\n") +
+ msg += L"\n\n" +
ABF::getDisplayPath(item.first ->getAbstractPath()) + L" <-> " + L"\n" +
ABF::getDisplayPath(item.second->getAbstractPath());
@@ -2083,8 +2089,7 @@ void zen::synchronize(const TimeComp& timeStamp,
std::wstring msg = _("Not enough free disk space available in:");
for (const auto& item : diskSpaceMissing)
- msg += std::wstring(L"\n\n") +
- ABF::getDisplayPath(item.first->getAbstractPath()) + L"\n" +
+ msg += L"\n\n" + ABF::getDisplayPath(item.first->getAbstractPath()) + L"\n" +
_("Required:") + L" " + filesizeToShortString(item.second.first) + L"\n" +
_("Available:") + L" " + filesizeToShortString(item.second.second);
@@ -2096,7 +2101,7 @@ void zen::synchronize(const TimeComp& timeStamp,
std::wstring dirListMissingRecycler;
for (const auto& item : recyclerSupported)
if (!item.second)
- dirListMissingRecycler += std::wstring(L"\n") + ABF::getDisplayPath(item.first->getAbstractPath());
+ dirListMissingRecycler += L"\n" + ABF::getDisplayPath(item.first->getAbstractPath());
if (!dirListMissingRecycler.empty())
callback.reportWarning(_("The recycle bin is not available for the following folders. Files will be deleted permanently instead:") + L"\n" +
@@ -2114,7 +2119,7 @@ void zen::synchronize(const TimeComp& timeStamp,
{
std::wstring msg = _("Multiple folder pairs write to a common subfolder. Please review your configuration.") + L"\n";
for (const ABF* baseFolder : conflictFolders)
- msg += std::wstring(L"\n") + ABF::getDisplayPath(baseFolder->getAbstractPath());
+ msg += L"\n" + ABF::getDisplayPath(baseFolder->getAbstractPath());
callback.reportWarning(msg, warnings.warningFolderPairRaceCondition);
}
diff --git a/FreeFileSync/Source/ui/batch_config.cpp b/FreeFileSync/Source/ui/batch_config.cpp
index d1fcc890..420e25db 100644
--- a/FreeFileSync/Source/ui/batch_config.cpp
+++ b/FreeFileSync/Source/ui/batch_config.cpp
@@ -83,7 +83,7 @@ BatchDialog::BatchDialog(wxWindow* parent,
m_bitmapBatchJob->SetBitmap(getResourceImage(L"batch"));
- logfileDir = make_unique<FolderSelector>(*m_panelLogfile, *m_buttonSelectLogfileDir, *m_logfileDir);
+ logfileDir = make_unique<FolderSelector>(*m_panelLogfile, *m_buttonSelectLogfileDir, *m_bpButtonSelectSftp, *m_logfileDir);
setConfig(batchCfg);
diff --git a/FreeFileSync/Source/ui/batch_status_handler.cpp b/FreeFileSync/Source/ui/batch_status_handler.cpp
index 47ee032e..0872e9c6 100644
--- a/FreeFileSync/Source/ui/batch_status_handler.cpp
+++ b/FreeFileSync/Source/ui/batch_status_handler.cpp
@@ -32,11 +32,7 @@ std::pair<std::unique_ptr<ABF::OutputStream>, AbstractPathRef> prepareNewLogfile
assert(!jobName.empty());
//create logfile directory if required
- try
- {
- ABF::createNewFolder(abf.getAbstractPath()); //throw FileError, ErrorTargetExisting
- }
- catch (const FileError&) { if (!ABF::dirExists(abf.getAbstractPath())) throw; }
+ ABF::createFolderRecursively(abf.getAbstractPath()); //throw FileError
//const std::string colon = "\xcb\xb8"; //="modifier letter raised colon" => regular colon is forbidden in file names on Windows and OS X
//=> too many issues, most notably cmd.exe is not Unicode-awere: http://sourceforge.net/p/freefilesync/discussion/open-discussion/thread/c559a5fb/
@@ -80,8 +76,8 @@ struct LogTraverserCallback: public ABF::TraverserCallback
if (onUpdateStatus_)
onUpdateStatus_();
}
- TraverserCallback* onDir (const DirInfo& di) override { return nullptr; }
- HandleLink onSymlink(const SymlinkInfo& si) override { return TraverserCallback::LINK_SKIP; }
+ std::unique_ptr<TraverserCallback> onDir (const DirInfo& di) override { return nullptr; }
+ HandleLink onSymlink(const SymlinkInfo& si) override { return TraverserCallback::LINK_SKIP; }
HandleError reportDirError (const std::wstring& msg, size_t retryNumber) override { assert(false); return ON_ERROR_IGNORE; } //errors are not critical in this context
HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zchar* shortName) override { assert(false); return ON_ERROR_IGNORE; } //
@@ -153,14 +149,14 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress,
logFolderPathPhrase_(logFolderPathPhrase)
{
//ATTENTION: "progressDlg" is an unmanaged resource!!! However, at this point we already consider construction complete! =>
- ScopeGuard guardConstructor = zen::makeGuard([&] { this->~BatchStatusHandler(); });
+ ScopeGuard constructorGuard = zen::makeGuard([&] { /*cleanup();*/ /*destructor call would lead to member double clean-up!!!*/ });
//...
//if (logFile)
// ::wxSetEnv(L"logfile", utfCvrtTo<wxString>(logFile->getFilename()));
- guardConstructor.dismiss();
+ constructorGuard.dismiss();
}
@@ -279,7 +275,7 @@ BatchStatusHandler::~BatchStatusHandler()
//----------------- write results into LastSyncs.log------------------------
try
{
- saveToLastSyncsLog(summary, errorLog, lastSyncsLogFileSizeMax_, OnUpdateLogfileStatusNoThrow(*this, getLastSyncsLogfilePath())); //throw FileError
+ saveToLastSyncsLog(summary, errorLog, lastSyncsLogFileSizeMax_, OnUpdateLogfileStatusNoThrow(*this, utfCvrtTo<std::wstring>(getLastSyncsLogfilePath()))); //throw FileError
}
catch (FileError&) { assert(false); }
@@ -309,7 +305,7 @@ BatchStatusHandler::~BatchStatusHandler()
while (progressDlg)
{
wxTheApp->Yield(); //*first* refresh GUI (removing flicker) before sleeping!
- boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(UI_UPDATE_INTERVAL)); //throw boost::thread_interrupted -> not expected => main thread!
}
}
}
@@ -403,7 +399,7 @@ ProcessCallback::Response BatchStatusHandler::reportError(const std::wstring& er
{
reportStatus(_("Error") + L": " + _P("Automatic retry in 1 second...", "Automatic retry in %x seconds...",
(1000 * automaticRetryDelay_ - i * UI_UPDATE_INTERVAL + 999) / 1000)); //integer round up
- boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(UI_UPDATE_INTERVAL)); //throw boost::thread_interrupted
}
return ProcessCallback::RETRY;
}
diff --git a/FreeFileSync/Source/ui/check_version.cpp b/FreeFileSync/Source/ui/check_version.cpp
index f4748be7..716b8fdf 100644
--- a/FreeFileSync/Source/ui/check_version.cpp
+++ b/FreeFileSync/Source/ui/check_version.cpp
@@ -51,11 +51,8 @@ std::wstring getIso639Language()
if (localeName.empty())
return std::wstring();
- if (contains(localeName, L"_"))
- return beforeLast(localeName, L"_");
-
- assert(localeName.size() == 2);
- return localeName;
+ assert(beforeLast(localeName, L"_", IF_MISSING_RETURN_ALL).size() == 2);
+ return beforeLast(localeName, L"_", IF_MISSING_RETURN_ALL);
}
std::wstring getIso3166Country()
@@ -75,10 +72,7 @@ std::wstring getIso3166Country()
if (localeName.empty())
return std::wstring();
- if (contains(localeName, L"_"))
- return afterLast(localeName, L"_");
-
- return std::wstring();
+ return afterLast(localeName, L"_", IF_MISSING_RETURN_NONE);
}
@@ -237,12 +231,12 @@ bool canAccessUrl(const wxString& server, const wxString& page, int timeout) //t
if (rs == 301 || //http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection
rs == 302 ||
rs == 303 ||
- rs == 307 ||
- rs == 308)
- return true;
+ rs == 307 ||
+ rs == 308)
+ return true;
if (rs == 200) //HTTP_STATUS_OK
- return true;
+ return true;
}
return false;
}
@@ -268,19 +262,19 @@ bool getStringFromUrl(const wxString& server, const wxString& page, int timeout,
if (rs == 301 || //http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection
rs == 302 ||
rs == 303 ||
- rs == 307 ||
- rs == 308)
+ rs == 307 ||
+ rs == 308)
if (level < 5) //"A user agent should not automatically redirect a request more than five times, since such redirections usually indicate an infinite loop."
{
wxString newLocation = webAccess.GetHeader(L"Location");
if (!newLocation.empty())
{
- assert(!startsWith(newLocation, L"https:")); //not supported by wxHTTP!
+ assert(!startsWith(newLocation, L"https:")); //not supported by wxHTTP!
if (startsWith(newLocation, L"http://"))
- newLocation = afterFirst(newLocation, L"://");
- const wxString serverNew = beforeFirst(newLocation, L"/"); //returns the whole string if term not found
- const wxString pageNew = L"/" + afterFirst(newLocation, L"/"); //returns empty string if term not found
+ newLocation = afterFirst(newLocation, L"://", IF_MISSING_RETURN_NONE);
+ const wxString serverNew = beforeFirst(newLocation, L'/', IF_MISSING_RETURN_ALL);
+ const wxString pageNew = L'/' + afterFirst(newLocation, L'/', IF_MISSING_RETURN_NONE);
return getStringFromUrl(serverNew, pageNew, timeout, output, level + 1);
}
@@ -316,7 +310,7 @@ GetVerResult getOnlineVersion(wxString& version)
std::vector<char> output;
try
{
- //harmonize with wxHTTP: latest_version.txt does not use https!!!
+ //harmonize with wxHTTP: latest_version.txt does not use https!!!
readBytesUrl(L"http://www.freefilesync.org/latest_version.txt", std::back_inserter(output)); //throw InternetConnectionError
}
catch (const InternetConnectionError&)
@@ -329,7 +323,7 @@ GetVerResult getOnlineVersion(wxString& version)
#else
if (!getStringFromUrl(L"www.freefilesync.org", L"/latest_version.txt", 5, &version))
{
- return canAccessUrl(L"www.google.com", L"/", 1) ? GET_VER_PAGE_NOT_FOUND : GET_VER_NO_CONNECTION;
+ return canAccessUrl(L"www.google.com", L"/", 1) ? GET_VER_PAGE_NOT_FOUND : GET_VER_NO_CONNECTION;
}
#endif
trim(version); //Windows: remove trailing blank and newline
diff --git a/FreeFileSync/Source/ui/custom_grid.cpp b/FreeFileSync/Source/ui/custom_grid.cpp
index 1ff91f2b..32a84b96 100644
--- a/FreeFileSync/Source/ui/custom_grid.cpp
+++ b/FreeFileSync/Source/ui/custom_grid.cpp
@@ -400,23 +400,23 @@ private:
switch (colType_)
{
case COL_TYPE_FULL_PATH:
- return fileObj.isEmpty<side>() ? wxString() : toWx(ABF::getDisplayPath(fileObj.getAbstractPath<side>()));
+ return fileObj.isEmpty<side>() ? std::wstring() : ABF::getDisplayPath(fileObj.getAbstractPath<side>());
case COL_TYPE_FILENAME:
- return toWx(fileObj.getItemName<side>());
+ return utfCvrtTo<std::wstring>(fileObj.getItemName<side>());
case COL_TYPE_REL_FOLDER:
- return toWx(beforeLast(fileObj.getPairRelativePath(), FILE_NAME_SEPARATOR)); //returns empty string if ch not found
+ return utfCvrtTo<std::wstring>(beforeLast(fileObj.getPairRelativePath(), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE));
case COL_TYPE_BASE_DIRECTORY:
- return toWx(ABF::getDisplayPath(fileObj.getABF<side>().getAbstractPath()));
+ return ABF::getDisplayPath(fileObj.getABF<side>().getAbstractPath());
case COL_TYPE_SIZE:
- //return fileObj.isEmpty<side>() ? wxString() : utfCvrtTo<wxString>(fileObj.getFileId<side>()); // -> test file id
- return fileObj.isEmpty<side>() ? wxString() : wxString(toGuiString(fileObj.getFileSize<side>()));
+ //return fileObj.isEmpty<side>() ? std::wstring() : utfCvrtTo<std::wstring>(fileObj.getFileId<side>()); // -> test file id
+ return fileObj.isEmpty<side>() ? std::wstring() : toGuiString(fileObj.getFileSize<side>());
case COL_TYPE_DATE:
- return fileObj.isEmpty<side>() ? wxString() : wxString(utcToLocalTimeString(fileObj.getLastWriteTime<side>()));
+ return fileObj.isEmpty<side>() ? std::wstring() : utcToLocalTimeString(fileObj.getLastWriteTime<side>());
case COL_TYPE_EXTENSION:
- return toWx(getFileExtension(fileObj.getItemName<side>()));
+ return utfCvrtTo<std::wstring>(getFileExtension(fileObj.getItemName<side>()));
}
assert(false);
- return wxString();
+ return std::wstring();
}();
}
@@ -427,22 +427,22 @@ private:
switch (colType_)
{
case COL_TYPE_FULL_PATH:
- return linkObj.isEmpty<side>() ? wxString() : toWx(ABF::getDisplayPath(linkObj.getAbstractPath<side>()));
+ return linkObj.isEmpty<side>() ? std::wstring() : ABF::getDisplayPath(linkObj.getAbstractPath<side>());
case COL_TYPE_FILENAME:
- return toWx(linkObj.getItemName<side>());
+ return utfCvrtTo<std::wstring>(linkObj.getItemName<side>());
case COL_TYPE_REL_FOLDER:
- return toWx(beforeLast(linkObj.getPairRelativePath(), FILE_NAME_SEPARATOR)); //returns empty string if ch not found
+ return utfCvrtTo<std::wstring>(beforeLast(linkObj.getPairRelativePath(), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE));
case COL_TYPE_BASE_DIRECTORY:
- return toWx(ABF::getDisplayPath(linkObj.getABF<side>().getAbstractPath()));
+ return ABF::getDisplayPath(linkObj.getABF<side>().getAbstractPath());
case COL_TYPE_SIZE:
- return linkObj.isEmpty<side>() ? wxString() : wxString(L"<" + _("Symlink") + L">");
+ return linkObj.isEmpty<side>() ? std::wstring() : L"<" + _("Symlink") + L">";
case COL_TYPE_DATE:
- return linkObj.isEmpty<side>() ? wxString() : wxString(utcToLocalTimeString(linkObj.getLastWriteTime<side>()));
+ return linkObj.isEmpty<side>() ? std::wstring() : utcToLocalTimeString(linkObj.getLastWriteTime<side>());
case COL_TYPE_EXTENSION:
- return toWx(getFileExtension(linkObj.getItemName<side>()));
+ return utfCvrtTo<std::wstring>(getFileExtension(linkObj.getItemName<side>()));
}
assert(false);
- return wxString();
+ return std::wstring();
}();
}
@@ -453,32 +453,32 @@ private:
switch (colType_)
{
case COL_TYPE_FULL_PATH:
- return dirObj.isEmpty<side>() ? wxString() : toWx(ABF::getDisplayPath(dirObj.getAbstractPath<side>()));
+ return dirObj.isEmpty<side>() ? std::wstring() : ABF::getDisplayPath(dirObj.getAbstractPath<side>());
case COL_TYPE_FILENAME:
- return toWx(dirObj.getItemName<side>());
+ return utfCvrtTo<std::wstring>(dirObj.getItemName<side>());
case COL_TYPE_REL_FOLDER:
- return toWx(beforeLast(dirObj.getPairRelativePath(), FILE_NAME_SEPARATOR)); //returns empty string if ch not found
+ return utfCvrtTo<std::wstring>(beforeLast(dirObj.getPairRelativePath(), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE));
case COL_TYPE_BASE_DIRECTORY:
- return toWx(ABF::getDisplayPath(dirObj.getABF<side>().getAbstractPath()));
+ return ABF::getDisplayPath(dirObj.getABF<side>().getAbstractPath());
case COL_TYPE_SIZE:
- return dirObj.isEmpty<side>() ? wxString() : wxString(L"<" + _("Folder") + L">");
+ return dirObj.isEmpty<side>() ? std::wstring() : L"<" + _("Folder") + L">";
case COL_TYPE_DATE:
- return wxString();
+ return std::wstring();
case COL_TYPE_EXTENSION:
- return wxString();
+ return std::wstring();
}
assert(false);
- return wxString();
+ return std::wstring();
}();
}
- ColumnTypeRim colType_;
- wxString value;
+ const ColumnTypeRim colType_;
+ std::wstring value; //out
} getVal(static_cast<ColumnTypeRim>(colType));
fsObj->accept(getVal);
return getVal.value;
}
//if data is not found:
- return wxEmptyString;
+ return wxString();
}
static const int GAP_SIZE = 2;
@@ -697,18 +697,18 @@ private:
wxString getToolTip(size_t row, ColumnType colType) const override
{
- wxString toolTip;
+ std::wstring toolTip;
if (const FileSystemObject* fsObj = getRawData(row))
if (!fsObj->isEmpty<side>())
{
- toolTip = toWx(getGridDataView() && getGridDataView()->getFolderPairCount() > 1 ?
- ABF::getDisplayPath(fsObj->getAbstractPath<side>()) :
- fsObj->getRelativePath<side>());
+ toolTip = getGridDataView() && getGridDataView()->getFolderPairCount() > 1 ?
+ ABF::getDisplayPath(fsObj->getAbstractPath<side>()) :
+ utfCvrtTo<std::wstring>(fsObj->getRelativePath<side>());
struct AssembleTooltip : public FSObjectVisitor
{
- AssembleTooltip(wxString& tipMsg) : tipMsg_(tipMsg) {}
+ AssembleTooltip(std::wstring& tipMsg) : tipMsg_(tipMsg) {}
void visit(const FilePair& fileObj) override
{
@@ -725,7 +725,7 @@ private:
void visit(const DirPair& dirObj) override {}
- wxString& tipMsg_;
+ std::wstring& tipMsg_;
} assembler(toolTip);
fsObj->accept(assembler);
}
diff --git a/FreeFileSync/Source/ui/folder_selector.cpp b/FreeFileSync/Source/ui/folder_selector.cpp
index 6a8ab3cf..09fd1c4d 100644
--- a/FreeFileSync/Source/ui/folder_selector.cpp
+++ b/FreeFileSync/Source/ui/folder_selector.cpp
@@ -11,11 +11,13 @@
#include <wx/scrolwin.h>
#include <wx+/string_conv.h>
#include <wx+/popup_dlg.h>
+#include <wx+/image_resources.h>
#include "../fs/concrete.h"
#include "../fs/native.h"
#ifdef ZEN_WIN_VISTA_AND_LATER
- #include "../fs/mtp.h"
+ #include "small_dlgs.h"
#include "ifile_dialog.h"
+ #include "../fs/mtp.h"
#endif
using namespace zen;
@@ -24,22 +26,23 @@ using ABF = AbstractBaseFolder;
namespace
{
-void setFolderPath(const Zstring& dirpath, FolderHistoryBox* comboBox, wxWindow& tooltipWnd, wxStaticText* staticText) //pointers are optional
+void setFolderPathPhrase(const Zstring& dirpath, FolderHistoryBox* comboBox, wxWindow& tooltipWnd, wxStaticText* staticText) //pointers are optional
{
if (comboBox)
comboBox->setValue(toWx(dirpath));
- const Zstring displayPath = getResolvedDisplayPath(dirpath); //may block when resolving [<volume name>]
+ const Zstring folderPathPhrase = createAbstractBaseFolder(dirpath)->getInitPathPhrase(); //noexcept
+ //may block when resolving [<volume name>]
tooltipWnd.SetToolTip(nullptr); //workaround wxComboBox bug http://trac.wxwidgets.org/ticket/10512 / http://trac.wxwidgets.org/ticket/12659
- tooltipWnd.SetToolTip(toWx(displayPath)); //who knows when the real bugfix reaches mere mortals via an official release...
+ tooltipWnd.SetToolTip(toWx(folderPathPhrase)); //who knows when the real bugfix reaches mere mortals via an official release...
if (staticText)
{
//change static box label only if there is a real difference to what is shown in wxTextCtrl anyway
const Zstring dirpathFmt = trimCpy(dirpath);
- staticText->SetLabel(EqualFilePath()(appendSeparator(dirpathFmt), appendSeparator(displayPath)) ? wxString(_("Drag && drop")) : toWx(displayPath));
+ staticText->SetLabel(EqualFilePath()(appendSeparator(dirpathFmt), appendSeparator(folderPathPhrase)) ? wxString(_("Drag && drop")) : toWx(folderPathPhrase));
}
}
@@ -61,7 +64,7 @@ bool onIFileDialogAcceptFolder(HWND wnd, const Zstring& shellFolderPath)
if (acceptShellItemPaths({ shellFolderPath })) //noexcept
return true;
- const std::wstring msg = replaceCpy(_("The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device."), L"%x", fmtFileName(shellFolderPath));
+ const std::wstring msg = replaceCpy(_("The selected folder %x cannot be used with FreeFileSync. Please select a folder on a local file system, network or an MTP device."), L"%x", fmtPath(shellFolderPath));
::MessageBox(wnd, msg.c_str(), (_("Select a folder")).c_str(), MB_ICONWARNING);
//showNotificationDialog would not support HWND parent
return false;
@@ -77,13 +80,15 @@ const wxEventType zen::EVENT_ON_DIR_MANUAL_CORRECTION = wxNewEventType();
FolderSelector::FolderSelector(wxWindow& dropWindow,
- wxButton& selectButton,
+ wxButton& selectFolderButton,
+ wxButton& selectSftpButton,
FolderHistoryBox& dirpath,
wxStaticText* staticText,
wxWindow* dropWindow2) :
dropWindow_(dropWindow),
dropWindow2_(dropWindow2),
- selectButton_(selectButton),
+ selectFolderButton_(selectFolderButton),
+ selectSftpButton_(selectSftpButton),
dirpath_(dirpath),
staticText_(staticText)
{
@@ -100,10 +105,18 @@ FolderSelector::FolderSelector(wxWindow& dropWindow,
setupDragDrop(dropWindow_);
if (dropWindow2_) setupDragDrop(*dropWindow2_);
+
+#ifdef ZEN_WIN_VISTA_AND_LATER
+ selectSftpButton.SetBitmapLabel(getResourceImage(L"sftp_small"));
+#else
+ selectSftpButton_.Hide();
+#endif
+
//keep dirPicker and dirpath synchronous
- dirpath_ .Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (FolderSelector::onMouseWheel ), nullptr, this);
- dirpath_ .Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(FolderSelector::onWriteDirManually), nullptr, this);
- selectButton_.Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderSelector::onSelectDir ), nullptr, this);
+ dirpath_ .Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (FolderSelector::onMouseWheel ), nullptr, this);
+ dirpath_ .Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(FolderSelector::onWriteDirManually), nullptr, this);
+ selectFolderButton_.Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderSelector::onSelectFolder ), nullptr, this);
+ selectSftpButton_ .Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderSelector::onSelectSftp ), nullptr, this);
}
@@ -114,9 +127,10 @@ FolderSelector::~FolderSelector()
if (dropWindow2_)
dropWindow2_->Disconnect(EVENT_DROP_FILE, FileDropEventHandler(FolderSelector::onFilesDropped), nullptr, this);
- dirpath_ .Disconnect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (FolderSelector::onMouseWheel ), nullptr, this);
- dirpath_ .Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(FolderSelector::onWriteDirManually), nullptr, this);
- selectButton_.Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderSelector::onSelectDir ), nullptr, this);
+ dirpath_ .Disconnect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (FolderSelector::onMouseWheel ), nullptr, this);
+ dirpath_ .Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(FolderSelector::onWriteDirManually), nullptr, this);
+ selectFolderButton_.Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderSelector::onSelectFolder ), nullptr, this);
+ selectSftpButton_ .Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderSelector::onSelectSftp ), nullptr, this);
}
@@ -150,7 +164,7 @@ void FolderSelector::onFilesDropped(FileDropEvent& event)
if (!ABF::dirExists(createAbstractBaseFolder(files[0])->getAbstractPath()))
{
- Zstring parentPathPhrase = beforeLast(files[0], FILE_NAME_SEPARATOR); //returns empty string if ch not found
+ Zstring parentPathPhrase = beforeLast(files[0], FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
if (!parentPathPhrase.empty())
{
#ifdef ZEN_WIN
@@ -164,7 +178,9 @@ void FolderSelector::onFilesDropped(FileDropEvent& event)
}
//make sure FFS-specific explicit MTP-syntax is applied!
- setFolderPath(getResolvedDisplayPath(newFolderPathPhrase), &dirpath_, dirpath_, staticText_);
+ newFolderPathPhrase = createAbstractBaseFolder(newFolderPathPhrase)->getInitPathPhrase();
+
+ setFolderPathPhrase(newFolderPathPhrase, &dirpath_, dirpath_, staticText_);
//notify action invoked by user
wxCommandEvent dummy(EVENT_ON_DIR_SELECTED);
@@ -177,7 +193,7 @@ void FolderSelector::onFilesDropped(FileDropEvent& event)
void FolderSelector::onWriteDirManually(wxCommandEvent& event)
{
- setFolderPath(toZ(event.GetString()), nullptr, dirpath_, staticText_);
+ setFolderPathPhrase(toZ(event.GetString()), nullptr, dirpath_, staticText_);
wxCommandEvent dummy(EVENT_ON_DIR_MANUAL_CORRECTION);
ProcessEvent(dummy);
@@ -185,7 +201,7 @@ void FolderSelector::onWriteDirManually(wxCommandEvent& event)
}
-void FolderSelector::onSelectDir(wxCommandEvent& event)
+void FolderSelector::onSelectFolder(wxCommandEvent& event)
{
//make sure default folder exists: don't let folder picker hang on non-existing network share!
Zstring defaultFolderPath;
@@ -195,9 +211,16 @@ void FolderSelector::onSelectDir(wxCommandEvent& event)
{
auto baseFolderExisting = [](const ABF& abf)
{
- std::function<bool()> asyncDirExists = abf.getAsyncCheckDirExists(abf.getAbstractPath()); //noexcept
- auto ft = async([asyncDirExists] { return asyncDirExists(); /*noexcept*/ });
- return ft.timed_wait(boost::posix_time::milliseconds(200)) && ft.get(); //potentially slow network access: wait 200ms at most
+ std::function<bool()> /*throw FileError*/ dirExists = ABF::getAsyncCheckDirExists(abf.getAbstractPath()); //noexcept
+ auto ft = runAsync([dirExists]
+ {
+ try
+ {
+ return dirExists(); //throw FileError
+ }
+ catch (FileError&) { return false; }
+ });
+ return ft.wait_for(boost::chrono::milliseconds(200)) == boost::future_status::ready && ft.get(); //potentially slow network access: wait 200ms at most
};
const Zstring folderPathPhrase = getPath();
@@ -220,13 +243,13 @@ void FolderSelector::onSelectDir(wxCommandEvent& event)
//wxDirDialog internally uses lame-looking SHBrowseForFolder(); we better use IFileDialog() instead! (remembers size and position!)
#ifdef ZEN_WIN_VISTA_AND_LATER
- Zstring newFolder;
+ Zstring newFolderPathPhrase;
try
{
//some random GUID => have Windows save IFileDialog state separately from other file/dir pickers!
const GUID guid = { 0x31f94a00, 0x92b4, 0xa040, { 0x8d, 0xc2, 0xc, 0xa5, 0xef, 0x59, 0x6e, 0x3b } };
- const std::pair<Zstring, bool> rv = ifile::showFolderPicker(static_cast<HWND>(selectButton_.GetHWND()),
+ const std::pair<Zstring, bool> rv = ifile::showFolderPicker(static_cast<HWND>(selectFolderButton_.GetHWND()),
defaultFolderPath,
defaultFolderPidl.get(),
&guid,
@@ -235,17 +258,17 @@ void FolderSelector::onSelectDir(wxCommandEvent& event)
return;
//make sure FFS-specific explicit MTP-syntax is applied!
- newFolder = getResolvedDisplayPath(rv.first); //noexcept
+ newFolderPathPhrase = createAbstractBaseFolder(rv.first)->getInitPathPhrase(); //noexcept
}
catch (const FileError& e) { showNotificationDialog(&dropWindow_, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); return; }
#else
- wxDirDialog dirPicker(&selectButton_, _("Select a folder"), toWx(defaultFolderPath)); //put modal wxWidgets dialogs on stack: creating on freestore leads to memleak!
+ wxDirDialog dirPicker(&selectFolderButton_, _("Select a folder"), toWx(defaultFolderPath)); //put modal wxWidgets dialogs on stack: creating on freestore leads to memleak!
if (dirPicker.ShowModal() != wxID_OK)
return;
- const Zstring newFolder = toZ(dirPicker.GetPath());
+ const Zstring newFolderPathPhrase = toZ(dirPicker.GetPath());
#endif
- setFolderPath(newFolder, &dirpath_, dirpath_, staticText_);
+ setFolderPathPhrase(newFolderPathPhrase, &dirpath_, dirpath_, staticText_);
//notify action invoked by user
wxCommandEvent dummy(EVENT_ON_DIR_SELECTED);
@@ -253,6 +276,22 @@ void FolderSelector::onSelectDir(wxCommandEvent& event)
}
+void FolderSelector::onSelectSftp(wxCommandEvent& event)
+{
+#ifdef ZEN_WIN_VISTA_AND_LATER
+ Zstring folderPathPhrase = getPath();
+ if (showSftpSetupDialog(&selectSftpButton_, folderPathPhrase) != ReturnSmallDlg::BUTTON_OKAY)
+ return;
+
+ setFolderPathPhrase(folderPathPhrase, &dirpath_, dirpath_, staticText_);
+
+ //notify action invoked by user
+ wxCommandEvent dummy(EVENT_ON_DIR_SELECTED);
+ ProcessEvent(dummy);
+#endif
+}
+
+
Zstring FolderSelector::getPath() const
{
return toZ(dirpath_.GetValue());
@@ -261,5 +300,5 @@ Zstring FolderSelector::getPath() const
void FolderSelector::setPath(const Zstring& dirpath)
{
- setFolderPath(dirpath, &dirpath_, dirpath_, staticText_);
+ setFolderPathPhrase(dirpath, &dirpath_, dirpath_, staticText_);
}
diff --git a/FreeFileSync/Source/ui/folder_selector.h b/FreeFileSync/Source/ui/folder_selector.h
index adde8891..243a498a 100644
--- a/FreeFileSync/Source/ui/folder_selector.h
+++ b/FreeFileSync/Source/ui/folder_selector.h
@@ -32,7 +32,8 @@ class FolderSelector: public wxEvtHandler
{
public:
FolderSelector(wxWindow& dropWindow,
- wxButton& selectButton,
+ wxButton& selectFolderButton,
+ wxButton& selectSftpButton,
FolderHistoryBox& dirpath,
wxStaticText* staticText = nullptr, //optional
wxWindow* dropWindow2 = nullptr); //
@@ -48,11 +49,13 @@ private:
void onMouseWheel (wxMouseEvent& event);
void onFilesDropped (FileDropEvent& event);
void onWriteDirManually(wxCommandEvent& event);
- void onSelectDir (wxCommandEvent& event);
+ void onSelectFolder (wxCommandEvent& event);
+ void onSelectSftp (wxCommandEvent& event);
wxWindow& dropWindow_;
wxWindow* dropWindow2_;
- wxButton& selectButton_;
+ wxButton& selectFolderButton_;
+ wxButton& selectSftpButton_;
FolderHistoryBox& dirpath_;
wxStaticText* staticText_; //optional
};
diff --git a/FreeFileSync/Source/ui/gui_generated.cpp b/FreeFileSync/Source/ui/gui_generated.cpp
index d0003264..a5b0f856 100644
--- a/FreeFileSync/Source/ui/gui_generated.cpp
+++ b/FreeFileSync/Source/ui/gui_generated.cpp
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 5 2014)
+// C++ code generated with wxFormBuilder (version Jun 17 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@@ -19,965 +19,975 @@
MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxSize( 640,400 ), wxDefaultSize );
-
- m_menubar1 = new wxMenuBar( 0 );
- m_menuFile = new wxMenu();
- m_menuItemNew = new wxMenuItem( m_menuFile, wxID_NEW, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemNew );
-
- m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemLoad );
-
- m_menuFile->AppendSeparator();
-
- m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemSave );
-
- m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemSaveAs );
-
- m_menuItemSaveAsBatch = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemSaveAsBatch );
-
- m_menuFile->AppendSeparator();
-
- wxMenuItem* m_menuItem4;
- m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItem4 );
-
- m_menubar1->Append( m_menuFile, _("&File") );
-
- m_menu4 = new wxMenu();
- m_menuItemCompare = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Start &comparison") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemCompare );
-
- m_menu4->AppendSeparator();
-
- m_menuItemCompSettings = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("C&omparison settings") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemCompSettings );
-
- m_menuItemFilter = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("&Filter settings") ) + wxT('\t') + wxT("F7"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemFilter );
-
- m_menuItemSyncSettings = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("S&ynchronization settings") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemSyncSettings );
-
- m_menu4->AppendSeparator();
-
- m_menuItemSynchronize = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Start &synchronization") ) + wxT('\t') + wxT("F9"), wxEmptyString, wxITEM_NORMAL );
- m_menu4->Append( m_menuItemSynchronize );
-
- m_menubar1->Append( m_menu4, _("&Actions") );
-
- m_menuTools = new wxMenu();
- m_menuItemOptions = new wxMenuItem( m_menuTools, wxID_PREFERENCES, wxString( _("&Options") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuTools->Append( m_menuItemOptions );
-
- m_menuLanguages = new wxMenu();
- wxMenuItem* m_menuLanguagesItem = new wxMenuItem( m_menuTools, wxID_ANY, _("&Language"), wxEmptyString, wxITEM_NORMAL, m_menuLanguages );
- m_menuTools->Append( m_menuLanguagesItem );
-
- m_menuTools->AppendSeparator();
-
- wxMenuItem* m_menuItem15;
- m_menuItem15 = new wxMenuItem( m_menuTools, wxID_FIND, wxString( _("&Find...") ) + wxT('\t') + wxT("Ctrl+F"), wxEmptyString, wxITEM_NORMAL );
- m_menuTools->Append( m_menuItem15 );
-
- wxMenuItem* m_menuItem51;
- m_menuItem51 = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Reset layout") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuTools->Append( m_menuItem51 );
-
- wxMenuItem* m_menuItem5;
- m_menuItem5 = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Export file list...") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuTools->Append( m_menuItem5 );
-
- m_menubar1->Append( m_menuTools, _("&Tools") );
-
- m_menuHelp = new wxMenu();
- m_menuItemHelp = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&View help") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL );
- m_menuHelp->Append( m_menuItemHelp );
-
- m_menuCheckVersion = new wxMenu();
- wxMenuItem* m_menuCheckVersionItem = new wxMenuItem( m_menuHelp, wxID_ANY, _("&Check for new version"), wxEmptyString, wxITEM_NORMAL, m_menuCheckVersion );
- m_menuItemCheckVersionNow = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("&Check now") ) , wxEmptyString, wxITEM_NORMAL );
- m_menuCheckVersion->Append( m_menuItemCheckVersionNow );
-
- m_menuItemCheckVersionAuto = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("Check &automatically once a week") ) , wxEmptyString, wxITEM_CHECK );
- m_menuCheckVersion->Append( m_menuItemCheckVersionAuto );
- m_menuItemCheckVersionAuto->Check( true );
-
- m_menuHelp->Append( m_menuCheckVersionItem );
-
- m_menuHelp->AppendSeparator();
-
- m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL );
- m_menuHelp->Append( m_menuItemAbout );
-
- m_menubar1->Append( m_menuHelp, _("&Help") );
-
- this->SetMenuBar( m_menubar1 );
-
- bSizerPanelHolder = new wxBoxSizer( wxVERTICAL );
-
- m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1791;
- bSizer1791 = new wxBoxSizer( wxVERTICAL );
-
- bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonCmpConfig->SetToolTip( _("dummy") );
-
- bSizerTopButtons->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_buttonCancel = new zen::BitmapTextButton( m_panelTopButtons, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonCancel->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_buttonCancel->Enable( false );
- m_buttonCancel->Hide();
-
- bSizerTopButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_buttonCompare = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Compare"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonCompare->SetDefault();
- m_buttonCompare->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_buttonCompare->SetToolTip( _("dummy") );
-
- bSizerTopButtons->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerTopButtons->Add( 5, 5, 0, 0, 5 );
-
- m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 60,-1 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
- bSizerTopButtons->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerTopButtons->Add( 5, 5, 0, 0, 5 );
-
-
- bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSyncConfig->SetToolTip( _("dummy") );
-
- bSizerTopButtons->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_buttonSync = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Synchronize"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_buttonSync->SetToolTip( _("dummy") );
-
- bSizerTopButtons->Add( m_buttonSync, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer1791->Add( bSizerTopButtons, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- m_panelTopButtons->SetSizer( bSizer1791 );
- m_panelTopButtons->Layout();
- bSizer1791->Fit( m_panelTopButtons );
- bSizerPanelHolder->Add( m_panelTopButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1601;
- bSizer1601 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer91;
- bSizer91 = new wxBoxSizer( wxHORIZONTAL );
-
- m_panelTopLeft = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelTopLeft->SetMinSize( wxSize( 1,-1 ) );
-
- wxFlexGridSizer* fgSizer8;
- fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 );
- fgSizer8->AddGrowableCol( 1 );
- fgSizer8->SetFlexibleDirection( wxBOTH );
- fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL );
-
-
- fgSizer8->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextResolvedPathL = new wxStaticText( m_panelTopLeft, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextResolvedPathL->Wrap( -1 );
- fgSizer8->Add( m_staticTextResolvedPathL, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
-
- wxBoxSizer* bSizer159;
- bSizer159 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- m_bpButtonAddPair->SetToolTip( _("Add folder pair") );
-
- bSizer159->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
-
- bSizer159->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- fgSizer8->Add( bSizer159, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer182;
- bSizer182 = new wxBoxSizer( wxHORIZONTAL );
-
- m_directoryLeft = new FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer182->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
-
- bSizer182->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- fgSizer8->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- m_panelTopLeft->SetSizer( fgSizer8 );
- m_panelTopLeft->Layout();
- fgSizer8->Fit( m_panelTopLeft );
- bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_panelTopMiddle = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1771;
- bSizer1771 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bpButtonSwapSides = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
- m_bpButtonSwapSides->SetToolTip( _("Swap sides") );
-
- bSizer1771->Add( m_bpButtonSwapSides, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonAltCompCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer160->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 );
-
- m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer1771->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- m_panelTopMiddle->SetSizer( bSizer1771 );
- m_panelTopMiddle->Layout();
- bSizer1771->Fit( m_panelTopMiddle );
- bSizer91->Add( m_panelTopMiddle, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelTopRight->SetMinSize( wxSize( 1,-1 ) );
-
- wxBoxSizer* bSizer183;
- bSizer183 = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextResolvedPathR = new wxStaticText( m_panelTopRight, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextResolvedPathR->Wrap( -1 );
- bSizer183->Add( m_staticTextResolvedPathR, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
-
- wxBoxSizer* bSizer179;
- bSizer179 = new wxBoxSizer( wxHORIZONTAL );
-
- m_directoryRight = new FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer179->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
-
- bSizer179->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer183->Add( bSizer179, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- m_panelTopRight->SetSizer( bSizer183 );
- m_panelTopRight->Layout();
- bSizer183->Fit( m_panelTopRight );
- bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
-
- bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 );
-
- m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL );
- m_scrolledWindowFolderPairs->SetScrollRate( 10, 10 );
- m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) );
-
- bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL );
-
-
- m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs );
- m_scrolledWindowFolderPairs->Layout();
- bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs );
- bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- m_panelDirectoryPairs->SetSizer( bSizer1601 );
- m_panelDirectoryPairs->Layout();
- bSizer1601->Fit( m_panelDirectoryPairs );
- bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_gridNavi = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridNavi->SetScrollRate( 5, 5 );
- bSizerPanelHolder->Add( m_gridNavi, 1, wxEXPAND, 5 );
-
- m_panelCenter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1711;
- bSizer1711 = new wxBoxSizer( wxVERTICAL );
-
- m_splitterMain = new zen::TripleSplitter( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1781;
- bSizer1781 = new wxBoxSizer( wxHORIZONTAL );
-
- m_gridMainL = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridMainL->SetScrollRate( 5, 5 );
- bSizer1781->Add( m_gridMainL, 1, wxEXPAND, 5 );
-
- m_gridMainC = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridMainC->SetScrollRate( 5, 5 );
- bSizer1781->Add( m_gridMainC, 0, wxEXPAND, 5 );
-
- m_gridMainR = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridMainR->SetScrollRate( 5, 5 );
- bSizer1781->Add( m_gridMainR, 1, wxEXPAND, 5 );
-
-
- m_splitterMain->SetSizer( bSizer1781 );
- m_splitterMain->Layout();
- bSizer1781->Fit( m_splitterMain );
- bSizer1711->Add( m_splitterMain, 1, wxEXPAND, 5 );
-
- m_panelStatusBar = new wxPanel( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer451;
- bSizer451 = new wxBoxSizer( wxHORIZONTAL );
-
- bSizer451->SetMinSize( wxSize( -1,22 ) );
- bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer53;
- bSizer53 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 );
-
- m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusLeftDirs->Wrap( -1 );
- bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 );
-
- m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 );
-
- m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusLeftFiles->Wrap( -1 );
- bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusLeftFiles->Add( 4, 0, 0, 0, 5 );
-
- m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusLeftBytes->Wrap( -1 );
- bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusLeft->Add( bSizer53, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizerStatusLeft->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 2 );
-
-
- bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusMiddle->Wrap( -1 );
- bSizerFileStatus->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizerStatusRight->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 );
-
- wxBoxSizer* bSizer52;
- bSizer52 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 );
-
- m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusRightDirs->Wrap( -1 );
- bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 );
-
- m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 );
-
- m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusRightFiles->Wrap( -1 );
- bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusRightFiles->Add( 4, 0, 0, 0, 5 );
-
- m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusRightBytes->Wrap( -1 );
- bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatusRight->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerFileStatus->Add( bSizerStatusRight, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer451->Add( bSizerFileStatus, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_staticTextFullStatus = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextFullStatus->Wrap( -1 );
- m_staticTextFullStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer451->Add( m_staticTextFullStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- m_panelStatusBar->SetSizer( bSizer451 );
- m_panelStatusBar->Layout();
- bSizer451->Fit( m_panelStatusBar );
- bSizer1711->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
-
- m_panelCenter->SetSizer( bSizer1711 );
- m_panelCenter->Layout();
- bSizer1711->Fit( m_panelCenter );
- bSizerPanelHolder->Add( m_panelCenter, 1, wxEXPAND, 5 );
-
- m_panelSearch = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer1713;
- bSizer1713 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- m_bpButtonHideSearch->SetToolTip( _("Close search bar") );
-
- bSizer1713->Add( m_bpButtonHideSearch, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_staticText101 = new wxStaticText( m_panelSearch, wxID_ANY, _("Find:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText101->Wrap( -1 );
- bSizer1713->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_textCtrlSearchTxt = new wxTextCtrl( m_panelSearch, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220,-1 ), 0|wxWANTS_CHARS );
- m_textCtrlSearchTxt->SetMaxLength( 0 );
- bSizer1713->Add( m_textCtrlSearchTxt, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_checkBoxMatchCase = new wxCheckBox( m_panelSearch, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer1713->Add( m_checkBoxMatchCase, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- m_panelSearch->SetSizer( bSizer1713 );
- m_panelSearch->Layout();
- bSizer1713->Fit( m_panelSearch );
- bSizerPanelHolder->Add( m_panelSearch, 0, 0, 5 );
-
- m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- bSizerConfig = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer151;
- bSizer151 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer17611;
- bSizer17611 = new wxBoxSizer( wxVERTICAL );
-
- m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- m_bpButtonNew->SetToolTip( _("dummy") );
-
- bSizer17611->Add( m_bpButtonNew, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticText951 = new wxStaticText( m_panelConfig, wxID_ANY, _("New"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText951->Wrap( -1 );
- bSizer17611->Add( m_staticText951, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 );
-
-
- bSizer151->Add( bSizer17611, 0, 0, 5 );
-
- wxBoxSizer* bSizer1761;
- bSizer1761 = new wxBoxSizer( wxVERTICAL );
-
- m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- m_bpButtonOpen->SetToolTip( _("dummy") );
-
- bSizer1761->Add( m_bpButtonOpen, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticText95 = new wxStaticText( m_panelConfig, wxID_ANY, _("Open..."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText95->Wrap( -1 );
- bSizer1761->Add( m_staticText95, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 );
-
-
- bSizer151->Add( bSizer1761, 0, 0, 5 );
-
- wxBoxSizer* bSizer175;
- bSizer175 = new wxBoxSizer( wxVERTICAL );
-
- m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- m_bpButtonSave->SetToolTip( _("dummy") );
-
- bSizer175->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticText961 = new wxStaticText( m_panelConfig, wxID_ANY, _("Save"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText961->Wrap( -1 );
- bSizer175->Add( m_staticText961, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 );
-
-
- bSizer151->Add( bSizer175, 0, 0, 5 );
-
- wxBoxSizer* bSizer174;
- bSizer174 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer1772;
- bSizer1772 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- m_bpButtonSaveAs->SetToolTip( _("dummy") );
-
- bSizer1772->Add( m_bpButtonSaveAs, 0, 0, 5 );
-
- m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- m_bpButtonSaveAsBatch->SetToolTip( _("dummy") );
-
- bSizer1772->Add( m_bpButtonSaveAsBatch, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer174->Add( bSizer1772, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticText97 = new wxStaticText( m_panelConfig, wxID_ANY, _("Save as..."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText97->Wrap( -1 );
- bSizer174->Add( m_staticText97, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 );
-
-
- bSizer151->Add( bSizer174, 0, 0, 5 );
-
-
- bSizerConfig->Add( bSizer151, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_listBoxHistory = new wxListBox( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB );
- m_listBoxHistory->SetMinSize( wxSize( -1,40 ) );
-
- bSizerConfig->Add( m_listBoxHistory, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panelConfig->SetSizer( bSizerConfig );
- m_panelConfig->Layout();
- bSizerConfig->Fit( m_panelConfig );
- bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 );
-
- m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextViewType = new wxStaticText( m_panelViewFilter, wxID_ANY, _("View type:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextViewType->Wrap( -1 );
- bSizerViewFilter->Add( m_staticTextViewType, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonViewTypeSyncAction = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 82,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
-
- m_bpButtonShowExcluded = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowExcluded, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextSelectView = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Select view:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextSelectView->Wrap( -1 );
- bSizerViewFilter->Add( m_staticTextSelectView, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowUpdateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDoNothing = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowUpdateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonShowConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticText96 = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- bSizerViewFilter->Add( m_staticText96, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_panelStatistics = new wxPanel( m_panelViewFilter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
- m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer1801 = new wxBoxSizer( wxVERTICAL );
-
- bSizerStatistics = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer173;
- bSizer173 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
-
- bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer173->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDeleteLeft->Wrap( -1 );
- m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
-
- bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer173, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be updated") );
-
- bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer172->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextUpdateLeft->Wrap( -1 );
- m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be updated") );
-
- bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerStatistics->Add( bSizer172, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer1712;
- bSizer1712 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
-
- bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer1712->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCreateLeft->Wrap( -1 );
- m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
-
- bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerStatistics->Add( bSizer1712, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- bSizerData = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapData->SetToolTip( _("Total bytes to copy") );
-
- bSizerData->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizerData->Add( 5, 2, 0, 0, 5 );
-
-
- bSizerData->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextData->Wrap( -1 );
- m_staticTextData->SetToolTip( _("Total bytes to copy") );
-
- bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizerData, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer178;
- bSizer178 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
-
- bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer178->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer178->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCreateRight->Wrap( -1 );
- m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
-
- bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer177;
- bSizer177 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdateRight->SetToolTip( _("Number of files that will be updated") );
-
- bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer177->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer177->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextUpdateRight->Wrap( -1 );
- m_staticTextUpdateRight->SetToolTip( _("Number of files that will be updated") );
-
- bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer177, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizerStatistics->Add( 5, 5, 0, 0, 5 );
-
- wxBoxSizer* bSizer176;
- bSizer176 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
-
- bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer176->Add( 5, 2, 0, 0, 5 );
-
-
- bSizer176->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDeleteRight->Wrap( -1 );
- m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
-
- bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStatistics->Add( bSizer176, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer1801->Add( bSizerStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALL, 4 );
-
-
- m_panelStatistics->SetSizer( bSizer1801 );
- m_panelStatistics->Layout();
- bSizer1801->Fit( m_panelStatistics );
- bSizerViewFilter->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- m_panelViewFilter->SetSizer( bSizerViewFilter );
- m_panelViewFilter->Layout();
- bSizerViewFilter->Fit( m_panelViewFilter );
- bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- this->SetSizer( bSizerPanelHolder );
- this->Layout();
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) );
- this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) );
- this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) );
- this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) );
- this->Connect( m_menuItemSaveAs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) );
- this->Connect( m_menuItemSaveAsBatch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) );
- this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) );
- this->Connect( m_menuItemCompare->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) );
- this->Connect( m_menuItemCompSettings->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ) );
- this->Connect( m_menuItemFilter->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ) );
- this->Connect( m_menuItemSyncSettings->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ) );
- this->Connect( m_menuItemSynchronize->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) );
- this->Connect( m_menuItemOptions->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuOptions ) );
- this->Connect( m_menuItem15->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuFindItem ) );
- this->Connect( m_menuItem51->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuResetLayout ) );
- this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) );
- this->Connect( m_menuItemHelp->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) );
- this->Connect( m_menuItemCheckVersionNow->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) );
- this->Connect( m_menuItemCheckVersionAuto->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) );
- this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) );
- m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this );
- m_bpButtonCmpConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this );
- m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this );
- m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this );
- m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
- m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this );
- m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this );
- m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this );
- m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopFolderPairAdd ), NULL, this );
- m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopFolderPairRemove ), NULL, this );
- m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this );
- m_bpButtonHideSearch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideSearchPanel ), NULL, this );
- m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MainDialogGenerated::OnSearchGridEnter ), NULL, this );
- m_bpButtonNew->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ), NULL, this );
- m_bpButtonOpen->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this );
- m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ), NULL, this );
- m_bpButtonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ), NULL, this );
- m_bpButtonSaveAsBatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ), NULL, this );
- m_listBoxHistory->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this );
- m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this );
- m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistoryDoubleClick ), NULL, this );
- m_listBoxHistory->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCfgHistoryRightClick ), NULL, this );
- m_bpButtonViewTypeSyncAction->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this );
- m_bpButtonShowExcluded->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowExcluded->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDeleteLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowUpdateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowCreateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowLeftOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowLeftNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowEqual->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDifferent->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowRightNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowRightOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowCreateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowUpdateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowDeleteRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
- m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
- m_bpButtonShowConflict->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ this->SetSizeHints( wxSize( 640,400 ), wxDefaultSize );
+
+ m_menubar1 = new wxMenuBar( 0 );
+ m_menuFile = new wxMenu();
+ m_menuItemNew = new wxMenuItem( m_menuFile, wxID_NEW, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemNew );
+
+ m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemLoad );
+
+ m_menuFile->AppendSeparator();
+
+ m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemSave );
+
+ m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemSaveAs );
+
+ m_menuItemSaveAsBatch = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemSaveAsBatch );
+
+ m_menuFile->AppendSeparator();
+
+ wxMenuItem* m_menuItem4;
+ m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("E&xit") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItem4 );
+
+ m_menubar1->Append( m_menuFile, _("&File") );
+
+ m_menu4 = new wxMenu();
+ m_menuItemCompare = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Start &comparison") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemCompare );
+
+ m_menu4->AppendSeparator();
+
+ m_menuItemCompSettings = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("C&omparison settings") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemCompSettings );
+
+ m_menuItemFilter = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("&Filter settings") ) + wxT('\t') + wxT("F7"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemFilter );
+
+ m_menuItemSyncSettings = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("S&ynchronization settings") ) + wxT('\t') + wxT("F8"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemSyncSettings );
+
+ m_menu4->AppendSeparator();
+
+ m_menuItemSynchronize = new wxMenuItem( m_menu4, wxID_ANY, wxString( _("Start &synchronization") ) + wxT('\t') + wxT("F9"), wxEmptyString, wxITEM_NORMAL );
+ m_menu4->Append( m_menuItemSynchronize );
+
+ m_menubar1->Append( m_menu4, _("&Actions") );
+
+ m_menuTools = new wxMenu();
+ m_menuItemOptions = new wxMenuItem( m_menuTools, wxID_PREFERENCES, wxString( _("&Options") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuTools->Append( m_menuItemOptions );
+
+ m_menuLanguages = new wxMenu();
+ wxMenuItem* m_menuLanguagesItem = new wxMenuItem( m_menuTools, wxID_ANY, _("&Language"), wxEmptyString, wxITEM_NORMAL, m_menuLanguages );
+ m_menuTools->Append( m_menuLanguagesItem );
+
+ m_menuTools->AppendSeparator();
+
+ wxMenuItem* m_menuItem15;
+ m_menuItem15 = new wxMenuItem( m_menuTools, wxID_FIND, wxString( _("&Find...") ) + wxT('\t') + wxT("Ctrl+F"), wxEmptyString, wxITEM_NORMAL );
+ m_menuTools->Append( m_menuItem15 );
+
+ wxMenuItem* m_menuItem51;
+ m_menuItem51 = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Reset layout") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuTools->Append( m_menuItem51 );
+
+ wxMenuItem* m_menuItem5;
+ m_menuItem5 = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Export file list...") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuTools->Append( m_menuItem5 );
+
+ m_menubar1->Append( m_menuTools, _("&Tools") );
+
+ m_menuHelp = new wxMenu();
+ m_menuItemHelp = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&View help") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL );
+ m_menuHelp->Append( m_menuItemHelp );
+
+ m_menuCheckVersion = new wxMenu();
+ wxMenuItem* m_menuCheckVersionItem = new wxMenuItem( m_menuHelp, wxID_ANY, _("&Check for new version"), wxEmptyString, wxITEM_NORMAL, m_menuCheckVersion );
+ m_menuItemCheckVersionNow = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("&Check now") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuCheckVersion->Append( m_menuItemCheckVersionNow );
+
+ m_menuItemCheckVersionAuto = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("Check &automatically once a week") ) , wxEmptyString, wxITEM_CHECK );
+ m_menuCheckVersion->Append( m_menuItemCheckVersionAuto );
+ m_menuItemCheckVersionAuto->Check( true );
+
+ m_menuHelp->Append( m_menuCheckVersionItem );
+
+ m_menuHelp->AppendSeparator();
+
+ m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL );
+ m_menuHelp->Append( m_menuItemAbout );
+
+ m_menubar1->Append( m_menuHelp, _("&Help") );
+
+ this->SetMenuBar( m_menubar1 );
+
+ bSizerPanelHolder = new wxBoxSizer( wxVERTICAL );
+
+ m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1791;
+ bSizer1791 = new wxBoxSizer( wxVERTICAL );
+
+ bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
+ m_bpButtonCmpConfig->SetToolTip( _("dummy") );
+
+ bSizerTopButtons->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_buttonCancel = new zen::BitmapTextButton( m_panelTopButtons, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonCancel->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_buttonCancel->Enable( false );
+ m_buttonCancel->Hide();
+
+ bSizerTopButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_buttonCompare = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Compare"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonCompare->SetDefault();
+ m_buttonCompare->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_buttonCompare->SetToolTip( _("dummy") );
+
+ bSizerTopButtons->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerTopButtons->Add( 5, 5, 0, 0, 5 );
+
+ m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 60,-1 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
+ bSizerTopButtons->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerTopButtons->Add( 5, 5, 0, 0, 5 );
+
+
+ bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
+ m_bpButtonSyncConfig->SetToolTip( _("dummy") );
+
+ bSizerTopButtons->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_buttonSync = new zen::BitmapTextButton( m_panelTopButtons, wxID_ANY, _("Synchronize"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_buttonSync->SetToolTip( _("dummy") );
+
+ bSizerTopButtons->Add( m_buttonSync, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer1791->Add( bSizerTopButtons, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ m_panelTopButtons->SetSizer( bSizer1791 );
+ m_panelTopButtons->Layout();
+ bSizer1791->Fit( m_panelTopButtons );
+ bSizerPanelHolder->Add( m_panelTopButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1601;
+ bSizer1601 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer91;
+ bSizer91 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_panelTopLeft = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelTopLeft->SetMinSize( wxSize( 1,-1 ) );
+
+ wxFlexGridSizer* fgSizer8;
+ fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ fgSizer8->AddGrowableCol( 1 );
+ fgSizer8->SetFlexibleDirection( wxBOTH );
+ fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL );
+
+
+ fgSizer8->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextResolvedPathL = new wxStaticText( m_panelTopLeft, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextResolvedPathL->Wrap( -1 );
+ fgSizer8->Add( m_staticTextResolvedPathL, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
+
+ wxBoxSizer* bSizer159;
+ bSizer159 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ m_bpButtonAddPair->SetToolTip( _("Add folder pair") );
+
+ bSizer159->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
+
+ bSizer159->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ fgSizer8->Add( bSizer159, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer182;
+ bSizer182 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_directoryLeft = new FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer182->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
+
+ bSizer182->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSelectSftpLeft = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26,-1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectSftpLeft->SetToolTip( _("Select SFTP folder") );
+
+ bSizer182->Add( m_bpButtonSelectSftpLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ fgSizer8->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelTopLeft->SetSizer( fgSizer8 );
+ m_panelTopLeft->Layout();
+ fgSizer8->Fit( m_panelTopLeft );
+ bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_panelTopMiddle = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1771;
+ bSizer1771 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bpButtonSwapSides = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW );
+ m_bpButtonSwapSides->SetToolTip( _("Swap sides") );
+
+ bSizer1771->Add( m_bpButtonSwapSides, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonAltCompCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer160->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 );
+
+ m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer1771->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panelTopMiddle->SetSizer( bSizer1771 );
+ m_panelTopMiddle->Layout();
+ bSizer1771->Fit( m_panelTopMiddle );
+ bSizer91->Add( m_panelTopMiddle, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelTopRight->SetMinSize( wxSize( 1,-1 ) );
+
+ wxBoxSizer* bSizer183;
+ bSizer183 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextResolvedPathR = new wxStaticText( m_panelTopRight, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextResolvedPathR->Wrap( -1 );
+ bSizer183->Add( m_staticTextResolvedPathR, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
+
+ wxBoxSizer* bSizer179;
+ bSizer179 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_directoryRight = new FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer179->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
+
+ bSizer179->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSelectSftpRight = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26,-1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectSftpRight->SetToolTip( _("Select SFTP folder") );
+
+ bSizer179->Add( m_bpButtonSelectSftpRight, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer183->Add( bSizer179, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelTopRight->SetSizer( bSizer183 );
+ m_panelTopRight->Layout();
+ bSizer183->Fit( m_panelTopRight );
+ bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+
+ bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 );
+
+ m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL );
+ m_scrolledWindowFolderPairs->SetScrollRate( 10, 10 );
+ m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) );
+
+ bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL );
+
+
+ m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs );
+ m_scrolledWindowFolderPairs->Layout();
+ bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs );
+ bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelDirectoryPairs->SetSizer( bSizer1601 );
+ m_panelDirectoryPairs->Layout();
+ bSizer1601->Fit( m_panelDirectoryPairs );
+ bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_gridNavi = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridNavi->SetScrollRate( 5, 5 );
+ bSizerPanelHolder->Add( m_gridNavi, 1, wxEXPAND, 5 );
+
+ m_panelCenter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1711;
+ bSizer1711 = new wxBoxSizer( wxVERTICAL );
+
+ m_splitterMain = new zen::TripleSplitter( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1781;
+ bSizer1781 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_gridMainL = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridMainL->SetScrollRate( 5, 5 );
+ bSizer1781->Add( m_gridMainL, 1, wxEXPAND, 5 );
+
+ m_gridMainC = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridMainC->SetScrollRate( 5, 5 );
+ bSizer1781->Add( m_gridMainC, 0, wxEXPAND, 5 );
+
+ m_gridMainR = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridMainR->SetScrollRate( 5, 5 );
+ bSizer1781->Add( m_gridMainR, 1, wxEXPAND, 5 );
+
+
+ m_splitterMain->SetSizer( bSizer1781 );
+ m_splitterMain->Layout();
+ bSizer1781->Fit( m_splitterMain );
+ bSizer1711->Add( m_splitterMain, 1, wxEXPAND, 5 );
+
+ m_panelStatusBar = new wxPanel( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer451;
+ bSizer451 = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizer451->SetMinSize( wxSize( -1,22 ) );
+ bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer53;
+ bSizer53 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusLeftDirs->Wrap( -1 );
+ bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 );
+
+ m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusLeftFiles->Wrap( -1 );
+ bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeftFiles->Add( 4, 0, 0, 0, 5 );
+
+ m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusLeftBytes->Wrap( -1 );
+ bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeft->Add( bSizer53, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizerStatusLeft->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 2 );
+
+
+ bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusMiddle->Wrap( -1 );
+ bSizerFileStatus->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizerStatusRight->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 );
+
+ wxBoxSizer* bSizer52;
+ bSizer52 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusRightDirs->Wrap( -1 );
+ bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 );
+
+ m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusRightFiles->Wrap( -1 );
+ bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRightFiles->Add( 4, 0, 0, 0, 5 );
+
+ m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusRightBytes->Wrap( -1 );
+ bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRight->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerFileStatus->Add( bSizerStatusRight, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer451->Add( bSizerFileStatus, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_staticTextFullStatus = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextFullStatus->Wrap( -1 );
+ m_staticTextFullStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer451->Add( m_staticTextFullStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ m_panelStatusBar->SetSizer( bSizer451 );
+ m_panelStatusBar->Layout();
+ bSizer451->Fit( m_panelStatusBar );
+ bSizer1711->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+
+ m_panelCenter->SetSizer( bSizer1711 );
+ m_panelCenter->Layout();
+ bSizer1711->Fit( m_panelCenter );
+ bSizerPanelHolder->Add( m_panelCenter, 1, wxEXPAND, 5 );
+
+ m_panelSearch = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1713;
+ bSizer1713 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ m_bpButtonHideSearch->SetToolTip( _("Close search bar") );
+
+ bSizer1713->Add( m_bpButtonHideSearch, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_staticText101 = new wxStaticText( m_panelSearch, wxID_ANY, _("Find:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText101->Wrap( -1 );
+ bSizer1713->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_textCtrlSearchTxt = new wxTextCtrl( m_panelSearch, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220,-1 ), 0|wxWANTS_CHARS );
+ m_textCtrlSearchTxt->SetMaxLength( 0 );
+ bSizer1713->Add( m_textCtrlSearchTxt, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_checkBoxMatchCase = new wxCheckBox( m_panelSearch, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer1713->Add( m_checkBoxMatchCase, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ m_panelSearch->SetSizer( bSizer1713 );
+ m_panelSearch->Layout();
+ bSizer1713->Fit( m_panelSearch );
+ bSizerPanelHolder->Add( m_panelSearch, 0, 0, 5 );
+
+ m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ bSizerConfig = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer151;
+ bSizer151 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer17611;
+ bSizer17611 = new wxBoxSizer( wxVERTICAL );
+
+ m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ m_bpButtonNew->SetToolTip( _("dummy") );
+
+ bSizer17611->Add( m_bpButtonNew, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticText951 = new wxStaticText( m_panelConfig, wxID_ANY, _("New"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText951->Wrap( -1 );
+ bSizer17611->Add( m_staticText951, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 );
+
+
+ bSizer151->Add( bSizer17611, 0, 0, 5 );
+
+ wxBoxSizer* bSizer1761;
+ bSizer1761 = new wxBoxSizer( wxVERTICAL );
+
+ m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ m_bpButtonOpen->SetToolTip( _("dummy") );
+
+ bSizer1761->Add( m_bpButtonOpen, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticText95 = new wxStaticText( m_panelConfig, wxID_ANY, _("Open..."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText95->Wrap( -1 );
+ bSizer1761->Add( m_staticText95, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 );
+
+
+ bSizer151->Add( bSizer1761, 0, 0, 5 );
+
+ wxBoxSizer* bSizer175;
+ bSizer175 = new wxBoxSizer( wxVERTICAL );
+
+ m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ m_bpButtonSave->SetToolTip( _("dummy") );
+
+ bSizer175->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticText961 = new wxStaticText( m_panelConfig, wxID_ANY, _("Save"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText961->Wrap( -1 );
+ bSizer175->Add( m_staticText961, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 );
+
+
+ bSizer151->Add( bSizer175, 0, 0, 5 );
+
+ wxBoxSizer* bSizer174;
+ bSizer174 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer1772;
+ bSizer1772 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ m_bpButtonSaveAs->SetToolTip( _("dummy") );
+
+ bSizer1772->Add( m_bpButtonSaveAs, 0, 0, 5 );
+
+ m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ m_bpButtonSaveAsBatch->SetToolTip( _("dummy") );
+
+ bSizer1772->Add( m_bpButtonSaveAsBatch, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer174->Add( bSizer1772, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticText97 = new wxStaticText( m_panelConfig, wxID_ANY, _("Save as..."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText97->Wrap( -1 );
+ bSizer174->Add( m_staticText97, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 2 );
+
+
+ bSizer151->Add( bSizer174, 0, 0, 5 );
+
+
+ bSizerConfig->Add( bSizer151, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_listBoxHistory = new wxListBox( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB );
+ m_listBoxHistory->SetMinSize( wxSize( -1,40 ) );
+
+ bSizerConfig->Add( m_listBoxHistory, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panelConfig->SetSizer( bSizerConfig );
+ m_panelConfig->Layout();
+ bSizerConfig->Fit( m_panelConfig );
+ bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 );
+
+ m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextViewType = new wxStaticText( m_panelViewFilter, wxID_ANY, _("View type:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextViewType->Wrap( -1 );
+ bSizerViewFilter->Add( m_staticTextViewType, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonViewTypeSyncAction = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 82,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
+
+ m_bpButtonShowExcluded = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowExcluded, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextSelectView = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Select view:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextSelectView->Wrap( -1 );
+ bSizerViewFilter->Add( m_staticTextSelectView, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowUpdateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDoNothing = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowUpdateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonShowConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticText96 = new wxStaticText( m_panelViewFilter, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ bSizerViewFilter->Add( m_staticText96, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_panelStatistics = new wxPanel( m_panelViewFilter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
+ m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer1801 = new wxBoxSizer( wxVERTICAL );
+
+ bSizerStatistics = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer173;
+ bSizer173 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer173->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteLeft->Wrap( -1 );
+ m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer173, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be updated") );
+
+ bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer172->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateLeft->Wrap( -1 );
+ m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be updated") );
+
+ bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer172, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer1712;
+ bSizer1712 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
+
+ bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer1712->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateLeft->Wrap( -1 );
+ m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
+
+ bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer1712, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ bSizerData = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapData->SetToolTip( _("Total bytes to copy") );
+
+ bSizerData->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerData->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizerData->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextData->Wrap( -1 );
+ m_staticTextData->SetToolTip( _("Total bytes to copy") );
+
+ bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizerData, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
+
+ bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer178->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer178->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateRight->Wrap( -1 );
+ m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
+
+ bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer177;
+ bSizer177 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateRight->SetToolTip( _("Number of files that will be updated") );
+
+ bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer177->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer177->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateRight->Wrap( -1 );
+ m_staticTextUpdateRight->SetToolTip( _("Number of files that will be updated") );
+
+ bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer177, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+
+ wxBoxSizer* bSizer176;
+ bSizer176 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer176->Add( 5, 2, 0, 0, 5 );
+
+
+ bSizer176->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteRight->Wrap( -1 );
+ m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatistics->Add( bSizer176, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer1801->Add( bSizerStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALL, 4 );
+
+
+ m_panelStatistics->SetSizer( bSizer1801 );
+ m_panelStatistics->Layout();
+ bSizer1801->Fit( m_panelStatistics );
+ bSizerViewFilter->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ m_panelViewFilter->SetSizer( bSizerViewFilter );
+ m_panelViewFilter->Layout();
+ bSizerViewFilter->Fit( m_panelViewFilter );
+ bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ this->SetSizer( bSizerPanelHolder );
+ this->Layout();
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) );
+ this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) );
+ this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) );
+ this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) );
+ this->Connect( m_menuItemSaveAs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) );
+ this->Connect( m_menuItemSaveAsBatch->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) );
+ this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) );
+ this->Connect( m_menuItemCompare->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) );
+ this->Connect( m_menuItemCompSettings->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ) );
+ this->Connect( m_menuItemFilter->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ) );
+ this->Connect( m_menuItemSyncSettings->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ) );
+ this->Connect( m_menuItemSynchronize->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) );
+ this->Connect( m_menuItemOptions->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuOptions ) );
+ this->Connect( m_menuItem15->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuFindItem ) );
+ this->Connect( m_menuItem51->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuResetLayout ) );
+ this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) );
+ this->Connect( m_menuItemHelp->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) );
+ this->Connect( m_menuItemCheckVersionNow->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) );
+ this->Connect( m_menuItemCheckVersionAuto->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) );
+ this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) );
+ m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this );
+ m_bpButtonCmpConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this );
+ m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this );
+ m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this );
+ m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this );
+ m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this );
+ m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this );
+ m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this );
+ m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopFolderPairAdd ), NULL, this );
+ m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopFolderPairRemove ), NULL, this );
+ m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this );
+ m_bpButtonHideSearch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideSearchPanel ), NULL, this );
+ m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler( MainDialogGenerated::OnSearchGridEnter ), NULL, this );
+ m_bpButtonNew->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ), NULL, this );
+ m_bpButtonOpen->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this );
+ m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ), NULL, this );
+ m_bpButtonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ), NULL, this );
+ m_bpButtonSaveAsBatch->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ), NULL, this );
+ m_listBoxHistory->Connect( wxEVT_KEY_DOWN, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this );
+ m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this );
+ m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistoryDoubleClick ), NULL, this );
+ m_listBoxHistory->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCfgHistoryRightClick ), NULL, this );
+ m_bpButtonViewTypeSyncAction->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this );
+ m_bpButtonShowExcluded->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowExcluded->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDeleteLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowUpdateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowCreateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowLeftOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowLeftNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowEqual->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDifferent->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowRightNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowRightOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowCreateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowUpdateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowDeleteRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
+ m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this );
+ m_bpButtonShowConflict->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this );
}
MainDialogGenerated::~MainDialogGenerated()
@@ -986,1042 +996,1197 @@ MainDialogGenerated::~MainDialogGenerated()
ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer7;
- bSizer7 = new wxBoxSizer( wxVERTICAL );
-
- m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelCompSettingsHolder = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelCompSettingsHolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer275;
- bSizer275 = new wxBoxSizer( wxVERTICAL );
-
- bSizerLocalCompSettings = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxUseLocalCmpOptions = new wxCheckBox( m_panelCompSettingsHolder, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxUseLocalCmpOptions->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizerLocalCompSettings->Add( m_checkBoxUseLocalCmpOptions, 0, wxALL|wxEXPAND, 10 );
-
- m_staticline59 = new wxStaticLine( m_panelCompSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerLocalCompSettings->Add( m_staticline59, 0, wxEXPAND, 5 );
-
-
- bSizer275->Add( bSizerLocalCompSettings, 0, wxEXPAND, 5 );
-
- m_panelComparisonSettings = new wxPanel( m_panelCompSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelComparisonSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer159;
- bSizer159 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer178;
- bSizer178 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer182;
- bSizer182 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText91 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText91->Wrap( -1 );
- bSizer182->Add( m_staticText91, 0, wxALL, 5 );
-
- wxFlexGridSizer* fgSizer16;
- fgSizer16 = new wxFlexGridSizer( 2, 2, 5, 5 );
- fgSizer16->SetFlexibleDirection( wxBOTH );
- fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_bitmapByTime = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapByTime->SetToolTip( _("Identify equal files by comparing modification time and size.") );
-
- fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_toggleBtnTimeSize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnTimeSize->SetValue( true );
- m_toggleBtnTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer16->Add( m_toggleBtnTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_bitmapByContent = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapByContent->SetToolTip( _("Identify equal files by comparing the file content.") );
-
- fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_toggleBtnContent = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_toggleBtnContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer16->Add( m_toggleBtnContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer182->Add( fgSizer16, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer178->Add( bSizer182, 0, wxALL, 5 );
-
- m_staticline42 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer178->Add( m_staticline42, 0, wxEXPAND, 5 );
-
- m_textCtrlCompVarDescription = new wxTextCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
- bSizer178->Add( m_textCtrlCompVarDescription, 1, wxEXPAND|wxLEFT, 5 );
-
-
- bSizer159->Add( bSizer178, 0, wxEXPAND, 5 );
-
- m_staticline33 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer159->Add( m_staticline33, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer1734;
- bSizer1734 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer1733;
- bSizer1733 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxTimeShift = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("Ignore time shift (in hours)"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxTimeShift->SetToolTip( _("Consider file times with specified offset as equal") );
-
- bSizer1733->Add( m_checkBoxTimeShift, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_spinCtrlTimeShift = new wxSpinCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70,-1 ), wxSP_ARROW_KEYS|wxSP_WRAP, 1, 26, 0 );
- m_spinCtrlTimeShift->SetToolTip( _("Consider file times with specified offset as equal") );
-
- bSizer1733->Add( m_spinCtrlTimeShift, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
- m_hyperlink241 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("Handle daylight saving time"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer1733->Add( m_hyperlink241, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer1734->Add( bSizer1733, 0, wxALL, 5 );
-
- m_staticline44 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer1734->Add( m_staticline44, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer1721;
- bSizer1721 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxSymlinksInclude = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("Include symbolic links:"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer1721->Add( m_checkBoxSymlinksInclude, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer176;
- bSizer176 = new wxBoxSizer( wxVERTICAL );
-
- m_radioBtnSymlinksFollow = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("Follow"), wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnSymlinksFollow->SetValue( true );
- bSizer176->Add( m_radioBtnSymlinksFollow, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
- m_radioBtnSymlinksDirect = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("Direct"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer176->Add( m_radioBtnSymlinksDirect, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer1721->Add( bSizer176, 0, wxEXPAND|wxLEFT, 18 );
-
- m_hyperlink24 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("More information"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer1721->Add( m_hyperlink24, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer1734->Add( bSizer1721, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_staticline441 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer1734->Add( m_staticline441, 0, wxEXPAND, 5 );
-
-
- bSizer159->Add( bSizer1734, 0, 0, 5 );
-
- m_staticline331 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer159->Add( m_staticline331, 0, wxEXPAND, 5 );
-
-
- m_panelComparisonSettings->SetSizer( bSizer159 );
- m_panelComparisonSettings->Layout();
- bSizer159->Fit( m_panelComparisonSettings );
- bSizer275->Add( m_panelComparisonSettings, 0, wxEXPAND, 5 );
-
-
- m_panelCompSettingsHolder->SetSizer( bSizer275 );
- m_panelCompSettingsHolder->Layout();
- bSizer275->Fit( m_panelCompSettingsHolder );
- m_notebook->AddPage( m_panelCompSettingsHolder, _("dummy"), false );
- m_panelFilterSettingsHolder = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelFilterSettingsHolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer278;
- bSizer278 = new wxBoxSizer( wxVERTICAL );
-
- bSizerLocalFilterSettings = new wxBoxSizer( wxVERTICAL );
-
- m_staticText144 = new wxStaticText( m_panelFilterSettingsHolder, wxID_ANY, _("Local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText144->Wrap( -1 );
- bSizerLocalFilterSettings->Add( m_staticText144, 0, wxALL, 10 );
-
- m_staticline61 = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerLocalFilterSettings->Add( m_staticline61, 0, wxEXPAND, 5 );
-
-
- bSizer278->Add( bSizerLocalFilterSettings, 0, wxEXPAND, 5 );
-
- m_panelFilterSettings = new wxPanel( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelFilterSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer1591;
- bSizer1591 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer166->Add( 0, 10, 0, 0, 5 );
-
- wxBoxSizer* bSizer1661;
- bSizer1661 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapInclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
- bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
-
- wxBoxSizer* bSizer1731;
- bSizer1731 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText78 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Include:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText78->Wrap( -1 );
- bSizer1731->Add( m_staticText78, 0, 0, 5 );
-
- m_textCtrlInclude = new wxTextCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
- m_textCtrlInclude->SetMinSize( wxSize( 280,-1 ) );
-
- bSizer1731->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP, 5 );
-
-
- bSizer1661->Add( bSizer1731, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer166->Add( bSizer1661, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxLEFT, 5 );
-
- m_staticline22 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer166->Add( m_staticline22, 0, wxEXPAND, 5 );
-
-
- bSizer166->Add( 0, 10, 0, 0, 5 );
-
- wxBoxSizer* bSizer1651;
- bSizer1651 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapExclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
- bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- wxBoxSizer* bSizer1742;
- bSizer1742 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer189;
- bSizer189 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText77 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Exclude:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText77->Wrap( -1 );
- bSizer189->Add( m_staticText77, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer189->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink171 = new wxHyperlinkCtrl( m_panelFilterSettings, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer189->Add( m_hyperlink171, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer1742->Add( bSizer189, 0, wxEXPAND, 5 );
-
- m_textCtrlExclude = new wxTextCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
- bSizer1742->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
-
-
- bSizer1651->Add( bSizer1742, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer166->Add( bSizer1651, 2, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 );
-
-
- bSizer1591->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- m_staticline24 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer1591->Add( m_staticline24, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer167;
- bSizer167 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapFilterDate = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 );
- bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- wxBoxSizer* bSizer165;
- bSizer165 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText79 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Time span:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText79->Wrap( -1 );
- bSizer165->Add( m_staticText79, 0, wxBOTTOM, 5 );
-
- m_spinCtrlTimespan = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- bSizer165->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- wxArrayString m_choiceUnitTimespanChoices;
- m_choiceUnitTimespan = new wxChoice( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 );
- m_choiceUnitTimespan->SetSelection( 0 );
- bSizer165->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
-
- m_staticline23 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer168;
- bSizer168 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapFilterSize = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 );
- bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
-
- wxBoxSizer* bSizer158;
- bSizer158 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText80 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("File size:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText80->Wrap( -1 );
- bSizer158->Add( m_staticText80, 0, wxBOTTOM, 5 );
-
- wxBoxSizer* bSizer162;
- bSizer162 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText101 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText101->Wrap( -1 );
- bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 );
-
- m_spinCtrlMinSize = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- wxArrayString m_choiceUnitMinSizeChoices;
- m_choiceUnitMinSize = new wxChoice( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 );
- m_choiceUnitMinSize->SetSelection( 0 );
- bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer158->Add( bSizer162, 0, wxBOTTOM|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer163;
- bSizer163 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText102 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText102->Wrap( -1 );
- bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 );
-
- m_spinCtrlMaxSize = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
- wxArrayString m_choiceUnitMaxSizeChoices;
- m_choiceUnitMaxSize = new wxChoice( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 );
- m_choiceUnitMaxSize->SetSelection( 0 );
- bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer158->Add( bSizer163, 0, wxEXPAND, 5 );
-
-
- bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer168, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
-
-
- bSizer1591->Add( bSizer160, 0, wxEXPAND, 5 );
-
-
- m_panelFilterSettings->SetSizer( bSizer1591 );
- m_panelFilterSettings->Layout();
- bSizer1591->Fit( m_panelFilterSettings );
- bSizer278->Add( m_panelFilterSettings, 1, wxEXPAND, 5 );
-
- m_staticline62 = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer278->Add( m_staticline62, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer280;
- bSizer280 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText44 = new wxStaticText( m_panelFilterSettingsHolder, wxID_ANY, _("Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_staticText44->Wrap( 590 );
- bSizer280->Add( m_staticText44, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer280->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticline46 = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer280->Add( m_staticline46, 0, wxEXPAND, 5 );
-
- m_buttonClear = new wxButton( m_panelFilterSettingsHolder, wxID_DEFAULT, _("C&lear"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer280->Add( m_buttonClear, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
-
-
- bSizer278->Add( bSizer280, 0, wxEXPAND, 5 );
-
-
- m_panelFilterSettingsHolder->SetSizer( bSizer278 );
- m_panelFilterSettingsHolder->Layout();
- bSizer278->Fit( m_panelFilterSettingsHolder );
- m_notebook->AddPage( m_panelFilterSettingsHolder, _("dummy"), false );
- m_panelSyncSettingsHolder = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelSyncSettingsHolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer276;
- bSizer276 = new wxBoxSizer( wxVERTICAL );
-
- bSizerLocalSyncSettings = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxUseLocalSyncOptions = new wxCheckBox( m_panelSyncSettingsHolder, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizerLocalSyncSettings->Add( m_checkBoxUseLocalSyncOptions, 0, wxALL|wxEXPAND, 10 );
-
- m_staticline60 = new wxStaticLine( m_panelSyncSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerLocalSyncSettings->Add( m_staticline60, 0, wxEXPAND, 5 );
-
-
- bSizer276->Add( bSizerLocalSyncSettings, 0, wxEXPAND, 5 );
-
- m_panelSyncSettings = new wxPanel( m_panelSyncSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelSyncSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer232;
- bSizer232 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer237;
- bSizer237 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer235;
- bSizer235 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText86 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText86->Wrap( -1 );
- bSizer235->Add( m_staticText86, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer236;
- bSizer236 = new wxBoxSizer( wxVERTICAL );
-
- m_toggleBtnTwoWay = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_toggleBtnTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer236->Add( m_toggleBtnTwoWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM, 5 );
-
- m_toggleBtnMirror = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer236->Add( m_toggleBtnMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM, 5 );
-
- m_toggleBtnUpdate = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer236->Add( m_toggleBtnUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM, 5 );
-
- m_toggleBtnCustom = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer236->Add( m_toggleBtnCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer235->Add( bSizer236, 0, wxRIGHT|wxLEFT, 5 );
-
- m_checkBoxDetectMove = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Detect moved files"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxDetectMove->SetValue(true);
- m_checkBoxDetectMove->SetToolTip( _("- Detection active after initial sync\n- Requires and creates database files\n- Not supported by all file systems") );
-
- bSizer235->Add( m_checkBoxDetectMove, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
-
-
- bSizer237->Add( bSizer235, 0, wxALL, 5 );
-
- m_staticline53 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer237->Add( m_staticline53, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer238;
- bSizer238 = new wxBoxSizer( wxVERTICAL );
-
- m_textCtrlSyncVarDescription = new wxTextCtrl( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
- bSizer238->Add( m_textCtrlSyncVarDescription, 1, wxEXPAND|wxLEFT, 5 );
-
- m_staticline43 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer238->Add( m_staticline43, 0, wxEXPAND, 5 );
-
- bSizerSyncConfig = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer173;
- bSizer173 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticText119 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText119->Wrap( -1 );
- bSizer173->Add( m_staticText119, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticText120 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText120->Wrap( -1 );
- bSizer173->Add( m_staticText120, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- bSizerSyncConfig->Add( bSizer173, 0, wxEXPAND|wxRIGHT, 5 );
-
- fgSizerSyncDirections = new wxFlexGridSizer( 2, 0, 5, 5 );
- fgSizerSyncDirections->SetFlexibleDirection( wxBOTH );
- fgSizerSyncDirections->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_bitmapLeftOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") );
-
- fgSizerSyncDirections->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapLeftNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapLeftNewer->SetToolTip( _("Left side is newer") );
-
- fgSizerSyncDirections->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapDifferent = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapDifferent->SetToolTip( _("Items have different content") );
-
- fgSizerSyncDirections->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapConflict = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") );
-
- fgSizerSyncDirections->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapRightNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapRightNewer->SetToolTip( _("Right side is newer") );
-
- fgSizerSyncDirections->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapRightOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") );
-
- fgSizerSyncDirections->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonLeftOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- fgSizerSyncDirections->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonLeftNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- fgSizerSyncDirections->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonDifferent = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- fgSizerSyncDirections->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonConflict = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- fgSizerSyncDirections->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonRightNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- fgSizerSyncDirections->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonRightOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- fgSizerSyncDirections->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerSyncConfig->Add( fgSizerSyncDirections, 0, 0, 5 );
-
- m_bitmapDatabase = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_bitmapDatabase->SetToolTip( _("Detect synchronization directions with the help of database files") );
-
- bSizerSyncConfig->Add( m_bitmapDatabase, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxALIGN_CENTER_VERTICAL, 10 );
-
- wxBoxSizer* bSizerKeepVerticalHeightWhenSyncDirsNotShown;
- bSizerKeepVerticalHeightWhenSyncDirsNotShown = new wxBoxSizer( wxVERTICAL );
-
-
- bSizerKeepVerticalHeightWhenSyncDirsNotShown->Add( 0, 45, 0, 0, 5 );
-
-
- bSizerKeepVerticalHeightWhenSyncDirsNotShown->Add( 0, 5, 1, 0, 5 );
-
-
- bSizerKeepVerticalHeightWhenSyncDirsNotShown->Add( 0, 46, 0, 0, 5 );
-
-
- bSizerSyncConfig->Add( bSizerKeepVerticalHeightWhenSyncDirsNotShown, 0, 0, 5 );
-
-
- bSizer238->Add( bSizerSyncConfig, 0, wxALL, 10 );
-
-
- bSizer237->Add( bSizer238, 1, wxEXPAND, 5 );
-
-
- bSizer232->Add( bSizer237, 0, wxEXPAND, 5 );
-
- m_staticline54 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer232->Add( m_staticline54, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer184;
- bSizer184 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer180;
- bSizer180 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText87 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Delete files:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText87->Wrap( -1 );
- bSizer180->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
- m_radioBtnPermanent = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Permanent"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
- m_radioBtnPermanent->SetToolTip( _("Delete or overwrite files permanently") );
-
- bSizer180->Add( m_radioBtnPermanent, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- m_radioBtnRecycler = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnRecycler->SetToolTip( _("Back up deleted and overwritten files in the recycle bin") );
-
- bSizer180->Add( m_radioBtnRecycler, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- m_radioBtnVersioning = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Versioning"), wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnVersioning->SetToolTip( _("Move files to a user-defined folder") );
-
- bSizer180->Add( m_radioBtnVersioning, 0, wxALL, 5 );
-
-
- bSizer184->Add( bSizer180, 0, 0, 5 );
-
- bSizerVersioning = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonDeletionType = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
- bSizerVersioning->Add( m_bpButtonDeletionType, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_panelVersioning = new wxPanel( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelVersioning->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer191;
- bSizer191 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer156;
- bSizer156 = new wxBoxSizer( wxHORIZONTAL );
-
- m_versioningFolder = new FolderHistoryBox( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer156->Add( m_versioningFolder, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirVersioning = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirVersioning->SetToolTip( _("Select a folder") );
-
- bSizer156->Add( m_buttonSelectDirVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer191->Add( bSizer156, 0, wxEXPAND|wxBOTTOM, 5 );
-
- bSizer192 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText93 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Naming convention:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText93->Wrap( -1 );
- bSizer192->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 );
- bSizer192->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_staticTextNamingCvtPart1 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextNamingCvtPart1->Wrap( -1 );
- m_staticTextNamingCvtPart1->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer192->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(), 70, 90, 92, false, wxEmptyString ) );
- m_staticTextNamingCvtPart2Bold->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer192->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 ) );
-
- bSizer192->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer192->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink17 = new wxHyperlinkCtrl( m_panelVersioning, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer192->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
-
-
- bSizer191->Add( bSizer192, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- m_panelVersioning->SetSizer( bSizer191 );
- m_panelVersioning->Layout();
- bSizer191->Fit( m_panelVersioning );
- bSizerVersioning->Add( m_panelVersioning, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
-
-
- bSizer184->Add( bSizerVersioning, 0, wxTOP|wxEXPAND, 5 );
-
-
- bSizer232->Add( bSizer184, 0, wxALL|wxEXPAND, 10 );
-
- bSizerMiscConfig = new wxBoxSizer( wxVERTICAL );
-
- m_staticline582 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerMiscConfig->Add( m_staticline582, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer1732;
- bSizer1732 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer174;
- bSizer174 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText88 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Handle errors:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText88->Wrap( -1 );
- bSizer174->Add( m_staticText88, 0, wxBOTTOM, 5 );
-
- wxBoxSizer* bSizer175;
- bSizer175 = new wxBoxSizer( wxHORIZONTAL );
-
- m_radioBtnIgnoreErrors = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Ignore"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
- m_radioBtnIgnoreErrors->SetToolTip( _("Hide all error and warning messages") );
-
- bSizer175->Add( m_radioBtnIgnoreErrors, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- m_radioBtnPopupOnErrors = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnPopupOnErrors->SetToolTip( _("Show pop-up on errors or warnings") );
-
- bSizer175->Add( m_radioBtnPopupOnErrors, 0, wxALL, 5 );
-
-
- bSizer174->Add( bSizer175, 0, 0, 5 );
-
-
- bSizer1732->Add( bSizer174, 0, wxALL, 10 );
-
- m_staticline57 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer1732->Add( m_staticline57, 0, wxEXPAND, 5 );
-
- bSizerOnCompletion = new wxBoxSizer( wxVERTICAL );
-
- m_staticText89 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText89->Wrap( -1 );
- bSizerOnCompletion->Add( m_staticText89, 0, wxBOTTOM, 5 );
-
- m_comboBoxOnCompletion = new OnCompletionBox( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizerOnCompletion->Add( m_comboBoxOnCompletion, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer1732->Add( bSizerOnCompletion, 1, wxALL, 10 );
-
-
- bSizerMiscConfig->Add( bSizer1732, 1, wxEXPAND, 5 );
-
-
- bSizer232->Add( bSizerMiscConfig, 1, wxEXPAND, 5 );
-
-
- m_panelSyncSettings->SetSizer( bSizer232 );
- m_panelSyncSettings->Layout();
- bSizer232->Fit( m_panelSyncSettings );
- bSizer276->Add( m_panelSyncSettings, 1, wxEXPAND, 5 );
-
-
- m_panelSyncSettingsHolder->SetSizer( bSizer276 );
- m_panelSyncSettingsHolder->Layout();
- bSizer276->Fit( m_panelSyncSettingsHolder );
- m_notebook->AddPage( m_panelSyncSettingsHolder, _("dummy"), true );
-
- bSizer7->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonOkay->SetDefault();
- m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer7->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer7 );
- this->Layout();
- bSizer7->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ConfigDlgGenerated::OnClose ) );
- m_checkBoxUseLocalCmpOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleLocalCompSettings ), NULL, this );
- m_toggleBtnTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnTimeSizeDouble ), NULL, this );
- m_toggleBtnTimeSize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnTimeSize ), NULL, this );
- m_toggleBtnContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnContentDouble ), NULL, this );
- m_toggleBtnContent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnContent ), NULL, this );
- m_checkBoxTimeShift->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeCompOption ), NULL, this );
- m_hyperlink241->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpTimeShift ), NULL, this );
- m_checkBoxSymlinksInclude->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeCompOption ), NULL, this );
- m_hyperlink24->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpComparisonSettings ), NULL, this );
- m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
- m_hyperlink171->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpShowExamples ), NULL, this );
- m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
- m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
- m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
- m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
- m_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnFilterReset ), NULL, this );
- m_checkBoxUseLocalSyncOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleLocalSyncSettings ), NULL, this );
- m_toggleBtnTwoWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncTwoWayDouble ), NULL, this );
- m_toggleBtnTwoWay->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncTwoWay ), NULL, this );
- m_toggleBtnMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncMirrorDouble ), NULL, this );
- m_toggleBtnMirror->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncMirror ), NULL, this );
- m_toggleBtnUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncUpdateDouble ), NULL, this );
- m_toggleBtnUpdate->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncUpdate ), NULL, this );
- m_toggleBtnCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncCustomDouble ), NULL, this );
- m_toggleBtnCustom->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncCustom ), NULL, this );
- m_checkBoxDetectMove->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleDetectMovedFiles ), NULL, this );
- m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnExLeftSideOnly ), NULL, this );
- m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnLeftNewer ), NULL, this );
- m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDifferent ), NULL, this );
- m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnConflict ), NULL, this );
- m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnRightNewer ), NULL, this );
- m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnExRightSideOnly ), NULL, this );
- m_radioBtnPermanent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionPermanent ), NULL, this );
- m_radioBtnRecycler->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionRecycler ), NULL, this );
- m_radioBtnVersioning->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionVersioning ), NULL, this );
- m_bpButtonDeletionType->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleDeletionType ), NULL, this );
- m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeSyncOption ), NULL, this );
- m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpVersioning ), NULL, this );
- m_radioBtnIgnoreErrors->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnErrorIgnore ), NULL, this );
- m_radioBtnPopupOnErrors->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnErrorPopup ), NULL, this );
- m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnOkay ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCancel ), NULL, this );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer7;
+ bSizer7 = new wxBoxSizer( wxVERTICAL );
+
+ m_notebook = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelCompSettingsHolder = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelCompSettingsHolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer275;
+ bSizer275 = new wxBoxSizer( wxVERTICAL );
+
+ bSizerLocalCompSettings = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxUseLocalCmpOptions = new wxCheckBox( m_panelCompSettingsHolder, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxUseLocalCmpOptions->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizerLocalCompSettings->Add( m_checkBoxUseLocalCmpOptions, 0, wxALL|wxEXPAND, 10 );
+
+ m_staticline59 = new wxStaticLine( m_panelCompSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerLocalCompSettings->Add( m_staticline59, 0, wxEXPAND, 5 );
+
+
+ bSizer275->Add( bSizerLocalCompSettings, 0, wxEXPAND, 5 );
+
+ m_panelComparisonSettings = new wxPanel( m_panelCompSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelComparisonSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer159;
+ bSizer159 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer182;
+ bSizer182 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText91 = new wxStaticText( m_panelComparisonSettings, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText91->Wrap( -1 );
+ bSizer182->Add( m_staticText91, 0, wxALL, 5 );
+
+ wxFlexGridSizer* fgSizer16;
+ fgSizer16 = new wxFlexGridSizer( 2, 2, 5, 5 );
+ fgSizer16->SetFlexibleDirection( wxBOTH );
+ fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_bitmapByTime = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapByTime->SetToolTip( _("Identify equal files by comparing modification time and size.") );
+
+ fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_toggleBtnTimeSize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_toggleBtnTimeSize->SetValue( true );
+ m_toggleBtnTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ fgSizer16->Add( m_toggleBtnTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_bitmapByContent = new wxStaticBitmap( m_panelComparisonSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapByContent->SetToolTip( _("Identify equal files by comparing the file content.") );
+
+ fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_toggleBtnContent = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_toggleBtnContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ fgSizer16->Add( m_toggleBtnContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer182->Add( fgSizer16, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer178->Add( bSizer182, 0, wxALL, 5 );
+
+ m_staticline42 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer178->Add( m_staticline42, 0, wxEXPAND, 5 );
+
+ m_textCtrlCompVarDescription = new wxTextCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer178->Add( m_textCtrlCompVarDescription, 1, wxEXPAND|wxLEFT, 5 );
+
+
+ bSizer159->Add( bSizer178, 0, wxEXPAND, 5 );
+
+ m_staticline33 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer159->Add( m_staticline33, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer1734;
+ bSizer1734 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer1733;
+ bSizer1733 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxTimeShift = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("&Ignore time shift (in hours)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxTimeShift->SetToolTip( _("Consider file times with specified offset as equal") );
+
+ bSizer1733->Add( m_checkBoxTimeShift, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_spinCtrlTimeShift = new wxSpinCtrl( m_panelComparisonSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70,-1 ), wxSP_ARROW_KEYS|wxSP_WRAP, 1, 26, 0 );
+ m_spinCtrlTimeShift->SetToolTip( _("Consider file times with specified offset as equal") );
+
+ bSizer1733->Add( m_spinCtrlTimeShift, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ m_hyperlink241 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("Handle daylight saving time"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer1733->Add( m_hyperlink241, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer1734->Add( bSizer1733, 0, wxALL, 5 );
+
+ m_staticline44 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer1734->Add( m_staticline44, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer1721;
+ bSizer1721 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxSymlinksInclude = new wxCheckBox( m_panelComparisonSettings, wxID_ANY, _("Include &symbolic links:"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer1721->Add( m_checkBoxSymlinksInclude, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer176;
+ bSizer176 = new wxBoxSizer( wxVERTICAL );
+
+ m_radioBtnSymlinksFollow = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("&Follow"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_radioBtnSymlinksFollow->SetValue( true );
+ bSizer176->Add( m_radioBtnSymlinksFollow, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ m_radioBtnSymlinksDirect = new wxRadioButton( m_panelComparisonSettings, wxID_ANY, _("&Direct"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer176->Add( m_radioBtnSymlinksDirect, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer1721->Add( bSizer176, 0, wxEXPAND|wxLEFT, 18 );
+
+ m_hyperlink24 = new wxHyperlinkCtrl( m_panelComparisonSettings, wxID_ANY, _("More information"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer1721->Add( m_hyperlink24, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer1734->Add( bSizer1721, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_staticline441 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer1734->Add( m_staticline441, 0, wxEXPAND, 5 );
+
+
+ bSizer159->Add( bSizer1734, 0, 0, 5 );
+
+ m_staticline331 = new wxStaticLine( m_panelComparisonSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer159->Add( m_staticline331, 0, wxEXPAND, 5 );
+
+
+ m_panelComparisonSettings->SetSizer( bSizer159 );
+ m_panelComparisonSettings->Layout();
+ bSizer159->Fit( m_panelComparisonSettings );
+ bSizer275->Add( m_panelComparisonSettings, 0, wxEXPAND, 5 );
+
+
+ m_panelCompSettingsHolder->SetSizer( bSizer275 );
+ m_panelCompSettingsHolder->Layout();
+ bSizer275->Fit( m_panelCompSettingsHolder );
+ m_notebook->AddPage( m_panelCompSettingsHolder, _("dummy"), false );
+ m_panelFilterSettingsHolder = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelFilterSettingsHolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer278;
+ bSizer278 = new wxBoxSizer( wxVERTICAL );
+
+ bSizerLocalFilterSettings = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText144 = new wxStaticText( m_panelFilterSettingsHolder, wxID_ANY, _("Local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText144->Wrap( -1 );
+ bSizerLocalFilterSettings->Add( m_staticText144, 0, wxALL, 10 );
+
+ m_staticline61 = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerLocalFilterSettings->Add( m_staticline61, 0, wxEXPAND, 5 );
+
+
+ bSizer278->Add( bSizerLocalFilterSettings, 0, wxEXPAND, 5 );
+
+ m_panelFilterSettings = new wxPanel( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelFilterSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer1591;
+ bSizer1591 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer166->Add( 0, 10, 0, 0, 5 );
+
+ wxBoxSizer* bSizer1661;
+ bSizer1661 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapInclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
+ bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer1731;
+ bSizer1731 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText78 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Include:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText78->Wrap( -1 );
+ bSizer1731->Add( m_staticText78, 0, 0, 5 );
+
+ m_textCtrlInclude = new wxTextCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
+ m_textCtrlInclude->SetMinSize( wxSize( 280,-1 ) );
+
+ bSizer1731->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP, 5 );
+
+
+ bSizer1661->Add( bSizer1731, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer166->Add( bSizer1661, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxLEFT, 5 );
+
+ m_staticline22 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer166->Add( m_staticline22, 0, wxEXPAND, 5 );
+
+
+ bSizer166->Add( 0, 10, 0, 0, 5 );
+
+ wxBoxSizer* bSizer1651;
+ bSizer1651 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapExclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 );
+ bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer1742;
+ bSizer1742 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer189;
+ bSizer189 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText77 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Exclude:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText77->Wrap( -1 );
+ bSizer189->Add( m_staticText77, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer189->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink171 = new wxHyperlinkCtrl( m_panelFilterSettings, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer189->Add( m_hyperlink171, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer1742->Add( bSizer189, 0, wxEXPAND, 5 );
+
+ m_textCtrlExclude = new wxTextCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE );
+ bSizer1742->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
+
+
+ bSizer1651->Add( bSizer1742, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer166->Add( bSizer1651, 2, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 );
+
+
+ bSizer1591->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_staticline24 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer1591->Add( m_staticline24, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer167;
+ bSizer167 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapFilterDate = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 );
+ bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer165;
+ bSizer165 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText79 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Time span:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText79->Wrap( -1 );
+ bSizer165->Add( m_staticText79, 0, wxBOTTOM, 5 );
+
+ m_spinCtrlTimespan = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer165->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxArrayString m_choiceUnitTimespanChoices;
+ m_choiceUnitTimespan = new wxChoice( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 );
+ m_choiceUnitTimespan->SetSelection( 0 );
+ bSizer165->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
+
+ m_staticline23 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer168;
+ bSizer168 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapFilterSize = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 );
+ bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer158;
+ bSizer158 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText80 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("File size:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText80->Wrap( -1 );
+ bSizer158->Add( m_staticText80, 0, wxBOTTOM, 5 );
+
+ wxBoxSizer* bSizer162;
+ bSizer162 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText101 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Minimum:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText101->Wrap( -1 );
+ bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 );
+
+ m_spinCtrlMinSize = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxArrayString m_choiceUnitMinSizeChoices;
+ m_choiceUnitMinSize = new wxChoice( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 );
+ m_choiceUnitMinSize->SetSelection( 0 );
+ bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer158->Add( bSizer162, 0, wxBOTTOM|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer163;
+ bSizer163 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText102 = new wxStaticText( m_panelFilterSettings, wxID_ANY, _("Maximum:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText102->Wrap( -1 );
+ bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 );
+
+ m_spinCtrlMaxSize = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ wxArrayString m_choiceUnitMaxSizeChoices;
+ m_choiceUnitMaxSize = new wxChoice( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 );
+ m_choiceUnitMaxSize->SetSelection( 0 );
+ bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer158->Add( bSizer163, 0, wxEXPAND, 5 );
+
+
+ bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer168, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
+
+
+ bSizer1591->Add( bSizer160, 0, wxEXPAND, 5 );
+
+
+ m_panelFilterSettings->SetSizer( bSizer1591 );
+ m_panelFilterSettings->Layout();
+ bSizer1591->Fit( m_panelFilterSettings );
+ bSizer278->Add( m_panelFilterSettings, 1, wxEXPAND, 5 );
+
+ m_staticline62 = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer278->Add( m_staticline62, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer280;
+ bSizer280 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText44 = new wxStaticText( m_panelFilterSettingsHolder, wxID_ANY, _("Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_staticText44->Wrap( 590 );
+ bSizer280->Add( m_staticText44, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer280->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticline46 = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer280->Add( m_staticline46, 0, wxEXPAND, 5 );
+
+ m_buttonClear = new wxButton( m_panelFilterSettingsHolder, wxID_DEFAULT, _("C&lear"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer280->Add( m_buttonClear, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
+
+
+ bSizer278->Add( bSizer280, 0, wxEXPAND, 5 );
+
+
+ m_panelFilterSettingsHolder->SetSizer( bSizer278 );
+ m_panelFilterSettingsHolder->Layout();
+ bSizer278->Fit( m_panelFilterSettingsHolder );
+ m_notebook->AddPage( m_panelFilterSettingsHolder, _("dummy"), false );
+ m_panelSyncSettingsHolder = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelSyncSettingsHolder->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer276;
+ bSizer276 = new wxBoxSizer( wxVERTICAL );
+
+ bSizerLocalSyncSettings = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxUseLocalSyncOptions = new wxCheckBox( m_panelSyncSettingsHolder, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerLocalSyncSettings->Add( m_checkBoxUseLocalSyncOptions, 0, wxALL|wxEXPAND, 10 );
+
+ m_staticline60 = new wxStaticLine( m_panelSyncSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerLocalSyncSettings->Add( m_staticline60, 0, wxEXPAND, 5 );
+
+
+ bSizer276->Add( bSizerLocalSyncSettings, 0, wxEXPAND, 5 );
+
+ m_panelSyncSettings = new wxPanel( m_panelSyncSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelSyncSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer232;
+ bSizer232 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer237;
+ bSizer237 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer235;
+ bSizer235 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText86 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Select a variant:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText86->Wrap( -1 );
+ bSizer235->Add( m_staticText86, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer236;
+ bSizer236 = new wxBoxSizer( wxVERTICAL );
+
+ m_toggleBtnTwoWay = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_toggleBtnTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer236->Add( m_toggleBtnTwoWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM, 5 );
+
+ m_toggleBtnMirror = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer236->Add( m_toggleBtnMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM, 5 );
+
+ m_toggleBtnUpdate = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer236->Add( m_toggleBtnUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM, 5 );
+
+ m_toggleBtnCustom = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer236->Add( m_toggleBtnCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer235->Add( bSizer236, 0, wxRIGHT|wxLEFT, 5 );
+
+ m_checkBoxDetectMove = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Detect moved files"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxDetectMove->SetValue(true);
+ m_checkBoxDetectMove->SetToolTip( _("- Not supported by all file systems\n- Requires and creates database files\n- Detection not available for first sync") );
+
+ bSizer235->Add( m_checkBoxDetectMove, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
+
+
+ bSizer237->Add( bSizer235, 0, wxALL, 5 );
+
+ m_staticline53 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer237->Add( m_staticline53, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer238;
+ bSizer238 = new wxBoxSizer( wxVERTICAL );
+
+ m_textCtrlSyncVarDescription = new wxTextCtrl( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer238->Add( m_textCtrlSyncVarDescription, 1, wxEXPAND|wxLEFT, 5 );
+
+ m_staticline43 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer238->Add( m_staticline43, 0, wxEXPAND, 5 );
+
+ bSizerSyncConfig = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer173;
+ bSizer173 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticText119 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText119->Wrap( -1 );
+ bSizer173->Add( m_staticText119, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticText120 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText120->Wrap( -1 );
+ bSizer173->Add( m_staticText120, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ bSizerSyncConfig->Add( bSizer173, 0, wxEXPAND|wxRIGHT, 5 );
+
+ fgSizerSyncDirections = new wxFlexGridSizer( 2, 0, 5, 5 );
+ fgSizerSyncDirections->SetFlexibleDirection( wxBOTH );
+ fgSizerSyncDirections->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_bitmapLeftOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") );
+
+ fgSizerSyncDirections->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapLeftNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapLeftNewer->SetToolTip( _("Left side is newer") );
+
+ fgSizerSyncDirections->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapDifferent = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapDifferent->SetToolTip( _("Items have different content") );
+
+ fgSizerSyncDirections->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapConflict = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") );
+
+ fgSizerSyncDirections->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapRightNewer = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapRightNewer->SetToolTip( _("Right side is newer") );
+
+ fgSizerSyncDirections->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapRightOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
+ m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") );
+
+ fgSizerSyncDirections->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonLeftOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ fgSizerSyncDirections->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonLeftNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ fgSizerSyncDirections->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonDifferent = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ fgSizerSyncDirections->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonConflict = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ fgSizerSyncDirections->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonRightNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ fgSizerSyncDirections->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonRightOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ fgSizerSyncDirections->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerSyncConfig->Add( fgSizerSyncDirections, 0, 0, 5 );
+
+ m_bitmapDatabase = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_bitmapDatabase->SetToolTip( _("Detect synchronization directions with the help of database files") );
+
+ bSizerSyncConfig->Add( m_bitmapDatabase, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxALIGN_CENTER_VERTICAL, 10 );
+
+ wxBoxSizer* bSizerKeepVerticalHeightWhenSyncDirsNotShown;
+ bSizerKeepVerticalHeightWhenSyncDirsNotShown = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizerKeepVerticalHeightWhenSyncDirsNotShown->Add( 0, 45, 0, 0, 5 );
+
+
+ bSizerKeepVerticalHeightWhenSyncDirsNotShown->Add( 0, 5, 1, 0, 5 );
+
+
+ bSizerKeepVerticalHeightWhenSyncDirsNotShown->Add( 0, 46, 0, 0, 5 );
+
+
+ bSizerSyncConfig->Add( bSizerKeepVerticalHeightWhenSyncDirsNotShown, 0, 0, 5 );
+
+
+ bSizer238->Add( bSizerSyncConfig, 0, wxALL, 10 );
+
+
+ bSizer237->Add( bSizer238, 1, wxEXPAND, 5 );
+
+
+ bSizer232->Add( bSizer237, 0, wxEXPAND, 5 );
+
+ m_staticline54 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer232->Add( m_staticline54, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer184;
+ bSizer184 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer180;
+ bSizer180 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText87 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Delete files:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText87->Wrap( -1 );
+ bSizer180->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ m_radioBtnPermanent = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Permanent"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
+ m_radioBtnPermanent->SetToolTip( _("Delete or overwrite files permanently") );
+
+ bSizer180->Add( m_radioBtnPermanent, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_radioBtnRecycler = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_radioBtnRecycler->SetToolTip( _("Back up deleted and overwritten files in the recycle bin") );
+
+ bSizer180->Add( m_radioBtnRecycler, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_radioBtnVersioning = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Versioning"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_radioBtnVersioning->SetToolTip( _("Move files to a user-defined folder") );
+
+ bSizer180->Add( m_radioBtnVersioning, 0, wxALL, 5 );
+
+
+ bSizer184->Add( bSizer180, 0, 0, 5 );
+
+ bSizerVersioning = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonDeletionType = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW );
+ bSizerVersioning->Add( m_bpButtonDeletionType, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_panelVersioning = new wxPanel( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelVersioning->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer191;
+ bSizer191 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer156;
+ bSizer156 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_versioningFolder = new FolderHistoryBox( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer156->Add( m_versioningFolder, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirVersioning = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirVersioning->SetToolTip( _("Select a folder") );
+
+ bSizer156->Add( m_buttonSelectDirVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSelectSftp = new wxBitmapButton( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26,-1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectSftp->SetToolTip( _("Select SFTP folder") );
+
+ bSizer156->Add( m_bpButtonSelectSftp, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer191->Add( bSizer156, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ bSizer192 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText93 = new wxStaticText( m_panelVersioning, wxID_ANY, _("Naming convention:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText93->Wrap( -1 );
+ bSizer192->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 );
+ bSizer192->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_staticTextNamingCvtPart1 = new wxStaticText( m_panelVersioning, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextNamingCvtPart1->Wrap( -1 );
+ m_staticTextNamingCvtPart1->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer192->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(), 70, 90, 92, false, wxEmptyString ) );
+ m_staticTextNamingCvtPart2Bold->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer192->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 ) );
+
+ bSizer192->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer192->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink17 = new wxHyperlinkCtrl( m_panelVersioning, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer192->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+
+
+ bSizer191->Add( bSizer192, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelVersioning->SetSizer( bSizer191 );
+ m_panelVersioning->Layout();
+ bSizer191->Fit( m_panelVersioning );
+ bSizerVersioning->Add( m_panelVersioning, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+
+
+ bSizer184->Add( bSizerVersioning, 0, wxTOP|wxEXPAND, 5 );
+
+
+ bSizer232->Add( bSizer184, 0, wxALL|wxEXPAND, 10 );
+
+ bSizerMiscConfig = new wxBoxSizer( wxVERTICAL );
+
+ m_staticline582 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerMiscConfig->Add( m_staticline582, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer1732;
+ bSizer1732 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer174;
+ bSizer174 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText88 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Handle errors:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText88->Wrap( -1 );
+ bSizer174->Add( m_staticText88, 0, wxBOTTOM, 5 );
+
+ wxBoxSizer* bSizer175;
+ bSizer175 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_radioBtnIgnoreErrors = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Ignore"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
+ m_radioBtnIgnoreErrors->SetToolTip( _("Hide all error and warning messages") );
+
+ bSizer175->Add( m_radioBtnIgnoreErrors, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_radioBtnPopupOnErrors = new wxRadioButton( m_panelSyncSettings, wxID_ANY, _("&Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_radioBtnPopupOnErrors->SetToolTip( _("Show pop-up on errors or warnings") );
+
+ bSizer175->Add( m_radioBtnPopupOnErrors, 0, wxALL, 5 );
+
+
+ bSizer174->Add( bSizer175, 0, 0, 5 );
+
+
+ bSizer1732->Add( bSizer174, 0, wxALL, 10 );
+
+ m_staticline57 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer1732->Add( m_staticline57, 0, wxEXPAND, 5 );
+
+ bSizerOnCompletion = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText89 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText89->Wrap( -1 );
+ bSizerOnCompletion->Add( m_staticText89, 0, wxBOTTOM, 5 );
+
+ m_comboBoxOnCompletion = new OnCompletionBox( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizerOnCompletion->Add( m_comboBoxOnCompletion, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer1732->Add( bSizerOnCompletion, 1, wxALL, 10 );
+
+
+ bSizerMiscConfig->Add( bSizer1732, 1, wxEXPAND, 5 );
+
+
+ bSizer232->Add( bSizerMiscConfig, 1, wxEXPAND, 5 );
+
+
+ m_panelSyncSettings->SetSizer( bSizer232 );
+ m_panelSyncSettings->Layout();
+ bSizer232->Fit( m_panelSyncSettings );
+ bSizer276->Add( m_panelSyncSettings, 1, wxEXPAND, 5 );
+
+
+ m_panelSyncSettingsHolder->SetSizer( bSizer276 );
+ m_panelSyncSettingsHolder->Layout();
+ bSizer276->Fit( m_panelSyncSettingsHolder );
+ m_notebook->AddPage( m_panelSyncSettingsHolder, _("dummy"), true );
+
+ bSizer7->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonOkay->SetDefault();
+ m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer7->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer7 );
+ this->Layout();
+ bSizer7->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ConfigDlgGenerated::OnClose ) );
+ m_checkBoxUseLocalCmpOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleLocalCompSettings ), NULL, this );
+ m_toggleBtnTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnTimeSizeDouble ), NULL, this );
+ m_toggleBtnTimeSize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnTimeSize ), NULL, this );
+ m_toggleBtnContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnContentDouble ), NULL, this );
+ m_toggleBtnContent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnContent ), NULL, this );
+ m_checkBoxTimeShift->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeCompOption ), NULL, this );
+ m_hyperlink241->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpTimeShift ), NULL, this );
+ m_checkBoxSymlinksInclude->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeCompOption ), NULL, this );
+ m_hyperlink24->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpComparisonSettings ), NULL, this );
+ m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
+ m_hyperlink171->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpShowExamples ), NULL, this );
+ m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
+ m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
+ m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
+ m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeFilterOption ), NULL, this );
+ m_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnFilterReset ), NULL, this );
+ m_checkBoxUseLocalSyncOptions->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleLocalSyncSettings ), NULL, this );
+ m_toggleBtnTwoWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncTwoWayDouble ), NULL, this );
+ m_toggleBtnTwoWay->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncTwoWay ), NULL, this );
+ m_toggleBtnMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncMirrorDouble ), NULL, this );
+ m_toggleBtnMirror->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncMirror ), NULL, this );
+ m_toggleBtnUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncUpdateDouble ), NULL, this );
+ m_toggleBtnUpdate->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncUpdate ), NULL, this );
+ m_toggleBtnCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( ConfigDlgGenerated::OnSyncCustomDouble ), NULL, this );
+ m_toggleBtnCustom->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnSyncCustom ), NULL, this );
+ m_checkBoxDetectMove->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleDetectMovedFiles ), NULL, this );
+ m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnExLeftSideOnly ), NULL, this );
+ m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnLeftNewer ), NULL, this );
+ m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnDifferent ), NULL, this );
+ m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnConflict ), NULL, this );
+ m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnRightNewer ), NULL, this );
+ m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnExRightSideOnly ), NULL, this );
+ m_radioBtnPermanent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionPermanent ), NULL, this );
+ m_radioBtnRecycler->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionRecycler ), NULL, this );
+ m_radioBtnVersioning->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnDeletionVersioning ), NULL, this );
+ m_bpButtonDeletionType->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleDeletionType ), NULL, this );
+ m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeSyncOption ), NULL, this );
+ m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpVersioning ), NULL, this );
+ m_radioBtnIgnoreErrors->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnErrorIgnore ), NULL, this );
+ m_radioBtnPopupOnErrors->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnErrorPopup ), NULL, this );
+ m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnOkay ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCancel ), NULL, this );
}
ConfigDlgGenerated::~ConfigDlgGenerated()
{
}
+SftpSetupDlgGenerated::SftpSetupDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
+{
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer134;
+ bSizer134 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSftp = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer72->Add( m_bitmapSftp, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Enter your SFTP login details:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextHeader->Wrap( -1 );
+ bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer134->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline371 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxLI_HORIZONTAL );
+ bSizer134->Add( m_staticline371, 0, wxEXPAND, 5 );
+
+ m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxFlexGridSizer* fgSizer16;
+ fgSizer16 = new wxFlexGridSizer( 0, 2, 0, 0 );
+ fgSizer16->AddGrowableCol( 1 );
+ fgSizer16->SetFlexibleDirection( wxBOTH );
+ fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_staticText12311 = new wxStaticText( m_panel41, wxID_ANY, _("Server name or IP address:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText12311->Wrap( -1 );
+ fgSizer16->Add( m_staticText12311, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_textCtrlServer = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 300,-1 ), 0 );
+ fgSizer16->Add( m_textCtrlServer, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText1381 = new wxStaticText( m_panel41, wxID_ANY, _("Examples:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1381->Wrap( -1 );
+ m_staticText1381->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ fgSizer16->Add( m_staticText1381, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText1382 = new wxStaticText( m_panel41, wxID_ANY, _("www.website.com"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1382->Wrap( -1 );
+ m_staticText1382->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer181->Add( m_staticText1382, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer181->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText138 = new wxStaticText( m_panel41, wxID_ANY, _("123.123.123"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText138->Wrap( -1 );
+ m_staticText138->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer181->Add( m_staticText138, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ fgSizer16->Add( bSizer181, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText123 = new wxStaticText( m_panel41, wxID_ANY, _("User name:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText123->Wrap( -1 );
+ fgSizer16->Add( m_staticText123, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_textCtrlUserName = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer16->Add( m_textCtrlUserName, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText1231 = new wxStaticText( m_panel41, wxID_ANY, _("Password:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1231->Wrap( -1 );
+ fgSizer16->Add( m_staticText1231, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer182;
+ bSizer182 = new wxBoxSizer( wxVERTICAL );
+
+ m_textCtrlPasswordVisible = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer182->Add( m_textCtrlPasswordVisible, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_textCtrlPasswordHidden = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PASSWORD );
+ bSizer182->Add( m_textCtrlPasswordHidden, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+
+ fgSizer16->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+
+ fgSizer16->Add( 0, 0, 0, 0, 5 );
+
+ m_checkBoxShowPassword = new wxCheckBox( m_panel41, wxID_ANY, _("&Show password"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer16->Add( m_checkBoxShowPassword, 0, wxEXPAND|wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText1232 = new wxStaticText( m_panel41, wxID_ANY, _("Directory on server:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1232->Wrap( -1 );
+ fgSizer16->Add( m_staticText1232, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_textCtrlServerPath = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer16->Add( m_textCtrlServerPath, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer185->Add( fgSizer16, 1, wxALL|wxEXPAND, 5 );
+
+
+ m_panel41->SetSizer( bSizer185 );
+ m_panel41->Layout();
+ bSizer185->Fit( m_panel41 );
+ bSizer134->Add( m_panel41, 1, wxEXPAND, 5 );
+
+ m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonOkay->SetDefault();
+ m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOkay, 0, wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer134->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer134 );
+ this->Layout();
+ bSizer134->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SftpSetupDlgGenerated::OnClose ) );
+ m_checkBoxShowPassword->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SftpSetupDlgGenerated::OnToggleShowPassword ), NULL, this );
+ m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SftpSetupDlgGenerated::OnOkay ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SftpSetupDlgGenerated::OnCancel ), NULL, this );
+}
+
+SftpSetupDlgGenerated::~SftpSetupDlgGenerated()
+{
+}
+
SyncConfirmationDlgGenerated::SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer134;
- bSizer134 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer72;
- bSizer72 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapSync = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer72->Add( m_bitmapSync, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Start synchronization now?"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextHeader->Wrap( -1 );
- bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer134->Add( bSizer72, 0, 0, 5 );
-
- m_staticline371 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer134->Add( m_staticline371, 0, wxEXPAND, 5 );
-
- m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer185->Add( 40, 0, 0, 0, 5 );
-
-
- bSizer185->Add( 0, 0, 1, 0, 5 );
-
- m_staticline38 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer185->Add( m_staticline38, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer162;
- bSizer162 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer182;
- bSizer182 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText84 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Variant:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText84->Wrap( -1 );
- bSizer182->Add( m_staticText84, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
-
- bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_staticTextVariant = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextVariant->Wrap( -1 );
- m_staticTextVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer182->Add( m_staticTextVariant, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- bSizer162->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
-
- m_staticline14 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer162->Add( m_staticline14, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText83->Wrap( -1 );
- bSizer181->Add( m_staticText83, 0, wxALL, 5 );
-
- wxFlexGridSizer* fgSizer11;
- fgSizer11 = new wxFlexGridSizer( 2, 7, 2, 5 );
- fgSizer11->SetFlexibleDirection( wxBOTH );
- fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
-
- fgSizer11->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be updated") );
-
- fgSizer11->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
-
- fgSizer11->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapData->SetToolTip( _("Total bytes to copy") );
-
- fgSizer11->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
-
- fgSizer11->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdateRight->SetToolTip( _("Number of files that will be updated") );
-
- fgSizer11->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
-
- fgSizer11->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDeleteLeft->Wrap( -1 );
- m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
-
- fgSizer11->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextUpdateLeft->Wrap( -1 );
- m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be updated") );
-
- fgSizer11->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCreateLeft->Wrap( -1 );
- m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
-
- fgSizer11->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextData->Wrap( -1 );
- m_staticTextData->SetToolTip( _("Total bytes to copy") );
-
- fgSizer11->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCreateRight->Wrap( -1 );
- m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
-
- fgSizer11->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextUpdateRight->Wrap( -1 );
- m_staticTextUpdateRight->SetToolTip( _("Number of files that will be updated") );
-
- fgSizer11->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDeleteRight->Wrap( -1 );
- m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
-
- fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer181->Add( fgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer162->Add( bSizer181, 0, wxEXPAND|wxALL, 5 );
-
-
- bSizer185->Add( bSizer162, 0, 0, 5 );
-
- m_staticline381 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer185->Add( m_staticline381, 0, wxEXPAND, 5 );
-
-
- bSizer185->Add( 0, 0, 1, 0, 5 );
-
-
- bSizer185->Add( 40, 0, 0, 0, 5 );
-
-
- m_panelStatistics->SetSizer( bSizer185 );
- m_panelStatistics->Layout();
- bSizer185->Fit( m_panelStatistics );
- bSizer134->Add( m_panelStatistics, 0, wxEXPAND, 5 );
-
- m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer164;
- bSizer164 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("&Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer164->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonStartSync = new wxButton( this, wxID_OK, _("&Start"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonStartSync->SetDefault();
- m_buttonStartSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer164->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- bSizer134->Add( bSizer164, 1, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer134 );
- this->Layout();
- bSizer134->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncConfirmationDlgGenerated::OnClose ) );
- m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnStartSync ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnCancel ), NULL, this );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer134;
+ bSizer134 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSync = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer72->Add( m_bitmapSync, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Start synchronization now?"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextHeader->Wrap( -1 );
+ bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer134->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline371 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer134->Add( m_staticline371, 0, wxEXPAND, 5 );
+
+ m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer185->Add( 40, 0, 0, 0, 5 );
+
+
+ bSizer185->Add( 0, 0, 1, 0, 5 );
+
+ m_staticline38 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer185->Add( m_staticline38, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer162;
+ bSizer162 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer182;
+ bSizer182 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText84 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Variant:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText84->Wrap( -1 );
+ bSizer182->Add( m_staticText84, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+
+ bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticTextVariant = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextVariant->Wrap( -1 );
+ m_staticTextVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer182->Add( m_staticTextVariant, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizer182->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ bSizer162->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxALL, 5 );
+
+ m_staticline14 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer162->Add( m_staticline14, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText83->Wrap( -1 );
+ bSizer181->Add( m_staticText83, 0, wxALL, 5 );
+
+ wxFlexGridSizer* fgSizer11;
+ fgSizer11 = new wxFlexGridSizer( 2, 7, 2, 5 );
+ fgSizer11->SetFlexibleDirection( wxBOTH );
+ fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ fgSizer11->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be updated") );
+
+ fgSizer11->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
+
+ fgSizer11->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapData->SetToolTip( _("Total bytes to copy") );
+
+ fgSizer11->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
+
+ fgSizer11->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateRight->SetToolTip( _("Number of files that will be updated") );
+
+ fgSizer11->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ fgSizer11->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteLeft->Wrap( -1 );
+ m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ fgSizer11->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateLeft->Wrap( -1 );
+ m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be updated") );
+
+ fgSizer11->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateLeft->Wrap( -1 );
+ m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
+
+ fgSizer11->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextData->Wrap( -1 );
+ m_staticTextData->SetToolTip( _("Total bytes to copy") );
+
+ fgSizer11->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateRight->Wrap( -1 );
+ m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
+
+ fgSizer11->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateRight->Wrap( -1 );
+ m_staticTextUpdateRight->SetToolTip( _("Number of files that will be updated") );
+
+ fgSizer11->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteRight->Wrap( -1 );
+ m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+
+ fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer181->Add( fgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer162->Add( bSizer181, 0, wxEXPAND|wxALL, 5 );
+
+
+ bSizer185->Add( bSizer162, 0, 0, 5 );
+
+ m_staticline381 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer185->Add( m_staticline381, 0, wxEXPAND, 5 );
+
+
+ bSizer185->Add( 0, 0, 1, 0, 5 );
+
+
+ bSizer185->Add( 40, 0, 0, 0, 5 );
+
+
+ m_panelStatistics->SetSizer( bSizer185 );
+ m_panelStatistics->Layout();
+ bSizer185->Fit( m_panelStatistics );
+ bSizer134->Add( m_panelStatistics, 0, wxEXPAND, 5 );
+
+ m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer164;
+ bSizer164 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("&Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer164->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonStartSync = new wxButton( this, wxID_OK, _("&Start"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonStartSync->SetDefault();
+ m_buttonStartSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer164->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ bSizer134->Add( bSizer164, 1, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer134 );
+ this->Layout();
+ bSizer134->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncConfirmationDlgGenerated::OnClose ) );
+ m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnStartSync ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnCancel ), NULL, this );
}
SyncConfirmationDlgGenerated::~SyncConfirmationDlgGenerated()
@@ -2030,88 +2195,98 @@ SyncConfirmationDlgGenerated::~SyncConfirmationDlgGenerated()
FolderPairPanelGenerated::FolderPairPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
- wxBoxSizer* bSizer74;
- bSizer74 = new wxBoxSizer( wxHORIZONTAL );
-
- m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelLeft->SetMinSize( wxSize( 1,-1 ) );
-
- wxBoxSizer* bSizer134;
- bSizer134 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonFolderPairOptions = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- m_bpButtonFolderPairOptions->SetToolTip( _("Arrange folder pair") );
-
- bSizer134->Add( m_bpButtonFolderPairOptions, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
-
- bSizer134->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
-
- bSizer134->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panelLeft->SetSizer( bSizer134 );
- m_panelLeft->Layout();
- bSizer134->Fit( m_panelLeft );
- bSizer74->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxEXPAND, 5 );
-
- m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer95;
- bSizer95 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer95->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bpButtonAltCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer95->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 );
-
- m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer95->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer95->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- m_panel20->SetSizer( bSizer95 );
- m_panel20->Layout();
- bSizer95->Fit( m_panel20 );
- bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
-
- m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelRight->SetMinSize( wxSize( 1,-1 ) );
-
- wxBoxSizer* bSizer135;
- bSizer135 = new wxBoxSizer( wxHORIZONTAL );
-
- m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
-
- bSizer135->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panelRight->SetSizer( bSizer135 );
- m_panelRight->Layout();
- bSizer135->Fit( m_panelRight );
- bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer74 );
- this->Layout();
- bSizer74->Fit( this );
+ wxBoxSizer* bSizer74;
+ bSizer74 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelLeft->SetMinSize( wxSize( 1,-1 ) );
+
+ wxBoxSizer* bSizer134;
+ bSizer134 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonFolderPairOptions = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ m_bpButtonFolderPairOptions->SetToolTip( _("Arrange folder pair") );
+
+ bSizer134->Add( m_bpButtonFolderPairOptions, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
+
+ bSizer134->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
+
+ bSizer134->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSelectSftpLeft = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26,-1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectSftpLeft->SetToolTip( _("Select SFTP folder") );
+
+ bSizer134->Add( m_bpButtonSelectSftpLeft, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelLeft->SetSizer( bSizer134 );
+ m_panelLeft->Layout();
+ bSizer134->Fit( m_panelLeft );
+ bSizer74->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxEXPAND, 5 );
+
+ m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer95;
+ bSizer95 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer95->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bpButtonAltCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer95->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 );
+
+ m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer95->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer95->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panel20->SetSizer( bSizer95 );
+ m_panel20->Layout();
+ bSizer95->Fit( m_panel20 );
+ bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+ m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelRight->SetMinSize( wxSize( 1,-1 ) );
+
+ wxBoxSizer* bSizer135;
+ bSizer135 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
+
+ bSizer135->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSelectSftpRight = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26,-1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectSftpRight->SetToolTip( _("Select SFTP folder") );
+
+ bSizer135->Add( m_bpButtonSelectSftpRight, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ m_panelRight->SetSizer( bSizer135 );
+ m_panelRight->Layout();
+ bSizer135->Fit( m_panelRight );
+ bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer74 );
+ this->Layout();
+ bSizer74->Fit( this );
}
FolderPairPanelGenerated::~FolderPairPanelGenerated()
@@ -2120,110 +2295,110 @@ FolderPairPanelGenerated::~FolderPairPanelGenerated()
CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer40;
- bSizer40 = new wxBoxSizer( wxHORIZONTAL );
-
- m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer187;
- bSizer187 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer187->Add( 0, 5, 0, 0, 5 );
-
- wxFlexGridSizer* fgSizer7;
- fgSizer7 = new wxFlexGridSizer( 0, 2, 5, 5 );
- fgSizer7->SetFlexibleDirection( wxHORIZONTAL );
- fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_staticTextItemsFoundLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items found:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextItemsFoundLabel->Wrap( -1 );
- fgSizer7->Add( m_staticTextItemsFoundLabel, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextItemsFound = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextItemsFound->Wrap( -1 );
- m_staticTextItemsFound->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer7->Add( m_staticTextItemsFound, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextItemsRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextItemsRemainingLabel->Wrap( -1 );
- fgSizer7->Add( m_staticTextItemsRemainingLabel, 0, wxALIGN_BOTTOM, 5 );
-
- bSizerItemsRemaining = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextItemsRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextItemsRemaining->Wrap( -1 );
- m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerItemsRemaining->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextDataRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDataRemaining->Wrap( -1 );
- bSizerItemsRemaining->Add( m_staticTextDataRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- fgSizer7->Add( bSizerItemsRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextTimeRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTimeRemainingLabel->Wrap( -1 );
- fgSizer7->Add( m_staticTextTimeRemainingLabel, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextTimeRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTimeRemaining->Wrap( -1 );
- m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer7->Add( m_staticTextTimeRemaining, 0, wxALIGN_BOTTOM, 5 );
-
- wxStaticText* m_staticText37;
- m_staticText37 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText37->Wrap( -1 );
- fgSizer7->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextTimeElapsed = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTimeElapsed->Wrap( -1 );
- m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer7->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 );
-
-
- bSizer187->Add( fgSizer7, 0, wxRIGHT|wxLEFT, 5 );
-
-
- bSizer187->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelStatistics->SetSizer( bSizer187 );
- m_panelStatistics->Layout();
- bSizer187->Fit( m_panelStatistics );
- bSizer40->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatus->Wrap( -1 );
- bSizer181->Add( m_staticTextStatus, 0, 0, 5 );
-
- m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL|wxGA_SMOOTH );
- bSizer181->Add( m_gauge2, 0, wxEXPAND|wxTOP, 5 );
-
- m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextSpeed->Wrap( -1 );
- m_staticTextSpeed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer181->Add( m_staticTextSpeed, 0, wxALIGN_BOTTOM|wxTOP, 5 );
-
-
- bSizer40->Add( bSizer181, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- this->SetSizer( bSizer40 );
- this->Layout();
- bSizer40->Fit( this );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer40;
+ bSizer40 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer187;
+ bSizer187 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer187->Add( 0, 5, 0, 0, 5 );
+
+ wxFlexGridSizer* fgSizer7;
+ fgSizer7 = new wxFlexGridSizer( 0, 2, 5, 5 );
+ fgSizer7->SetFlexibleDirection( wxHORIZONTAL );
+ fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_staticTextItemsFoundLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items found:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextItemsFoundLabel->Wrap( -1 );
+ fgSizer7->Add( m_staticTextItemsFoundLabel, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextItemsFound = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextItemsFound->Wrap( -1 );
+ m_staticTextItemsFound->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ fgSizer7->Add( m_staticTextItemsFound, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextItemsRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextItemsRemainingLabel->Wrap( -1 );
+ fgSizer7->Add( m_staticTextItemsRemainingLabel, 0, wxALIGN_BOTTOM, 5 );
+
+ bSizerItemsRemaining = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextItemsRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextItemsRemaining->Wrap( -1 );
+ m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerItemsRemaining->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextDataRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDataRemaining->Wrap( -1 );
+ bSizerItemsRemaining->Add( m_staticTextDataRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ fgSizer7->Add( bSizerItemsRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextTimeRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTimeRemainingLabel->Wrap( -1 );
+ fgSizer7->Add( m_staticTextTimeRemainingLabel, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextTimeRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTimeRemaining->Wrap( -1 );
+ m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ fgSizer7->Add( m_staticTextTimeRemaining, 0, wxALIGN_BOTTOM, 5 );
+
+ wxStaticText* m_staticText37;
+ m_staticText37 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText37->Wrap( -1 );
+ fgSizer7->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextTimeElapsed = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTimeElapsed->Wrap( -1 );
+ m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ fgSizer7->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 );
+
+
+ bSizer187->Add( fgSizer7, 0, wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer187->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelStatistics->SetSizer( bSizer187 );
+ m_panelStatistics->Layout();
+ bSizer187->Fit( m_panelStatistics );
+ bSizer40->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatus->Wrap( -1 );
+ bSizer181->Add( m_staticTextStatus, 0, 0, 5 );
+
+ m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL|wxGA_SMOOTH );
+ bSizer181->Add( m_gauge2, 0, wxEXPAND|wxTOP, 5 );
+
+ m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextSpeed->Wrap( -1 );
+ m_staticTextSpeed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer181->Add( m_staticTextSpeed, 0, wxALIGN_BOTTOM|wxTOP, 5 );
+
+
+ bSizer40->Add( bSizer181, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ this->SetSizer( bSizer40 );
+ this->Layout();
+ bSizer40->Fit( this );
}
CompareProgressDlgGenerated::~CompareProgressDlgGenerated()
@@ -2232,320 +2407,320 @@ CompareProgressDlgGenerated::~CompareProgressDlgGenerated()
SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
- bSizerRoot = new wxBoxSizer( wxVERTICAL );
-
- bSizer42 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer42->Add( 32, 0, 0, 0, 5 );
-
-
- bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 );
- bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
-
- m_staticTextPhase = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextPhase->Wrap( -1 );
- m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
-
- m_animCtrlSyncing = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 32,32 ), wxAC_DEFAULT_STYLE );
- bSizer42->Add( m_animCtrlSyncing, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
-
-
- bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bpButtonMinimizeToTray = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), wxBU_AUTODRAW );
- m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") );
-
- bSizer42->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerRoot->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
-
- bSizerStatusText = new wxBoxSizer( wxVERTICAL );
-
- m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatus->Wrap( -1 );
- bSizerStatusText->Add( m_staticTextStatus, 0, wxEXPAND|wxLEFT, 10 );
-
-
- bSizerStatusText->Add( 0, 5, 0, 0, 5 );
-
-
- 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 ) );
-
- wxBoxSizer* bSizer173;
- bSizer173 = new wxBoxSizer( wxVERTICAL );
-
- bSizer171 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer171->Add( 10, 0, 0, 0, 5 );
-
- wxBoxSizer* bSizer164;
- bSizer164 = new wxBoxSizer( wxVERTICAL );
-
- m_panelItemsProcessed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer165;
- bSizer165 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer165->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText96;
- m_staticText96 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- bSizer165->Add( m_staticText96, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer169;
- bSizer169 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextProcessedObj = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_staticTextProcessedObj->Wrap( -1 );
- m_staticTextProcessedObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer169->Add( m_staticTextProcessedObj, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextDataProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDataProcessed->Wrap( -1 );
- bSizer169->Add( m_staticTextDataProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer165->Add( bSizer169, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer165->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelItemsProcessed->SetSizer( bSizer165 );
- m_panelItemsProcessed->Layout();
- bSizer165->Fit( m_panelItemsProcessed );
- bSizer164->Add( m_panelItemsProcessed, 0, wxEXPAND|wxTOP, 7 );
-
- m_panelItemsRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer166->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText97;
- m_staticText97 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText97->Wrap( -1 );
- bSizer166->Add( m_staticText97, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer170;
- bSizer170 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticTextRemainingObj = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_staticTextRemainingObj->Wrap( -1 );
- m_staticTextRemainingObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer170->Add( m_staticTextRemainingObj, 0, wxALIGN_BOTTOM, 5 );
-
- m_staticTextDataRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDataRemaining->Wrap( -1 );
- bSizer170->Add( m_staticTextDataRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
-
-
- bSizer166->Add( bSizer170, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer166->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelItemsRemaining->SetSizer( bSizer166 );
- m_panelItemsRemaining->Layout();
- bSizer166->Fit( m_panelItemsRemaining );
- bSizer164->Add( m_panelItemsRemaining, 0, wxTOP|wxEXPAND, 7 );
-
- m_panelTimeRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelTimeRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer167;
- bSizer167 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer167->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText98;
- m_staticText98 = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText98->Wrap( -1 );
- bSizer167->Add( m_staticText98, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- m_staticTextRemTime = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextRemTime->Wrap( -1 );
- m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer167->Add( m_staticTextRemTime, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer167->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelTimeRemaining->SetSizer( bSizer167 );
- m_panelTimeRemaining->Layout();
- bSizer167->Fit( m_panelTimeRemaining );
- bSizer164->Add( m_panelTimeRemaining, 0, wxTOP|wxEXPAND, 7 );
-
- wxPanel* m_panelTimeElapsed;
- m_panelTimeElapsed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer168;
- bSizer168 = new wxBoxSizer( wxVERTICAL );
-
-
- bSizer168->Add( 0, 5, 0, 0, 5 );
-
- wxStaticText* m_staticText961;
- m_staticText961 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText961->Wrap( -1 );
- bSizer168->Add( m_staticText961, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
- m_staticTextTimeElapsed = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextTimeElapsed->Wrap( -1 );
- m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer168->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer168->Add( 0, 5, 0, 0, 5 );
-
-
- m_panelTimeElapsed->SetSizer( bSizer168 );
- m_panelTimeElapsed->Layout();
- bSizer168->Fit( m_panelTimeElapsed );
- bSizer164->Add( m_panelTimeElapsed, 0, wxTOP|wxEXPAND, 7 );
-
-
- bSizer171->Add( bSizer164, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer171->Add( 10, 0, 0, 0, 5 );
-
- wxBoxSizer* bSizer161;
- bSizer161 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer175;
- bSizer175 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapGraphKeyBytes = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer175->Add( m_bitmapGraphKeyBytes, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
-
- wxStaticText* m_staticText99;
- m_staticText99 = new wxStaticText( m_panelProgress, wxID_ANY, _("Bytes copied:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText99->Wrap( -1 );
- bSizer175->Add( m_staticText99, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer161->Add( bSizer175, 0, 0, 5 );
-
- m_panelGraphBytes = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_panelGraphBytes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer161->Add( m_panelGraphBytes, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 15 );
-
- wxBoxSizer* bSizer174;
- bSizer174 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapGraphKeyItems = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer174->Add( m_bitmapGraphKeyItems, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
-
- wxStaticText* m_staticText100;
- m_staticText100 = new wxStaticText( m_panelProgress, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText100->Wrap( -1 );
- bSizer174->Add( m_staticText100, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer161->Add( bSizer174, 0, 0, 5 );
-
- m_panelGraphItems = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_panelGraphItems->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer161->Add( m_panelGraphItems, 1, wxEXPAND, 15 );
-
-
- bSizer161->Add( 450, 0, 0, 0, 5 );
-
-
- bSizer171->Add( bSizer161, 1, wxEXPAND, 5 );
-
-
- bSizer171->Add( 0, 310, 0, 0, 5 );
-
-
- bSizer173->Add( bSizer171, 1, wxEXPAND, 5 );
-
-
- m_panelProgress->SetSizer( bSizer173 );
- m_panelProgress->Layout();
- bSizer173->Fit( m_panelProgress );
- bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 );
-
- m_notebookResult = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_FIXEDWIDTH );
-
- bSizerRoot->Add( m_notebookResult, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
-
- m_staticlineFooter = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizerRoot->Add( m_staticlineFooter, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxHORIZONTAL );
-
- bSizerOnCompletion = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText87 = new wxStaticText( this, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText87->Wrap( -1 );
- bSizerOnCompletion->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_comboBoxOnCompletion = new OnCompletionBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizerOnCompletion->Add( m_comboBoxOnCompletion, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer160->Add( bSizerOnCompletion, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer160->Add( 0, 0, 0, 0, 5 );
-
-
- bSizerStdButtons->Add( bSizer160, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
-
- m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonClose->SetDefault();
- m_buttonClose->Enable( false );
-
- bSizerStdButtons->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerStdButtons->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
- m_buttonStop = new wxButton( this, wxID_CANCEL, _("Stop"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerStdButtons->Add( m_buttonStop, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizerRoot->Add( bSizerStdButtons, 0, wxALIGN_RIGHT|wxEXPAND, 5 );
-
-
- this->SetSizer( bSizerRoot );
- this->Layout();
- bSizerRoot->Fit( this );
+ bSizerRoot = new wxBoxSizer( wxVERTICAL );
+
+ bSizer42 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer42->Add( 32, 0, 0, 0, 5 );
+
+
+ bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 );
+ bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
+
+ m_staticTextPhase = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextPhase->Wrap( -1 );
+ m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
+
+ m_animCtrlSyncing = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 32,32 ), wxAC_DEFAULT_STYLE );
+ bSizer42->Add( m_animCtrlSyncing, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
+
+
+ bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bpButtonMinimizeToTray = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), wxBU_AUTODRAW );
+ m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") );
+
+ bSizer42->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerRoot->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+ bSizerStatusText = new wxBoxSizer( wxVERTICAL );
+
+ m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatus->Wrap( -1 );
+ bSizerStatusText->Add( m_staticTextStatus, 0, wxEXPAND|wxLEFT, 10 );
+
+
+ bSizerStatusText->Add( 0, 5, 0, 0, 5 );
+
+
+ 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 ) );
+
+ wxBoxSizer* bSizer173;
+ bSizer173 = new wxBoxSizer( wxVERTICAL );
+
+ bSizer171 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer171->Add( 10, 0, 0, 0, 5 );
+
+ wxBoxSizer* bSizer164;
+ bSizer164 = new wxBoxSizer( wxVERTICAL );
+
+ m_panelItemsProcessed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer165;
+ bSizer165 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer165->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText96;
+ m_staticText96 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ bSizer165->Add( m_staticText96, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer169;
+ bSizer169 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextProcessedObj = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_staticTextProcessedObj->Wrap( -1 );
+ m_staticTextProcessedObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer169->Add( m_staticTextProcessedObj, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextDataProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDataProcessed->Wrap( -1 );
+ bSizer169->Add( m_staticTextDataProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer165->Add( bSizer169, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer165->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelItemsProcessed->SetSizer( bSizer165 );
+ m_panelItemsProcessed->Layout();
+ bSizer165->Fit( m_panelItemsProcessed );
+ bSizer164->Add( m_panelItemsProcessed, 0, wxEXPAND|wxTOP, 7 );
+
+ m_panelItemsRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer166->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText97;
+ m_staticText97 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText97->Wrap( -1 );
+ bSizer166->Add( m_staticText97, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer170;
+ bSizer170 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticTextRemainingObj = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_staticTextRemainingObj->Wrap( -1 );
+ m_staticTextRemainingObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer170->Add( m_staticTextRemainingObj, 0, wxALIGN_BOTTOM, 5 );
+
+ m_staticTextDataRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDataRemaining->Wrap( -1 );
+ bSizer170->Add( m_staticTextDataRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 );
+
+
+ bSizer166->Add( bSizer170, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer166->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelItemsRemaining->SetSizer( bSizer166 );
+ m_panelItemsRemaining->Layout();
+ bSizer166->Fit( m_panelItemsRemaining );
+ bSizer164->Add( m_panelItemsRemaining, 0, wxTOP|wxEXPAND, 7 );
+
+ m_panelTimeRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelTimeRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer167;
+ bSizer167 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer167->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText98;
+ m_staticText98 = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText98->Wrap( -1 );
+ bSizer167->Add( m_staticText98, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextRemTime = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextRemTime->Wrap( -1 );
+ m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer167->Add( m_staticTextRemTime, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer167->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelTimeRemaining->SetSizer( bSizer167 );
+ m_panelTimeRemaining->Layout();
+ bSizer167->Fit( m_panelTimeRemaining );
+ bSizer164->Add( m_panelTimeRemaining, 0, wxTOP|wxEXPAND, 7 );
+
+ wxPanel* m_panelTimeElapsed;
+ m_panelTimeElapsed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+ m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer168;
+ bSizer168 = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizer168->Add( 0, 5, 0, 0, 5 );
+
+ wxStaticText* m_staticText961;
+ m_staticText961 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText961->Wrap( -1 );
+ bSizer168->Add( m_staticText961, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextTimeElapsed = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextTimeElapsed->Wrap( -1 );
+ m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer168->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer168->Add( 0, 5, 0, 0, 5 );
+
+
+ m_panelTimeElapsed->SetSizer( bSizer168 );
+ m_panelTimeElapsed->Layout();
+ bSizer168->Fit( m_panelTimeElapsed );
+ bSizer164->Add( m_panelTimeElapsed, 0, wxTOP|wxEXPAND, 7 );
+
+
+ bSizer171->Add( bSizer164, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer171->Add( 10, 0, 0, 0, 5 );
+
+ wxBoxSizer* bSizer161;
+ bSizer161 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer175;
+ bSizer175 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapGraphKeyBytes = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer175->Add( m_bitmapGraphKeyBytes, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
+
+ wxStaticText* m_staticText99;
+ m_staticText99 = new wxStaticText( m_panelProgress, wxID_ANY, _("Bytes copied:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText99->Wrap( -1 );
+ bSizer175->Add( m_staticText99, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer161->Add( bSizer175, 0, 0, 5 );
+
+ m_panelGraphBytes = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_panelGraphBytes->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer161->Add( m_panelGraphBytes, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 15 );
+
+ wxBoxSizer* bSizer174;
+ bSizer174 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapGraphKeyItems = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer174->Add( m_bitmapGraphKeyItems, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
+
+ wxStaticText* m_staticText100;
+ m_staticText100 = new wxStaticText( m_panelProgress, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText100->Wrap( -1 );
+ bSizer174->Add( m_staticText100, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer161->Add( bSizer174, 0, 0, 5 );
+
+ m_panelGraphItems = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_panelGraphItems->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer161->Add( m_panelGraphItems, 1, wxEXPAND, 15 );
+
+
+ bSizer161->Add( 450, 0, 0, 0, 5 );
+
+
+ bSizer171->Add( bSizer161, 1, wxEXPAND, 5 );
+
+
+ bSizer171->Add( 0, 310, 0, 0, 5 );
+
+
+ bSizer173->Add( bSizer171, 1, wxEXPAND, 5 );
+
+
+ m_panelProgress->SetSizer( bSizer173 );
+ m_panelProgress->Layout();
+ bSizer173->Fit( m_panelProgress );
+ bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 );
+
+ m_notebookResult = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_FIXEDWIDTH );
+
+ bSizerRoot->Add( m_notebookResult, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ m_staticlineFooter = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerRoot->Add( m_staticlineFooter, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizerOnCompletion = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText87 = new wxStaticText( this, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText87->Wrap( -1 );
+ bSizerOnCompletion->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_comboBoxOnCompletion = new OnCompletionBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizerOnCompletion->Add( m_comboBoxOnCompletion, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer160->Add( bSizerOnCompletion, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer160->Add( 0, 0, 0, 0, 5 );
+
+
+ bSizerStdButtons->Add( bSizer160, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+
+ m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonClose->SetDefault();
+ m_buttonClose->Enable( false );
+
+ bSizerStdButtons->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ m_buttonStop = new wxButton( this, wxID_CANCEL, _("Stop"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonStop, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizerRoot->Add( bSizerStdButtons, 0, wxALIGN_RIGHT|wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizerRoot );
+ this->Layout();
+ bSizerRoot->Fit( this );
}
SyncProgressPanelGenerated::~SyncProgressPanelGenerated()
@@ -2554,48 +2729,48 @@ SyncProgressPanelGenerated::~SyncProgressPanelGenerated()
LogPanelGenerated::LogPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer179;
- bSizer179 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer153;
- bSizer153 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer154;
- bSizer154 = new wxBoxSizer( wxVERTICAL );
-
- m_bpButtonErrors = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
- bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonWarnings = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
- bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_bpButtonInfo = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
- bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer153->Add( m_staticline13, 0, wxEXPAND, 5 );
-
- m_gridMessages = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
- m_gridMessages->SetScrollRate( 5, 5 );
- bSizer153->Add( m_gridMessages, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer179->Add( bSizer153, 1, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer179 );
- this->Layout();
- bSizer179->Fit( this );
-
- // Connect Events
- m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnErrors ), NULL, this );
- m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnWarnings ), NULL, this );
- m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnInfo ), NULL, this );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer179;
+ bSizer179 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer153;
+ bSizer153 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer154;
+ bSizer154 = new wxBoxSizer( wxVERTICAL );
+
+ m_bpButtonErrors = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
+ bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonWarnings = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
+ bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonInfo = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49,49 ), wxBU_AUTODRAW );
+ bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer153->Add( m_staticline13, 0, wxEXPAND, 5 );
+
+ m_gridMessages = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_gridMessages->SetScrollRate( 5, 5 );
+ bSizer153->Add( m_gridMessages, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer179->Add( bSizer153, 1, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer179 );
+ this->Layout();
+ bSizer179->Fit( this );
+
+ // Connect Events
+ m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnErrors ), NULL, this );
+ m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnWarnings ), NULL, this );
+ m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnInfo ), NULL, this );
}
LogPanelGenerated::~LogPanelGenerated()
@@ -2604,184 +2779,186 @@ LogPanelGenerated::~LogPanelGenerated()
BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer54;
- bSizer54 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer72;
- bSizer72 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapBatchJob = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer72->Add( m_bitmapBatchJob, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticTextDescr = new wxStaticText( this, wxID_ANY, _("Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextDescr->Wrap( 520 );
- bSizer72->Add( m_staticTextDescr, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer54->Add( bSizer72, 0, 0, 5 );
-
- m_staticline18 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer54->Add( m_staticline18, 0, wxEXPAND, 5 );
-
- m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer180;
- bSizer180 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer171;
- bSizer171 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText82 = new wxStaticText( m_panel35, wxID_ANY, _("Handle errors:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText82->Wrap( -1 );
- bSizer171->Add( m_staticText82, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer169;
- bSizer169 = new wxBoxSizer( wxHORIZONTAL );
-
- m_radioBtnIgnoreErrors = new wxRadioButton( m_panel35, wxID_ANY, _("&Ignore"), wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnIgnoreErrors->SetToolTip( _("Hide all error and warning messages") );
-
- bSizer169->Add( m_radioBtnIgnoreErrors, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_radioBtnPopupOnErrors = new wxRadioButton( m_panel35, wxID_ANY, _("&Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnPopupOnErrors->SetToolTip( _("Show pop-up on errors or warnings") );
-
- bSizer169->Add( m_radioBtnPopupOnErrors, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_radioBtnStopOnError = new wxRadioButton( m_panel35, wxID_ANY, _("&Stop"), wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnStopOnError->SetToolTip( _("Stop synchronization at first error") );
-
- bSizer169->Add( m_radioBtnStopOnError, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer171->Add( bSizer169, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer180->Add( bSizer171, 0, wxALL, 5 );
-
- m_staticline26 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer180->Add( m_staticline26, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer170;
- bSizer170 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxRunMinimized = new wxCheckBox( m_panel35, wxID_ANY, _("Run minimized"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer170->Add( m_checkBoxRunMinimized, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
-
- wxBoxSizer* bSizer179;
- bSizer179 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText81 = new wxStaticText( m_panel35, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText81->Wrap( -1 );
- bSizer179->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_comboBoxOnCompletion = new OnCompletionBox( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer179->Add( m_comboBoxOnCompletion, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer170->Add( bSizer179, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer180->Add( bSizer170, 1, wxALL, 5 );
-
-
- bSizer172->Add( bSizer180, 0, wxEXPAND, 5 );
-
- m_staticline25 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer172->Add( m_staticline25, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer191;
- bSizer191 = new wxBoxSizer( wxVERTICAL );
-
- m_checkBoxGenerateLogfile = new wxCheckBox( m_panel35, wxID_ANY, _("Save log:"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer191->Add( m_checkBoxGenerateLogfile, 0, wxEXPAND|wxALL, 5 );
-
- m_panelLogfile = new wxPanel( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelLogfile->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer1721;
- bSizer1721 = new wxBoxSizer( wxHORIZONTAL );
-
- m_logfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer1721->Add( m_logfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectLogfileDir = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectLogfileDir->SetToolTip( _("Select a folder") );
-
- bSizer1721->Add( m_buttonSelectLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_checkBoxLogfilesLimit = new wxCheckBox( m_panelLogfile, wxID_ANY, _("Limit:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") );
-
- bSizer1721->Add( m_checkBoxLogfilesLimit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
- m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") );
-
- bSizer1721->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panelLogfile->SetSizer( bSizer1721 );
- m_panelLogfile->Layout();
- bSizer1721->Fit( m_panelLogfile );
- bSizer191->Add( m_panelLogfile, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer172->Add( bSizer191, 0, wxEXPAND|wxALL, 5 );
-
- m_hyperlink17 = new wxHyperlinkCtrl( m_panel35, wxID_ANY, _("How can I schedule a batch job?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer172->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- m_panel35->SetSizer( bSizer172 );
- m_panel35->Layout();
- bSizer172->Fit( m_panel35 );
- bSizer54->Add( m_panel35, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_buttonSaveAs = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonSaveAs->SetDefault();
- m_buttonSaveAs->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonSaveAs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT|wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer54 );
- this->Layout();
- bSizer54->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) );
- m_radioBtnIgnoreErrors->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this );
- m_radioBtnPopupOnErrors->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this );
- m_radioBtnStopOnError->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorStop ), NULL, this );
- m_checkBoxGenerateLogfile->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this );
- m_checkBoxLogfilesLimit->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this );
- m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( BatchDlgGenerated::OnHelpScheduleBatch ), NULL, this );
- m_buttonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this );
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer54;
+ bSizer54 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapBatchJob = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer72->Add( m_bitmapBatchJob, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticTextDescr = new wxStaticText( this, wxID_ANY, _("Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDescr->Wrap( 520 );
+ bSizer72->Add( m_staticTextDescr, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer54->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline18 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer54->Add( m_staticline18, 0, wxEXPAND, 5 );
+
+ m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer180;
+ bSizer180 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer171;
+ bSizer171 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText82 = new wxStaticText( m_panel35, wxID_ANY, _("Handle errors:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText82->Wrap( -1 );
+ bSizer171->Add( m_staticText82, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer169;
+ bSizer169 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_radioBtnIgnoreErrors = new wxRadioButton( m_panel35, wxID_ANY, _("&Ignore"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_radioBtnIgnoreErrors->SetToolTip( _("Hide all error and warning messages") );
+
+ bSizer169->Add( m_radioBtnIgnoreErrors, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_radioBtnPopupOnErrors = new wxRadioButton( m_panel35, wxID_ANY, _("&Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_radioBtnPopupOnErrors->SetToolTip( _("Show pop-up on errors or warnings") );
+
+ bSizer169->Add( m_radioBtnPopupOnErrors, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_radioBtnStopOnError = new wxRadioButton( m_panel35, wxID_ANY, _("&Stop"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_radioBtnStopOnError->SetToolTip( _("Stop synchronization at first error") );
+
+ bSizer169->Add( m_radioBtnStopOnError, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer171->Add( bSizer169, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer180->Add( bSizer171, 0, wxALL, 5 );
+
+ m_staticline26 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer180->Add( m_staticline26, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer170;
+ bSizer170 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxRunMinimized = new wxCheckBox( m_panel35, wxID_ANY, _("Run minimized"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer170->Add( m_checkBoxRunMinimized, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
+
+ wxBoxSizer* bSizer179;
+ bSizer179 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText81 = new wxStaticText( m_panel35, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText81->Wrap( -1 );
+ bSizer179->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_comboBoxOnCompletion = new OnCompletionBox( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer179->Add( m_comboBoxOnCompletion, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer170->Add( bSizer179, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer180->Add( bSizer170, 1, wxALL, 5 );
+
+
+ bSizer172->Add( bSizer180, 0, wxEXPAND, 5 );
+
+ m_staticline25 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer172->Add( m_staticline25, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer191;
+ bSizer191 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxGenerateLogfile = new wxCheckBox( m_panel35, wxID_ANY, _("Save log:"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer191->Add( m_checkBoxGenerateLogfile, 0, wxEXPAND|wxALL, 5 );
+
+ m_panelLogfile = new wxPanel( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelLogfile->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer1721;
+ bSizer1721 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_logfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer1721->Add( m_logfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectLogfileDir = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectLogfileDir->SetToolTip( _("Select a folder") );
+
+ bSizer1721->Add( m_buttonSelectLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonSelectSftp = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26,-1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectSftp->SetToolTip( _("Select SFTP folder") );
+
+ bSizer1721->Add( m_bpButtonSelectSftp, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+ m_checkBoxLogfilesLimit = new wxCheckBox( m_panelLogfile, wxID_ANY, _("Limit:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") );
+
+ bSizer1721->Add( m_checkBoxLogfilesLimit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") );
+
+ bSizer1721->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panelLogfile->SetSizer( bSizer1721 );
+ m_panelLogfile->Layout();
+ bSizer1721->Fit( m_panelLogfile );
+ bSizer191->Add( m_panelLogfile, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer172->Add( bSizer191, 0, wxEXPAND|wxALL, 5 );
+
+ m_hyperlink17 = new wxHyperlinkCtrl( m_panel35, wxID_ANY, _("How can I schedule a batch job?"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer172->Add( m_hyperlink17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ m_panel35->SetSizer( bSizer172 );
+ m_panel35->Layout();
+ bSizer172->Fit( m_panel35 );
+ bSizer54->Add( m_panel35, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonSaveAs = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonSaveAs->SetDefault();
+ m_buttonSaveAs->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonSaveAs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer54 );
+ this->Layout();
+ bSizer54->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) );
+ m_radioBtnIgnoreErrors->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this );
+ m_radioBtnPopupOnErrors->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this );
+ m_radioBtnStopOnError->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnErrorStop ), NULL, this );
+ m_checkBoxGenerateLogfile->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this );
+ m_checkBoxLogfilesLimit->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this );
+ m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( BatchDlgGenerated::OnHelpScheduleBatch ), NULL, this );
+ m_buttonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this );
}
BatchDlgGenerated::~BatchDlgGenerated()
@@ -2790,81 +2967,81 @@ BatchDlgGenerated::~BatchDlgGenerated()
DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer24;
- bSizer24 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer72;
- bSizer72 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapDeleteType = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer72->Add( m_bitmapDeleteType, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0|wxNO_BORDER );
- m_staticTextHeader->Wrap( -1 );
- bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer24->Add( bSizer72, 0, 0, 5 );
-
- m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 );
-
- m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer185->Add( 60, 0, 0, 0, 5 );
-
- m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 );
-
- m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 500,200 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
- bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- m_panel31->SetSizer( bSizer185 );
- m_panel31->Layout();
- bSizer185->Fit( m_panel31 );
- bSizer24->Add( m_panel31, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStdButtons->Add( m_checkBoxUseRecycler, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonOK = new wxButton( this, wxID_OK, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonOK->SetDefault();
- m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer24 );
- this->Layout();
- bSizer24->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) );
- m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this );
- m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this );
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer24;
+ bSizer24 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapDeleteType = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer72->Add( m_bitmapDeleteType, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0|wxNO_BORDER );
+ m_staticTextHeader->Wrap( -1 );
+ bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer24->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 );
+
+ m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer185->Add( 60, 0, 0, 0, 5 );
+
+ m_staticline42 = new wxStaticLine( m_panel31, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer185->Add( m_staticline42, 0, wxEXPAND, 5 );
+
+ m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 500,200 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ m_panel31->SetSizer( bSizer185 );
+ m_panel31->Layout();
+ bSizer185->Fit( m_panel31 );
+ bSizer24->Add( m_panel31, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("&Recycle bin"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStdButtons->Add( m_checkBoxUseRecycler, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonOK = new wxButton( this, wxID_OK, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonOK->SetDefault();
+ m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer24 );
+ this->Layout();
+ bSizer24->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) );
+ m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this );
+ m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this );
}
DeleteDlgGenerated::~DeleteDlgGenerated()
@@ -2873,258 +3050,258 @@ DeleteDlgGenerated::~DeleteDlgGenerated()
OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer95;
- bSizer95 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer72;
- bSizer72 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer72->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_staticText44 = new wxStaticText( this, wxID_ANY, _("The following settings are used for all synchronization jobs."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_staticText44->Wrap( 500 );
- bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
-
-
- bSizer95->Add( bSizer72, 0, 0, 5 );
-
- m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 );
-
- m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer186;
- bSizer186 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer160;
- bSizer160 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer176;
- bSizer176 = new wxBoxSizer( wxHORIZONTAL );
-
- m_checkBoxFailSafe = new wxCheckBox( m_panel39, wxID_ANY, _("Fail-safe file copy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxFailSafe->SetValue(true);
- m_checkBoxFailSafe->SetToolTip( _("Copy to a temporary file (*.ffs_tmp) before overwriting target.\nThis guarantees a consistent state even in case of a serious error.") );
-
- bSizer176->Add( m_checkBoxFailSafe, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticText91 = new wxStaticText( m_panel39, wxID_ANY, _("(recommended)"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText91->Wrap( -1 );
- m_staticText91->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer176->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer176, 0, wxEXPAND, 5 );
-
- bSizerLockedFiles = new wxBoxSizer( wxHORIZONTAL );
-
- m_checkBoxCopyLocked = new wxCheckBox( m_panel39, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxCopyLocked->SetValue(true);
- m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using the Volume Shadow Copy Service.") );
-
- bSizerLockedFiles->Add( m_checkBoxCopyLocked, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticText92 = new wxStaticText( m_panel39, wxID_ANY, _("(requires administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText92->Wrap( -1 );
- m_staticText92->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizerLockedFiles->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizerLockedFiles, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer178;
- bSizer178 = new wxBoxSizer( wxHORIZONTAL );
-
- m_checkBoxCopyPermissions = new wxCheckBox( m_panel39, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxCopyPermissions->SetValue(true);
- m_checkBoxCopyPermissions->SetToolTip( _("Transfer file and folder permissions.") );
-
- bSizer178->Add( m_checkBoxCopyPermissions, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_staticText93 = new wxStaticText( m_panel39, wxID_ANY, _("(requires administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText93->Wrap( -1 );
- m_staticText93->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer178->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer160->Add( bSizer178, 0, wxEXPAND, 5 );
-
-
- bSizer186->Add( bSizer160, 0, wxEXPAND|wxALL, 5 );
-
- m_staticline39 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer186->Add( m_staticline39, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer188;
- bSizer188 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText95 = new wxStaticText( m_panel39, wxID_ANY, _("Automatic retry on error:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText95->Wrap( -1 );
- bSizer188->Add( m_staticText95, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
-
- wxFlexGridSizer* fgSizer6;
- fgSizer6 = new wxFlexGridSizer( 0, 2, 5, 5 );
- fgSizer6->SetFlexibleDirection( wxBOTH );
- fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_staticText96 = new wxStaticText( m_panel39, wxID_ANY, _("Retry count:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- fgSizer6->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_spinCtrlAutoRetryCount = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 4 );
- fgSizer6->Add( m_spinCtrlAutoRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextAutoRetryDelay = new wxStaticText( m_panel39, wxID_ANY, _("Delay (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextAutoRetryDelay->Wrap( -1 );
- fgSizer6->Add( m_staticTextAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_spinCtrlAutoRetryDelay = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- fgSizer6->Add( m_spinCtrlAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer188->Add( fgSizer6, 0, wxLEFT, 10 );
-
-
- bSizer186->Add( bSizer188, 0, wxALL, 10 );
-
-
- bSizer166->Add( bSizer186, 0, wxEXPAND, 5 );
-
- m_staticline191 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer166->Add( m_staticline191, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("Customize context menu:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText85->Wrap( -1 );
- bSizer181->Add( m_staticText85, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
-
- m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
-
- // Grid
- m_gridCustomCommand->CreateGrid( 5, 2 );
- m_gridCustomCommand->EnableEditing( true );
- m_gridCustomCommand->EnableGridLines( true );
- m_gridCustomCommand->EnableDragGridSize( false );
- m_gridCustomCommand->SetMargins( 0, 0 );
-
- // Columns
- m_gridCustomCommand->SetColSize( 0, 165 );
- m_gridCustomCommand->SetColSize( 1, 196 );
- m_gridCustomCommand->EnableDragColMove( false );
- m_gridCustomCommand->EnableDragColSize( true );
- m_gridCustomCommand->SetColLabelSize( 20 );
- m_gridCustomCommand->SetColLabelValue( 0, _("Description") );
- m_gridCustomCommand->SetColLabelValue( 1, _("Command line") );
- m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
-
- // Rows
- m_gridCustomCommand->EnableDragRowSize( false );
- m_gridCustomCommand->SetRowLabelSize( 1 );
- m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE );
-
- // Label Appearance
-
- // Cell Defaults
- m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
- bSizer181->Add( m_gridCustomCommand, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer193;
- bSizer193 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer193->Add( m_bpButtonAddRow, 0, 0, 5 );
-
- m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
- bSizer193->Add( m_bpButtonRemoveRow, 0, 0, 5 );
-
-
- bSizer193->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_hyperlink17 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- bSizer193->Add( m_hyperlink17, 0, wxLEFT, 5 );
-
-
- bSizer181->Add( bSizer193, 0, wxTOP|wxEXPAND, 5 );
-
-
- bSizer166->Add( bSizer181, 1, wxEXPAND|wxALL, 10 );
-
- m_staticline192 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer166->Add( m_staticline192, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer1881;
- bSizer1881 = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonResetDialogs = new zen::BitmapTextButton( m_panel39, wxID_ANY, _("Show hidden dialogs again"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonResetDialogs->SetToolTip( _("Show all permanently hidden dialogs and warning messages again") );
-
- bSizer1881->Add( m_buttonResetDialogs, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
-
- m_staticline40 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer1881->Add( m_staticline40, 0, wxEXPAND, 5 );
-
-
- bSizer166->Add( bSizer1881, 0, 0, 5 );
-
-
- m_panel39->SetSizer( bSizer166 );
- m_panel39->Layout();
- bSizer166->Fit( m_panel39 );
- bSizer95->Add( m_panel39, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer95->Add( m_staticline36, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonDefault = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerStdButtons->Add( m_buttonDefault, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizerStdButtons->Add( 0, 0, 1, 0, 5 );
-
- m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonOkay->SetDefault();
- m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer95->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer95 );
- this->Layout();
- bSizer95->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( OptionsDlgGenerated::OnClose ) );
- m_spinCtrlAutoRetryCount->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::OnToggleAutoRetryCount ), NULL, this );
- m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnAddRow ), NULL, this );
- m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnRemoveRow ), NULL, this );
- m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( OptionsDlgGenerated::OnHelpShowExamples ), NULL, this );
- m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnResetDialogs ), NULL, this );
- m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnDefault ), NULL, this );
- m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnOkay ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnCancel ), NULL, this );
+ this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer95;
+ bSizer95 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer72;
+ bSizer72 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer72->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_staticText44 = new wxStaticText( this, wxID_ANY, _("The following settings are used for all synchronization jobs."), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_staticText44->Wrap( 500 );
+ bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+
+ bSizer95->Add( bSizer72, 0, 0, 5 );
+
+ m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 );
+
+ m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer186;
+ bSizer186 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer160;
+ bSizer160 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer176;
+ bSizer176 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_checkBoxFailSafe = new wxCheckBox( m_panel39, wxID_ANY, _("Fail-safe file copy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxFailSafe->SetValue(true);
+ m_checkBoxFailSafe->SetToolTip( _("Copy to a temporary file (*.ffs_tmp) before overwriting target.\nThis guarantees a consistent state even in case of a serious error.") );
+
+ bSizer176->Add( m_checkBoxFailSafe, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText91 = new wxStaticText( m_panel39, wxID_ANY, _("(recommended)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText91->Wrap( -1 );
+ m_staticText91->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer176->Add( m_staticText91, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer176, 0, wxEXPAND, 5 );
+
+ bSizerLockedFiles = new wxBoxSizer( wxHORIZONTAL );
+
+ m_checkBoxCopyLocked = new wxCheckBox( m_panel39, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxCopyLocked->SetValue(true);
+ m_checkBoxCopyLocked->SetToolTip( _("Copy shared or locked files using the Volume Shadow Copy Service.") );
+
+ bSizerLockedFiles->Add( m_checkBoxCopyLocked, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText92 = new wxStaticText( m_panel39, wxID_ANY, _("(requires administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText92->Wrap( -1 );
+ m_staticText92->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizerLockedFiles->Add( m_staticText92, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizerLockedFiles, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_checkBoxCopyPermissions = new wxCheckBox( m_panel39, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxCopyPermissions->SetValue(true);
+ m_checkBoxCopyPermissions->SetToolTip( _("Transfer file and folder permissions.") );
+
+ bSizer178->Add( m_checkBoxCopyPermissions, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_staticText93 = new wxStaticText( m_panel39, wxID_ANY, _("(requires administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText93->Wrap( -1 );
+ m_staticText93->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+
+ bSizer178->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer160->Add( bSizer178, 0, wxEXPAND, 5 );
+
+
+ bSizer186->Add( bSizer160, 0, wxEXPAND|wxALL, 5 );
+
+ m_staticline39 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer186->Add( m_staticline39, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer188;
+ bSizer188 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText95 = new wxStaticText( m_panel39, wxID_ANY, _("Automatic retry on error:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText95->Wrap( -1 );
+ bSizer188->Add( m_staticText95, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
+
+ wxFlexGridSizer* fgSizer6;
+ fgSizer6 = new wxFlexGridSizer( 0, 2, 5, 5 );
+ fgSizer6->SetFlexibleDirection( wxBOTH );
+ fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_staticText96 = new wxStaticText( m_panel39, wxID_ANY, _("Retry count:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ fgSizer6->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_spinCtrlAutoRetryCount = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 4 );
+ fgSizer6->Add( m_spinCtrlAutoRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextAutoRetryDelay = new wxStaticText( m_panel39, wxID_ANY, _("Delay (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextAutoRetryDelay->Wrap( -1 );
+ fgSizer6->Add( m_staticTextAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_spinCtrlAutoRetryDelay = new wxSpinCtrl( m_panel39, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ fgSizer6->Add( m_spinCtrlAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer188->Add( fgSizer6, 0, wxLEFT, 10 );
+
+
+ bSizer186->Add( bSizer188, 0, wxALL, 10 );
+
+
+ bSizer166->Add( bSizer186, 0, wxEXPAND, 5 );
+
+ m_staticline191 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer166->Add( m_staticline191, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("Customize context menu:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText85->Wrap( -1 );
+ bSizer181->Add( m_staticText85, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
+
+ m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
+
+ // Grid
+ m_gridCustomCommand->CreateGrid( 5, 2 );
+ m_gridCustomCommand->EnableEditing( true );
+ m_gridCustomCommand->EnableGridLines( true );
+ m_gridCustomCommand->EnableDragGridSize( false );
+ m_gridCustomCommand->SetMargins( 0, 0 );
+
+ // Columns
+ m_gridCustomCommand->SetColSize( 0, 165 );
+ m_gridCustomCommand->SetColSize( 1, 196 );
+ m_gridCustomCommand->EnableDragColMove( false );
+ m_gridCustomCommand->EnableDragColSize( true );
+ m_gridCustomCommand->SetColLabelSize( 20 );
+ m_gridCustomCommand->SetColLabelValue( 0, _("Description") );
+ m_gridCustomCommand->SetColLabelValue( 1, _("Command line") );
+ m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
+
+ // Rows
+ m_gridCustomCommand->EnableDragRowSize( false );
+ m_gridCustomCommand->SetRowLabelSize( 1 );
+ m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE );
+
+ // Label Appearance
+
+ // Cell Defaults
+ m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
+ bSizer181->Add( m_gridCustomCommand, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer193;
+ bSizer193 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer193->Add( m_bpButtonAddRow, 0, 0, 5 );
+
+ m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW );
+ bSizer193->Add( m_bpButtonRemoveRow, 0, 0, 5 );
+
+
+ bSizer193->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_hyperlink17 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Show examples"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ bSizer193->Add( m_hyperlink17, 0, wxLEFT, 5 );
+
+
+ bSizer181->Add( bSizer193, 0, wxTOP|wxEXPAND, 5 );
+
+
+ bSizer166->Add( bSizer181, 1, wxEXPAND|wxALL, 10 );
+
+ m_staticline192 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer166->Add( m_staticline192, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer1881;
+ bSizer1881 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonResetDialogs = new zen::BitmapTextButton( m_panel39, wxID_ANY, _("Show hidden dialogs again"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonResetDialogs->SetToolTip( _("Show all permanently hidden dialogs and warning messages again") );
+
+ bSizer1881->Add( m_buttonResetDialogs, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
+
+ m_staticline40 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer1881->Add( m_staticline40, 0, wxEXPAND, 5 );
+
+
+ bSizer166->Add( bSizer1881, 0, 0, 5 );
+
+
+ m_panel39->SetSizer( bSizer166 );
+ m_panel39->Layout();
+ bSizer166->Fit( m_panel39 );
+ bSizer95->Add( m_panel39, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer95->Add( m_staticline36, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonDefault = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonDefault, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, 0, 5 );
+
+ m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonOkay->SetDefault();
+ m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer95->Add( bSizerStdButtons, 0, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer95 );
+ this->Layout();
+ bSizer95->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( OptionsDlgGenerated::OnClose ) );
+ m_spinCtrlAutoRetryCount->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::OnToggleAutoRetryCount ), NULL, this );
+ m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnAddRow ), NULL, this );
+ m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnRemoveRow ), NULL, this );
+ m_hyperlink17->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( OptionsDlgGenerated::OnHelpShowExamples ), NULL, this );
+ m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnResetDialogs ), NULL, this );
+ m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnDefault ), NULL, this );
+ m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnOkay ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnCancel ), NULL, this );
}
OptionsDlgGenerated::~OptionsDlgGenerated()
@@ -3133,22 +3310,22 @@ OptionsDlgGenerated::~OptionsDlgGenerated()
TooltipDialogGenerated::TooltipDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
-
- wxBoxSizer* bSizer158;
- bSizer158 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer158->Add( m_bitmapLeft, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticTextMain = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextMain->Wrap( 600 );
- bSizer158->Add( m_staticTextMain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- this->SetSizer( bSizer158 );
- this->Layout();
- bSizer158->Fit( this );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+
+ wxBoxSizer* bSizer158;
+ bSizer158 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer158->Add( m_bitmapLeft, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextMain = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextMain->Wrap( 600 );
+ bSizer158->Add( m_staticTextMain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ this->SetSizer( bSizer158 );
+ this->Layout();
+ bSizer158->Fit( this );
}
TooltipDialogGenerated::~TooltipDialogGenerated()
@@ -3157,60 +3334,60 @@ TooltipDialogGenerated::~TooltipDialogGenerated()
SelectTimespanDlgGenerated::SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer96;
- bSizer96 = new wxBoxSizer( wxVERTICAL );
-
- m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer98;
- bSizer98 = new wxBoxSizer( wxHORIZONTAL );
-
- m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
- bSizer98->Add( m_calendarFrom, 0, wxTOP|wxBOTTOM|wxLEFT, 10 );
-
- m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
- bSizer98->Add( m_calendarTo, 0, wxALL, 10 );
-
-
- m_panel35->SetSizer( bSizer98 );
- m_panel35->Layout();
- bSizer98->Fit( m_panel35 );
- bSizer96->Add( m_panel35, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonOkay->SetDefault();
- m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer96 );
- this->Layout();
- bSizer96->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) );
- m_calendarFrom->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this );
- m_calendarTo->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this );
- m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this );
- m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer96;
+ bSizer96 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer98;
+ bSizer98 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
+ bSizer98->Add( m_calendarFrom, 0, wxTOP|wxBOTTOM|wxLEFT, 10 );
+
+ m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS|wxNO_BORDER );
+ bSizer98->Add( m_calendarTo, 0, wxALL, 10 );
+
+
+ m_panel35->SetSizer( bSizer98 );
+ m_panel35->Layout();
+ bSizer98->Fit( m_panel35 );
+ bSizer96->Add( m_panel35, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonOkay->SetDefault();
+ m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+
+ bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer96 );
+ this->Layout();
+ bSizer96->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) );
+ m_calendarFrom->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this );
+ m_calendarTo->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this );
+ m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this );
+ m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this );
}
SelectTimespanDlgGenerated::~SelectTimespanDlgGenerated()
@@ -3219,306 +3396,306 @@ SelectTimespanDlgGenerated::~SelectTimespanDlgGenerated()
AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
- this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
-
- wxBoxSizer* bSizer31;
- bSizer31 = new wxBoxSizer( wxVERTICAL );
-
- m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- wxBoxSizer* bSizer162;
- bSizer162 = new wxBoxSizer( wxVERTICAL );
-
- m_bitmapLogo = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer162->Add( m_bitmapLogo, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticline341 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer162->Add( m_staticline341, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer174;
- bSizer174 = new wxBoxSizer( wxHORIZONTAL );
-
- wxBoxSizer* bSizer181;
- bSizer181 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer187;
- bSizer187 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText96 = new wxStaticText( m_panel41, wxID_ANY, _("Source code written in C++ using:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- bSizer187->Add( m_staticText96, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer171;
- bSizer171 = new wxBoxSizer( wxHORIZONTAL );
-
- m_hyperlink11 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MS Visual C++"), wxT("http://www.visualstudio.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink11->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink11->SetToolTip( _("http://www.visualstudio.com") );
-
- bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink9 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink9->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink9->SetToolTip( _("http://www.mingw.org") );
-
- bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink10 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink10->SetToolTip( _("http://www.codeblocks.org") );
-
- bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink7 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink7->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink7->SetToolTip( _("http://www.wxwidgets.org") );
-
- bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink14 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink14->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink14->SetToolTip( _("http://wxformbuilder.org") );
-
- bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer187->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxHORIZONTAL );
-
- m_hyperlink15 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zen::Xml"), wxT("http://zenxml.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink15->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink15->SetToolTip( _("http://zenxml.sourceforge.net") );
-
- bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink13 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink13->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink13->SetToolTip( _("http://www.boost.org") );
-
- bSizer172->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink16 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink16->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink16->SetToolTip( _("http://astyle.sourceforge.net") );
-
- bSizer172->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink12 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink12->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink12->SetToolTip( _("http://code.google.com/p/googletest") );
-
- bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink18->SetToolTip( _("http://www.scratchpaper.com") );
-
- bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer187->Add( bSizer172, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer181->Add( bSizer187, 0, wxALL|wxEXPAND, 5 );
-
- m_panelDonate = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelDonate->SetBackgroundColour( wxColour( 153, 170, 187 ) );
-
- wxBoxSizer* bSizer183;
- bSizer183 = new wxBoxSizer( wxVERTICAL );
-
- m_panel39 = new wxPanel( m_panelDonate, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panel39->SetBackgroundColour( wxColour( 221, 221, 255 ) );
-
- wxBoxSizer* bSizer184;
- bSizer184 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bitmapDonate = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer184->Add( m_bitmapDonate, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- wxBoxSizer* bSizer178;
- bSizer178 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText83 = new wxStaticText( m_panel39, wxID_ANY, _("If you like FreeFileSync:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText83->Wrap( -1 );
- m_staticText83->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
- m_staticText83->SetForegroundColour( wxColour( 0, 0, 0 ) );
-
- bSizer178->Add( m_staticText83, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_buttonDonate = new wxButton( m_panel39, wxID_ANY, _("Donate with PayPal"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );
- m_buttonDonate->SetToolTip( _("http://www.freefilesync.org/donate.php") );
-
- bSizer178->Add( m_buttonDonate, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer184->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- m_panel39->SetSizer( bSizer184 );
- m_panel39->Layout();
- bSizer184->Fit( m_panel39 );
- bSizer183->Add( m_panel39, 0, wxEXPAND|wxALL, 5 );
-
-
- m_panelDonate->SetSizer( bSizer183 );
- m_panelDonate->Layout();
- bSizer183->Fit( m_panelDonate );
- bSizer181->Add( m_panelDonate, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
-
- wxBoxSizer* bSizer186;
- bSizer186 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Feedback and suggestions are welcome"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText94->Wrap( -1 );
- bSizer186->Add( m_staticText94, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer166;
- bSizer166 = new wxBoxSizer( wxHORIZONTAL );
-
-
- bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bitmapHomepage = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_bitmapHomepage->SetToolTip( _("Homepage") );
-
- bSizer166->Add( m_bitmapHomepage, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_hyperlink1 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("FreeFileSync.org"), wxT("http://www.freefilesync.org/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) );
- m_hyperlink1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer166->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
-
- m_bitmapEmail = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_bitmapEmail->SetToolTip( _("Email") );
-
- bSizer166->Add( m_bitmapEmail, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_hyperlink2 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zenju@gmx.de"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) );
- m_hyperlink2->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer166->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
-
-
- bSizer186->Add( bSizer166, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer181->Add( bSizer186, 0, wxALL|wxEXPAND, 5 );
-
- m_staticline34 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer181->Add( m_staticline34, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer185;
- bSizer185 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText93 = new wxStaticText( m_panel41, wxID_ANY, _("Published under the GNU General Public License"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText93->Wrap( -1 );
- bSizer185->Add( m_staticText93, 0, wxALL, 5 );
-
- wxBoxSizer* bSizer1671;
- bSizer1671 = new wxBoxSizer( wxHORIZONTAL );
-
- m_bitmapGpl = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
- bSizer1671->Add( m_bitmapGpl, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
-
- m_hyperlink5 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("http://www.gnu.org/licenses/gpl-3.0"), wxT("http://www.gnu.org/licenses/gpl-3.0"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
-
- bSizer1671->Add( m_hyperlink5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer185->Add( bSizer1671, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer181->Add( bSizer185, 0, wxALL|wxEXPAND, 5 );
-
-
- bSizer174->Add( bSizer181, 0, 0, 5 );
-
- m_staticline37 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer174->Add( m_staticline37, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer177;
- bSizer177 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText54 = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText54->Wrap( 200 );
- m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
-
- bSizer177->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
-
-
- bSizer177->Add( 0, 5, 0, 0, 5 );
-
- m_scrolledWindowTranslators = new wxScrolledWindow( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxVSCROLL );
- m_scrolledWindowTranslators->SetScrollRate( 10, 10 );
- m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_scrolledWindowTranslators->SetMinSize( wxSize( 220,-1 ) );
-
- fgSizerTranslators = new wxFlexGridSizer( 0, 2, 2, 10 );
- fgSizerTranslators->SetFlexibleDirection( wxBOTH );
- fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
-
- m_scrolledWindowTranslators->SetSizer( fgSizerTranslators );
- m_scrolledWindowTranslators->Layout();
- fgSizerTranslators->Fit( m_scrolledWindowTranslators );
- bSizer177->Add( m_scrolledWindowTranslators, 1, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxEXPAND, 5 );
-
-
- bSizer174->Add( bSizer177, 0, wxEXPAND|wxTOP|wxLEFT, 5 );
-
-
- bSizer162->Add( bSizer174, 0, 0, 5 );
-
-
- m_panel41->SetSizer( bSizer162 );
- m_panel41->Layout();
- bSizer162->Fit( m_panel41 );
- bSizer31->Add( m_panel41, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
-
- m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer31->Add( m_staticline36, 0, wxEXPAND, 5 );
-
- bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
-
- m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonClose->SetDefault();
- bSizerStdButtons->Add( m_buttonClose, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer31->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
-
-
- this->SetSizer( bSizer31 );
- this->Layout();
- bSizer31->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) );
- m_buttonDonate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this );
- m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this );
+ this->SetSizeHints( wxDefaultSize, wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer31;
+ bSizer31 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ wxBoxSizer* bSizer162;
+ bSizer162 = new wxBoxSizer( wxVERTICAL );
+
+ m_bitmapLogo = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer162->Add( m_bitmapLogo, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticline341 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer162->Add( m_staticline341, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer174;
+ bSizer174 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer187;
+ bSizer187 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText96 = new wxStaticText( m_panel41, wxID_ANY, _("Source code written in C++ using:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ bSizer187->Add( m_staticText96, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer171;
+ bSizer171 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_hyperlink11 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MS Visual C++"), wxT("http://www.visualstudio.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink11->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink11->SetToolTip( _("http://www.visualstudio.com") );
+
+ bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink9 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink9->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink9->SetToolTip( _("http://www.mingw.org") );
+
+ bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink10 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink10->SetToolTip( _("http://www.codeblocks.org") );
+
+ bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink7 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink7->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink7->SetToolTip( _("http://www.wxwidgets.org") );
+
+ bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink14 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink14->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink14->SetToolTip( _("http://wxformbuilder.org") );
+
+ bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer187->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_hyperlink15 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zen::Xml"), wxT("http://zenxml.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink15->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink15->SetToolTip( _("http://zenxml.sourceforge.net") );
+
+ bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink13 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink13->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink13->SetToolTip( _("http://www.boost.org") );
+
+ bSizer172->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink16 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink16->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink16->SetToolTip( _("http://astyle.sourceforge.net") );
+
+ bSizer172->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink12 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink12->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink12->SetToolTip( _("http://code.google.com/p/googletest") );
+
+ bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_hyperlink18->SetToolTip( _("http://www.scratchpaper.com") );
+
+ bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer187->Add( bSizer172, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer181->Add( bSizer187, 0, wxALL|wxEXPAND, 5 );
+
+ m_panelDonate = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelDonate->SetBackgroundColour( wxColour( 153, 170, 187 ) );
+
+ wxBoxSizer* bSizer183;
+ bSizer183 = new wxBoxSizer( wxVERTICAL );
+
+ m_panel39 = new wxPanel( m_panelDonate, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel39->SetBackgroundColour( wxColour( 221, 221, 255 ) );
+
+ wxBoxSizer* bSizer184;
+ bSizer184 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bitmapDonate = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer184->Add( m_bitmapDonate, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText83 = new wxStaticText( m_panel39, wxID_ANY, _("If you like FreeFileSync:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText83->Wrap( -1 );
+ m_staticText83->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+ m_staticText83->SetForegroundColour( wxColour( 0, 0, 0 ) );
+
+ bSizer178->Add( m_staticText83, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_buttonDonate = new wxButton( m_panel39, wxID_ANY, _("Donate with PayPal"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );
+ m_buttonDonate->SetToolTip( _("http://www.freefilesync.org/donate.php") );
+
+ bSizer178->Add( m_buttonDonate, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer184->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panel39->SetSizer( bSizer184 );
+ m_panel39->Layout();
+ bSizer184->Fit( m_panel39 );
+ bSizer183->Add( m_panel39, 0, wxEXPAND|wxALL, 5 );
+
+
+ m_panelDonate->SetSizer( bSizer183 );
+ m_panelDonate->Layout();
+ bSizer183->Fit( m_panelDonate );
+ bSizer181->Add( m_panelDonate, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
+
+ wxBoxSizer* bSizer186;
+ bSizer186 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Feedback and suggestions are welcome"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText94->Wrap( -1 );
+ bSizer186->Add( m_staticText94, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer166;
+ bSizer166 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bitmapHomepage = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_bitmapHomepage->SetToolTip( _("Homepage") );
+
+ bSizer166->Add( m_bitmapHomepage, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_hyperlink1 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("FreeFileSync.org"), wxT("http://www.freefilesync.org/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) );
+ m_hyperlink1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer166->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_bitmapEmail = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_bitmapEmail->SetToolTip( _("Email") );
+
+ bSizer166->Add( m_bitmapEmail, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_hyperlink2 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zenju@gmx.de"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) );
+ m_hyperlink2->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer166->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer166->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ bSizer186->Add( bSizer166, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer181->Add( bSizer186, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticline34 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer181->Add( m_staticline34, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer185;
+ bSizer185 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText93 = new wxStaticText( m_panel41, wxID_ANY, _("Published under the GNU General Public License"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText93->Wrap( -1 );
+ bSizer185->Add( m_staticText93, 0, wxALL, 5 );
+
+ wxBoxSizer* bSizer1671;
+ bSizer1671 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapGpl = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer1671->Add( m_bitmapGpl, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ m_hyperlink5 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("http://www.gnu.org/licenses/gpl-3.0"), wxT("http://www.gnu.org/licenses/gpl-3.0"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
+ bSizer1671->Add( m_hyperlink5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer185->Add( bSizer1671, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizer181->Add( bSizer185, 0, wxALL|wxEXPAND, 5 );
+
+
+ bSizer174->Add( bSizer181, 0, 0, 5 );
+
+ m_staticline37 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer174->Add( m_staticline37, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer177;
+ bSizer177 = new wxBoxSizer( wxVERTICAL );
+
+ m_staticText54 = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText54->Wrap( 200 );
+ m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer177->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
+
+
+ bSizer177->Add( 0, 5, 0, 0, 5 );
+
+ m_scrolledWindowTranslators = new wxScrolledWindow( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxVSCROLL );
+ m_scrolledWindowTranslators->SetScrollRate( 10, 10 );
+ m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+ m_scrolledWindowTranslators->SetMinSize( wxSize( 220,-1 ) );
+
+ fgSizerTranslators = new wxFlexGridSizer( 0, 2, 2, 10 );
+ fgSizerTranslators->SetFlexibleDirection( wxBOTH );
+ fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+
+ m_scrolledWindowTranslators->SetSizer( fgSizerTranslators );
+ m_scrolledWindowTranslators->Layout();
+ fgSizerTranslators->Fit( m_scrolledWindowTranslators );
+ bSizer177->Add( m_scrolledWindowTranslators, 1, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxEXPAND, 5 );
+
+
+ bSizer174->Add( bSizer177, 0, wxEXPAND|wxTOP|wxLEFT, 5 );
+
+
+ bSizer162->Add( bSizer174, 0, 0, 5 );
+
+
+ m_panel41->SetSizer( bSizer162 );
+ m_panel41->Layout();
+ bSizer162->Fit( m_panel41 );
+ bSizer31->Add( m_panel41, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+ m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer31->Add( m_staticline36, 0, wxEXPAND, 5 );
+
+ bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
+
+ m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ m_buttonClose->SetDefault();
+ bSizerStdButtons->Add( m_buttonClose, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer31->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 );
+
+
+ this->SetSizer( bSizer31 );
+ this->Layout();
+ bSizer31->Fit( this );
+
+ this->Centre( wxBOTH );
+
+ // Connect Events
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) );
+ m_buttonDonate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this );
+ m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this );
}
AboutDlgGenerated::~AboutDlgGenerated()
diff --git a/FreeFileSync/Source/ui/gui_generated.h b/FreeFileSync/Source/ui/gui_generated.h
index d7034add..bc69b713 100644
--- a/FreeFileSync/Source/ui/gui_generated.h
+++ b/FreeFileSync/Source/ui/gui_generated.h
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 5 2014)
+// C++ code generated with wxFormBuilder (version Jun 17 2015)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
@@ -14,10 +14,10 @@
class FolderHistoryBox;
class OnCompletionBox;
class ToggleButton;
-namespace zen{ class BitmapTextButton; }
-namespace zen{ class Graph2D; }
-namespace zen{ class Grid; }
-namespace zen{ class TripleSplitter; }
+namespace zen { class BitmapTextButton; }
+namespace zen { class Graph2D; }
+namespace zen { class Grid; }
+namespace zen { class TripleSplitter; }
#include <wx/string.h>
#include <wx/bitmap.h>
@@ -61,795 +61,845 @@ namespace zen{ class TripleSplitter; }
///////////////////////////////////////////////////////////////////////////////
/// Class MainDialogGenerated
///////////////////////////////////////////////////////////////////////////////
-class MainDialogGenerated : public wxFrame
+class MainDialogGenerated : public wxFrame
{
- private:
-
- protected:
- wxMenuBar* m_menubar1;
- wxMenu* m_menuFile;
- wxMenuItem* m_menuItemNew;
- wxMenuItem* m_menuItemLoad;
- wxMenuItem* m_menuItemSave;
- wxMenuItem* m_menuItemSaveAs;
- wxMenuItem* m_menuItemSaveAsBatch;
- wxMenu* m_menu4;
- wxMenuItem* m_menuItemCompare;
- wxMenuItem* m_menuItemCompSettings;
- wxMenuItem* m_menuItemFilter;
- wxMenuItem* m_menuItemSyncSettings;
- wxMenuItem* m_menuItemSynchronize;
- wxMenu* m_menuTools;
- wxMenuItem* m_menuItemOptions;
- wxMenu* m_menuLanguages;
- wxMenu* m_menuHelp;
- wxMenuItem* m_menuItemHelp;
- wxMenu* m_menuCheckVersion;
- wxMenuItem* m_menuItemCheckVersionNow;
- wxMenuItem* m_menuItemCheckVersionAuto;
- wxMenuItem* m_menuItemAbout;
- wxBoxSizer* bSizerPanelHolder;
- wxPanel* m_panelTopButtons;
- wxBoxSizer* bSizerTopButtons;
- wxBitmapButton* m_bpButtonCmpConfig;
- zen::BitmapTextButton* m_buttonCancel;
- zen::BitmapTextButton* m_buttonCompare;
- wxBitmapButton* m_bpButtonFilter;
- wxBitmapButton* m_bpButtonSyncConfig;
- zen::BitmapTextButton* m_buttonSync;
- wxPanel* m_panelDirectoryPairs;
- wxStaticText* m_staticTextResolvedPathL;
- wxBitmapButton* m_bpButtonAddPair;
- wxButton* m_buttonSelectDirLeft;
- wxPanel* m_panelTopMiddle;
- wxBitmapButton* m_bpButtonSwapSides;
- wxStaticText* m_staticTextResolvedPathR;
- wxButton* m_buttonSelectDirRight;
- wxScrolledWindow* m_scrolledWindowFolderPairs;
- wxBoxSizer* bSizerAddFolderPairs;
- zen::Grid* m_gridNavi;
- wxPanel* m_panelCenter;
- zen::TripleSplitter* m_splitterMain;
- zen::Grid* m_gridMainL;
- zen::Grid* m_gridMainC;
- zen::Grid* m_gridMainR;
- wxPanel* m_panelStatusBar;
- wxBoxSizer* bSizerFileStatus;
- wxBoxSizer* bSizerStatusLeft;
- wxBoxSizer* bSizerStatusLeftDirectories;
- wxStaticBitmap* m_bitmapSmallDirectoryLeft;
- wxStaticText* m_staticTextStatusLeftDirs;
- wxBoxSizer* bSizerStatusLeftFiles;
- wxStaticBitmap* m_bitmapSmallFileLeft;
- wxStaticText* m_staticTextStatusLeftFiles;
- wxStaticText* m_staticTextStatusLeftBytes;
- wxStaticLine* m_staticline9;
- wxStaticText* m_staticTextStatusMiddle;
- wxBoxSizer* bSizerStatusRight;
- wxStaticLine* m_staticline10;
- wxBoxSizer* bSizerStatusRightDirectories;
- wxStaticBitmap* m_bitmapSmallDirectoryRight;
- wxStaticText* m_staticTextStatusRightDirs;
- wxBoxSizer* bSizerStatusRightFiles;
- wxStaticBitmap* m_bitmapSmallFileRight;
- wxStaticText* m_staticTextStatusRightFiles;
- wxStaticText* m_staticTextStatusRightBytes;
- wxStaticText* m_staticTextFullStatus;
- wxPanel* m_panelSearch;
- wxBitmapButton* m_bpButtonHideSearch;
- wxStaticText* m_staticText101;
- wxTextCtrl* m_textCtrlSearchTxt;
- wxCheckBox* m_checkBoxMatchCase;
- wxPanel* m_panelConfig;
- wxBoxSizer* bSizerConfig;
- wxBitmapButton* m_bpButtonNew;
- wxStaticText* m_staticText951;
- wxBitmapButton* m_bpButtonOpen;
- wxStaticText* m_staticText95;
- wxBitmapButton* m_bpButtonSave;
- wxStaticText* m_staticText961;
- wxBitmapButton* m_bpButtonSaveAs;
- wxBitmapButton* m_bpButtonSaveAsBatch;
- wxStaticText* m_staticText97;
- wxListBox* m_listBoxHistory;
- wxPanel* m_panelViewFilter;
- wxBoxSizer* bSizerViewFilter;
- wxStaticText* m_staticTextViewType;
- ToggleButton* m_bpButtonViewTypeSyncAction;
- ToggleButton* m_bpButtonShowExcluded;
- wxStaticText* m_staticTextSelectView;
- ToggleButton* m_bpButtonShowDeleteLeft;
- ToggleButton* m_bpButtonShowUpdateLeft;
- ToggleButton* m_bpButtonShowCreateLeft;
- ToggleButton* m_bpButtonShowLeftOnly;
- ToggleButton* m_bpButtonShowLeftNewer;
- ToggleButton* m_bpButtonShowEqual;
- ToggleButton* m_bpButtonShowDoNothing;
- ToggleButton* m_bpButtonShowDifferent;
- ToggleButton* m_bpButtonShowRightNewer;
- ToggleButton* m_bpButtonShowRightOnly;
- ToggleButton* m_bpButtonShowCreateRight;
- ToggleButton* m_bpButtonShowUpdateRight;
- ToggleButton* m_bpButtonShowDeleteRight;
- ToggleButton* m_bpButtonShowConflict;
- wxStaticText* m_staticText96;
- wxPanel* m_panelStatistics;
- wxBoxSizer* bSizer1801;
- wxStaticBitmap* m_bitmapDeleteLeft;
- wxStaticText* m_staticTextDeleteLeft;
- wxStaticBitmap* m_bitmapUpdateLeft;
- wxStaticText* m_staticTextUpdateLeft;
- wxStaticBitmap* m_bitmapCreateLeft;
- wxStaticText* m_staticTextCreateLeft;
- wxStaticBitmap* m_bitmapData;
- wxStaticText* m_staticTextData;
- wxStaticBitmap* m_bitmapCreateRight;
- wxStaticText* m_staticTextCreateRight;
- wxStaticBitmap* m_bitmapUpdateRight;
- wxStaticText* m_staticTextUpdateRight;
- wxStaticBitmap* m_bitmapDeleteRight;
- wxStaticText* m_staticTextDeleteRight;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnConfigNew( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnConfigLoad( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnConfigSave( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnConfigSaveAs( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSaveAsBatchJob( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuQuit( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCompare( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCmpSettings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuOptions( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuFindItem( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuResetLayout( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuExportFileList( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuCheckVersionAutomatically( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnMenuAbout( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCompSettingsContext( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnGlobalFilterContext( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncSettingsContext( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnTopFolderPairAdd( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnTopFolderPairRemove( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSwapSides( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHideSearchPanel( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSearchGridEnter( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ) { event.Skip(); }
- virtual void OnLoadFromHistory( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnLoadFromHistoryDoubleClick( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCfgHistoryRightClick( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnToggleViewType( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleViewButton( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnViewButtonRightClick( wxMouseEvent& event ) { event.Skip(); }
-
-
- public:
- wxPanel* m_panelTopLeft;
- wxBitmapButton* m_bpButtonRemovePair;
- FolderHistoryBox* m_directoryLeft;
- wxBitmapButton* m_bpButtonAltCompCfg;
- wxBitmapButton* m_bpButtonLocalFilter;
- wxBitmapButton* m_bpButtonAltSyncCfg;
- wxPanel* m_panelTopRight;
- FolderHistoryBox* m_directoryRight;
- wxBoxSizer* bSizerStatistics;
- wxBoxSizer* bSizerData;
-
- MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 900,600 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
-
- ~MainDialogGenerated();
-
+private:
+
+protected:
+ wxMenuBar* m_menubar1;
+ wxMenu* m_menuFile;
+ wxMenuItem* m_menuItemNew;
+ wxMenuItem* m_menuItemLoad;
+ wxMenuItem* m_menuItemSave;
+ wxMenuItem* m_menuItemSaveAs;
+ wxMenuItem* m_menuItemSaveAsBatch;
+ wxMenu* m_menu4;
+ wxMenuItem* m_menuItemCompare;
+ wxMenuItem* m_menuItemCompSettings;
+ wxMenuItem* m_menuItemFilter;
+ wxMenuItem* m_menuItemSyncSettings;
+ wxMenuItem* m_menuItemSynchronize;
+ wxMenu* m_menuTools;
+ wxMenuItem* m_menuItemOptions;
+ wxMenu* m_menuLanguages;
+ wxMenu* m_menuHelp;
+ wxMenuItem* m_menuItemHelp;
+ wxMenu* m_menuCheckVersion;
+ wxMenuItem* m_menuItemCheckVersionNow;
+ wxMenuItem* m_menuItemCheckVersionAuto;
+ wxMenuItem* m_menuItemAbout;
+ wxBoxSizer* bSizerPanelHolder;
+ wxPanel* m_panelTopButtons;
+ wxBoxSizer* bSizerTopButtons;
+ wxBitmapButton* m_bpButtonCmpConfig;
+ zen::BitmapTextButton* m_buttonCancel;
+ zen::BitmapTextButton* m_buttonCompare;
+ wxBitmapButton* m_bpButtonFilter;
+ wxBitmapButton* m_bpButtonSyncConfig;
+ zen::BitmapTextButton* m_buttonSync;
+ wxPanel* m_panelDirectoryPairs;
+ wxStaticText* m_staticTextResolvedPathL;
+ wxBitmapButton* m_bpButtonAddPair;
+ wxButton* m_buttonSelectDirLeft;
+ wxPanel* m_panelTopMiddle;
+ wxBitmapButton* m_bpButtonSwapSides;
+ wxStaticText* m_staticTextResolvedPathR;
+ wxButton* m_buttonSelectDirRight;
+ wxScrolledWindow* m_scrolledWindowFolderPairs;
+ wxBoxSizer* bSizerAddFolderPairs;
+ zen::Grid* m_gridNavi;
+ wxPanel* m_panelCenter;
+ zen::TripleSplitter* m_splitterMain;
+ zen::Grid* m_gridMainL;
+ zen::Grid* m_gridMainC;
+ zen::Grid* m_gridMainR;
+ wxPanel* m_panelStatusBar;
+ wxBoxSizer* bSizerFileStatus;
+ wxBoxSizer* bSizerStatusLeft;
+ wxBoxSizer* bSizerStatusLeftDirectories;
+ wxStaticBitmap* m_bitmapSmallDirectoryLeft;
+ wxStaticText* m_staticTextStatusLeftDirs;
+ wxBoxSizer* bSizerStatusLeftFiles;
+ wxStaticBitmap* m_bitmapSmallFileLeft;
+ wxStaticText* m_staticTextStatusLeftFiles;
+ wxStaticText* m_staticTextStatusLeftBytes;
+ wxStaticLine* m_staticline9;
+ wxStaticText* m_staticTextStatusMiddle;
+ wxBoxSizer* bSizerStatusRight;
+ wxStaticLine* m_staticline10;
+ wxBoxSizer* bSizerStatusRightDirectories;
+ wxStaticBitmap* m_bitmapSmallDirectoryRight;
+ wxStaticText* m_staticTextStatusRightDirs;
+ wxBoxSizer* bSizerStatusRightFiles;
+ wxStaticBitmap* m_bitmapSmallFileRight;
+ wxStaticText* m_staticTextStatusRightFiles;
+ wxStaticText* m_staticTextStatusRightBytes;
+ wxStaticText* m_staticTextFullStatus;
+ wxPanel* m_panelSearch;
+ wxBitmapButton* m_bpButtonHideSearch;
+ wxStaticText* m_staticText101;
+ wxTextCtrl* m_textCtrlSearchTxt;
+ wxCheckBox* m_checkBoxMatchCase;
+ wxPanel* m_panelConfig;
+ wxBoxSizer* bSizerConfig;
+ wxBitmapButton* m_bpButtonNew;
+ wxStaticText* m_staticText951;
+ wxBitmapButton* m_bpButtonOpen;
+ wxStaticText* m_staticText95;
+ wxBitmapButton* m_bpButtonSave;
+ wxStaticText* m_staticText961;
+ wxBitmapButton* m_bpButtonSaveAs;
+ wxBitmapButton* m_bpButtonSaveAsBatch;
+ wxStaticText* m_staticText97;
+ wxListBox* m_listBoxHistory;
+ wxPanel* m_panelViewFilter;
+ wxBoxSizer* bSizerViewFilter;
+ wxStaticText* m_staticTextViewType;
+ ToggleButton* m_bpButtonViewTypeSyncAction;
+ ToggleButton* m_bpButtonShowExcluded;
+ wxStaticText* m_staticTextSelectView;
+ ToggleButton* m_bpButtonShowDeleteLeft;
+ ToggleButton* m_bpButtonShowUpdateLeft;
+ ToggleButton* m_bpButtonShowCreateLeft;
+ ToggleButton* m_bpButtonShowLeftOnly;
+ ToggleButton* m_bpButtonShowLeftNewer;
+ ToggleButton* m_bpButtonShowEqual;
+ ToggleButton* m_bpButtonShowDoNothing;
+ ToggleButton* m_bpButtonShowDifferent;
+ ToggleButton* m_bpButtonShowRightNewer;
+ ToggleButton* m_bpButtonShowRightOnly;
+ ToggleButton* m_bpButtonShowCreateRight;
+ ToggleButton* m_bpButtonShowUpdateRight;
+ ToggleButton* m_bpButtonShowDeleteRight;
+ ToggleButton* m_bpButtonShowConflict;
+ wxStaticText* m_staticText96;
+ wxPanel* m_panelStatistics;
+ wxBoxSizer* bSizer1801;
+ wxStaticBitmap* m_bitmapDeleteLeft;
+ wxStaticText* m_staticTextDeleteLeft;
+ wxStaticBitmap* m_bitmapUpdateLeft;
+ wxStaticText* m_staticTextUpdateLeft;
+ wxStaticBitmap* m_bitmapCreateLeft;
+ wxStaticText* m_staticTextCreateLeft;
+ wxStaticBitmap* m_bitmapData;
+ wxStaticText* m_staticTextData;
+ wxStaticBitmap* m_bitmapCreateRight;
+ wxStaticText* m_staticTextCreateRight;
+ wxStaticBitmap* m_bitmapUpdateRight;
+ wxStaticText* m_staticTextUpdateRight;
+ wxStaticBitmap* m_bitmapDeleteRight;
+ wxStaticText* m_staticTextDeleteRight;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnConfigNew( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnConfigLoad( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnConfigSave( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnConfigSaveAs( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSaveAsBatchJob( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuQuit( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCompare( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCmpSettings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuOptions( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuFindItem( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuResetLayout( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuExportFileList( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuCheckVersionAutomatically( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnMenuAbout( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCompSettingsContext( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnGlobalFilterContext( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncSettingsContext( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnTopFolderPairAdd( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnTopFolderPairRemove( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSwapSides( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHideSearchPanel( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSearchGridEnter( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ) { event.Skip(); }
+ virtual void OnLoadFromHistory( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnLoadFromHistoryDoubleClick( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCfgHistoryRightClick( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnToggleViewType( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleViewButton( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnViewButtonRightClick( wxMouseEvent& event ) { event.Skip(); }
+
+
+public:
+ wxPanel* m_panelTopLeft;
+ wxBitmapButton* m_bpButtonRemovePair;
+ FolderHistoryBox* m_directoryLeft;
+ wxBitmapButton* m_bpButtonSelectSftpLeft;
+ wxBitmapButton* m_bpButtonAltCompCfg;
+ wxBitmapButton* m_bpButtonLocalFilter;
+ wxBitmapButton* m_bpButtonAltSyncCfg;
+ wxPanel* m_panelTopRight;
+ FolderHistoryBox* m_directoryRight;
+ wxBitmapButton* m_bpButtonSelectSftpRight;
+ wxBoxSizer* bSizerStatistics;
+ wxBoxSizer* bSizerData;
+
+ MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 900,600 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
+
+ ~MainDialogGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class ConfigDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class ConfigDlgGenerated : public wxDialog
+class ConfigDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxNotebook* m_notebook;
- wxPanel* m_panelCompSettingsHolder;
- wxBoxSizer* bSizerLocalCompSettings;
- wxCheckBox* m_checkBoxUseLocalCmpOptions;
- wxStaticLine* m_staticline59;
- wxPanel* m_panelComparisonSettings;
- wxStaticText* m_staticText91;
- wxStaticBitmap* m_bitmapByTime;
- wxToggleButton* m_toggleBtnTimeSize;
- wxStaticBitmap* m_bitmapByContent;
- wxToggleButton* m_toggleBtnContent;
- wxStaticLine* m_staticline42;
- wxTextCtrl* m_textCtrlCompVarDescription;
- wxStaticLine* m_staticline33;
- wxCheckBox* m_checkBoxTimeShift;
- wxSpinCtrl* m_spinCtrlTimeShift;
- wxHyperlinkCtrl* m_hyperlink241;
- wxStaticLine* m_staticline44;
- wxCheckBox* m_checkBoxSymlinksInclude;
- wxRadioButton* m_radioBtnSymlinksFollow;
- wxRadioButton* m_radioBtnSymlinksDirect;
- wxHyperlinkCtrl* m_hyperlink24;
- wxStaticLine* m_staticline441;
- wxStaticLine* m_staticline331;
- wxPanel* m_panelFilterSettingsHolder;
- wxBoxSizer* bSizerLocalFilterSettings;
- wxStaticText* m_staticText144;
- wxStaticLine* m_staticline61;
- wxPanel* m_panelFilterSettings;
- wxStaticBitmap* m_bitmapInclude;
- wxStaticText* m_staticText78;
- wxTextCtrl* m_textCtrlInclude;
- wxStaticLine* m_staticline22;
- wxStaticBitmap* m_bitmapExclude;
- wxStaticText* m_staticText77;
- wxHyperlinkCtrl* m_hyperlink171;
- wxTextCtrl* m_textCtrlExclude;
- wxStaticLine* m_staticline24;
- wxStaticBitmap* m_bitmapFilterDate;
- wxStaticText* m_staticText79;
- wxSpinCtrl* m_spinCtrlTimespan;
- wxChoice* m_choiceUnitTimespan;
- wxStaticLine* m_staticline23;
- wxStaticBitmap* m_bitmapFilterSize;
- wxStaticText* m_staticText80;
- wxStaticText* m_staticText101;
- wxSpinCtrl* m_spinCtrlMinSize;
- wxChoice* m_choiceUnitMinSize;
- wxStaticText* m_staticText102;
- wxSpinCtrl* m_spinCtrlMaxSize;
- wxChoice* m_choiceUnitMaxSize;
- wxStaticLine* m_staticline62;
- wxStaticText* m_staticText44;
- wxStaticLine* m_staticline46;
- wxButton* m_buttonClear;
- wxPanel* m_panelSyncSettingsHolder;
- wxBoxSizer* bSizerLocalSyncSettings;
- wxCheckBox* m_checkBoxUseLocalSyncOptions;
- wxStaticLine* m_staticline60;
- wxPanel* m_panelSyncSettings;
- wxStaticText* m_staticText86;
- wxToggleButton* m_toggleBtnTwoWay;
- wxToggleButton* m_toggleBtnMirror;
- wxToggleButton* m_toggleBtnUpdate;
- wxToggleButton* m_toggleBtnCustom;
- wxCheckBox* m_checkBoxDetectMove;
- wxStaticLine* m_staticline53;
- wxTextCtrl* m_textCtrlSyncVarDescription;
- wxStaticLine* m_staticline43;
- wxBoxSizer* bSizerSyncConfig;
- wxStaticText* m_staticText119;
- wxStaticText* m_staticText120;
- wxFlexGridSizer* fgSizerSyncDirections;
- wxStaticBitmap* m_bitmapLeftOnly;
- wxStaticBitmap* m_bitmapLeftNewer;
- wxStaticBitmap* m_bitmapDifferent;
- wxStaticBitmap* m_bitmapConflict;
- wxStaticBitmap* m_bitmapRightNewer;
- wxStaticBitmap* m_bitmapRightOnly;
- wxBitmapButton* m_bpButtonLeftOnly;
- wxBitmapButton* m_bpButtonLeftNewer;
- wxBitmapButton* m_bpButtonDifferent;
- wxBitmapButton* m_bpButtonConflict;
- wxBitmapButton* m_bpButtonRightNewer;
- wxBitmapButton* m_bpButtonRightOnly;
- wxStaticBitmap* m_bitmapDatabase;
- wxStaticLine* m_staticline54;
- wxStaticText* m_staticText87;
- wxRadioButton* m_radioBtnPermanent;
- wxRadioButton* m_radioBtnRecycler;
- wxRadioButton* m_radioBtnVersioning;
- wxBoxSizer* bSizerVersioning;
- wxBitmapButton* m_bpButtonDeletionType;
- wxPanel* m_panelVersioning;
- FolderHistoryBox* m_versioningFolder;
- wxButton* m_buttonSelectDirVersioning;
- wxBoxSizer* bSizer192;
- wxStaticText* m_staticText93;
- wxChoice* m_choiceVersioningStyle;
- wxStaticText* m_staticTextNamingCvtPart1;
- wxStaticText* m_staticTextNamingCvtPart2Bold;
- wxStaticText* m_staticTextNamingCvtPart3;
- wxHyperlinkCtrl* m_hyperlink17;
- wxBoxSizer* bSizerMiscConfig;
- wxStaticLine* m_staticline582;
- wxStaticText* m_staticText88;
- wxRadioButton* m_radioBtnIgnoreErrors;
- wxRadioButton* m_radioBtnPopupOnErrors;
- wxStaticLine* m_staticline57;
- wxBoxSizer* bSizerOnCompletion;
- wxStaticText* m_staticText89;
- OnCompletionBox* m_comboBoxOnCompletion;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnToggleLocalCompSettings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnContent( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnChangeCompOption( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpTimeShift( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnHelpComparisonSettings( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnChangeFilterOption( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnFilterReset( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleLocalSyncSettings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncTwoWayDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncTwoWay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleDetectMovedFiles( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnLeftNewer( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDifferent( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnConflict( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnRightNewer( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnExRightSideOnly( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDeletionPermanent( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDeletionRecycler( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDeletionVersioning( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleDeletionType( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnChangeSyncOption( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpVersioning( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- ConfigDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
- ~ConfigDlgGenerated();
-
+private:
+
+protected:
+ wxNotebook* m_notebook;
+ wxPanel* m_panelCompSettingsHolder;
+ wxBoxSizer* bSizerLocalCompSettings;
+ wxCheckBox* m_checkBoxUseLocalCmpOptions;
+ wxStaticLine* m_staticline59;
+ wxPanel* m_panelComparisonSettings;
+ wxStaticText* m_staticText91;
+ wxStaticBitmap* m_bitmapByTime;
+ wxToggleButton* m_toggleBtnTimeSize;
+ wxStaticBitmap* m_bitmapByContent;
+ wxToggleButton* m_toggleBtnContent;
+ wxStaticLine* m_staticline42;
+ wxTextCtrl* m_textCtrlCompVarDescription;
+ wxStaticLine* m_staticline33;
+ wxCheckBox* m_checkBoxTimeShift;
+ wxSpinCtrl* m_spinCtrlTimeShift;
+ wxHyperlinkCtrl* m_hyperlink241;
+ wxStaticLine* m_staticline44;
+ wxCheckBox* m_checkBoxSymlinksInclude;
+ wxRadioButton* m_radioBtnSymlinksFollow;
+ wxRadioButton* m_radioBtnSymlinksDirect;
+ wxHyperlinkCtrl* m_hyperlink24;
+ wxStaticLine* m_staticline441;
+ wxStaticLine* m_staticline331;
+ wxPanel* m_panelFilterSettingsHolder;
+ wxBoxSizer* bSizerLocalFilterSettings;
+ wxStaticText* m_staticText144;
+ wxStaticLine* m_staticline61;
+ wxPanel* m_panelFilterSettings;
+ wxStaticBitmap* m_bitmapInclude;
+ wxStaticText* m_staticText78;
+ wxTextCtrl* m_textCtrlInclude;
+ wxStaticLine* m_staticline22;
+ wxStaticBitmap* m_bitmapExclude;
+ wxStaticText* m_staticText77;
+ wxHyperlinkCtrl* m_hyperlink171;
+ wxTextCtrl* m_textCtrlExclude;
+ wxStaticLine* m_staticline24;
+ wxStaticBitmap* m_bitmapFilterDate;
+ wxStaticText* m_staticText79;
+ wxSpinCtrl* m_spinCtrlTimespan;
+ wxChoice* m_choiceUnitTimespan;
+ wxStaticLine* m_staticline23;
+ wxStaticBitmap* m_bitmapFilterSize;
+ wxStaticText* m_staticText80;
+ wxStaticText* m_staticText101;
+ wxSpinCtrl* m_spinCtrlMinSize;
+ wxChoice* m_choiceUnitMinSize;
+ wxStaticText* m_staticText102;
+ wxSpinCtrl* m_spinCtrlMaxSize;
+ wxChoice* m_choiceUnitMaxSize;
+ wxStaticLine* m_staticline62;
+ wxStaticText* m_staticText44;
+ wxStaticLine* m_staticline46;
+ wxButton* m_buttonClear;
+ wxPanel* m_panelSyncSettingsHolder;
+ wxBoxSizer* bSizerLocalSyncSettings;
+ wxCheckBox* m_checkBoxUseLocalSyncOptions;
+ wxStaticLine* m_staticline60;
+ wxPanel* m_panelSyncSettings;
+ wxStaticText* m_staticText86;
+ wxToggleButton* m_toggleBtnTwoWay;
+ wxToggleButton* m_toggleBtnMirror;
+ wxToggleButton* m_toggleBtnUpdate;
+ wxToggleButton* m_toggleBtnCustom;
+ wxCheckBox* m_checkBoxDetectMove;
+ wxStaticLine* m_staticline53;
+ wxTextCtrl* m_textCtrlSyncVarDescription;
+ wxStaticLine* m_staticline43;
+ wxBoxSizer* bSizerSyncConfig;
+ wxStaticText* m_staticText119;
+ wxStaticText* m_staticText120;
+ wxFlexGridSizer* fgSizerSyncDirections;
+ wxStaticBitmap* m_bitmapLeftOnly;
+ wxStaticBitmap* m_bitmapLeftNewer;
+ wxStaticBitmap* m_bitmapDifferent;
+ wxStaticBitmap* m_bitmapConflict;
+ wxStaticBitmap* m_bitmapRightNewer;
+ wxStaticBitmap* m_bitmapRightOnly;
+ wxBitmapButton* m_bpButtonLeftOnly;
+ wxBitmapButton* m_bpButtonLeftNewer;
+ wxBitmapButton* m_bpButtonDifferent;
+ wxBitmapButton* m_bpButtonConflict;
+ wxBitmapButton* m_bpButtonRightNewer;
+ wxBitmapButton* m_bpButtonRightOnly;
+ wxStaticBitmap* m_bitmapDatabase;
+ wxStaticLine* m_staticline54;
+ wxStaticText* m_staticText87;
+ wxRadioButton* m_radioBtnPermanent;
+ wxRadioButton* m_radioBtnRecycler;
+ wxRadioButton* m_radioBtnVersioning;
+ wxBoxSizer* bSizerVersioning;
+ wxBitmapButton* m_bpButtonDeletionType;
+ wxPanel* m_panelVersioning;
+ FolderHistoryBox* m_versioningFolder;
+ wxButton* m_buttonSelectDirVersioning;
+ wxBoxSizer* bSizer192;
+ wxStaticText* m_staticText93;
+ wxChoice* m_choiceVersioningStyle;
+ wxStaticText* m_staticTextNamingCvtPart1;
+ wxStaticText* m_staticTextNamingCvtPart2Bold;
+ wxStaticText* m_staticTextNamingCvtPart3;
+ wxHyperlinkCtrl* m_hyperlink17;
+ wxBoxSizer* bSizerMiscConfig;
+ wxStaticLine* m_staticline582;
+ wxStaticText* m_staticText88;
+ wxRadioButton* m_radioBtnIgnoreErrors;
+ wxRadioButton* m_radioBtnPopupOnErrors;
+ wxStaticLine* m_staticline57;
+ wxBoxSizer* bSizerOnCompletion;
+ wxStaticText* m_staticText89;
+ OnCompletionBox* m_comboBoxOnCompletion;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnToggleLocalCompSettings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnContent( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnChangeCompOption( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpTimeShift( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnHelpComparisonSettings( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnChangeFilterOption( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnFilterReset( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleLocalSyncSettings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncTwoWayDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncTwoWay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); }
+ virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleDetectMovedFiles( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnLeftNewer( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDifferent( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnConflict( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnRightNewer( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnExRightSideOnly( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDeletionPermanent( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDeletionRecycler( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDeletionVersioning( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleDeletionType( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnChangeSyncOption( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpVersioning( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+ wxBitmapButton* m_bpButtonSelectSftp;
+
+ ConfigDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
+ ~ConfigDlgGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class SftpSetupDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class SftpSetupDlgGenerated : public wxDialog
+{
+private:
+
+protected:
+ wxStaticBitmap* m_bitmapSftp;
+ wxStaticText* m_staticTextHeader;
+ wxStaticLine* m_staticline371;
+ wxPanel* m_panel41;
+ wxStaticText* m_staticText12311;
+ wxTextCtrl* m_textCtrlServer;
+ wxStaticText* m_staticText1381;
+ wxStaticText* m_staticText1382;
+ wxStaticText* m_staticText138;
+ wxStaticText* m_staticText123;
+ wxTextCtrl* m_textCtrlUserName;
+ wxStaticText* m_staticText1231;
+ wxTextCtrl* m_textCtrlPasswordVisible;
+ wxTextCtrl* m_textCtrlPasswordHidden;
+ wxCheckBox* m_checkBoxShowPassword;
+ wxStaticText* m_staticText1232;
+ wxTextCtrl* m_textCtrlServerPath;
+ wxStaticLine* m_staticline12;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnToggleShowPassword( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ SftpSetupDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("SSH File Transfer Protocol"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
+ ~SftpSetupDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class SyncConfirmationDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class SyncConfirmationDlgGenerated : public wxDialog
+class SyncConfirmationDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxStaticBitmap* m_bitmapSync;
- wxStaticText* m_staticTextHeader;
- wxStaticLine* m_staticline371;
- wxPanel* m_panelStatistics;
- wxStaticLine* m_staticline38;
- wxStaticText* m_staticText84;
- wxStaticText* m_staticTextVariant;
- wxStaticLine* m_staticline14;
- wxStaticText* m_staticText83;
- wxStaticBitmap* m_bitmapDeleteLeft;
- wxStaticBitmap* m_bitmapUpdateLeft;
- wxStaticBitmap* m_bitmapCreateLeft;
- wxStaticBitmap* m_bitmapData;
- wxStaticBitmap* m_bitmapCreateRight;
- wxStaticBitmap* m_bitmapUpdateRight;
- wxStaticBitmap* m_bitmapDeleteRight;
- wxStaticText* m_staticTextDeleteLeft;
- wxStaticText* m_staticTextUpdateLeft;
- wxStaticText* m_staticTextCreateLeft;
- wxStaticText* m_staticTextData;
- wxStaticText* m_staticTextCreateRight;
- wxStaticText* m_staticTextUpdateRight;
- wxStaticText* m_staticTextDeleteRight;
- wxStaticLine* m_staticline381;
- wxStaticLine* m_staticline12;
- wxCheckBox* m_checkBoxDontShowAgain;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonStartSync;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FreeFileSync"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~SyncConfirmationDlgGenerated();
-
+private:
+
+protected:
+ wxStaticBitmap* m_bitmapSync;
+ wxStaticText* m_staticTextHeader;
+ wxStaticLine* m_staticline371;
+ wxPanel* m_panelStatistics;
+ wxStaticLine* m_staticline38;
+ wxStaticText* m_staticText84;
+ wxStaticText* m_staticTextVariant;
+ wxStaticLine* m_staticline14;
+ wxStaticText* m_staticText83;
+ wxStaticBitmap* m_bitmapDeleteLeft;
+ wxStaticBitmap* m_bitmapUpdateLeft;
+ wxStaticBitmap* m_bitmapCreateLeft;
+ wxStaticBitmap* m_bitmapData;
+ wxStaticBitmap* m_bitmapCreateRight;
+ wxStaticBitmap* m_bitmapUpdateRight;
+ wxStaticBitmap* m_bitmapDeleteRight;
+ wxStaticText* m_staticTextDeleteLeft;
+ wxStaticText* m_staticTextUpdateLeft;
+ wxStaticText* m_staticTextCreateLeft;
+ wxStaticText* m_staticTextData;
+ wxStaticText* m_staticTextCreateRight;
+ wxStaticText* m_staticTextUpdateRight;
+ wxStaticText* m_staticTextDeleteRight;
+ wxStaticLine* m_staticline381;
+ wxStaticLine* m_staticline12;
+ wxCheckBox* m_checkBoxDontShowAgain;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonStartSync;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("FreeFileSync"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~SyncConfirmationDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class FolderPairPanelGenerated
///////////////////////////////////////////////////////////////////////////////
-class FolderPairPanelGenerated : public wxPanel
+class FolderPairPanelGenerated : public wxPanel
{
- private:
-
- protected:
- wxButton* m_buttonSelectDirLeft;
- wxButton* m_buttonSelectDirRight;
-
- public:
- wxPanel* m_panelLeft;
- wxBitmapButton* m_bpButtonFolderPairOptions;
- wxBitmapButton* m_bpButtonRemovePair;
- FolderHistoryBox* m_directoryLeft;
- wxPanel* m_panel20;
- wxBitmapButton* m_bpButtonAltCompCfg;
- wxBitmapButton* m_bpButtonLocalFilter;
- wxBitmapButton* m_bpButtonAltSyncCfg;
- wxPanel* m_panelRight;
- FolderHistoryBox* m_directoryRight;
-
- FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 );
- ~FolderPairPanelGenerated();
-
+private:
+
+protected:
+ wxButton* m_buttonSelectDirLeft;
+ wxButton* m_buttonSelectDirRight;
+
+public:
+ wxPanel* m_panelLeft;
+ wxBitmapButton* m_bpButtonFolderPairOptions;
+ wxBitmapButton* m_bpButtonRemovePair;
+ FolderHistoryBox* m_directoryLeft;
+ wxBitmapButton* m_bpButtonSelectSftpLeft;
+ wxPanel* m_panel20;
+ wxBitmapButton* m_bpButtonAltCompCfg;
+ wxBitmapButton* m_bpButtonLocalFilter;
+ wxBitmapButton* m_bpButtonAltSyncCfg;
+ wxPanel* m_panelRight;
+ FolderHistoryBox* m_directoryRight;
+ wxBitmapButton* m_bpButtonSelectSftpRight;
+
+ FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 );
+ ~FolderPairPanelGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class CompareProgressDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class CompareProgressDlgGenerated : public wxPanel
+class CompareProgressDlgGenerated : public wxPanel
{
- private:
-
- protected:
- wxPanel* m_panelStatistics;
- wxStaticText* m_staticTextItemsFoundLabel;
- wxStaticText* m_staticTextItemsFound;
- wxStaticText* m_staticTextItemsRemainingLabel;
- wxBoxSizer* bSizerItemsRemaining;
- wxStaticText* m_staticTextItemsRemaining;
- wxStaticText* m_staticTextDataRemaining;
- wxStaticText* m_staticTextTimeRemainingLabel;
- wxStaticText* m_staticTextTimeRemaining;
- wxStaticText* m_staticTextTimeElapsed;
- wxStaticText* m_staticTextStatus;
- wxGauge* m_gauge2;
- wxStaticText* m_staticTextSpeed;
-
- public:
-
- CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxRAISED_BORDER );
- ~CompareProgressDlgGenerated();
-
+private:
+
+protected:
+ wxPanel* m_panelStatistics;
+ wxStaticText* m_staticTextItemsFoundLabel;
+ wxStaticText* m_staticTextItemsFound;
+ wxStaticText* m_staticTextItemsRemainingLabel;
+ wxBoxSizer* bSizerItemsRemaining;
+ wxStaticText* m_staticTextItemsRemaining;
+ wxStaticText* m_staticTextDataRemaining;
+ wxStaticText* m_staticTextTimeRemainingLabel;
+ wxStaticText* m_staticTextTimeRemaining;
+ wxStaticText* m_staticTextTimeElapsed;
+ wxStaticText* m_staticTextStatus;
+ wxGauge* m_gauge2;
+ wxStaticText* m_staticTextSpeed;
+
+public:
+
+ CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxRAISED_BORDER );
+ ~CompareProgressDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class SyncProgressPanelGenerated
///////////////////////////////////////////////////////////////////////////////
-class SyncProgressPanelGenerated : public wxPanel
+class SyncProgressPanelGenerated : public wxPanel
{
- private:
-
- protected:
- wxBoxSizer* bSizer42;
- wxBoxSizer* bSizer171;
- wxStaticText* m_staticText87;
-
- public:
- wxBoxSizer* bSizerRoot;
- wxStaticBitmap* m_bitmapStatus;
- wxStaticText* m_staticTextPhase;
- wxAnimationCtrl* m_animCtrlSyncing;
- wxBitmapButton* m_bpButtonMinimizeToTray;
- wxBoxSizer* bSizerStatusText;
- wxStaticText* m_staticTextStatus;
- wxPanel* m_panelProgress;
- wxPanel* m_panelItemsProcessed;
- wxStaticText* m_staticTextProcessedObj;
- wxStaticText* m_staticTextDataProcessed;
- wxPanel* m_panelItemsRemaining;
- wxStaticText* m_staticTextRemainingObj;
- wxStaticText* m_staticTextDataRemaining;
- wxPanel* m_panelTimeRemaining;
- wxStaticText* m_staticTextRemTime;
- wxStaticText* m_staticTextTimeElapsed;
- wxStaticBitmap* m_bitmapGraphKeyBytes;
- zen::Graph2D* m_panelGraphBytes;
- wxStaticBitmap* m_bitmapGraphKeyItems;
- zen::Graph2D* m_panelGraphItems;
- wxNotebook* m_notebookResult;
- wxStaticLine* m_staticlineFooter;
- wxBoxSizer* bSizerStdButtons;
- wxBoxSizer* bSizerOnCompletion;
- OnCompletionBox* m_comboBoxOnCompletion;
- wxButton* m_buttonClose;
- wxButton* m_buttonPause;
- wxButton* m_buttonStop;
-
- SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
- ~SyncProgressPanelGenerated();
-
+private:
+
+protected:
+ wxBoxSizer* bSizer42;
+ wxBoxSizer* bSizer171;
+ wxStaticText* m_staticText87;
+
+public:
+ wxBoxSizer* bSizerRoot;
+ wxStaticBitmap* m_bitmapStatus;
+ wxStaticText* m_staticTextPhase;
+ wxAnimationCtrl* m_animCtrlSyncing;
+ wxBitmapButton* m_bpButtonMinimizeToTray;
+ wxBoxSizer* bSizerStatusText;
+ wxStaticText* m_staticTextStatus;
+ wxPanel* m_panelProgress;
+ wxPanel* m_panelItemsProcessed;
+ wxStaticText* m_staticTextProcessedObj;
+ wxStaticText* m_staticTextDataProcessed;
+ wxPanel* m_panelItemsRemaining;
+ wxStaticText* m_staticTextRemainingObj;
+ wxStaticText* m_staticTextDataRemaining;
+ wxPanel* m_panelTimeRemaining;
+ wxStaticText* m_staticTextRemTime;
+ wxStaticText* m_staticTextTimeElapsed;
+ wxStaticBitmap* m_bitmapGraphKeyBytes;
+ zen::Graph2D* m_panelGraphBytes;
+ wxStaticBitmap* m_bitmapGraphKeyItems;
+ zen::Graph2D* m_panelGraphItems;
+ wxNotebook* m_notebookResult;
+ wxStaticLine* m_staticlineFooter;
+ wxBoxSizer* bSizerStdButtons;
+ wxBoxSizer* bSizerOnCompletion;
+ OnCompletionBox* m_comboBoxOnCompletion;
+ wxButton* m_buttonClose;
+ wxButton* m_buttonPause;
+ wxButton* m_buttonStop;
+
+ SyncProgressPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
+ ~SyncProgressPanelGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class LogPanelGenerated
///////////////////////////////////////////////////////////////////////////////
-class LogPanelGenerated : public wxPanel
+class LogPanelGenerated : public wxPanel
{
- private:
-
- protected:
- ToggleButton* m_bpButtonErrors;
- ToggleButton* m_bpButtonWarnings;
- ToggleButton* m_bpButtonInfo;
- wxStaticLine* m_staticline13;
- zen::Grid* m_gridMessages;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnErrors( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnWarnings( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnInfo( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- LogPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL );
- ~LogPanelGenerated();
-
+private:
+
+protected:
+ ToggleButton* m_bpButtonErrors;
+ ToggleButton* m_bpButtonWarnings;
+ ToggleButton* m_bpButtonInfo;
+ wxStaticLine* m_staticline13;
+ zen::Grid* m_gridMessages;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnErrors( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnWarnings( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnInfo( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ LogPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL );
+ ~LogPanelGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class BatchDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class BatchDlgGenerated : public wxDialog
+class BatchDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxStaticBitmap* m_bitmapBatchJob;
- wxStaticText* m_staticTextDescr;
- wxStaticLine* m_staticline18;
- wxPanel* m_panel35;
- wxStaticText* m_staticText82;
- wxRadioButton* m_radioBtnIgnoreErrors;
- wxRadioButton* m_radioBtnPopupOnErrors;
- wxRadioButton* m_radioBtnStopOnError;
- wxStaticLine* m_staticline26;
- wxCheckBox* m_checkBoxRunMinimized;
- wxStaticText* m_staticText81;
- OnCompletionBox* m_comboBoxOnCompletion;
- wxStaticLine* m_staticline25;
- wxCheckBox* m_checkBoxGenerateLogfile;
- wxPanel* m_panelLogfile;
- wxButton* m_buttonSelectLogfileDir;
- wxCheckBox* m_checkBoxLogfilesLimit;
- wxSpinCtrl* m_spinCtrlLogfileLimit;
- wxHyperlinkCtrl* m_hyperlink17;
- wxStaticLine* m_staticline13;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonSaveAs;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnErrorStop( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleGenerateLogfile( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpScheduleBatch( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
- FolderHistoryBox* m_logfileDir;
-
- BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Save as Batch Job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
- ~BatchDlgGenerated();
-
+private:
+
+protected:
+ wxStaticBitmap* m_bitmapBatchJob;
+ wxStaticText* m_staticTextDescr;
+ wxStaticLine* m_staticline18;
+ wxPanel* m_panel35;
+ wxStaticText* m_staticText82;
+ wxRadioButton* m_radioBtnIgnoreErrors;
+ wxRadioButton* m_radioBtnPopupOnErrors;
+ wxRadioButton* m_radioBtnStopOnError;
+ wxStaticLine* m_staticline26;
+ wxCheckBox* m_checkBoxRunMinimized;
+ wxStaticText* m_staticText81;
+ OnCompletionBox* m_comboBoxOnCompletion;
+ wxStaticLine* m_staticline25;
+ wxCheckBox* m_checkBoxGenerateLogfile;
+ wxPanel* m_panelLogfile;
+ wxButton* m_buttonSelectLogfileDir;
+ wxCheckBox* m_checkBoxLogfilesLimit;
+ wxSpinCtrl* m_spinCtrlLogfileLimit;
+ wxHyperlinkCtrl* m_hyperlink17;
+ wxStaticLine* m_staticline13;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonSaveAs;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnErrorStop( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleGenerateLogfile( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpScheduleBatch( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+ FolderHistoryBox* m_logfileDir;
+ wxBitmapButton* m_bpButtonSelectSftp;
+
+ BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Save as Batch Job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
+ ~BatchDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class DeleteDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class DeleteDlgGenerated : public wxDialog
+class DeleteDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxStaticBitmap* m_bitmapDeleteType;
- wxStaticText* m_staticTextHeader;
- wxStaticLine* m_staticline91;
- wxPanel* m_panel31;
- wxStaticLine* m_staticline42;
- wxTextCtrl* m_textCtrlFileList;
- wxStaticLine* m_staticline9;
- wxBoxSizer* bSizerStdButtons;
- wxCheckBox* m_checkBoxUseRecycler;
- wxButton* m_buttonOK;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Delete Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
- ~DeleteDlgGenerated();
-
+private:
+
+protected:
+ wxStaticBitmap* m_bitmapDeleteType;
+ wxStaticText* m_staticTextHeader;
+ wxStaticLine* m_staticline91;
+ wxPanel* m_panel31;
+ wxStaticLine* m_staticline42;
+ wxTextCtrl* m_textCtrlFileList;
+ wxStaticLine* m_staticline9;
+ wxBoxSizer* bSizerStdButtons;
+ wxCheckBox* m_checkBoxUseRecycler;
+ wxButton* m_buttonOK;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Delete Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
+ ~DeleteDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class OptionsDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class OptionsDlgGenerated : public wxDialog
+class OptionsDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxStaticBitmap* m_bitmapSettings;
- wxStaticText* m_staticText44;
- wxStaticLine* m_staticline20;
- wxPanel* m_panel39;
- wxCheckBox* m_checkBoxFailSafe;
- wxStaticText* m_staticText91;
- wxBoxSizer* bSizerLockedFiles;
- wxCheckBox* m_checkBoxCopyLocked;
- wxStaticText* m_staticText92;
- wxCheckBox* m_checkBoxCopyPermissions;
- wxStaticText* m_staticText93;
- wxStaticLine* m_staticline39;
- wxStaticText* m_staticText95;
- wxStaticText* m_staticText96;
- wxSpinCtrl* m_spinCtrlAutoRetryCount;
- wxStaticText* m_staticTextAutoRetryDelay;
- wxSpinCtrl* m_spinCtrlAutoRetryDelay;
- wxStaticLine* m_staticline191;
- wxStaticText* m_staticText85;
- wxGrid* m_gridCustomCommand;
- wxBitmapButton* m_bpButtonAddRow;
- wxBitmapButton* m_bpButtonRemoveRow;
- wxHyperlinkCtrl* m_hyperlink17;
- wxStaticLine* m_staticline192;
- zen::BitmapTextButton* m_buttonResetDialogs;
- wxStaticLine* m_staticline40;
- wxStaticLine* m_staticline36;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonDefault;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnToggleAutoRetryCount( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnAddRow( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
- virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- OptionsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
- ~OptionsDlgGenerated();
-
+private:
+
+protected:
+ wxStaticBitmap* m_bitmapSettings;
+ wxStaticText* m_staticText44;
+ wxStaticLine* m_staticline20;
+ wxPanel* m_panel39;
+ wxCheckBox* m_checkBoxFailSafe;
+ wxStaticText* m_staticText91;
+ wxBoxSizer* bSizerLockedFiles;
+ wxCheckBox* m_checkBoxCopyLocked;
+ wxStaticText* m_staticText92;
+ wxCheckBox* m_checkBoxCopyPermissions;
+ wxStaticText* m_staticText93;
+ wxStaticLine* m_staticline39;
+ wxStaticText* m_staticText95;
+ wxStaticText* m_staticText96;
+ wxSpinCtrl* m_spinCtrlAutoRetryCount;
+ wxStaticText* m_staticTextAutoRetryDelay;
+ wxSpinCtrl* m_spinCtrlAutoRetryDelay;
+ wxStaticLine* m_staticline191;
+ wxStaticText* m_staticText85;
+ wxGrid* m_gridCustomCommand;
+ wxBitmapButton* m_bpButtonAddRow;
+ wxBitmapButton* m_bpButtonRemoveRow;
+ wxHyperlinkCtrl* m_hyperlink17;
+ wxStaticLine* m_staticline192;
+ zen::BitmapTextButton* m_buttonResetDialogs;
+ wxStaticLine* m_staticline40;
+ wxStaticLine* m_staticline36;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonDefault;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnToggleAutoRetryCount( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnAddRow( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnHelpShowExamples( wxHyperlinkEvent& event ) { event.Skip(); }
+ virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ OptionsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Options"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER );
+ ~OptionsDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class TooltipDialogGenerated
///////////////////////////////////////////////////////////////////////////////
-class TooltipDialogGenerated : public wxDialog
+class TooltipDialogGenerated : public wxDialog
{
- private:
-
- protected:
-
- public:
- wxStaticBitmap* m_bitmapLeft;
- wxStaticText* m_staticTextMain;
-
- TooltipDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~TooltipDialogGenerated();
-
+private:
+
+protected:
+
+public:
+ wxStaticBitmap* m_bitmapLeft;
+ wxStaticText* m_staticTextMain;
+
+ TooltipDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~TooltipDialogGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class SelectTimespanDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class SelectTimespanDlgGenerated : public wxDialog
+class SelectTimespanDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxPanel* m_panel35;
- wxCalendarCtrl* m_calendarFrom;
- wxCalendarCtrl* m_calendarTo;
- wxStaticLine* m_staticline21;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonOkay;
- wxButton* m_buttonCancel;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnChangeSelectionFrom( wxCalendarEvent& event ) { event.Skip(); }
- virtual void OnChangeSelectionTo( wxCalendarEvent& event ) { event.Skip(); }
- virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Time Span"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~SelectTimespanDlgGenerated();
-
+private:
+
+protected:
+ wxPanel* m_panel35;
+ wxCalendarCtrl* m_calendarFrom;
+ wxCalendarCtrl* m_calendarTo;
+ wxStaticLine* m_staticline21;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonOkay;
+ wxButton* m_buttonCancel;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnChangeSelectionFrom( wxCalendarEvent& event ) { event.Skip(); }
+ virtual void OnChangeSelectionTo( wxCalendarEvent& event ) { event.Skip(); }
+ virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select Time Span"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~SelectTimespanDlgGenerated();
+
};
///////////////////////////////////////////////////////////////////////////////
/// Class AboutDlgGenerated
///////////////////////////////////////////////////////////////////////////////
-class AboutDlgGenerated : public wxDialog
+class AboutDlgGenerated : public wxDialog
{
- private:
-
- protected:
- wxPanel* m_panel41;
- wxStaticBitmap* m_bitmapLogo;
- wxStaticLine* m_staticline341;
- wxStaticText* m_staticText96;
- wxHyperlinkCtrl* m_hyperlink11;
- wxHyperlinkCtrl* m_hyperlink9;
- wxHyperlinkCtrl* m_hyperlink10;
- wxHyperlinkCtrl* m_hyperlink7;
- wxHyperlinkCtrl* m_hyperlink14;
- wxHyperlinkCtrl* m_hyperlink15;
- wxHyperlinkCtrl* m_hyperlink13;
- wxHyperlinkCtrl* m_hyperlink16;
- wxHyperlinkCtrl* m_hyperlink12;
- wxHyperlinkCtrl* m_hyperlink18;
- wxPanel* m_panelDonate;
- wxPanel* m_panel39;
- wxStaticBitmap* m_bitmapDonate;
- wxStaticText* m_staticText83;
- wxButton* m_buttonDonate;
- wxStaticText* m_staticText94;
- wxStaticBitmap* m_bitmapHomepage;
- wxHyperlinkCtrl* m_hyperlink1;
- wxStaticBitmap* m_bitmapEmail;
- wxHyperlinkCtrl* m_hyperlink2;
- wxStaticLine* m_staticline34;
- wxStaticText* m_staticText93;
- wxStaticBitmap* m_bitmapGpl;
- wxHyperlinkCtrl* m_hyperlink5;
- wxStaticLine* m_staticline37;
- wxStaticText* m_staticText54;
- wxScrolledWindow* m_scrolledWindowTranslators;
- wxFlexGridSizer* fgSizerTranslators;
- wxStaticLine* m_staticline36;
- wxBoxSizer* bSizerStdButtons;
- wxButton* m_buttonClose;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnDonate( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
-
-
- public:
-
- AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
- ~AboutDlgGenerated();
-
+private:
+
+protected:
+ wxPanel* m_panel41;
+ wxStaticBitmap* m_bitmapLogo;
+ wxStaticLine* m_staticline341;
+ wxStaticText* m_staticText96;
+ wxHyperlinkCtrl* m_hyperlink11;
+ wxHyperlinkCtrl* m_hyperlink9;
+ wxHyperlinkCtrl* m_hyperlink10;
+ wxHyperlinkCtrl* m_hyperlink7;
+ wxHyperlinkCtrl* m_hyperlink14;
+ wxHyperlinkCtrl* m_hyperlink15;
+ wxHyperlinkCtrl* m_hyperlink13;
+ wxHyperlinkCtrl* m_hyperlink16;
+ wxHyperlinkCtrl* m_hyperlink12;
+ wxHyperlinkCtrl* m_hyperlink18;
+ wxPanel* m_panelDonate;
+ wxPanel* m_panel39;
+ wxStaticBitmap* m_bitmapDonate;
+ wxStaticText* m_staticText83;
+ wxButton* m_buttonDonate;
+ wxStaticText* m_staticText94;
+ wxStaticBitmap* m_bitmapHomepage;
+ wxHyperlinkCtrl* m_hyperlink1;
+ wxStaticBitmap* m_bitmapEmail;
+ wxHyperlinkCtrl* m_hyperlink2;
+ wxStaticLine* m_staticline34;
+ wxStaticText* m_staticText93;
+ wxStaticBitmap* m_bitmapGpl;
+ wxHyperlinkCtrl* m_hyperlink5;
+ wxStaticLine* m_staticline37;
+ wxStaticText* m_staticText54;
+ wxScrolledWindow* m_scrolledWindowTranslators;
+ wxFlexGridSizer* fgSizerTranslators;
+ wxStaticLine* m_staticline36;
+ wxBoxSizer* bSizerStdButtons;
+ wxButton* m_buttonClose;
+
+ // Virtual event handlers, overide them in your derived class
+ virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
+ virtual void OnDonate( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnOK( wxCommandEvent& event ) { event.Skip(); }
+
+
+public:
+
+ AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ ~AboutDlgGenerated();
+
};
#endif //__GUI_GENERATED_H__
diff --git a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp
index f8fa0701..fcaeff50 100644
--- a/FreeFileSync/Source/ui/gui_status_handler.cpp
+++ b/FreeFileSync/Source/ui/gui_status_handler.cpp
@@ -321,7 +321,7 @@ SyncStatusHandler::~SyncStatusHandler()
//----------------- write results into LastSyncs.log------------------------
try
{
- saveToLastSyncsLog(summary, errorLog, lastSyncsLogFileSizeMax_, OnUpdateLogfileStatusNoThrow(*this, getLastSyncsLogfilePath())); //throw FileError
+ saveToLastSyncsLog(summary, errorLog, lastSyncsLogFileSizeMax_, OnUpdateLogfileStatusNoThrow(*this, utfCvrtTo<std::wstring>(getLastSyncsLogfilePath()))); //throw FileError
}
catch (FileError&) { assert(false); }
@@ -348,7 +348,7 @@ SyncStatusHandler::~SyncStatusHandler()
while (progressDlg)
{
wxTheApp->Yield(); //*first* refresh GUI (removing flicker) before sleeping!
- boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(UI_UPDATE_INTERVAL)); //throw boost::thread_interrupted -> not expected => main thread!
}
}
}
@@ -394,7 +394,7 @@ ProcessCallback::Response SyncStatusHandler::reportError(const std::wstring& err
{
reportStatus(_("Error") + L": " + _P("Automatic retry in 1 second...", "Automatic retry in %x seconds...",
(1000 * automaticRetryDelay_ - i * UI_UPDATE_INTERVAL + 999) / 1000)); //integer round up
- boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(UI_UPDATE_INTERVAL)); //throw boost::thread_interrupted
}
return ProcessCallback::RETRY;
}
diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp
index 8400638c..2a08c3f8 100644
--- a/FreeFileSync/Source/ui/main_dlg.cpp
+++ b/FreeFileSync/Source/ui/main_dlg.cpp
@@ -39,7 +39,7 @@
#include "../algorithm.h"
#include "../fs/concrete.h"
#ifdef ZEN_WIN_VISTA_AND_LATER
-#include "../fs/mtp.h"
+ #include "../fs/mtp.h"
#endif
#include "../lib/resolve_path.h"
#include "../lib/ffs_paths.h"
@@ -98,13 +98,14 @@ bool isComponentOf(const wxWindow* child, const wxWindow* top)
class FolderSelectorImpl : public FolderSelector
{
public:
- FolderSelectorImpl(MainDialog& mainDlg,
- wxPanel& dropWindow1,
- wxButton& dirSelectButton,
+ FolderSelectorImpl(MainDialog& mainDlg,
+ wxPanel& dropWindow1,
+ wxButton& selectFolderButton,
+ wxButton& selectSftpButton,
FolderHistoryBox& dirpath,
wxStaticText* staticText = nullptr,
wxWindow* dropWindow2 = nullptr) :
- FolderSelector(dropWindow1, dirSelectButton, dirpath, staticText, dropWindow2),
+ FolderSelector(dropWindow1, selectFolderButton, selectSftpButton, dirpath, staticText, dropWindow2),
mainDlg_(mainDlg) {}
bool canSetDroppedShellPaths(const std::vector<Zstring>& shellItemPaths) override
@@ -188,8 +189,8 @@ public:
FolderPairPanel(wxWindow* parent, MainDialog& mainDialog) :
FolderPairPanelGenerated(parent),
FolderPairCallback<FolderPairPanelGenerated>(static_cast<FolderPairPanelGenerated&>(*this), mainDialog), //pass FolderPairPanelGenerated part...
- dirpathLeft (mainDialog, *m_panelLeft, *m_buttonSelectDirLeft, *m_directoryLeft),
- dirpathRight(mainDialog, *m_panelRight, *m_buttonSelectDirRight, *m_directoryRight)
+ dirpathLeft (mainDialog, *m_panelLeft, *m_buttonSelectDirLeft, *m_bpButtonSelectSftpLeft, *m_directoryLeft),
+ dirpathRight(mainDialog, *m_panelRight, *m_buttonSelectDirRight, *m_bpButtonSelectSftpRight, *m_directoryRight)
{
dirpathLeft .Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::onDirSelected), nullptr, &mainDialog);
dirpathRight.Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::onDirSelected), nullptr, &mainDialog);
@@ -229,12 +230,14 @@ public:
dirpathLeft(mainDialog,
*mainDialog.m_panelTopLeft,
*mainDialog.m_buttonSelectDirLeft,
+ *mainDialog.m_bpButtonSelectSftpLeft,
*mainDialog.m_directoryLeft,
mainDialog.m_staticTextResolvedPathL,
&mainDialog.m_gridMainL->getMainWin()),
dirpathRight(mainDialog,
*mainDialog.m_panelTopRight,
*mainDialog.m_buttonSelectDirRight,
+ *mainDialog.m_bpButtonSelectSftpRight,
*mainDialog.m_directoryRight,
mainDialog.m_staticTextResolvedPathR,
&mainDialog.m_gridMainR->getMainWin())
@@ -401,7 +404,7 @@ void MainDialog::create(const Zstring& globalConfigFile)
firstMissingDir.addJob([filepath] { return filepath.empty() /*ever empty??*/ || !fileExists(filepath) ? make_unique<FalseType>() : nullptr; });
//potentially slow network access: give all checks 500ms to finish
- const bool allFilesExist = firstMissingDir.timedWait(boost::posix_time::milliseconds(500)) && //false: time elapsed
+ const bool allFilesExist = firstMissingDir.timedWait(boost::chrono::milliseconds(500)) && //false: time elapsed
!firstMissingDir.get(); //no missing
if (!allFilesExist)
filepaths.clear(); //we do NOT want to show an error due to last config file missing on application start!
@@ -784,6 +787,8 @@ MainDialog::MainDialog(const Zstring& globalConfigFile,
//=> yet another piece of "high-quality" code from wxWidgets making a dev's life "easy"...
}
+ m_buttonCompare->SetFocus();
+
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//some convenience: if FFS is started with a *.ffs_gui file as commandline parameter AND all directories contained exist, comparison shall be started right away
if (startComparison)
@@ -791,28 +796,27 @@ MainDialog::MainDialog(const Zstring& globalConfigFile,
const zen::MainConfiguration currMainCfg = getConfig().mainCfg;
//------------------------------------------------------------------------------------------
- //check existence of all directories in parallel!
- GetFirstResult<FalseType> firstMissingDir;
-
//harmonize checks with comparison.cpp:: checkForIncompleteInput()
//we're really doing two checks: 1. check directory existence 2. check config validity -> don't mix them!
bool havePartialPair = false;
bool haveFullPair = false;
+ std::vector<std::function<bool()>> asyncDirChecks;
+
auto addDirCheck = [&](const FolderPairEnh& fp)
{
- const Zstring dirLeft = getResolvedDisplayPath(fp.dirpathPhraseLeft ); //should not block!?
- const Zstring dirRight = getResolvedDisplayPath(fp.dirpathPhraseRight); //
+ std::unique_ptr<ABF> abfL = createAbstractBaseFolder(fp.dirpathPhraseLeft);
+ std::unique_ptr<ABF> abfR = createAbstractBaseFolder(fp.dirpathPhraseRight);
- if (dirLeft.empty() != dirRight.empty()) //only skip check if both sides are empty!
+ if (abfL->emptyBaseFolderPath() != abfR->emptyBaseFolderPath()) //only skip check if both sides are empty!
havePartialPair = true;
- else if (!dirLeft.empty())
+ else if (!abfL->emptyBaseFolderPath())
haveFullPair = true;
- if (!dirLeft.empty())
- firstMissingDir.addJob([=] { return !dirExists(dirLeft ) ? make_unique<FalseType>() : nullptr; });
- if (!dirRight.empty())
- firstMissingDir.addJob([=] { return !dirExists(dirRight) ? make_unique<FalseType>() : nullptr; });
+ if (!abfL->emptyBaseFolderPath())
+ asyncDirChecks.push_back(ABF::getAsyncCheckDirExists(abfL->getAbstractPath())); //noexcept
+ if (!abfR->emptyBaseFolderPath())
+ asyncDirChecks.push_back(ABF::getAsyncCheckDirExists(abfR->getAbstractPath())); //noexcept
};
addDirCheck(currMainCfg.firstPair);
@@ -821,7 +825,21 @@ MainDialog::MainDialog(const Zstring& globalConfigFile,
if (havePartialPair != haveFullPair) //either all pairs full or all half-filled -> validity check!
{
- const bool startComparisonNow = !firstMissingDir.timedWait(boost::posix_time::milliseconds(500)) || //= no result yet => start comparison anyway!
+ //check existence of all directories in parallel!
+ GetFirstResult<FalseType> firstMissingDir;
+ for (const std::function<bool()>& dirExists : asyncDirChecks)
+ firstMissingDir.addJob([dirExists]() -> std::unique_ptr<FalseType>
+ {
+ try
+ {
+ if (dirExists()) //throw FileError
+ return nullptr;
+ }
+ catch (FileError&) {}
+ return make_unique<FalseType>();
+ });
+
+ const bool startComparisonNow = !firstMissingDir.timedWait(boost::chrono::milliseconds(500)) || //= no result yet => start comparison anyway!
!firstMissingDir.get(); //= all directories exist
if (startComparisonNow)
@@ -1421,11 +1439,11 @@ void MainDialog::openExternalApplication(const wxString& commandline, const std:
shellExecute(fallbackFolderPidl.get(), ABF::getDisplayPath(fallbackFolderPath), EXEC_TYPE_ASYNC); //throw FileError
else
#endif
- shellExecute(L"\"" + ABF::getDisplayPath(fallbackFolderPath) + L"\"", EXEC_TYPE_ASYNC); //throw FileError
+ shellExecute(L"\"" + toZ(ABF::getDisplayPath(fallbackFolderPath)) + L"\"", EXEC_TYPE_ASYNC); //throw FileError
#elif defined ZEN_LINUX
- shellExecute("xdg-open \"" + ABF::getDisplayPath(fallbackFolderPath) + "\"", EXEC_TYPE_ASYNC); //
+ shellExecute("xdg-open \"" + toZ(ABF::getDisplayPath(fallbackFolderPath)) + "\"", EXEC_TYPE_ASYNC); //
#elif defined ZEN_MAC
- shellExecute("open \"" + ABF::getDisplayPath(fallbackFolderPath) + "\"", EXEC_TYPE_ASYNC); //
+ shellExecute("open \"" + toZ(ABF::getDisplayPath(fallbackFolderPath)) + "\"", EXEC_TYPE_ASYNC); //
#endif
}
catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); }
@@ -1459,11 +1477,11 @@ void MainDialog::openExternalApplication(const wxString& commandline, const std:
for (const FileSystemObject* fsObj : selectionTmp) //context menu calls this function only if selection is not empty!
{
const Zstring& relPath = fsObj->getPairRelativePath();
- Zstring path1 = ABF::getDisplayPath(fsObj->getABF<LEFT_SIDE>().getAbstractPath(relPath)); //full path, even if item is not existing!
- Zstring dir1 = ABF::getDisplayPath(fsObj->getABF<LEFT_SIDE>().getAbstractPath(beforeLast(relPath, FILE_NAME_SEPARATOR))); //returns empty string if term not found
+ Zstring path1 = toZ(ABF::getDisplayPath(fsObj->getABF<LEFT_SIDE>().getAbstractPath(relPath))); //full path, even if item is not existing!
+ Zstring dir1 = toZ(ABF::getDisplayPath(fsObj->getABF<LEFT_SIDE>().getAbstractPath(beforeLast(relPath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE))));
- Zstring path2 = ABF::getDisplayPath(fsObj->getABF<RIGHT_SIDE>().getAbstractPath(relPath));
- Zstring dir2 = ABF::getDisplayPath(fsObj->getABF<RIGHT_SIDE>().getAbstractPath(beforeLast(relPath, FILE_NAME_SEPARATOR)));
+ Zstring path2 = toZ(ABF::getDisplayPath(fsObj->getABF<RIGHT_SIDE>().getAbstractPath(relPath)));
+ Zstring dir2 = toZ(ABF::getDisplayPath(fsObj->getABF<RIGHT_SIDE>().getAbstractPath(beforeLast(relPath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE))));
if (!leftSide)
{
@@ -1576,7 +1594,7 @@ void MainDialog::flashStatusInformation(const wxString& text)
m_panelStatusBar->Layout();
//if (needLayoutUpdate) auiMgr.Update(); -> not needed here, this is called anyway in updateGui()
- processAsync2([] { boost::this_thread::sleep(boost::posix_time::millisec(2500)); },
+ processAsync2([] { boost::this_thread::sleep_for(boost::chrono::milliseconds(2500)); }, //throw boost::thread_interrupted
[this] { this->restoreStatusInformation(); });
}
@@ -2235,13 +2253,10 @@ void MainDialog::onMainGridContextRim(bool leftSide)
//by extension
if (!isDir)
{
- const Zstring filepath = afterLast(selection[0]->getPairRelativePath(), FILE_NAME_SEPARATOR);
- if (contains(filepath, Zchar('.'))) //be careful: afterLast returns the whole string if '.' is not found!
- {
- const Zstring extension = afterLast(filepath, Zchar('.'));
+ const Zstring extension = getFileExtension(selection[0]->getPairRelativePath());
+ if (!extension.empty())
submenu.addItem(L"*." + utfCvrtTo<wxString>(extension),
[this, extension, include] { filterExtension(extension, include); });
- }
}
//by short name
@@ -2603,9 +2618,9 @@ void MainDialog::onDirManualCorrection(wxCommandEvent& event)
wxString getFormattedHistoryElement(const Zstring& filepath)
{
- Zstring output = afterLast(filepath, FILE_NAME_SEPARATOR);
+ Zstring output = afterLast(filepath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL);
if (pathEndsWith(output, Zstr(".ffs_gui")))
- output = beforeLast(output, Zstr('.'));
+ output = beforeLast(output, Zstr('.'), IF_MISSING_RETURN_NONE);
return utfCvrtTo<wxString>(output);
}
@@ -2691,16 +2706,16 @@ void MainDialog::removeObsoleteCfgHistoryItems(const std::vector<Zstring>& filep
auto getMissingFilesAsync = [filepaths]() -> std::vector<Zstring>
{
- //boost::this_thread::sleep(boost::posix_time::millisec(5000));
+ //boost::this_thread::sleep_for(boost::chrono::seconds(5));
//check existence of all config files in parallel!
std::list<boost::unique_future<bool>> fileEx;
for (const Zstring& filepath : filepaths)
- fileEx.push_back(zen::async([=] { return fileExists(filepath); }));
+ fileEx.push_back(zen::runAsync([=] { return fileExists(filepath); }));
//potentially slow network access => limit maximum wait time!
- wait_for_all_timed(fileEx.begin(), fileEx.end(), boost::posix_time::milliseconds(1000));
+ wait_for_all_timed(fileEx.begin(), fileEx.end(), boost::chrono::milliseconds(1000));
std::vector<Zstring> missingFiles;
@@ -2797,7 +2812,7 @@ void MainDialog::OnConfigSave(wxCommandEvent& event)
case XML_TYPE_GLOBAL:
case XML_TYPE_OTHER:
showNotificationDialog(this, DialogInfoType::ERROR2,
- PopupDialogCfg().setDetailInstructions(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(activeCfgFilename))));
+ PopupDialogCfg().setDetailInstructions(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(activeCfgFilename))));
break;
}
}
@@ -2834,13 +2849,13 @@ bool MainDialog::trySaveConfig(const Zstring* guiFilename) //return true if save
Zstring defaultFileName = activeConfigFiles.size() == 1 && !EqualFilePath()(activeConfigFiles[0], lastRunConfigName()) ? activeConfigFiles[0] : Zstr("SyncSettings.ffs_gui");
//attention: activeConfigFiles may be an imported *.ffs_batch file! We don't want to overwrite it with a GUI config!
if (pathEndsWith(defaultFileName, Zstr(".ffs_batch")))
- defaultFileName = beforeLast(defaultFileName, Zstr(".")) + Zstr(".ffs_gui");
+ defaultFileName = beforeLast(defaultFileName, Zstr("."), IF_MISSING_RETURN_NONE) + Zstr(".ffs_gui");
wxFileDialog filePicker(this, //put modal dialog on stack: creating this on freestore leads to memleak!
wxEmptyString,
//OS X really needs dir/file separated like this:
- utfCvrtTo<wxString>(beforeLast(defaultFileName, FILE_NAME_SEPARATOR)), //default dir; empty string if / not found
- utfCvrtTo<wxString>(afterLast (defaultFileName, FILE_NAME_SEPARATOR)), //default file; whole string if / not found
+ utfCvrtTo<wxString>(beforeLast(defaultFileName, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)), //default dir
+ utfCvrtTo<wxString>(afterLast (defaultFileName, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)), //default file
wxString(L"FreeFileSync (*.ffs_gui)|*.ffs_gui") + L"|" +_("All files") + L" (*.*)|*",
wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
if (filePicker.ShowModal() != wxID_OK)
@@ -2923,13 +2938,13 @@ bool MainDialog::trySaveBatchConfig(const Zstring* batchFileToUpdate)
Zstring defaultFileName = !activeCfgFilename.empty() ? activeCfgFilename : Zstr("BatchRun.ffs_batch");
//attention: activeConfigFiles may be a *.ffs_gui file! We don't want to overwrite it with a BATCH config!
if (pathEndsWith(defaultFileName, Zstr(".ffs_gui")))
- defaultFileName = beforeLast(defaultFileName, Zstr(".")) + Zstr(".ffs_batch");
+ defaultFileName = beforeLast(defaultFileName, Zstr("."), IF_MISSING_RETURN_NONE) + Zstr(".ffs_batch");
wxFileDialog filePicker(this, //put modal dialog on stack: creating this on freestore leads to memleak!
wxEmptyString,
//OS X really needs dir/file separated like this:
- utfCvrtTo<wxString>(beforeLast(defaultFileName, FILE_NAME_SEPARATOR)), //default dir; empty string if / not found
- utfCvrtTo<wxString>(afterLast (defaultFileName, FILE_NAME_SEPARATOR)), //default file; whole string if / not found
+ utfCvrtTo<wxString>(beforeLast(defaultFileName, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)), //default dir
+ utfCvrtTo<wxString>(afterLast (defaultFileName, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)), //default file
_("FreeFileSync batch") + L" (*.ffs_batch)|*.ffs_batch" + L"|" +_("All files") + L" (*.*)|*",
wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
if (filePicker.ShowModal() != wxID_OK)
@@ -2967,7 +2982,8 @@ bool MainDialog::saveOldConfig() //return false on user abort
bool neverSaveChanges = false;
switch (showConfirmationDialog3(this, DialogInfoType::INFO, PopupDialogCfg3().
setTitle(toWx(activeCfgFilename)).
- setMainInstructions(replaceCpy(_("Do you want to save changes to %x?"), L"%x", fmtFileName(afterLast(activeCfgFilename, FILE_NAME_SEPARATOR)))).
+ setMainInstructions(replaceCpy(_("Do you want to save changes to %x?"), L"%x",
+ fmtPath(afterLast(activeCfgFilename, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)))).
setCheckBox(neverSaveChanges, _("Never save &changes"), ConfirmationButton3::DO_IT),
_("&Save"), _("Do&n't save")))
{
@@ -2985,7 +3001,7 @@ bool MainDialog::saveOldConfig() //return false on user abort
case XML_TYPE_GLOBAL:
case XML_TYPE_OTHER:
showNotificationDialog(this, DialogInfoType::ERROR2,
- PopupDialogCfg().setDetailInstructions(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(activeCfgFilename))));
+ PopupDialogCfg().setDetailInstructions(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(activeCfgFilename))));
return false;
}
}
@@ -3020,7 +3036,7 @@ void MainDialog::OnConfigLoad(wxCommandEvent& event)
wxFileDialog filePicker(this,
wxEmptyString,
- utfCvrtTo<wxString>(beforeLast(activeCfgFilename, FILE_NAME_SEPARATOR)), //set default dir: empty string if "activeConfigFiles" is empty or has no path separator
+ utfCvrtTo<wxString>(beforeLast(activeCfgFilename, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)), //set default dir
wxEmptyString,
wxString(L"FreeFileSync (*.ffs_gui; *.ffs_batch)|*.ffs_gui;*.ffs_batch") + L"|" +_("All files") + L" (*.*)|*",
wxFD_OPEN | wxFD_MULTIPLE);
@@ -3167,7 +3183,7 @@ void MainDialog::deleteSelectedCfgHistoryItems()
void MainDialog::OnCfgHistoryRightClick(wxMouseEvent& event)
{
ContextMenu menu;
- menu.addItem(_("Delete selected configurations") + L"\tDel", [this] { deleteSelectedCfgHistoryItems(); });
+ menu.addItem(_("Remove entry from list") + L"\tDel", [this] { deleteSelectedCfgHistoryItems(); });
menu.popup(*this);
}
@@ -3523,7 +3539,7 @@ void MainDialog::OnViewButtonRightClick(wxMouseEvent& event)
};
ContextMenu menu;
- menu.addItem( _("Set as default"), saveDefault);
+ menu.addItem( _("Save as default"), saveDefault);
menu.popup(*this);
}
diff --git a/FreeFileSync/Source/ui/progress_indicator.cpp b/FreeFileSync/Source/ui/progress_indicator.cpp
index e05179ee..86abc40e 100644
--- a/FreeFileSync/Source/ui/progress_indicator.cpp
+++ b/FreeFileSync/Source/ui/progress_indicator.cpp
@@ -1694,7 +1694,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateGuiInt(bool allowYield)
{
wxTheApp->Yield(); //receive UI message that end pause OR forceful termination!
//*first* refresh GUI (removing flicker) before sleeping!
- boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(UI_UPDATE_INTERVAL)); //throw boost::thread_interrupted
}
//after SyncProgressDialogImpl::OnClose() called wxWindow::Destroy() on OS X this instance is instantly toast!
if (wereDead)
diff --git a/FreeFileSync/Source/ui/search.cpp b/FreeFileSync/Source/ui/search.cpp
index bdba7e41..1ce35250 100644
--- a/FreeFileSync/Source/ui/search.cpp
+++ b/FreeFileSync/Source/ui/search.cpp
@@ -20,7 +20,7 @@ public:
bool operator()(const wxString& phrase) const { return contains(phrase, textToFind_); }
private:
- wxString textToFind_;
+ const wxString textToFind_;
};
@@ -28,7 +28,7 @@ template <>
class ContainsMatch<false>
{
public:
- ContainsMatch(const wxString& textToFind) : textToFind_(textToFind) { textToFind_.MakeUpper(); }
+ ContainsMatch(const wxString& textToFind) : textToFind_(textToFind.Upper()) {}
bool operator()(wxString&& phrase) const
{
//wxWidgets::MakeUpper() is inefficient! But performance is not THAT important for this high-level search functionality
@@ -37,7 +37,7 @@ public:
}
private:
- wxString textToFind_;
+ const wxString textToFind_;
};
//###########################################################################################
diff --git a/FreeFileSync/Source/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp
index df414aff..5319454c 100644
--- a/FreeFileSync/Source/ui/small_dlgs.cpp
+++ b/FreeFileSync/Source/ui/small_dlgs.cpp
@@ -27,6 +27,9 @@
#include "../lib/hard_filter.h"
#include "../version/version.h"
+#ifdef ZEN_WIN_VISTA_AND_LATER
+ #include "../fs/sftp.h"
+#endif
#ifdef ZEN_WIN
#include <wx+/mouse_move_dlg.h>
#endif
@@ -40,8 +43,8 @@ public:
AboutDlg(wxWindow* parent);
private:
- void OnClose (wxCloseEvent& event) override { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
void OnOK (wxCommandEvent& event) override { EndModal(ReturnSmallDlg::BUTTON_OKAY); }
+ void OnClose (wxCloseEvent& event) override { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
void OnDonate(wxCommandEvent& event) override { wxLaunchDefaultBrowser(L"http://www.freefilesync.org/donate.php"); }
};
@@ -142,6 +145,98 @@ void zen::showAboutDialog(wxWindow* parent)
//########################################################################################
+#ifdef ZEN_WIN_VISTA_AND_LATER
+class SftpSetupDlg : public SftpSetupDlgGenerated
+{
+public:
+ SftpSetupDlg(wxWindow* parent, Zstring& folderPathPhrase);
+
+private:
+ void OnOkay (wxCommandEvent& event) override;
+ void OnCancel(wxCommandEvent& event) override { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
+ void OnClose (wxCloseEvent& event) override { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
+ void OnToggleShowPassword(wxCommandEvent& event) override;
+
+ Zstring& folderPathPhraseOut;
+};
+
+
+SftpSetupDlg::SftpSetupDlg(wxWindow* parent, Zstring& folderPathPhrase) : SftpSetupDlgGenerated(parent), folderPathPhraseOut(folderPathPhrase)
+{
+#ifdef ZEN_WIN
+ new zen::MouseMoveWindow(*this);
+#endif
+ setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel));
+
+ m_bitmapSftp->SetBitmap(getResourceImage(L"sftp"));
+ m_checkBoxShowPassword->SetValue(false);
+ m_textCtrlPasswordVisible->Hide();
+
+ if (acceptsFolderPathPhraseSftp(folderPathPhrase)) //noexcept
+ {
+ auto res = getResolvedSftpPath(folderPathPhrase); //noexcept
+ const SftpLoginInfo login = res.first;
+ const Zstring serverRelPath = res.second;
+
+ m_textCtrlServer ->ChangeValue(utfCvrtTo<wxString>(login.server));
+ m_textCtrlUserName ->ChangeValue(utfCvrtTo<wxString>(login.username));
+ m_textCtrlPasswordHidden->ChangeValue(utfCvrtTo<wxString>(login.password));
+ m_textCtrlServerPath ->ChangeValue(utfCvrtTo<wxString>(serverRelPath));
+ }
+
+ GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
+ //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!!
+
+ m_buttonOkay->SetFocus();
+}
+
+
+void SftpSetupDlg::OnToggleShowPassword(wxCommandEvent& event)
+{
+ if (m_checkBoxShowPassword->GetValue())
+ {
+ m_textCtrlPasswordHidden ->Hide();
+ m_textCtrlPasswordVisible->Show();
+ m_textCtrlPasswordVisible->ChangeValue(m_textCtrlPasswordHidden->GetValue());
+ }
+ else
+ {
+ m_textCtrlPasswordVisible->Hide();
+ m_textCtrlPasswordHidden ->Show();
+ m_textCtrlPasswordHidden->ChangeValue(m_textCtrlPasswordVisible->GetValue());
+ }
+ Layout(); //needed! hidden items are not considered during resize
+}
+
+
+void SftpSetupDlg::OnOkay(wxCommandEvent& event)
+{
+ SftpLoginInfo login = {};
+ login.server = utfCvrtTo<Zstring>(m_textCtrlServer ->GetValue());
+ login.username = utfCvrtTo<Zstring>(m_textCtrlUserName->GetValue());
+ login.password = utfCvrtTo<Zstring>((m_checkBoxShowPassword->GetValue() ? m_textCtrlPasswordVisible : m_textCtrlPasswordHidden)->GetValue());
+
+ Zstring serverRelPath = utfCvrtTo<Zstring>(m_textCtrlServerPath->GetValue());
+
+ trim(login.server);
+ trim(serverRelPath);
+
+ folderPathPhraseOut = assembleSftpFolderPathPhrase(login, serverRelPath); //noexcept
+
+ EndModal(ReturnSmallDlg::BUTTON_OKAY);
+}
+
+
+ReturnSmallDlg::ButtonPressed zen::showSftpSetupDialog(wxWindow* parent, Zstring& folderPathPhrase)
+{
+ SftpSetupDlg setupDlg(parent, folderPathPhrase);
+ return static_cast<ReturnSmallDlg::ButtonPressed>(setupDlg.ShowModal());
+
+}
+#endif
+
+//########################################################################################
+
class DeleteDialog : public DeleteDlgGenerated
{
public:
@@ -205,8 +300,8 @@ void DeleteDialog::updateGui()
wxWindowUpdateLocker dummy(this); //leads to GUI corruption problems on Linux/OS X!
#endif
- const std::pair<Zstring, int> delInfo = zen::deleteFromGridAndHDPreview(rowsToDeleteOnLeft,
- rowsToDeleteOnRight);
+ const std::pair<std::wstring, int> delInfo = zen::deleteFromGridAndHDPreview(rowsToDeleteOnLeft,
+ rowsToDeleteOnRight);
wxString header;
if (m_checkBoxUseRecycler->GetValue())
{
@@ -226,8 +321,7 @@ void DeleteDialog::updateGui()
//it seems like Wrap() needs to be reapplied after SetLabel()
m_staticTextHeader->Wrap(460);
- const wxString& fileList = utfCvrtTo<wxString>(delInfo.first);
- m_textCtrlFileList->ChangeValue(fileList);
+ m_textCtrlFileList->ChangeValue(delInfo.first);
/*
There is a nasty bug on wxGTK under Ubuntu: If a multi-line wxTextCtrl contains so many lines that scrollbars are shown,
it re-enables all windows that are supposed to be disabled during the current modal loop!
@@ -284,9 +378,9 @@ public:
const zen::SyncStatistics& st,
bool& dontShowAgain);
private:
- void OnClose (wxCloseEvent& event) override { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
- void OnCancel (wxCommandEvent& event) override { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
void OnStartSync(wxCommandEvent& event) override;
+ void OnCancel (wxCommandEvent& event) override { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
+ void OnClose (wxCloseEvent& event) override { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
bool& m_dontShowAgain;
};
@@ -430,7 +524,7 @@ OptionsDlg::OptionsDlg(wxWindow* parent, xmlAccess::XmlGlobalSettings& globalSet
updateGui();
#ifdef ZEN_WIN
- m_checkBoxCopyPermissions->SetLabel(_("Copy NTFS permissions"));
+ m_checkBoxCopyPermissions->SetLabel(_("Copy DACL, SACL, Owner, Group"));
#elif defined ZEN_LINUX || defined ZEN_MAC
bSizerLockedFiles->Show(false);
#endif
diff --git a/FreeFileSync/Source/ui/small_dlgs.h b/FreeFileSync/Source/ui/small_dlgs.h
index 331c500c..8b890f83 100644
--- a/FreeFileSync/Source/ui/small_dlgs.h
+++ b/FreeFileSync/Source/ui/small_dlgs.h
@@ -43,6 +43,10 @@ ReturnSmallDlg::ButtonPressed showCompareCfgDialog(wxWindow* parent, CompConfig&
ReturnSmallDlg::ButtonPressed showOptionsDlg(wxWindow* parent, xmlAccess::XmlGlobalSettings& globalSettings);
ReturnSmallDlg::ButtonPressed showSelectTimespanDlg(wxWindow* parent, std::int64_t& timeFrom, std::int64_t& timeTo);
+
+#ifdef ZEN_WIN_VISTA_AND_LATER
+ ReturnSmallDlg::ButtonPressed showSftpSetupDialog(wxWindow* parent, Zstring& folderPathPhrase);
+#endif
}
#endif // SMALLDIALOGS_H_INCLUDED
diff --git a/FreeFileSync/Source/ui/sorting.h b/FreeFileSync/Source/ui/sorting.h
index 2622b332..0f8dfb22 100644
--- a/FreeFileSync/Source/ui/sorting.h
+++ b/FreeFileSync/Source/ui/sorting.h
@@ -22,6 +22,7 @@ struct CompileTimeReminder : public FSObjectVisitor
} checkDymanicCasts; //just a compile-time reminder to manually check dynamic casts in this file when needed
}
+
inline
bool isDirectoryPair(const FileSystemObject& fsObj)
{
@@ -53,6 +54,7 @@ bool lessShortFileName(const FileSystemObject& a, const FileSystemObject& b)
return makeSortDirection(LessFilePath(), Int2Type<ascending>())(a.getItemName<side>(), b.getItemName<side>());
}
+
template <bool ascending, SelectedSide side> inline
bool lessFullPath(const FileSystemObject& a, const FileSystemObject& b)
{
@@ -73,12 +75,12 @@ bool lessRelativeFolder(const FileSystemObject& a, const FileSystemObject& b)
const bool isDirectoryA = isDirectoryPair(a);
const Zstring& relFolderA = isDirectoryA ?
a.getPairRelativePath() : //directory
- beforeLast(a.getPairRelativePath(), FILE_NAME_SEPARATOR); //returns empty string if ch not found
+ beforeLast(a.getPairRelativePath(), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
const bool isDirectoryB = isDirectoryPair(b);
const Zstring& relFolderB = isDirectoryB ?
b.getPairRelativePath() : //directory
- beforeLast(b.getPairRelativePath(), FILE_NAME_SEPARATOR); //returns empty string if ch not found
+ beforeLast(b.getPairRelativePath(), FILE_NAME_SEPARATOR ,IF_MISSING_RETURN_NONE);
//compare relative names without filepaths first
const int rv = cmpFilePath(relFolderA.c_str(), relFolderA.size(),
diff --git a/FreeFileSync/Source/ui/sync_cfg.cpp b/FreeFileSync/Source/ui/sync_cfg.cpp
index b6178a48..950e8f4e 100644
--- a/FreeFileSync/Source/ui/sync_cfg.cpp
+++ b/FreeFileSync/Source/ui/sync_cfg.cpp
@@ -124,7 +124,7 @@ private:
void OnDeletionRecycler (wxCommandEvent& event) override { handleDeletion = DELETE_TO_RECYCLER; updateSyncGui(); }
void OnDeletionVersioning (wxCommandEvent& event) override { handleDeletion = DELETE_TO_VERSIONING; updateSyncGui(); }
- void OnToggleDeletionType(wxCommandEvent& event) override { toggleDeletionPolicy(handleDeletion); updateSyncGui(); }
+ void OnToggleDeletionType(wxCommandEvent& event) override { toggleDeletionPolicy(handleDeletion); updateSyncGui(); }
void OnErrorPopup (wxCommandEvent& event) override { onGuiError = ON_GUIERROR_POPUP; updateSyncGui(); }
void OnErrorIgnore(wxCommandEvent& event) override { onGuiError = ON_GUIERROR_IGNORE; updateSyncGui(); }
@@ -212,7 +212,7 @@ ConfigDialog::ConfigDialog(wxWindow* parent,
miscCfgOut(miscCfg),
handleDeletion(DELETE_TO_RECYCLER), //
onGuiError(ON_GUIERROR_POPUP), //dummy init
- versioningFolder(*m_panelVersioning, *m_buttonSelectDirVersioning, *m_versioningFolder/*, m_staticTextResolvedPath*/)
+ versioningFolder(*m_panelVersioning, *m_buttonSelectDirVersioning, *m_bpButtonSelectSftp, *m_versioningFolder/*, m_staticTextResolvedPath*/)
{
#ifdef ZEN_WIN
new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
diff --git a/FreeFileSync/Source/ui/tree_view.cpp b/FreeFileSync/Source/ui/tree_view.cpp
index a1831a3c..2761ff8c 100644
--- a/FreeFileSync/Source/ui/tree_view.cpp
+++ b/FreeFileSync/Source/ui/tree_view.cpp
@@ -148,63 +148,61 @@ void calcPercentage(std::vector<std::pair<std::uint64_t, int*>>& workList)
}
-Zstring impl::getShortDisplayNameForFolderPair(const Zstring& displayPathLeft, const Zstring& displayrPathRight)
+std::wstring impl::getShortDisplayNameForFolderPair(const std::wstring& displayPathLeft, const std::wstring& displayPathRight)
{
- auto itL = displayPathLeft .end();
- auto itR = displayrPathRight.end();
-
+ const wchar_t sep = L'/';
+ std::wstring fmtPathL = replaceCpy(displayPathLeft, L'\\', sep); //treat slash, back-slash the same
+ std::wstring fmtPathR = replaceCpy(displayPathRight, L'\\', sep); //
+ if (!startsWith(fmtPathL, sep)) fmtPathL = sep + fmtPathL;
+ if (!startsWith(fmtPathR, sep)) fmtPathR = sep + fmtPathR;
+
+ auto itL = fmtPathL.end();
+ auto itR = fmtPathR.end();
for (;;)
{
- auto itLPrev = find_last(displayPathLeft .begin(), itL, FILE_NAME_SEPARATOR); //c:\file, d:\1file have no common postfix!
- auto itRPrev = find_last(displayrPathRight.begin(), itR, FILE_NAME_SEPARATOR);
+ auto itLPrev = find_last(fmtPathL.begin(), itL, sep); //c:\file, d:\1file have no common postfix!
+ auto itRPrev = find_last(fmtPathR.begin(), itR, sep);
if (itLPrev == itL ||
itRPrev == itR)
- {
- if (itLPrev == itL)
- itLPrev = displayPathLeft.begin();
- else
- ++itLPrev; //skip separator
- if (itRPrev == itR)
- itRPrev = displayrPathRight.begin();
- else
- ++itRPrev;
-
- if (equal(itLPrev, itL, itRPrev, itR))
- {
- itL = itLPrev;
- itR = itRPrev;
- }
break;
- }
- if (!equal(itLPrev, itL, itRPrev, itR))
+ if (cmpFilePath(&*itLPrev, itL - itLPrev,
+ &*itRPrev, itR - itRPrev) != 0)
break;
itL = itLPrev;
itR = itRPrev;
}
- Zstring commonPostfix(itL, displayPathLeft.end());
- if (startsWith(commonPostfix, FILE_NAME_SEPARATOR))
- commonPostfix = afterFirst(commonPostfix, FILE_NAME_SEPARATOR);
+ if (itL != fmtPathL.end() && *itL == sep)
+ ++itL;
+
+ const size_t postFixLen = fmtPathL.end() - itL;
+ if (postFixLen > 0)
+ return std::wstring(&*(displayPathLeft.end() - postFixLen), postFixLen);
- if (commonPostfix.empty())
+ auto getLastComponent = [sep](const std::wstring& displayPath) -> std::wstring
{
- auto getLastComponent = [](const Zstring& dirPath) -> Zstring
- {
- if (endsWith(dirPath, FILE_NAME_SEPARATOR)) //preserve trailing separator, support "C:\"
- return afterLast(Zstring(dirPath.c_str(), dirPath.size() - 1), FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR;
- return afterLast(dirPath, FILE_NAME_SEPARATOR); //returns the whole string if term not found
- };
- if (displayPathLeft.empty())
- return getLastComponent(displayrPathRight);
- else if (displayrPathRight.empty())
- return getLastComponent(displayPathLeft);
- else
- return getLastComponent(displayPathLeft) + utfCvrtTo<Zstring>(L" \u2212 ") + //= unicode minus
- getLastComponent(displayrPathRight);
- }
- return commonPostfix;
+ const std::wstring fmtPath = replaceCpy(displayPath, L'\\', sep);
+
+ auto itEnd = fmtPath.end();
+ if (endsWith(fmtPath, sep)) //preserve trailing separator, support "C:\"
+ --itEnd;
+
+ auto it = find_last(fmtPath.begin(), itEnd, sep);
+ if (it == itEnd)
+ it = fmtPath.begin();
+ else ++it;
+
+ return displayPath.c_str() + (it - fmtPath.begin());
+ };
+ if (displayPathLeft.empty())
+ return getLastComponent(displayPathRight);
+ else if (displayPathRight.empty())
+ return getLastComponent(displayPathLeft);
+ else
+ return getLastComponent(displayPathLeft) + L" \u2212 " + //= unicode minus
+ getLastComponent(displayPathRight);
}
@@ -790,8 +788,8 @@ private:
if (std::unique_ptr<TreeView::Node> node = treeDataView_->getLine(row))
if (const TreeView::RootNode* root = dynamic_cast<const TreeView::RootNode*>(node.get()))
{
- const wxString& dirLeft = utfCvrtTo<wxString>(ABF::getDisplayPath(root->baseDirObj_.getABF<LEFT_SIDE >().getAbstractPath()));
- const wxString& dirRight = utfCvrtTo<wxString>(ABF::getDisplayPath(root->baseDirObj_.getABF<RIGHT_SIDE>().getAbstractPath()));
+ const wxString& dirLeft = ABF::getDisplayPath(root->baseDirObj_.getABF<LEFT_SIDE >().getAbstractPath());
+ const wxString& dirRight = ABF::getDisplayPath(root->baseDirObj_.getABF<RIGHT_SIDE>().getAbstractPath());
if (dirLeft.empty())
return dirRight;
else if (dirRight.empty())
diff --git a/FreeFileSync/Source/ui/tree_view.h b/FreeFileSync/Source/ui/tree_view.h
index 2d057d33..aa7f07b0 100644
--- a/FreeFileSync/Source/ui/tree_view.h
+++ b/FreeFileSync/Source/ui/tree_view.h
@@ -84,11 +84,11 @@ public:
struct RootNode : public Node
{
- RootNode(int percent, std::uint64_t bytes, int itemCount, NodeStatus status, BaseDirPair& baseDirObj, const Zstring displayName) :
+ RootNode(int percent, std::uint64_t bytes, int itemCount, NodeStatus status, BaseDirPair& baseDirObj, const std::wstring& displayName) :
Node(percent, bytes, itemCount, 0, status), baseDirObj_(baseDirObj), displayName_(displayName) {}
BaseDirPair& baseDirObj_;
- Zstring displayName_;
+ const std::wstring displayName_;
};
std::unique_ptr<Node> getLine(size_t row) const; //return nullptr on error
@@ -137,7 +137,7 @@ private:
{
RootNodeImpl() {}
std::shared_ptr<BaseDirPair> baseDirObj;
- Zstring displayName;
+ std::wstring displayName;
};
enum NodeType
@@ -185,7 +185,7 @@ private:
namespace impl //declare for unit tests:
{
-Zstring getShortDisplayNameForFolderPair(const Zstring& dirPathLeft, const Zstring& dirPathRight);
+std::wstring getShortDisplayNameForFolderPair(const std::wstring& dirPathLeft, const std::wstring& dirPathRight);
}
diff --git a/FreeFileSync/Source/version/version.h b/FreeFileSync/Source/version/version.h
index a37b43a4..0ac9ee9f 100644
--- a/FreeFileSync/Source/version/version.h
+++ b/FreeFileSync/Source/version/version.h
@@ -3,7 +3,7 @@
namespace zen
{
-const wchar_t ffsVersion[] = L"7.1"; //internal linkage!
+const wchar_t ffsVersion[] = L"7.2"; //internal linkage!
const wchar_t FFS_VERSION_SEPERATOR = L'.';
}
diff --git a/LICENSE b/LICENSE
index 94a04532..88b549b5 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,7 @@
- GNU GENERAL PUBLIC LICENSE
+A. GNU GENERAL PUBLIC LICENSE
+B. libssh2 License
+
+A. GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
@@ -618,4 +621,48 @@ an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
+
+B. 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+/file_drop.h b/wx+/file_drop.h
index 0e9e92ad..2feef6e2 100644
--- a/wx+/file_drop.h
+++ b/wx+/file_drop.h
@@ -16,7 +16,7 @@
#include <wx/dnd.h>
#ifdef ZEN_WIN_VISTA_AND_LATER
-#include <zen/win.h>
+ #include <zen/win.h>
#endif
diff --git a/wx+/graph.cpp b/wx+/graph.cpp
index 3ab045b7..d76e4d41 100644
--- a/wx+/graph.cpp
+++ b/wx+/graph.cpp
@@ -120,7 +120,7 @@ int widenRange(double& valMin, double& valMax, //in/out
const double minValRangePerBlock = (valMax - valMin) / graphAreaSize;
const double proposedValRangePerBlock = (valMax - valMin) * optimalBlockSizePx / graphAreaSize;
double valRangePerBlock = labelFmt.getOptimalBlockSize(proposedValRangePerBlock);
- assert(numeric::isNull(proposedValRangePerBlock) || valRangePerBlock > minValRangePerBlock);
+ assert(numeric::isNull(proposedValRangePerBlock) || valRangePerBlock > minValRangePerBlock);
if (numeric::isNull(valRangePerBlock)) //valMin == valMax or strange "optimal block size"
return 1;
@@ -131,15 +131,15 @@ int widenRange(double& valMin, double& valMax, //in/out
double blockMin = std::floor(valMin / valRangePerBlock); //store as double, not int: truncation possible, e.g. if valRangePerBlock == 1
double blockMax = std::ceil (valMax / valRangePerBlock); //
- int blockCount = numeric::round(blockMax - blockMin);
- assert(blockCount >= 0);
+ int blockCount = numeric::round(blockMax - blockMin);
+ assert(blockCount >= 0);
- //handle valMin == valMax == integer
+ //handle valMin == valMax == integer
if (blockCount <= 0)
- {
- ++blockMax;
- blockCount = 1;
- }
+ {
+ ++blockMax;
+ blockCount = 1;
+ }
valMin = blockMin * valRangePerBlock;
valMax = blockMax * valRangePerBlock;
diff --git a/wx+/image_resources.cpp b/wx+/image_resources.cpp
index 3a7ba3ee..9d4f2396 100644
--- a/wx+/image_resources.cpp
+++ b/wx+/image_resources.cpp
@@ -42,6 +42,9 @@ class GlobalResources
public:
static GlobalResources& instance()
{
+#if defined _MSC_VER && _MSC_VER > 1800
+#error remove warning
+#endif
//caveat: function scope static initialization is not thread-safe in VS 2010! => but we wouldn't use wxWidgets in combination with multithreading anyway!
static GlobalResources inst;
return inst;
diff --git a/zen/async_task.h b/zen/async_task.h
index b8d72fbe..5c6f7f6e 100644
--- a/zen/async_task.h
+++ b/zen/async_task.h
@@ -27,7 +27,7 @@ public:
// -> doAsync: the usual thread-safety requirements apply!
// -> evalOnGui: no thread-safety concerns, but must only reference variables with greater-equal lifetime than the AsyncTask instance!
{
- tasks.push_back(zen::async([=]() -> std::function<void()>
+ tasks.push_back(zen::runAsync([=]() -> std::function<void()>
{
auto result = doAsync();
return [=]{ evalOnGui(result); };
@@ -37,7 +37,7 @@ public:
template <class Fun, class Fun2>
void add2(Fun doAsync, Fun2 evalOnGui) //for evalOnGui taking no parameters
{
- tasks.push_back(zen::async([=]() -> std::function<void()> { doAsync(); return [=]{ evalOnGui(); }; }));
+ tasks.push_back(zen::runAsync([doAsync, evalOnGui]() -> std::function<void()> { doAsync(); return [evalOnGui]{ evalOnGui(); }; }));
}
void evalResults() //call from gui thread repreatedly
diff --git a/zen/basic_math.h b/zen/basic_math.h
index 227d1cd4..14fcae9c 100644
--- a/zen/basic_math.h
+++ b/zen/basic_math.h
@@ -92,7 +92,7 @@ const double ln2 = 0.693147180559945309417;
template <class T> inline
T abs(T value)
{
- static_assert(std::is_signed<T>::value, "");
+ //static_assert(std::is_signed<T>::value, "");
if (value < 0)
return -value; //operator "?:" caveat: may be different type than "value"
else
diff --git a/zen/dir_watcher.cpp b/zen/dir_watcher.cpp
index a97ea80d..e93e2b06 100644
--- a/zen/dir_watcher.cpp
+++ b/zen/dir_watcher.cpp
@@ -156,7 +156,7 @@ public:
FILE_FLAG_OVERLAPPED, //_In_ DWORD dwFlagsAndAttributes,
nullptr); //_In_opt_ HANDLE hTemplateFile
if (hDir == INVALID_HANDLE_VALUE)
- throwFileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(directory)), L"CreateFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(directory)), L"CreateFile", getLastError());
//end of constructor, no need to start managing "hDir"
}
@@ -176,86 +176,79 @@ public:
void operator()() //thread entry
{
- try
- {
- std::vector<char> buffer(64 * 1024); //needs to be aligned on a DWORD boundary; maximum buffer size restricted by some networks protocols (according to docu)
+ std::vector<char> buffer(64 * 1024); //needs to be aligned on a DWORD boundary; maximum buffer size restricted by some networks protocols (according to docu)
- for (;;)
+ for (;;)
+ {
+ boost::this_thread::interruption_point();
+
+ //actual work
+ OVERLAPPED overlapped = {};
+ overlapped.hEvent = ::CreateEvent(nullptr, //__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
+ true, //__in BOOL bManualReset,
+ false, //__in BOOL bInitialState,
+ nullptr); //__in_opt LPCTSTR lpName
+ if (overlapped.hEvent == nullptr)
{
- boost::this_thread::interruption_point();
-
- //actual work
- OVERLAPPED overlapped = {};
- overlapped.hEvent = ::CreateEvent(nullptr, //__in_opt LPSECURITY_ATTRIBUTES lpEventAttributes,
- true, //__in BOOL bManualReset,
- false, //__in BOOL bInitialState,
- nullptr); //__in_opt LPCTSTR lpName
- if (overlapped.hEvent == nullptr)
- {
- const DWORD ec = ::GetLastError(); //copy before directly or indirectly making other system calls!
- return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirpathPf)), formatSystemError(L"CreateEvent", ec), ec);
- }
- ZEN_ON_SCOPE_EXIT(::CloseHandle(overlapped.hEvent));
-
- DWORD bytesReturned = 0; //should not be needed for async calls, still pass it to help broken drivers
-
- //asynchronous variant: runs on this thread's APC queue!
- if (!::ReadDirectoryChangesW(hDir, // __in HANDLE hDirectory,
- &buffer[0], // __out LPVOID lpBuffer,
- static_cast<DWORD>(buffer.size()), // __in DWORD nBufferLength,
- true, // __in BOOL bWatchSubtree,
- FILE_NOTIFY_CHANGE_FILE_NAME |
- FILE_NOTIFY_CHANGE_DIR_NAME |
- FILE_NOTIFY_CHANGE_SIZE |
- FILE_NOTIFY_CHANGE_LAST_WRITE, // __in DWORD dwNotifyFilter,
- &bytesReturned, // __out_opt LPDWORD lpBytesReturned,
- &overlapped, // __inout_opt LPOVERLAPPED lpOverlapped,
- nullptr)) // __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
- {
- const DWORD ec = ::GetLastError(); //copy before directly or indirectly making other system calls!
- return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirpathPf)), formatSystemError(L"ReadDirectoryChangesW", ec), ec);
- }
+ const DWORD ec = ::GetLastError(); //copy before directly or indirectly making other system calls!
+ return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(dirpathPf)), formatSystemError(L"CreateEvent", ec), ec);
+ }
+ ZEN_ON_SCOPE_EXIT(::CloseHandle(overlapped.hEvent));
+
+ DWORD bytesReturned = 0; //should not be needed for async calls, still pass it to help broken drivers
+
+ //asynchronous variant: runs on this thread's APC queue!
+ if (!::ReadDirectoryChangesW(hDir, // __in HANDLE hDirectory,
+ &buffer[0], // __out LPVOID lpBuffer,
+ static_cast<DWORD>(buffer.size()), // __in DWORD nBufferLength,
+ true, // __in BOOL bWatchSubtree,
+ FILE_NOTIFY_CHANGE_FILE_NAME |
+ FILE_NOTIFY_CHANGE_DIR_NAME |
+ FILE_NOTIFY_CHANGE_SIZE |
+ FILE_NOTIFY_CHANGE_LAST_WRITE, // __in DWORD dwNotifyFilter,
+ &bytesReturned, // __out_opt LPDWORD lpBytesReturned,
+ &overlapped, // __inout_opt LPOVERLAPPED lpOverlapped,
+ nullptr)) // __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
+ {
+ const DWORD ec = ::GetLastError(); //copy before directly or indirectly making other system calls!
+ return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(dirpathPf)), formatSystemError(L"ReadDirectoryChangesW", ec), ec);
+ }
- //async I/O is a resource that needs to be guarded since it will write to local variable "buffer"!
- zen::ScopeGuard guardAio = zen::makeGuard([&]
- {
- //Canceling Pending I/O Operations: http://msdn.microsoft.com/en-us/library/aa363789(v=vs.85).aspx
+ //async I/O is a resource that needs to be guarded since it will write to local variable "buffer"!
+ zen::ScopeGuard guardAio = zen::makeGuard([&]
+ {
+ //Canceling Pending I/O Operations: http://msdn.microsoft.com/en-us/library/aa363789(v=vs.85).aspx
#ifdef ZEN_WIN_VISTA_AND_LATER
- if (::CancelIoEx(hDir, &overlapped) /*!= FALSE*/ || ::GetLastError() != ERROR_NOT_FOUND)
+ if (::CancelIoEx(hDir, &overlapped) /*!= FALSE*/ || ::GetLastError() != ERROR_NOT_FOUND)
#else
- if (::CancelIo(hDir) /*!= FALSE*/ || ::GetLastError() != ERROR_NOT_FOUND)
+ if (::CancelIo(hDir) /*!= FALSE*/ || ::GetLastError() != ERROR_NOT_FOUND)
#endif
- {
- DWORD bytesWritten = 0;
- ::GetOverlappedResult(hDir, &overlapped, &bytesWritten, true); //wait until cancellation is complete
- }
- });
-
- //wait for results
- DWORD bytesWritten = 0;
- while (!::GetOverlappedResult(hDir, //__in HANDLE hFile,
- &overlapped, //__in LPOVERLAPPED lpOverlapped,
- &bytesWritten, //__out LPDWORD lpNumberOfBytesTransferred,
- false)) //__in BOOL bWait
{
- const DWORD ec = ::GetLastError(); //copy before directly or indirectly making other system calls!
- if (ec != ERROR_IO_INCOMPLETE)
- return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirpathPf)), formatSystemError(L"GetOverlappedResult", ec), ec);
-
- //execute asynchronous procedure calls (APC) queued on this thread
- ::SleepEx(50, // __in DWORD dwMilliseconds,
- true); // __in BOOL bAlertable
-
- boost::this_thread::interruption_point();
+ DWORD bytesWritten = 0;
+ ::GetOverlappedResult(hDir, &overlapped, &bytesWritten, true); //must wait until cancellation is complete!
}
- guardAio.dismiss();
+ });
+
+ //wait for results
+ DWORD bytesWritten = 0;
+ while (!::GetOverlappedResult(hDir, //__in HANDLE hFile,
+ &overlapped, //__in LPOVERLAPPED lpOverlapped,
+ &bytesWritten, //__out LPDWORD lpNumberOfBytesTransferred,
+ false)) //__in BOOL bWait
+ {
+ const DWORD ec = ::GetLastError(); //copy before directly or indirectly making other system calls!
+ if (ec != ERROR_IO_INCOMPLETE)
+ return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(dirpathPf)), formatSystemError(L"GetOverlappedResult", ec), ec);
+
+ //execute asynchronous procedure calls (APC) queued on this thread
+ ::SleepEx(50, // __in DWORD dwMilliseconds,
+ true); // __in BOOL bAlertable
- shared_->addChanges(&buffer[0], bytesWritten, dirpathPf); //throw ()
+ boost::this_thread::interruption_point();
}
- }
- catch (boost::thread_interrupted&)
- {
- throw; //this is the only exception expected!
+ guardAio.dismiss();
+
+ shared_->addChanges(&buffer[0], bytesWritten, dirpathPf); //throw ()
}
}
@@ -362,13 +355,13 @@ std::vector<DirWatcher::Entry> DirWatcher::getChanges(const std::function<void()
//wait until device removal is confirmed, to prevent locking hDir again by some new watch!
if (pimpl_->volRemoval->requestReceived())
{
- const boost::system_time maxwait = boost::get_system_time() + boost::posix_time::seconds(15);
+ const boost::chrono::steady_clock::time_point endTime = boost::chrono::steady_clock::now() + boost::chrono::seconds(15);
//HandleVolumeRemoval::finished() not guaranteed! note: Windows gives unresponsive applications ca. 10 seconds until unmounting the usb stick in worst case
- while (!pimpl_->volRemoval->finished() && boost::get_system_time() < maxwait)
+ while (!pimpl_->volRemoval->finished() && boost::chrono::steady_clock::now() < endTime)
{
processGuiMessages(); //DBT_DEVICEREMOVECOMPLETE message is sent here!
- boost::thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(50));
+ boost::this_thread::sleep_for(boost::chrono::milliseconds(50)); //throw boost::thread_interrupted
}
output.emplace_back(ACTION_DELETE, baseDirPath); //report removal as change to main directory
@@ -411,7 +404,7 @@ DirWatcher::DirWatcher(const Zstring& dirPath) : //throw FileError
//init
pimpl_->notifDescr = ::inotify_init();
if (pimpl_->notifDescr == -1)
- throwFileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(baseDirPath)), L"inotify_init", getLastError());
+ throwFileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(baseDirPath)), L"inotify_init", getLastError());
zen::ScopeGuard guardDescr = zen::makeGuard([&] { ::close(pimpl_->notifDescr); });
@@ -423,7 +416,7 @@ DirWatcher::DirWatcher(const Zstring& dirPath) : //throw FileError
initSuccess = ::fcntl(pimpl_->notifDescr, F_SETFL, flags | O_NONBLOCK) != -1;
}
if (!initSuccess)
- throwFileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(baseDirPath)), L"fcntl", getLastError());
+ throwFileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(baseDirPath)), L"fcntl", getLastError());
//add watches
for (const Zstring& subDirPath : fullDirList)
@@ -443,10 +436,10 @@ DirWatcher::DirWatcher(const Zstring& dirPath) : //throw FileError
{
const auto ec = getLastError();
if (ec == ENOSPC) //fix misleading system message "No space left on device"
- throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(subDirPath)),
+ throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(subDirPath)),
formatSystemError(L"inotify_add_watch", ec, L"The user limit on the total number of inotify watches was reached or the kernel failed to allocate a needed resource."));
- throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(subDirPath)), formatSystemError(L"inotify_add_watch", ec));
+ throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(subDirPath)), formatSystemError(L"inotify_add_watch", ec));
}
pimpl_->watchDescrs.emplace(wd, appendSeparator(subDirPath));
@@ -479,7 +472,7 @@ std::vector<DirWatcher::Entry> DirWatcher::getChanges(const std::function<void()
if (errno == EAGAIN) //this error is ignored in all inotify wrappers I found
return std::vector<Entry>();
- throwFileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(baseDirPath)), L"read", getLastError());
+ throwFileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(baseDirPath)), L"read", getLastError());
}
std::vector<Entry> output;
@@ -575,7 +568,7 @@ DirWatcher::DirWatcher(const Zstring& dirPath) :
{
CFStringRef dirpathCf = osx::createCFString(baseDirPath.c_str()); //returns nullptr on error
if (!dirpathCf)
- throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(baseDirPath)), L"Function call failed: createCFString"); //no error code documented!
+ throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(baseDirPath)), L"Function call failed: createCFString"); //no error code documented!
ZEN_ON_SCOPE_EXIT(::CFRelease(dirpathCf));
CFArrayRef dirpathCfArray = ::CFArrayCreate(nullptr, //CFAllocatorRef allocator,
@@ -583,7 +576,7 @@ DirWatcher::DirWatcher(const Zstring& dirPath) :
1, //CFIndex numValues,
nullptr); //const CFArrayCallBacks* callBacks
if (!dirpathCfArray)
- throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(baseDirPath)), L"Function call failed: CFArrayCreate"); //no error code documented!
+ throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(baseDirPath)), L"Function call failed: CFArrayCreate"); //no error code documented!
ZEN_ON_SCOPE_EXIT(::CFRelease(dirpathCfArray));
FSEventStreamContext context = {};
@@ -609,7 +602,7 @@ DirWatcher::DirWatcher(const Zstring& dirPath) :
zen::ScopeGuard guardRunloop = zen::makeGuard([&] { ::FSEventStreamInvalidate(pimpl_->eventStream); });
if (!::FSEventStreamStart(pimpl_->eventStream))
- throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(baseDirPath)), L"Function call failed: FSEventStreamStart"); //no error code documented!
+ throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtPath(baseDirPath)), L"Function call failed: FSEventStreamStart"); //no error code documented!
guardCreate .dismiss();
guardRunloop.dismiss();
diff --git a/zen/file_access.cpp b/zen/file_access.cpp
index 96aac081..09a1eb07 100644
--- a/zen/file_access.cpp
+++ b/zen/file_access.cpp
@@ -45,45 +45,45 @@
using namespace zen;
-bool zen::fileExists(const Zstring& filepath)
+bool zen::fileExists(const Zstring& filePath)
{
//symbolic links (broken or not) are also treated as existing files!
#ifdef ZEN_WIN
- const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(filepath).c_str());
+ const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(filePath).c_str());
if (attr != INVALID_FILE_ATTRIBUTES)
return (attr & FILE_ATTRIBUTE_DIRECTORY) == 0; //returns true for (file-)symlinks also
#elif defined ZEN_LINUX || defined ZEN_MAC
struct ::stat fileInfo = {};
- if (::stat(filepath.c_str(), &fileInfo) == 0) //follow symlinks!
+ if (::stat(filePath.c_str(), &fileInfo) == 0) //follow symlinks!
return S_ISREG(fileInfo.st_mode);
#endif
return false;
}
-bool zen::dirExists(const Zstring& dirpath)
+bool zen::dirExists(const Zstring& dirPath)
{
//symbolic links (broken or not) are also treated as existing directories!
#ifdef ZEN_WIN
- const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(dirpath).c_str());
+ const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(dirPath).c_str());
if (attr != INVALID_FILE_ATTRIBUTES)
return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0; //returns true for (dir-)symlinks also
#elif defined ZEN_LINUX || defined ZEN_MAC
struct ::stat dirInfo = {};
- if (::stat(dirpath.c_str(), &dirInfo) == 0) //follow symlinks!
+ if (::stat(dirPath.c_str(), &dirInfo) == 0) //follow symlinks!
return S_ISDIR(dirInfo.st_mode);
#endif
return false;
}
-bool zen::symlinkExists(const Zstring& linkname)
+bool zen::symlinkExists(const Zstring& linkPath)
{
#ifdef ZEN_WIN
WIN32_FIND_DATA linkInfo = {};
- const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(linkname).c_str(), &linkInfo);
+ const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(linkPath).c_str(), &linkInfo);
if (searchHandle != INVALID_HANDLE_VALUE)
{
::FindClose(searchHandle);
@@ -92,17 +92,17 @@ bool zen::symlinkExists(const Zstring& linkname)
#elif defined ZEN_LINUX || defined ZEN_MAC
struct ::stat linkInfo = {};
- if (::lstat(linkname.c_str(), &linkInfo) == 0)
+ if (::lstat(linkPath.c_str(), &linkInfo) == 0)
return S_ISLNK(linkInfo.st_mode);
#endif
return false;
}
-bool zen::somethingExists(const Zstring& objname)
+bool zen::somethingExists(const Zstring& itemPath)
{
#ifdef ZEN_WIN
- const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(objname).c_str());
+ const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(itemPath).c_str());
if (attr != INVALID_FILE_ATTRIBUTES)
return true;
const DWORD lastError = ::GetLastError();
@@ -115,7 +115,7 @@ bool zen::somethingExists(const Zstring& objname)
lastError != ERROR_BAD_NET_NAME) //
{
WIN32_FIND_DATA fileInfo = {};
- const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(objname).c_str(), &fileInfo);
+ const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(itemPath).c_str(), &fileInfo);
if (searchHandle != INVALID_HANDLE_VALUE)
{
::FindClose(searchHandle);
@@ -125,7 +125,7 @@ bool zen::somethingExists(const Zstring& objname)
#elif defined ZEN_LINUX || defined ZEN_MAC
struct ::stat fileInfo = {};
- if (::lstat(objname.c_str(), &fileInfo) == 0)
+ if (::lstat(itemPath.c_str(), &fileInfo) == 0)
return true;
#endif
return false;
@@ -172,26 +172,26 @@ bool isFatDrive(const Zstring& filePath) //throw()
}
-std::uint64_t zen::getFilesize(const Zstring& filepath) //throw FileError
+std::uint64_t zen::getFilesize(const Zstring& filePath) //throw FileError
{
#ifdef ZEN_WIN
{
WIN32_FIND_DATA fileInfo = {};
- const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filepath).c_str(), &fileInfo);
+ const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filePath).c_str(), &fileInfo);
if (searchHandle == INVALID_HANDLE_VALUE)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filepath)), L"FindFirstFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"FindFirstFile", getLastError());
::FindClose(searchHandle);
if (!isSymlink(fileInfo))
return get64BitUInt(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh);
}
// WIN32_FILE_ATTRIBUTE_DATA sourceAttr = {};
- // if (!::GetFileAttributesEx(applyLongPathPrefix(filepath).c_str(), //__in LPCTSTR lpFileName,
+ // if (!::GetFileAttributesEx(applyLongPathPrefix(filePath).c_str(), //__in LPCTSTR lpFileName,
// GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId,
// &sourceAttr)) //__out LPVOID lpFileInformation
//open handle to target of symbolic link
- const HANDLE hFile = ::CreateFile(applyLongPathPrefix(filepath).c_str(), //_In_ LPCTSTR lpFileName,
+ const HANDLE hFile = ::CreateFile(applyLongPathPrefix(filePath).c_str(), //_In_ LPCTSTR lpFileName,
0, //_In_ DWORD dwDesiredAccess,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode,
nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
@@ -199,20 +199,20 @@ std::uint64_t zen::getFilesize(const Zstring& filepath) //throw FileError
FILE_FLAG_BACKUP_SEMANTICS, /*needed to open a directory*/ //_In_ DWORD dwFlagsAndAttributes,
nullptr); //_In_opt_ HANDLE hTemplateFile
if (hFile == INVALID_HANDLE_VALUE)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filepath)), L"CreateFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"CreateFile", getLastError());
ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile));
//why not use ::GetFileSizeEx() instead???
BY_HANDLE_FILE_INFORMATION fileInfoHnd = {};
if (!::GetFileInformationByHandle(hFile, &fileInfoHnd))
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filepath)), L"GetFileInformationByHandle", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"GetFileInformationByHandle", getLastError());
return get64BitUInt(fileInfoHnd.nFileSizeLow, fileInfoHnd.nFileSizeHigh);
#elif defined ZEN_LINUX || defined ZEN_MAC
struct ::stat fileInfo = {};
- if (::stat(filepath.c_str(), &fileInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filepath)), L"stat", getLastError());
+ if (::stat(filePath.c_str(), &fileInfo) != 0)
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"stat", getLastError());
return fileInfo.st_size;
#endif
@@ -227,7 +227,7 @@ std::uint64_t zen::getFreeDiskSpace(const Zstring& path) //throw FileError, retu
&bytesFree, //__out_opt PULARGE_INTEGER lpFreeBytesAvailable,
nullptr, //__out_opt PULARGE_INTEGER lpTotalNumberOfBytes,
nullptr)) //__out_opt PULARGE_INTEGER lpTotalNumberOfFreeBytes
- throwFileError(replaceCpy(_("Cannot determine free disk space for %x."), L"%x", fmtFileName(path)), L"GetDiskFreeSpaceEx", getLastError());
+ throwFileError(replaceCpy(_("Cannot determine free disk space for %x."), L"%x", fmtPath(path)), L"GetDiskFreeSpaceEx", getLastError());
//return 0 if info is not available: "The GetDiskFreeSpaceEx function returns zero for lpFreeBytesAvailable for all CD requests"
return get64BitUInt(bytesFree.LowPart, bytesFree.HighPart);
@@ -235,47 +235,47 @@ std::uint64_t zen::getFreeDiskSpace(const Zstring& path) //throw FileError, retu
#elif defined ZEN_LINUX || defined ZEN_MAC
struct ::statfs info = {};
if (::statfs(path.c_str(), &info) != 0)
- throwFileError(replaceCpy(_("Cannot determine free disk space for %x."), L"%x", fmtFileName(path)), L"statfs", getLastError());
+ throwFileError(replaceCpy(_("Cannot determine free disk space for %x."), L"%x", fmtPath(path)), L"statfs", getLastError());
return static_cast<std::uint64_t>(info.f_bsize) * info.f_bavail;
#endif
}
-bool zen::removeFile(const Zstring& filepath) //throw FileError
+bool zen::removeFile(const Zstring& filePath) //throw FileError
{
#ifdef ZEN_WIN
const wchar_t functionName[] = L"DeleteFile";
- if (!::DeleteFile(applyLongPathPrefix(filepath).c_str()))
+ if (!::DeleteFile(applyLongPathPrefix(filePath).c_str()))
#elif defined ZEN_LINUX || defined ZEN_MAC
const wchar_t functionName[] = L"unlink";
- if (::unlink(filepath.c_str()) != 0)
+ if (::unlink(filePath.c_str()) != 0)
#endif
{
ErrorCode lastError = getLastError();
#ifdef ZEN_WIN
if (lastError == ERROR_ACCESS_DENIED) //function fails if file is read-only
{
- ::SetFileAttributes(applyLongPathPrefix(filepath).c_str(), FILE_ATTRIBUTE_NORMAL); //(try to) normalize file attributes
+ ::SetFileAttributes(applyLongPathPrefix(filePath).c_str(), FILE_ATTRIBUTE_NORMAL); //(try to) normalize file attributes
- if (::DeleteFile(applyLongPathPrefix(filepath).c_str())) //now try again...
+ if (::DeleteFile(applyLongPathPrefix(filePath).c_str())) //now try again...
return true;
lastError = ::GetLastError();
}
#endif
- if (!somethingExists(filepath)) //warning: changes global error code!!
+ if (!somethingExists(filePath)) //warning: changes global error code!!
return false; //neither file nor any other object (e.g. broken symlink) with that name existing - caveat: what if "access is denied"!?!??!?!?
//begin of "regular" error reporting
- const std::wstring errorMsg = replaceCpy(_("Cannot delete file %x."), L"%x", fmtFileName(filepath));
+ const std::wstring errorMsg = replaceCpy(_("Cannot delete file %x."), L"%x", fmtPath(filePath));
std::wstring errorDescr = formatSystemError(functionName, lastError);
#ifdef ZEN_WIN_VISTA_AND_LATER
if (lastError == ERROR_SHARING_VIOLATION || //-> enhance error message!
lastError == ERROR_LOCK_VIOLATION)
{
- const std::wstring procList = vista::getLockingProcesses(filepath); //noexcept
+ const std::wstring procList = vista::getLockingProcesses(filePath); //noexcept
if (!procList.empty())
errorDescr = _("The file is locked by another process:") + L"\n" + procList;
}
@@ -286,6 +286,91 @@ bool zen::removeFile(const Zstring& filepath) //throw FileError
}
+void zen::removeDirectorySimple(const Zstring& dirPath) //throw FileError
+{
+#ifdef ZEN_WIN
+ //(try to) normalize file attributes: actually NEEDED for symbolic links also!
+ ::SetFileAttributes(applyLongPathPrefix(dirPath).c_str(), FILE_ATTRIBUTE_NORMAL);
+
+ const wchar_t functionName[] = L"RemoveDirectory";
+ if (!::RemoveDirectory(applyLongPathPrefix(dirPath).c_str()))
+#elif defined ZEN_LINUX || defined ZEN_MAC
+ const wchar_t functionName[] = L"rmdir";
+ if (::rmdir(dirPath.c_str()) != 0)
+#endif
+ {
+ const ErrorCode ec = getLastError();
+
+ if (!somethingExists(dirPath)) //warning: changes global error code!!
+ return;
+
+#if defined ZEN_LINUX || defined ZEN_MAC
+ if (symlinkExists(dirPath))
+ {
+ if (::unlink(dirPath.c_str()) != 0)
+ throwFileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtPath(dirPath)), L"unlink", getLastError());
+ return;
+ }
+#endif
+
+ throwFileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtPath(dirPath)), functionName, ec);
+ }
+ //may spuriously fail with ERROR_DIR_NOT_EMPTY(145) even though all child items have
+ //successfully been *marked* for deletion, but some application still has a handle open!
+ //e.g. Open "C:\Test\Dir1\Dir2" (filled with lots of files) in Explorer, then delete "C:\Test\Dir1" via ::RemoveDirectory() => Error 145
+ //Sample code: http://us.generation-nt.com/answer/createfile-directory-handles-removing-parent-help-29126332.html
+}
+
+
+namespace
+{
+void removeDirectoryImpl(const Zstring& dirPath) //throw FileError
+{
+ assert(dirExists(dirPath)); //[!] no symlinks in this context!!!
+ //attention: check if dirPath is a symlink! Do NOT traverse into it deleting contained files!!!
+
+ std::vector<Zstring> fileList;
+ std::vector<Zstring> dirLinkList;
+ std::vector<Zstring> dirList;
+ //get all files and directories from current directory (WITHOUT subdirectories!)
+ traverseFolder(dirPath,
+ [&](const FileInfo& fi) { fileList.push_back(fi.fullPath); },
+ [&](const DirInfo& di) { dirList .push_back(di.fullPath); },
+ [&](const SymlinkInfo& si)
+ {
+#ifdef ZEN_WIN
+ if (dirExists(si.fullPath)) //dir symlink
+ dirLinkList.push_back(si.fullPath);
+ else //file symlink, broken symlink
+#endif
+ fileList.push_back(si.fullPath);
+ },
+ [](const std::wstring& errorMsg) { throw FileError(errorMsg); });
+
+ for (const Zstring& filePath : fileList)
+ removeFile(filePath); //throw FileError
+
+ for (const Zstring& dirLinkPath : dirLinkList)
+ removeDirectorySimple(dirLinkPath); //throw FileError
+
+ //delete directories recursively
+ for (const Zstring& subDirPath : dirList)
+ removeDirectoryImpl(subDirPath); //throw FileError; call recursively to correctly handle symbolic links
+
+ removeDirectorySimple(dirPath); //throw FileError
+}
+}
+
+
+void zen::removeDirectoryRecursively(const Zstring& dirPath) //throw FileError
+{
+ if (symlinkExists(dirPath))
+ removeDirectorySimple(dirPath); //throw FileError
+ else if (somethingExists(dirPath))
+ removeDirectoryImpl(dirPath); //throw FileError
+}
+
+
namespace
{
/* Usage overview: (avoid circular pattern!)
@@ -334,7 +419,7 @@ void renameFile_sub(const Zstring& pathSource, const Zstring& pathTarget) //thro
}
}
//begin of "regular" error reporting
- const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtFileName(pathSource)), L"%y", L"\n" + fmtFileName(pathTarget));
+ const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtPath(pathSource)), L"%y", L"\n" + fmtPath(pathTarget));
std::wstring errorDescr = formatSystemError(L"MoveFileEx", lastError);
#ifdef ZEN_WIN_VISTA_AND_LATER //(try to) enhance error message
@@ -360,7 +445,7 @@ void renameFile_sub(const Zstring& pathSource, const Zstring& pathTarget) //thro
if (::rename(pathSource.c_str(), pathTarget.c_str()) != 0)
{
const int lastError = errno; //copy before directly or indirectly making other system calls!
- const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtFileName(pathSource)), L"%y", L"\n" + fmtFileName(pathTarget));
+ const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtPath(pathSource)), L"%y", L"\n" + fmtPath(pathTarget));
const std::wstring errorDescr = formatSystemError(L"rename", lastError);
if (lastError == EXDEV)
@@ -379,17 +464,17 @@ void renameFile_sub(const Zstring& pathSource, const Zstring& pathTarget) //thro
::GetShortPathName()
::GetLongPathName() */
template <typename Function>
-Zstring getFilenameFmt(const Zstring& filepath, Function fun) //throw(); returns empty string on error
+Zstring getFilenameFmt(const Zstring& filePath, Function fun) //throw(); returns empty string on error
{
- const Zstring filepathFmt = applyLongPathPrefix(filepath);
+ const Zstring filePathFmt = applyLongPathPrefix(filePath);
- const DWORD bufferSize = fun(filepathFmt.c_str(), nullptr, 0);
+ const DWORD bufferSize = fun(filePathFmt.c_str(), nullptr, 0);
if (bufferSize == 0)
return Zstring();
std::vector<wchar_t> buffer(bufferSize);
- const DWORD charsWritten = fun(filepathFmt.c_str(), //__in LPCTSTR lpszShortPath,
+ const DWORD charsWritten = fun(filePathFmt.c_str(), //__in LPCTSTR lpszShortPath,
&buffer[0], //__out LPTSTR lpszLongPath,
bufferSize); //__in DWORD cchBuffer
if (charsWritten == 0 || charsWritten >= bufferSize)
@@ -399,18 +484,19 @@ Zstring getFilenameFmt(const Zstring& filepath, Function fun) //throw(); returns
}
-Zstring findUnused8Dot3Name(const Zstring& filepath) //find a unique 8.3 short name
+Zstring findUnused8Dot3Name(const Zstring& filePath) //find a unique 8.3 short name
{
- const Zstring pathPrefix = contains(filepath, FILE_NAME_SEPARATOR) ?
- (beforeLast(filepath, FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR) : Zstring();
+ const Zstring pathPrefix = contains(filePath, FILE_NAME_SEPARATOR) ?
+ (beforeLast(filePath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE) + FILE_NAME_SEPARATOR) : Zstring();
- Zstring extension = afterLast(afterLast(filepath, FILE_NAME_SEPARATOR), Zchar('.')); //extension needn't contain reasonable data
+ //extension needn't contain reasonable data
+ Zstring extension = getFileExtension(filePath);
if (extension.empty())
extension = Zstr("FFS");
else if (extension.length() > 3)
extension.resize(3);
- for (int index = 0; index < 100000000; ++index) //filepath must be representable by <= 8 characters
+ for (int index = 0; index < 100000000; ++index) //filePath must be representable by <= 8 characters
{
const Zstring output = pathPrefix + numberTo<Zstring>(index) + Zchar('.') + extension;
if (!somethingExists(output)) //ensure uniqueness
@@ -421,24 +507,24 @@ Zstring findUnused8Dot3Name(const Zstring& filepath) //find a unique 8.3 short n
}
-bool have8dot3NameClash(const Zstring& filepath)
+bool have8dot3NameClash(const Zstring& filePath)
{
- if (!contains(filepath, FILE_NAME_SEPARATOR))
+ if (!contains(filePath, FILE_NAME_SEPARATOR))
return false;
- if (somethingExists(filepath)) //name OR directory!
+ if (somethingExists(filePath)) //name OR directory!
{
- const Zstring origName = afterLast(filepath, FILE_NAME_SEPARATOR); //returns the whole string if ch not found
- const Zstring shortName = afterLast(getFilenameFmt(filepath, ::GetShortPathName), FILE_NAME_SEPARATOR); //throw() returns empty string on error
- const Zstring longName = afterLast(getFilenameFmt(filepath, ::GetLongPathName ), FILE_NAME_SEPARATOR); //
+ const Zstring origName = afterLast(filePath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL);
+ const Zstring shortName = afterLast(getFilenameFmt(filePath, ::GetShortPathName), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL); //throw() returns empty string on error
+ const Zstring longName = afterLast(getFilenameFmt(filePath, ::GetLongPathName ), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL); //
if (!shortName.empty() &&
!longName .empty() &&
EqualFilePath()(origName, shortName) &&
!EqualFilePath()(shortName, longName))
{
- //for filepath short and long file name are equal and another unrelated file happens to have the same short name
- //e.g. filepath == "TESTWE~1", but another file is existing named "TestWeb" with short name ""TESTWE~1"
+ //for filePath short and long file name are equal and another unrelated file happens to have the same short name
+ //e.g. filePath == "TESTWE~1", but another file is existing named "TestWeb" with short name ""TESTWE~1"
return true;
}
}
@@ -448,14 +534,17 @@ bool have8dot3NameClash(const Zstring& filepath)
class Fix8Dot3NameClash //throw FileError
{
public:
- Fix8Dot3NameClash(const Zstring& filepath)
+ Fix8Dot3NameClash(const Zstring& filePath)
{
- const Zstring longName = afterLast(getFilenameFmt(filepath, ::GetLongPathName), FILE_NAME_SEPARATOR); //throw() returns empty string on error
+ const Zstring longName = afterLast(getFilenameFmt(filePath, ::GetLongPathName), FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL); //throw() returns empty string on error
- unrelatedFile = beforeLast(filepath, FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + longName;
+ unrelatedFile = beforeLast(filePath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
+ if (!unrelatedFile.empty())
+ unrelatedFile += FILE_NAME_SEPARATOR;
+ unrelatedFile += longName;
//find another name in short format: this ensures the actual short name WILL be renamed as well!
- unrelatedFileParked = findUnused8Dot3Name(filepath);
+ unrelatedFileParked = findUnused8Dot3Name(filePath);
//move already existing short name out of the way for now
renameFile_sub(unrelatedFile, unrelatedFileParked); //throw FileError, ErrorDifferentVolume
@@ -492,7 +581,7 @@ void zen::renameFile(const Zstring& pathSource, const Zstring& pathTarget) //thr
//try to handle issues with already existing short 8.3 file names on Windows
if (have8dot3NameClash(pathTarget))
{
- Fix8Dot3NameClash dummy(pathTarget); //throw FileError; move clashing filepath to the side
+ Fix8Dot3NameClash dummy(pathTarget); //throw FileError; move clashing file path to the side
//now try again...
renameFile_sub(pathSource, pathTarget); //throw FileError
return;
@@ -505,83 +594,9 @@ void zen::renameFile(const Zstring& pathSource, const Zstring& pathTarget) //thr
namespace
{
-void removeDirectoryImpl(const Zstring& directory, //throw FileError
- const std::function<void (const Zstring& filepath)>& onBeforeFileDeletion,
- const std::function<void (const Zstring& dirpath )>& onBeforeDirDeletion)
-{
- assert(somethingExists(directory)); //[!]
#ifdef ZEN_WIN
- const Zstring directoryFmt = applyLongPathPrefix(directory); //support for \\?\-prefix
-
- //(try to) normalize file attributes: actually NEEDED for symbolic links also!
- ::SetFileAttributes(directoryFmt.c_str(), FILE_ATTRIBUTE_NORMAL);
-#endif
-
- //attention: check if directory is a symlink! Do NOT traverse into it deleting contained files!!!
- if (symlinkExists(directory)) //remove symlink directly
- {
- if (onBeforeDirDeletion)
- onBeforeDirDeletion(directory); //once per symlink
-#ifdef ZEN_WIN
- const wchar_t functionName[] = L"RemoveDirectory";
- if (!::RemoveDirectory(directoryFmt.c_str()))
-#elif defined ZEN_LINUX || defined ZEN_MAC
- const wchar_t functionName[] = L"unlink";
- if (::unlink(directory.c_str()) != 0)
-#endif
- throwFileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtFileName(directory)), functionName, getLastError());
- }
- else
- {
- std::vector<Zstring> fileList;
- std::vector<Zstring> dirList;
- //get all files and directories from current directory (WITHOUT subdirectories!)
- traverseFolder(directory,
- [&](const FileInfo& fi) { fileList.push_back(fi.fullPath); },
- [&](const DirInfo& di) { dirList .push_back(di.fullPath); },
- [&](const SymlinkInfo& si)
- {
- if (dirExists(si.fullPath)) //dir symlink
- dirList.push_back(si.fullPath);
- else //file symlink, broken symlink
- fileList.push_back(si.fullPath);
- },
- [&](const std::wstring& errorMsg) { throw FileError(errorMsg); });
-
- //delete directories recursively
- for (const Zstring& dirpath : dirList)
- removeDirectoryImpl(dirpath, onBeforeFileDeletion, onBeforeDirDeletion); //throw FileError; call recursively to correctly handle symbolic links
-
- //delete files
- for (const Zstring& filepath : fileList)
- {
- if (onBeforeFileDeletion)
- onBeforeFileDeletion(filepath); //call once per file
- removeFile(filepath); //throw FileError
- }
-
- //parent directory is deleted last
- if (onBeforeDirDeletion)
- onBeforeDirDeletion(directory); //and once per folder
-#ifdef ZEN_WIN
- const wchar_t functionName[] = L"RemoveDirectory";
- if (!::RemoveDirectory(directoryFmt.c_str()))
-#elif defined ZEN_LINUX || defined ZEN_MAC
- const wchar_t functionName[] = L"rmdir";
- if (::rmdir(directory.c_str()) != 0)
-#endif
- throwFileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtFileName(directory)), functionName, getLastError());
- //may spuriously fail with ERROR_DIR_NOT_EMPTY(145) even though all child items have
- //successfully been *marked* for deletion, but some application still has a handle open!
- //e.g. Open "C:\Test\Dir1\Dir2" (filled with lots of files) in Explorer, then delete "C:\Test\Dir1" via ::RemoveDirectory() => Error 145
- //Sample code: http://us.generation-nt.com/answer/createfile-directory-handles-removing-parent-help-29126332.html
- }
-}
-
-
-#ifdef ZEN_WIN
-void setFileTimeRaw(const Zstring& filepath,
+void setFileTimeRaw(const Zstring& filePath,
const FILETIME* creationTime, //optional
const FILETIME& lastWriteTime,
ProcSymlink procSl) //throw FileError
@@ -613,21 +628,21 @@ void setFileTimeRaw(const Zstring& filepath,
DWORD attribs = INVALID_FILE_ATTRIBUTES;
ZEN_ON_SCOPE_EXIT(
if (attribs != INVALID_FILE_ATTRIBUTES)
- ::SetFileAttributes(applyLongPathPrefix(filepath).c_str(), attribs);
+ ::SetFileAttributes(applyLongPathPrefix(filePath).c_str(), attribs);
);
auto removeReadonly = [&]() -> bool //throw FileError; may need to remove the readonly-attribute (e.g. on FAT usb drives)
{
if (attribs == INVALID_FILE_ATTRIBUTES)
{
- const DWORD tmpAttr = ::GetFileAttributes(applyLongPathPrefix(filepath).c_str());
+ const DWORD tmpAttr = ::GetFileAttributes(applyLongPathPrefix(filePath).c_str());
if (tmpAttr == INVALID_FILE_ATTRIBUTES)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filepath)), L"GetFileAttributes", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"GetFileAttributes", getLastError());
if (tmpAttr & FILE_ATTRIBUTE_READONLY)
{
- if (!::SetFileAttributes(applyLongPathPrefix(filepath).c_str(), FILE_ATTRIBUTE_NORMAL))
- throwFileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(filepath)), L"SetFileAttributes", getLastError());
+ if (!::SetFileAttributes(applyLongPathPrefix(filePath).c_str(), FILE_ATTRIBUTE_NORMAL))
+ throwFileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtPath(filePath)), L"SetFileAttributes", getLastError());
attribs = tmpAttr; //reapplied on scope exit
return true;
@@ -638,7 +653,7 @@ void setFileTimeRaw(const Zstring& filepath,
auto openFile = [&](bool conservativeApproach)
{
- return ::CreateFile(applyLongPathPrefix(filepath).c_str(), //_In_ LPCTSTR lpFileName,
+ return ::CreateFile(applyLongPathPrefix(filePath).c_str(), //_In_ LPCTSTR lpFileName,
(conservativeApproach ?
//some NAS seem to have issues with FILE_WRITE_ATTRIBUTES, even worse, they may fail silently!
//http://sourceforge.net/tracker/?func=detail&atid=1093081&aid=3536680&group_id=234430
@@ -677,7 +692,7 @@ void setFileTimeRaw(const Zstring& filepath,
continue;
//3. after these herculean stunts we give up...
- throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filepath)), L"CreateFile", lastError);
+ throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(filePath)), L"CreateFile", lastError);
}
}
break;
@@ -707,7 +722,7 @@ void setFileTimeRaw(const Zstring& filepath,
FileBasicInfo, //__in FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
&basicInfo, //__in LPVOID lpFileInformation,
sizeof(basicInfo))) //__in DWORD dwBufferSize
- throwFileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(filepath)), L"SetFileInformationByHandle", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtPath(filePath)), L"SetFileInformationByHandle", getLastError());
};
auto toLargeInteger = [](const FILETIME& ft) -> LARGE_INTEGER
@@ -745,32 +760,32 @@ void setFileTimeRaw(const Zstring& filepath,
}
}
- std::wstring errorMsg = replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filepath));
+ std::wstring errorMsg = replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(filePath));
//add more meaningful message: FAT accepts only a subset of the NTFS date range
if (lastError == ERROR_INVALID_PARAMETER &&
- isFatDrive(filepath))
+ isFatDrive(filePath))
{
//we need a low-level reliable routine to format a potentially invalid date => don't use strftime!!!
- auto fmtDate = [](const FILETIME& ft) -> Zstring
+ auto fmtDate = [](const FILETIME& ft)
{
SYSTEMTIME st = {};
if (!::FileTimeToSystemTime(&ft, //__in const FILETIME *lpFileTime,
&st)) //__out LPSYSTEMTIME lpSystemTime
- return Zstring();
+ return std::wstring();
- Zstring dateTime;
+ std::wstring dateTime;
{
const int bufferSize = ::GetDateFormat(LOCALE_USER_DEFAULT, 0, &st, nullptr, nullptr, 0);
if (bufferSize > 0)
{
std::vector<wchar_t> buffer(bufferSize);
if (::GetDateFormat(LOCALE_USER_DEFAULT, //_In_ LCID Locale,
- 0, //_In_ DWORD dwFlags,
- &st, //_In_opt_ const SYSTEMTIME *lpDate,
- nullptr, //_In_opt_ LPCTSTR lpFormat,
- &buffer[0], //_Out_opt_ LPTSTR lpDateStr,
- bufferSize) > 0) //_In_ int cchDate
+ 0, //_In_ DWORD dwFlags,
+ &st, //_In_opt_ const SYSTEMTIME *lpDate,
+ nullptr, //_In_opt_ LPCTSTR lpFormat,
+ &buffer[0], //_Out_opt_ LPTSTR lpDateStr,
+ bufferSize) > 0) //_In_ int cchDate
dateTime = &buffer[0]; //GetDateFormat() returns char count *including* 0-termination!
}
}
@@ -801,7 +816,7 @@ void setFileTimeRaw(const Zstring& filepath,
FILETIME creationTimeDbg = {};
FILETIME lastWriteTimeDbg = {};
- HANDLE hFile = ::CreateFile(applyLongPathPrefix(filepath).c_str(), //_In_ LPCTSTR lpFileName,
+ HANDLE hFile = ::CreateFile(applyLongPathPrefix(filePath).c_str(), //_In_ LPCTSTR lpFileName,
FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES, //_In_ DWORD dwDesiredAccess,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //_In_ DWORD dwShareMode,
nullptr, //_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
@@ -854,17 +869,17 @@ void setFileTimeRaw(const Zstring& filePath, const struct ::timespec& modTime, P
if (errno == EACCES) //bullshit, access denied even with 0777 permissions! => utimes should work!
throw ErrorLinuxFallbackToUtimes(L"");
- throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filePath)), L"open", getLastError());
+ throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(filePath)), L"open", getLastError());
}
ZEN_ON_SCOPE_EXIT(::close(fdFile));
if (::futimens(fdFile, newTimes) != 0)
- throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filePath)), L"futimens", getLastError());
+ throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(filePath)), L"futimens", getLastError());
}
else
{
if (::utimensat(AT_FDCWD, filePath.c_str(), newTimes, AT_SYMLINK_NOFOLLOW) != 0)
- throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filePath)), L"utimensat", getLastError());
+ throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(filePath)), L"utimensat", getLastError());
}
}
@@ -878,7 +893,7 @@ struct AttrBufFileTimes
} __attribute__((aligned(4), packed));
-void setFileTimeRaw(const Zstring& filepath,
+void setFileTimeRaw(const Zstring& filePath,
const struct ::timespec* createTime, //optional
const struct ::timespec& writeTime,
ProcSymlink procSl) //throw FileError
@@ -900,18 +915,18 @@ void setFileTimeRaw(const Zstring& filepath,
newTimes.writeTime.tv_sec = writeTime.tv_sec;
newTimes.writeTime.tv_nsec = writeTime.tv_nsec;
- const int rv = ::setattrlist(filepath.c_str(), //const char* path,
+ const int rv = ::setattrlist(filePath.c_str(), //const char* path,
&attribs, //struct ::attrlist* attrList,
createTime ? &newTimes.createTime : &newTimes.writeTime, //void* attrBuf,
(createTime ? sizeof(newTimes.createTime) : 0) + sizeof(newTimes.writeTime), //size_t attrBufSize,
procSl == ProcSymlink::DIRECT ? FSOPT_NOFOLLOW : 0); //unsigned long options
if (rv != 0)
- throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filepath)), L"setattrlist", getLastError());
+ throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(filePath)), L"setattrlist", getLastError());
}
/*
void getFileTimeRaw(int fd, //throw FileError
- const Zstring& filepath, //for error reporting only
+ const Zstring& filePath, //for error reporting only
struct ::timespec& createTime, //out
struct ::timespec& writeTime) //
{
@@ -928,7 +943,7 @@ void getFileTimeRaw(int fd, //throw FileError
sizeof(fileTimes), //size_t attrBufSize,
0); //unsigned long options
if (rv != 0)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filepath)), L"getattrlist", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(filePath)), L"getattrlist", getLastError());
createTime.tv_sec = fileTimes.createTime.tv_sec;
createTime.tv_nsec = fileTimes.createTime.tv_nsec;
@@ -940,17 +955,6 @@ void getFileTimeRaw(int fd, //throw FileError
}
-void zen::removeDirectory(const Zstring& directory, //throw FileError
- const std::function<void (const Zstring& filepath)>& onBeforeFileDeletion,
- const std::function<void (const Zstring& dirpath)>& onBeforeDirDeletion)
-{
- //no error situation if directory is not existing! manual deletion relies on it!
- if (!somethingExists(directory))
- return; //neither directory nor any other object (e.g. broken symlink) with that name existing
- removeDirectoryImpl(directory, onBeforeFileDeletion, onBeforeDirDeletion);
-}
-
-
void zen::setFileTime(const Zstring& filePath, std::int64_t modTime, ProcSymlink procSl) //throw FileError
{
#ifdef ZEN_WIN
@@ -972,12 +976,12 @@ void zen::setFileTime(const Zstring& filePath, std::int64_t modTime, ProcSymlink
if (procSl == ProcSymlink::FOLLOW)
{
if (::utimes(filePath.c_str(), writeTime) != 0)
- throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filePath)), L"utimes", getLastError());
+ throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(filePath)), L"utimes", getLastError());
}
else
{
if (::lutimes(filePath.c_str(), writeTime) != 0)
- throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filePath)), L"lutimes", getLastError());
+ throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(filePath)), L"lutimes", getLastError());
}
}
@@ -998,7 +1002,7 @@ bool zen::supportsPermissions(const Zstring& dirpath) //throw FileError
if (!::GetVolumePathName(dirpath.c_str(), //__in LPCTSTR lpszFileName,
&buffer[0], //__out LPTSTR lpszVolumePathName,
bufferSize)) //__in DWORD cchBufferLength
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(dirpath)), L"GetVolumePathName", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(dirpath)), L"GetVolumePathName", getLastError());
const Zstring volumePath = appendSeparator(&buffer[0]);
@@ -1011,7 +1015,7 @@ bool zen::supportsPermissions(const Zstring& dirpath) //throw FileError
&fsFlags, //__out_opt LPDWORD lpFileSystemFlags,
nullptr, //__out LPTSTR lpFileSystemNameBuffer,
0)) //__in DWORD nFileSystemNameSize
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(dirpath)), L"GetVolumeInformation", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(dirpath)), L"GetVolumeInformation", getLastError());
return (fsFlags & FILE_PERSISTENT_ACLS) != 0;
@@ -1037,7 +1041,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, ProcSymli
errno == EOPNOTSUPP) //extended attributes are not supported by the filesystem
return;
- throwFileError(replaceCpy(_("Cannot read security context of %x."), L"%x", fmtFileName(source)), L"getfilecon", getLastError());
+ throwFileError(replaceCpy(_("Cannot read security context of %x."), L"%x", fmtPath(source)), L"getfilecon", getLastError());
}
ZEN_ON_SCOPE_EXIT(::freecon(contextSource));
@@ -1065,7 +1069,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, ProcSymli
::setfilecon(target.c_str(), contextSource) :
::lsetfilecon(target.c_str(), contextSource);
if (rv3 < 0)
- throwFileError(replaceCpy(_("Cannot write security context of %x."), L"%x", fmtFileName(target)), L"setfilecon", getLastError());
+ throwFileError(replaceCpy(_("Cannot write security context of %x."), L"%x", fmtPath(target)), L"setfilecon", getLastError());
}
#endif //HAVE_SELINUX
@@ -1097,7 +1101,7 @@ void copyItemPermissions(const Zstring& sourcePath, const Zstring& targetPath, P
}
catch (const FileError& e)//add some more context description (e.g. user is not an admin)
{
- throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourceResolved)), e.toString());
+ throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtPath(sourceResolved)), e.toString());
}
@@ -1116,7 +1120,7 @@ void copyItemPermissions(const Zstring& sourcePath, const Zstring& targetPath, P
if (bytesNeeded > buffer.size())
buffer.resize(bytesNeeded);
else
- throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourceResolved)), L"GetFileSecurity", getLastError());
+ throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtPath(sourceResolved)), L"GetFileSecurity", getLastError());
}
SECURITY_DESCRIPTOR& secDescr = reinterpret_cast<SECURITY_DESCRIPTOR&>(buffer[0]);
@@ -1140,7 +1144,7 @@ void copyItemPermissions(const Zstring& sourcePath, const Zstring& targetPath, P
OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |
DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, //__in SECURITY_INFORMATION SecurityInformation,
&secDescr)) //__in PSECURITY_DESCRIPTOR pSecurityDescriptor
- throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(targetResolved)), L"SetFileSecurity", getLastError());
+ throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(targetResolved)), L"SetFileSecurity", getLastError());
/*
PSECURITY_DESCRIPTOR buffer = nullptr;
@@ -1232,25 +1236,25 @@ void copyItemPermissions(const Zstring& sourcePath, const Zstring& targetPath, P
if (procSl == ProcSymlink::FOLLOW)
{
if (::stat(sourcePath.c_str(), &fileInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourcePath)), L"stat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtPath(sourcePath)), L"stat", getLastError());
if (::chown(targetPath.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0) // may require admin rights!
- throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(targetPath)), L"chown", getLastError());
+ throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(targetPath)), L"chown", getLastError());
if (::chmod(targetPath.c_str(), fileInfo.st_mode) != 0)
- throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(targetPath)), L"chmod", getLastError());
+ throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(targetPath)), L"chmod", getLastError());
}
else
{
if (::lstat(sourcePath.c_str(), &fileInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourcePath)), L"lstat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtPath(sourcePath)), L"lstat", getLastError());
if (::lchown(targetPath.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0) // may require admin rights!
- throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(targetPath)), L"lchown", getLastError());
+ throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(targetPath)), L"lchown", getLastError());
if (!symlinkExists(targetPath) && //setting access permissions doesn't make sense for symlinks on Linux: there is no lchmod()
::chmod(targetPath.c_str(), fileInfo.st_mode) != 0)
- throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(targetPath)), L"chmod", getLastError());
+ throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(targetPath)), L"chmod", getLastError());
}
#elif defined ZEN_MAC
@@ -1259,7 +1263,7 @@ void copyItemPermissions(const Zstring& sourcePath, const Zstring& targetPath, P
flags |= COPYFILE_NOFOLLOW;
if (::copyfile(sourcePath.c_str(), targetPath.c_str(), 0, flags) != 0)
- throwFileError(replaceCpy(replaceCpy(_("Cannot copy permissions from %x to %y."), L"%x", L"\n" + fmtFileName(sourcePath)), L"%y", L"\n" + fmtFileName(targetPath)), L"copyfile", getLastError());
+ throwFileError(replaceCpy(replaceCpy(_("Cannot copy permissions from %x to %y."), L"%x", L"\n" + fmtPath(sourcePath)), L"%y", L"\n" + fmtPath(targetPath)), L"copyfile", getLastError());
//owner is *not* copied with ::copyfile():
@@ -1267,24 +1271,24 @@ void copyItemPermissions(const Zstring& sourcePath, const Zstring& targetPath, P
if (procSl == ProcSymlink::FOLLOW)
{
if (::stat(sourcePath.c_str(), &fileInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourcePath)), L"stat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtPath(sourcePath)), L"stat", getLastError());
if (::chown(targetPath.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0) // may require admin rights!
- throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(targetPath)), L"chown", getLastError());
+ throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(targetPath)), L"chown", getLastError());
}
else
{
if (::lstat(sourcePath.c_str(), &fileInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourcePath)), L"lstat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtPath(sourcePath)), L"lstat", getLastError());
if (::lchown(targetPath.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0) // may require admin rights!
- throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(targetPath)), L"lchown", getLastError());
+ throwFileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(targetPath)), L"lchown", getLastError());
}
#endif
}
-void makeDirectoryRecursively(const Zstring& directory) //FileError, ErrorTargetExisting
+void makeDirectoryRecursivelyImpl(const Zstring& directory) //FileError
{
assert(!endsWith(directory, FILE_NAME_SEPARATOR)); //even "C:\" should be "C:" as input!
@@ -1292,18 +1296,15 @@ void makeDirectoryRecursively(const Zstring& directory) //FileError, ErrorTarget
{
copyNewDirectory(Zstring(), directory, false /*copyFilePermissions*/); //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
}
+ catch (const ErrorTargetExisting&) {} //*something* existing: folder or FILE!
catch (const ErrorTargetPathMissing&)
{
//we need to create parent directories first
- const Zstring dirParent = beforeLast(directory, FILE_NAME_SEPARATOR);
+ const Zstring dirParent = beforeLast(directory, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE);
if (!dirParent.empty())
{
//recurse...
- try
- {
- makeDirectoryRecursively(dirParent); //throw FileError, (ErrorTargetExisting)
- }
- catch (const ErrorTargetExisting&) {} //parent directory created externally in the meantime? => NOT AN ERROR; not a directory? fail in next step!
+ makeDirectoryRecursivelyImpl(dirParent); //throw FileError
//now try again...
copyNewDirectory(Zstring(), directory, false /*copyFilePermissions*/); //throw FileError, (ErrorTargetExisting), (ErrorTargetPathMissing)
@@ -1315,32 +1316,24 @@ void makeDirectoryRecursively(const Zstring& directory) //FileError, ErrorTarget
}
-void zen::makeNewDirectory(const Zstring& directory) //throw FileError, ErrorTargetExisting
+void zen::makeDirectoryRecursively(const Zstring& dirpath) //throw FileError
{
//remove trailing separator (even for C:\ root directories)
- const Zstring dirFormatted = endsWith(directory, FILE_NAME_SEPARATOR) ?
- beforeLast(directory, FILE_NAME_SEPARATOR) :
- directory;
-
- try
- {
- makeDirectoryRecursively(dirFormatted); //FileError, ErrorTargetExisting
- }
- catch (const ErrorTargetExisting&) //*something* existing: folder or FILE!
- {
- //avoid any file system race-condition by *not* checking existence again here!!!
- throw;
- }
+ const Zstring dirFormatted = endsWith(dirpath, FILE_NAME_SEPARATOR) ?
+ beforeLast(dirpath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE) :
+ dirpath;
+ makeDirectoryRecursivelyImpl(dirFormatted); //FileError
}
+//source path is optional (may be empty)
void zen::copyNewDirectory(const Zstring& sourcePath, const Zstring& targetPath, //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
bool copyFilePermissions)
{
#ifdef ZEN_WIN
//special handling for volume root: trying to create existing root directory results in ERROR_ACCESS_DENIED rather than ERROR_ALREADY_EXISTS!
Zstring dirTmp = removeLongPathPrefix(endsWith(targetPath, FILE_NAME_SEPARATOR) ?
- beforeLast(targetPath, FILE_NAME_SEPARATOR) :
+ beforeLast(targetPath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE) :
targetPath);
if (dirTmp.size() == 2 &&
isAlpha(dirTmp[0]) && dirTmp[1] == L':')
@@ -1349,7 +1342,7 @@ void zen::copyNewDirectory(const Zstring& sourcePath, const Zstring& targetPath,
const ErrorCode lastError = somethingExists(dirTmp) ? ERROR_ALREADY_EXISTS : ERROR_PATH_NOT_FOUND; //don't use dirExists() => harmonize with ErrorTargetExisting!
- const std::wstring errorMsg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtFileName(dirTmp));
+ const std::wstring errorMsg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtPath(dirTmp));
const std::wstring errorDescr = formatSystemError(L"CreateDirectory", lastError);
if (lastError == ERROR_ALREADY_EXISTS)
@@ -1381,7 +1374,7 @@ void zen::copyNewDirectory(const Zstring& sourcePath, const Zstring& targetPath,
if (lastError != ERROR_SUCCESS)
{
- const std::wstring errorMsg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtFileName(targetPath));
+ const std::wstring errorMsg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtPath(targetPath));
const std::wstring errorDescr = formatSystemError(L"CreateDirectory", lastError);
if (lastError == ERROR_ALREADY_EXISTS)
@@ -1393,7 +1386,7 @@ void zen::copyNewDirectory(const Zstring& sourcePath, const Zstring& targetPath,
}
#elif defined ZEN_LINUX || defined ZEN_MAC
- mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; //= default for newly created directory
+ mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; //0777, default for newly created directories
struct ::stat dirInfo = {};
if (!sourcePath.empty())
@@ -1407,7 +1400,7 @@ void zen::copyNewDirectory(const Zstring& sourcePath, const Zstring& targetPath,
if (::mkdir(targetPath.c_str(), mode) != 0)
{
const int lastError = errno; //copy before directly or indirectly making other system calls!
- const std::wstring errorMsg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtFileName(targetPath));
+ const std::wstring errorMsg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtPath(targetPath));
const std::wstring errorDescr = formatSystemError(L"mkdir", lastError);
if (lastError == EEXIST)
@@ -1487,7 +1480,7 @@ void zen::copyNewDirectory(const Zstring& sourcePath, const Zstring& targetPath,
/*int rv =*/ ::copyfile(sourcePath.c_str(), targetPath.c_str(), 0, COPYFILE_XATTR);
#endif
- zen::ScopeGuard guardNewDir = zen::makeGuard([&] { try { removeDirectory(targetPath); } catch (FileError&) {} }); //ensure cleanup:
+ zen::ScopeGuard guardNewDir = zen::makeGuard([&] { try { removeDirectorySimple(targetPath); } catch (FileError&) {} }); //ensure cleanup:
//enforce copying file permissions: it's advertized on GUI...
if (copyFilePermissions)
@@ -1513,7 +1506,7 @@ void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool
const SysDllFun<CreateSymbolicLinkFunc> createSymbolicLink(L"kernel32.dll", "CreateSymbolicLinkW");
if (!createSymbolicLink)
- throw FileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."), L"%x", L"\n" + fmtFileName(sourceLink)), L"%y", L"\n" + fmtFileName(targetLink)),
+ throw FileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."), L"%x", L"\n" + fmtPath(sourceLink)), L"%y", L"\n" + fmtPath(targetLink)),
replaceCpy(_("Cannot find system function %x."), L"%x", L"\"CreateSymbolicLinkW\""));
const wchar_t functionName[] = L"CreateSymbolicLinkW";
@@ -1524,7 +1517,7 @@ void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool
const wchar_t functionName[] = L"symlink";
if (::symlink(linkPath.c_str(), targetLink.c_str()) != 0)
#endif
- throwFileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."), L"%x", L"\n" + fmtFileName(sourceLink)), L"%y", L"\n" + fmtFileName(targetLink)), functionName, getLastError());
+ throwFileError(replaceCpy(replaceCpy(_("Cannot copy symbolic link %x to %y."), L"%x", L"\n" + fmtPath(sourceLink)), L"%y", L"\n" + fmtPath(targetLink)), functionName, getLastError());
//allow only consistent objects to be created -> don't place before ::symlink, targetLink may already exist!
zen::ScopeGuard guardNewLink = zen::makeGuard([&]
@@ -1533,7 +1526,7 @@ void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool
{
#ifdef ZEN_WIN
if (isDirLink)
- removeDirectory(targetLink); //throw FileError
+ removeDirectorySimple(targetLink); //throw FileError
else
#endif
removeFile(targetLink); //throw FileError
@@ -1547,24 +1540,24 @@ void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool
if (!::GetFileAttributesEx(applyLongPathPrefix(sourceLink).c_str(), //__in LPCTSTR lpFileName,
GetFileExInfoStandard, //__in GET_FILEEX_INFO_LEVELS fInfoLevelId,
&sourceAttr)) //__out LPVOID lpFileInformation
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceLink)), L"GetFileAttributesEx", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(sourceLink)), L"GetFileAttributesEx", getLastError());
setFileTimeRaw(targetLink, &sourceAttr.ftCreationTime, sourceAttr.ftLastWriteTime, ProcSymlink::DIRECT); //throw FileError
#elif defined ZEN_LINUX
struct ::stat sourceInfo = {};
if (::lstat(sourceLink.c_str(), &sourceInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceLink)), L"lstat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(sourceLink)), L"lstat", getLastError());
setFileTime(targetLink, sourceInfo.st_mtime, ProcSymlink::DIRECT); //throw FileError
#elif defined ZEN_MAC
struct ::stat sourceInfo = {};
if (::lstat(sourceLink.c_str(), &sourceInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceLink)), L"lstat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(sourceLink)), L"lstat", getLastError());
if (::copyfile(sourceLink.c_str(), targetLink.c_str(), 0, COPYFILE_XATTR | COPYFILE_NOFOLLOW) != 0)
- throwFileError(replaceCpy(replaceCpy(_("Cannot copy attributes from %x to %y."), L"%x", L"\n" + fmtFileName(sourceLink)), L"%y", L"\n" + fmtFileName(targetLink)), L"copyfile", getLastError());
+ throwFileError(replaceCpy(replaceCpy(_("Cannot copy attributes from %x to %y."), L"%x", L"\n" + fmtPath(sourceLink)), L"%y", L"\n" + fmtPath(targetLink)), L"copyfile", getLastError());
setFileTimeRaw(targetLink, &sourceInfo.st_birthtimespec, sourceInfo.st_mtimespec, ProcSymlink::DIRECT); //throw FileError
#endif
@@ -1731,7 +1724,7 @@ InSyncAttributes copyFileWindowsBackupStream(const Zstring& sourceFile, //throw
{
const DWORD lastError = ::GetLastError(); //copy before directly or indirectly making other system calls!
- const std::wstring errorMsg = replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile));
+ const std::wstring errorMsg = replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(sourceFile));
std::wstring errorDescr = formatSystemError(L"CreateFile", lastError);
//if file is locked throw "ErrorFileLocked" instead!
@@ -1753,12 +1746,12 @@ InSyncAttributes copyFileWindowsBackupStream(const Zstring& sourceFile, //throw
//----------------------------------------------------------------------
BY_HANDLE_FILE_INFORMATION fileInfoSource = {};
if (!::GetFileInformationByHandle(hFileSource, &fileInfoSource))
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceFile)), L"GetFileInformationByHandle", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(sourceFile)), L"GetFileInformationByHandle", getLastError());
//encrypted files cannot be read with BackupRead which would fail silently!
const bool sourceIsEncrypted = (fileInfoSource.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) != 0;
if (sourceIsEncrypted)
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)), L"BackupRead: Source file is encrypted.");
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(sourceFile)), L"BackupRead: Source file is encrypted.");
//----------------------------------------------------------------------
const DWORD validAttribs = FILE_ATTRIBUTE_NORMAL | //"This attribute is valid only if used alone."
@@ -1785,7 +1778,7 @@ InSyncAttributes copyFileWindowsBackupStream(const Zstring& sourceFile, //throw
if (hFileTarget == INVALID_HANDLE_VALUE)
{
const DWORD lastError = ::GetLastError(); //copy before directly or indirectly making other system calls!
- const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile));
+ const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(targetFile));
const std::wstring errorDescr = formatSystemError(L"CreateFile", lastError);
if (lastError == ERROR_FILE_EXISTS || //confirmed to be used
@@ -1802,7 +1795,7 @@ InSyncAttributes copyFileWindowsBackupStream(const Zstring& sourceFile, //throw
//----------------------------------------------------------------------
BY_HANDLE_FILE_INFORMATION fileInfoTarget = {};
if (!::GetFileInformationByHandle(hFileTarget, &fileInfoTarget))
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(targetFile)), L"GetFileInformationByHandle", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(targetFile)), L"GetFileInformationByHandle", getLastError());
//return up-to-date file attributes
InSyncAttributes newAttrib = {};
@@ -1853,7 +1846,7 @@ InSyncAttributes copyFileWindowsBackupStream(const Zstring& sourceFile, //throw
0, //_In_ DWORD nOutBufferSize,
&bytesReturned, //_Out_opt_ LPDWORD lpBytesReturned,
nullptr)) //_Inout_opt_ LPOVERLAPPED lpOverlapped
- throwFileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(targetFile)), L"DeviceIoControl, FSCTL_SET_SPARSE", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtPath(targetFile)), L"DeviceIoControl, FSCTL_SET_SPARSE", getLastError());
}
//----------------------------------------------------------------------
@@ -1880,10 +1873,10 @@ InSyncAttributes copyFileWindowsBackupStream(const Zstring& sourceFile, //throw
false, //__in BOOL bAbort,
false, //__in BOOL bProcessSecurity,
&contextRead)) //__out LPVOID *lpContext
- throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)), L"BackupRead", getLastError()); //better use fine-granular error messages "reading/writing"!
+ throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(sourceFile)), L"BackupRead", getLastError()); //better use fine-granular error messages "reading/writing"!
if (bytesRead > BUFFER_SIZE)
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)), L"BackupRead: buffer overflow."); //user should never see this
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(sourceFile)), L"BackupRead: buffer overflow."); //user should never see this
if (bytesRead < BUFFER_SIZE)
eof = true;
@@ -1896,10 +1889,10 @@ InSyncAttributes copyFileWindowsBackupStream(const Zstring& sourceFile, //throw
false, //__in BOOL bAbort,
false, //__in BOOL bProcessSecurity,
&contextWrite)) //__out LPVOID *lpContext
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile)), L"BackupWrite", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(targetFile)), L"BackupWrite", getLastError());
if (bytesWritten != bytesRead)
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile)), L"BackupWrite: incomplete write."); //user should never see this
+ throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(targetFile)), L"BackupWrite: incomplete write."); //user should never see this
//total bytes transferred may be larger than file size! context information + ADS or smaller (sparse, compressed)!
if (onUpdateCopyStatus) onUpdateCopyStatus(bytesRead); //throw X!
@@ -1912,14 +1905,14 @@ InSyncAttributes copyFileWindowsBackupStream(const Zstring& sourceFile, //throw
//::BackupRead() silently fails reading encrypted files -> double check!
if (!someBytesRead && get64BitUInt(fileInfoSource.nFileSizeLow, fileInfoSource.nFileSizeHigh) != 0U)
//note: there is no guaranteed ordering relation beween bytes transferred and file size! Consider ADS (>) and compressed/sparse files (<)!
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)), L"BackupRead: unknown error"); //user should never see this -> this method is called only if "canCopyAsSparse()"
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(sourceFile)), L"BackupRead: unknown error"); //user should never see this -> this method is called only if "canCopyAsSparse()"
//time needs to be set at the end: BackupWrite() changes modification time
if (!::SetFileTime(hFileTarget,
&fileInfoSource.ftCreationTime,
nullptr,
&fileInfoSource.ftLastWriteTime))
- throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(targetFile)), L"SetFileTime", getLastError());
+ throwFileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtPath(targetFile)), L"SetFileTime", getLastError());
guardTarget.dismiss();
return newAttrib;
@@ -1992,10 +1985,10 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize,
{
//#################### return source file attributes ################################
if (!::GetFileInformationByHandle(hSourceFile, &cbd.fileInfoSrc))
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(cbd.sourceFile_)), L"GetFileInformationByHandle", ::GetLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(cbd.sourceFile_)), L"GetFileInformationByHandle", ::GetLastError());
if (!::GetFileInformationByHandle(hDestinationFile, &cbd.fileInfoTrg))
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(cbd.targetFile_)), L"GetFileInformationByHandle", ::GetLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(cbd.targetFile_)), L"GetFileInformationByHandle", ::GetLastError());
//#################### switch to sparse file copy if req. #######################
#ifdef ZEN_WIN_VISTA_AND_LATER
@@ -2046,7 +2039,9 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize,
return PROGRESS_CONTINUE;
}
-
+#if defined _MSC_VER && _MSC_VER > 1800
+ #error get rid!
+#endif
const bool supportNonEncryptedDestination = winXpOrLater(); //encrypted destination is not supported with Windows 2000
//caveat: function scope static initialization is not thread-safe in VS 2010! -> still not sufficient if multiple threads access during static init!!!
@@ -2109,7 +2104,7 @@ InSyncAttributes copyFileWindowsDefault(const Zstring& sourceFile, //throw FileE
throw ErrorFallbackToCopyAsBackupStream(L"bogus file not found");
//assemble error message...
- const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot copy file %x to %y."), L"%x", L"\n" + fmtFileName(sourceFile)), L"%y", L"\n" + fmtFileName(targetFile));
+ const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot copy file %x to %y."), L"%x", L"\n" + fmtPath(sourceFile)), L"%y", L"\n" + fmtPath(targetFile));
std::wstring errorDescr = formatSystemError(L"CopyFileEx", lastError);
//if file is locked throw "ErrorFileLocked" instead!
@@ -2121,7 +2116,7 @@ InSyncAttributes copyFileWindowsDefault(const Zstring& sourceFile, //throw FileE
if (!procList.empty())
errorDescr = _("The file is locked by another process:") + L"\n" + procList;
#endif
- throw ErrorFileLocked(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)), errorDescr);
+ throw ErrorFileLocked(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(sourceFile)), errorDescr);
}
//if target is existing this functions is expected to throw ErrorTargetExisting!!!
@@ -2143,7 +2138,7 @@ InSyncAttributes copyFileWindowsDefault(const Zstring& sourceFile, //throw FileE
errorDescr += L"\nFAT volumes cannot store files larger than 4 gigabytes.";
//see "Limitations of the FAT32 File System": http://support.microsoft.com/kb/314463/en-us
- //note: ERROR_INVALID_PARAMETER can also occur when copying to a SharePoint server or MS SkyDrive and the target filepath is of a restricted type.
+ //note: ERROR_INVALID_PARAMETER can also occur when copying to a SharePoint server or MS SkyDrive and the target file path is of a restricted type.
}
catch (FileError&) {}
@@ -2195,8 +2190,8 @@ InSyncAttributes copyFileOsSpecific(const Zstring& sourceFile,
//try to handle issues with already existing short 8.3 file names on Windows
if (have8dot3NameClash(targetFile))
{
- Fix8Dot3NameClash dummy(targetFile); //throw FileError; move clashing filepath to the side
- return copyFileWindowsSelectRoutine(sourceFile, targetFile, onUpdateCopyStatus); //throw FileError; the short filepath name clash is solved, this should work now
+ Fix8Dot3NameClash dummy(targetFile); //throw FileError; move clashing file path to the side
+ return copyFileWindowsSelectRoutine(sourceFile, targetFile, onUpdateCopyStatus); //throw FileError; the short file path name clash is solved, this should work now
}
throw;
}
@@ -2212,7 +2207,7 @@ InSyncAttributes copyFileOsSpecific(const Zstring& sourceFile, //throw FileError
struct ::stat sourceInfo = {};
if (::fstat(fileIn.getHandle(), &sourceInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceFile)), L"fstat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(sourceFile)), L"fstat", getLastError());
const int fdTarget = ::open(targetFile.c_str(), O_WRONLY | O_CREAT | O_EXCL,
sourceInfo.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)); //analog to "cp" which copies "mode" (considering umask) by default
@@ -2220,7 +2215,7 @@ InSyncAttributes copyFileOsSpecific(const Zstring& sourceFile, //throw FileError
if (fdTarget == -1)
{
const int ec = errno; //copy before making other system calls!
- const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile));
+ const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(targetFile));
const std::wstring errorDescr = formatSystemError(L"open", ec);
if (ec == EEXIST)
@@ -2243,7 +2238,7 @@ InSyncAttributes copyFileOsSpecific(const Zstring& sourceFile, //throw FileError
struct ::stat targetInfo = {};
if (::fstat(fileOut.getHandle(), &targetInfo) != 0)
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(targetFile)), L"fstat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(targetFile)), L"fstat", getLastError());
newAttrib.fileSize = sourceInfo.st_size;
#ifdef ZEN_MAC
@@ -2261,7 +2256,7 @@ InSyncAttributes copyFileOsSpecific(const Zstring& sourceFile, //throw FileError
//docs: http://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/copyfile.3.html
//source: http://www.opensource.apple.com/source/copyfile/copyfile-103.92.1/copyfile.c
if (::fcopyfile(fileIn.getHandle(), fileOut.getHandle(), 0, COPYFILE_XATTR) != 0)
- throwFileError(replaceCpy(replaceCpy(_("Cannot copy attributes from %x to %y."), L"%x", L"\n" + fmtFileName(sourceFile)), L"%y", L"\n" + fmtFileName(targetFile)), L"copyfile", getLastError());
+ throwFileError(replaceCpy(replaceCpy(_("Cannot copy attributes from %x to %y."), L"%x", L"\n" + fmtPath(sourceFile)), L"%y", L"\n" + fmtPath(targetFile)), L"copyfile", getLastError());
#endif
fileOut.close(); //throw FileError -> optional, but good place to catch errors when closing stream!
diff --git a/zen/file_access.h b/zen/file_access.h
index 0dfb650e..4b1c31dd 100644
--- a/zen/file_access.h
+++ b/zen/file_access.h
@@ -14,10 +14,10 @@
namespace zen
{
-bool fileExists (const Zstring& filepath); //noexcept; check whether file or file-symlink exists
-bool dirExists (const Zstring& dirpath ); //noexcept; check whether directory or dir-symlink exists
-bool symlinkExists (const Zstring& linkname); //noexcept; check whether a symbolic link exists
-bool somethingExists(const Zstring& objname ); //noexcept; check whether any object with this name exists
+bool fileExists (const Zstring& filePath); //noexcept; check whether file or file-symlink exists
+bool dirExists (const Zstring& dirPath ); //noexcept; check whether directory or dir-symlink exists
+bool symlinkExists (const Zstring& linkPath); //noexcept; check whether a symbolic link exists
+bool somethingExists(const Zstring& itemPath); //noexcept; check whether any object with this name exists
enum class ProcSymlink
{
@@ -25,27 +25,29 @@ enum class ProcSymlink
FOLLOW
};
-void setFileTime(const Zstring& filepath, std::int64_t modificationTime, ProcSymlink procSl); //throw FileError
+void setFileTime(const Zstring& filePath, std::int64_t modificationTime, ProcSymlink procSl); //throw FileError
//symlink handling: always evaluate target
-std::uint64_t getFilesize(const Zstring& filepath); //throw FileError
+std::uint64_t getFilesize(const Zstring& filePath); //throw FileError
std::uint64_t getFreeDiskSpace(const Zstring& path); //throw FileError, returns 0 if not available
-bool removeFile(const Zstring& filepath); //throw FileError; return "false" if file is not existing
-void removeDirectory(const Zstring& directory, //throw FileError
- const std::function<void (const Zstring& filepath)>& onBeforeFileDeletion = nullptr, //optional;
- const std::function<void (const Zstring& dirpath )>& onBeforeDirDeletion = nullptr); //one call for each *existing* object!
+bool removeFile(const Zstring& filePath); //throw FileError; return "false" if file is not existing
+
+void removeDirectorySimple(const Zstring& dirPath); //throw FileError
+
+void removeDirectoryRecursively(const Zstring& dirPath); //throw FileError
//rename file or directory: no copying!!!
void renameFile(const Zstring& itemPathOld, const Zstring& itemPathNew); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
bool supportsPermissions(const Zstring& dirpath); //throw FileError, dereferences symlinks
-//if parent directory not existing: create recursively:
-void makeNewDirectory(const Zstring& directory); //throw FileError, ErrorTargetExisting
+//- no error if already existing
+//- create recursively if parent directory is not existing
+void makeDirectoryRecursively(const Zstring& dirpath); //throw FileError
//fail if already existing or parent directory not existing:
-//directory should not end with path separator
+//source path is optional (may be empty)
void copyNewDirectory(const Zstring& sourcePath, const Zstring& targetPath, bool copyFilePermissions); //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing
void copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool copyFilePermissions); //throw FileError
diff --git a/zen/file_error.h b/zen/file_error.h
index 4ba05107..d8c6224c 100644
--- a/zen/file_error.h
+++ b/zen/file_error.h
@@ -47,22 +47,14 @@ void throwFileError(const std::wstring& msg, const std::wstring& functionName, c
//----------- facilitate usage of std::wstring for error messages --------------------
-//allow implicit UTF8 conversion: since std::wstring models a GUI string, convenience is more important than performance
inline
-std::wstring operator+(const std::wstring& lhs, const Zstring& rhs) { return std::wstring(lhs) += utfCvrtTo<std::wstring>(rhs); }
-
-//we musn't put our overloads in namespace std, but namespace zen (+ using directive) is sufficient
-
-
-inline
-std::wstring fmtFileName(const Zstring& filepath)
+std::wstring fmtPath(const std::wstring& displayPath)
{
- std::wstring output;
- output += L'\"';
- output += utfCvrtTo<std::wstring>(filepath);
- output += L'\"';
- return output;
+ return L'\"' + displayPath + L'\"';
}
+
+inline std::wstring fmtPath(const Zstring& displayPath) { return fmtPath(utfCvrtTo<std::wstring>(displayPath)); }
+inline std::wstring fmtPath(const wchar_t* displayPath) { return fmtPath(std::wstring(displayPath)); }
}
#endif //FILEERROR_H_INCLUDED_839567308565656789
diff --git a/zen/file_io.cpp b/zen/file_io.cpp
index 5d7fa8c5..1ea8b1b1 100644
--- a/zen/file_io.cpp
+++ b/zen/file_io.cpp
@@ -9,7 +9,7 @@
#ifdef ZEN_WIN
#include "long_path_prefix.h"
-#include "privilege.h"
+ #include "privilege.h"
#ifdef ZEN_WIN_VISTA_AND_LATER
#include "vista_file_op.h"
#endif
@@ -49,17 +49,28 @@ void checkForUnsupportedType(const Zstring& filepath) //throw FileError
const std::wstring numFmt = printNumber<std::wstring>(L"0%06o", m & S_IFMT);
return name ? numFmt + L", " + name : numFmt;
};
- throw FileError(replaceCpy(_("Type of item %x is not supported:"), L"%x", fmtFileName(filepath)) + L" " + getTypeName(fileInfo.st_mode));
+ throw FileError(replaceCpy(_("Type of item %x is not supported:"), L"%x", fmtPath(filepath)) + L" " + getTypeName(fileInfo.st_mode));
}
}
#endif
+
+inline
+FileHandle getInvalidHandle()
+{
+#ifdef ZEN_WIN
+ return INVALID_HANDLE_VALUE;
+#elif defined ZEN_LINUX || defined ZEN_MAC
+ return -1;
+#endif
+}
}
FileInput::FileInput(FileHandle handle, const Zstring& filepath) : FileBase(filepath), fileHandle(handle) {}
-FileInput::FileInput(const Zstring& filepath) : FileBase(filepath) //throw FileError, ErrorFileLocked
+FileInput::FileInput(const Zstring& filepath) : //throw FileError, ErrorFileLocked
+ FileBase(filepath), fileHandle(getInvalidHandle())
{
#ifdef ZEN_WIN
try { activatePrivilege(SE_BACKUP_NAME); }
@@ -97,7 +108,7 @@ FileInput::FileInput(const Zstring& filepath) : FileBase(filepath) //throw FileE
for FFS most comparisons are probably between different disks => let's use FILE_FLAG_SEQUENTIAL_SCAN
*/
- | FILE_FLAG_BACKUP_SEMANTICS,
+ | FILE_FLAG_BACKUP_SEMANTICS,
nullptr); //_In_opt_ HANDLE hTemplateFile
};
fileHandle = createHandle(FILE_SHARE_READ | FILE_SHARE_DELETE);
@@ -111,7 +122,7 @@ FileInput::FileInput(const Zstring& filepath) : FileBase(filepath) //throw FileE
if (fileHandle == INVALID_HANDLE_VALUE)
{
const DWORD ec = ::GetLastError(); //copy before directly or indirectly making other system calls!
- const std::wstring errorMsg = replaceCpy(_("Cannot open file %x."), L"%x", fmtFileName(filepath));
+ const std::wstring errorMsg = replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(filepath));
std::wstring errorDescr = formatSystemError(L"CreateFile", ec);
if (ec == ERROR_SHARING_VIOLATION || //-> enhance error message!
@@ -134,27 +145,40 @@ FileInput::FileInput(const Zstring& filepath) : FileBase(filepath) //throw FileE
//don't use O_DIRECT: http://yarchive.net/comp/linux/o_direct.html
fileHandle = ::open(filepath.c_str(), O_RDONLY);
if (fileHandle == -1) //don't check "< 0" -> docu seems to allow "-2" to be a valid file handle
- throwFileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtFileName(filepath)), L"open", getLastError());
+ throwFileError(replaceCpy(_("Cannot open file %x."), L"%x", fmtPath(filepath)), L"open", getLastError());
+#endif
+ //------------------------------------------------------------------------------------------------------
-#ifdef ZEN_LINUX
+ ScopeGuard constructorGuard = zen::makeGuard([&] //destructor call would lead to member double clean-up!!!
+ {
+#ifdef ZEN_WIN
+ ::CloseHandle(fileHandle);
+#elif defined ZEN_LINUX || defined ZEN_MAC
+ ::close(fileHandle);
+#endif
+ });
+
+#ifdef ZEN_LINUX //handle still un-owned => need constructor guard
//optimize read-ahead on input file:
if (::posix_fadvise(fileHandle, 0, 0, POSIX_FADV_SEQUENTIAL) != 0)
- throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filepath)), L"posix_fadvise", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(filepath)), L"posix_fadvise", getLastError());
#elif defined ZEN_MAC
//"dtruss" doesn't show use of "fcntl() F_RDAHEAD/F_RDADVISE" for "cp")
#endif
-#endif
+
+ constructorGuard.dismiss();
}
FileInput::~FileInput()
{
+ if (fileHandle != getInvalidHandle())
#ifdef ZEN_WIN
- ::CloseHandle(fileHandle);
+ ::CloseHandle(fileHandle);
#elif defined ZEN_LINUX || defined ZEN_MAC
- ::close(fileHandle);
+ ::close(fileHandle);
#endif
}
@@ -173,7 +197,7 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //throw FileError; retu
static_cast<DWORD>(bytesToRead), //__in DWORD nNumberOfBytesToRead,
&bytesRead, //__out_opt LPDWORD lpNumberOfBytesRead,
nullptr)) //__inout_opt LPOVERLAPPED lpOverlapped
- throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilePath())), L"ReadFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(getFilePath())), L"ReadFile", getLastError());
#elif defined ZEN_LINUX || defined ZEN_MAC
ssize_t bytesRead = 0;
@@ -184,12 +208,13 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //throw FileError; retu
while (bytesRead < 0 && errno == EINTR); //Compare copy_reg() in copy.c: ftp://ftp.gnu.org/gnu/coreutils/coreutils-8.23.tar.xz
if (bytesRead < 0)
- throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilePath())), L"read", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(getFilePath())), L"read", getLastError());
#endif
if (bytesRead == 0) //"zero indicates end of file"
return bytesReadTotal;
- else if (static_cast<size_t>(bytesRead) > bytesToRead) //better safe than sorry
- throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilePath())), L"ReadFile: buffer overflow."); //user should never see this
+
+ if (static_cast<size_t>(bytesRead) > bytesToRead) //better safe than sorry
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtPath(getFilePath())), L"ReadFile: buffer overflow."); //user should never see this
//if ::read is interrupted (EINTR) right in the middle, it will return successfully with "bytesRead < bytesToRead" => loop!
buffer = static_cast<char*>(buffer) + bytesRead; //suppress warning about pointer arithmetics on void*
@@ -204,7 +229,8 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //throw FileError; retu
FileOutput::FileOutput(FileHandle handle, const Zstring& filepath) : FileBase(filepath), fileHandle(handle) {}
-FileOutput::FileOutput(const Zstring& filepath, AccessFlag access) : FileBase(filepath) //throw FileError, ErrorTargetExisting
+FileOutput::FileOutput(const Zstring& filepath, AccessFlag access) : //throw FileError, ErrorTargetExisting
+ FileBase(filepath), fileHandle(getInvalidHandle())
{
#ifdef ZEN_WIN
try { activatePrivilege(SE_BACKUP_NAME); }
@@ -229,7 +255,7 @@ FileOutput::FileOutput(const Zstring& filepath, AccessFlag access) : FileBase(fi
dwCreationDisposition, //_In_ DWORD dwCreationDisposition,
dwFlagsAndAttributes |
FILE_FLAG_SEQUENTIAL_SCAN //_In_ DWORD dwFlagsAndAttributes,
- | FILE_FLAG_BACKUP_SEMANTICS,
+ | FILE_FLAG_BACKUP_SEMANTICS,
nullptr); //_In_opt_ HANDLE hTemplateFile
};
@@ -252,7 +278,7 @@ FileOutput::FileOutput(const Zstring& filepath, AccessFlag access) : FileBase(fi
//begin of "regular" error reporting
if (fileHandle == INVALID_HANDLE_VALUE)
{
- const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filepath));
+ const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(filepath));
std::wstring errorDescr = formatSystemError(L"CreateFile", ec);
#ifdef ZEN_WIN_VISTA_AND_LATER //(try to) enhance error message
@@ -281,7 +307,7 @@ FileOutput::FileOutput(const Zstring& filepath, AccessFlag access) : FileBase(fi
if (fileHandle == -1)
{
const int ec = errno; //copy before making other system calls!
- const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filepath));
+ const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(filepath));
const std::wstring errorDescr = formatSystemError(L"open", ec);
if (ec == EEXIST)
@@ -291,23 +317,20 @@ FileOutput::FileOutput(const Zstring& filepath, AccessFlag access) : FileBase(fi
throw FileError(errorMsg, errorDescr);
}
#endif
-}
+ //------------------------------------------------------------------------------------------------------
-namespace
-{
-inline
-FileHandle getInvalidHandle()
-{
-#ifdef ZEN_WIN
- return INVALID_HANDLE_VALUE;
-#elif defined ZEN_LINUX || defined ZEN_MAC
- return -1;
-#endif
-}
+ //ScopeGuard constructorGuard = zen::makeGuard
+
+ //guard handle when adding code!!!
+
+ //constructorGuard.dismiss();
}
+FileOutput::FileOutput(FileOutput&& tmp) : FileBase(tmp.getFilePath()), fileHandle(tmp.fileHandle) { tmp.fileHandle = getInvalidHandle(); }
+
+
FileOutput::~FileOutput()
{
if (fileHandle != getInvalidHandle())
@@ -322,17 +345,17 @@ FileOutput::~FileOutput()
void FileOutput::close() //throw FileError
{
if (fileHandle == getInvalidHandle())
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilePath())), L"Contract error: close() called more than once.");
+ throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getFilePath())), L"Contract error: close() called more than once.");
ZEN_ON_SCOPE_EXIT(fileHandle = getInvalidHandle());
//no need to clean-up on failure here (just like there is no clean on FileOutput::write failure!) => FileOutput is not transactional!
#ifdef ZEN_WIN
if (!::CloseHandle(fileHandle))
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilePath())), L"CloseHandle", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getFilePath())), L"CloseHandle", getLastError());
#elif defined ZEN_LINUX || defined ZEN_MAC
if (::close(fileHandle) != 0)
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilePath())), L"close", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getFilePath())), L"close", getLastError());
#endif
}
@@ -346,10 +369,10 @@ void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw FileErro
static_cast<DWORD>(bytesToWrite), //__in DWORD nNumberOfBytesToWrite,
&bytesWritten, //__out_opt LPDWORD lpNumberOfBytesWritten,
nullptr)) //__inout_opt LPOVERLAPPED lpOverlapped
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilePath())), L"WriteFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getFilePath())), L"WriteFile", getLastError());
if (bytesWritten != bytesToWrite) //must be fulfilled for synchronous writes!
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilePath())), L"WriteFile: incomplete write."); //user should never see this
+ throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getFilePath())), L"WriteFile: incomplete write."); //user should never see this
#elif defined ZEN_LINUX || defined ZEN_MAC
while (bytesToWrite > 0)
@@ -366,10 +389,10 @@ void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw FileErro
if (bytesWritten == 0) //comment in safe-read.c suggests to treat this as an error due to buggy drivers
errno = ENOSPC;
- throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilePath())), L"write", getLastError());
+ throwFileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getFilePath())), L"write", getLastError());
}
if (bytesWritten > static_cast<ssize_t>(bytesToWrite)) //better safe than sorry
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilePath())), L"write: buffer overflow."); //user should never see this
+ throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtPath(getFilePath())), L"write: buffer overflow."); //user should never see this
//if ::write() is interrupted (EINTR) right in the middle, it will return successfully with "bytesWritten < bytesToWrite"!
buffer = static_cast<const char*>(buffer) + bytesWritten; //suppress warning about pointer arithmetics on void*
diff --git a/zen/file_io.h b/zen/file_io.h
index 648bafe8..52be7f95 100644
--- a/zen/file_io.h
+++ b/zen/file_io.h
@@ -81,6 +81,8 @@ public:
FileHandle getHandle() { return fileHandle; }
size_t optimalBlockSize() const { return 128 * 1024; }
+ FileOutput(FileOutput&& tmp);
+
private:
FileHandle fileHandle;
};
diff --git a/zen/file_traverser.cpp b/zen/file_traverser.cpp
index 66dcd198..3ef94032 100644
--- a/zen/file_traverser.cpp
+++ b/zen/file_traverser.cpp
@@ -47,7 +47,7 @@ void zen::traverseFolder(const Zstring& dirPath,
if (dirExists(dirPath)) //yes, a race-condition, still the best we can do
return;
}
- throwFileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(dirPath)), L"FindFirstFile", lastError);
+ throwFileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtPath(dirPath)), L"FindFirstFile", lastError);
}
ZEN_ON_SCOPE_EXIT(::FindClose(hDir));
@@ -62,13 +62,13 @@ void zen::traverseFolder(const Zstring& dirPath,
if (lastError == ERROR_NO_MORE_FILES) //not an error situation
return;
//else we have a problem... report it:
- throwFileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirPath)), L"FindNextFile", lastError);
+ throwFileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtPath(dirPath)), L"FindNextFile", lastError);
}
//skip "." and ".."
const Zchar* const shortName = findData.cFileName;
- if (shortName[0] == 0) throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirPath)), L"FindNextFile: Data corruption, found item without name.");
+ if (shortName[0] == 0) throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtPath(dirPath)), L"FindNextFile: Data corruption; item is missing a name.");
if (shortName[0] == L'.' &&
(shortName[1] == 0 || (shortName[1] == L'.' && shortName[2] == 0)))
continue;
@@ -106,14 +106,14 @@ void zen::traverseFolder(const Zstring& dirPath,
DIR* dirObj = ::opendir(dirPath.c_str()); //directory must NOT end with path separator, except "/"
if (!dirObj)
- throwFileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(dirPath)), L"opendir", getLastError());
+ throwFileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtPath(dirPath)), L"opendir", getLastError());
ZEN_ON_SCOPE_EXIT(::closedir(dirObj)); //never close nullptr handles! -> crash
for (;;)
{
struct ::dirent* dirEntry = nullptr;
if (::readdir_r(dirObj, reinterpret_cast< ::dirent*>(&buffer[0]), &dirEntry) != 0)
- throwFileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirPath)), L"readdir_r", getLastError());
+ throwFileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtPath(dirPath)), L"readdir_r", getLastError());
//don't retry but restart dir traversal on error! http://blogs.msdn.com/b/oldnewthing/archive/2014/06/12/10533529.aspx
if (!dirEntry) //no more items
@@ -122,7 +122,7 @@ void zen::traverseFolder(const Zstring& dirPath,
//don't return "." and ".."
const char* shortName = dirEntry->d_name;
- if (shortName[0] == 0) throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirPath)), L"readdir_r: Data corruption, found item without name.");
+ if (shortName[0] == 0) throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtPath(dirPath)), L"readdir_r: Data corruption; item is missing a name.");
if (shortName[0] == '.' &&
(shortName[1] == 0 || (shortName[1] == '.' && shortName[2] == 0)))
continue;
@@ -152,7 +152,7 @@ void zen::traverseFolder(const Zstring& dirPath,
try
{
if (::lstat(itempath.c_str(), &statData) != 0) //lstat() does not resolve symlinks
- throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(itempath)), L"lstat", getLastError());
+ throwFileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtPath(itempath)), L"lstat", getLastError());
}
catch (const FileError& e)
{
diff --git a/zen/long_path_prefix.h b/zen/long_path_prefix.h
index dfdf60ba..f7ceb5e7 100644
--- a/zen/long_path_prefix.h
+++ b/zen/long_path_prefix.h
@@ -70,7 +70,7 @@ Zstring applyLongPathPrefixImpl(const Zstring& path)
if (!startsWith(path, LONG_PATH_PREFIX))
{
if (startsWith(path, L"\\\\")) //UNC-name, e.g. \\zenju-pc\Users
- return LONG_PATH_PREFIX_UNC + afterFirst(path, L'\\'); //convert to \\?\UNC\zenju-pc\Users
+ return LONG_PATH_PREFIX_UNC + afterFirst(path, L'\\', zen::IF_MISSING_RETURN_NONE); //convert to \\?\UNC\zenju-pc\Users
else
return LONG_PATH_PREFIX + path; //prepend \\?\ prefix
}
diff --git a/zen/perf.h b/zen/perf.h
index e52bf662..6015d97b 100644
--- a/zen/perf.h
+++ b/zen/perf.h
@@ -9,6 +9,7 @@
#include "deprecate.h"
#include "tick_count.h"
+#include "scope_guard.h"
#ifdef ZEN_WIN
#include <sstream>
diff --git a/zen/recycler.cpp b/zen/recycler.cpp
index a4f6c128..6cd34a17 100644
--- a/zen/recycler.cpp
+++ b/zen/recycler.cpp
@@ -27,7 +27,7 @@ using namespace zen;
#ifdef ZEN_WIN
-void zen::recycleOrDelete(const std::vector<Zstring>& itempaths, const std::function<void (const Zstring& currentItem)>& onRecycleItem)
+void zen::recycleOrDelete(const std::vector<Zstring>& itempaths, const std::function<void (const std::wstring& displayPath)>& onRecycleItem)
{
if (itempaths.empty()) return;
//warning: moving long file paths to recycler does not work!
@@ -70,7 +70,7 @@ void zen::recycleOrDelete(const std::vector<Zstring>& itempaths, const std::func
//"You should use fully-qualified path names with this function. Using it with relative path names is not thread safe."
if (::SHFileOperation(&fileOp) != 0 || fileOp.fAnyOperationsAborted)
{
- std::wstring itempathFmt = fmtFileName(itempaths[0]); //probably not the correct file name for file lists larger than 1!
+ std::wstring itempathFmt = fmtPath(itempaths[0]); //probably not the correct file name for file lists larger than 1!
if (itempaths.size() > 1)
itempathFmt += L", ..."; //give at least some hint that there are multiple files, and the error need not be related to the first one
throw FileError(replaceCpy(_("Unable to move %x to the recycle bin."), L"%x", itempathFmt));
@@ -97,7 +97,7 @@ bool zen::recycleOrDelete(const Zstring& itempath) //throw FileError
if (!::g_file_trash(file, nullptr, &error))
{
- const std::wstring errorMsg = replaceCpy(_("Unable to move %x to the recycle bin."), L"%x", fmtFileName(itempath));
+ const std::wstring errorMsg = replaceCpy(_("Unable to move %x to the recycle bin."), L"%x", fmtPath(itempath));
if (!error)
throw FileError(errorMsg, L"g_file_trash: unknown error."); //user should never see this
@@ -112,7 +112,7 @@ bool zen::recycleOrDelete(const Zstring& itempath) //throw FileError
if (S_ISLNK(fileInfo.st_mode) || S_ISREG(fileInfo.st_mode))
removeFile(itempath); //throw FileError
else if (S_ISDIR(fileInfo.st_mode))
- removeDirectory(itempath); //throw FileError
+ removeDirectoryRecursively(itempath); //throw FileError
return true;
}
@@ -128,7 +128,7 @@ bool zen::recycleOrDelete(const Zstring& itempath) //throw FileError
auto throwFileError = [&](OSStatus oss)
{
- const std::wstring errorMsg = replaceCpy(_("Unable to move %x to the recycle bin."), L"%x", fmtFileName(itempath));
+ const std::wstring errorMsg = replaceCpy(_("Unable to move %x to the recycle bin."), L"%x", fmtPath(itempath));
std::wstring errorDescr = L"OSStatus Code " + numberTo<std::wstring>(oss);
if (const char* description = ::GetMacOSStatusCommentString(oss)) //found no documentation for proper use of GetMacOSStatusCommentString
@@ -160,7 +160,7 @@ bool zen::recycleOrDelete(const Zstring& itempath) //throw FileError
if (S_ISLNK(fileInfo.st_mode) || S_ISREG(fileInfo.st_mode))
removeFile(itempath); //throw FileError
else if (S_ISDIR(fileInfo.st_mode))
- removeDirectory(itempath); //throw FileError
+ removeDirectoryRecursively(itempath); //throw FileError
return true;
}
@@ -179,7 +179,7 @@ bool zen::recycleBinExists(const Zstring& dirpath, const std::function<void ()>&
#else
//excessive runtime if recycle bin exists, is full and drive is slow:
- auto ft = async([dirpath]()
+ auto ft = runAsync([dirpath]()
{
SHQUERYRBINFO recInfo = {};
recInfo.cbSize = sizeof(recInfo);
@@ -187,7 +187,7 @@ bool zen::recycleBinExists(const Zstring& dirpath, const std::function<void ()>&
&recInfo); //__inout LPSHQUERYRBINFO pSHQueryRBInfo
});
- while (!ft.timed_wait(boost::posix_time::milliseconds(50)))
+ while (ft.wait_for(boost::chrono::milliseconds(50)) != boost::future_status::ready)
if (onUpdateGui)
onUpdateGui(); //may throw!
diff --git a/zen/recycler.h b/zen/recycler.h
index 3f48452e..61a721cd 100644
--- a/zen/recycler.h
+++ b/zen/recycler.h
@@ -39,7 +39,7 @@ bool recycleOrDelete(const Zstring& itempath); //throw FileError, return "true"
bool recycleBinExists(const Zstring& dirpath, const std::function<void ()>& onUpdateGui); //throw FileError
void recycleOrDelete(const std::vector<Zstring>& filepaths, //throw FileError, return "true" if file/dir was actually deleted
- const std::function<void (const Zstring& currentItem)>& onRecycleItem); //optional; currentItem may be empty
+ const std::function<void (const std::wstring& displayPath)>& onRecycleItem); //optional; currentItem may be empty
#endif
}
diff --git a/zen/scope_guard.h b/zen/scope_guard.h
index 706b20dc..8477c7ee 100644
--- a/zen/scope_guard.h
+++ b/zen/scope_guard.h
@@ -17,7 +17,7 @@ namespace zen
{
//Scope Guard
/*
- zen::ScopeGuard lockAio = zen::makeGuard([&] { ::CancelIo(hDir); });
+ zen::ScopeGuard lockAio = zen::makeGuard([&] { ::CloseHandle(hDir); });
...
lockAio.dismiss();
*/
diff --git a/zen/shell_execute.h b/zen/shell_execute.h
index 628e957a..b36bc5ea 100644
--- a/zen/shell_execute.h
+++ b/zen/shell_execute.h
@@ -60,14 +60,14 @@ bool shellExecuteImpl(Function fillExecInfo, ExecutionType type)
}
-void shellExecute(const void* /*PCIDLIST_ABSOLUTE*/ shellItemPidl, const Zstring& displayPath, ExecutionType type) //throw FileError
+void shellExecute(const void* /*PCIDLIST_ABSOLUTE*/ shellItemPidl, const std::wstring& displayPath, ExecutionType type) //throw FileError
{
if (!shellExecuteImpl([&](SHELLEXECUTEINFO& execInfo)
{
execInfo.fMask |= SEE_MASK_IDLIST;
execInfo.lpIDList = const_cast<void*>(shellItemPidl); //lpIDList is documented as PCIDLIST_ABSOLUTE!
}, type)) //throw FileError
- throwFileError(_("Incorrect command line:") + L"\n" + fmtFileName(displayPath), L"ShellExecuteEx", ::GetLastError());
+ throwFileError(_("Incorrect command line:") + L"\n" + fmtPath(displayPath), L"ShellExecuteEx", ::GetLastError());
}
#endif
@@ -102,7 +102,7 @@ void shellExecute(const Zstring& command, ExecutionType type) //throw FileError
execInfo.lpFile = filepath.c_str();
execInfo.lpParameters = arguments.c_str();
}, type))
- throwFileError(_("Incorrect command line:") + L"\nFile: " + fmtFileName(filepath) + L"\nArg: " + arguments, L"ShellExecuteEx", ::GetLastError());
+ throwFileError(_("Incorrect command line:") + L"\nFile: " + fmtPath(filepath) + L"\nArg: " + copyStringTo<std::wstring>(arguments), L"ShellExecuteEx", ::GetLastError());
#elif defined ZEN_LINUX || defined ZEN_MAC
/*
@@ -117,10 +117,10 @@ void shellExecute(const Zstring& command, ExecutionType type) //throw FileError
//Posix::system - execute a shell command
int rv = ::system(command.c_str()); //do NOT use std::system as its documentation says nothing about "WEXITSTATUS(rv)", ect...
if (rv == -1 || WEXITSTATUS(rv) == 127) //http://linux.die.net/man/3/system "In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127)"
- throw FileError(_("Incorrect command line:") + L"\n" + command);
+ throw FileError(_("Incorrect command line:") + L"\n" + utfCvrtTo<std::wstring>(command));
}
else
- async([=] { int rv = ::system(command.c_str()); (void)rv; });
+ runAsync([=] { int rv = ::system(command.c_str()); (void)rv; });
#endif
}
}
diff --git a/zen/stl_tools.h b/zen/stl_tools.h
index d2d4ee1a..bd76e264 100644
--- a/zen/stl_tools.h
+++ b/zen/stl_tools.h
@@ -9,6 +9,7 @@
#include <memory>
#include <algorithm>
+#include <zen/type_tools.h>
//enhancements for <algorithm>
@@ -66,6 +67,7 @@ std::unique_ptr<T> make_unique(Args&& ... args) { return std::unique_ptr<T>(new
template <class V, class Predicate> inline
void vector_remove_if(V& vec, Predicate p)
{
+ static_assert(IsSameType<typename std::iterator_traits<typename V::iterator>::iterator_category, std::random_access_iterator_tag>::value, "poor man's check for vector");
vec.erase(std::remove_if(vec.begin(), vec.end(), p), vec.end());
}
@@ -87,6 +89,9 @@ void set_append(V& s, const W& s2)
template <class S, class Predicate> inline
void set_remove_if(S& set, Predicate p)
{
+ //function compiles and fails (if we're lucky) not before runtime for std::vector!!!
+ static_assert(!IsSameType<typename std::iterator_traits<typename S::iterator>::iterator_category, std::random_access_iterator_tag>::value, "poor man's check for non-vector");
+
for (auto iter = set.begin(); iter != set.end();)
if (p(*iter))
set.erase(iter++);
diff --git a/zen/string_base.h b/zen/string_base.h
index be3b532e..f4ca5f2e 100644
--- a/zen/string_base.h
+++ b/zen/string_base.h
@@ -28,8 +28,8 @@ class AllocatorOptimalSpeed //exponential growth + min size
{
public:
//::operator new/ ::operator delete show same performance characterisics like malloc()/free()!
- static void* allocate(size_t size) { return ::operator new(size); } //throw std::bad_alloc
- static void deallocate(void* ptr) { ::operator delete(ptr); }
+ static void* allocate(size_t size) { return ::malloc(size); } //throw std::bad_alloc
+ static void deallocate(void* ptr) { ::free(ptr); }
static size_t calcCapacity(size_t length) { return std::max<size_t>(16, std::max(length + length / 2, length)); }
//- size_t might overflow! => better catch here than return a too small size covering up the real error: a way too large length!
//- any growth rate should not exceed golden ratio: 1.618033989
@@ -39,8 +39,8 @@ public:
class AllocatorOptimalMemory //no wasted memory, but more reallocations required when manipulating string
{
public:
- static void* allocate(size_t size) { return ::operator new(size); } //throw std::bad_alloc
- static void deallocate(void* ptr) { ::operator delete(ptr); }
+ static void* allocate(size_t size) { return ::malloc(size); } //throw std::bad_alloc
+ static void deallocate(void* ptr) { ::free(ptr); }
static size_t calcCapacity(size_t length) { return length; }
};
@@ -148,9 +148,21 @@ protected:
return ptr;
}
+#ifdef NDEBUG
void destroy(Char* ptr)
+#else
+ void destroy(Char*& ptr)
+#endif
{
- if (!ptr) return; //support "destroy(nullptr)"
+ assert(ptr != reinterpret_cast<Char*>(0x1)); //detect double-deletion
+
+ if (!ptr) //support "destroy(nullptr)"
+ {
+#ifndef NDEBUG
+ ptr = reinterpret_cast<Char*>(0x1);
+#endif
+ return;
+ }
Descriptor* const d = descr(ptr);
@@ -158,6 +170,9 @@ protected:
{
d->~Descriptor();
this->deallocate(d);
+#ifndef NDEBUG
+ ptr = reinterpret_cast<Char*>(0x1);
+#endif
}
}
diff --git a/zen/string_tools.h b/zen/string_tools.h
index 03094c96..c04adf96 100644
--- a/zen/string_tools.h
+++ b/zen/string_tools.h
@@ -30,10 +30,16 @@ template <class S, class T> bool startsWith(const S& str, const T& prefix); //
template <class S, class T> bool endsWith (const S& str, const T& postfix); //both S and T can be strings or char/wchar_t arrays or simple char/wchar_t
template <class S, class T> bool contains (const S& str, const T& term); //
-template <class S, class T> S afterLast (const S& str, const T& term); //returns the whole string if term not found
-template <class S, class T> S beforeLast (const S& str, const T& term); //returns empty string if term not found
-template <class S, class T> S afterFirst (const S& str, const T& term); //returns empty string if term not found
-template <class S, class T> S beforeFirst(const S& str, const T& term); //returns the whole string if term not found
+enum FailureReturnVal
+{
+ IF_MISSING_RETURN_ALL,
+ IF_MISSING_RETURN_NONE
+};
+
+template <class S, class T> S afterLast (const S& str, const T& term, FailureReturnVal rv);
+template <class S, class T> S beforeLast (const S& str, const T& term, FailureReturnVal rv);
+template <class S, class T> S afterFirst (const S& str, const T& term, FailureReturnVal rv);
+template <class S, class T> S beforeFirst(const S& str, const T& term, FailureReturnVal rv);
template <class S, class T> std::vector<S> split(const S& str, const T& delimiter);
template <class S> void trim ( S& str, bool fromLeft = true, bool fromRight = true);
@@ -96,6 +102,7 @@ template <> inline bool isAlpha(wchar_t ch) { return std::iswalpha(ch) != 0; }
template <class S, class T> inline
bool startsWith(const S& str, const T& prefix)
{
+ static_assert(IsSameType<typename GetCharType<S>::Type, typename GetCharType<T>::Type>::value, "");
const size_t pfLen = strLength(prefix);
if (strLength(str) < pfLen)
return false;
@@ -109,6 +116,7 @@ bool startsWith(const S& str, const T& prefix)
template <class S, class T> inline
bool endsWith(const S& str, const T& postfix)
{
+ static_assert(IsSameType<typename GetCharType<S>::Type, typename GetCharType<T>::Type>::value, "");
const size_t strLen = strLength(str);
const size_t pfLen = strLength(postfix);
if (strLen < pfLen)
@@ -123,6 +131,7 @@ bool endsWith(const S& str, const T& postfix)
template <class S, class T> inline
bool contains(const S& str, const T& term)
{
+ static_assert(IsSameType<typename GetCharType<S>::Type, typename GetCharType<T>::Type>::value, "");
const size_t strLen = strLength(str);
const size_t termLen = strLength(term);
if (strLen < termLen)
@@ -137,77 +146,83 @@ bool contains(const S& str, const T& term)
}
-//returns the whole string if term not found
template <class S, class T> inline
-S afterLast(const S& str, const T& term)
+S afterLast(const S& str, const T& term, FailureReturnVal rv)
{
+ static_assert(IsSameType<typename GetCharType<S>::Type, typename GetCharType<T>::Type>::value, "");
const size_t termLen = strLength(term);
const auto* const strFirst = strBegin(str);
const auto* const strLast = strFirst + strLength(str);
const auto* const termFirst = strBegin(term);
- const auto* iter = search_last(strFirst, strLast,
- termFirst, termFirst + termLen);
- if (iter == strLast)
- return str;
+ const auto* it = search_last(strFirst, strLast,
+ termFirst, termFirst + termLen);
+ if (it == strLast)
+ return rv == IF_MISSING_RETURN_ALL ? str : S();
- iter += termLen;
- return S(iter, strLast - iter);
+ it += termLen;
+ return S(it, strLast - it);
}
-//returns empty string if term not found
template <class S, class T> inline
-S beforeLast(const S& str, const T& term)
+S beforeLast(const S& str, const T& term, FailureReturnVal rv)
{
+ static_assert(IsSameType<typename GetCharType<S>::Type, typename GetCharType<T>::Type>::value, "");
const auto* const strFirst = strBegin(str);
const auto* const strLast = strFirst + strLength(str);
const auto* const termFirst = strBegin(term);
- const auto* iter = search_last(strFirst, strLast,
- termFirst, termFirst + strLength(term));
- if (iter == strLast)
- return S();
+ const auto* it = search_last(strFirst, strLast,
+ termFirst, termFirst + strLength(term));
+ if (it == strLast)
+ return rv == IF_MISSING_RETURN_ALL ? str : S();
- return S(strFirst, iter - strFirst);
+ return S(strFirst, it - strFirst);
}
-//returns empty string if term not found
template <class S, class T> inline
-S afterFirst(const S& str, const T& term)
+S afterFirst(const S& str, const T& term, FailureReturnVal rv)
{
+ static_assert(IsSameType<typename GetCharType<S>::Type, typename GetCharType<T>::Type>::value, "");
const size_t termLen = strLength(term);
const auto* const strFirst = strBegin(str);
const auto* const strLast = strFirst + strLength(str);
const auto* const termFirst = strBegin(term);
- const auto* iter = std::search(strFirst, strLast,
- termFirst, termFirst + termLen);
- if (iter == strLast)
- return S();
- iter += termLen;
+ const auto* it = std::search(strFirst, strLast,
+ termFirst, termFirst + termLen);
+ if (it == strLast)
+ return rv == IF_MISSING_RETURN_ALL ? str : S();
- return S(iter, strLast - iter);
+ it += termLen;
+ return S(it, strLast - it);
}
-//returns the whole string if term not found
template <class S, class T> inline
-S beforeFirst(const S& str, const T& term)
+S beforeFirst(const S& str, const T& term, FailureReturnVal rv)
{
+ static_assert(IsSameType<typename GetCharType<S>::Type, typename GetCharType<T>::Type>::value, "");
const auto* const strFirst = strBegin(str);
+ const auto* const strLast = strFirst + strLength(str);
const auto* const termFirst = strBegin(term);
- return S(strFirst, std::search(strFirst, strFirst + strLength(str),
- termFirst, termFirst + strLength(term)) - strFirst);
+ auto it = std::search(strFirst, strLast,
+ termFirst, termFirst + strLength(term));
+ if (it == strLast)
+ return rv == IF_MISSING_RETURN_ALL ? str : S();
+
+ return S(strFirst, it - strFirst);
}
template <class S, class T> inline
std::vector<S> split(const S& str, const T& delimiter)
{
+ static_assert(IsSameType<typename GetCharType<S>::Type, typename GetCharType<T>::Type>::value, "");
std::vector<S> output;
const size_t delimLen = strLength(delimiter);
@@ -253,6 +268,8 @@ typename EnableIf<!HasMember_append<S>::value>::Type stringAppend(S& str, const
template <class S, class T, class U> inline
S replaceCpy(const S& str, const T& oldTerm, const U& newTerm, bool replaceAll)
{
+ static_assert(IsSameType<typename GetCharType<S>::Type, typename GetCharType<T>::Type>::value, "");
+ static_assert(IsSameType<typename GetCharType<T>::Type, typename GetCharType<U>::Type>::value, "");
const size_t oldLen = strLength(oldTerm);
if (oldLen == 0)
{
diff --git a/zen/string_traits.h b/zen/string_traits.h
index 12a7f87c..5f91bdc4 100644
--- a/zen/string_traits.h
+++ b/zen/string_traits.h
@@ -38,14 +38,15 @@ class StringRef
{
public:
template <class Iterator>
- StringRef(Iterator first, Iterator last) : length_(last - first), data_(first != last ? &*first : nullptr) {}
+ StringRef(Iterator first, Iterator last) : len_(last - first), str_(first != last ? &*first : nullptr) {}
+ //StringRef(const Char* str, size_t len) : str_(str), len_(len) {} -> needless constraint! Char* not available for empty range!
- size_t length() const { return length_; }
- const Char* data() const { return data_; } //1. no null-termination! 2. may be nullptr!
+ const Char* data() const { return str_; } //1. no null-termination! 2. may be nullptr!
+ size_t length() const { return len_; }
private:
- size_t length_;
- const Char* data_;
+ size_t len_;
+ const Char* str_;
};
@@ -98,6 +99,10 @@ struct GetCharTypeImpl<S, true> :
template <> struct GetCharTypeImpl<char, false> : ResultType<char > {};
template <> struct GetCharTypeImpl<wchar_t, false> : ResultType<wchar_t> {};
+template <> struct GetCharTypeImpl<StringRef<char >, false> : ResultType<char > {};
+template <> struct GetCharTypeImpl<StringRef<wchar_t>, false> : ResultType<wchar_t> {};
+
+
ZEN_INIT_DETECT_MEMBER_TYPE(value_type);
ZEN_INIT_DETECT_MEMBER(c_str); //we don't know the exact declaration of the member attribute and it may be in a base class!
ZEN_INIT_DETECT_MEMBER(length); //
@@ -127,28 +132,6 @@ public:
IsSameType<CharType, wchar_t>::value
};
};
-
-
-template <> class StringTraits<StringRef<char>>
-{
-public:
- enum
- {
- isStringClass = false,
- isStringLike = true
- };
- typedef char CharType;
-};
-template <> class StringTraits<StringRef<wchar_t>>
-{
-public:
- enum
- {
- isStringClass = false,
- isStringLike = true
- };
- typedef wchar_t CharType;
-};
}
template <class T>
@@ -174,7 +157,7 @@ size_t cStringLength(const C* str) //naive implementation seems somewhat faster
return len;
}
-template <class S, typename = typename EnableIf<StringTraits<S>::isStringClass>::Type> inline
+template <class S, typename = typename EnableIf<implementation::StringTraits<S>::isStringClass>::Type> inline
const typename GetCharType<S>::Type* strBegin(const S& str) //SFINAE: T must be a "string"
{
return str.c_str();
@@ -188,7 +171,7 @@ inline const char* strBegin(const StringRef<char >& ref) { return ref.data(
inline const wchar_t* strBegin(const StringRef<wchar_t>& ref) { return ref.data(); }
-template <class S, typename = typename EnableIf<StringTraits<S>::isStringClass>::Type> inline
+template <class S, typename = typename EnableIf<implementation::StringTraits<S>::isStringClass>::Type> inline
size_t strLength(const S& str) //SFINAE: T must be a "string"
{
return str.length();
diff --git a/zen/symlink_target.h b/zen/symlink_target.h
index c895d9a0..c8c8c4be 100644
--- a/zen/symlink_target.h
+++ b/zen/symlink_target.h
@@ -100,7 +100,7 @@ Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileErro
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, //_In_ DWORD dwFlagsAndAttributes,
nullptr); //_In_opt_ HANDLE hTemplateFile
if (hLink == INVALID_HANDLE_VALUE)
- throwFileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)), L"CreateFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(linkPath)), L"CreateFile", getLastError());
ZEN_ON_SCOPE_EXIT(::CloseHandle(hLink));
//respect alignment issues...
@@ -116,7 +116,7 @@ Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileErro
bufferSize, //__in DWORD nOutBufferSize,
&bytesReturned, //__out_opt LPDWORD lpBytesReturned,
nullptr)) //__inout_opt LPOVERLAPPED lpOverlapped
- throwFileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)), L"DeviceIoControl, FSCTL_GET_REPARSE_POINT", getLastError());
+ throwFileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(linkPath)), L"DeviceIoControl, FSCTL_GET_REPARSE_POINT", getLastError());
REPARSE_DATA_BUFFER& reparseData = *reinterpret_cast<REPARSE_DATA_BUFFER*>(&buffer[0]); //REPARSE_DATA_BUFFER needs to be artificially enlarged!
@@ -132,7 +132,7 @@ Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileErro
reparseData.MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR));
}
else
- throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)), L"Not a symbolic link or junction.");
+ throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(linkPath)), L"Not a symbolic link or junction.");
//absolute symlinks and junctions use NT namespace naming convention while relative ones do not:
//http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx#NT_Namespaces
@@ -144,9 +144,9 @@ Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileErro
const ssize_t bytesWritten = ::readlink(linkPath.c_str(), &buffer[0], BUFFER_SIZE);
if (bytesWritten < 0)
- throwFileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)), L"readlink", getLastError());
- if (bytesWritten >= static_cast<ssize_t>(BUFFER_SIZE)) //detect truncation!
- throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)));
+ throwFileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(linkPath)), L"readlink", getLastError());
+ if (bytesWritten >= static_cast<ssize_t>(BUFFER_SIZE)) //detect truncation, not an error for readlink!
+ throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtPath(linkPath)), L"readlink: buffer truncated.");
return Zstring(&buffer[0], bytesWritten); //readlink does not append 0-termination!
#endif
@@ -161,7 +161,7 @@ Zstring getResolvedFilePath_impl(const Zstring& linkPath) //throw FileError
typedef DWORD (WINAPI* GetFinalPathNameByHandleWFunc)(HANDLE hFile, LPTSTR lpszFilePath, DWORD cchFilePath, DWORD dwFlags);
const SysDllFun<GetFinalPathNameByHandleWFunc> getFinalPathNameByHandle(L"kernel32.dll", "GetFinalPathNameByHandleW");
if (!getFinalPathNameByHandle)
- throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)), replaceCpy(_("Cannot find system function %x."), L"%x", L"\"GetFinalPathNameByHandleW\""));
+ throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(linkPath)), replaceCpy(_("Cannot find system function %x."), L"%x", L"\"GetFinalPathNameByHandleW\""));
const HANDLE hFile = ::CreateFile(applyLongPathPrefix(linkPath).c_str(), //_In_ LPCTSTR lpFileName,
@@ -173,12 +173,12 @@ Zstring getResolvedFilePath_impl(const Zstring& linkPath) //throw FileError
FILE_FLAG_BACKUP_SEMANTICS, //_In_ DWORD dwFlagsAndAttributes,
nullptr); //_In_opt_ HANDLE hTemplateFile
if (hFile == INVALID_HANDLE_VALUE)
- throwFileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)), L"CreateFile", getLastError());
+ throwFileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(linkPath)), L"CreateFile", getLastError());
ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile));
const DWORD bufferSize = getFinalPathNameByHandle(hFile, nullptr, 0, 0);
if (bufferSize == 0)
- throwFileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)), L"GetFinalPathNameByHandle", getLastError());
+ throwFileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(linkPath)), L"GetFinalPathNameByHandle", getLastError());
std::vector<wchar_t> targetPath(bufferSize);
const DWORD charsWritten = getFinalPathNameByHandle(hFile, //__in HANDLE hFile,
@@ -187,7 +187,7 @@ Zstring getResolvedFilePath_impl(const Zstring& linkPath) //throw FileError
0); //__in DWORD dwFlags
if (charsWritten == 0 || charsWritten >= bufferSize)
{
- const std::wstring errorMsg = replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath));
+ const std::wstring errorMsg = replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(linkPath));
if (charsWritten == 0)
throwFileError(errorMsg, L"GetFinalPathNameByHandle", getLastError());
throw FileError(errorMsg);
@@ -198,7 +198,7 @@ Zstring getResolvedFilePath_impl(const Zstring& linkPath) //throw FileError
#elif defined ZEN_LINUX || defined ZEN_MAC
char* targetPath = ::realpath(linkPath.c_str(), nullptr);
if (!targetPath)
- throwFileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)), L"realpath", getLastError());
+ throwFileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtPath(linkPath)), L"realpath", getLastError());
ZEN_ON_SCOPE_EXIT(::free(targetPath));
return targetPath;
#endif
diff --git a/zen/sys_error.h b/zen/sys_error.h
index 7fb12d31..16e59266 100644
--- a/zen/sys_error.h
+++ b/zen/sys_error.h
@@ -46,6 +46,7 @@ private:
std::wstring msg_;
};
+#define DEFINE_NEW_SYS_ERROR(X) struct X : public SysError { X(const std::wstring& msg) : SysError(msg) {} };
@@ -92,7 +93,7 @@ std::wstring formatSystemErrorRaw(ErrorCode ec) //return empty string on error
errorMsg = utfCvrtTo<std::wstring>(::strerror(ec));
#endif
- trim(errorMsg); //Windows messages seem to end with a blank...
+ trim(errorMsg); //Windows messages seem to end with a blank...
return errorMsg;
}
diff --git a/zen/thread.h b/zen/thread.h
index c9b4c76f..6d647de8 100644
--- a/zen/thread.h
+++ b/zen/thread.h
@@ -39,23 +39,23 @@ namespace zen
{
/*
std::async replacement without crappy semantics:
- 1. guaranteed to run asynchronous
+ 1. guaranteed to run asynchronously
2. does not follow C++11 [futures.async], Paragraph 5, where std::future waits for thread in destructor
Example:
Zstring dirpath = ...
- auto ft = zen::async([=](){ return zen::dirExists(dirpath); });
- if (ft.timed_wait(boost::posix_time::milliseconds(200)) && ft.get())
+ auto ft = zen::runAsync([=](){ return zen::dirExists(dirpath); });
+ if (ft.wait_for(boost::chrono::milliseconds(200)) == boost::future_status::ready && ft.get())
//dir exising
*/
template <class Function>
-auto async(Function fun) -> boost::unique_future<decltype(fun())>;
+auto runAsync(Function fun) -> boost::unique_future<decltype(fun())>;
//wait for all with a time limit: return true if *all* results are available!
template<class InputIterator, class Duration>
bool wait_for_all_timed(InputIterator first, InputIterator last, const Duration& wait_duration);
-//wait until first job is successful or all failed
+//wait until first job is successful or all failed: substitute until std::when_any is available
template <class T>
class GetFirstResult
{
@@ -73,11 +73,36 @@ public:
private:
class AsyncResult;
- std::shared_ptr<AsyncResult> asyncResult;
+ std::shared_ptr<AsyncResult> asyncResult_;
size_t jobsTotal_;
};
+//value associated with mutex and guaranteed protected access:
+template <class T>
+class Protected
+{
+public:
+ Protected() : value_() {}
+ Protected(const T& value) : value_(value) {}
+
+ template <class Function>
+ void access(Function fun)
+ {
+ boost::lock_guard<boost::mutex> dummy(lockValue);
+ fun(value_);
+ }
+
+private:
+ Protected (const Protected&) = delete;
+ Protected& operator=(const Protected&) = delete;
+
+ boost::mutex lockValue;
+ T value_;
+};
+
+
+
@@ -90,12 +115,12 @@ private:
#endif
template <class Function> inline
-auto async(Function fun) -> boost::unique_future<decltype(fun())>
+auto runAsync(Function fun) -> boost::unique_future<decltype(fun())>
{
typedef decltype(fun()) ResultType;
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK //mirror "boost/thread/future.hpp", hopefully they know what they're doing
- boost::packaged_task<ResultType()> pt(std::move(fun)); //packaged task seems to even require r-value reference: https://sourceforge.net/p/freefilesync/bugs/234/
+ boost::packaged_task<ResultType()> pt(std::move(fun));
#else
boost::packaged_task<ResultType> pt(std::move(fun));
#endif
@@ -106,11 +131,11 @@ auto async(Function fun) -> boost::unique_future<decltype(fun())>
template<class InputIterator, class Duration> inline
-bool wait_for_all_timed(InputIterator first, InputIterator last, const Duration& wait_duration)
+bool wait_for_all_timed(InputIterator first, InputIterator last, const Duration& duration)
{
- const boost::system_time endTime = boost::get_system_time() + wait_duration;
+ const boost::chrono::steady_clock::time_point endTime = boost::chrono::steady_clock::now() + duration;
for (; first != last; ++first)
- if (!first->timed_wait_until(endTime))
+ if (first->wait_until(endTime) != boost::future_status::ready)
return false; //time elapsed
return true;
}
@@ -144,15 +169,13 @@ public:
bool waitForResult(size_t jobsTotal, const Duration& duration)
{
boost::unique_lock<boost::mutex> dummy(lockResult);
- return conditionJobDone.timed_wait(dummy, duration, [&] { return this->jobDone(jobsTotal); });
- //use timed_wait predicate if exitting before condition is reached: http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref.condition_variable.timed_wait_rel
+ return conditionJobDone.wait_for(dummy, duration, [&] { return this->jobDone(jobsTotal); }); //throw boost::thread_interrupted
}
std::unique_ptr<T> getResult(size_t jobsTotal)
{
boost::unique_lock<boost::mutex> dummy(lockResult);
- while (!jobDone(jobsTotal))
- conditionJobDone.timed_wait(dummy, boost::posix_time::milliseconds(50)); //interruption point!
+ conditionJobDone.wait(dummy, [&] { return this->jobDone(jobsTotal); }); //throw boost::thread_interrupted
#ifndef NDEBUG
assert(!returnedResult);
@@ -177,15 +200,15 @@ private:
template <class T> inline
-GetFirstResult<T>::GetFirstResult() : asyncResult(std::make_shared<AsyncResult>()), jobsTotal_(0) {}
+GetFirstResult<T>::GetFirstResult() : asyncResult_(std::make_shared<AsyncResult>()), jobsTotal_(0) {}
template <class T>
template <class Fun> inline
void GetFirstResult<T>::addJob(Fun f) //f must return a std::unique_ptr<T> containing a value on success
{
- auto asyncResult2 = asyncResult; //capture member variable, not "this"!
- boost::thread t([asyncResult2, f] { asyncResult2->reportFinished(f()); });
+ auto asyncResult = this->asyncResult_; //capture member variable, not "this"!
+ boost::thread t([asyncResult, f] { asyncResult->reportFinished(f()); });
++jobsTotal_;
t.detach(); //we have to be explicit since C++11: [thread.thread.destr] ~thread() calls std::terminate() if joinable()!!!
}
@@ -193,11 +216,11 @@ void GetFirstResult<T>::addJob(Fun f) //f must return a std::unique_ptr<T> conta
template <class T>
template <class Duration> inline
-bool GetFirstResult<T>::timedWait(const Duration& duration) const { return asyncResult->waitForResult(jobsTotal_, duration); }
+bool GetFirstResult<T>::timedWait(const Duration& duration) const { return asyncResult_->waitForResult(jobsTotal_, duration); }
template <class T> inline
-std::unique_ptr<T> GetFirstResult<T>::get() const { return asyncResult->getResult(jobsTotal_); }
+std::unique_ptr<T> GetFirstResult<T>::get() const { return asyncResult_->getResult(jobsTotal_); }
}
#endif //BOOST_THREAD_WRAP_H_78963234
diff --git a/zen/type_tools.h b/zen/type_tools.h
index 95e49769..ac365f05 100644
--- a/zen/type_tools.h
+++ b/zen/type_tools.h
@@ -46,6 +46,9 @@ struct RemoveRef : ResultType<T> {};
template <class T>
struct RemoveRef<T&> : ResultType<T> {};
+
+template <class T>
+struct RemoveRef<T&&> : ResultType<T> {};
//------------------------------------------------------
template <class T>
struct RemoveConst : ResultType<T> {};
diff --git a/zen/win.h b/zen/win.h
index 121e6a9c..13ecf4e4 100644
--- a/zen/win.h
+++ b/zen/win.h
@@ -7,6 +7,10 @@
#ifndef YAWFWH_YET_ANOTHER_WRAPPER_FOR_WINDOWS_H
#define YAWFWH_YET_ANOTHER_WRAPPER_FOR_WINDOWS_H
+#ifndef _WINSOCKAPI_ //prevent inclusion of winsock.h in windows.h: obsoleted by and conflicting with winsock2.h
+ #define _WINSOCKAPI_
+#endif
+
//------------------------------------------------------
#ifdef __WXMSW__ //we have wxWidgets
#include <wx/msw/wrapwin.h> //includes "windows.h"
diff --git a/zen/xml_io.cpp b/zen/xml_io.cpp
index a1bf05d0..5b2cfdca 100644
--- a/zen/xml_io.cpp
+++ b/zen/xml_io.cpp
@@ -28,7 +28,7 @@ XmlDoc zen::loadXmlDocument(const Zstring& filepath) //throw FileError
if (!startsWith(memStreamOut.ref(), xmlBegin) &&
!startsWith(memStreamOut.ref(), BYTE_ORDER_MARK_UTF8 + xmlBegin)) //allow BOM!
- throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filepath)));
+ throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filepath)));
}
copyStream(fileStreamIn, memStreamOut, fileStreamIn.optimalBlockSize(), nullptr); //throw FileError
@@ -41,7 +41,7 @@ XmlDoc zen::loadXmlDocument(const Zstring& filepath) //throw FileError
{
throw FileError(
replaceCpy(replaceCpy(replaceCpy(_("Error parsing file %x, row %y, column %z."),
- L"%x", fmtFileName(filepath)),
+ L"%x", fmtPath(filepath)),
L"%y", numberTo<std::wstring>(e.row + 1)),
L"%z", numberTo<std::wstring>(e.col + 1)));
}
@@ -70,10 +70,10 @@ void zen::checkForMappingErrors(const XmlIn& xmlInput, const Zstring& filepath)
{
if (xmlInput.errorsOccured())
{
- std::wstring msg = _("Cannot read the following XML elements:") + L"\n";
+ std::wstring msg = _("The following XML elements could not be read:") + L"\n";
for (const std::wstring& elem : xmlInput.getErrorsAs<std::wstring>())
msg += L"\n" + elem;
- throw FileError(replaceCpy(_("Configuration file %x loaded partially only."), L"%x", fmtFileName(filepath)) + L"\n\n" + msg);
+ throw FileError(replaceCpy(_("Configuration file %x is incomplete. The missing elements will be set to their default values."), L"%x", fmtPath(filepath)) + L"\n\n" + msg);
}
}
diff --git a/zen/zstring.cpp b/zen/zstring.cpp
index 68934e19..8dcd4736 100644
--- a/zen/zstring.cpp
+++ b/zen/zstring.cpp
@@ -55,6 +55,10 @@ typedef int (WINAPI* CompareStringOrdinalFunc)(LPCWSTR lpString1, int cchCount1,
const SysDllFun<CompareStringOrdinalFunc> compareStringOrdinal = SysDllFun<CompareStringOrdinalFunc>(L"kernel32.dll", "CompareStringOrdinal");
//watch for dependencies in global namespace!!!
//caveat: function scope static initialization is not thread-safe in VS 2010!
+#if defined _MSC_VER && _MSC_VER > 1800
+ #error not true anymore
+#endif
+
}
@@ -148,18 +152,6 @@ Zstring makeUpperCopy(const Zstring& str)
#elif defined ZEN_MAC
-int cmpFilePath(const Zchar* lhs, size_t lhsLen, const Zchar* rhs, size_t rhsLen)
-{
- assert(std::find(lhs, lhs + lhsLen, 0) == lhs + lhsLen); //don't expect embedded nulls!
- assert(std::find(rhs, rhs + rhsLen, 0) == rhs + rhsLen); //
-
- const int rv = ::strncasecmp(lhs, rhs, std::min(lhsLen, rhsLen)); //locale-dependent!
- if (rv != 0)
- return rv;
- return static_cast<int>(lhsLen) - static_cast<int>(rhsLen);
-}
-
-
Zstring makeUpperCopy(const Zstring& str)
{
const size_t len = str.size();
diff --git a/zen/zstring.h b/zen/zstring.h
index 9822e504..462ea39c 100644
--- a/zen/zstring.h
+++ b/zen/zstring.h
@@ -14,7 +14,6 @@
#endif
-
#ifdef ZEN_WIN //Windows encodes Unicode as UTF-16 wchar_t
typedef wchar_t Zchar;
#define Zstr(x) L ## x
@@ -27,13 +26,19 @@
#endif
//"The reason for all the fuss above" - Loki/SmartPtr
-//a high-performance string for interfacing with native OS APIs and multithreaded contexts
+//a high-performance string for interfacing with native OS APIs in multithreaded contexts
typedef zen::Zbase<Zchar, zen::StorageRefCountThreadSafe, zen::AllocatorOptimalSpeed> Zstring;
//Compare filepaths: Windows does NOT distinguish between upper/lower-case, while Linux DOES
-int cmpFilePath(const Zchar* lhs, size_t lhsLen, const Zchar* rhs, size_t rhsLen);
+int cmpFilePath(const wchar_t* lhs, size_t lhsLen, const wchar_t* rhs, size_t rhsLen);
+
+#if defined ZEN_LINUX || defined ZEN_MAC
+ int cmpFilePath(const char* lhs, size_t lhsLen, const char* rhs, size_t rhsLen);
+#endif
+
+
struct LessFilePath //case-insensitive on Windows, case-sensitive on Linux
@@ -64,11 +69,8 @@ Zstring appendSeparator(Zstring path) //support rvalue references!
inline
Zstring getFileExtension(const Zstring& filePath)
{
- const Zstring shortName = afterLast(filePath, FILE_NAME_SEPARATOR); //returns the whole string if term not found
-
- return contains(shortName, Zchar('.')) ?
- afterLast(filePath, Zchar('.')) :
- Zstring();
+ const Zstring shortName = afterLast(filePath, FILE_NAME_SEPARATOR, zen::IF_MISSING_RETURN_ALL);
+ return afterLast(shortName, Zchar('.'), zen::IF_MISSING_RETURN_NONE);
}
@@ -102,14 +104,34 @@ bool pathEndsWith(const S& str, const T& postfix)
//################################# inline implementation ########################################
-#ifdef ZEN_LINUX
+#if defined ZEN_LINUX || defined ZEN_MAC
inline
-int cmpFilePath(const Zchar* lhs, size_t lhsLen, const Zchar* rhs, size_t rhsLen)
+int cmpFilePath(const char* lhs, size_t lhsLen, const char* rhs, size_t rhsLen)
{
assert(std::find(lhs, lhs + lhsLen, 0) == lhs + lhsLen); //don't expect embedded nulls!
assert(std::find(rhs, rhs + rhsLen, 0) == rhs + rhsLen); //
+#if defined ZEN_LINUX
const int rv = std::strncmp(lhs, rhs, std::min(lhsLen, rhsLen));
+#elif defined ZEN_MAC
+ const int rv = ::strncasecmp(lhs, rhs, std::min(lhsLen, rhsLen)); //locale-dependent!
+#endif
+ if (rv != 0)
+ return rv;
+ return static_cast<int>(lhsLen) - static_cast<int>(rhsLen);
+}
+
+inline
+int cmpFilePath(const wchar_t* lhs, size_t lhsLen, const wchar_t* rhs, size_t rhsLen)
+{
+ assert(std::find(lhs, lhs + lhsLen, 0) == lhs + lhsLen); //don't expect embedded nulls!
+ assert(std::find(rhs, rhs + rhsLen, 0) == rhs + rhsLen); //
+
+#if defined ZEN_LINUX
+ const int rv = std::wcsncmp(lhs, rhs, std::min(lhsLen, rhsLen));
+#elif defined ZEN_MAC
+ const int rv = ::wcsncasecmp(lhs, rhs, std::min(lhsLen, rhsLen)); //locale-dependent!
+#endif
if (rv != 0)
return rv;
return static_cast<int>(lhsLen) - static_cast<int>(rhsLen);
bgstack15