summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Wilhelm <shieldwed@outlook.com>2018-05-09 00:11:35 +0200
committerDaniel Wilhelm <shieldwed@outlook.com>2018-05-09 00:11:35 +0200
commit015bb675d6eb177900c8ac94a6d35edc5ad90576 (patch)
treeedde4153ce9b2ba6bdaf9d3c0af0966ed6dfd717
parent9.8 (diff)
downloadFreeFileSync-015bb675d6eb177900c8ac94a6d35edc5ad90576.tar.gz
FreeFileSync-015bb675d6eb177900c8ac94a6d35edc5ad90576.tar.bz2
FreeFileSync-015bb675d6eb177900c8ac94a6d35edc5ad90576.zip
9.9
-rwxr-xr-xChangelog.txt14
-rwxr-xr-xFreeFileSync/Build/Help/html/daylight-saving-time.html11
-rwxr-xr-xFreeFileSync/Build/Languages/arabic.lng227
-rwxr-xr-xFreeFileSync/Build/Languages/bulgarian.lng243
-rwxr-xr-xFreeFileSync/Build/Languages/chinese_simple.lng259
-rwxr-xr-xFreeFileSync/Build/Languages/chinese_traditional.lng223
-rwxr-xr-xFreeFileSync/Build/Languages/croatian.lng217
-rwxr-xr-xFreeFileSync/Build/Languages/czech.lng223
-rwxr-xr-xFreeFileSync/Build/Languages/danish.lng219
-rwxr-xr-xFreeFileSync/Build/Languages/dutch.lng221
-rwxr-xr-xFreeFileSync/Build/Languages/english_uk.lng217
-rwxr-xr-xFreeFileSync/Build/Languages/finnish.lng215
-rwxr-xr-xFreeFileSync/Build/Languages/french.lng237
-rwxr-xr-xFreeFileSync/Build/Languages/german.lng59
-rwxr-xr-xFreeFileSync/Build/Languages/greek.lng217
-rwxr-xr-xFreeFileSync/Build/Languages/hebrew.lng213
-rwxr-xr-xFreeFileSync/Build/Languages/hindi.lng307
-rwxr-xr-xFreeFileSync/Build/Languages/hungarian.lng217
-rwxr-xr-xFreeFileSync/Build/Languages/italian.lng217
-rwxr-xr-xFreeFileSync/Build/Languages/japanese.lng227
-rwxr-xr-xFreeFileSync/Build/Languages/korean.lng209
-rwxr-xr-xFreeFileSync/Build/Languages/lithuanian.lng221
-rwxr-xr-xFreeFileSync/Build/Languages/norwegian.lng217
-rwxr-xr-xFreeFileSync/Build/Languages/polish.lng218
-rwxr-xr-xFreeFileSync/Build/Languages/portuguese.lng213
-rwxr-xr-xFreeFileSync/Build/Languages/portuguese_br.lng227
-rwxr-xr-xFreeFileSync/Build/Languages/romanian.lng223
-rwxr-xr-xFreeFileSync/Build/Languages/russian.lng221
-rwxr-xr-xFreeFileSync/Build/Languages/slovak.lng219
-rwxr-xr-xFreeFileSync/Build/Languages/slovenian.lng153
-rwxr-xr-xFreeFileSync/Build/Languages/spanish.lng219
-rwxr-xr-xFreeFileSync/Build/Languages/swedish.lng213
-rwxr-xr-xFreeFileSync/Build/Languages/turkish.lng255
-rwxr-xr-xFreeFileSync/Build/Languages/ukrainian.lng221
-rwxr-xr-xFreeFileSync/Build/Resources.zipbin317363 -> 318587 bytes
-rwxr-xr-xFreeFileSync/Source/RealTimeSync/folder_selector2.cpp7
-rwxr-xr-xFreeFileSync/Source/RealTimeSync/gui_generated.cpp24
-rwxr-xr-xFreeFileSync/Source/RealTimeSync/gui_generated.h2
-rwxr-xr-xFreeFileSync/Source/RealTimeSync/main_dlg.cpp150
-rwxr-xr-xFreeFileSync/Source/RealTimeSync/main_dlg.h7
-rwxr-xr-xFreeFileSync/Source/RealTimeSync/xml_proc.cpp10
-rwxr-xr-xFreeFileSync/Source/algorithm.cpp8
-rwxr-xr-xFreeFileSync/Source/application.cpp24
-rwxr-xr-xFreeFileSync/Source/comparison.cpp28
-rwxr-xr-xFreeFileSync/Source/file_hierarchy.cpp42
-rwxr-xr-xFreeFileSync/Source/file_hierarchy.h7
-rwxr-xr-xFreeFileSync/Source/fs/abstract.h10
-rwxr-xr-xFreeFileSync/Source/fs/native.cpp2
-rwxr-xr-xFreeFileSync/Source/lib/binary.cpp1
-rwxr-xr-xFreeFileSync/Source/lib/dir_exist_async.h3
-rwxr-xr-xFreeFileSync/Source/lib/error_log.h2
-rwxr-xr-xFreeFileSync/Source/lib/hard_filter.cpp2
-rwxr-xr-xFreeFileSync/Source/lib/hard_filter.h2
-rwxr-xr-xFreeFileSync/Source/lib/icon_buffer.cpp120
-rwxr-xr-xFreeFileSync/Source/lib/icon_loader.h12
-rwxr-xr-xFreeFileSync/Source/lib/localization.cpp21
-rwxr-xr-xFreeFileSync/Source/lib/parallel_scan.cpp195
-rwxr-xr-xFreeFileSync/Source/lib/parse_lng.h4
-rwxr-xr-xFreeFileSync/Source/lib/perf_check.cpp4
-rwxr-xr-xFreeFileSync/Source/lib/process_xml.cpp147
-rwxr-xr-xFreeFileSync/Source/lib/process_xml.h2
-rwxr-xr-xFreeFileSync/Source/lib/soft_filter.h2
-rwxr-xr-xFreeFileSync/Source/lib/versioning.cpp3
-rwxr-xr-xFreeFileSync/Source/structures.cpp204
-rwxr-xr-xFreeFileSync/Source/structures.h85
-rwxr-xr-xFreeFileSync/Source/synchronization.cpp8
-rwxr-xr-xFreeFileSync/Source/ui/batch_config.cpp11
-rwxr-xr-xFreeFileSync/Source/ui/batch_status_handler.cpp4
-rwxr-xr-xFreeFileSync/Source/ui/cfg_grid.cpp32
-rwxr-xr-xFreeFileSync/Source/ui/cfg_grid.h6
-rwxr-xr-xFreeFileSync/Source/ui/command_box.cpp3
-rwxr-xr-xFreeFileSync/Source/ui/file_grid.cpp99
-rwxr-xr-xFreeFileSync/Source/ui/file_grid_attr.h10
-rwxr-xr-xFreeFileSync/Source/ui/file_view.cpp2
-rwxr-xr-xFreeFileSync/Source/ui/folder_history_box.cpp3
-rwxr-xr-xFreeFileSync/Source/ui/folder_pair.h77
-rwxr-xr-xFreeFileSync/Source/ui/folder_selector.cpp7
-rwxr-xr-xFreeFileSync/Source/ui/gui_generated.cpp832
-rwxr-xr-xFreeFileSync/Source/ui/gui_generated.h151
-rwxr-xr-xFreeFileSync/Source/ui/gui_status_handler.cpp6
-rwxr-xr-xFreeFileSync/Source/ui/main_dlg.cpp522
-rwxr-xr-xFreeFileSync/Source/ui/main_dlg.h4
-rwxr-xr-xFreeFileSync/Source/ui/progress_indicator.cpp167
-rwxr-xr-xFreeFileSync/Source/ui/progress_indicator.h3
-rwxr-xr-xFreeFileSync/Source/ui/small_dlgs.cpp136
-rwxr-xr-xFreeFileSync/Source/ui/sync_cfg.cpp295
-rwxr-xr-xFreeFileSync/Source/ui/sync_cfg.h34
-rwxr-xr-xFreeFileSync/Source/ui/tray_icon.cpp20
-rwxr-xr-xFreeFileSync/Source/ui/tray_icon.h2
-rwxr-xr-xFreeFileSync/Source/ui/tree_grid.cpp139
-rwxr-xr-xFreeFileSync/Source/ui/tree_grid.h23
-rwxr-xr-xFreeFileSync/Source/ui/tree_grid_attr.h12
-rwxr-xr-xFreeFileSync/Source/ui/triple_splitter.cpp53
-rwxr-xr-xFreeFileSync/Source/ui/triple_splitter.h3
-rwxr-xr-x[-rw-r--r--]FreeFileSync/Source/ui/version_check_impl.h2
-rwxr-xr-xFreeFileSync/Source/version/version.h2
-rwxr-xr-xwx+/bitmap_button.h3
-rwxr-xr-xwx+/choice_enum.h2
-rwxr-xr-xwx+/dc.h21
-rwxr-xr-xwx+/font_size.h1
-rwxr-xr-xwx+/graph.cpp72
-rwxr-xr-xwx+/graph.h56
-rwxr-xr-xwx+/grid.cpp82
-rwxr-xr-xwx+/grid.h8
-rwxr-xr-xwx+/image_holder.h (renamed from FreeFileSync/Source/lib/icon_holder.h)5
-rwxr-xr-xwx+/image_resources.cpp258
-rwxr-xr-xwx+/image_resources.h2
-rwxr-xr-xwx+/image_tools.cpp2
-rwxr-xr-xwx+/popup_dlg.cpp23
-rwxr-xr-xwx+/popup_dlg_generated.cpp5
-rwxr-xr-xwx+/popup_dlg_generated.h4
-rwxr-xr-xwx+/std_button_layout.h9
-rwxr-xr-xwx+/tooltip.cpp22
-rwxr-xr-xwx+/zlib_wrap.cpp4
-rwxr-xr-xzen/format_unit.cpp21
-rwxr-xr-xzen/format_unit.h26
-rwxr-xr-xzen/globals.h18
-rwxr-xr-xzen/guid.h2
-rwxr-xr-xzen/optional.h16
-rwxr-xr-xzen/perf.h7
-rwxr-xr-xzen/process_priority.cpp2
-rwxr-xr-xzen/scope_guard.h4
-rwxr-xr-xzen/sys_error.h6
-rwxr-xr-xzen/thread.h13
-rwxr-xr-xzen/time.h6
-rwxr-xr-xzen/zstring.h1
-rwxr-xr-xzenXml/zenxml/bind.h6
-rwxr-xr-xzenXml/zenxml/dom.h4
-rwxr-xr-xzenXml/zenxml/parser.h2
129 files changed, 5984 insertions, 5539 deletions
diff --git a/Changelog.txt b/Changelog.txt
index b5f6d52c..47476388 100755
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,3 +1,17 @@
+FreeFileSync 9.9 [2018-03-09]
+-----------------------------
+High DPI display support
+Allow automatic retry at configuration level
+Show error handling settings during sync
+Avoid libpng.so dependency (Linux)
+Fixed undefined behavior closing paused progress dialog
+Check if buggy DLLs are loaded into address space (Windows)
+Fixed FTP parsing error for Windows CE device
+Workaround VSS provider implementation bug
+Respect macOS user settings for date and thousands separator
+Updated translation files
+
+
FreeFileSync 9.8 [2018-02-06]
-----------------------------
New option to auto-close progress dialog
diff --git a/FreeFileSync/Build/Help/html/daylight-saving-time.html b/FreeFileSync/Build/Help/html/daylight-saving-time.html
index 148275e4..c627b45f 100755
--- a/FreeFileSync/Build/Help/html/daylight-saving-time.html
+++ b/FreeFileSync/Build/Help/html/daylight-saving-time.html
@@ -12,15 +12,16 @@
<p>
A common problem synchronization software has to handle is +-1 hour
file time shifts after a Daylight Saving Time (DST) switch has
- occurred. This can be observed, for example, when a FAT-formatted
- volume is compared against an NTFS volume, like when synchronizing a local disk against a
- USB memory stick. Files that previously appeared to be in sync are
+ occurred. This can be observed, for example, when a FAT32- or exFAT-formatted
+ volume (in the following called "FAT") is compared against an NTFS volume,
+ like when synchronizing a USB memory stick against a local disk.
+ Files that previously appeared to be in sync are
now shown with a one hour modification time offset, although they
have not been modified by the user or the operating system.
</p>
<p>
- The reason for this behavior lies in the way NTFS and FAT drives
+ The reason for this behavior lies in the way NTFS and FAT
store file times: NTFS stores time in UTC format, while FAT uses
local time.
</p>
@@ -36,7 +37,7 @@
<p>
For a detailed discussion about this issue see:<br>
- <a rel="nofollow" target="_blank" href="http://www.codeproject.com/KB/datetime/dstbugs.aspx">http://www.codeproject.com/KB/datetime/dstbugs.aspx</a>
+ <a rel="nofollow" target="_blank" href="https://www.codeproject.com/Articles/1144/Beating-the-Daylight-Savings-Time-bug-and-getting">https://www.codeproject.com/Articles/1144/Beating-the-Daylight-Savings-Time-bug</a>
<br><br>
</p>
diff --git a/FreeFileSync/Build/Languages/arabic.lng b/FreeFileSync/Build/Languages/arabic.lng
index db7feb3a..f77e5105 100755
--- a/FreeFileSync/Build/Languages/arabic.lng
+++ b/FreeFileSync/Build/Languages/arabic.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>خطأ في البنية</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target></target>
+
<source>Cannot find file %x.</source>
<target>لا يمكن العثور على المجلد %x.</target>
@@ -115,6 +118,16 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>إذا تم تجاهل هذا الخطأ سيتم اعتبار المجلدات فارغة. يتم إنشاء المجلدات المفقودة تلقائيا عند الحاجة.</target>
+<source>Comparison finished:</source>
+<target></target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+</target>
+
<source>File %x has an invalid date.</source>
<target>يحتوي الملف %x تاريخ غير صالح.</target>
@@ -175,9 +188,6 @@
<source>Using non-default global settings:</source>
<target>استخدام إعدادات عامة غير افتراضية:</target>
-<source>Starting comparison</source>
-<target>بدأ عملية المقارنة</target>
-
<source>A folder input field is empty.</source>
<target>حقل إدخال خاص بمجلد فارغ.</target>
@@ -318,15 +328,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>لا يمكن العثور على %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>نوع العنصر %x غير مدعوم:</target>
@@ -444,6 +454,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>صاحب القفل:</target>
+<source>Detecting abandoned lock...</source>
+<target>اكتشاف قفل مهمل...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -457,9 +470,6 @@ Actual: %y bytes
<pluralform>%x ثانية</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>اكتشاف قفل مهمل...</target>
-
<source>Items processed:</source>
<target>معالجة العناصر:</target>
@@ -472,8 +482,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>حدث خطأ أثناء تحليل الملف %x، الصف %y، و العمود %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>تعذر إنشاء قفل للمسار %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target></target>
<source>
<pluralform>1 thread</pluralform>
@@ -518,9 +528,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>اسم وحدة التخزين %x ليس جزءاُ من اسم الملف %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>طلب إحباط المهمة: في انتظار انتهاء المهمة الحالية...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>تعذر إنشاء بصمة زمنية من أجل المفاضلة الزمنية:</target>
@@ -533,6 +540,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>تحديد مجلد</target>
+<source>&New</source>
+<target>&جديد</target>
+
<source>&Open...</source>
<target>&فتح...</target>
@@ -748,26 +758,23 @@ The command is triggered if:
<source>job name</source>
<target>اسم المهمة</target>
-<source>Show summary</source>
-<target>إظهار الملخص</target>
-
-<source>Sleep</source>
-<target>سكون</target>
+<source>System: Sleep</source>
+<target></target>
-<source>Shut down</source>
-<target>إيقاف التشغيل</target>
+<source>System: Shut down</source>
+<target></target>
-<source>Synchronization stopped</source>
-<target>توقفت عملية المزامنة</target>
+<source>Cleaning up old log files...</source>
+<target>جاري تنظيف ملفات المتابعة القديمة...</target>
<source>Stopped</source>
<target>توقف</target>
-<source>Synchronization completed with errors</source>
-<target>انتهاء عملية المزامنة مع وجود أخطء</target>
+<source>Completed with errors</source>
+<target></target>
-<source>Synchronization completed with warnings</source>
-<target>انتهاء عملية المزامنة مع وجود تحذيرات</target>
+<source>Completed with warnings</source>
+<target></target>
<source>Warning</source>
<target>تحذير</target>
@@ -775,15 +782,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>لا يوجد شيء للمزامنة</target>
-<source>Synchronization completed successfully</source>
-<target>تمت المزامنة بنجاح</target>
+<source>Completed successfully</source>
+<target></target>
<source>Executing command %x</source>
<target>تنفيذ الأمر %x</target>
-<source>Cleaning up old log files...</source>
-<target>جاري تنظيف ملفات المتابعة القديمة...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>بإمكانك العودة إلى نافذة FreeFileSync الرئيسية لحل هذه المشكلة.</target>
@@ -799,18 +803,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>العودة إلى نافذة FreeFileSync الرئيسية</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>إعادة المحاولة بعد 0 ثانية...</pluralform>
-<pluralform>إعادة المحاولة بعد 1 ثانية واحدة...</pluralform>
-<pluralform>إعادة المحاولة بعد 2 ثانيتين...</pluralform>
-<pluralform>إعادة المحاولة بعد %x ثواني...</pluralform>
-<pluralform>إعادة المحاولة بعد %x ثانية...</pluralform>
-<pluralform>إعادة المحاولة بعد %x ثانية...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target></target>
<source>Ignore &all</source>
<target>تجاهل &الكل</target>
@@ -821,6 +815,31 @@ The command is triggered if:
<source>Serious Error</source>
<target>خطأ فادح</target>
+<source>Last session</source>
+<target>مصدر الجلسة</target>
+
+<source>Today</source>
+<target>اليوم</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>0 يوم</pluralform>
+<pluralform>1 يوم واحد</pluralform>
+<pluralform>2 يومان</pluralform>
+<pluralform>%x أيام</pluralform>
+<pluralform>%x يوماً</pluralform>
+<pluralform>%x يوم</pluralform>
+</target>
+
+<source>Name</source>
+<target>الاسم</target>
+
+<source>Last sync</source>
+<target></target>
+
<source>Folder</source>
<target>المجلد</target>
@@ -884,9 +903,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>الرجاء تحديد مجلد على نظام الملفات المحلي، الشبكة أو جهاز MTP.</target>
-<source>&New</source>
-<target>&جديد</target>
-
<source>&Save</source>
<target>&حفظ</target>
@@ -998,6 +1014,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>إجمالي عدد الـ bytes التي سيتم نسخها</target>
+<source>Arrange folder pair</source>
+<target>ترتيب زوج المجلدات</target>
+
<source>Folder pair:</source>
<target>زوج المجلدات:</target>
@@ -1090,11 +1109,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>اصطلاح التسمية:</target>
-<source>&Ignore errors</source>
-<target>&تجاهل الأخطاء</target>
+<source>Ignore errors</source>
+<target></target>
-<source>Show pop-up on errors or warnings</source>
-<target>إظهار إطارات منبثقة عند حصول أخطاء أو تحذيرات</target>
+<source>Retry count:</source>
+<target>تعداد محاولات الإعادة:</target>
+
+<source>Delay (in seconds):</source>
+<target>التأخير (بالثواني):</target>
<source>Run a command after synchronization:</source>
<target>تشغيل أمر بعد المزامنة:</target>
@@ -1102,9 +1124,6 @@ The command is triggered if:
<source>OK</source>
<target>موافق</target>
-<source>Arrange folder pair</source>
-<target>ترتيب زوج المجلدات</target>
-
<source>Enter your login details:</source>
<target>أدخل تفاصيل تسجيل الدخول:</target>
@@ -1201,12 +1220,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>تصغير إلى منطقة التنبيهات</target>
-<source>Bytes copied:</source>
-<target>Bytes المنسوخة:</target>
-
<source>When finished:</source>
<target>عند الانتهاء:</target>
+<source>Auto-close</source>
+<target></target>
+
<source>Close</source>
<target>إغلاق</target>
@@ -1219,12 +1238,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>إنشاء ملف دفعي من أجل عمليات المزامنة غير المحضورة. للبدأ, انقر نقراً مزدوجاً على الملف أو المهمة المجدولة في منظم المهام: %x</target>
+<source>Progress dialog:</source>
+<target></target>
+
<source>Run minimized</source>
<target>تشغيل بوضع التصغير</target>
<source>&Show error dialog</source>
<target>&إظهار نافذة الأخطاء</target>
+<source>Show pop-up on errors or warnings</source>
+<target>إظهار إطارات منبثقة عند حصول أخطاء أو تحذيرات</target>
+
<source>&Cancel</source>
<target>&إلغاء</target>
@@ -1273,14 +1298,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>نقل أذونات الملفات و المجلدات.</target>
-<source>Automatic retry on error:</source>
-<target>إعادة المحاولة بشكل تلقائي عند حصول خطأ:</target>
-
-<source>Retry count:</source>
-<target>تعداد محاولات الإعادة:</target>
+<source>Show hidden dialogs again</source>
+<target>إظهار التنبهات و نوافذ الحوار المخفية</target>
-<source>Delay (in seconds):</source>
-<target>التأخير (بالثواني):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>إعادة إظهار جميع التنبهات و نوافذ الحوار التي تم إخفاؤها</target>
<source>Customize context menu:</source>
<target>تخصيص القائمة المحلية:</target>
@@ -1288,12 +1310,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>الوصف</target>
-<source>Show hidden dialogs again</source>
-<target>إظهار التنبهات و نوافذ الحوار المخفية</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>إعادة إظهار جميع التنبهات و نوافذ الحوار التي تم إخفاؤها</target>
-
<source>&Default</source>
<target>الا&فتراضي</target>
@@ -1348,14 +1364,23 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>تنشيط دون اتصال</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target></target>
+
+<source>Synchronization Settings</source>
+<target>إعدادات المزامنة</target>
+
+<source>Access Online Storage</source>
+<target></target>
+
<source>Save as a Batch Job</source>
<target>حفظ كمهمة دفعية</target>
<source>Delete Items</source>
<target>حذف العناصر</target>
-<source>Copy items</source>
-<target>نسخ العناصر</target>
+<source>Copy Items</source>
+<target></target>
<source>Options</source>
<target>خيارات</target>
@@ -1366,6 +1391,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target></target>
+
<source>&Options</source>
<target>&خيارات</target>
@@ -1505,9 +1533,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>حدد المجال الزمني...</target>
-<source>Last session</source>
-<target>مصدر الجلسة</target>
-
<source>Folder Comparison and Synchronization</source>
<target>مقارنة و مزامنة المجلد</target>
@@ -1526,8 +1551,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&لا تحفظ</target>
-<source>Remove entry from list</source>
-<target>إزالة المدخلة من القائمة</target>
+<source>Hide configuration</source>
+<target></target>
+
+<source>Highlight...</source>
+<target></target>
<source>Clear filter</source>
<target>إزالة الفلاتر الحالية</target>
@@ -1607,6 +1635,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>تم الإيقاف مؤقتاً</target>
+<source>Stop requested...</source>
+<target></target>
+
<source>Initializing...</source>
<target>التجهيز للبدأ...</target>
@@ -1616,9 +1647,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>مقارنة المحتوى...</target>
-<source>Completed</source>
-<target>انتهت العملية</target>
-
<source>Info</source>
<target>معلومات</target>
@@ -1712,12 +1740,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>معلمات الجانب المعاكس</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>إظهار التنبيهات و نوافذ الحوار المخفية مرة ثانية؟</target>
-
-<source>&Show</source>
-<target>&إظهار</target>
-
<source>Downloading update...</source>
<target>جار تحميل التحديث...</target>
@@ -1742,18 +1764,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>تحديد قواعد المزامنة الخاصة بك.</target>
-<source>Synchronization Settings</source>
-<target>إعدادات المزامنة</target>
-
<source>Comparison</source>
<target>المقارنة</target>
<source>Synchronization</source>
<target>المزامنة</target>
-<source>Today</source>
-<target>اليوم</target>
-
<source>This week</source>
<target>هذا الأسبوع</target>
@@ -1823,9 +1839,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>ملفات</target>
-<source>Name</source>
-<target>الاسم</target>
-
<source>Percentage</source>
<target>النسبة المئوية</target>
@@ -1945,19 +1958,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x ساعة</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>0 يوم</pluralform>
-<pluralform>1 يوم واحد</pluralform>
-<pluralform>2 يومان</pluralform>
-<pluralform>%x أيام</pluralform>
-<pluralform>%x يوماً</pluralform>
-<pluralform>%x يوم</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>لا يمكن تعيين امتيازات %x.</target>
@@ -2021,8 +2021,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>سطح المكتب</target>
-<source>Start menu</source>
-<target>قائمة إبدأ</target>
+<source>Start Menu</source>
+<target></target>
+
+<source>Send To</source>
+<target></target>
<source>Registering FreeFileSync file extensions</source>
<target>جار تسجيل امتدادات الملفات لـ FreeFileSync</target>
@@ -2051,6 +2054,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>الرجاء اختيار نوع التثبيت المحلي أو اختيار مجلد آخر للتثبيت.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>وضع التثبيت الصامت متوفر فقط في FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target></target>
diff --git a/FreeFileSync/Build/Languages/bulgarian.lng b/FreeFileSync/Build/Languages/bulgarian.lng
index 2f34bbf0..4d30763f 100755
--- a/FreeFileSync/Build/Languages/bulgarian.lng
+++ b/FreeFileSync/Build/Languages/bulgarian.lng
@@ -7,11 +7,8 @@
<plural_definition>n == 1 ? 0 : 1</plural_definition>
</header>
-<source>Cannot set directory locks for the following folders:</source>
-<target></target>
-
<source>Both sides have changed since last synchronization.</source>
-<target>Двете страни са променени след последната синхронизация.</target>
+<target>Двете страни променени след последната синхронизация.</target>
<source>Cannot determine sync-direction:</source>
<target>Не може да определи посоката на синхронизация:</target>
@@ -121,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Ако тази грешка се игнорира, папките се считат празни. Липсващи папки се създават автоматично при нужда.</target>
+<source>Comparison finished:</source>
+<target>Сравняването завърши:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 елемент намерен</pluralform>
+<pluralform>%x елемента намерени</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Файл %x има невалидна дата.</target>
@@ -181,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Използва нестандартни глобални настройки:</target>
-<source>Starting comparison</source>
-<target>Започва сравняване</target>
-
<source>A folder input field is empty.</source>
<target>Полето за въведена папка е празно.</target>
@@ -324,15 +330,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>Не е намерен %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Типа на елемент %x не се поддържа:</target>
@@ -438,6 +444,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>Притежател на заключването:</target>
+<source>Detecting abandoned lock...</source>
+<target>Открива изоставено заключване...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -447,9 +456,6 @@ Actual: %y bytes
<pluralform>%x сек.</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Открива изоставено заключване...</target>
-
<source>Items processed:</source>
<target>Обработени елементи:</target>
@@ -462,6 +468,9 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Грешка при анализ на файл %x, ред %y, колона %z.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Не може да заключи директориите за следните папки:</target>
+
<source>
<pluralform>1 thread</pluralform>
<pluralform>%x threads</pluralform>
@@ -484,7 +493,7 @@ Actual: %y bytes
<target>Покажи в Експлорера</target>
<source>Open with default application</source>
-<target>Отвори с подразбираното приложение</target>
+<target>Отвори с приложение по подразбиране</target>
<source>Browse directory</source>
<target>Преглед на директорията</target>
@@ -501,9 +510,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>Името на тома %x не е част от пътя до файла %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Заявка за стоп: изчаква завършване на текущата операция...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Не може да отбележи времето на версификация:</target>
@@ -516,6 +522,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>Изберете папка</target>
+<source>&New</source>
+<target>&Нов</target>
+
<source>&Open...</source>
<target>&Отвори...</target>
@@ -731,26 +740,23 @@ The command is triggered if:
<source>job name</source>
<target>име на задачата</target>
-<source>Show summary</source>
-<target>Покажи резюме</target>
-
-<source>Sleep</source>
-<target>Заспиване</target>
+<source>System: Sleep</source>
+<target>Система: Заспиване</target>
-<source>Shut down</source>
-<target>Изключване</target>
+<source>System: Shut down</source>
+<target>Система: Изключване</target>
-<source>Synchronization stopped</source>
-<target>Синхронизацията е спряна</target>
+<source>Cleaning up old log files...</source>
+<target>Изчиства старите протоколни файлове...</target>
<source>Stopped</source>
<target>Спряно</target>
-<source>Synchronization completed with errors</source>
-<target>Синхронизацията завърши с грешки</target>
+<source>Completed with errors</source>
+<target>Завърши с грешки</target>
-<source>Synchronization completed with warnings</source>
-<target>Синхронизацията завърши с предупреждения</target>
+<source>Completed with warnings</source>
+<target>Завърши с предупреждения</target>
<source>Warning</source>
<target>Предупреждение</target>
@@ -758,17 +764,14 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>Няма нищо за синхронизиране</target>
-<source>Synchronization completed successfully</source>
-<target>Синхронизацията завърши успешно</target>
+<source>Completed successfully</source>
+<target>Завърши успешно</target>
<source>Executing command %x</source>
<target>Изпълнява команда %x</target>
-<source>Cleaning up old log files...</source>
-<target>Изчиства старите log-файлове...</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>&Не показвай вече това предупреждение</target>
@@ -780,16 +783,10 @@ The command is triggered if:
<target>&Превключи</target>
<source>Switching to FreeFileSync's main window</source>
-<target>Иди на главното меню на FreeFileSync</target>
+<target>Иди в главното меню на FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Автоматично повтаряне след 1 сек...</pluralform>
-<pluralform>Автоматично повтаряне след %x сек...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Автоматично повтаряне</target>
<source>Ignore &all</source>
<target>Игнорирай &всички</target>
@@ -884,9 +881,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Моля, изберете папка от локална файлова система, мрежа или MTP-устройство.</target>
-<source>&New</source>
-<target>&Нов</target>
-
<source>&Save</source>
<target>&Запази</target>
@@ -921,7 +915,7 @@ The command is triggered if:
<target>&Намери...</target>
<source>&Export file list...</source>
-<target>&Експортирай файловия списък...</target>
+<target>&Експортирай списъка с файлове...</target>
<source>&Reset layout</source>
<target>&Инициализирай изгледа</target>
@@ -930,10 +924,10 @@ The command is triggered if:
<target>&Инструменти</target>
<source>&Check for updates now</source>
-<target>&Провери за обновления веднага</target>
+<target>&Провери за обновления сега</target>
<source>Check &automatically once a week</source>
-<target>Автоматично веднъж &седмично</target>
+<target>Провери автоматично &ежеседмично</target>
<source>Cancel</source>
<target>Отказ</target>
@@ -951,7 +945,7 @@ The command is triggered if:
<target>Отнеми двойка папки</target>
<source>Access online storage</source>
-<target>Достъп до онлайн съхранение</target>
+<target>Достъп до онлайн-запазване</target>
<source>Swap sides</source>
<target>Размени страните</target>
@@ -963,7 +957,7 @@ The command is triggered if:
<target>Търси:</target>
<source>Match case</source>
-<target>Точно съвпадение</target>
+<target>Големи/малки букви</target>
<source>New</source>
<target>Нова</target>
@@ -998,6 +992,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>Общо байтове за копиране</target>
+<source>Arrange folder pair</source>
+<target>Подреди двойката папки</target>
+
<source>Folder pair:</source>
<target>Двойка папки:</target>
@@ -1062,7 +1059,7 @@ The command is triggered if:
<target>И&зчисти</target>
<source>Detect moved files</source>
-<target>Откриване на преместени файлове</target>
+<target>Открий преместени файлове</target>
<source>
- Not supported by all file systems
@@ -1076,7 +1073,7 @@ The command is triggered if:
</target>
<source>Delete files:</source>
-<target>Изтриване на файлове:</target>
+<target>Изтрий файлове:</target>
<source>&Recycle bin</source>
<target>&Кошче</target>
@@ -1090,11 +1087,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>Конвенция за именуване:</target>
-<source>&Ignore errors</source>
-<target>&Игнорирай грешките</target>
+<source>Ignore errors</source>
+<target>Игнорирай грешките</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Питай при грешки или предупреждения</target>
+<source>Retry count:</source>
+<target>Брой повторения:</target>
+
+<source>Delay (in seconds):</source>
+<target>Задръжка (сек.):</target>
<source>Run a command after synchronization:</source>
<target>След синхронизация изпълни команда:</target>
@@ -1102,9 +1102,6 @@ The command is triggered if:
<source>OK</source>
<target>ОК</target>
-<source>Arrange folder pair</source>
-<target>Подреди двойката папки</target>
-
<source>Enter your login details:</source>
<target>Въведете входните си данни:</target>
@@ -1151,16 +1148,16 @@ The command is triggered if:
<target>Директория на сървъра:</target>
<source>Performance improvements:</source>
-<target>Подобряване на работата:</target>
+<target>Подобряване на производителността:</target>
<source>How to get best performance?</source>
-<target>Как да се получи най-добра работа?</target>
+<target>Как да се получи най-добра производителност?</target>
<source>Connections for directory reading:</source>
<target>Връзки за четене на папка:</target>
<source>SFTP channels per connection:</source>
-<target>SFTP-канали за една връзка:</target>
+<target>SFTP-канали на връзка:</target>
<source>Detect server limit</source>
<target>Открий лимита на сървъра</target>
@@ -1172,7 +1169,7 @@ The command is triggered if:
<target>Изберете папка</target>
<source>Start synchronization now?</source>
-<target>Синхронизирай веднага?</target>
+<target>Синхронизирай сега?</target>
<source>Variant:</source>
<target>Вариант:</target>
@@ -1201,11 +1198,11 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>Минимизирай в известяващото поле</target>
-<source>Bytes copied:</source>
-<target>Копирани байтове:</target>
-
<source>When finished:</source>
-<target>При завършване:</target>
+<target>След завършване:</target>
+
+<source>Auto-close</source>
+<target>Затвори автоматично</target>
<source>Close</source>
<target>Затвори</target>
@@ -1219,12 +1216,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Създай пакетен файл за автоматична синхронизация. За старт двукратно щракнете върху този файл или задайте планова задача: %x</target>
+<source>Progress dialog:</source>
+<target>Диалог за прогреса:</target>
+
<source>Run minimized</source>
-<target>Изпълни в минимизиран вид</target>
+<target>Изпълни минимизирано</target>
<source>&Show error dialog</source>
<target>&Покажи диалог за грешките</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Питай при грешки или предупреждения</target>
+
<source>&Cancel</source>
<target>&Отказ</target>
@@ -1241,7 +1244,7 @@ The command is triggered if:
<target>Ограничи максималния брой протоколни файлове</target>
<source>How can I schedule a batch job?</source>
-<target>Как да се планира пакетна задача?</target>
+<target>Как да планирам пакетна задача?</target>
<source>&Keep relative paths</source>
<target>&Запази относителните пътища</target>
@@ -1258,7 +1261,7 @@ This guarantees a consistent state even in case of a serious error.
</source>
<target>
Копирай във временен файл (*.ffs_tmp) преди презапис на целевия файл.
-Това гарантира цялостност на файла дори в случай на сериозна грешка.
+Това гарантира цялостност на файла и в случай на сериозна грешка.
</target>
<source>recommended</source>
@@ -1273,14 +1276,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Прехвърли правата за достъп на файла и папката.</target>
-<source>Automatic retry on error:</source>
-<target>Автоматично повтаряне при грешка:</target>
-
-<source>Retry count:</source>
-<target>Брой повторения:</target>
+<source>Show hidden dialogs again</source>
+<target>Покажи скритите диалози отново</target>
-<source>Delay (in seconds):</source>
-<target>Задръжка (сек.):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Покажи всички постоянно скрити диалози и предупреждения отново</target>
<source>Customize context menu:</source>
<target>Настрой контекстното меню:</target>
@@ -1288,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>Описание</target>
-<source>Show hidden dialogs again</source>
-<target>Покажи скритите диалози отново</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Покажи всички постоянно скрити диалози и предупреждения отново</target>
-
<source>&Default</source>
<target>&По подразбиране</target>
@@ -1304,7 +1298,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Ако харесвате FreeFileSync:</target>
<source>Support with a donation</source>
-<target>Подкрепа с дарение</target>
+<target>Подкрепете с дарение</target>
<source>Donation details</source>
<target>Подробности за дарение</target>
@@ -1325,10 +1319,10 @@ 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>Activate the FreeFileSync Donation Edition by one of the following methods:</source>
-<target>Активирайте FreeFileSync-Дарителско-Издание по един от следните методи:</target>
+<target>Активирайте дарителско издание на FreeFileSync по един от следните методи:</target>
<source>1. Activate via internet now:</source>
<target>1. Активиране по Интернет:</target>
@@ -1337,7 +1331,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Активирайте онлайн</target>
<source>2. Retrieve an offline activation key from the following URL:</source>
-<target>2. Вземете офлайн-активационен-код от следния адрес:</target>
+<target>2. Вземете активационен код за офлайн от следния адрес:</target>
<source>&Copy to clipboard</source>
<target>&Копирайте в клипборда</target>
@@ -1351,26 +1345,32 @@ This guarantees a consistent state even in case of a serious error.
<source>Highlight configurations that have not been run for more than the following number of days:</source>
<target>Маркирай конфигурациите, които не са изпълнявани в течение на повече от следния брой дни:</target>
+<source>Synchronization Settings</source>
+<target>Настройки на Синхронизация</target>
+
+<source>Access Online Storage</source>
+<target>Достъп до Онлайн-Запазване</target>
+
<source>Save as a Batch Job</source>
-<target>Запази като пакетна задача</target>
+<target>Запази като Пакетна Задача</target>
<source>Delete Items</source>
-<target>Изтрий елементите</target>
+<target>Изтрий Елементите</target>
-<source>Copy items</source>
-<target>Копирай елементите</target>
+<source>Copy Items</source>
+<target>Копирай Елементите</target>
<source>Options</source>
<target>Опции</target>
<source>Select Time Span</source>
-<target>Избор на времеви интервал</target>
+<target>Избор на Интервал Време</target>
<source>FreeFileSync Donation Edition</source>
-<target>FreeFileSync-Дарителско-Издание</target>
+<target>FreeFileSync Дарителско Издание</target>
<source>Highlight Configurations</source>
-<target>Маркирай конфигурациите</target>
+<target>Маркирай Конфигурациите</target>
<source>&Options</source>
<target>&Опции</target>
@@ -1597,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>Пауза</target>
+<source>Stop requested...</source>
+<target>Заявка за стоп...</target>
+
<source>Initializing...</source>
<target>Инициализация...</target>
@@ -1606,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>Сравнява съдържанието на файлове...</target>
-<source>Completed</source>
-<target>Готово</target>
-
<source>Info</source>
<target>Информация</target>
@@ -1690,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Параметри за срещуположната страна</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Да покажа ли скритите диалози и предупреждения отново?</target>
-
-<source>&Show</source>
-<target>&Покажи</target>
-
<source>Downloading update...</source>
<target>Сваляне на актуализация...</target>
@@ -1720,9 +1714,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>Създаване на собствени правила за синхронизация.</target>
-<source>Synchronization Settings</source>
-<target>Настройки за синхронизация</target>
-
<source>Comparison</source>
<target>Сравняване</target>
@@ -1772,7 +1763,7 @@ This guarantees a consistent state even in case of a serious error.
<target>Добави времето към името на всеки файл</target>
<source>On completion:</source>
-<target>При завършване:</target>
+<target>След завършване:</target>
<source>On errors:</source>
<target>При грешки:</target>
@@ -1814,16 +1805,16 @@ This guarantees a consistent state even in case of a serious error.
<target>Проверка за нова версия на програмата</target>
<source>Auto-update now or download manually from the FreeFileSync home page?</source>
-<target>Автоматично актуализиране веднага или ръчно сваляне от домашната страница на FreeFileSync?</target>
+<target>Автоматично актуализиране сега или ръчно сваляне от домашната страница на FreeFileSync?</target>
<source>&Auto-update</source>
-<target>&Автоматично актуализиране</target>
+<target>&Автоматично</target>
<source>&Home page</source>
<target>&Домашна страница</target>
<source>Download now?</source>
-<target>Свали веднага?</target>
+<target>Свали сега?</target>
<source>&Download</source>
<target>&Сваляне</target>
@@ -1844,19 +1835,19 @@ This guarantees a consistent state even in case of a serious error.
<target>Инсталацията е регистрирана на различна операционна система.</target>
<source>Failed to activate FreeFileSync Donation Edition.</source>
-<target>Не може да активира FreeFileSync-Дарителско-Издание.</target>
+<target>Неуспешно активиране на FreeFileSync Дарителско Издание.</target>
<source>Incorrect activation key.</source>
-<target>Неверен активационен код.</target>
+<target>Невалиден активиращ код.</target>
<source>Unable to register to receive system messages.</source>
-<target>Невъзможна регистрация за получаване на системни съобщения.</target>
+<target>Не се регистрира за получаване на системни съобщения.</target>
<source>Cannot find system function %x.</source>
-<target>Не е намерена системната функция %x.</target>
+<target>Не намира системната функция %x.</target>
<source>Unable to register device notifications for %x.</source>
-<target>Не се регистрират съобщенията на устройство %x.</target>
+<target>Не регистрира съобщенията на устройство %x.</target>
<source>Cannot monitor directory %x.</source>
<target>Не може да следи директория %x.</target>
@@ -1972,11 +1963,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>На десктопа</target>
-<source>Start menu</source>
-<target>В стартовото меню</target>
+<source>Start Menu</source>
+<target>Стартово Меню</target>
<source>Send To</source>
-<target>Изпрати до</target>
+<target>Изпрати До</target>
<source>Registering FreeFileSync file extensions</source>
<target>Регистриране на файлови разширения за FreeFileSync</target>
@@ -1985,16 +1976,16 @@ This guarantees a consistent state even in case of a serious error.
<target>Де-регистриране на файлови разширения за FreeFileSync</target>
<source>FreeFileSync Configuration</source>
-<target>Конфигуриране на FreeFileSync</target>
+<target>Конфигурация на FreeFileSync</target>
<source>FreeFileSync Batch File</source>
-<target>Пакетен файл на FreeFileSync</target>
+<target>Пакетен Файл на FreeFileSync</target>
<source>FreeFileSync Synchronization Database</source>
-<target>Синхронизираща база данни на FreeFileSync</target>
+<target>Синхронизираща База Данни на FreeFileSync</target>
<source>RealTimeSync Configuration</source>
-<target>Конфигуриране на RealTimeSync</target>
+<target>Конфигурация на RealTimeSync</target>
<source>Edit with FreeFileSync</source>
<target>Редактиране с FreeFileSync</target>
@@ -2006,5 +1997,5 @@ This guarantees a consistent state even in case of a serious error.
<target>Моля, изберете локален тип инсталация или пък друга папка за инсталация.</target>
<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
-<target>Опцията %x инсталиране е възможна само за FreeFileSync-ДарителскоИздание.</target>
+<target>Опцията %x инсталиране е възможна само за FreeFileSync Дарителско Издание.</target>
diff --git a/FreeFileSync/Build/Languages/chinese_simple.lng b/FreeFileSync/Build/Languages/chinese_simple.lng
index 4cf6efb4..03a647de 100755
--- a/FreeFileSync/Build/Languages/chinese_simple.lng
+++ b/FreeFileSync/Build/Languages/chinese_simple.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>Creating file %x</source>
<target>正在创建文件 %x</target>
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>语法错误</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>在 %x 之后预期的是一个左边 和一个右边的目录路径.</target>
+
<source>Cannot find file %x.</source>
<target>无法找到文件 %x.</target>
@@ -77,7 +80,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>
@@ -107,13 +110,24 @@
<target>打开已选定的配置文件仅进行编辑而不执行.</target>
<source>Path to an alternate GlobalSettings.xml file.</source>
-<target>指向一个替代的GlobalSettings.xml文件的路径.</target>
+<target>指向一个替代的 GlobalSettings.xml 文件的路径.</target>
<source>Cannot find the following folders:</source>
<target>无法找到如下文件夹:</target>
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>如果这个错误被忽略文件夹将被认为是空的. 当有必要时丢失的文件夹将会被创建.</target>
+<target>如果这个错误被忽略, 文件夹将被认为是空的. 当有必要时丢失的 文件夹将会被创建.</target>
+
+<source>Comparison finished:</source>
+<target>比较已完成:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>找到 %x 个项目</pluralform>
+</target>
<source>File %x has an invalid date.</source>
<target>文件 %x 的日期非法.</target>
@@ -128,7 +142,7 @@
<target>大小:</target>
<source>Content comparison was skipped for excluded files.</source>
-<target>对于已排除的文件跳过内容比对.</target>
+<target>对于已排除的文件跳过内容比较.</target>
<source>Items differ in attributes only</source>
<target>项目仅是文件属性不同</target>
@@ -175,9 +189,6 @@
<source>Using non-default global settings:</source>
<target>使用非默认全局设置:</target>
-<source>Starting comparison</source>
-<target>正在开始比较</target>
-
<source>A folder input field is empty.</source>
<target>有一个文件夹输入框为空.</target>
@@ -188,7 +199,7 @@
<target>排除:</target>
<source>One base folder of a folder pair is contained in the other one.</source>
-<target>文件夹对中的一个基础文件夹被另一个所包含.</target>
+<target>文件夹对中的一个基础文件夹 被另一个所包含.</target>
<source>The folder should be excluded from synchronization via filter.</source>
<target>此文件夹须使用过滤器从同步中排除.</target>
@@ -271,7 +282,7 @@ Actual: %y bytes
<target>无法写入 %x 的权限.</target>
<source>Operation not supported for different base folder types.</source>
-<target>对于不同基础文件夹类型此操作不被支持.</target>
+<target>对于不同基础文件夹类型 此操作不被支持.</target>
<source>Cannot write file %x.</source>
<target>无法写入文件 %x .</target>
@@ -318,15 +329,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>无法找到 %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>项目 %x 的类型不被支持:</target>
@@ -406,7 +417,7 @@ Actual: %y bytes
<target>数据库文件已损坏:</target>
<source>The database files do not yet contain information about the last synchronization.</source>
-<target>此数据库文件并未包含有关最后同步的信息.</target>
+<target>此数据库文件并未包含 有关最后同步的信息.</target>
<source>Loading file %x...</source>
<target>正在加载文件 %x...</target>
@@ -429,6 +440,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>锁定的所有者:</target>
+<source>Detecting abandoned lock...</source>
+<target>正在检测被遗弃的锁定...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -437,9 +451,6 @@ Actual: %y bytes
<pluralform>%x 秒</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>正在检测被遗弃的锁定...</target>
-
<source>Items processed:</source>
<target>已处理的项目:</target>
@@ -452,8 +463,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>当分析文件 %x , 行 %y, 列 %z 时出错.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>无法为 %x 设置目录锁定.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>无法为如下文件夹设置 目录锁定:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -485,7 +496,7 @@ Actual: %y bytes
<target>无法访问卷影复制服务.</target>
<source>Please run the 64-bit version of FreeFileSync to create shadow copies on this system.</source>
-<target>请运行FreeFileSync的64位版本来在此系统上创建卷影.</target>
+<target>请运行 FreeFileSync 的64位版本来在此系统上创建卷影.</target>
<source>Cannot determine volume name for %x.</source>
<target>无法为 %x 确定卷名.</target>
@@ -493,9 +504,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>卷名 %x 不是文件路径 %y 的一部分.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>停止请求: 等待当前操作完成...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>无法为历史版本创建时间戳:</target>
@@ -508,6 +516,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>选择一个文件夹</target>
+<source>&New</source>
+<target>新建(&N)</target>
+
<source>&Open...</source>
<target>打开(&O)...</target>
@@ -560,7 +571,7 @@ Actual: %y bytes
<target>空闲时间(秒):</target>
<source>Idle time between last detected change and execution of command</source>
-<target>最后检测到改变和命令执行之间的空闲时间</target>
+<target>最后检测到改变和 命令执行之间的空闲时间</target>
<source>Command line:</source>
<target>命令行:</target>
@@ -688,7 +699,7 @@ The command is triggered if:
<target>如下项目有无法解决的冲突并将不会被同步:</target>
<source>The following folders are significantly different. Please check that the correct folders are selected for synchronization.</source>
-<target>如下的文件夹有显著不同. 请检查是否选择了正确的文件夹来进行同步.</target>
+<target>如下的文件夹有显著不同. 请检查是否选择了正确 的文件夹来进行同步.</target>
<source>Not enough free disk space available in:</source>
<target>没有足够的可用磁盘空间:</target>
@@ -697,10 +708,10 @@ The command is triggered if:
<target>可用:</target>
<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>某些文件将作为多个基础文件夹的一部分被同步.</target>
+<target>某些文件将作为多个基础文件夹 的一部分被同步.</target>
<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>为了避免冲突, 请设置排除过滤器, 以便每个已更新的文件仅被一个基础文件夹所考虑.</target>
+<target>为了避免冲突, 请设置排除过滤器, 以便每个已更新的文件 仅被一个基础文件夹所考虑.</target>
<source>Versioning folder:</source>
<target>历史版本文件夹:</target>
@@ -709,7 +720,7 @@ The command is triggered if:
<target>基础文件夹:</target>
<source>The versioning folder is contained in a base folder.</source>
-<target>历史版本文件夹被包含在一个基础文件夹中.</target>
+<target>历史版本文件夹被包含 在一个基础文件夹中.</target>
<source>Synchronizing folder pair:</source>
<target>正在同步成对的文件夹:</target>
@@ -723,26 +734,23 @@ The command is triggered if:
<source>job name</source>
<target>作业名称</target>
-<source>Show summary</source>
-<target>显示摘要</target>
-
-<source>Sleep</source>
-<target>休眠</target>
+<source>System: Sleep</source>
+<target>系统: 休眠</target>
-<source>Shut down</source>
-<target>关机</target>
+<source>System: Shut down</source>
+<target>系统: 关机</target>
-<source>Synchronization stopped</source>
-<target>同步已停止</target>
+<source>Cleaning up old log files...</source>
+<target>正在清理旧日志文件...</target>
<source>Stopped</source>
<target>已停止</target>
-<source>Synchronization completed with errors</source>
-<target>同步已完成但有错误</target>
+<source>Completed with errors</source>
+<target>已完成但有错误</target>
-<source>Synchronization completed with warnings</source>
-<target>同步已完成但有警告</target>
+<source>Completed with warnings</source>
+<target>已完成但有警告</target>
<source>Warning</source>
<target>警告</target>
@@ -750,15 +758,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>没有什么可同步</target>
-<source>Synchronization completed successfully</source>
-<target>同步成功完成</target>
+<source>Completed successfully</source>
+<target>成功完成</target>
<source>Executing command %x</source>
<target>正在执行命令 %x</target>
-<source>Cleaning up old log files...</source>
-<target>正在清理旧日志文件...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>你可以切换至 FreeFileSync 的主窗口来解决这个问题.</target>
@@ -774,13 +779,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>切换至 FreeFileSync 的主窗口</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>在 %x 秒后自动重试...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>自动重试</target>
<source>Ignore &all</source>
<target>忽略所有(&A)</target>
@@ -791,6 +791,26 @@ The command is triggered if:
<source>Serious Error</source>
<target>严重错误</target>
+<source>Last session</source>
+<target>最后会话</target>
+
+<source>Today</source>
+<target>今天</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x 天</pluralform>
+</target>
+
+<source>Name</source>
+<target>文件名</target>
+
+<source>Last sync</source>
+<target>最后同步</target>
+
<source>Folder</source>
<target>文件夹</target>
@@ -854,9 +874,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>请选择在本地文件系统, 网络或MTP设备上的文件夹.</target>
-<source>&New</source>
-<target>新建(&N)</target>
-
<source>&Save</source>
<target>保存(&S)</target>
@@ -968,6 +985,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>要复制的总字节数</target>
+<source>Arrange folder pair</source>
+<target>排列文件夹对</target>
+
<source>Folder pair:</source>
<target>文件夹对:</target>
@@ -1026,7 +1046,7 @@ 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>清除(&L)</target>
@@ -1060,11 +1080,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>命名规则:</target>
-<source>&Ignore errors</source>
-<target>忽略错误(&I)</target>
+<source>Ignore errors</source>
+<target>忽略错误</target>
-<source>Show pop-up on errors or warnings</source>
-<target>在错误或警告时显示弹出对话框</target>
+<source>Retry count:</source>
+<target>重试计数:</target>
+
+<source>Delay (in seconds):</source>
+<target>延时 (秒):</target>
<source>Run a command after synchronization:</source>
<target>同步之后运行一个命令:</target>
@@ -1072,9 +1095,6 @@ The command is triggered if:
<source>OK</source>
<target>确定</target>
-<source>Arrange folder pair</source>
-<target>排列文件夹对</target>
-
<source>Enter your login details:</source>
<target>输入你的登录详细资料:</target>
@@ -1171,12 +1191,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>最小化到系统托盘</target>
-<source>Bytes copied:</source>
-<target>字节被复制:</target>
-
<source>When finished:</source>
<target>当完成时:</target>
+<source>Auto-close</source>
+<target>自动关闭</target>
+
<source>Close</source>
<target>关闭</target>
@@ -1189,12 +1209,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>创建一个用于无人值守同步的批处理文件. 要开始, 双击这个文件或任务计划器中的计划调度: %x</target>
+<source>Progress dialog:</source>
+<target>进度对话框:</target>
+
<source>Run minimized</source>
<target>以最小化运行</target>
<source>&Show error dialog</source>
<target>显示错误对话框(&S)</target>
+<source>Show pop-up on errors or warnings</source>
+<target>在错误或警告时显示弹出对话框</target>
+
<source>&Cancel</source>
<target>取消(&C)</target>
@@ -1226,7 +1252,7 @@ The command is triggered if:
Copy to a temporary file (*.ffs_tmp) before overwriting target.
This guarantees a consistent state even in case of a serious error.
</source>
-<target>在覆盖目标之前先复制到临时文件(*.ffs_tmp). 这样即使在发生严重错误的情况下也可以保证有一致的状态.</target>
+<target>在覆盖目标之前先复制到临时文件(*.ffs_tmp). 这样即使在发生严重错误的情况下, 也可以保证有一致的状态.</target>
<source>recommended</source>
<target>推荐</target>
@@ -1240,14 +1266,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>传输文件及文件夹的权限.</target>
-<source>Automatic retry on error:</source>
-<target>在出错时自动重试:</target>
-
-<source>Retry count:</source>
-<target>重试计数:</target>
+<source>Show hidden dialogs again</source>
+<target>重新显示被隐藏的对话框</target>
-<source>Delay (in seconds):</source>
-<target>延时 (秒):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>重新显示所有被永久性隐藏的 对话框和警告信息</target>
<source>Customize context menu:</source>
<target>自定义右键菜单:</target>
@@ -1255,12 +1278,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>描述</target>
-<source>Show hidden dialogs again</source>
-<target>重新显示被隐藏的对话框</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>重新显示所有被永久性隐藏的对话框和警告信息</target>
-
<source>&Default</source>
<target>默认(&D)</target>
@@ -1295,7 +1312,7 @@ This guarantees a consistent state even in case of a serious error.
<target>非常感谢以下本地化翻译者:</target>
<source>Activate the FreeFileSync Donation Edition by one of the following methods:</source>
-<target>激活FreeFileSync捐赠版可用如下方式之一:</target>
+<target>激活 FreeFileSync 捐赠版可用如下方式之一:</target>
<source>1. Activate via internet now:</source>
<target>1. 现在就通过互联网激活:</target>
@@ -1315,13 +1332,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>离线激活</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>突出显示那些超过如下天数 未运行的配置文件:</target>
+
+<source>Synchronization Settings</source>
+<target>同步设置</target>
+
+<source>Access Online Storage</source>
+<target>访问在线存储</target>
+
<source>Save as a Batch Job</source>
<target>保存为批处理作业</target>
<source>Delete Items</source>
<target>删除项目</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>复制项目</target>
<source>Options</source>
@@ -1333,6 +1359,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync捐赠版</target>
+<source>Highlight Configurations</source>
+<target>突出显示配置文件</target>
+
<source>&Options</source>
<target>选项(&O)</target>
@@ -1452,9 +1481,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>选择时间跨度...</target>
-<source>Last session</source>
-<target>最后会话</target>
-
<source>Folder Comparison and Synchronization</source>
<target>文件夹比较与同步</target>
@@ -1473,8 +1499,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>不保存(&N)</target>
-<source>Remove entry from list</source>
-<target>从列表中移除此项</target>
+<source>Hide configuration</source>
+<target>隐藏配置文件</target>
+
+<source>Highlight...</source>
+<target>突出显示...</target>
<source>Clear filter</source>
<target>清除过滤器</target>
@@ -1554,6 +1583,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>已暂停</target>
+<source>Stop requested...</source>
+<target>已请求停止...</target>
+
<source>Initializing...</source>
<target>正在初始化...</target>
@@ -1563,9 +1595,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>正在比较文件内容...</target>
-<source>Completed</source>
-<target>完成</target>
-
<source>Info</source>
<target>信息</target>
@@ -1644,12 +1673,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>用于对侧的参数</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>是否要重新显示被隐藏的对话框和警告信息?</target>
-
-<source>&Show</source>
-<target>显示(&S)</target>
-
<source>Downloading update...</source>
<target>正在下载更新...</target>
@@ -1666,7 +1689,7 @@ This guarantees a consistent state even in case of a serious error.
<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>
@@ -1674,18 +1697,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>配置你自己的同步规则.</target>
-<source>Synchronization Settings</source>
-<target>同步设置</target>
-
<source>Comparison</source>
<target>比较</target>
<source>Synchronization</source>
<target>同步</target>
-<source>Today</source>
-<target>今天</target>
-
<source>This week</source>
<target>本周</target>
@@ -1755,9 +1772,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>文件</target>
-<source>Name</source>
-<target>文件名</target>
-
<source>Percentage</source>
<target>百分比</target>
@@ -1792,7 +1806,7 @@ This guarantees a consistent state even in case of a serious error.
<target>FreeFileSync 已是最新.</target>
<source>Cannot find current FreeFileSync version number online. A newer version is likely available. Check manually now?</source>
-<target>无法在线找到当前FreeFileSync的版本号. 可能有新版本可用. 是否现在手动检测?</target>
+<target>无法在线找到当前 FreeFileSync 的版本号. 可能有新版本可用. 是否现在手动检测?</target>
<source>&Check</source>
<target>检查(&C)</target>
@@ -1867,14 +1881,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x 小时</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>%x 天</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>无法设置 %x 的特权.</target>
@@ -1938,9 +1944,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>桌面</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>开始菜单</target>
+<source>Send To</source>
+<target>发送到</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>注册 FreeFileSync 文件关联</target>
@@ -1951,23 +1960,23 @@ This guarantees a consistent state even in case of a serious error.
<target>FreeFileSync 配置</target>
<source>FreeFileSync Batch File</source>
-<target>FreeFileSync批处理文件</target>
+<target>FreeFileSync 批处理文件</target>
<source>FreeFileSync Synchronization Database</source>
-<target>FreeFileSync同步数据库</target>
+<target>FreeFileSync 同步数据库</target>
<source>RealTimeSync Configuration</source>
-<target>RealTimeSync配置</target>
+<target>RealTimeSync 配置</target>
<source>Edit with FreeFileSync</source>
-<target>使用FreeFileSync编辑</target>
+<target>使用 FreeFileSync 编辑</target>
<source>The FreeFileSync portable version cannot install into a subfolder of %x.</source>
-<target>FreeFileSync便携版无法安装到 %x 的一个子目录.</target>
+<target>FreeFileSync 便携版无法安装到 %x 的一个子目录.</target>
<source>Please choose the local installation type or select a different folder for installation.</source>
-<target>请选择本地安装类型或选择用于安装的不同文件夹.</target>
+<target>请选择本地安装类型, 或选择用于安装的不同文件夹.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>静默安装模式仅在FreeFileSync捐赠版上有效.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>安装选项 %x 只在 FreeFileSync 捐赠版有效.</target>
diff --git a/FreeFileSync/Build/Languages/chinese_traditional.lng b/FreeFileSync/Build/Languages/chinese_traditional.lng
index ea48a8b1..defe3748 100755
--- a/FreeFileSync/Build/Languages/chinese_traditional.lng
+++ b/FreeFileSync/Build/Languages/chinese_traditional.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>語法錯誤</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x 之後應該有一個左邊和右邊目錄路徑。</target>
+
<source>Cannot find file %x.</source>
<target>找不到檔案 %x。</target>
@@ -115,6 +118,17 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>如果忽略此錯誤的資料夾將視為空的。在需要時會自動建立缺少的資料夾。</target>
+<source>Comparison finished:</source>
+<target>比對完成:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>找到 %x 個項目。</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>檔案 %x 的日期無效。</target>
@@ -175,9 +189,6 @@
<source>Using non-default global settings:</source>
<target>使用非預設全域設定:</target>
-<source>Starting comparison</source>
-<target>開始比對</target>
-
<source>A folder input field is empty.</source>
<target>資料夾輸入欄位是空白。</target>
@@ -318,15 +329,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>找不到 %x。</target>
-
<source>Type of item %x is not supported:</source>
<target>項目類型 %x 不被支援:</target>
@@ -429,6 +440,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>鎖定擁有者:</target>
+<source>Detecting abandoned lock...</source>
+<target>正在檢測被遺棄的鎖定…</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -437,9 +451,6 @@ Actual: %y bytes
<pluralform>%x 秒</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>正在檢測被遺棄的鎖定…</target>
-
<source>Items processed:</source>
<target>已處理項目:</target>
@@ -452,8 +463,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>解析 %x 檔案,第 %y 列,第 %z 行出現錯誤。</target>
-<source>Cannot set directory lock for %x.</source>
-<target>無法對 %x 設定目錄鎖。</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>無法為以下資料夾設定目錄鎖定:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -493,9 +504,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>磁碟機名稱 %x 不是檔案路徑 %y 的一部分。</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>停止請求:等待目前的操作結束…</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>無法建立時間戳記的版本控制:</target>
@@ -508,6 +516,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>選擇一個資料夾</target>
+<source>&New</source>
+<target>新增(&N)</target>
+
<source>&Open...</source>
<target>開啟(&O)…</target>
@@ -723,26 +734,23 @@ The command is triggered if:
<source>job name</source>
<target>工作名稱</target>
-<source>Show summary</source>
-<target>顯示摘要</target>
-
-<source>Sleep</source>
-<target>睡眠</target>
+<source>System: Sleep</source>
+<target>系統:睡眠</target>
-<source>Shut down</source>
-<target>關機</target>
+<source>System: Shut down</source>
+<target>系統:關機</target>
-<source>Synchronization stopped</source>
-<target>同步已停止</target>
+<source>Cleaning up old log files...</source>
+<target>清理舊日誌檔…</target>
<source>Stopped</source>
<target>已停止</target>
-<source>Synchronization completed with errors</source>
-<target>同步完成,但是有錯誤</target>
+<source>Completed with errors</source>
+<target>已完成但有錯誤</target>
-<source>Synchronization completed with warnings</source>
-<target>同步完成,但是出現警告</target>
+<source>Completed with warnings</source>
+<target>已完成但有警告</target>
<source>Warning</source>
<target>警告</target>
@@ -750,15 +758,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>沒有東西可以同步</target>
-<source>Synchronization completed successfully</source>
-<target>同步順利完成</target>
+<source>Completed successfully</source>
+<target>成功完成</target>
<source>Executing command %x</source>
<target>執行命令 %x</target>
-<source>Cleaning up old log files...</source>
-<target>清理舊日誌檔…</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>您可以切換到FreeFileSync的主視窗來解決此問題。</target>
@@ -774,13 +779,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>切換到FreeFileSync的主視窗</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>在 %x 秒自動重試…</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>自動重試</target>
<source>Ignore &all</source>
<target>全部忽略(&A)</target>
@@ -791,6 +791,26 @@ The command is triggered if:
<source>Serious Error</source>
<target>嚴重錯誤</target>
+<source>Last session</source>
+<target>上次連線</target>
+
+<source>Today</source>
+<target>今日</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x 天</pluralform>
+</target>
+
+<source>Name</source>
+<target>名稱</target>
+
+<source>Last sync</source>
+<target>上次同步</target>
+
<source>Folder</source>
<target>資料夾</target>
@@ -854,9 +874,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>請選擇一個本機檔案系統、網路或MTP裝置上的資料夾。</target>
-<source>&New</source>
-<target>新增(&N)</target>
-
<source>&Save</source>
<target>儲存(&S)</target>
@@ -968,6 +985,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>要複製的總資料量</target>
+<source>Arrange folder pair</source>
+<target>排列配對資料夾</target>
+
<source>Folder pair:</source>
<target>配對資料夾:</target>
@@ -1060,11 +1080,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>命名慣例:</target>
-<source>&Ignore errors</source>
-<target>忽略錯誤(&I)</target>
+<source>Ignore errors</source>
+<target>忽略錯誤</target>
-<source>Show pop-up on errors or warnings</source>
-<target>錯誤或警告時顯示彈出視窗</target>
+<source>Retry count:</source>
+<target>重試次數:</target>
+
+<source>Delay (in seconds):</source>
+<target>延遲(以秒為單位):</target>
<source>Run a command after synchronization:</source>
<target>同步後執行一個命令:</target>
@@ -1072,9 +1095,6 @@ The command is triggered if:
<source>OK</source>
<target>確定</target>
-<source>Arrange folder pair</source>
-<target>排列配對資料夾</target>
-
<source>Enter your login details:</source>
<target>請輸入您的登入資訊:</target>
@@ -1171,12 +1191,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>最小化到通知區域</target>
-<source>Bytes copied:</source>
-<target>已複製的位元組:</target>
-
<source>When finished:</source>
<target>完成後:</target>
+<source>Auto-close</source>
+<target>自動關閉</target>
+
<source>Close</source>
<target>關閉</target>
@@ -1187,7 +1207,10 @@ 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>Progress dialog:</source>
+<target>進度對話框:</target>
<source>Run minimized</source>
<target>最小化執行</target>
@@ -1195,6 +1218,9 @@ The command is triggered if:
<source>&Show error dialog</source>
<target>顯示錯誤對話框(&S)</target>
+<source>Show pop-up on errors or warnings</source>
+<target>錯誤或警告時顯示彈出視窗</target>
+
<source>&Cancel</source>
<target>取消(&C)</target>
@@ -1243,14 +1269,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>傳輸檔案和資料夾的權限。</target>
-<source>Automatic retry on error:</source>
-<target>錯誤時自動重試:</target>
-
-<source>Retry count:</source>
-<target>重試次數:</target>
+<source>Show hidden dialogs again</source>
+<target>再次顯示隱藏的對話框</target>
-<source>Delay (in seconds):</source>
-<target>延遲(以秒為單位):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>再次顯示所有永久 隱藏的對話框和警告訊息</target>
<source>Customize context menu:</source>
<target>自訂內容功能表:</target>
@@ -1258,12 +1281,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>描述</target>
-<source>Show hidden dialogs again</source>
-<target>再次顯示隱藏的對話框</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>再次顯示所有永久隱藏的對話框和警告訊息</target>
-
<source>&Default</source>
<target>預設(&D)</target>
@@ -1318,13 +1335,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>離線啟動</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>突顯未執行超過以下天數的配置:</target>
+
+<source>Synchronization Settings</source>
+<target>同步設定</target>
+
+<source>Access Online Storage</source>
+<target>存取線上儲存空間</target>
+
<source>Save as a Batch Job</source>
<target>另存為批次工作</target>
<source>Delete Items</source>
<target>刪除項目</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>複製項目</target>
<source>Options</source>
@@ -1336,6 +1362,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync贊助版</target>
+<source>Highlight Configurations</source>
+<target>突顯配置</target>
+
<source>&Options</source>
<target>選項(&O)</target>
@@ -1414,7 +1443,7 @@ This guarantees a consistent state even in case of a serious error.
<target>設定方向:</target>
<source>multiple selection</source>
-<target>多選</target>
+<target>複選</target>
<source>Include via filter:</source>
<target>透過篩選器包含:</target>
@@ -1455,9 +1484,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>選擇時間間隔…</target>
-<source>Last session</source>
-<target>最後連線</target>
-
<source>Folder Comparison and Synchronization</source>
<target>資料夾比對和同步</target>
@@ -1476,8 +1502,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>不儲存(&N)</target>
-<source>Remove entry from list</source>
-<target>從列表移除項目</target>
+<source>Hide configuration</source>
+<target>隱藏配置</target>
+
+<source>Highlight...</source>
+<target>突顯...</target>
<source>Clear filter</source>
<target>清除篩選器</target>
@@ -1534,7 +1563,7 @@ This guarantees a consistent state even in case of a serious error.
<target>篩選器</target>
<source>All files are in sync</source>
-<target>所有檔案都在同步</target>
+<target>所有檔案都同步</target>
<source>Cannot find %x</source>
<target>找不到 %x</target>
@@ -1557,6 +1586,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>已暫停</target>
+<source>Stop requested...</source>
+<target>停止請求...</target>
+
<source>Initializing...</source>
<target>正在初始化…</target>
@@ -1566,9 +1598,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>正在比對内容…</target>
-<source>Completed</source>
-<target>已完成</target>
-
<source>Info</source>
<target>訊息</target>
@@ -1585,7 +1614,7 @@ This guarantees a consistent state even in case of a serious error.
<target>日誌</target>
<source>Thank you, %x, for your donation and support!</source>
-<target>%x,感謝您的贊助與支持!</target>
+<target>%x, 感謝您的贊助與支持!</target>
<source>Recommended range:</source>
<target>建議範圍:</target>
@@ -1647,17 +1676,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>另一邊的參數</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>再次顯示隱藏的對話框和警告訊息?</target>
-
-<source>&Show</source>
-<target>顯示(&S)</target>
-
<source>Downloading update...</source>
<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>
@@ -1666,10 +1689,10 @@ 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>
@@ -1677,18 +1700,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>配置您自己的同步規則。</target>
-<source>Synchronization Settings</source>
-<target>同步設定</target>
-
<source>Comparison</source>
<target>比對</target>
<source>Synchronization</source>
<target>同步</target>
-<source>Today</source>
-<target>今日</target>
-
<source>This week</source>
<target>本週</target>
@@ -1758,9 +1775,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>檔案</target>
-<source>Name</source>
-<target>名稱</target>
-
<source>Percentage</source>
<target>百分比</target>
@@ -1870,14 +1884,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x 小時</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>%x 天</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>無法設定 %x 的特權。</target>
@@ -1941,9 +1947,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>桌面</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>開始功能表</target>
+<source>Send To</source>
+<target>傳送到</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>註冊FreeFileSync檔案關聯</target>
@@ -1971,6 +1980,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>請選擇本機安裝類型或選擇不同的安裝資料夾。</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>命令提示字元安裝模式僅在FreeFileSync贊助版才可使用。</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>%x 安裝選項僅在FreeFileSync贊助版可用。</target>
diff --git a/FreeFileSync/Build/Languages/croatian.lng b/FreeFileSync/Build/Languages/croatian.lng
index c1be603f..7748df23 100755
--- a/FreeFileSync/Build/Languages/croatian.lng
+++ b/FreeFileSync/Build/Languages/croatian.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Greška sintakse</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Lijeva i desna putanja do mapa je očekivana nakon %x.</target>
+
<source>Cannot find file %x.</source>
<target>Nije moguće pronaći datoteku %x.</target>
@@ -115,6 +118,19 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Ukoliko ignorirate ovu pogrešku zanemarene mape će se smatrati praznima.Prazne mape se izrade automatski kad bude potrebno.</target>
+<source>Comparison finished:</source>
+<target>Usporedba dovršena:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>%x stavka pronađena</pluralform>
+<pluralform>%x stavki pronađeno</pluralform>
+<pluralform>%x stavki pronađeno</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Datoteka %x ima nevažeći datum.</target>
@@ -175,9 +191,6 @@
<source>Using non-default global settings:</source>
<target>Korištenje ne-standardnih global postavki:</target>
-<source>Starting comparison</source>
-<target>Pokretanje usporedbe</target>
-
<source>A folder input field is empty.</source>
<target>Polje za odabir mape je prazno.</target>
@@ -318,15 +331,15 @@ Stvarno: %y bajta
<source>Unable to move %x to the recycle bin.</source>
<target>Nije moguće premjestiti %x u koš za smeće.</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 find %x.</source>
-<target>Nije moguće pronaći %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Vrsta stavke %x koji nije podržan:</target>
@@ -435,6 +448,9 @@ Stvarno: %y bajta
<source>Lock owner:</source>
<target>Vlasnik ključa:</target>
+<source>Detecting abandoned lock...</source>
+<target>Pronalazim napušteni ključ...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -445,9 +461,6 @@ Stvarno: %y bajta
<pluralform>%x sek</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Pronalazim napušteni ključ...</target>
-
<source>Items processed:</source>
<target>Obrađene stavke:</target>
@@ -460,8 +473,8 @@ Stvarno: %y bajta
<source>Error parsing file %x, row %y, column %z.</source>
<target>Greška u analizi datoteke %x, red %y, stupac %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Ne mogu zaključiti mapu za %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nije moguće zaključavanje slijedećih foldera:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -503,9 +516,6 @@ Stvarno: %y bajta
<source>Volume name %x is not part of file path %y.</source>
<target>Naziv spremnika %x nije dio putanje datotke %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Zaustavljanje zatraženo: Čekam na dovršenje trenutnog zadatka...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Nije moguća izrada vremenske oznake za označavanje:</target>
@@ -518,6 +528,9 @@ Stvarno: %y bajta
<source>Select a folder</source>
<target>Odaberite mapu</target>
+<source>&New</source>
+<target>&Novo</target>
+
<source>&Open...</source>
<target>&Otvori...</target>
@@ -733,26 +746,23 @@ Naredba će biti pokrenuta ako se:
<source>job name</source>
<target>Naziv zadatka</target>
-<source>Show summary</source>
-<target>Prikaži izvještaj</target>
+<source>System: Sleep</source>
+<target>Sistem: Spavanje</target>
-<source>Sleep</source>
-<target>U stanje pripravnosti</target>
+<source>System: Shut down</source>
+<target>Sistem: Isključivanje</target>
-<source>Shut down</source>
-<target>Isključi računalo</target>
-
-<source>Synchronization stopped</source>
-<target>Sinkronizacija zaustavljena</target>
+<source>Cleaning up old log files...</source>
+<target>Čistim stare datoteke o izvješću...</target>
<source>Stopped</source>
<target>Zaustavljeno</target>
-<source>Synchronization completed with errors</source>
-<target>Sinkronizacija dovršena s greškama</target>
+<source>Completed with errors</source>
+<target>Dovršeno s pogreškama</target>
-<source>Synchronization completed with warnings</source>
-<target>Sinkronizacija dovršena s upozorenjima</target>
+<source>Completed with warnings</source>
+<target>Dovršeno s upozorenjima</target>
<source>Warning</source>
<target>Upozorenje</target>
@@ -760,15 +770,12 @@ Naredba će biti pokrenuta ako se:
<source>Nothing to synchronize</source>
<target>Ništa za sinkronizirati</target>
-<source>Synchronization completed successfully</source>
-<target>Sinkronizacija uspješno dovršena</target>
+<source>Completed successfully</source>
+<target>Dovršeno uspješno</target>
<source>Executing command %x</source>
<target>Izvršavanje naredbe %x</target>
-<source>Cleaning up old log files...</source>
-<target>Čistim stare datoteke o izvješću...</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>
@@ -784,15 +791,8 @@ Naredba će biti pokrenuta ako se:
<source>Switching to FreeFileSync's main window</source>
<target>Prebacivanje na glavni prozor FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Automatski pokušaj za %x sekundi...</pluralform>
-<pluralform>Automatski pokušaj za %x sekunda...</pluralform>
-<pluralform>Automatski pokušaj za %x sekundi...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Automatski pokušaj</target>
<source>Ignore &all</source>
<target>Ignoriraj &sve</target>
@@ -803,6 +803,28 @@ Naredba će biti pokrenuta ako se:
<source>Serious Error</source>
<target>Ozbiljna Pogreška</target>
+<source>Last session</source>
+<target>Zadnja sesija</target>
+
+<source>Today</source>
+<target>Danas</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x dan</pluralform>
+<pluralform>%x dana</pluralform>
+<pluralform>%x dana</pluralform>
+</target>
+
+<source>Name</source>
+<target>Naziv</target>
+
+<source>Last sync</source>
+<target>Zadnja sinkr</target>
+
<source>Folder</source>
<target>Mapa</target>
@@ -866,9 +888,6 @@ Naredba će biti pokrenuta ako se:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Molimo odaberite mapu na lokalnom disku, mreži ili MTP uređaju.</target>
-<source>&New</source>
-<target>&Novo</target>
-
<source>&Save</source>
<target>&Spremi</target>
@@ -980,6 +999,9 @@ Naredba će biti pokrenuta ako se:
<source>Total bytes to copy</source>
<target>Ukupno bajta za kopirati</target>
+<source>Arrange folder pair</source>
+<target>Rasporedi par mapa</target>
+
<source>Folder pair:</source>
<target>Par mapa:</target>
@@ -1072,11 +1094,14 @@ Naredba će biti pokrenuta ako se:
<source>Naming convention:</source>
<target>Naziv pravila:</target>
-<source>&Ignore errors</source>
-<target>&Ignoriraj pogreške</target>
+<source>Ignore errors</source>
+<target>Zanemariti pogreške</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Prikaži skočni prozor pri greškama i upozorenjima</target>
+<source>Retry count:</source>
+<target>Broj pokušaja:</target>
+
+<source>Delay (in seconds):</source>
+<target>Odgoda (u sekundama) :</target>
<source>Run a command after synchronization:</source>
<target>Pokreni naredbu nakon sinkronizacije:</target>
@@ -1084,9 +1109,6 @@ Naredba će biti pokrenuta ako se:
<source>OK</source>
<target>U redu</target>
-<source>Arrange folder pair</source>
-<target>Rasporedi par mapa</target>
-
<source>Enter your login details:</source>
<target>Unesite podatke za logiranje:</target>
@@ -1183,12 +1205,12 @@ Naredba će biti pokrenuta ako se:
<source>Minimize to notification area</source>
<target>Minimiziraj u područje obavjesti</target>
-<source>Bytes copied:</source>
-<target>Bajta kopirano:</target>
-
<source>When finished:</source>
<target>Nakon završetka:</target>
+<source>Auto-close</source>
+<target>Auto-zatvaranje</target>
+
<source>Close</source>
<target>Zatvori</target>
@@ -1201,12 +1223,18 @@ Naredba će biti pokrenuta ako se:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Stvaranje slijednih datoteka za sinkronizaciju bez nadzora. Da započnete, dvostruko-kliknite na ovu datoteku ili planirajte u planeru zadataka: %x</target>
+<source>Progress dialog:</source>
+<target>Prozor napretka:</target>
+
<source>Run minimized</source>
<target>Pokreni minimizirano</target>
<source>&Show error dialog</source>
<target>&Prikaži pogreške</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Prikaži skočni prozor pri greškama i upozorenjima</target>
+
<source>&Cancel</source>
<target>&Odustani</target>
@@ -1255,14 +1283,11 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Transfer file and folder permissions.</source>
<target>Prenesi dopuštenja za datoteke i mape.</target>
-<source>Automatic retry on error:</source>
-<target>Automatski pokušaj ponovo prilikom pogreške:</target>
-
-<source>Retry count:</source>
-<target>Broj pokušaja:</target>
+<source>Show hidden dialogs again</source>
+<target>Prikaži skrivene prozore ponovno</target>
-<source>Delay (in seconds):</source>
-<target>Odgoda (u sekundama) :</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Prikaži sve trajno skrivene prozore i poruke upozorenja ponovno</target>
<source>Customize context menu:</source>
<target>Prilagodite kontekstni izbornik:</target>
@@ -1270,12 +1295,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Description</source>
<target>Opis</target>
-<source>Show hidden dialogs again</source>
-<target>Prikaži skrivene prozore ponovno</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Prikaži sve trajno skrivene prozore i poruke upozorenja ponovno</target>
-
<source>&Default</source>
<target>&Zadano</target>
@@ -1330,13 +1349,22 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Activate offline</source>
<target>Aktivacija offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Istakni postavke koje nisu pokrenute više od broja dana:</target>
+
+<source>Synchronization Settings</source>
+<target>Postavke Sinkronizacije</target>
+
+<source>Access Online Storage</source>
+<target>Pristupi online pohrani</target>
+
<source>Save as a Batch Job</source>
<target>Spremi kao slijedni zadatak</target>
<source>Delete Items</source>
<target>Izbriši stavke</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Kopiraj stavke</target>
<source>Options</source>
@@ -1348,6 +1376,9 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donatorska Verzija</target>
+<source>Highlight Configurations</source>
+<target>Istakni postavke</target>
+
<source>&Options</source>
<target>&Opcije</target>
@@ -1475,9 +1506,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Select time span...</source>
<target>Odaberite vremenski raspon...</target>
-<source>Last session</source>
-<target>Zadnja sesija</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Usporedba i sinkronizacija mapa</target>
@@ -1496,8 +1524,11 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Do&n't save</source>
<target>&Nemoj spremiti</target>
-<source>Remove entry from list</source>
-<target>Ukloni stavku iz liste</target>
+<source>Hide configuration</source>
+<target>Sakrij postavke</target>
+
+<source>Highlight...</source>
+<target>Istakni....</target>
<source>Clear filter</source>
<target>Očisti filter</target>
@@ -1577,6 +1608,9 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Paused</source>
<target>Pauzirano</target>
+<source>Stop requested...</source>
+<target>Zatražen prekid...</target>
+
<source>Initializing...</source>
<target>Započinjem...</target>
@@ -1586,9 +1620,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Comparing content...</source>
<target>Uspoređujem sadržaj...</target>
-<source>Completed</source>
-<target>Dovršeno</target>
-
<source>Info</source>
<target>Info</target>
@@ -1673,12 +1704,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Parameters for opposite side</source>
<target>Parametri za suprotnu stranu</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Prikazati skrivene prozore i poruke upozorenja ponovno?</target>
-
-<source>&Show</source>
-<target>&Prikaži</target>
-
<source>Downloading update...</source>
<target>Preuzimanje ažuriranja...</target>
@@ -1703,18 +1728,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Configure your own synchronization rules.</source>
<target>Postavite vaša vlastita sinkronizacijska pravila.</target>
-<source>Synchronization Settings</source>
-<target>Postavke Sinkronizacije</target>
-
<source>Comparison</source>
<target>Usporedba</target>
<source>Synchronization</source>
<target>Sinkronizacija</target>
-<source>Today</source>
-<target>Danas</target>
-
<source>This week</source>
<target>Ovaj tjedan</target>
@@ -1784,9 +1803,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Files</source>
<target>Datoteke</target>
-<source>Name</source>
-<target>Naziv</target>
-
<source>Percentage</source>
<target>Postotak</target>
@@ -1900,16 +1916,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<pluralform>%x sati</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>%x dan</pluralform>
-<pluralform>%x dana</pluralform>
-<pluralform>%x dana</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Ne mogu postaviti prava za %x.</target>
@@ -1973,9 +1979,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Desktop</source>
<target>Radna površina</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Start izbornik</target>
+<source>Send To</source>
+<target>Pošalji na</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>Registriram FreeFileSync ekstenziju</target>
@@ -2003,6 +2012,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Molimo odaberite lokalnu instalaciju ili odaberite drugu mapu za instalaciju.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Skriveni instalacijski tip je dostupan samo u FreeFileSync Donatorskoj Verziji.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>%x opcija instalacije je dostupna samo u FreeFileSync Donatorskoj verziji.</target>
diff --git a/FreeFileSync/Build/Languages/czech.lng b/FreeFileSync/Build/Languages/czech.lng
index fb30d713..499fe4e3 100755
--- a/FreeFileSync/Build/Languages/czech.lng
+++ b/FreeFileSync/Build/Languages/czech.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Chyba syntaxe</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Je očekávané zadání parametru levého a pravého adresáře po %x.</target>
+
<source>Cannot find file %x.</source>
<target>Nelze najít soubor %x.</target>
@@ -115,6 +118,19 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Pokud přeskočíte tuto chybu, složka bude považována za prázdnou. Chybějící složky pak budou automaticky vytvořeny.</target>
+<source>Comparison finished:</source>
+<target>Porovnání dokončeno:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 položka nalezena</pluralform>
+<pluralform>%x položky nalezeny</pluralform>
+<pluralform>%x položek nalezeno</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Soubor %x má chybné datum.</target>
@@ -175,9 +191,6 @@
<source>Using non-default global settings:</source>
<target>Použití zvláštního nastavení:</target>
-<source>Starting comparison</source>
-<target>Začátek porovnávání</target>
-
<source>A folder input field is empty.</source>
<target>Není zadána vstupní složka.</target>
@@ -318,15 +331,15 @@ Aktuálně: %y b
<source>Unable to move %x to the recycle bin.</source>
<target>Není možné přesunout %x do Koše.</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 find %x.</source>
-<target>Nelze najít %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Typ položky %x není podporován:</target>
@@ -435,6 +448,9 @@ Aktuálně: %y b
<source>Lock owner:</source>
<target>Používá:</target>
+<source>Detecting abandoned lock...</source>
+<target>Prověřování uzamčení...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -445,9 +461,6 @@ Aktuálně: %y b
<pluralform>%x sekund</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Prověřování uzamčení...</target>
-
<source>Items processed:</source>
<target>Zpracováno položek:</target>
@@ -460,8 +473,8 @@ Aktuálně: %y b
<source>Error parsing file %x, row %y, column %z.</source>
<target>Chyba zpracování souboru %x: na řádku %y ve sloupci %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Nelze nastavit zámek adresáře %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nelze uzamčít následující adresáře:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -503,9 +516,6 @@ Aktuálně: %y b
<source>Volume name %x is not part of file path %y.</source>
<target>Název disku %x není součástí cesty souboru %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Zastavování: Čekání na dokončení právě probíhající operace...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Nelze vytvořit časové značky verzování:</target>
@@ -518,6 +528,9 @@ Aktuálně: %y b
<source>Select a folder</source>
<target>Vyberte adresář</target>
+<source>&New</source>
+<target>&Nový</target>
+
<source>&Open...</source>
<target>&Otevřít...</target>
@@ -733,26 +746,23 @@ Příkaz je spuštěn když:
<source>job name</source>
<target>název úlohy</target>
-<source>Show summary</source>
-<target>Zobrazit souhrn</target>
+<source>System: Sleep</source>
+<target>Režim spánku počítače</target>
-<source>Sleep</source>
-<target>Režim spánku</target>
+<source>System: Shut down</source>
+<target>Vypnutí počítače</target>
-<source>Shut down</source>
-<target>Vypnout počítač</target>
-
-<source>Synchronization stopped</source>
-<target>Synchronizace zastavena</target>
+<source>Cleaning up old log files...</source>
+<target>Odstraňování starých žurnálů...</target>
<source>Stopped</source>
<target>Zastaveno</target>
-<source>Synchronization completed with errors</source>
-<target>Synchronizace dokončena s chybami</target>
+<source>Completed with errors</source>
+<target>Dokončeno s chybou</target>
-<source>Synchronization completed with warnings</source>
-<target>Synchronizace dokončena s varováními</target>
+<source>Completed with warnings</source>
+<target>Dokončeno s varováním</target>
<source>Warning</source>
<target>Varování</target>
@@ -760,15 +770,12 @@ Příkaz je spuštěn když:
<source>Nothing to synchronize</source>
<target>Není co synchronizovat</target>
-<source>Synchronization completed successfully</source>
-<target>Synchronizace dokončena úspěšně</target>
+<source>Completed successfully</source>
+<target>Úspěšně dokončeno</target>
<source>Executing command %x</source>
<target>Spuštění příkazu %x</target>
-<source>Cleaning up old log files...</source>
-<target>Odstraňování starých žurnálů...</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>
@@ -784,15 +791,8 @@ Příkaz je spuštěn když:
<source>Switching to FreeFileSync's main window</source>
<target>Přepínání do hlavního okna FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Automaticky opakování za 1 sekundu...</pluralform>
-<pluralform>Automaticky opakovat za %x sekundy...</pluralform>
-<pluralform>Autoamticky opakovat za %x sekund...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Automatické opakování</target>
<source>Ignore &all</source>
<target>Přeskočit &vše</target>
@@ -803,6 +803,28 @@ Příkaz je spuštěn když:
<source>Serious Error</source>
<target>Závažná chyba</target>
+<source>Last session</source>
+<target>Poslední sezení</target>
+
+<source>Today</source>
+<target>Dnes</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 den</pluralform>
+<pluralform>%x dny</pluralform>
+<pluralform>%x dnů</pluralform>
+</target>
+
+<source>Name</source>
+<target>Název</target>
+
+<source>Last sync</source>
+<target>Naposledy</target>
+
<source>Folder</source>
<target>Složka</target>
@@ -866,9 +888,6 @@ Příkaz je spuštěn když:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Prosím vyberte složku na místním souborovém systému, síti nebo multimediální zařízení.</target>
-<source>&New</source>
-<target>&Nový</target>
-
<source>&Save</source>
<target>&Uložit</target>
@@ -933,7 +952,7 @@ Příkaz je spuštěn když:
<target>Odstranit dvojici adresářů</target>
<source>Access online storage</source>
-<target>Přístup k úložišti</target>
+<target>Přístup k uložišti</target>
<source>Swap sides</source>
<target>Změna stran</target>
@@ -980,6 +999,9 @@ Příkaz je spuštěn když:
<source>Total bytes to copy</source>
<target>Celkový objem dat</target>
+<source>Arrange folder pair</source>
+<target>Uspořádat složky</target>
+
<source>Folder pair:</source>
<target>Dvojice složek:</target>
@@ -1072,11 +1094,14 @@ Příkaz je spuštěn když:
<source>Naming convention:</source>
<target>Pojmenování:</target>
-<source>&Ignore errors</source>
-<target>&Přeskočit chyby</target>
+<source>Ignore errors</source>
+<target>Přeskočit chyby</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Zobrazit hlášení při chybě nebo varování</target>
+<source>Retry count:</source>
+<target>Počet opakování:</target>
+
+<source>Delay (in seconds):</source>
+<target>Prodleva (v sekundách):</target>
<source>Run a command after synchronization:</source>
<target>Po dokončení synchronizace spustit příkaz:</target>
@@ -1084,9 +1109,6 @@ Příkaz je spuštěn když:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Uspořádat složky</target>
-
<source>Enter your login details:</source>
<target>Zadejte přihlašovací údaje:</target>
@@ -1094,7 +1116,7 @@ Příkaz je spuštěn když:
<target>Typ spojení:</target>
<source>Server name or IP address:</source>
-<target>Jméno sevru nebo jeho IP adresa:</target>
+<target>Jméno serveru nebo jeho IP adresa:</target>
<source>Port:</source>
<target>Port:</target>
@@ -1183,12 +1205,12 @@ Příkaz je spuštěn když:
<source>Minimize to notification area</source>
<target>Minimalizovat do oznamovací oblasti</target>
-<source>Bytes copied:</source>
-<target>Zkopírováno dat:</target>
-
<source>When finished:</source>
<target>Po dokončení:</target>
+<source>Auto-close</source>
+<target>Automatické zavření</target>
+
<source>Close</source>
<target>Zavřít</target>
@@ -1196,17 +1218,23 @@ Příkaz je spuštěn když:
<target>&Pauza</target>
<source>Stop</source>
-<target>Ukončit</target>
+<target>Ukončit aplikaci</target>
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Vytvoří dávkový souboru pro automatickou synchronizaci. Ke spuštění dávky jednoduše poklikejte na vytvořený soubor nebo využijte plánovač úloh vašeho systému: %x</target>
+<source>Progress dialog:</source>
+<target>Zobrazení průběhu:</target>
+
<source>Run minimized</source>
<target>Minimalizovat</target>
<source>&Show error dialog</source>
<target>Zobrazit chybové &okno</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Zobrazit hlášení při chybě nebo varování</target>
+
<source>&Cancel</source>
<target>&Zrušit</target>
@@ -1252,14 +1280,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Přenést přístupová oprávnění souborů a složek.</target>
-<source>Automatic retry on error:</source>
-<target>Automaticky opakovat při chybě:</target>
-
-<source>Retry count:</source>
-<target>Počet opakování:</target>
+<source>Show hidden dialogs again</source>
+<target>Znovu zobrazit skryté dialogy</target>
-<source>Delay (in seconds):</source>
-<target>Prodleva (v sekundách):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Zobrazit znovu všechny trvale skryté dialogy a varovná hlášení</target>
<source>Customize context menu:</source>
<target>Přizpůsobit kontextovou nabídku:</target>
@@ -1267,12 +1292,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>Popis</target>
-<source>Show hidden dialogs again</source>
-<target>Znovu zobrazit skryté dialogy</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Zobrazit znovu všechny trvale skryté dialogy a varovná hlášení</target>
-
<source>&Default</source>
<target>&Předdefinované</target>
@@ -1327,13 +1346,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>Aktivace off-line</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Zvýraznit položky, které nebyly spuštěny za poslední počet dní:</target>
+
+<source>Synchronization Settings</source>
+<target>Nastavení synchronizace</target>
+
+<source>Access Online Storage</source>
+<target>Online uložiště</target>
+
<source>Save as a Batch Job</source>
<target>Uložit jako dávku</target>
<source>Delete Items</source>
<target>Smazané položky</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Kopírované položky</target>
<source>Options</source>
@@ -1345,6 +1373,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Zvýraznění položek</target>
+
<source>&Options</source>
<target>Nastavení &programu</target>
@@ -1472,9 +1503,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Zadejte časové rozmezí...</target>
-<source>Last session</source>
-<target>Poslední sezení</target>
-
<source>Folder Comparison and Synchronization</source>
<target>porovnání a synchronizace složek</target>
@@ -1493,8 +1521,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&Neukládat</target>
-<source>Remove entry from list</source>
-<target>Odstranit položku ze seznamu</target>
+<source>Hide configuration</source>
+<target>Skrýt položky</target>
+
+<source>Highlight...</source>
+<target>Zvýraznit...</target>
<source>Clear filter</source>
<target>Vymazat filtr</target>
@@ -1574,6 +1605,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>Pauza</target>
+<source>Stop requested...</source>
+<target>Zastavování...</target>
+
<source>Initializing...</source>
<target>Inicializace...</target>
@@ -1583,9 +1617,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>Porovnávání obsahu...</target>
-<source>Completed</source>
-<target>Hotovo</target>
-
<source>Info</source>
<target>Info</target>
@@ -1670,12 +1701,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Parametry protistrany</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Zobrazit skryté dialogy a varovná hlášení?</target>
-
-<source>&Show</source>
-<target>&Zobrazit</target>
-
<source>Downloading update...</source>
<target>Stahování aktualizace...</target>
@@ -1700,18 +1725,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>Nastavení vlastních pravidel synchronizace.</target>
-<source>Synchronization Settings</source>
-<target>Nastavení synchronizace</target>
-
<source>Comparison</source>
<target>Porovnání</target>
<source>Synchronization</source>
<target>Synchronizace</target>
-<source>Today</source>
-<target>Dnes</target>
-
<source>This week</source>
<target>Tento týden</target>
@@ -1781,9 +1800,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>Soubory</target>
-<source>Name</source>
-<target>Název</target>
-
<source>Percentage</source>
<target>Procentní podíl</target>
@@ -1897,16 +1913,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x hodin</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 den</pluralform>
-<pluralform>%x dny</pluralform>
-<pluralform>%x dnů</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Nelze nastavit práva pro %x.</target>
@@ -1970,9 +1976,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>Plocha</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Nabídka Start</target>
+<source>Send To</source>
+<target>Odeslat</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>Zaregistrovat příponu souborů FreeFileSync</target>
@@ -2000,6 +2009,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Prosím zvolte lokální typ instalace nebo vyberte jinou složku.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Tichá instalace je k dispozici pouze v předplacené verzi FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>%x instalace je k dispozici pouze v předplacené verzi FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Languages/danish.lng b/FreeFileSync/Build/Languages/danish.lng
index 4f08824c..a0822e1d 100755
--- a/FreeFileSync/Build/Languages/danish.lng
+++ b/FreeFileSync/Build/Languages/danish.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Syntaksfejl</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Venstre og højre mappesti forventes efter %x.</target>
+
<source>Cannot find file %x.</source>
<target>Kan ikke finde filen %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Hvis denne fejl ignoreres, betragtes mapperne som tomme. Manglende mapper oprettes automatisk efter behov.</target>
+<source>Comparison finished:</source>
+<target>Sammenligning gennemført:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 emne fundet</pluralform>
+<pluralform>%x emner fundet</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Filen %x har en ugyldig dato.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Brug tilpassede overordnede indstillinger:</target>
-<source>Starting comparison</source>
-<target>Starter analyse</target>
-
<source>A folder input field is empty.</source>
<target>Der er ikke valgt nogen mapper.</target>
@@ -318,15 +330,15 @@ Aktuel: %y byte
<source>Unable to move %x to the recycle bin.</source>
<target>Kunne ikke flytte %x til papirkurv.</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 find %x.</source>
-<target>Kan ikke finde %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Filtypen %x understøttes ikke:</target>
@@ -432,6 +444,9 @@ Aktuel: %y byte
<source>Lock owner:</source>
<target>Låsens ejer:</target>
+<source>Detecting abandoned lock...</source>
+<target>Finder efterladt lås...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Aktuel: %y byte
<pluralform>%x sek</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Finder efterladt lås...</target>
-
<source>Items processed:</source>
<target>Emner behandlet:</target>
@@ -456,8 +468,8 @@ Aktuel: %y byte
<source>Error parsing file %x, row %y, column %z.</source>
<target>Behandlingsfejl i filen %x, række %y, kolonne %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Kan ikke låse mappen %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Kan ikke sætte mappelåse for følgende mapper:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Aktuel: %y byte
<source>Volume name %x is not part of file path %y.</source>
<target>Volumennavnet %x er ikke del af filstien %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Afbrydelse: Venter på aktuel opgave afsluttes...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Kan ikke oprette tidsstempel til versionering:</target>
@@ -513,6 +522,9 @@ Aktuel: %y byte
<source>Select a folder</source>
<target>Vælg en mappe</target>
+<source>&New</source>
+<target>&Ny</target>
+
<source>&Open...</source>
<target>&Åben...</target>
@@ -728,26 +740,23 @@ Kommandoen udføres hvis:
<source>job name</source>
<target>Jobnavn</target>
-<source>Show summary</source>
-<target>Resultat</target>
+<source>System: Sleep</source>
+<target>System: Slumre</target>
-<source>Sleep</source>
-<target>Slumre</target>
+<source>System: Shut down</source>
+<target>System: Luk</target>
-<source>Shut down</source>
-<target>Luk ned</target>
-
-<source>Synchronization stopped</source>
-<target>Synkronisering afbrudt</target>
+<source>Cleaning up old log files...</source>
+<target>Fjerner gamle logfiler...</target>
<source>Stopped</source>
<target>Afbrudt</target>
-<source>Synchronization completed with errors</source>
-<target>Synkronisering gennemført med fejl</target>
+<source>Completed with errors</source>
+<target>Gennemført med fejl</target>
-<source>Synchronization completed with warnings</source>
-<target>Synkronisering gennemført med advarsel</target>
+<source>Completed with warnings</source>
+<target>Gennemført med advarsler</target>
<source>Warning</source>
<target>Advarsel</target>
@@ -755,15 +764,12 @@ Kommandoen udføres hvis:
<source>Nothing to synchronize</source>
<target>Alt er synkroniseret</target>
-<source>Synchronization completed successfully</source>
-<target>Synkronisering gennemført</target>
+<source>Completed successfully</source>
+<target>Gennemført</target>
<source>Executing command %x</source>
<target>Kører kommandoen %x</target>
-<source>Cleaning up old log files...</source>
-<target>Fjerner gamle logfiler...</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>
@@ -779,14 +785,8 @@ Kommandoen udføres hvis:
<source>Switching to FreeFileSync's main window</source>
<target>Åbner FreeFileSyncs hovedvindue</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Prøver igen om 1 sekund...</pluralform>
-<pluralform>Prøver igen om %x sekunder...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Forsøg automatisk igen</target>
<source>Ignore &all</source>
<target>Ignorer &alle</target>
@@ -797,6 +797,27 @@ Kommandoen udføres hvis:
<source>Serious Error</source>
<target>Kritisk fejl</target>
+<source>Last session</source>
+<target>Sidste opgave</target>
+
+<source>Today</source>
+<target>Idag</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dag</pluralform>
+<pluralform>%x dage</pluralform>
+</target>
+
+<source>Name</source>
+<target>Navn</target>
+
+<source>Last sync</source>
+<target>Sidste synk</target>
+
<source>Folder</source>
<target>Mappe</target>
@@ -860,9 +881,6 @@ Kommandoen udføres hvis:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Vælg lokal mappe, netværksmappe eller mappe på MTP enhed.</target>
-<source>&New</source>
-<target>&Ny</target>
-
<source>&Save</source>
<target>&Gem</target>
@@ -927,7 +945,7 @@ Kommandoen udføres hvis:
<target>Fjern mappepar</target>
<source>Access online storage</source>
-<target>Tilgå onlinelager</target>
+<target>Åben onlinelager</target>
<source>Swap sides</source>
<target>Byt side</target>
@@ -974,6 +992,9 @@ Kommandoen udføres hvis:
<source>Total bytes to copy</source>
<target>Antal bytes der kopieres</target>
+<source>Arrange folder pair</source>
+<target>Arrangér mappepar</target>
+
<source>Folder pair:</source>
<target>Mappepar:</target>
@@ -1066,11 +1087,14 @@ Kommandoen udføres hvis:
<source>Naming convention:</source>
<target>Navneregler:</target>
-<source>&Ignore errors</source>
-<target>&Ignorer fejl</target>
+<source>Ignore errors</source>
+<target>Ignorér fejl</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Vis fejlbeskeder og advarsler</target>
+<source>Retry count:</source>
+<target>Antal forsøg:</target>
+
+<source>Delay (in seconds):</source>
+<target>Forsinkelse (sek):</target>
<source>Run a command after synchronization:</source>
<target>Kør kommando efter synkronisering:</target>
@@ -1078,9 +1102,6 @@ Kommandoen udføres hvis:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Arrangér mappepar</target>
-
<source>Enter your login details:</source>
<target>Angiv login:</target>
@@ -1177,12 +1198,12 @@ Kommandoen udføres hvis:
<source>Minimize to notification area</source>
<target>Minimér til uret</target>
-<source>Bytes copied:</source>
-<target>Kopierede byte:</target>
-
<source>When finished:</source>
<target>Når gennemført:</target>
+<source>Auto-close</source>
+<target>Autoluk</target>
+
<source>Close</source>
<target>Luk</target>
@@ -1195,12 +1216,18 @@ Kommandoen udføres hvis:
<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 med dobbeltklik på filen eller planlæg via opgavestyring: %x</target>
+<source>Progress dialog:</source>
+<target>Fremskridt:</target>
+
<source>Run minimized</source>
<target>Kør minimeret</target>
<source>&Show error dialog</source>
<target>&Vis fejlbesked</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Vis fejlbeskeder og advarsler</target>
+
<source>&Cancel</source>
<target>&Annuller</target>
@@ -1249,14 +1276,11 @@ Sikrer processen ved alvorlige fejl.
<source>Transfer file and folder permissions.</source>
<target>Overfør fil og mappetilladelser.</target>
-<source>Automatic retry on error:</source>
-<target>Antal forsøg ved fejl:</target>
-
-<source>Retry count:</source>
-<target>Antal forsøg:</target>
+<source>Show hidden dialogs again</source>
+<target>Gendan skjulte beskeder</target>
-<source>Delay (in seconds):</source>
-<target>Forsinkelse (sek):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Vis skjulte advarsler og beskeder igen</target>
<source>Customize context menu:</source>
<target>Tilpas kontekstmenu:</target>
@@ -1264,12 +1288,6 @@ Sikrer processen ved alvorlige fejl.
<source>Description</source>
<target>Beskrivelse</target>
-<source>Show hidden dialogs again</source>
-<target>Gendan skjulte beskeder</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Vis skjulte advarsler og beskeder igen</target>
-
<source>&Default</source>
<target>S&tandard</target>
@@ -1324,14 +1342,23 @@ Sikrer processen ved alvorlige fejl.
<source>Activate offline</source>
<target>Aktivér offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Fremhæv indstillinger der ikke er kørt i det følgende antal dage:</target>
+
+<source>Synchronization Settings</source>
+<target>Synkroniseringsindstillinger</target>
+
+<source>Access Online Storage</source>
+<target>Tilgå online lager</target>
+
<source>Save as a Batch Job</source>
<target>Gem som batchfil</target>
<source>Delete Items</source>
<target>Slet emner</target>
-<source>Copy items</source>
-<target>Kopier emner</target>
+<source>Copy Items</source>
+<target>Kopiér emner</target>
<source>Options</source>
<target>Indstillinger</target>
@@ -1342,6 +1369,9 @@ Sikrer processen ved alvorlige fejl.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync donationsudgave</target>
+<source>Highlight Configurations</source>
+<target>Fremhæv indstillinger</target>
+
<source>&Options</source>
<target>&Indstillinger</target>
@@ -1465,9 +1495,6 @@ Sikrer processen ved alvorlige fejl.
<source>Select time span...</source>
<target>Vælg tidsinterval...</target>
-<source>Last session</source>
-<target>Sidste opgave</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Mappeanalyse og synkronisering</target>
@@ -1486,8 +1513,11 @@ Sikrer processen ved alvorlige fejl.
<source>Do&n't save</source>
<target>&Gem ikke</target>
-<source>Remove entry from list</source>
-<target>Fjern fra liste</target>
+<source>Hide configuration</source>
+<target>Skjul indstillinger</target>
+
+<source>Highlight...</source>
+<target>Fremhæv...</target>
<source>Clear filter</source>
<target>Ryd filter</target>
@@ -1567,6 +1597,9 @@ Sikrer processen ved alvorlige fejl.
<source>Paused</source>
<target>Pauset</target>
+<source>Stop requested...</source>
+<target>Stop anmodning...</target>
+
<source>Initializing...</source>
<target>Forbereder...</target>
@@ -1576,9 +1609,6 @@ Sikrer processen ved alvorlige fejl.
<source>Comparing content...</source>
<target>Analyserer indhold...</target>
-<source>Completed</source>
-<target>Gennemført</target>
-
<source>Info</source>
<target>Info</target>
@@ -1660,12 +1690,6 @@ Sikrer processen ved alvorlige fejl.
<source>Parameters for opposite side</source>
<target>Modsatte sides parametre</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Vis skjulte advarsler og beskeder igen?</target>
-
-<source>&Show</source>
-<target>&Vis</target>
-
<source>Downloading update...</source>
<target>Henter opdatering...</target>
@@ -1690,18 +1714,12 @@ Sikrer processen ved alvorlige fejl.
<source>Configure your own synchronization rules.</source>
<target>Opret dine egne synkroniseringsregler.</target>
-<source>Synchronization Settings</source>
-<target>Synkroniseringsindstillinger</target>
-
<source>Comparison</source>
<target>Analyse</target>
<source>Synchronization</source>
<target>Synkronisering</target>
-<source>Today</source>
-<target>Idag</target>
-
<source>This week</source>
<target>Denne uge</target>
@@ -1771,9 +1789,6 @@ Sikrer processen ved alvorlige fejl.
<source>Files</source>
<target>Filer</target>
-<source>Name</source>
-<target>Navn</target>
-
<source>Percentage</source>
<target>Procent</target>
@@ -1885,15 +1900,6 @@ Sikrer processen ved alvorlige fejl.
<pluralform>%x timer</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 dag</pluralform>
-<pluralform>%x dage</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Kan ikke sætte %x privilegier.</target>
@@ -1957,8 +1963,11 @@ Sikrer processen ved alvorlige fejl.
<source>Desktop</source>
<target>På skrivebord</target>
-<source>Start menu</source>
-<target>I startmenu</target>
+<source>Start Menu</source>
+<target>Startmenu</target>
+
+<source>Send To</source>
+<target>Send til</target>
<source>Registering FreeFileSync file extensions</source>
<target>Registrerer FreeFileSync filtyper</target>
@@ -1987,6 +1996,6 @@ Sikrer processen ved alvorlige fejl.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Installer normalt, eller vælg en anden mappe.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Baggrundsinstallation er kun mulig med FreeFileSync's donationsudgave.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>Installationsmuligheden %x er kun mulig i FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Languages/dutch.lng b/FreeFileSync/Build/Languages/dutch.lng
index 4748ed36..99875a32 100755
--- a/FreeFileSync/Build/Languages/dutch.lng
+++ b/FreeFileSync/Build/Languages/dutch.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Syntaxis fout</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Een linker en een rechter mappad worden verwacht na %x.</target>
+
<source>Cannot find file %x.</source>
<target>Kan bestand %x niet vinden.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Indien deze fout wordt genegeerd zullen de mappen als leeg beschouwd worden. Ontbrekende mappen worden automatisch aangemaakt indien nodig.</target>
+<source>Comparison finished:</source>
+<target>Vergelijking voltooid:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 item gevonden</pluralform>
+<pluralform>%x items gevonden</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Het bestand %x heeft een ongeldige datum.</target>
@@ -167,7 +182,7 @@
<target>Uitvoeren met achtergrond prioriteit</target>
<source>Lock directories during sync</source>
-<target>Directories vergrendelen tijdens de synchronisatie</target>
+<target>Mappen vergrendelen tijdens de synchronisatie</target>
<source>Verify copied files</source>
<target>Controleer de gekopieerde bestanden</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Het gebruik van niet-standaard algemene instellingen:</target>
-<source>Starting comparison</source>
-<target>Start vergelijking</target>
-
<source>A folder input field is empty.</source>
<target>Invoerveld van een map is leeg.</target>
@@ -318,15 +330,15 @@ Werkelijk: %y bytes
<source>Unable to move %x to the recycle bin.</source>
<target>Niet in staat om %x naar de prullenbak te verplaatsen.</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 find %x.</source>
-<target>Kan %x niet vinden.</target>
-
<source>Type of item %x is not supported:</source>
<target>Dit itemtype %x wordt niet ondersteund:</target>
@@ -432,6 +444,9 @@ Werkelijk: %y bytes
<source>Lock owner:</source>
<target>Vergrendel eigenaar:</target>
+<source>Detecting abandoned lock...</source>
+<target>Opsporen van verlaten vergrendeling...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Werkelijk: %y bytes
<pluralform>%x sec</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Opsporen van verlaten vergrendeling...</target>
-
<source>Items processed:</source>
<target>Items verwerkt:</target>
@@ -456,8 +468,8 @@ Werkelijk: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Fout bij het analyseren van bestand %x, rij %y, kolom %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>De mapvergrendeling voor %x kan niet ingesteld worden.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Kan map vergrendelingen niet instellen voor de volgende mappen:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Werkelijk: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>Volumenaam %x behoort niet tot bestandspad %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Stoppen gevraagd: wachten totdat de huidige bewerking is voltooid...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Kan geen tijdstempel maken voor versiebeheer:</target>
@@ -513,6 +522,9 @@ Werkelijk: %y bytes
<source>Select a folder</source>
<target>Selecteer een map</target>
+<source>&New</source>
+<target>&Nieuw</target>
+
<source>&Open...</source>
<target>&Openen...</target>
@@ -588,7 +600,7 @@ De opdracht wordt geactiveerd als:
<target>Over</target>
<source>Build: %x</source>
-<target>Build: %x</target>
+<target>Ontwikkeld: %x</target>
<source>All files</source>
<target>Alle bestanden</target>
@@ -728,26 +740,23 @@ De opdracht wordt geactiveerd als:
<source>job name</source>
<target>taaknaam</target>
-<source>Show summary</source>
-<target>Toon samenvatting</target>
+<source>System: Sleep</source>
+<target>Systeem: Slaapstand</target>
-<source>Sleep</source>
-<target>Slaapstand</target>
+<source>System: Shut down</source>
+<target>Systeem: Uitschakelen</target>
-<source>Shut down</source>
-<target>Uitschakelen</target>
-
-<source>Synchronization stopped</source>
-<target>Synchronisatie gestopt</target>
+<source>Cleaning up old log files...</source>
+<target>Opruimen oude logboekbestanden...</target>
<source>Stopped</source>
<target>Gestopt</target>
-<source>Synchronization completed with errors</source>
-<target>Synchronisatie met fouten voltooid</target>
+<source>Completed with errors</source>
+<target>Voltooid met fouten</target>
-<source>Synchronization completed with warnings</source>
-<target>Synchronisatie met waarschuwingen voltooid</target>
+<source>Completed with warnings</source>
+<target>Voltooid met waarschuwingen</target>
<source>Warning</source>
<target>Waarschuwing</target>
@@ -755,15 +764,12 @@ De opdracht wordt geactiveerd als:
<source>Nothing to synchronize</source>
<target>Niets om te synchroniseren</target>
-<source>Synchronization completed successfully</source>
-<target>Synchronisatie succesvol voltooid</target>
+<source>Completed successfully</source>
+<target>Succesvol voltooid</target>
<source>Executing command %x</source>
<target>Opdracht %x uitvoeren</target>
-<source>Cleaning up old log files...</source>
-<target>Opruimen oude logboekbestanden...</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>
@@ -779,14 +785,8 @@ De opdracht wordt geactiveerd als:
<source>Switching to FreeFileSync's main window</source>
<target>Overschakelen naar het hoofdvenster van FreeFileSyncs</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Automatisch opnieuw proberen in 1 seconde...</pluralform>
-<pluralform>Automatisch opnieuw proberen in %x seconden...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Automatisch opnieuw proberen</target>
<source>Ignore &all</source>
<target>Negeer &alles</target>
@@ -797,6 +797,27 @@ De opdracht wordt geactiveerd als:
<source>Serious Error</source>
<target>Ernstige fout</target>
+<source>Last session</source>
+<target>Laatste sessie</target>
+
+<source>Today</source>
+<target>Vandaag</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dag</pluralform>
+<pluralform>%x dagen</pluralform>
+</target>
+
+<source>Name</source>
+<target>Naam</target>
+
+<source>Last sync</source>
+<target>Laatste synchronisatie</target>
+
<source>Folder</source>
<target>Map</target>
@@ -860,9 +881,6 @@ De opdracht wordt geactiveerd als:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Selecteer een map op een lokaal bestandssysteem, netwerk of een MTP-apparaat.</target>
-<source>&New</source>
-<target>&Nieuw</target>
-
<source>&Save</source>
<target>&Opslaan</target>
@@ -909,7 +927,7 @@ De opdracht wordt geactiveerd als:
<target>&Controleren op updates</target>
<source>Check &automatically once a week</source>
-<target>Controleer een keer per week &automatisch</target>
+<target>Controleer eens per week &automatisch</target>
<source>Cancel</source>
<target>Annuleren</target>
@@ -974,6 +992,9 @@ De opdracht wordt geactiveerd als:
<source>Total bytes to copy</source>
<target>Totaal aantal te kopiëren bytes</target>
+<source>Arrange folder pair</source>
+<target>Rangschik folder-paar</target>
+
<source>Folder pair:</source>
<target>Map-paar:</target>
@@ -1066,11 +1087,14 @@ De opdracht wordt geactiveerd als:
<source>Naming convention:</source>
<target>Naamgevingsconventie:</target>
-<source>&Ignore errors</source>
-<target>&Negeer fouten</target>
+<source>Ignore errors</source>
+<target>Negeer fouten</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Toon pop-up bij fouten of waarschuwingen</target>
+<source>Retry count:</source>
+<target>Probeer opnieuw te tellen:</target>
+
+<source>Delay (in seconds):</source>
+<target>Vertraging (in seconden):</target>
<source>Run a command after synchronization:</source>
<target>Voer een opdracht uit na de synchronisatie:</target>
@@ -1078,9 +1102,6 @@ De opdracht wordt geactiveerd als:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Rangschik folder-paar</target>
-
<source>Enter your login details:</source>
<target>Logingegevens invoeren:</target>
@@ -1177,12 +1198,12 @@ De opdracht wordt geactiveerd als:
<source>Minimize to notification area</source>
<target>Minimaliseren naar systeemvak</target>
-<source>Bytes copied:</source>
-<target>Gekopieerde bytes:</target>
-
<source>When finished:</source>
<target>Wanneer je gereed bent:</target>
+<source>Auto-close</source>
+<target>Automatisch sluiten</target>
+
<source>Close</source>
<target>Sluiten</target>
@@ -1195,12 +1216,18 @@ De opdracht wordt geactiveerd als:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Maak een batch-bestand om zonder toezicht te synchroniseren. Om te starten, dubbelklik op het bestand of maak een opdracht in de taakplanner: %x</target>
+<source>Progress dialog:</source>
+<target>Voortgangsdialoog:</target>
+
<source>Run minimized</source>
<target>Geminimaliseerd uitvoeren</target>
<source>&Show error dialog</source>
<target>&Toon foutdialoog</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Toon pop-up bij fouten of waarschuwingen</target>
+
<source>&Cancel</source>
<target>&Annuleer</target>
@@ -1249,14 +1276,11 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Transfer file and folder permissions.</source>
<target>Overdracht van bestands- en mapmachtigingen.</target>
-<source>Automatic retry on error:</source>
-<target>Automatisch opnieuw proberen bij fouten:</target>
-
-<source>Retry count:</source>
-<target>Probeer opnieuw te tellen:</target>
+<source>Show hidden dialogs again</source>
+<target>Verborgen dialoogvensters weergeven</target>
-<source>Delay (in seconds):</source>
-<target>Vertraging (in seconden):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Alle permanent verborgen dialogen en waarschuwingsberichten opnieuw weergeven</target>
<source>Customize context menu:</source>
<target>Contextmenu aanpassen:</target>
@@ -1264,12 +1288,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Description</source>
<target>Beschrijving</target>
-<source>Show hidden dialogs again</source>
-<target>Verborgen dialoogvensters weergeven</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Alle permanent verborgen dialogen en waarschuwingsberichten opnieuw weergeven</target>
-
<source>&Default</source>
<target>&Standaard</target>
@@ -1324,14 +1342,23 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Activate offline</source>
<target>Activeer offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Markeer configuraties die niet meer dan het volgende aantal dagen zijn uitgevoerd:</target>
+
+<source>Synchronization Settings</source>
+<target>Synchronisatie-instellingen</target>
+
+<source>Access Online Storage</source>
+<target>Toegang Online Opslag</target>
+
<source>Save as a Batch Job</source>
<target>Opslaan als een batchverwerking</target>
<source>Delete Items</source>
<target>Items verwijderen</target>
-<source>Copy items</source>
-<target>Kopieer items</target>
+<source>Copy Items</source>
+<target>Items kopiëren</target>
<source>Options</source>
<target>Opties</target>
@@ -1342,6 +1369,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync donatie Editie</target>
+<source>Highlight Configurations</source>
+<target>Markeer Configuraties</target>
+
<source>&Options</source>
<target>&Opties</target>
@@ -1465,9 +1495,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Select time span...</source>
<target>Selecteer tijdsduur...</target>
-<source>Last session</source>
-<target>Laatste sessie</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Map vergelijken en synchroniseren</target>
@@ -1486,8 +1513,11 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Do&n't save</source>
<target>&Niet opslaan</target>
-<source>Remove entry from list</source>
-<target>Vermelding verwijderen uit de lijst</target>
+<source>Hide configuration</source>
+<target>Verberg configuratie</target>
+
+<source>Highlight...</source>
+<target>Markeer...</target>
<source>Clear filter</source>
<target>Filter wissen</target>
@@ -1567,6 +1597,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Paused</source>
<target>Onderbroken</target>
+<source>Stop requested...</source>
+<target>Stop gevraagd...</target>
+
<source>Initializing...</source>
<target>Initialiseren...</target>
@@ -1576,9 +1609,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Comparing content...</source>
<target>Inhoud vergelijken...</target>
-<source>Completed</source>
-<target>Voltooid</target>
-
<source>Info</source>
<target>Info</target>
@@ -1660,12 +1690,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Parameters for opposite side</source>
<target>Parameters voor de andere kant</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Verborgen vensters en waarschuwingsberichten opnieuw weergeven?</target>
-
-<source>&Show</source>
-<target>&Toon</target>
-
<source>Downloading update...</source>
<target>Downloaden van update...</target>
@@ -1690,18 +1714,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Configure your own synchronization rules.</source>
<target>Configureer uw eigen synchronisatie regels.</target>
-<source>Synchronization Settings</source>
-<target>Synchronisatie-instellingen</target>
-
<source>Comparison</source>
<target>Vergelijking</target>
<source>Synchronization</source>
<target>Synchronisatie</target>
-<source>Today</source>
-<target>Vandaag</target>
-
<source>This week</source>
<target>Deze week</target>
@@ -1771,9 +1789,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Files</source>
<target>Bestanden</target>
-<source>Name</source>
-<target>Naam</target>
-
<source>Percentage</source>
<target>Percentage</target>
@@ -1885,15 +1900,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<pluralform>%x uren</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 dag</pluralform>
-<pluralform>%x dagen</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Kan geen privileges %x instellen.</target>
@@ -1957,9 +1963,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Desktop</source>
<target>Bureaublad</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Startmenu</target>
+<source>Send To</source>
+<target>Verzenden Naar</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>Registeren van de FreeFileSync bestands-extensies</target>
@@ -1987,6 +1996,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Kies voor een lokale installatie of selecteer een andere map voor de installatie.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>De stille installatie-modus is alleen beschikbaar in de FreeFileSync donatie editie.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>De %x installatieoptie is alleen beschikbaar in de FreeFileSync Donatie-editie.</target>
diff --git a/FreeFileSync/Build/Languages/english_uk.lng b/FreeFileSync/Build/Languages/english_uk.lng
index a926e1f4..1f3fcaf0 100755
--- a/FreeFileSync/Build/Languages/english_uk.lng
+++ b/FreeFileSync/Build/Languages/english_uk.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Syntax error</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>A left and a right directory path are expected after %x.</target>
+
<source>Cannot find file %x.</source>
<target>Cannot find file %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</target>
+<source>Comparison finished:</source>
+<target>Comparison finished:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>File %x has an invalid date.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Using non-default global settings:</target>
-<source>Starting comparison</source>
-<target>Starting comparison</target>
-
<source>A folder input field is empty.</source>
<target>A folder input field is empty.</target>
@@ -318,15 +330,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</source>
<target>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>Cannot find %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Type of item %x is not supported:</target>
@@ -432,6 +444,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>Lock owner:</target>
+<source>Detecting abandoned lock...</source>
+<target>Detecting abandoned lock...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Actual: %y bytes
<pluralform>%x sec</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Detecting abandoned lock...</target>
-
<source>Items processed:</source>
<target>Elements processed:</target>
@@ -456,8 +468,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Error parsing file %x, row %y, column %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Cannot set directory lock for %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Cannot set directory locks for the following folders:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>Volume name %x is not part of file path %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Stop requested: Waiting for current operation to finish...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Unable to create time stamp for versioning:</target>
@@ -513,6 +522,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>Select a folder</target>
+<source>&New</source>
+<target>&New</target>
+
<source>&Open...</source>
<target>&Open...</target>
@@ -728,26 +740,23 @@ The command is triggered if:
<source>job name</source>
<target>job name</target>
-<source>Show summary</source>
-<target>Show summary</target>
+<source>System: Sleep</source>
+<target>System: Sleep</target>
-<source>Sleep</source>
-<target>Sleep</target>
+<source>System: Shut down</source>
+<target>System: Shut down</target>
-<source>Shut down</source>
-<target>Shut down</target>
-
-<source>Synchronization stopped</source>
-<target>Synchronisation stopped</target>
+<source>Cleaning up old log files...</source>
+<target>Cleaning up old log files...</target>
<source>Stopped</source>
<target>Stopped</target>
-<source>Synchronization completed with errors</source>
-<target>Synchronisation completed with errors</target>
+<source>Completed with errors</source>
+<target>Completed with errors</target>
-<source>Synchronization completed with warnings</source>
-<target>Synchronisation completed with warnings</target>
+<source>Completed with warnings</source>
+<target>Completed with warnings</target>
<source>Warning</source>
<target>Warning</target>
@@ -755,15 +764,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>Nothing to synchronise</target>
-<source>Synchronization completed successfully</source>
-<target>Synchronisation completed successfully</target>
+<source>Completed successfully</source>
+<target>Completed successfully</target>
<source>Executing command %x</source>
<target>Executing command %x</target>
-<source>Cleaning up old log files...</source>
-<target>Cleaning up old log files...</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>
@@ -779,14 +785,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>Switching to FreeFileSync's main window</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Automatic retry</target>
<source>Ignore &all</source>
<target>Ignore &all</target>
@@ -797,6 +797,27 @@ The command is triggered if:
<source>Serious Error</source>
<target>Serious Error</target>
+<source>Last session</source>
+<target>Last session</target>
+
+<source>Today</source>
+<target>Today</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</target>
+
+<source>Name</source>
+<target>Name</target>
+
+<source>Last sync</source>
+<target>Last sync</target>
+
<source>Folder</source>
<target>Folder</target>
@@ -860,9 +881,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Please select a folder on a local file system, network or an MTP device.</target>
-<source>&New</source>
-<target>&New</target>
-
<source>&Save</source>
<target>&Save</target>
@@ -974,6 +992,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>Total bytes to copy</target>
+<source>Arrange folder pair</source>
+<target>Arrange folder pair</target>
+
<source>Folder pair:</source>
<target>Folder pair:</target>
@@ -1066,11 +1087,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>Naming convention:</target>
-<source>&Ignore errors</source>
-<target>&Ignore errors</target>
+<source>Ignore errors</source>
+<target>Ignore errors</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Show pop-up on errors or warnings</target>
+<source>Retry count:</source>
+<target>Retry count:</target>
+
+<source>Delay (in seconds):</source>
+<target>Delay (in seconds):</target>
<source>Run a command after synchronization:</source>
<target>Run a command after synchronization:</target>
@@ -1078,9 +1102,6 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Arrange folder pair</target>
-
<source>Enter your login details:</source>
<target>Enter your login details:</target>
@@ -1177,12 +1198,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>Minimise to notification area</target>
-<source>Bytes copied:</source>
-<target>Bytes copied:</target>
-
<source>When finished:</source>
<target>When finished:</target>
+<source>Auto-close</source>
+<target>Auto-close</target>
+
<source>Close</source>
<target>Close</target>
@@ -1195,12 +1216,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Create a batch file for unattended synchronisation. To start, double-click this file or schedule in a task planner: %x</target>
+<source>Progress dialog:</source>
+<target>Progress dialog:</target>
+
<source>Run minimized</source>
<target>Run minimised</target>
<source>&Show error dialog</source>
<target>&Show error dialog</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Show pop-up on errors or warnings</target>
+
<source>&Cancel</source>
<target>&Cancel</target>
@@ -1249,14 +1276,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Transfer file and folder permissions.</target>
-<source>Automatic retry on error:</source>
-<target>Automatic retry on error:</target>
-
-<source>Retry count:</source>
-<target>Retry count:</target>
+<source>Show hidden dialogs again</source>
+<target>Show hidden dialogues again</target>
-<source>Delay (in seconds):</source>
-<target>Delay (in seconds):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Show all permanently hidden dialogues and warning messages again</target>
<source>Customize context menu:</source>
<target>Customise context menu:</target>
@@ -1264,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>Description</target>
-<source>Show hidden dialogs again</source>
-<target>Show hidden dialogues again</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Show all permanently hidden dialogues and warning messages again</target>
-
<source>&Default</source>
<target>&Default</target>
@@ -1324,14 +1342,23 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>Activate offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Highlight configurations that have not been run for more than the following number of days:</target>
+
+<source>Synchronization Settings</source>
+<target>Synchronisation Settings</target>
+
+<source>Access Online Storage</source>
+<target>Access Online Storage</target>
+
<source>Save as a Batch Job</source>
<target>Save as a Batch Job</target>
<source>Delete Items</source>
<target>Delete Items</target>
-<source>Copy items</source>
-<target>Copy items</target>
+<source>Copy Items</source>
+<target>Copy Items</target>
<source>Options</source>
<target>Options</target>
@@ -1342,6 +1369,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Highlight Configurations</target>
+
<source>&Options</source>
<target>&Options</target>
@@ -1465,9 +1495,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Select time span...</target>
-<source>Last session</source>
-<target>Last session</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Folder Comparison and Synchronisation</target>
@@ -1486,8 +1513,11 @@ 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>Remove entry from list</source>
-<target>Remove entry from list</target>
+<source>Hide configuration</source>
+<target>Hide configuration</target>
+
+<source>Highlight...</source>
+<target>Highlight...</target>
<source>Clear filter</source>
<target>Clear filter</target>
@@ -1567,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>Paused</target>
+<source>Stop requested...</source>
+<target>Stop requested...</target>
+
<source>Initializing...</source>
<target>Initialising...</target>
@@ -1576,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>Comparing content...</target>
-<source>Completed</source>
-<target>Completed</target>
-
<source>Info</source>
<target>Info</target>
@@ -1660,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Parameters for opposite side</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Show hidden dialogues and warning messages again?</target>
-
-<source>&Show</source>
-<target>&Show</target>
-
<source>Downloading update...</source>
<target>Downloading update...</target>
@@ -1690,18 +1714,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>Configure your own synchronisation rules.</target>
-<source>Synchronization Settings</source>
-<target>Synchronisation Settings</target>
-
<source>Comparison</source>
<target>Comparison</target>
<source>Synchronization</source>
<target>Synchronisation</target>
-<source>Today</source>
-<target>Today</target>
-
<source>This week</source>
<target>This week</target>
@@ -1771,9 +1789,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>Files</target>
-<source>Name</source>
-<target>Name</target>
-
<source>Percentage</source>
<target>Percentage</target>
@@ -1885,15 +1900,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x hours</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Cannot set privilege %x.</target>
@@ -1957,8 +1963,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>Desktop</target>
-<source>Start menu</source>
-<target>Start menu</target>
+<source>Start Menu</source>
+<target>Start Menu</target>
+
+<source>Send To</source>
+<target>Send To</target>
<source>Registering FreeFileSync file extensions</source>
<target>Registering FreeFileSync file extensions</target>
@@ -1987,6 +1996,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Please choose the local installation type or select a different folder for installation.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>The silent installation mode is only available in the FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>The %x installation option is only available in the FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Languages/finnish.lng b/FreeFileSync/Build/Languages/finnish.lng
index a0c3b95e..dfdf1145 100755
--- a/FreeFileSync/Build/Languages/finnish.lng
+++ b/FreeFileSync/Build/Languages/finnish.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Muotovirhe</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target></target>
+
<source>Cannot find file %x.</source>
<target>Tiedosto %x ei löydy.</target>
@@ -115,6 +118,16 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Hakemistot luodaan tyhjinä jos virhe ohitetaan. Puuttuvat hakemistot luodaan tarvittaessa.</target>
+<source>Comparison finished:</source>
+<target></target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Tiedostolla %x on virheellinen päiväys.</target>
@@ -175,9 +188,6 @@
<source>Using non-default global settings:</source>
<target>Käytä mukautettuja yleisasetuksia:</target>
-<source>Starting comparison</source>
-<target>Vertailu alkaa</target>
-
<source>A folder input field is empty.</source>
<target>Hakemiston syötekenttä on tyhjä.</target>
@@ -318,15 +328,15 @@ Todellinen: %y tavua
<source>Unable to move %x to the recycle bin.</source>
<target>%x:n siirto Roskakoriin epäonnistui.</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 find %x.</source>
-<target>%x ei löydy.</target>
-
<source>Type of item %x is not supported:</source>
<target>Kohteen %x tyyppiä ei tueta:</target>
@@ -432,6 +442,9 @@ Todellinen: %y tavua
<source>Lock owner:</source>
<target>Lukitsija:</target>
+<source>Detecting abandoned lock...</source>
+<target>Hylätyn lukituksen etsintä...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +454,6 @@ Todellinen: %y tavua
<pluralform>%x s</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Hylätyn lukituksen etsintä...</target>
-
<source>Items processed:</source>
<target>Osioita käsitelty:</target>
@@ -456,8 +466,8 @@ Todellinen: %y tavua
<source>Error parsing file %x, row %y, column %z.</source>
<target>Jäsennysvirhe - tiedosto: %x, rivi: %y, sarake: %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Hakemiston %x lukitus ei onnistu.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target></target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +508,6 @@ Todellinen: %y tavua
<source>Volume name %x is not part of file path %y.</source>
<target>Asema %x ei esiinny tiedostopolussa %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Keskeytyspyyntö: odotetaan tehtävän valmistumista...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Versionhallinnan aikaleimaa ei voida luoda:</target>
@@ -513,6 +520,9 @@ Todellinen: %y tavua
<source>Select a folder</source>
<target>Valitse hakemisto</target>
+<source>&New</source>
+<target>&Uusi</target>
+
<source>&Open...</source>
<target>&Avaa...</target>
@@ -728,26 +738,23 @@ Käsky suoritetaan jos:
<source>job name</source>
<target>työnnimi</target>
-<source>Show summary</source>
-<target>Näytä yhteenveto</target>
+<source>System: Sleep</source>
+<target></target>
-<source>Sleep</source>
-<target>Lepotila</target>
+<source>System: Shut down</source>
+<target></target>
-<source>Shut down</source>
-<target>Sulje</target>
-
-<source>Synchronization stopped</source>
-<target>Täsmäytys on pysäytetty</target>
+<source>Cleaning up old log files...</source>
+<target>Siivotaan vanhat lokitiedostot...</target>
<source>Stopped</source>
<target>Keskeytys</target>
-<source>Synchronization completed with errors</source>
-<target>Täsmäytys päättyi virheisiin</target>
+<source>Completed with errors</source>
+<target></target>
-<source>Synchronization completed with warnings</source>
-<target>Täsmäytys päättyi varoituksin</target>
+<source>Completed with warnings</source>
+<target></target>
<source>Warning</source>
<target>Varoitus</target>
@@ -755,15 +762,12 @@ Käsky suoritetaan jos:
<source>Nothing to synchronize</source>
<target>Ei mitään täsmäytettävää</target>
-<source>Synchronization completed successfully</source>
-<target>Täsmäytys päättyi onnistuneesti</target>
+<source>Completed successfully</source>
+<target></target>
<source>Executing command %x</source>
<target>Suorita komentua %x</target>
-<source>Cleaning up old log files...</source>
-<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>
@@ -779,14 +783,8 @@ Käsky suoritetaan jos:
<source>Switching to FreeFileSync's main window</source>
<target>Vaihdetaan FreeFileSyncin pääikkunaan</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Uusi yritys 1 sekunnin kuluttua...</pluralform>
-<pluralform>Uusi yritys %x sekunnin kuluttua...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target></target>
<source>Ignore &all</source>
<target>Ohita &kaikki</target>
@@ -797,6 +795,27 @@ Käsky suoritetaan jos:
<source>Serious Error</source>
<target>Vakava virhe</target>
+<source>Last session</source>
+<target>Viime istunto</target>
+
+<source>Today</source>
+<target>Tänään</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 päivä</pluralform>
+<pluralform>%x päivää</pluralform>
+</target>
+
+<source>Name</source>
+<target>Nimi</target>
+
+<source>Last sync</source>
+<target></target>
+
<source>Folder</source>
<target>Hakemisto</target>
@@ -860,9 +879,6 @@ Käsky suoritetaan jos:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Valitse kansio joka on paikallinen, verkossa tai MTP laitteella.</target>
-<source>&New</source>
-<target>&Uusi</target>
-
<source>&Save</source>
<target>&Tallenna</target>
@@ -974,6 +990,9 @@ Käsky suoritetaan jos:
<source>Total bytes to copy</source>
<target>Kopioitava määrä tavuja</target>
+<source>Arrange folder pair</source>
+<target>Järjestä hakemistoparit</target>
+
<source>Folder pair:</source>
<target>Hakemistopari:</target>
@@ -1066,11 +1085,14 @@ Käsky suoritetaan jos:
<source>Naming convention:</source>
<target>Nimeämiskäytäntö:</target>
-<source>&Ignore errors</source>
-<target>&Ohita virheet</target>
+<source>Ignore errors</source>
+<target></target>
-<source>Show pop-up on errors or warnings</source>
-<target>Näytä ponnahdusikkuna virheiden tai varoituksien kohdalla</target>
+<source>Retry count:</source>
+<target>Uusintayrityksiä:</target>
+
+<source>Delay (in seconds):</source>
+<target>Viive (sekunneissa):</target>
<source>Run a command after synchronization:</source>
<target>Suorita käsky kun täsmäytys on tehty:</target>
@@ -1078,9 +1100,6 @@ Käsky suoritetaan jos:
<source>OK</source>
<target>Kyllä</target>
-<source>Arrange folder pair</source>
-<target>Järjestä hakemistoparit</target>
-
<source>Enter your login details:</source>
<target>Anna kirjautumistietosi:</target>
@@ -1177,12 +1196,12 @@ Käsky suoritetaan jos:
<source>Minimize to notification area</source>
<target>Pienennä ilmaisinalueelle</target>
-<source>Bytes copied:</source>
-<target>Kopioituja tavuja:</target>
-
<source>When finished:</source>
<target>Kun valmis:</target>
+<source>Auto-close</source>
+<target></target>
+
<source>Close</source>
<target>Sulje</target>
@@ -1195,12 +1214,18 @@ Käsky suoritetaan jos:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Luo eräajotiedosto automaattista täsmäytystä varten. Käynnistä kaksoisnapsauttamalla tai ajasta tehtävä: %x</target>
+<source>Progress dialog:</source>
+<target></target>
+
<source>Run minimized</source>
<target>Suorita pienennettynä</target>
<source>&Show error dialog</source>
<target>&Näytä virheilmoitus</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Näytä ponnahdusikkuna virheiden tai varoituksien kohdalla</target>
+
<source>&Cancel</source>
<target>&Peruuta</target>
@@ -1249,14 +1274,11 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Transfer file and folder permissions.</source>
<target>Siirrä tiedostojen ja hakemistojen käyttöoikeudet.</target>
-<source>Automatic retry on error:</source>
-<target>Automaattinen uusintayritys, kun virhe sattuu:</target>
-
-<source>Retry count:</source>
-<target>Uusintayrityksiä:</target>
+<source>Show hidden dialogs again</source>
+<target>Näytä piiloitetut valintaikkunat uudestaan</target>
-<source>Delay (in seconds):</source>
-<target>Viive (sekunneissa):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Näytä pysyvästi piiloitetut valintaikkunat ja varoitukset uudestaan</target>
<source>Customize context menu:</source>
<target>Muokkaa pikavalikkoa:</target>
@@ -1264,12 +1286,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Description</source>
<target>Kuvaus</target>
-<source>Show hidden dialogs again</source>
-<target>Näytä piiloitetut valintaikkunat uudestaan</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Näytä pysyvästi piiloitetut valintaikkunat ja varoitukset uudestaan</target>
-
<source>&Default</source>
<target>&Oletus</target>
@@ -1324,14 +1340,23 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Activate offline</source>
<target>Aktivoi yhteyttä</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target></target>
+
+<source>Synchronization Settings</source>
+<target>Täsmäyksen asetukset</target>
+
+<source>Access Online Storage</source>
+<target></target>
+
<source>Save as a Batch Job</source>
<target>Tallenna eräajona></target>
<source>Delete Items</source>
<target>Poista kohteet</target>
-<source>Copy items</source>
-<target>Monista kohteet</target>
+<source>Copy Items</source>
+<target></target>
<source>Options</source>
<target>Asetukset</target>
@@ -1342,6 +1367,9 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Lahjoittajan versio</target>
+<source>Highlight Configurations</source>
+<target></target>
+
<source>&Options</source>
<target>&Asetukset</target>
@@ -1465,9 +1493,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Select time span...</source>
<target>Valitse aikajana...</target>
-<source>Last session</source>
-<target>Viime istunto</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Hakemistojen vertailu ja täsmäytys</target>
@@ -1486,8 +1511,11 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Do&n't save</source>
<target>Äl&ä tallenna</target>
-<source>Remove entry from list</source>
-<target>Poista valittu määrittely listalta</target>
+<source>Hide configuration</source>
+<target></target>
+
+<source>Highlight...</source>
+<target></target>
<source>Clear filter</source>
<target>Nollaa suodin</target>
@@ -1567,6 +1595,9 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Paused</source>
<target>Pysäytetty</target>
+<source>Stop requested...</source>
+<target></target>
+
<source>Initializing...</source>
<target>Alustetaan...</target>
@@ -1576,9 +1607,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Comparing content...</source>
<target>Sisältöä vertaillaan...</target>
-<source>Completed</source>
-<target>Valmis</target>
-
<source>Info</source>
<target>Info</target>
@@ -1660,12 +1688,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Parameters for opposite side</source>
<target>Toisen puolen parametrit</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Näytetäänkö piiloitetut valintaikkunat ja varoitukset uudestaan?</target>
-
-<source>&Show</source>
-<target>&Näytä</target>
-
<source>Downloading update...</source>
<target>Ladataan päivitystä...</target>
@@ -1690,18 +1712,12 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Configure your own synchronization rules.</source>
<target>Määritä omat täsmäytyssäännöt.</target>
-<source>Synchronization Settings</source>
-<target>Täsmäyksen asetukset</target>
-
<source>Comparison</source>
<target>Vertailu</target>
<source>Synchronization</source>
<target>Täsmäytys</target>
-<source>Today</source>
-<target>Tänään</target>
-
<source>This week</source>
<target>Tällä viikolla</target>
@@ -1771,9 +1787,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Files</source>
<target>Tiedostot</target>
-<source>Name</source>
-<target>Nimi</target>
-
<source>Percentage</source>
<target>Prosenttia</target>
@@ -1885,15 +1898,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<pluralform>%x tuntia</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 päivä</pluralform>
-<pluralform>%x päivää</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Oikeutta %x ei voitu asettaa.</target>
@@ -1957,8 +1961,11 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Desktop</source>
<target>Työpöydälle</target>
-<source>Start menu</source>
-<target>Käynnistä-valikkoon</target>
+<source>Start Menu</source>
+<target></target>
+
+<source>Send To</source>
+<target></target>
<source>Registering FreeFileSync file extensions</source>
<target>Liitään FreeFileSync tiedostotunnisteet</target>
@@ -1987,6 +1994,6 @@ Tällä varmistetaan eheys, vaikka vakava virhe tapahtuisi.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Valitse paikallinen asennus tai vaihda asennushakemistoa.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Häiveasennus toimii vain FreeFileSyncin Lahjoittajan versiossa.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target></target>
diff --git a/FreeFileSync/Build/Languages/french.lng b/FreeFileSync/Build/Languages/french.lng
index 625ea7c2..67627ec3 100755
--- a/FreeFileSync/Build/Languages/french.lng
+++ b/FreeFileSync/Build/Languages/french.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Erreur de syntaxe</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Un répertoire gauche et un répertoire droit sont requis après %x.</target>
+
<source>Cannot find file %x.</source>
<target>Impossible de trouver le fichier %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Si cette erreur est ignorée, les dossiers seront considérés comme vides. Les dossiers manquants seront automatiquement créés si nécessaire.</target>
+<source>Comparison finished:</source>
+<target>Comparaison terminée :</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>%x élément trouvé</pluralform>
+<pluralform>%x éléments trouvés</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Le fichier %x a une date invalide.</target>
@@ -143,7 +158,7 @@
<target>Génération de la liste des fichiers...</target>
<source>Fail-safe file copy</source>
-<target>Copie de fichiers sécurisés</target>
+<target>Copie de fichiers sécurisée</target>
<source>Enabled</source>
<target>Activé</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Utilisation des paramètres globaux particuliers :</target>
-<source>Starting comparison</source>
-<target>Comparaison en cours</target>
-
<source>A folder input field is empty.</source>
<target>Un champ dossier est vide.</target>
@@ -318,15 +330,15 @@ Trouvé : %y octets
<source>Unable to move %x to the recycle bin.</source>
<target>Impossible de déplacer %x dans la Corbeille.</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 find %x.</source>
-<target>Impossible de trouver %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Le type de l'élément %x n'est pas accepté :</target>
@@ -432,6 +444,9 @@ Trouvé : %y octets
<source>Lock owner:</source>
<target>Propriétaire du verrou :</target>
+<source>Detecting abandoned lock...</source>
+<target>Détection de verrouillage abandonné ...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Trouvé : %y octets
<pluralform>%x sec</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Détection de verrouillage abandonné ...</target>
-
<source>Items processed:</source>
<target>Élements traités :</target>
@@ -456,8 +468,8 @@ Trouvé : %y octets
<source>Error parsing file %x, row %y, column %z.</source>
<target>Erreur lors de l'analyse du fichier %x, ligne %y, colonne %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Impossible de verrouiller le dossier %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Impossible de verrouiller les répertoires des dossiers suivants :</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Trouvé : %y octets
<source>Volume name %x is not part of file path %y.</source>
<target>Le nom de volume %x ne fait pas partie du chemin %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<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>
@@ -513,6 +522,9 @@ Trouvé : %y octets
<source>Select a folder</source>
<target>Choisissez un dossier</target>
+<source>&New</source>
+<target>&Nouveau</target>
+
<source>&Open...</source>
<target>&Ouvrir...</target>
@@ -529,7 +541,7 @@ Trouvé : %y octets
<target>&Afficher l'aide</target>
<source>&About</source>
-<target>A &Propos de</target>
+<target>&A propos de</target>
<source>&Help</source>
<target>&Aide</target>
@@ -728,26 +740,23 @@ La commande est déclenchée si :
<source>job name</source>
<target>nom du job</target>
-<source>Show summary</source>
-<target>Afficher le résumé</target>
+<source>System: Sleep</source>
+<target>Système : Mise en veille</target>
-<source>Sleep</source>
-<target>Mise en veille</target>
+<source>System: Shut down</source>
+<target>Sustème : Arrêt</target>
-<source>Shut down</source>
-<target>Arrêt</target>
-
-<source>Synchronization stopped</source>
-<target>Synchronisation arrêtée</target>
+<source>Cleaning up old log files...</source>
+<target>Nettoyage des anciens fichiers log ...</target>
<source>Stopped</source>
<target>Arrêté</target>
-<source>Synchronization completed with errors</source>
-<target>Synchronisation terminée avec des erreurs</target>
+<source>Completed with errors</source>
+<target>Terminé avec erreurs</target>
-<source>Synchronization completed with warnings</source>
-<target>Synchronisation terminée avec des avertissements</target>
+<source>Completed with warnings</source>
+<target>Terminé avec observations</target>
<source>Warning</source>
<target>Attention</target>
@@ -755,15 +764,12 @@ La commande est déclenchée si :
<source>Nothing to synchronize</source>
<target>Rien à synchroniser</target>
-<source>Synchronization completed successfully</source>
-<target>Synchronisation terminée sans erreur</target>
+<source>Completed successfully</source>
+<target>Terminé avec succès</target>
<source>Executing command %x</source>
<target>Exécution de la commande %x</target>
-<source>Cleaning up old log files...</source>
-<target>Nettoyage des anciens fichiers log ...</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>
@@ -779,14 +785,8 @@ La commande est déclenchée si :
<source>Switching to FreeFileSync's main window</source>
<target>Basculer vers la fenêtre principale de FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Nouvel essai dans %x seconde ...</pluralform>
-<pluralform>Nouvel essai dans %x secondes ...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Réessayer automatiquement</target>
<source>Ignore &all</source>
<target>&Tout ignorer</target>
@@ -797,6 +797,27 @@ La commande est déclenchée si :
<source>Serious Error</source>
<target>Erreur Grave</target>
+<source>Last session</source>
+<target>Dernière session</target>
+
+<source>Today</source>
+<target>Aujourd'hui</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x jour</pluralform>
+<pluralform>%x jours</pluralform>
+</target>
+
+<source>Name</source>
+<target>Nom</target>
+
+<source>Last sync</source>
+<target>Dernière synchro</target>
+
<source>Folder</source>
<target>Dossier</target>
@@ -860,9 +881,6 @@ La commande est déclenchée si :
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Veuillez choisir un dossier local, en réseau ou un périphérique MTP.</target>
-<source>&New</source>
-<target>&Nouveau</target>
-
<source>&Save</source>
<target>&Sauvegarder</target>
@@ -974,6 +992,9 @@ La commande est déclenchée si :
<source>Total bytes to copy</source>
<target>Nombre total d'octets à copier</target>
+<source>Arrange folder pair</source>
+<target>Coordonne la paire de dossiers</target>
+
<source>Folder pair:</source>
<target>Paire de dossiers :</target>
@@ -1066,11 +1087,14 @@ La commande est déclenchée si :
<source>Naming convention:</source>
<target>Convention de nommage :</target>
-<source>&Ignore errors</source>
-<target>&Ignorer les erreurs</target>
+<source>Ignore errors</source>
+<target>Ignorer les erreurs</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Montrer les avertissements et les messages d'erreur</target>
+<source>Retry count:</source>
+<target>Nombre de tentatives :</target>
+
+<source>Delay (in seconds):</source>
+<target>Délai (en secondes) :</target>
<source>Run a command after synchronization:</source>
<target>Exécuter une commande après la synchronisation :</target>
@@ -1078,9 +1102,6 @@ La commande est déclenchée si :
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Coordonne la paire de dossiers</target>
-
<source>Enter your login details:</source>
<target>Entrez vos identifiants :</target>
@@ -1121,7 +1142,7 @@ La commande est déclenchée si :
<target>Fichier clé personnel :</target>
<source>&Show password</source>
-<target>&Affiche le mot de passe</target>
+<target>&Afficher le mot de passe</target>
<source>Directory on server:</source>
<target>Répertoire sur le serveur :</target>
@@ -1133,7 +1154,7 @@ La commande est déclenchée si :
<target>Comment améliorer les performances ?</target>
<source>Connections for directory reading:</source>
-<target>connexions pour la lecture des répertoires :</target>
+<target>Connexions pour la lecture des répertoires :</target>
<source>SFTP channels per connection:</source>
<target>Ports SFTP par connexion :</target>
@@ -1142,10 +1163,10 @@ La commande est déclenchée si :
<target>Détection des limites du serveur</target>
<source>Select a directory on the server:</source>
-<target>Sélectionner un répertoire sur le serveur :</target>
+<target>Choisir un répertoire sur le serveur :</target>
<source>Select Folder</source>
-<target>Sélectionner un Dossier</target>
+<target>Choisir un Dossier</target>
<source>Start synchronization now?</source>
<target>Démarrer la synchronisation maintenant ?</target>
@@ -1177,12 +1198,12 @@ La commande est déclenchée si :
<source>Minimize to notification area</source>
<target>Réduction à la zone de notification</target>
-<source>Bytes copied:</source>
-<target>Octets copiés :</target>
-
<source>When finished:</source>
<target>A la fin :</target>
+<source>Auto-close</source>
+<target>Fermeture automatique</target>
+
<source>Close</source>
<target>Fermer</target>
@@ -1195,12 +1216,18 @@ La commande est déclenchée si :
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Créer un fichier batch pour une synchronisation non assitée. Pour démarrer, double-cliquez sur ce fichier ou planifiez-le dans le gestionnaire des tâches : %x</target>
+<source>Progress dialog:</source>
+<target>Fenêtre de progression:</target>
+
<source>Run minimized</source>
<target>Exécution fenêtre réduite</target>
<source>&Show error dialog</source>
<target>&Afficher la boîte de dialogue d'erreur</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Montrer les avertissements et les messages d'erreur</target>
+
<source>&Cancel</source>
<target>&Annuler</target>
@@ -1249,14 +1276,11 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Transfer file and folder permissions.</source>
<target>Transfert des autorisations des fichiers et dossiers.</target>
-<source>Automatic retry on error:</source>
-<target>Nouvelle tentative automatique en cas d'erreur :</target>
-
-<source>Retry count:</source>
-<target>Nombre de tentatives :</target>
+<source>Show hidden dialogs again</source>
+<target>Réafficher les boîtes de dialogue masquées</target>
-<source>Delay (in seconds):</source>
-<target>Délai (en secondes) :</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Réafficher en permanence les boîtes de dialogue et les avertissements</target>
<source>Customize context menu:</source>
<target>Personnaliser le menu contextuel :</target>
@@ -1264,12 +1288,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Description</source>
<target>Description</target>
-<source>Show hidden dialogs again</source>
-<target>Réafficher les boîtes de dialogue masquées</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Réafficher en permanence les boîtes de dialogue et les avertissements</target>
-
<source>&Default</source>
<target>&Défaut</target>
@@ -1324,24 +1342,36 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Activate offline</source>
<target>Activez hors ligne</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Signaler les configurations non exécutées depuis le nombre de jours suivant :</target>
+
+<source>Synchronization Settings</source>
+<target>Configuration de la Synchronisation</target>
+
+<source>Access Online Storage</source>
+<target>Accéder au stockage en ligne</target>
+
<source>Save as a Batch Job</source>
<target>Enregistrer en tant que Fichier de Commandes</target>
<source>Delete Items</source>
<target>Supprimer les Éléments</target>
-<source>Copy items</source>
-<target>Copier les éléments</target>
+<source>Copy Items</source>
+<target>Copier les Éléménts</target>
<source>Options</source>
<target>Options</target>
<source>Select Time Span</source>
-<target>Sélection de l'Intervalle de Temps</target>
+<target>Choix de l'Intervalle de Temps</target>
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Signaler les configurations</target>
+
<source>&Options</source>
<target>&Options</target>
@@ -1465,9 +1495,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Select time span...</source>
<target>Choisir un intervalle de temps ...</target>
-<source>Last session</source>
-<target>Dernière session</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Comparaison de dossiers et Synchronisation</target>
@@ -1486,8 +1513,11 @@ 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>Remove entry from list</source>
-<target>Enlever un élément de la liste</target>
+<source>Hide configuration</source>
+<target>Masquer la configuration</target>
+
+<source>Highlight...</source>
+<target>Signaler ...</target>
<source>Clear filter</source>
<target>Effacer les filtres</target>
@@ -1567,6 +1597,9 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Paused</source>
<target>En pause</target>
+<source>Stop requested...</source>
+<target>Arrêt demandé ...</target>
+
<source>Initializing...</source>
<target>Initialisation ...</target>
@@ -1576,9 +1609,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Comparing content...</source>
<target>Comparaison du contenu ...</target>
-<source>Completed</source>
-<target>Terminé</target>
-
<source>Info</source>
<target>Info</target>
@@ -1604,7 +1634,7 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<target>Mot de passe :</target>
<source>Key password:</source>
-<target>Mot de passe clé :</target>
+<target>Clé du mot de passe :</target>
<source>Please enter a file path.</source>
<target>Veuillez entrer un chemin d'accès.</target>
@@ -1660,12 +1690,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Parameters for opposite side</source>
<target>Paramètres du côté opposé.</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Voulez-vous réafficher les boîtes de dialogues et les avertissements ?</target>
-
-<source>&Show</source>
-<target>&Afficher</target>
-
<source>Downloading update...</source>
<target>Téléchargement de la mise à jour ...</target>
@@ -1690,18 +1714,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Configure your own synchronization rules.</source>
<target>Paramétrage de vos règles de synchronisation.</target>
-<source>Synchronization Settings</source>
-<target>Configuration de la Synchronisation</target>
-
<source>Comparison</source>
<target>Comparaison</target>
<source>Synchronization</source>
<target>Synchronisation</target>
-<source>Today</source>
-<target>Aujourd'hui</target>
-
<source>This week</source>
<target>Cette semaine</target>
@@ -1748,7 +1766,7 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<target>A la fin :</target>
<source>On errors:</source>
-<target>En cas d'ereur :</target>
+<target>En cas d'erreur :</target>
<source>On success:</source>
<target>En cas de succès :</target>
@@ -1771,9 +1789,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Files</source>
<target>Fichiers</target>
-<source>Name</source>
-<target>Nom</target>
-
<source>Percentage</source>
<target>Pourcentage</target>
@@ -1885,15 +1900,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<pluralform>%x heures</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>%x jour</pluralform>
-<pluralform>%x jours</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Impossible de fixer le privilège %x.</target>
@@ -1907,7 +1913,7 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<target>Impossible d'arrêter le système.</target>
<source>Checking recycle bin failed for folder %x.</source>
-<target>Echec de la vérification de la Corbeille pour le dossier %x.</target>
+<target>Échec de la vérification de la Corbeille pour le dossier %x.</target>
<source>The following XML elements could not be read:</source>
<target>Les éléments XML suivants ne peuvent être lus :</target>
@@ -1957,8 +1963,11 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Desktop</source>
<target>le Bureau</target>
-<source>Start menu</source>
-<target>le menu Démarrer</target>
+<source>Start Menu</source>
+<target>Menu de démarrage</target>
+
+<source>Send To</source>
+<target>Envoyer vers</target>
<source>Registering FreeFileSync file extensions</source>
<target>Enregistrement des extensions de fichier FreeFileSync</target>
@@ -1987,6 +1996,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Veuillez choisir le type d'installation locale ou sélectionner un autre dossier pour cette installation.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Le mode d'installation silencieuse n'est valable qu'en FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>L'option d'installation %x n'est disponible que dans FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Languages/german.lng b/FreeFileSync/Build/Languages/german.lng
index 1a0b13f9..b993aab4 100755
--- a/FreeFileSync/Build/Languages/german.lng
+++ b/FreeFileSync/Build/Languages/german.lng
@@ -764,8 +764,8 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Nothing to synchronize</source>
<target>Es gibt nichts zu synchronisieren</target>
-<source>Completed</source>
-<target>Fertig</target>
+<source>Completed successfully</source>
+<target>Erfolgreich abgeschlossen</target>
<source>Executing command %x</source>
<target>Führe Befehl aus: %x</target>
@@ -992,6 +992,9 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Total bytes to copy</source>
<target>Gesamtmenge der zu kopierenden Daten</target>
+<source>Arrange folder pair</source>
+<target>Ordnerpaar anordnen</target>
+
<source>Folder pair:</source>
<target>Ordnerpaar:</target>
@@ -1084,11 +1087,14 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Naming convention:</source>
<target>Namenskonvention:</target>
-<source>&Ignore errors</source>
-<target>&Fehler ignorieren</target>
+<source>Ignore errors</source>
+<target>Fehler ignorieren</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target>
+<source>Retry count:</source>
+<target>Wiederholungen:</target>
+
+<source>Delay (in seconds):</source>
+<target>Verzögerung (in Sekunden):</target>
<source>Run a command after synchronization:</source>
<target>Befehl nach Synchronisation ausführen:</target>
@@ -1096,9 +1102,6 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Ordnerpaar anordnen</target>
-
<source>Enter your login details:</source>
<target>Anmeldedaten eingeben:</target>
@@ -1195,13 +1198,10 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>Minimize to notification area</source>
<target>In das Benachrichtigungsfeld minimieren</target>
-<source>Bytes copied:</source>
-<target>Kopierte Datenmenge:</target>
-
<source>When finished:</source>
<target>Am Ende:</target>
-<source>Auto-Close</source>
+<source>Auto-close</source>
<target>Automatisch schließen</target>
<source>Close</source>
@@ -1225,6 +1225,9 @@ Die Befehlszeile wird ausgelöst, wenn:
<source>&Show error dialog</source>
<target>&Zeige Fehlerdialog</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target>
+
<source>&Cancel</source>
<target>&Abbrechen</target>
@@ -1273,14 +1276,11 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Transfer file and folder permissions.</source>
<target>Übertrage Datei- und Ordnerberechtigungen.</target>
-<source>Automatic retry on error:</source>
-<target>Automatische Wiederholung bei Fehlern:</target>
-
-<source>Retry count:</source>
-<target>Wiederholungen:</target>
+<source>Show hidden dialogs again</source>
+<target>Versteckte Fenster wieder zeigen</target>
-<source>Delay (in seconds):</source>
-<target>Verzögerung (in Sekunden):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Alle dauerhaft versteckten Fenster und Warnmeldungen wieder anzeigen</target>
<source>Customize context menu:</source>
<target>Kontextmenü anpassen:</target>
@@ -1288,12 +1288,6 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Description</source>
<target>Beschreibung</target>
-<source>Show hidden dialogs again</source>
-<target>Versteckte Fenster wieder zeigen</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Alle dauerhaft versteckten Fenster und Warnmeldungen wieder anzeigen</target>
-
<source>&Default</source>
<target>&Standard</target>
@@ -1351,13 +1345,19 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Highlight configurations that have not been run for more than the following number of days:</source>
<target>Konfigurationen hervorheben, die seit mehr als die folgende Anzahl an Tagen nicht mehr ausgeführt wurden:</target>
+<source>Synchronization Settings</source>
+<target>Synchronisationseinstellungen</target>
+
+<source>Access Online Storage</source>
+<target>Auf Onlinespeicher zugreifen</target>
+
<source>Save as a Batch Job</source>
<target>Als Batchauftrag speichern</target>
<source>Delete Items</source>
<target>Elemente löschen</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Elemente kopieren</target>
<source>Options</source>
@@ -1714,9 +1714,6 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Configure your own synchronization rules.</source>
<target>Eigene Synchronisationsregeln definieren.</target>
-<source>Synchronization Settings</source>
-<target>Synchronisationseinstellungen</target>
-
<source>Comparison</source>
<target>Vergleich</target>
@@ -1966,7 +1963,7 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert.
<source>Desktop</source>
<target>Desktop</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Startmenü</target>
<source>Send To</source>
diff --git a/FreeFileSync/Build/Languages/greek.lng b/FreeFileSync/Build/Languages/greek.lng
index d3565f61..d611c0df 100755
--- a/FreeFileSync/Build/Languages/greek.lng
+++ b/FreeFileSync/Build/Languages/greek.lng
@@ -59,11 +59,14 @@
<target>Παρουσιάστηκε μια εξαίρεση</target>
<source>A directory path is expected after %x.</source>
-<target>Αναμένεται μια διαδρομή υποκαταλόγου μετά το %x.</target>
+<target>Μετά το %x αναμένεται μια διαδρομή υποκαταλόγου.</target>
<source>Syntax error</source>
<target>Σφάλμα σύνταξης</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Μετά το %x αναμένονται μια διαδρομή υποκαταλόγου αριστερά και μια δεξιά.</target>
+
<source>Cannot find file %x.</source>
<target>Το αρχείο %x δεν μπορεί να βρεθεί.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Εάν αγνοηθεί αυτό το σφάλμα, οι φάκελοι θα θεωρηθούν κενοί. Φάκελοι που λείπουν θα δημιουργηθούν αυτόματα, όταν χρειαστούν.</target>
+<source>Comparison finished:</source>
+<target>Η σύγκριση ολοκληρώθηκε:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>βρέθηκε 1 στοιχείο</pluralform>
+<pluralform>βρέθηκαν %x στοιχεία</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Το αρχείο %x δεν έχει έγκυρη ημερομηνία.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Χρήση μη-προεπιλεγμένων γενικών ρυθμίσεων:</target>
-<source>Starting comparison</source>
-<target>Έναρξη της σύγκρισης</target>
-
<source>A folder input field is empty.</source>
<target>Ένα πεδίο εισαγωγής φακέλων είναι άδειο.</target>
@@ -318,15 +330,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>Το %x δεν μπορεί να βρεθεί.</target>
-
<source>Type of item %x is not supported:</source>
<target>Ο τύπος του στοιχείου %x δεν υποστηρίζεται:</target>
@@ -432,6 +444,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>Ιδιοκτήτης κλειδώματος:</target>
+<source>Detecting abandoned lock...</source>
+<target>Ανίχνευση κλειδώματος που εγκαταλείφθηκε...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Actual: %y bytes
<pluralform>%x δ/λεπτα</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Ανίχνευση κλειδώματος που εγκαταλείφθηκε...</target>
-
<source>Items processed:</source>
<target>Επεξεργάστηκαν στοιχεία:</target>
@@ -456,8 +468,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Σφάλμα κατά την ανάλυση του αρχείου %x, γραμμή %y, στήλη %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Ο υποκατάλογος για το %x δεν μπορεί να κλειδωθεί.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Δεν μπορούν να κλειδωθούν οι ακόλουθοι υποκατάλογοι:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>Το όνομα τόμου %x δεν είναι μέρος της διαδρομής %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Αίτημα για διακοπή: Αναμονή για την ολοκλήρωση της τρέχουσας εργασίας...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Δεν ήταν δυνατή η δημιουργία χρονικής σήμανσης για τη διατήρηση παλιών εκδόσεων:</target>
@@ -513,6 +522,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>Επιλογή φακέλου</target>
+<source>&New</source>
+<target>&Δημιουργία</target>
+
<source>&Open...</source>
<target>Ά&νοιγμα...</target>
@@ -728,26 +740,23 @@ The command is triggered if:
<source>job name</source>
<target>όνομα ενέργειας</target>
-<source>Show summary</source>
-<target>Εμφάνιση σύνοψης</target>
+<source>System: Sleep</source>
+<target>Σύστημα: Αναστολή λειτουργίας</target>
-<source>Sleep</source>
-<target>Αναστολή λειτουργίας</target>
+<source>System: Shut down</source>
+<target>Σύστημα: Τερματισμός λειτουργίας</target>
-<source>Shut down</source>
-<target>Τερματισμός λειτουργίας</target>
-
-<source>Synchronization stopped</source>
-<target>Διακοπή του συγχρονισμού</target>
+<source>Cleaning up old log files...</source>
+<target>Καθαρισμός των παλιών αρχείων καταγραφής...</target>
<source>Stopped</source>
<target>Διακοπή</target>
-<source>Synchronization completed with errors</source>
-<target>Ο συγχρονισμός ολοκληρώθηκε με σφάλματα</target>
+<source>Completed with errors</source>
+<target>Ολοκληρώθηκε με σφάλματα</target>
-<source>Synchronization completed with warnings</source>
-<target>Ο συγχρονισμός ολοκληρώθηκε με προειδοποιήσεις</target>
+<source>Completed with warnings</source>
+<target>Ολοκληρώθηκε με προειδοποιήσεις</target>
<source>Warning</source>
<target>Προειδοποίηση</target>
@@ -755,15 +764,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>Δεν υπάρχει τίποτα προς συγχρονισμό</target>
-<source>Synchronization completed successfully</source>
-<target>Ο συγχρονισμός ολοκληρώθηκε επιτυχώς</target>
+<source>Completed successfully</source>
+<target>Ολοκληρώθηκε επιτυχώς</target>
<source>Executing command %x</source>
<target>Εκτέλεση εντολής %x</target>
-<source>Cleaning up old log files...</source>
-<target>Καθαρισμός των παλιών αρχείων καταγραφής...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Μπορείτε να επιστρέψετε στο κύριο παράθυρο του FreeFileSync για να επιλύσετε αυτό το θέμα.</target>
@@ -779,14 +785,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>Επιστροφή στο κύριο παράθυρο του FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Αυτόματη επανάληψη σε 1 δευτερόλεπτο...</pluralform>
-<pluralform>Αυτόματη επανάληψη σε %x δευτερόλεπτα...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Αυτόματη επανάληψη</target>
<source>Ignore &all</source>
<target>Παράβλεψη ό&λων</target>
@@ -797,6 +797,27 @@ The command is triggered if:
<source>Serious Error</source>
<target>Σοβαρό Σφάλμα</target>
+<source>Last session</source>
+<target>Τελευταία χρήση</target>
+
+<source>Today</source>
+<target>Σήμερα</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 μέρα</pluralform>
+<pluralform>%x μέρες</pluralform>
+</target>
+
+<source>Name</source>
+<target>Όνομα</target>
+
+<source>Last sync</source>
+<target>Τελ. συγχρ.</target>
+
<source>Folder</source>
<target>Φάκελος</target>
@@ -860,9 +881,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Παρακαλούμε επιλέξτε ένα φάκελο σε ένα τοπικό σύστημα αρχείων, σε ένα δίκτυο ή σε μια συσκευή MTP.</target>
-<source>&New</source>
-<target>&Δημιουργία</target>
-
<source>&Save</source>
<target>&Αποθήκευση</target>
@@ -974,6 +992,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>Συνολικός αριθμός bytes προς αντιγραφή</target>
+<source>Arrange folder pair</source>
+<target>Οργάνωση του ζεύγους φακέλων:</target>
+
<source>Folder pair:</source>
<target>Ζεύγος φακέλων:</target>
@@ -1066,11 +1087,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>Κανόνας ονοματοθεσίας:</target>
-<source>&Ignore errors</source>
-<target>&Παράβλεψη σφαλμάτων</target>
+<source>Ignore errors</source>
+<target>Αγνόηση σφαλμάτων</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Εμφάνιση αναδυόμενου παράθυρου σε σφάλματα ή προειδοποιήσεις</target>
+<source>Retry count:</source>
+<target>Αριθμός προσπαθειών:</target>
+
+<source>Delay (in seconds):</source>
+<target>Καθυστέρηση (σε δευτερόλεπτα):</target>
<source>Run a command after synchronization:</source>
<target>Εκτέλεση εντολής μετά το συγχρονισμό:</target>
@@ -1078,9 +1102,6 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Οργάνωση του ζεύγους φακέλων:</target>
-
<source>Enter your login details:</source>
<target>Εισάγετε τις λεπτομέρεις της σύνδεσης:</target>
@@ -1177,12 +1198,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>Ελαχιστοποίηση στην περιοχή ειδοποιήσεων</target>
-<source>Bytes copied:</source>
-<target>Bytes που αντιγράφτηκαν:</target>
-
<source>When finished:</source>
<target>Μετά την ολοκλήρωση:</target>
+<source>Auto-close</source>
+<target>Αυτόματο κλείσιμο</target>
+
<source>Close</source>
<target>Κλείσιμο</target>
@@ -1195,12 +1216,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Δημιουργία ενός αρχείου δέσμης για αυτόματο συγχρονισμό. Για να ξεκινήσετε, κάντε διπλό κλικ σε αυτό το αρχείο ή ενσωματώστε το σε ένα χρονοδιάγραμμα εργασιών: %x</target>
+<source>Progress dialog:</source>
+<target>Εμφάνιση προόδου:</target>
+
<source>Run minimized</source>
<target>Εκκίνηση σε ελαχιστοποιημένο παράθυρο</target>
<source>&Show error dialog</source>
<target>Εμ&φάνιση ειδοποιήσεων σφαλμάτων</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Εμφάνιση αναδυόμενου παράθυρου σε σφάλματα ή προειδοποιήσεις</target>
+
<source>&Cancel</source>
<target>Α&κύρωση</target>
@@ -1249,14 +1276,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Μεταφορά των δικαιωμάτων πρόσβασης αρχείων και φακέλων.</target>
-<source>Automatic retry on error:</source>
-<target>Αυτόματη επανάληψη σε περίπτωση σφάλματος:</target>
-
-<source>Retry count:</source>
-<target>Αριθμός προσπαθειών:</target>
+<source>Show hidden dialogs again</source>
+<target>Επανεμφάνιση των κρυμμένων ειδοποιήσεων</target>
-<source>Delay (in seconds):</source>
-<target>Καθυστέρηση (σε δευτερόλεπτα):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Επανεμφάνιση όλων των μόνιμα κρυμμένων ειδοποιήσεων και προειδοποιητικών μηνυμάτων</target>
<source>Customize context menu:</source>
<target>Προσαρμογή μενού περιβάλλοντος:</target>
@@ -1264,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>Περιγραφή</target>
-<source>Show hidden dialogs again</source>
-<target>Επανεμφάνιση των κρυμμένων ειδοποιήσεων</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Επανεμφάνιση όλων των μόνιμα κρυμμένων ειδοποιήσεων και προειδοποιητικών μηνυμάτων</target>
-
<source>&Default</source>
<target>&Προεπιλογή</target>
@@ -1324,13 +1342,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>Ενεργοποίηση χωρίς σύνδεση</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Επισήμανση παραμέτρων συγχρονισμού που δεν έχουν εκτελεστεί για μεγαλύτερο από τον ακόλουθο αριθμό ημερών:</target>
+
+<source>Synchronization Settings</source>
+<target>Ρυθμίσεις συγχρονισμού</target>
+
+<source>Access Online Storage</source>
+<target>Πρόσβαση στο χώρο αποθήκευσης online</target>
+
<source>Save as a Batch Job</source>
<target>Αποθήκευση ως Δέσμη Ενεργειών</target>
<source>Delete Items</source>
<target>Διαγραφή Στοιχείων</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Αντιγραφή Στοιχείων</target>
<source>Options</source>
@@ -1342,6 +1369,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>Έκδοση Δωρητή του FreeFileSync</target>
+<source>Highlight Configurations</source>
+<target>Επισήμανση Παραμέτρων</target>
+
<source>&Options</source>
<target>&Επιλογές</target>
@@ -1465,9 +1495,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Επιλέξτε το χρονικό εύρος...</target>
-<source>Last session</source>
-<target>Τελευταία χρήση</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Σύγκριση Φακέλων και Συγχρονισμός</target>
@@ -1486,8 +1513,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>Να &μην αποθηκευθούν</target>
-<source>Remove entry from list</source>
-<target>Αφαίρεση καταχώρησης από τον κατάλογο</target>
+<source>Hide configuration</source>
+<target>Απόκρυψη παραμέτρων συγχρονισμού</target>
+
+<source>Highlight...</source>
+<target>Επισήμανση...</target>
<source>Clear filter</source>
<target>Καθαρισμός φίλτρου</target>
@@ -1567,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>Σε παύση</target>
+<source>Stop requested...</source>
+<target>Αίτημα για διακοπή...</target>
+
<source>Initializing...</source>
<target>Αρχικοποίηση...</target>
@@ -1576,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>Σύγκριση του περιεχομένου...</target>
-<source>Completed</source>
-<target>Ολοκληρώθηκε</target>
-
<source>Info</source>
<target>Πληροφορίες</target>
@@ -1660,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Παράμετροι για την απέναντι πλευρά</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Να εμφανίζονται οι κρυμμένες ειδοποιήσεις και προειδοποιητικά μηνύματα;</target>
-
-<source>&Show</source>
-<target>&Εμφάνιση</target>
-
<source>Downloading update...</source>
<target>Λήψη ενημέρωσης...</target>
@@ -1690,18 +1714,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>Ορίστε τους δικούς σας κανόνες συγχρονισμού.</target>
-<source>Synchronization Settings</source>
-<target>Ρυθμίσεις συγχρονισμού</target>
-
<source>Comparison</source>
<target>Σύγκριση</target>
<source>Synchronization</source>
<target>Συγχρονισμός</target>
-<source>Today</source>
-<target>Σήμερα</target>
-
<source>This week</source>
<target>Αυτήν την εβδομάδα</target>
@@ -1771,9 +1789,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>Αρχεία</target>
-<source>Name</source>
-<target>Όνομα</target>
-
<source>Percentage</source>
<target>Ποσοστό</target>
@@ -1885,15 +1900,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x ώρες</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 μέρα</pluralform>
-<pluralform>%x μέρες</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Τα δικαιώματα %x δεν μπορούν να οριστούν.</target>
@@ -1957,8 +1963,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>Επιφάνεια εργασίας</target>
-<source>Start menu</source>
-<target>Μενού έναρξης</target>
+<source>Start Menu</source>
+<target>Μενού "Έναρξη"</target>
+
+<source>Send To</source>
+<target>Αποστολή Προς</target>
<source>Registering FreeFileSync file extensions</source>
<target>Καταχώρηση των επεκτάσεων των αρχείων του FreeFileSync</target>
@@ -1987,6 +1996,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Παρακαλούμε επιλέξτε την τοπική εγκατάσταση ή επιλέξτε έναν διαφορετικό φάκελο για εγκατάσταση.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Η λειτουργία σιωπηρής εγκατάστασης είναι διαθέσιμη μόνο στην Έκδοση Δωρητή FreeFileSync.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>Η επιλογή εγκατάστασης %x είναι διαθέσιμη μόνο στην Έκδοση Δωρητή του FreeFileSync.</target>
diff --git a/FreeFileSync/Build/Languages/hebrew.lng b/FreeFileSync/Build/Languages/hebrew.lng
index 9ae0aab3..a8157cc9 100755
--- a/FreeFileSync/Build/Languages/hebrew.lng
+++ b/FreeFileSync/Build/Languages/hebrew.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>שגיאת תחביר</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>נתיב מחיצה שמאלי וימני נדרשים לאחר %x.</target>
+
<source>Cannot find file %x.</source>
<target>לא מוצא קובץ %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>אם תתעלם משגיאה זו התיקיות יחשבו כריקות. תיקיות חסרות נוצרות באופן אוטומטי כאשר נדרש.</target>
+<source>Comparison finished:</source>
+<target>ההשוואה הסתיימה:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>פריט 1 נמצא</pluralform>
+<pluralform>%x פריטים נמצאו</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>קובץ %x מכיל תאריך שגוי.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>משתמש בהגדרות כלליות שאינן ברירת מחדל:</target>
-<source>Starting comparison</source>
-<target>מתחיל השוואה</target>
-
<source>A folder input field is empty.</source>
<target>שדה קלט תיקייה ריק.</target>
@@ -318,15 +330,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>לא מוצא %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>סוג של פריט %x אינו נתמך:</target>
@@ -432,6 +444,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>בעלים נעול:</target>
+<source>Detecting abandoned lock...</source>
+<target>מגלה נעילה נטושה...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Actual: %y bytes
<pluralform>%x שניות</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>מגלה נעילה נטושה...</target>
-
<source>Items processed:</source>
<target>אלמנטים עובדו:</target>
@@ -456,8 +468,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>שגיאה בפענוח קובץ %x, שורה %y, טור %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>לא ניתן לנעול מחיצה עבור %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>אין אפשרות להגדיר נעילות מחיצה עבור התיקיות הבאות:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>כרך בשם %x אינו חלק של נתיב קובץ %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>עצירה התבקשה: מחכה שפעולה נוכחית תסתיים...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>לא ניתן ליצור תג זמן לגרסאות:</target>
@@ -513,6 +522,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>בחר תיקייה</target>
+<source>&New</source>
+<target>&חדש</target>
+
<source>&Open...</source>
<target>&פתח...</target>
@@ -728,26 +740,23 @@ The command is triggered if:
<source>job name</source>
<target>שם משימה</target>
-<source>Show summary</source>
-<target>הצג תקציר</target>
+<source>System: Sleep</source>
+<target>מערכת: שינה</target>
-<source>Sleep</source>
-<target>שינה</target>
+<source>System: Shut down</source>
+<target>מערכת: כיבוי</target>
-<source>Shut down</source>
-<target>כבה מחשב</target>
-
-<source>Synchronization stopped</source>
-<target>סנכרון הופסק</target>
+<source>Cleaning up old log files...</source>
+<target>מנקה קבצי יומן ישנים...</target>
<source>Stopped</source>
<target>נעצר</target>
-<source>Synchronization completed with errors</source>
-<target>סנכרון הושלם עם שגיאות</target>
+<source>Completed with errors</source>
+<target>הסתיים עם שגיאות</target>
-<source>Synchronization completed with warnings</source>
-<target>סנכרון הסתיים עם אזהרות</target>
+<source>Completed with warnings</source>
+<target>הסתיים עם אזהרות</target>
<source>Warning</source>
<target>אזהרה</target>
@@ -755,15 +764,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>אין מה לסנכרן</target>
-<source>Synchronization completed successfully</source>
-<target>סנכרון הסתיים בהצלחה</target>
+<source>Completed successfully</source>
+<target>הסתיים בהצלחה</target>
<source>Executing command %x</source>
<target>מבצע פקודה %x</target>
-<source>Cleaning up old log files...</source>
-<target>מנקה קבצי יומן ישנים...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>ניתן לעבור לחלון הראשי של FreeFileSync כדי לפתור את הסוגיה הזו.</target>
@@ -779,14 +785,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>מעבר אל החלון הראשי של FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>נסיון מחדש אוטומטי בתוך שניה 1...</pluralform>
-<pluralform>נסיון מחדש אוטומטי בתוך %x שניות...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>נסיון חוזר באופן אוטומטי</target>
<source>Ignore &all</source>
<target>התעלם &מהכל</target>
@@ -797,6 +797,27 @@ The command is triggered if:
<source>Serious Error</source>
<target>שגיאה חמורה</target>
+<source>Last session</source>
+<target>פעילות אחרונה</target>
+
+<source>Today</source>
+<target>היום</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 יום</pluralform>
+<pluralform>%x ימים</pluralform>
+</target>
+
+<source>Name</source>
+<target>שם</target>
+
+<source>Last sync</source>
+<target>סינכרון אחרון</target>
+
<source>Folder</source>
<target>תיקייה</target>
@@ -860,9 +881,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>אנא בחר תיקייה במערכת הקבצים המקומית, ברשת או בהתקן MTP.</target>
-<source>&New</source>
-<target>&חדש</target>
-
<source>&Save</source>
<target>&שמור</target>
@@ -974,6 +992,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>סה"כ בתים להעתיק</target>
+<source>Arrange folder pair</source>
+<target>סדר זוג תיקיות</target>
+
<source>Folder pair:</source>
<target>זוג תיקיות:</target>
@@ -1066,11 +1087,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>מוסכמות לקביעת שמות:</target>
-<source>&Ignore errors</source>
-<target>&התעלם משגיאות</target>
+<source>Ignore errors</source>
+<target>התעלם משגיאות</target>
-<source>Show pop-up on errors or warnings</source>
-<target>הראה חלונות מוקפצים עבור שגיאות או אזהרות</target>
+<source>Retry count:</source>
+<target>מונה נסיונות חוזרים:</target>
+
+<source>Delay (in seconds):</source>
+<target>השהייה (בשניות):</target>
<source>Run a command after synchronization:</source>
<target>הרץ פקודה לאחר סינכרון:</target>
@@ -1078,9 +1102,6 @@ The command is triggered if:
<source>OK</source>
<target>אשר</target>
-<source>Arrange folder pair</source>
-<target>סדר זוג תיקיות</target>
-
<source>Enter your login details:</source>
<target>הזן את פרטי הגישה שלך:</target>
@@ -1177,12 +1198,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>הקטן לאיזור ההתרעות</target>
-<source>Bytes copied:</source>
-<target>בתים שהועתקו:</target>
-
<source>When finished:</source>
<target>לאחר הסיום:</target>
+<source>Auto-close</source>
+<target>סגירה באופן אוטומטי</target>
+
<source>Close</source>
<target>סגור</target>
@@ -1195,12 +1216,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>צור קובץ אצווה לסינכרון ללא התערבות מפעיל. כדי להפעיל, הקלק הקלקה כפולה על הקובץ או תזמן במתכנן המשימות: %x</target>
+<source>Progress dialog:</source>
+<target>דושיח התקדמות:</target>
+
<source>Run minimized</source>
<target>הרץ ממוזער</target>
<source>&Show error dialog</source>
<target>&הצג דו-שיח שגיאה</target>
+<source>Show pop-up on errors or warnings</source>
+<target>הראה חלונות מוקפצים עבור שגיאות או אזהרות</target>
+
<source>&Cancel</source>
<target>&ביטול</target>
@@ -1249,14 +1276,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>הרשאות העברת קובץ ותיקייה.</target>
-<source>Automatic retry on error:</source>
-<target>נסיון חוזר אוטומטי במקרה שגיאה:</target>
-
-<source>Retry count:</source>
-<target>מונה נסיונות חוזרים:</target>
+<source>Show hidden dialogs again</source>
+<target>הראה שוב דיאלוגים נסתרים</target>
-<source>Delay (in seconds):</source>
-<target>השהייה (בשניות):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>הראה שוב את כל הדיאלוגים והודאות האזהרה המוסתרים באופן קבוע</target>
<source>Customize context menu:</source>
<target>התאמה אישית של תפריט הקשר:</target>
@@ -1264,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>תאור</target>
-<source>Show hidden dialogs again</source>
-<target>הראה שוב דיאלוגים נסתרים</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>הראה שוב את כל הדיאלוגים והודאות האזהרה המוסתרים באופן קבוע</target>
-
<source>&Default</source>
<target>&ברירת מחדל</target>
@@ -1324,13 +1342,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>הפעלה בלתי מקוונת</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>הדגש תצורות שלא הופעלו למשך יותר ממספר הימים הבא:</target>
+
+<source>Synchronization Settings</source>
+<target>הגדרות סנכרון</target>
+
+<source>Access Online Storage</source>
+<target>גישה לאחסון מקוון</target>
+
<source>Save as a Batch Job</source>
<target>שמור כמשימת אצווה</target>
<source>Delete Items</source>
<target>מחק פריטים</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>העתק פריטים</target>
<source>Options</source>
@@ -1342,6 +1369,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>מהדורת תרומות של FreeFileSync</target>
+<source>Highlight Configurations</source>
+<target>הדגש תצורות</target>
+
<source>&Options</source>
<target>&אפשרויות</target>
@@ -1465,9 +1495,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>בחר תחום זמן...</target>
-<source>Last session</source>
-<target>פעילות אחרונה</target>
-
<source>Folder Comparison and Synchronization</source>
<target>סנכרון קבצים ותיקיות</target>
@@ -1486,8 +1513,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>אל &תשמור</target>
-<source>Remove entry from list</source>
-<target>הסר פריט מרשימה</target>
+<source>Hide configuration</source>
+<target>הסתר תצורה</target>
+
+<source>Highlight...</source>
+<target>הדגש...</target>
<source>Clear filter</source>
<target>נקה מסנן</target>
@@ -1567,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>עצור</target>
+<source>Stop requested...</source>
+<target>עצור בקשה...</target>
+
<source>Initializing...</source>
<target>מאתחל ...</target>
@@ -1576,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>משווה תכולה...</target>
-<source>Completed</source>
-<target>הושלם</target>
-
<source>Info</source>
<target>מידע</target>
@@ -1660,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>פרמטרים עבור צד נגדי</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>להראות שוב את הדיאלוגים והודעות האזהרה המוסתרים?</target>
-
-<source>&Show</source>
-<target>&הראה</target>
-
<source>Downloading update...</source>
<target>מוריד עדכון...</target>
@@ -1690,18 +1714,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>סדר את כללי הסנכרון שלך.</target>
-<source>Synchronization Settings</source>
-<target>הגדרות סנכרון</target>
-
<source>Comparison</source>
<target>השוואה</target>
<source>Synchronization</source>
<target>סינכרון</target>
-<source>Today</source>
-<target>היום</target>
-
<source>This week</source>
<target>בשבוע הנוכחי</target>
@@ -1771,9 +1789,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>קבצים</target>
-<source>Name</source>
-<target>שם</target>
-
<source>Percentage</source>
<target>אחוז</target>
@@ -1885,15 +1900,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x שעות</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 יום</pluralform>
-<pluralform>%x ימים</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>לא יכול להגדיר זבות %x.</target>
@@ -1957,9 +1963,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>שולחן עבודה</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>תפריט התחל</target>
+<source>Send To</source>
+<target>שלח אל</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>רושם את סיומות הקבצים של FreeFileSync.</target>
@@ -1987,6 +1996,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>בבקשה בחר התקנה מקומית או בחר תיקייה אחרת להתקנה.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>התקנה שקטה אפשרית רק במהדורת התרומות של FreeFileSync.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>אפשרת התקנה %x זמינה רק במהדורת תרומות של FreeFileSync.</target>
diff --git a/FreeFileSync/Build/Languages/hindi.lng b/FreeFileSync/Build/Languages/hindi.lng
index f15e5522..be7a4d4a 100755
--- a/FreeFileSync/Build/Languages/hindi.lng
+++ b/FreeFileSync/Build/Languages/hindi.lng
@@ -26,7 +26,7 @@
<target>फ़ाइल %x बनाई जा रही है</target>
<source>Creating folder %x</source>
-<target>फ़ोल्डर %x बनाया हा रहा है</target>
+<target>निर्देशिका %x बनायी जा रही है</target>
<source>Creating symbolic link %x</source>
<target>प्रतीकात्मक कड़ी %x बनाया जा रहा है</target>
@@ -35,7 +35,7 @@
<target>%x फ़ाइल को रीसायकल बिन में ले जाया जा रहा है</target>
<source>Moving folder %x to the recycle bin</source>
-<target>%x फ़ोल्डर को रीसायकल बिन में ले जाया जा रहा है</target>
+<target>%x निर्देशिका को रीसायकल बिन में ले जाया जा रहा है</target>
<source>Moving symbolic link %x to the recycle bin</source>
<target>%x प्रतीकात्मक कड़ी को रीसायकल बिन में ले जाया जा रहा है</target>
@@ -44,13 +44,13 @@
<target>%x फ़ाइल हटाया जा रहा है</target>
<source>Deleting folder %x</source>
-<target>%x फ़ोल्डर हटाया जा रहा है</target>
+<target>%x निर्देशिका हटाया जा रहा है</target>
<source>Deleting symbolic link %x</source>
<target>%x प्रतीकात्मक कड़ी हटाया जा रहा है</target>
<source>Checking recycle bin availability for folder %x...</source>
-<target>%x फ़ोल्डर के लिए रीसायकल बिन की उपलब्धता की जाँच हो रही है...</target>
+<target>%x निर्देशिका के लिए रीसायकल बिन की उपलब्धता की जाँच हो रही है...</target>
<source>The recycle bin is not supported by the following folders. Deleted or overwritten files will not be able to be restored:</source>
<target>रीसायकल बिन निम्न फ़ोलडर्स द्वारा समर्थित नहीं है। हटायी गई या अधिलेखित फ़ाइल्स पुनर्स्थापित नहीं होगी:</target>
@@ -59,11 +59,14 @@
<target>कोई अपवाद हुआ</target>
<source>A directory path is expected after %x.</source>
-<target>%x के बाद कोई फ़ोल्डर पथ अपेक्षित है।</target>
+<target>%x के बाद कोई निर्देशिका पथ अपेक्षित है।</target>
<source>Syntax error</source>
<target>वाक्य-विन्यास त्रुटि</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x के बाद कोई दाया और कोई बाया निर्देशिका पथ अपेक्षित है।</target>
+
<source>Cannot find file %x.</source>
<target>फ़ाइल %x नहीं मिली।</target>
@@ -113,7 +116,19 @@
<target>निम्न फ़ोलडर्स नहीं मिले:</target>
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>इस त्रुटि को अनदेखा कर दिया जाता है तो फ़ोल्डरों को खाली माना जाएगा। अनुपस्थित फ़ोलडर्स आवश्यकता होने पर स्वचालित रूप से बनाए जाते हैं।</target>
+<target>इस त्रुटि को अनदेखा कर दिया जाता है तो निर्देशिकाओं को खाली माना जाएगा। अनुपस्थित फ़ोलडर्स आवश्यकता होने पर स्वचालित रूप से बनाए जाते हैं।</target>
+
+<source>Comparison finished:</source>
+<target>तुलना पूर्ण हुई:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 आइटम मिला</pluralform>
+<pluralform>%x आइटम्स मिले</pluralform>
+</target>
<source>File %x has an invalid date.</source>
<target>%x फ़ाइल का दिनांक अवैध है।</target>
@@ -161,7 +176,7 @@
<target>फ़ाइल समय टॉलरेंस (छूट)</target>
<source>Folder access timeout</source>
-<target>फ़ोल्डर पहुँच काल समापन</target>
+<target>निर्देशिका पहुँच काल समापन</target>
<source>Run with background priority</source>
<target>पृष्ठभूमि प्राथमिकता के साथ चलाएँ</target>
@@ -175,23 +190,20 @@
<source>Using non-default global settings:</source>
<target>गैर-डिफ़ॉल्ट वैश्विक सेटिंग्स प्रयोग करें:</target>
-<source>Starting comparison</source>
-<target>तुलना शुरू हो रही है</target>
-
<source>A folder input field is empty.</source>
-<target>कोई फ़ोल्डर इनपुट प्रविष्टि खाली है।</target>
+<target>कोई निर्देशिका इनपुट प्रविष्टि खाली है।</target>
<source>The corresponding folder will be considered as empty.</source>
-<target>तद्नुरूप फ़ोल्डर को खाली माना जाएगा।</target>
+<target>तद्नुरूप निर्देशिका को खाली माना जाएगा।</target>
<source>Exclude:</source>
<target>वर्जित करें:</target>
<source>One base folder of a folder pair is contained in the other one.</source>
-<target>फ़ोल्डर जोड़ी में से एक आधार फ़ोल्डर दूसरे में निहित है।</target>
+<target>निर्देशिका जोड़ी में से एक आधार निर्देशिका दूसरे में निहित है।</target>
<source>The folder should be excluded from synchronization via filter.</source>
-<target>फ़ोल्डर को सिंक्रनाइज़ेशन से फ़िल्टर द्वारा अपवर्जित किया जाना चाहिए।</target>
+<target>निर्देशिका को सिंक्रनाइज़ेशन से फ़िल्टर द्वारा अपवर्जित किया जाना चाहिए।</target>
<source>Calculating sync directions...</source>
<target>सिंक्रनाइज़ेशन दिशा का परिकलन हो रहा है...</target>
@@ -271,7 +283,7 @@ Actual: %y bytes
<target>%x की अनुमतियां लिख नहीं सकते।</target>
<source>Operation not supported for different base folder types.</source>
-<target>भिन्न आधार फ़ोल्डर प्रकारों के लिए कार्यवाई समर्थित नहीं।</target>
+<target>भिन्न आधार निर्देशिका प्रकारों के लिए कार्यवाई समर्थित नहीं।</target>
<source>Cannot write file %x.</source>
<target>फ़ाइल %x लिखने में असमर्थ।</target>
@@ -318,15 +330,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>%x नहीं मिला।</target>
-
<source>Type of item %x is not supported:</source>
<target>%x प्रकार का आइटम समर्थित नहीं है:</target>
@@ -418,20 +430,23 @@ Actual: %y bytes
<target>फ़ाइल %x सहेजी जा रही है...</target>
<source>Searching for folder %x...</source>
-<target>फ़ोल्डर %x की खोज हो रही है...</target>
+<target>निर्देशिका %x की खोज हो रही है...</target>
<source>Timeout while searching for folder %x.</source>
-<target>फ़ोल्डर %x की खोज करते हुए काल समाप्त हआ।</target>
+<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>
+<source>Detecting abandoned lock...</source>
+<target>अपसर्जित अवरोध पता लगाया जा रहा है...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Actual: %y bytes
<pluralform>%x सेकंड्स</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>अपसर्जित अवरोध पता लगाया जा रहा है...</target>
-
<source>Items processed:</source>
<target>संसाधित आइटम्स:</target>
@@ -456,8 +468,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>फ़ाइल %x, पंक्ति %y, स्तंभ %z पदच्छेदन में त्रुटि।</target>
-<source>Cannot set directory lock for %x.</source>
-<target>%x के लिए निर्देशिका अवरोध सेट नहीं कर सकते।</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>निम्न निर्देशिकाओं के लिए निर्देशिका अवरोध सेट नहीं कर सकते:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>%x वॉल्यूम नाम %y फ़ाइल पथ का हिस्सा नहीं है।</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>रोकने का अनुरोध हुआ: वर्तमान कार्यवाई पूर्ण होने की प्रतीक्षा में...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>संस्करण के लिए समय मोहर बनाने में असमर्थ:</target>
@@ -508,10 +517,13 @@ Actual: %y bytes
<target>ड्रॅग एण्ड ड्रॉप</target>
<source>Cannot find folder %x.</source>
-<target>फ़ोल्डर %x नहीं मिला।</target>
+<target>निर्देशिका %x नहीं मिला।</target>
<source>Select a folder</source>
-<target>फ़ोल्डर चुनें</target>
+<target>निर्देशिका चुनें</target>
+
+<source>&New</source>
+<target>नया (&N)</target>
<source>&Open...</source>
<target>खोलें (&O)...</target>
@@ -553,10 +565,10 @@ Actual: %y bytes
<target>इन फ़ोलडर्स की निगरानी होगी:</target>
<source>Add folder</source>
-<target>फ़ोल्डर जोडें</target>
+<target>निर्देशिका जोडें</target>
<source>Remove folder</source>
-<target>फ़ोल्डर निकालें</target>
+<target>निर्देशिका निकालें</target>
<source>Browse</source>
<target>ब्राउज़</target>
@@ -645,7 +657,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>
@@ -678,22 +690,22 @@ The command is triggered if:
<target>%x के लिए वॉल्यूम शॅडो प्रतिलिपि बनाई जा रही है...</target>
<source>Target folder %x already existing.</source>
-<target>गंतव्य फ़ोल्डर %x पहले से ही विद्यमान।</target>
+<target>गंतव्य निर्देशिका %x पहले से ही विद्यमान।</target>
<source>Target folder input field must not be empty.</source>
-<target>गंतव्य फ़ोल्डर प्रविष्टि खाली नहीं हो सकती।</target>
+<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. Please check that the correct folders are selected for synchronization.</source>
-<target>निम्न फ़ोल्डर्स उल्लेखनीय रूप से भिन्न हैं। कृपया सुनिश्चित करें की सिंक्रनाइज़ेशन के लिए चुने फ़ोल्डर्स उचित हैं।</target>
+<target>निम्न निर्देशिकाएँ उल्लेखनीय रूप से भिन्न हैं। कृपया सुनिश्चित करें की सिंक्रनाइज़ेशन के लिए चुनी निर्देशिकाएँ उचित हैं।</target>
<source>Not enough free disk space available in:</source>
<target>यहाँ पर्याप्त खाली डिस्क जगह उपलब्ध नहीं:</target>
@@ -702,22 +714,22 @@ The command is triggered if:
<target>उपलब्ध:</target>
<source>Some files will be synchronized as part of multiple base folders.</source>
-<target>कुछ फ़ाइल्स को एकाधिक आधार फ़ोल्डर्स के भाग के रूप में सिंक्रनाइज़ किया जाएगा।</target>
+<target>कुछ फ़ाइल्स को एकाधिक आधार निर्देशिकाओं के भाग के रूप में सिंक्रनाइज़ किया जाएगा।</target>
<source>To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.</source>
-<target>विरोधों से बचने के लिए अपवर्जित फ़िल्टर्स सेट करें ताकि प्रत्येक अद्यतित फ़ाइल केवल एक ही आधार फ़ोल्डर से मानी जाएगी।</target>
+<target>विरोधों से बचने के लिए अपवर्जित फ़िल्टर्स सेट करें ताकि प्रत्येक अद्यतित फ़ाइल केवल एक ही आधार निर्देशिका से मानी जाएगी।</target>
<source>Versioning folder:</source>
-<target>संस्करण फ़ोल्डर:</target>
+<target>संस्करण निर्देशिका:</target>
<source>Base folder:</source>
-<target>आधार फ़ोल्डर:</target>
+<target>आधार निर्देशिका:</target>
<source>The versioning folder is contained in a base folder.</source>
-<target>संस्करण फ़ोल्डर आधार फ़ोल्डर में निहित है।</target>
+<target>संस्करण निर्देशिका आधार निर्देशिका में निहित है।</target>
<source>Synchronizing folder pair:</source>
-<target>यह फ़ोल्डर जोडा सिंक्रनाइज़ हो रहा है:</target>
+<target>यह निर्देशिका जोडा सिंक्रनाइज़ हो रहा है:</target>
<source>Generating database...</source>
<target>डेटाबेस बनाया जा रहा है...</target>
@@ -728,26 +740,23 @@ The command is triggered if:
<source>job name</source>
<target>कार्य नाम</target>
-<source>Show summary</source>
-<target>सारांश दिखाएं</target>
+<source>System: Sleep</source>
+<target>सिस्टम: स्लीप</target>
-<source>Sleep</source>
-<target>स्लीप</target>
+<source>System: Shut down</source>
+<target>सिस्टम: बंद करें</target>
-<source>Shut down</source>
-<target>बंद करें</target>
-
-<source>Synchronization stopped</source>
-<target>सिंक्रनाइज़ेशन बंद कर दिया गया</target>
+<source>Cleaning up old log files...</source>
+<target>पुराने लॉग फ़ाइल्स की सफाई हो रही है...</target>
<source>Stopped</source>
<target>रुका</target>
-<source>Synchronization completed with errors</source>
-<target>सिंक्रनाइज़ेशन त्रुटियों सहित पूरा हुआ</target>
+<source>Completed with errors</source>
+<target>त्रुटियों सहित पूर्ण हुआ</target>
-<source>Synchronization completed with warnings</source>
-<target>सिंक्रनाइज़ेशन चेतावनियों सहित पूरा हुआ</target>
+<source>Completed with warnings</source>
+<target>चेतावनियों सहित पूर्ण हुआ</target>
<source>Warning</source>
<target>चेतावनी</target>
@@ -755,15 +764,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>सिंक्रनाइज़ करने के लिए कुछ नहीं</target>
-<source>Synchronization completed successfully</source>
-<target>सिंक्रनाइज़ेशन सफलतापूर्वक पूरा हुआ</target>
+<source>Completed successfully</source>
+<target>सफलतापूर्वक पूर्ण हुआ</target>
<source>Executing command %x</source>
<target>कार्यान्वित आदेश %x</target>
-<source>Cleaning up old log files...</source>
-<target>पुराने लॉग फ़ाइल्स की सफाई हो रही है...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>इस समस्या को हल करने के लिए आप FreeFileSync के मुख्य विंडो में जा सकते हैं।</target>
@@ -779,14 +785,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>FreeFileSync के मुख्य विंडो में जाएं</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>स्वचालित पुनःप्रयास 1 सेकंड में...</pluralform>
-<pluralform>स्वचालित पुनःप्रयास %x सेकंड में...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>स्वचालित पुनःप्रयास</target>
<source>Ignore &all</source>
<target>सभी अनदेखा करें (&a)</target>
@@ -797,8 +797,29 @@ The command is triggered if:
<source>Serious Error</source>
<target>गंभीर त्रुटि</target>
+<source>Last session</source>
+<target>पिछला सत्र</target>
+
+<source>Today</source>
+<target>आज</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 दिन</pluralform>
+<pluralform>%x दिन</pluralform>
+</target>
+
+<source>Name</source>
+<target>नाम</target>
+
+<source>Last sync</source>
+<target>पिछला सिंक</target>
+
<source>Folder</source>
-<target>फ़ोल्डर</target>
+<target>निर्देशिका</target>
<source>Symlink</source>
<target>सिमलिंक</target>
@@ -860,9 +881,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>स्थानीय फ़ाइल सिस्टम, नेटवर्क या MTP डिव्हाइस पर कोई निर्देशिका चुनें।</target>
-<source>&New</source>
-<target>नया (&N)</target>
-
<source>&Save</source>
<target>सहेजें (&S)</target>
@@ -921,10 +939,10 @@ 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>Access online storage</source>
<target>ऑनलाइन संग्रहण पहुँच प्राप्त करें</target>
@@ -974,8 +992,11 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>कॉपी करने के लिए कुल बाइट्स</target>
+<source>Arrange folder pair</source>
+<target>निर्देशिका जोडा व्यवस्थित करें</target>
+
<source>Folder pair:</source>
-<target>फ़ोल्डर जोडा:</target>
+<target>निर्देशिका जोडा:</target>
<source>Main settings:</source>
<target>मुख्य सेटिंग्स:</target>
@@ -1032,7 +1053,7 @@ 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>हटाएं (&l)</target>
@@ -1066,11 +1087,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>नामकरण नीति:</target>
-<source>&Ignore errors</source>
-<target>त्रुटियों को अनदेखा करें (&I)</target>
+<source>Ignore errors</source>
+<target>त्रुटियों को अनदेखा करें</target>
-<source>Show pop-up on errors or warnings</source>
-<target>त्रुटियों या चेतावनियों पर पॉप-अप दिखाएं</target>
+<source>Retry count:</source>
+<target>पुनः प्रयास गणनांक:</target>
+
+<source>Delay (in seconds):</source>
+<target>विलंब (सेकंड में):</target>
<source>Run a command after synchronization:</source>
<target>सिंक्रनाइज़ेशन के बाद कोई आदेश चलाएँ:</target>
@@ -1078,9 +1102,6 @@ The command is triggered if:
<source>OK</source>
<target>ठीक</target>
-<source>Arrange folder pair</source>
-<target>फ़ोल्डर जोडा व्यवस्थित करें</target>
-
<source>Enter your login details:</source>
<target>अपना लॉगिन विवरण प्रविष्ट करें:</target>
@@ -1145,7 +1166,7 @@ The command is triggered if:
<target>सर्वर पर कोई निर्देशिका चुनें:</target>
<source>Select Folder</source>
-<target>फ़ोल्डर चुनें</target>
+<target>निर्देशिका चुनें</target>
<source>Start synchronization now?</source>
<target>अब सिंक्रनाइज़ेशन शुरू करें?</target>
@@ -1177,12 +1198,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>सूचना क्षेत्र में मिनिमाइज़ करें</target>
-<source>Bytes copied:</source>
-<target>बाइट प्रतिलिपित:</target>
-
<source>When finished:</source>
<target>समाप्त होने पर:</target>
+<source>Auto-close</source>
+<target>स्वचालित-बंद</target>
+
<source>Close</source>
<target>बंद करें</target>
@@ -1195,12 +1216,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>उपस्थिति निरपेक्ष सिंक्रनाइज़ेशन के लिए बॅच फ़ाइल बनाएं। शुरू करने के लिए, किसी कार्य योजनाकार में यह फ़ाइल या अनुसूची डबल क्लिक करें: %x</target>
+<source>Progress dialog:</source>
+<target>प्रगति संवाद बॉक्स:</target>
+
<source>Run minimized</source>
<target>छोटा (मिनिमाइज़) कर के चलाएँ</target>
<source>&Show error dialog</source>
<target>त्रुटी संवाद बॉक्स दिखाएँ (&S)</target>
+<source>Show pop-up on errors or warnings</source>
+<target>त्रुटियों या चेतावनियों पर पॉप-अप दिखाएं</target>
+
<source>&Cancel</source>
<target>रद्द करें (&C)</target>
@@ -1247,16 +1274,13 @@ This guarantees a consistent state even in case of a serious error.
<target>व्यवस्थापक विशेषाधिकार आवश्यक</target>
<source>Transfer file and folder permissions.</source>
-<target>फ़ाइल और फ़ोल्डर अनुमतियाँ स्थानांतर करें।</target>
-
-<source>Automatic retry on error:</source>
-<target>त्रुटि पर स्वचालित पुनः प्रयास करें:</target>
+<target>फ़ाइल और निर्देशिका अनुमतियाँ स्थानांतर करें।</target>
-<source>Retry count:</source>
-<target>पुनः प्रयास गणनांक:</target>
+<source>Show hidden dialogs again</source>
+<target>छिपाये संवाद बक्से फिर से देखाएं</target>
-<source>Delay (in seconds):</source>
-<target>विलंब (सेकंड में):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>स्थायी रूप से छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएं</target>
<source>Customize context menu:</source>
<target>प्रासंगिक मेनू अनुकूलित करें:</target>
@@ -1264,12 +1288,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>विवरण</target>
-<source>Show hidden dialogs again</source>
-<target>छिपाये संवाद बक्से फिर से देखाएं</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>स्थायी रूप से छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएं</target>
-
<source>&Default</source>
<target>डिफ़ॉल्ट (&D)</target>
@@ -1324,13 +1342,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>ऑफ़लाइन सक्रिय करें</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>निम्न दिनों से अधिक समय तक ना चलाए गए कॉन्फ़िगरेशन्स को हाइलाइट करें:</target>
+
+<source>Synchronization Settings</source>
+<target>सिंक्रनाइज़ेशन सेटिंग्स</target>
+
+<source>Access Online Storage</source>
+<target>ऑनलाइन संग्रहण पहुँच प्राप्त करें</target>
+
<source>Save as a Batch Job</source>
<target>बॅच जॉब के रूप में सहेजें</target>
<source>Delete Items</source>
<target>आइटम हटाएं</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>आइटम्स प्रतिलिपित करें</target>
<source>Options</source>
@@ -1342,6 +1369,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync दान संस्‍करण</target>
+<source>Highlight Configurations</source>
+<target>कॉन्फ़िगरेशन्स हाइलाइट करें</target>
+
<source>&Options</source>
<target>विकल्प (&O)</target>
@@ -1349,7 +1379,7 @@ This guarantees a consistent state even in case of a serious error.
<target>मुख्य पट्टी</target>
<source>Folder Pairs</source>
-<target>फ़ोल्डर जोडें</target>
+<target>निर्देशिका जोडें</target>
<source>Find</source>
<target>ढूंढें</target>
@@ -1465,11 +1495,8 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>समय अवधि चुनें...</target>
-<source>Last session</source>
-<target>पिछला सत्र</target>
-
<source>Folder Comparison and Synchronization</source>
-<target>फ़ोल्डर तुलना और सिंक्रनाइज़ेशन</target>
+<target>निर्देशिका तुलना और सिंक्रनाइज़ेशन</target>
<source>Configuration saved</source>
<target>सहेजा कॉन्फ़िगरेशन</target>
@@ -1486,8 +1513,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>नहीं सहेजें (&n)</target>
-<source>Remove entry from list</source>
-<target>सूचि से प्रविष्टि निकालें</target>
+<source>Hide configuration</source>
+<target>कॉन्फ़िगरेशन छुपाएँ</target>
+
+<source>Highlight...</source>
+<target>हाइलाइट...</target>
<source>Clear filter</source>
<target>फ़िल्टर हटाएं</target>
@@ -1567,6 +1597,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>ठहरा</target>
+<source>Stop requested...</source>
+<target>अनुरोधित को रोकें...</target>
+
<source>Initializing...</source>
<target>प्रारंभ हो रहा है...</target>
@@ -1576,9 +1609,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>सामग्री की तुलना हो रही है...</target>
-<source>Completed</source>
-<target>पूर्ण हुआ</target>
-
<source>Info</source>
<target>जानकारी</target>
@@ -1649,7 +1679,7 @@ This guarantees a consistent state even in case of a serious error.
<target>बाह्य अनुप्रयोगों को प्रसंग मेनू में एकीकृत करें। निम्न मैक्रोज़ उपलब्ध हैं:</target>
<source>Full file or folder path</source>
-<target>पूर्ण फाइल या फ़ोल्डर पथ</target>
+<target>पूर्ण फाइल या निर्देशिका पथ</target>
<source>Parent folder path</source>
<target>पैरेंट फ़ोल्‍डर पथ</target>
@@ -1660,12 +1690,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>दूसरी तरफ़ के पैरामीटर्स</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>छिपाये संवाद बॉक्सेस और चेतावनी संदेश फिर से दिखाएं?</target>
-
-<source>&Show</source>
-<target>दिखाएं (&S)</target>
-
<source>Downloading update...</source>
<target>अद्यतन डाउनलोड हो रहा है...</target>
@@ -1682,26 +1706,20 @@ This guarantees a consistent state even in case of a serious error.
<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>
-<source>Synchronization Settings</source>
-<target>सिंक्रनाइज़ेशन सेटिंग्स</target>
-
<source>Comparison</source>
<target>तुलना</target>
<source>Synchronization</source>
<target>सिंक्रनाइज़ेशन</target>
-<source>Today</source>
-<target>आज</target>
-
<source>This week</source>
<target>इस सप्ताह</target>
@@ -1730,7 +1748,7 @@ This guarantees a consistent state even in case of a serious error.
<target>फ़ाइल्स को स्थाई रूप से हटाया और आधिलेखित करें</target>
<source>Move files to a user-defined folder</source>
-<target>फ़ाइल्स उपयोगकर्ता-परिभाषित फ़ोल्डर में ले जाएं</target>
+<target>फ़ाइल्स उपयोगकर्ता-परिभाषित निर्देशिका में ले जाएं</target>
<source>Replace</source>
<target>बदलें</target>
@@ -1771,9 +1789,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>फ़ाइल्स</target>
-<source>Name</source>
-<target>नाम</target>
-
<source>Percentage</source>
<target>प्रतिशत</target>
@@ -1885,15 +1900,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x घंटे</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 दिन</pluralform>
-<pluralform>%x दिन</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>विशेषाधिकार %x सेट नहीं कर सकते।</target>
@@ -1907,7 +1913,7 @@ This guarantees a consistent state even in case of a serious error.
<target>सिस्टम को बंद करने में असमर्थ।</target>
<source>Checking recycle bin failed for folder %x.</source>
-<target>फ़ोल्डर %x के लिए रीसायकल बिन की जाँच विफल।</target>
+<target>निर्देशिका %x के लिए रीसायकल बिन की जाँच विफल।</target>
<source>The following XML elements could not be read:</source>
<target>निम्न XML तत्वों को पढा नहीं जा सका:</target>
@@ -1957,9 +1963,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>डेस्कटॉप</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>प्रारंभ मेनू</target>
+<source>Send To</source>
+<target>इन्हें भेजें</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>FreeFileSync फ़ाइल एक्सटेंशंस पंजिकृत हो रहे हैं</target>
@@ -1982,11 +1991,11 @@ This guarantees a consistent state even in case of a serious error.
<target>FreeFileSync के साथ संपादित करें</target>
<source>The FreeFileSync portable version cannot install into a subfolder of %x.</source>
-<target>FreeFileSync पोर्टेबल संस्करण %x के उप-फ़ोल्डर में स्थापित नहीं किया जा सकता।</target>
+<target>FreeFileSync पोर्टेबल संस्करण %x के उप-निर्देशिका में स्थापित नहीं किया जा सकता।</target>
<source>Please choose the local installation type or select a different folder for installation.</source>
-<target>स्थापना के लिए कृपया स्थानीय स्थापना प्रकार चयन करें या कोई और फ़ोल्डर चुनें।</target>
+<target>स्थापना के लिए कृपया स्थानीय स्थापना प्रकार चयन करें या कोई और निर्देशिका चुनें।</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>अपरिचालित स्थापना केवल FreeFileSync दान संस्‍करण में ही उपलब्ध है।</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>%x स्थापना विकल्प केवल FreeFileSync दान संस्‍करण में ही उपलब्ध है।</target>
diff --git a/FreeFileSync/Build/Languages/hungarian.lng b/FreeFileSync/Build/Languages/hungarian.lng
index 2f28d3e3..307ff95e 100755
--- a/FreeFileSync/Build/Languages/hungarian.lng
+++ b/FreeFileSync/Build/Languages/hungarian.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Szintaktikai hiba</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Egy bal és egy jobb oldali könyvtár-útvonalra van szükség %x után.</target>
+
<source>Cannot find file %x.</source>
<target>Nem található a %x állomány.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Ha ezt a hibát figyelmen kívül hagyja, a könytárakat üresnek tekinti a program. A hiányzó könyvtárakat automatikusan létrehozza, amikor szükséges.</target>
+<source>Comparison finished:</source>
+<target>Az összehasonlítás befejeződött:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 tételt találtam</pluralform>
+<pluralform>%x tételt találtam</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>%x állomány dátuma érvénytelen.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Nem az alapértelmezett általános beállítások használata:</target>
-<source>Starting comparison</source>
-<target>Összehasonlítás megkezdése</target>
-
<source>A folder input field is empty.</source>
<target>A könyvtár beviteli mező üres.</target>
@@ -318,15 +330,15 @@ Tényleges: %y bájt
<source>Unable to move %x to the recycle bin.</source>
<target>%x nem helyezhető Lomtárba.</target>
+<source>Cannot find %x.</source>
+<target>%x nem található.</target>
+
<source>Cannot open file %x.</source>
<target>%x állomány nem nyitható meg.</target>
<source>Cannot find device %x.</source>
<target>%x eszköz nem található.</target>
-<source>Cannot find %x.</source>
-<target>%x nem található.</target>
-
<source>Type of item %x is not supported:</source>
<target>%x elem típusa nem támogatott:</target>
@@ -432,6 +444,9 @@ Tényleges: %y bájt
<source>Lock owner:</source>
<target>Zárolás gazdája:</target>
+<source>Detecting abandoned lock...</source>
+<target>Elhagyott zárolást érzékel...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Tényleges: %y bájt
<pluralform>%x mp</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Elhagyott zárolást érzékel...</target>
-
<source>Items processed:</source>
<target>Feldolgozott elemek száma:</target>
@@ -456,8 +468,8 @@ Tényleges: %y bájt
<source>Error parsing file %x, row %y, column %z.</source>
<target>Hiba történt a feldolgozás közben: %x állomány, %y sor, %z oszlop.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>%x könyvtár zárolása sikertelen.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nem lehet beállítani a könyvtárak lockolását a következő könyvtárakhoz:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Tényleges: %y bájt
<source>Volume name %x is not part of file path %y.</source>
<target>%x kötet-név nem része a(z) %y állomány elérési útvonalának.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Leállást igényeltek: várakozás a jelenlegi művelet befejezésére...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Nem képes időbélyegzés létrehozására a verzióképzéshez:</target>
@@ -513,6 +522,9 @@ Tényleges: %y bájt
<source>Select a folder</source>
<target>Könyvtárat kiválaszt</target>
+<source>&New</source>
+<target>&Új</target>
+
<source>&Open...</source>
<target>&Megnyitás...</target>
@@ -728,26 +740,23 @@ A parancs végrehajtódik, ha:
<source>job name</source>
<target>feladat neve</target>
-<source>Show summary</source>
-<target>Mutasd az összegzést</target>
+<source>System: Sleep</source>
+<target>Rendszer: alvási állapotban</target>
-<source>Sleep</source>
-<target>Alvó állapot</target>
+<source>System: Shut down</source>
+<target>Rendszer: Leállítva</target>
-<source>Shut down</source>
-<target>Leállítja a gépet</target>
-
-<source>Synchronization stopped</source>
-<target>Szinkronizálás leállítva</target>
+<source>Cleaning up old log files...</source>
+<target>Régi log állományok törlése...</target>
<source>Stopped</source>
<target>Leállítva</target>
-<source>Synchronization completed with errors</source>
-<target>A szinkronizálás hibákkal fejeződött be</target>
+<source>Completed with errors</source>
+<target>Hibák mellett végrehajtva</target>
-<source>Synchronization completed with warnings</source>
-<target>A szinkronizálás figyelmeztetések mellett fejeződött be.</target>
+<source>Completed with warnings</source>
+<target>Figyelmeztetések mellett végrehajtva</target>
<source>Warning</source>
<target>Figyelmeztetés</target>
@@ -755,15 +764,12 @@ A parancs végrehajtódik, ha:
<source>Nothing to synchronize</source>
<target>Nincs mit szinkronizálni</target>
-<source>Synchronization completed successfully</source>
-<target>A szinkronizálás sikeresen befejeződött</target>
+<source>Completed successfully</source>
+<target>Sikeresen végrehajtva</target>
<source>Executing command %x</source>
<target>%x parancs végrehajtása</target>
-<source>Cleaning up old log files...</source>
-<target>Régi log állományok 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>
@@ -779,14 +785,8 @@ A parancs végrehajtódik, ha:
<source>Switching to FreeFileSync's main window</source>
<target>Átkapcsolás a FreeFileSync fő ablakába</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Ismételt próbálkozás 1 másodperc múlva...</pluralform>
-<pluralform>Ismételt próbálkozás %x másodperc múlva...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Automatikusan újrapróbálja</target>
<source>Ignore &all</source>
<target>&Mindent kihagy</target>
@@ -797,6 +797,27 @@ A parancs végrehajtódik, ha:
<source>Serious Error</source>
<target>Komoly hiba</target>
+<source>Last session</source>
+<target>Utolsó munkamenet</target>
+
+<source>Today</source>
+<target>Mai</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 nap</pluralform>
+<pluralform>%x nap</pluralform>
+</target>
+
+<source>Name</source>
+<target>Név</target>
+
+<source>Last sync</source>
+<target>Legutóbbi szinkronizálás</target>
+
<source>Folder</source>
<target>Könyvtár</target>
@@ -860,9 +881,6 @@ A parancs végrehajtódik, ha:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Kérem válasszon egy könyvtárat a helyi fájlrendszerben, a hálózaton vagy egy MTP eszközön.</target>
-<source>&New</source>
-<target>&Új</target>
-
<source>&Save</source>
<target>&Ment</target>
@@ -974,6 +992,9 @@ A parancs végrehajtódik, ha:
<source>Total bytes to copy</source>
<target>Összesen másolandó bájtok</target>
+<source>Arrange folder pair</source>
+<target>Kezelje a könyvtár-párt</target>
+
<source>Folder pair:</source>
<target>Könyvtár-pár:</target>
@@ -1066,11 +1087,14 @@ A parancs végrehajtódik, ha:
<source>Naming convention:</source>
<target>Elnevezési megállapodás:</target>
-<source>&Ignore errors</source>
-<target>F&igyelmen kívül hagyja a hibákat</target>
+<source>Ignore errors</source>
+<target>Hagyja figyelmen kívül a hibákat</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Hiba vagy figyelmeztetés esetén mutasson párbeszédablakot</target>
+<source>Retry count:</source>
+<target>Visszatérések száma:</target>
+
+<source>Delay (in seconds):</source>
+<target>Késés (másodpercben):</target>
<source>Run a command after synchronization:</source>
<target>Futtasson egy parancsot a szinkronizálás után:</target>
@@ -1078,9 +1102,6 @@ A parancs végrehajtódik, ha:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Kezelje a könyvtár-párt</target>
-
<source>Enter your login details:</source>
<target>Adja meg a bejelentkezési adatait:</target>
@@ -1177,12 +1198,12 @@ A parancs végrehajtódik, ha:
<source>Minimize to notification area</source>
<target>Minimalizálja a figyelmeztetési területre</target>
-<source>Bytes copied:</source>
-<target>Másolt bitek száma:</target>
-
<source>When finished:</source>
<target>Ha befejezte:</target>
+<source>Auto-close</source>
+<target>Automatikusan bezár</target>
+
<source>Close</source>
<target>Bezár</target>
@@ -1195,11 +1216,17 @@ A parancs végrehajtódik, ha:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Készítsen egy parancsállományt a felügyelet nélküli szinkronizáláshoz. Az indításhoz kattintson kétszer erre az állományra vagy ütemezze a feladat-tervezőben: %x</target>
+<source>Progress dialog:</source>
+<target>Előrehaladási üzenet:</target>
+
<source>Run minimized</source>
<target>Minimalizálva fusson</target>
<source>&Show error dialog</source>
-<target>&Mutassa a hiba párbeszédablakot</target>
+<target>&Mutassa a hiba üzenetet</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Hiba vagy figyelmeztetés esetén mutasson párbeszédablakot</target>
<source>&Cancel</source>
<target>&Elvet</target>
@@ -1249,14 +1276,11 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Transfer file and folder permissions.</source>
<target>Vigye át az állomány- és könyvtár-jogosultságokat.</target>
-<source>Automatic retry on error:</source>
-<target>Automatikus visszatérés a következő hibánál:</target>
-
-<source>Retry count:</source>
-<target>Visszatérések száma:</target>
+<source>Show hidden dialogs again</source>
+<target>Mutassa ismét a rejtett párbeszédablakokat?</target>
-<source>Delay (in seconds):</source>
-<target>Késés (másodpercben):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Mutassa újra az összes ideiglenesen rejtett párbeszédablakot és figyelmeztetést</target>
<source>Customize context menu:</source>
<target>Környezeti menü testreszabása:</target>
@@ -1264,12 +1288,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Description</source>
<target>Leírás</target>
-<source>Show hidden dialogs again</source>
-<target>Mutassa ismét a rejtett párbeszédablakokat?</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Mutassa újra az összes ideiglenesen rejtett párbeszédablakot és figyelmeztetést</target>
-
<source>&Default</source>
<target>&Alapértelmezett</target>
@@ -1324,13 +1342,22 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Activate offline</source>
<target>Aktiváljon online módon</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Jelölje ki azokat a beállításokat, amelyek nem futottak legalább a következő számú napja:</target>
+
+<source>Synchronization Settings</source>
+<target>Szinkronizálási beállítások</target>
+
+<source>Access Online Storage</source>
+<target>Érje el a online tárolót</target>
+
<source>Save as a Batch Job</source>
<target>Mentse mint egy kötegelt (batch) feladatot</target>
<source>Delete Items</source>
<target>Törölje az elemeket</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Másolja az elemeket</target>
<source>Options</source>
@@ -1342,6 +1369,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Támogatói kiadás</target>
+<source>Highlight Configurations</source>
+<target>Jelölje ki a beállításokat</target>
+
<source>&Options</source>
<target>&Beállítások</target>
@@ -1465,9 +1495,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Select time span...</source>
<target>Időintervallum kiválasztása...</target>
-<source>Last session</source>
-<target>Utolsó munkamenet</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Könyvtár összehasonlítás és szinkronizálás</target>
@@ -1486,8 +1513,11 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Do&n't save</source>
<target>&ne mentse</target>
-<source>Remove entry from list</source>
-<target>Törölje a bejegyzést a listáról</target>
+<source>Hide configuration</source>
+<target>Rejtse el a beállítást</target>
+
+<source>Highlight...</source>
+<target>Emelje ki...</target>
<source>Clear filter</source>
<target>Törölje a szűrőt</target>
@@ -1567,6 +1597,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Paused</source>
<target>Megállítva</target>
+<source>Stop requested...</source>
+<target>Leállítás szükséges...</target>
+
<source>Initializing...</source>
<target>Inicializálás...</target>
@@ -1576,9 +1609,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Comparing content...</source>
<target>Tartalom összehasonlítása...</target>
-<source>Completed</source>
-<target>Befejeződött</target>
-
<source>Info</source>
<target>Információ</target>
@@ -1660,12 +1690,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Parameters for opposite side</source>
<target>Paraméterek az ellenkező oldalhoz</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Mutassa újra a rejtett párbeszédablakokat és figyelmeztetéseket</target>
-
-<source>&Show</source>
-<target>&Mutat</target>
-
<source>Downloading update...</source>
<target>Frissítés letöltése...</target>
@@ -1690,18 +1714,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Configure your own synchronization rules.</source>
<target>Állítsa be a saját szinkronizálási szabályait.</target>
-<source>Synchronization Settings</source>
-<target>Szinkronizálási beállítások</target>
-
<source>Comparison</source>
<target>Összehasonlítás</target>
<source>Synchronization</source>
<target>Szinkronizálás</target>
-<source>Today</source>
-<target>Mai</target>
-
<source>This week</source>
<target>E heti</target>
@@ -1771,9 +1789,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Files</source>
<target>Állományok</target>
-<source>Name</source>
-<target>Név</target>
-
<source>Percentage</source>
<target>Százalék</target>
@@ -1885,15 +1900,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<pluralform>%x óra</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 nap</pluralform>
-<pluralform>%x nap</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>%x privilégium nem állítható be.</target>
@@ -1957,8 +1963,11 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Desktop</source>
<target>Asztalon</target>
-<source>Start menu</source>
-<target>Start menü</target>
+<source>Start Menu</source>
+<target>Nyitó menü</target>
+
+<source>Send To</source>
+<target>Címzett</target>
<source>Registering FreeFileSync file extensions</source>
<target>A FreeFileSync állomány-kiterjesztéseinek regisztrálása</target>
@@ -1987,6 +1996,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Válassza a helyi telepítési módot vagy válasszon másik könytárat a telepítéshez.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>A csendes telepítési mód csak a FreeFileSync támogatói kiadásában elérhető.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>%x telepítési opció csak a FreeFileSync adományozói kiadásában érhető el.</target>
diff --git a/FreeFileSync/Build/Languages/italian.lng b/FreeFileSync/Build/Languages/italian.lng
index eebfcd49..707c244f 100755
--- a/FreeFileSync/Build/Languages/italian.lng
+++ b/FreeFileSync/Build/Languages/italian.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Errore di sintassi</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Sono previsti un percorso di directory sinistro e destro dopo %x.</target>
+
<source>Cannot find file %x.</source>
<target>Impossibile trovare il file %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Se questo errore viene ignorato le cartelle saranno considerate vuote. Cartelle mancanti vengono create automaticamente quando necessario.</target>
+<source>Comparison finished:</source>
+<target>Confronto terminato:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 oggetto trovato</pluralform>
+<pluralform>%x elementi trovati</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Il file %x ha una data non valida.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Utilizzo delle impostazioni globali non predefinite:</target>
-<source>Starting comparison</source>
-<target>Inizio confronto</target>
-
<source>A folder input field is empty.</source>
<target>Un campo di input cartella è vuoto.</target>
@@ -318,15 +330,15 @@ Attuale: %y byte
<source>Unable to move %x to the recycle bin.</source>
<target>Impossibile spostare %x nel cestino.</target>
+<source>Cannot find %x.</source>
+<target>Impossibile trovare %x.</target>
+
<source>Cannot open file %x.</source>
<target>Impossibile aprire il file %x.</target>
<source>Cannot find device %x.</source>
<target>Impossibile trovare dispositivo %x.</target>
-<source>Cannot find %x.</source>
-<target>Impossibile trovare %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Il tipo di oggetto %x non è supportato:</target>
@@ -432,6 +444,9 @@ Attuale: %y byte
<source>Lock owner:</source>
<target>Bloccare il proprietario:</target>
+<source>Detecting abandoned lock...</source>
+<target>Rilevamento blocco abbandonato ...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Attuale: %y byte
<pluralform>%x sec</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Rilevamento blocco abbandonato ...</target>
-
<source>Items processed:</source>
<target>Oggetti processati:</target>
@@ -456,8 +468,8 @@ Attuale: %y byte
<source>Error parsing file %x, row %y, column %z.</source>
<target>Errore nel parsing del file %x, riga %y, colonna %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Impossibile impostare il blocco cartella per %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Impossibile impostare i blocchi di directory per le seguenti cartelle:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Attuale: %y byte
<source>Volume name %x is not part of file path %y.</source>
<target>Nome volume %x non fa parte del percorso del file %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Bloccata richiesta: Aspettare la fine dell'operazione in corso ...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Impossibile creare l'impronta per il controllo delle versioni:</target>
@@ -513,6 +522,9 @@ Attuale: %y byte
<source>Select a folder</source>
<target>Seleziona una cartella</target>
+<source>&New</source>
+<target>&Nuovo</target>
+
<source>&Open...</source>
<target>&Apri...</target>
@@ -728,26 +740,23 @@ Il comando è attivato se:
<source>job name</source>
<target>nome del lavoro</target>
-<source>Show summary</source>
-<target>Mostra il riepilogo</target>
+<source>System: Sleep</source>
+<target>Sistema: In Sonno</target>
-<source>Sleep</source>
-<target>Sospendi</target>
+<source>System: Shut down</source>
+<target>Sistema: Spento</target>
-<source>Shut down</source>
-<target>Arresta</target>
-
-<source>Synchronization stopped</source>
-<target>Sincronizzazione fermata</target>
+<source>Cleaning up old log files...</source>
+<target>Pulizia vecchi file di log ...</target>
<source>Stopped</source>
<target>Arrestato</target>
-<source>Synchronization completed with errors</source>
-<target>Sincronizzazione completata con errori</target>
+<source>Completed with errors</source>
+<target>Completato con errori</target>
-<source>Synchronization completed with warnings</source>
-<target>Sincronizzazione completata con avvisi</target>
+<source>Completed with warnings</source>
+<target>Completato con avvisi</target>
<source>Warning</source>
<target>Attenzione</target>
@@ -755,15 +764,12 @@ Il comando è attivato se:
<source>Nothing to synchronize</source>
<target>Non c'è nulla da sincronizzare</target>
-<source>Synchronization completed successfully</source>
-<target>Sincronizzazione completata con successo</target>
+<source>Completed successfully</source>
+<target>Completato con successo</target>
<source>Executing command %x</source>
<target>Esecuzione del comando %x</target>
-<source>Cleaning up old log files...</source>
-<target>Pulizia vecchi file di log ...</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>
@@ -779,14 +785,8 @@ Il comando è attivato se:
<source>Switching to FreeFileSync's main window</source>
<target>Passaggio alla finestra principale di FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Riprova Automatica in 1 secondo...</pluralform>
-<pluralform>Riprova Automatica in %x secondi...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Riprova automaticamente</target>
<source>Ignore &all</source>
<target>Ignora &tutto</target>
@@ -797,6 +797,27 @@ Il comando è attivato se:
<source>Serious Error</source>
<target>Errore Grave</target>
+<source>Last session</source>
+<target>Ultima sessione</target>
+
+<source>Today</source>
+<target>Oggi</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 giorno</pluralform>
+<pluralform>%x giorni</pluralform>
+</target>
+
+<source>Name</source>
+<target>Nome</target>
+
+<source>Last sync</source>
+<target>Ultima sincronizzazione</target>
+
<source>Folder</source>
<target>Cartella</target>
@@ -860,9 +881,6 @@ Il comando è attivato se:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Si prega di selezionare una cartella su un file system locale, di rete o un dispositivo MTP.</target>
-<source>&New</source>
-<target>&Nuovo</target>
-
<source>&Save</source>
<target>&Salva</target>
@@ -974,6 +992,9 @@ Il comando è attivato se:
<source>Total bytes to copy</source>
<target>Bytes totali da copiare</target>
+<source>Arrange folder pair</source>
+<target>Disporre coppia di cartelle</target>
+
<source>Folder pair:</source>
<target>Coppia di cartelle:</target>
@@ -1066,11 +1087,14 @@ Il comando è attivato se:
<source>Naming convention:</source>
<target>Modalità di rinomina:</target>
-<source>&Ignore errors</source>
-<target>&Ignora errori</target>
+<source>Ignore errors</source>
+<target>Ignora errori</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Mostra pop-up di errore o avviso</target>
+<source>Retry count:</source>
+<target>Riprova conteggio:</target>
+
+<source>Delay (in seconds):</source>
+<target>Ritardo (in secondi):</target>
<source>Run a command after synchronization:</source>
<target>Esegui un comando dopo la sincronizzazione:</target>
@@ -1078,9 +1102,6 @@ Il comando è attivato se:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Disporre coppia di cartelle</target>
-
<source>Enter your login details:</source>
<target>Inserisci i tuoi dati d'accesso:</target>
@@ -1177,12 +1198,12 @@ Il comando è attivato se:
<source>Minimize to notification area</source>
<target>Ridurre al minimo l'area di notifica</target>
-<source>Bytes copied:</source>
-<target>Byte copiati:</target>
-
<source>When finished:</source>
<target>Al termine:</target>
+<source>Auto-close</source>
+<target>Chiusura automatica</target>
+
<source>Close</source>
<target>Chiudi</target>
@@ -1195,12 +1216,18 @@ Il comando è attivato se:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Creare un file batch per la sincronizzazione automatica. Per iniziare, fare doppio clic su questo file o programmarlo in un pianificatore di compiti: %x</target>
+<source>Progress dialog:</source>
+<target>Finestra di avanzamento:</target>
+
<source>Run minimized</source>
<target>Esegui minimizzato</target>
<source>&Show error dialog</source>
<target>&Mostra la finestra di errore</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Mostra pop-up di errore o avviso</target>
+
<source>&Cancel</source>
<target>&Cancella</target>
@@ -1249,14 +1276,11 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Transfer file and folder permissions.</source>
<target>Trasferimento autorizzazioni di file e cartelle.</target>
-<source>Automatic retry on error:</source>
-<target>Tentativo Automatico in caso di errore:</target>
-
-<source>Retry count:</source>
-<target>Riprova conteggio:</target>
+<source>Show hidden dialogs again</source>
+<target>Mostra di nuovo le finestre di dialogo nascoste</target>
-<source>Delay (in seconds):</source>
-<target>Ritardo (in secondi):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Mostra di nuovo tutti i dialoghi nascosti in modo permanente e i messaggi di allarme</target>
<source>Customize context menu:</source>
<target>Personalizzare menu contestuale:</target>
@@ -1264,12 +1288,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Description</source>
<target>Descrizione</target>
-<source>Show hidden dialogs again</source>
-<target>Mostra di nuovo le finestre di dialogo nascoste</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Mostra di nuovo tutti i dialoghi nascosti in modo permanente e i messaggi di allarme</target>
-
<source>&Default</source>
<target>&Predefinito</target>
@@ -1324,14 +1342,23 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Activate offline</source>
<target>Attiva offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Evidenzia le configurazioni che non sono state eseguite per più del seguente numero di giorni:</target>
+
+<source>Synchronization Settings</source>
+<target>Impostazioni di Sincronizzazione</target>
+
+<source>Access Online Storage</source>
+<target>Accedi all'archiviazione online</target>
+
<source>Save as a Batch Job</source>
<target>Salva come Lavoro Batch</target>
<source>Delete Items</source>
<target>Elimina Elementi</target>
-<source>Copy items</source>
-<target>Copia elementi</target>
+<source>Copy Items</source>
+<target>Copia articoli</target>
<source>Options</source>
<target>Opzioni</target>
@@ -1342,6 +1369,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Evidenzia le configurazioni</target>
+
<source>&Options</source>
<target>&Opzioni</target>
@@ -1465,9 +1495,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Select time span...</source>
<target>Seleziona intervallo di tempo...</target>
-<source>Last session</source>
-<target>Ultima sessione</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Comparazione delle Cartelle e Sincronizzazione</target>
@@ -1486,8 +1513,11 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Do&n't save</source>
<target>No&n salvare</target>
-<source>Remove entry from list</source>
-<target>Togliere voce dalla lista</target>
+<source>Hide configuration</source>
+<target>Nascondi configurazione</target>
+
+<source>Highlight...</source>
+<target>Evidenziare...</target>
<source>Clear filter</source>
<target>Eliminare filtro</target>
@@ -1567,6 +1597,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Paused</source>
<target>In pausa</target>
+<source>Stop requested...</source>
+<target>Stop richiesto ...</target>
+
<source>Initializing...</source>
<target>Inizializzazione...</target>
@@ -1576,9 +1609,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Comparing content...</source>
<target>Comparazione del contenuto...</target>
-<source>Completed</source>
-<target>Completato</target>
-
<source>Info</source>
<target>Info</target>
@@ -1660,12 +1690,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Parameters for opposite side</source>
<target>Parametri per lato opposto</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Mostra di nuovo dialoghi nascosti e messaggi di avviso?</target>
-
-<source>&Show</source>
-<target>&Mostra</target>
-
<source>Downloading update...</source>
<target>Download aggiornamento...</target>
@@ -1690,18 +1714,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Configure your own synchronization rules.</source>
<target>Configura le tue regole di sincronizzazione.</target>
-<source>Synchronization Settings</source>
-<target>Impostazioni di Sincronizzazione</target>
-
<source>Comparison</source>
<target>Confronto</target>
<source>Synchronization</source>
<target>Sincronizzazione</target>
-<source>Today</source>
-<target>Oggi</target>
-
<source>This week</source>
<target>Questa settimana</target>
@@ -1771,9 +1789,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Files</source>
<target>File</target>
-<source>Name</source>
-<target>Nome</target>
-
<source>Percentage</source>
<target>Percentuale</target>
@@ -1885,15 +1900,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<pluralform>%x ore</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 giorno</pluralform>
-<pluralform>%x giorni</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Impossibile impostare privilegi %x.</target>
@@ -1957,8 +1963,11 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Desktop</source>
<target>Desktop</target>
-<source>Start menu</source>
-<target>Menù Avvio</target>
+<source>Start Menu</source>
+<target>Menu iniziale</target>
+
+<source>Send To</source>
+<target>Inviare a</target>
<source>Registering FreeFileSync file extensions</source>
<target>Registra estensioni file FreeFileSync</target>
@@ -1987,6 +1996,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Scegliere il tipo di installazione locale o selezionare una cartella diversa per l'installazione.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>La modalità di installazione silenziosa è disponibile solo nella FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>L'opzione di installazione %x è disponibile solo nell'edizione di donazione FreeFileSync.</target>
diff --git a/FreeFileSync/Build/Languages/japanese.lng b/FreeFileSync/Build/Languages/japanese.lng
index 0347da63..cbbc32ac 100755
--- a/FreeFileSync/Build/Languages/japanese.lng
+++ b/FreeFileSync/Build/Languages/japanese.lng
@@ -59,11 +59,14 @@
<target>例外が発生しました</target>
<source>A directory path is expected after %x.</source>
-<target>%x の後にはディレクトリ・パスが必要です.</target>
+<target>%x の後にはディレクトリ パスが必要です.</target>
<source>Syntax error</source>
<target>構文エラー</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x の後に左右のディレクトリ パスが必要です.</target>
+
<source>Cannot find file %x.</source>
<target>ファイル %x がみつかりません.</target>
@@ -115,6 +118,17 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>このエラーを無視した場合、空のフォルダが考慮され、必要に応じて不足しているフォルダが自動的に生成されます.</target>
+<source>Comparison finished:</source>
+<target>比較が完了:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>%x 項目を検出</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>ファイル %x の日付は無効なものです.</target>
@@ -175,9 +189,6 @@
<source>Using non-default global settings:</source>
<target>非デフォルトのグローバル設定を使用:</target>
-<source>Starting comparison</source>
-<target>比較処理を開始中</target>
-
<source>A folder input field is empty.</source>
<target>フォルダ入力欄が空白です.</target>
@@ -318,15 +329,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>%x がみつかりません.</target>
-
<source>Type of item %x is not supported:</source>
<target>項目 %x には対応していません:</target>
@@ -429,6 +440,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>ロック所有者:</target>
+<source>Detecting abandoned lock...</source>
+<target>放棄されたロックを検出中...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -437,9 +451,6 @@ Actual: %y bytes
<pluralform>%x 秒</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>放棄されたロックを検出中...</target>
-
<source>Items processed:</source>
<target>処理された要素:</target>
@@ -452,8 +463,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>ファイル %x の構文解析エラー, 行 %y, 列 %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>%x のディレクトリロックができません.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>次のフォルダにあるディレクトリはロックできません:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -493,9 +504,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>ボリューム名 %x は、ファイルパス %y の一部ではありません.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>停止の要求: 現在の操作が完了するのを待機しています...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>バージョン管理のタイムスタンプを作成できません:</target>
@@ -508,6 +516,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>フォルダを選択</target>
+<source>&New</source>
+<target>新規(&N)</target>
+
<source>&Open...</source>
<target>開く(&O)...</target>
@@ -723,26 +734,23 @@ The command is triggered if:
<source>job name</source>
<target>ジョブ名</target>
-<source>Show summary</source>
-<target>概要を表示</target>
+<source>System: Sleep</source>
+<target>システム: スリープ</target>
-<source>Sleep</source>
-<target>スリープ</target>
+<source>System: Shut down</source>
+<target>システム: シャットダウン</target>
-<source>Shut down</source>
-<target>シャットダウン</target>
-
-<source>Synchronization stopped</source>
-<target>同期処理を停止</target>
+<source>Cleaning up old log files...</source>
+<target>古いログファイルをクリーン...</target>
<source>Stopped</source>
<target>停止</target>
-<source>Synchronization completed with errors</source>
-<target>同期処理はエラーで終了しています</target>
+<source>Completed with errors</source>
+<target>エラーで終了</target>
-<source>Synchronization completed with warnings</source>
-<target>同期処理は警告で終了しています</target>
+<source>Completed with warnings</source>
+<target>警告で終了</target>
<source>Warning</source>
<target>警告</target>
@@ -750,15 +758,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>同期対象がありません</target>
-<source>Synchronization completed successfully</source>
-<target>同期処理はすべてが正常に完了しました</target>
+<source>Completed successfully</source>
+<target>正常に完了しました</target>
<source>Executing command %x</source>
<target>コマンド %x を実行中</target>
-<source>Cleaning up old log files...</source>
-<target>古いログファイルをクリーン...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>FreeFileSync のメインウィンドウを切り替えることでこの問題を解決.</target>
@@ -774,13 +779,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>FreeFileSync メインウィンドウの切り替え</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>%x 秒後に自動的に再試行...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>自動的に再試行</target>
<source>Ignore &all</source>
<target>すべて無視(&A)</target>
@@ -791,6 +791,26 @@ The command is triggered if:
<source>Serious Error</source>
<target>重大なエラー</target>
+<source>Last session</source>
+<target>最後のセッション</target>
+
+<source>Today</source>
+<target>今日</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x 日</pluralform>
+</target>
+
+<source>Name</source>
+<target>名前</target>
+
+<source>Last sync</source>
+<target>前回の同期</target>
+
<source>Folder</source>
<target>フォルダ</target>
@@ -854,9 +874,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>ローカルファイルシステム、ネットワークまたは MTP デバイス上のフォルダを選択.</target>
-<source>&New</source>
-<target>新規(&N)</target>
-
<source>&Save</source>
<target>保存(&S)</target>
@@ -968,6 +985,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>コピーの合計バイト</target>
+<source>Arrange folder pair</source>
+<target>フォルダ ペアの配置</target>
+
<source>Folder pair:</source>
<target>フォルダ ペア:</target>
@@ -1026,7 +1046,7 @@ 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>クリア(&L)</target>
@@ -1060,11 +1080,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>命名規則:</target>
-<source>&Ignore errors</source>
-<target>エラーを無視(&I)</target>
+<source>Ignore errors</source>
+<target>エラーを無視</target>
-<source>Show pop-up on errors or warnings</source>
-<target>エラーと警告をポップアップで表示</target>
+<source>Retry count:</source>
+<target>再試行回数:</target>
+
+<source>Delay (in seconds):</source>
+<target>遅延 (秒で指定):</target>
<source>Run a command after synchronization:</source>
<target>同期処理後に実行するコマンド:</target>
@@ -1072,9 +1095,6 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>フォルダ ペアの配置</target>
-
<source>Enter your login details:</source>
<target>ログインの詳細を入力:</target>
@@ -1171,12 +1191,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>通知領域に最小化</target>
-<source>Bytes copied:</source>
-<target>バイトをコピー済:</target>
-
<source>When finished:</source>
<target>完了後:</target>
+<source>Auto-close</source>
+<target>自動的に閉じる</target>
+
<source>Close</source>
<target>閉じる</target>
@@ -1189,12 +1209,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>無人で同期を行う為のバッチファイルを作成 - このファイルか、タスクプランナーからスケジュールをダブルクリックすることで開始: %x</target>
+<source>Progress dialog:</source>
+<target>進捗ダイアログ:</target>
+
<source>Run minimized</source>
<target>最小化で起動</target>
<source>&Show error dialog</source>
<target>エラーダイアログを表示(&S)</target>
+<source>Show pop-up on errors or warnings</source>
+<target>エラーと警告をポップアップで表示</target>
+
<source>&Cancel</source>
<target>キャンセル(&C)</target>
@@ -1243,14 +1269,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>ファイルとフォルダのパーミッションを転送します.</target>
-<source>Automatic retry on error:</source>
-<target>エラー時の自動再試行:</target>
-
-<source>Retry count:</source>
-<target>再試行回数:</target>
+<source>Show hidden dialogs again</source>
+<target>非表示のダイアログを再表示</target>
-<source>Delay (in seconds):</source>
-<target>遅延 (秒で指定):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>非表示にしたすべてのダイアログと警告メッセージを再表示</target>
<source>Customize context menu:</source>
<target>コンテキストメニューのカスタマイズ:</target>
@@ -1258,12 +1281,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>説明</target>
-<source>Show hidden dialogs again</source>
-<target>非表示のダイアログを再表示</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>非表示にしたすべてのダイアログと警告メッセージを再表示</target>
-
<source>&Default</source>
<target>デフォルト(&D)</target>
@@ -1318,13 +1335,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>オフライン アクティベート</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>指定した日数を超えて実行されていない構成を強調表示する:</target>
+
+<source>Synchronization Settings</source>
+<target>同期の設定</target>
+
+<source>Access Online Storage</source>
+<target>オンラインストレージにアクセス</target>
+
<source>Save as a Batch Job</source>
<target>一括ジョブを保存</target>
<source>Delete Items</source>
<target>項目の削除</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>項目のコピー</target>
<source>Options</source>
@@ -1336,6 +1362,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync 寄付版</target>
+<source>Highlight Configurations</source>
+<target>構成の強調表示</target>
+
<source>&Options</source>
<target>設定(&O)</target>
@@ -1455,9 +1484,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>タイムスパンを選択...</target>
-<source>Last session</source>
-<target>最後のセッション</target>
-
<source>Folder Comparison and Synchronization</source>
<target>フォルダの比較と同期</target>
@@ -1476,8 +1502,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>保存しない(&N)</target>
-<source>Remove entry from list</source>
-<target>一覧からエントリを除去</target>
+<source>Hide configuration</source>
+<target>構成を隠す</target>
+
+<source>Highlight...</source>
+<target>強調表示...</target>
<source>Clear filter</source>
<target>フィルタをクリア</target>
@@ -1557,6 +1586,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>一時停止中</target>
+<source>Stop requested...</source>
+<target>リクエストの中止...</target>
+
<source>Initializing...</source>
<target>初期化中...</target>
@@ -1566,9 +1598,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>内容を比較中...</target>
-<source>Completed</source>
-<target>完了しました!</target>
-
<source>Info</source>
<target>情報</target>
@@ -1636,7 +1665,7 @@ This guarantees a consistent state even in case of a serious error.
<target>外部のアプリケーションをコンテキストメニューに統合、以下のマクロが利用できます:</target>
<source>Full file or folder path</source>
-<target>ファイル、フォルダの完全な名前</target>
+<target>ファイルまたはフォルダの完全パス</target>
<source>Parent folder path</source>
<target>親フォルダのパス</target>
@@ -1647,48 +1676,36 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>反対側のパラメータ</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>非表示のダイアログと警告を再表示しますか?</target>
-
-<source>&Show</source>
-<target>表示(&S)</target>
-
<source>Downloading update...</source>
<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>Identify equal files by comparing their file size.</source>
-<target>ファイルのサイズを比較して、同一ファイルを識別します.</target>
+<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>
-<source>Synchronization Settings</source>
-<target>同期の設定</target>
-
<source>Comparison</source>
<target>比較</target>
<source>Synchronization</source>
<target>同期</target>
-<source>Today</source>
-<target>今日</target>
-
<source>This week</source>
<target>今週</target>
@@ -1758,9 +1775,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>ファイル</target>
-<source>Name</source>
-<target>名前</target>
-
<source>Percentage</source>
<target>パーセント</target>
@@ -1870,14 +1884,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x 時間</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>%x 日</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>%x の特権をセットできません.</target>
@@ -1941,9 +1947,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>デスクトップ</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>スタートメニュー</target>
+<source>Send To</source>
+<target>送る</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>FreeFileSync ファイル拡張子を登録中</target>
@@ -1971,6 +1980,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>ローカル インストールを選択するか、別のインストール先を選択してください.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>サイレント インストール モードは、FreeFileSync 寄付版でのみ使用できます.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>インストール オプション %x は、FreeFileSync 寄付版でのみ利用可能です.</target>
diff --git a/FreeFileSync/Build/Languages/korean.lng b/FreeFileSync/Build/Languages/korean.lng
index 6e0191b8..b12f0763 100755
--- a/FreeFileSync/Build/Languages/korean.lng
+++ b/FreeFileSync/Build/Languages/korean.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>구문 오류</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x 다음에 좌측 및 우측 디렉토리 경로가 필요합니다.</target>
+
<source>Cannot find file %x.</source>
<target>파일 %x을(를) 찾을 수 없습니다.</target>
@@ -115,6 +118,17 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>이 오류를 무시하면 폴더는 비어 있는 것으로 간주됩니다. 없는 폴더는 필요한 경우 자동 생성됩니다.</target>
+<source>Comparison finished:</source>
+<target>비교 완료:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>%x개 항목 발견</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>파일 %x 의 날짜가 유효하지 않습니다.</target>
@@ -175,9 +189,6 @@
<source>Using non-default global settings:</source>
<target>기본이 아닌 전역설정 사용:</target>
-<source>Starting comparison</source>
-<target>비교 시작</target>
-
<source>A folder input field is empty.</source>
<target>폴더 입력 필드 하나가 비어 있습니다.</target>
@@ -318,15 +329,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>%x을(를) 찾을 수 없습니다.</target>
-
<source>Type of item %x is not supported:</source>
<target>항목 %x의 형식은 지원되지 않습니다:</target>
@@ -429,6 +440,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>잠금 권한자:</target>
+<source>Detecting abandoned lock...</source>
+<target>방치된 잠금 탐색 중...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -437,9 +451,6 @@ Actual: %y bytes
<pluralform>%x초</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>방치된 잠금 탐색 중...</target>
-
<source>Items processed:</source>
<target>처리된 항목:</target>
@@ -452,8 +463,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>분석 오류 - 파일: %x; 행: %y; 열: %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>%x 에 대한 디렉터리 잠금을 설정할 수 없습니다.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>다음 폴더의 디렉터리 잠금을 설정할 수 없습니다:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -493,9 +504,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>볼륨 이름 %x은(는) 파일 경로 %y의 일부가 아닙니다.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>사용자에 의한 작업 중단: 현재 작업 종료 대기 중...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>버전 관리를 위한 타임 스탬프 생성 불가:</target>
@@ -508,6 +516,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>폴더 선택</target>
+<source>&New</source>
+<target>새로 만들기(&N)</target>
+
<source>&Open...</source>
<target>열기(&O)...</target>
@@ -723,26 +734,23 @@ The command is triggered if:
<source>job name</source>
<target>작업 이름</target>
-<source>Show summary</source>
-<target>요약 표시</target>
+<source>System: Sleep</source>
+<target>시스템: 절전</target>
-<source>Sleep</source>
-<target>절전</target>
+<source>System: Shut down</source>
+<target>시스템: 종료</target>
-<source>Shut down</source>
-<target>종료</target>
-
-<source>Synchronization stopped</source>
-<target>동기화 중단</target>
+<source>Cleaning up old log files...</source>
+<target>이전 로그 파일 정리 중...</target>
<source>Stopped</source>
<target>중단</target>
-<source>Synchronization completed with errors</source>
-<target>동기화가 완료되긴 했으나, 오류가 있습니다</target>
+<source>Completed with errors</source>
+<target>오류와 함께 완료됨</target>
-<source>Synchronization completed with warnings</source>
-<target>경고 메세지와 함께 동기화 완료</target>
+<source>Completed with warnings</source>
+<target>경고와 함께 완료됨</target>
<source>Warning</source>
<target>경고</target>
@@ -750,15 +758,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>동기화 할 항목이 없습니다</target>
-<source>Synchronization completed successfully</source>
-<target>동기화가 성공적으로 완료 됐습니다</target>
+<source>Completed successfully</source>
+<target>성공적으로 완료됨</target>
<source>Executing command %x</source>
<target>%x 명령 실행 중</target>
-<source>Cleaning up old log files...</source>
-<target>이전 로그 파일 정리 중...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>이 문제는 FreeFileSync 기본 창으로 전환해서 해결 가능합니다.</target>
@@ -774,13 +779,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>FreeFileSync 기본 창으로 전환 중</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>%x초 이내에 자동 재시도...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>자동 재시도</target>
<source>Ignore &all</source>
<target>전체 무시(&a)</target>
@@ -791,6 +791,26 @@ The command is triggered if:
<source>Serious Error</source>
<target>심각한 오류</target>
+<source>Last session</source>
+<target>마지막 세션</target>
+
+<source>Today</source>
+<target>오늘</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x일</pluralform>
+</target>
+
+<source>Name</source>
+<target>이름</target>
+
+<source>Last sync</source>
+<target>마지막 동기화</target>
+
<source>Folder</source>
<target>폴더</target>
@@ -854,9 +874,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>로컬 파일 시스템, 네트워크 또는 MTP 장치에서의 폴더 하나를 선택하십시오.</target>
-<source>&New</source>
-<target>새로 만들기(&N)</target>
-
<source>&Save</source>
<target>저장(&S)</target>
@@ -968,6 +985,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>복사할 전체 바이트 크기</target>
+<source>Arrange folder pair</source>
+<target>폴더 페어 정렬</target>
+
<source>Folder pair:</source>
<target>폴더 페어:</target>
@@ -1060,11 +1080,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>이름 지정:</target>
-<source>&Ignore errors</source>
-<target>오류 무시(&I)</target>
+<source>Ignore errors</source>
+<target>오류 무시</target>
-<source>Show pop-up on errors or warnings</source>
-<target>오류 또는 경고에 대한 팝업 보이기</target>
+<source>Retry count:</source>
+<target>재시도 횟수:</target>
+
+<source>Delay (in seconds):</source>
+<target>지연 (초 단위):</target>
<source>Run a command after synchronization:</source>
<target>동기화 이후 명령 실행:</target>
@@ -1072,9 +1095,6 @@ The command is triggered if:
<source>OK</source>
<target>확인</target>
-<source>Arrange folder pair</source>
-<target>폴더 페어 정렬</target>
-
<source>Enter your login details:</source>
<target>귀하의 로그인 정보 입력:</target>
@@ -1171,12 +1191,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>알림 영역으로 최소화</target>
-<source>Bytes copied:</source>
-<target>복사된 바이트:</target>
-
<source>When finished:</source>
<target>완료 시:</target>
+<source>Auto-close</source>
+<target>자동 닫기</target>
+
<source>Close</source>
<target>닫기</target>
@@ -1189,12 +1209,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>직접 지켜보지 않는 자동 동기화의 경우, 배치 파일을 만듭니다. 시작하려면 파일을 더블 클릭하거나 작업 플래너에서 일정을 만드십시오: %x</target>
+<source>Progress dialog:</source>
+<target>진행 대화 상자:</target>
+
<source>Run minimized</source>
<target>최소화 실행</target>
<source>&Show error dialog</source>
<target>오류 대화 상자 표시(&S)</target>
+<source>Show pop-up on errors or warnings</source>
+<target>오류 또는 경고에 대한 팝업 보이기</target>
+
<source>&Cancel</source>
<target>취소(&C)</target>
@@ -1243,14 +1269,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>파일 및 폴더 권한 전송.</target>
-<source>Automatic retry on error:</source>
-<target>오류 발생 시 자동 재시도:</target>
-
-<source>Retry count:</source>
-<target>재시도 횟수:</target>
+<source>Show hidden dialogs again</source>
+<target>숨겨진 대화창 다시 보이기</target>
-<source>Delay (in seconds):</source>
-<target>지연 (초 단위):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>영구적으로 숨겨진 모든 대화창 및 경고 메세지 다시 보이기</target>
<source>Customize context menu:</source>
<target>컨텍스트 메뉴 커스터마이즈 (사용자 정의):</target>
@@ -1258,12 +1281,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>설명</target>
-<source>Show hidden dialogs again</source>
-<target>숨겨진 대화창 다시 보이기</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>영구적으로 숨겨진 모든 대화창 및 경고 메세지 다시 보이기</target>
-
<source>&Default</source>
<target>기본 설정/값(&D)</target>
@@ -1318,13 +1335,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>오프라인 활성화</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>다음 일 수보다 오래 실행되지 않은 구성을 강조 표시:</target>
+
+<source>Synchronization Settings</source>
+<target>동기화 설정</target>
+
+<source>Access Online Storage</source>
+<target>온라인 저장소 액세스</target>
+
<source>Save as a Batch Job</source>
<target>일괄 작업으로 저장</target>
<source>Delete Items</source>
<target>항목 삭제</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>항목 복사</target>
<source>Options</source>
@@ -1336,6 +1362,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync 유료 버전</target>
+<source>Highlight Configurations</source>
+<target>강조 표시 구성</target>
+
<source>&Options</source>
<target>옵션(&O)</target>
@@ -1455,9 +1484,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>시간간격(타임스팬) 선택...</target>
-<source>Last session</source>
-<target>마지막 세션</target>
-
<source>Folder Comparison and Synchronization</source>
<target>폴더 비교 및 동기화</target>
@@ -1476,8 +1502,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>저장 안 함(&n)</target>
-<source>Remove entry from list</source>
-<target>목록에서 입력항목 제거</target>
+<source>Hide configuration</source>
+<target>구성 숨기기</target>
+
+<source>Highlight...</source>
+<target>강조 표시...</target>
<source>Clear filter</source>
<target>필터 제거</target>
@@ -1557,6 +1586,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>일시정지 중</target>
+<source>Stop requested...</source>
+<target>중단 요청...</target>
+
<source>Initializing...</source>
<target>초기화 작업 중...</target>
@@ -1566,9 +1598,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>내용 비교 중...</target>
-<source>Completed</source>
-<target>완료</target>
-
<source>Info</source>
<target>정보</target>
@@ -1647,12 +1676,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>반대 측에 대한 매개 변수</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>숨겨진 모든 대화창 및 경고 메세지를 다시 보시겠습니까?</target>
-
-<source>&Show</source>
-<target>표시/보이기(&S)</target>
-
<source>Downloading update...</source>
<target>업데이트 다운로드 중...</target>
@@ -1677,18 +1700,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>개인 동기화 규칙을 설정합니다.</target>
-<source>Synchronization Settings</source>
-<target>동기화 설정</target>
-
<source>Comparison</source>
<target>비 교</target>
<source>Synchronization</source>
<target>동 기 화</target>
-<source>Today</source>
-<target>오늘</target>
-
<source>This week</source>
<target>이번 주</target>
@@ -1758,9 +1775,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>파일</target>
-<source>Name</source>
-<target>이름</target>
-
<source>Percentage</source>
<target>퍼센티지(%)</target>
@@ -1870,14 +1884,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x시간</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>%x일</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>권한 %x을(를) 설정할 수 없습니다.</target>
@@ -1941,9 +1947,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>바탕화면</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>시작 메뉴</target>
+<source>Send To</source>
+<target>보내기</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>FreeFileSync 파일 확장자 등록 중</target>
@@ -1971,6 +1980,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>로컬 설치 유형을 선택하거나 설치할 다른 폴더를 선택하십시오.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>자동 설치 모드는 FreeFileSync 유료 버전에서만 사용 가능합니다.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>%x 설치 옵션은 FreeFileSync 유료 버전에서만 사용 가능합니다.</target>
diff --git a/FreeFileSync/Build/Languages/lithuanian.lng b/FreeFileSync/Build/Languages/lithuanian.lng
index 6e8b1ed5..97c435fe 100755
--- a/FreeFileSync/Build/Languages/lithuanian.lng
+++ b/FreeFileSync/Build/Languages/lithuanian.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Sintaksės klaida</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Keliai į kairį ir dešinį katalogus turėtų buti po %x.</target>
+
<source>Cannot find file %x.</source>
<target>Negalima surasti failo %x.</target>
@@ -115,6 +118,19 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Jei nebus paisoma šios klaidos, aplankams bus laikomas tusčiu. Trūkstami aplankai sukuriami automatiškai.</target>
+<source>Comparison finished:</source>
+<target>Palyginimas pabaigtas:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>Surastas %x elementas</pluralform>
+<pluralform>%x elementai surasti</pluralform>
+<pluralform>%x elementų surasta</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Failas %x turi netinkamą datą.</target>
@@ -175,9 +191,6 @@
<source>Using non-default global settings:</source>
<target>Naudoti nepradinius globalius parametrus:</target>
-<source>Starting comparison</source>
-<target>Pradedamas palyginimas</target>
-
<source>A folder input field is empty.</source>
<target>Aplanko įvesties laukas yra tuščias.</target>
@@ -318,15 +331,15 @@ Esamas: %y baitai
<source>Unable to move %x to the recycle bin.</source>
<target>%x į šiukšliadėžę perkelti nepavyko.</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 find %x.</source>
-<target>Negalima surasti %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Elemento tipas %x nepalaikomas:</target>
@@ -435,6 +448,9 @@ Esamas: %y baitai
<source>Lock owner:</source>
<target>Užrakto savininkas:</target>
+<source>Detecting abandoned lock...</source>
+<target>Aptiktas paliktas užraktas...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -445,9 +461,6 @@ Esamas: %y baitai
<pluralform>%x sekundžių</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Aptiktas paliktas užraktas...</target>
-
<source>Items processed:</source>
<target>Elementų apdorota:</target>
@@ -460,8 +473,8 @@ Esamas: %y baitai
<source>Error parsing file %x, row %y, column %z.</source>
<target>Klaida trinant failą %x, eilė %y, stulpelis %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Nepavyksta nustatyti katalogo užrakto %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Negalima užrakinti šiuos aplankus kataloge:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -503,9 +516,6 @@ Esamas: %y baitai
<source>Volume name %x is not part of file path %y.</source>
<target>Vietos vardas %x nėra failo kelio %y dalis.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<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>
@@ -518,6 +528,9 @@ Esamas: %y baitai
<source>Select a folder</source>
<target>Pažymėti aplanką</target>
+<source>&New</source>
+<target>&Naujas</target>
+
<source>&Open...</source>
<target>&Atversti...</target>
@@ -733,26 +746,23 @@ Komanda inicijuojama jei:
<source>job name</source>
<target>Užduoties pavadinimas</target>
-<source>Show summary</source>
-<target>Rodyti suvestinę</target>
+<source>System: Sleep</source>
+<target>Sistema: Miegoti</target>
-<source>Sleep</source>
-<target>Miego režimas</target>
+<source>System: Shut down</source>
+<target>Sistema: Išjungti</target>
-<source>Shut down</source>
-<target>Išjungti kompiuterį</target>
-
-<source>Synchronization stopped</source>
-<target>Suvienodinimas sustabdytas</target>
+<source>Cleaning up old log files...</source>
+<target>Išvalomi seni žurnalo įrašai...</target>
<source>Stopped</source>
<target>Sustabdyta</target>
-<source>Synchronization completed with errors</source>
-<target>Suvienodinimas baigtas su klaidomis</target>
+<source>Completed with errors</source>
+<target>Užbaigtas su klaidomis</target>
-<source>Synchronization completed with warnings</source>
-<target>Suvienodinimas baigtas su perspėjimais</target>
+<source>Completed with warnings</source>
+<target>Užbaigtas su perspėjimais</target>
<source>Warning</source>
<target>Perspėjimas</target>
@@ -760,15 +770,12 @@ Komanda inicijuojama jei:
<source>Nothing to synchronize</source>
<target>Nėra ko suvienodinti</target>
-<source>Synchronization completed successfully</source>
-<target>Suvienodinimas sėkmingai baigtas</target>
+<source>Completed successfully</source>
+<target>Sėkmingai užbaigtas</target>
<source>Executing command %x</source>
<target>Vykdyti komandą %x</target>
-<source>Cleaning up old log files...</source>
-<target>Išvalomi seni žurnalo įrašai...</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>
@@ -784,15 +791,8 @@ Komanda inicijuojama jei:
<source>Switching to FreeFileSync's main window</source>
<target>Perjungti į FreeFileSync pagrindinį langą</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Automatinis pakartojimas po %x sekundės...</pluralform>
-<pluralform>Automatinis pakartojimas po %x sekundžių...</pluralform>
-<pluralform>Automatinis pakartojimas po %x sekundžių...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Automatinis paleidimas iš naujo</target>
<source>Ignore &all</source>
<target>Ignoruoti &visus</target>
@@ -803,6 +803,28 @@ Komanda inicijuojama jei:
<source>Serious Error</source>
<target>Rimta klaida</target>
+<source>Last session</source>
+<target>Paskutinė sesija</target>
+
+<source>Today</source>
+<target>Šiandien</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x diena</pluralform>
+<pluralform>%x dienos</pluralform>
+<pluralform>%x dienų</pluralform>
+</target>
+
+<source>Name</source>
+<target>Pavadinimas</target>
+
+<source>Last sync</source>
+<target>Vėliausias</target>
+
<source>Folder</source>
<target>Aplankas</target>
@@ -866,9 +888,6 @@ Komanda inicijuojama jei:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Prašome pasirinkti aplanką vietinėje failų sistemoje, tinkle arba MTP įrenginyje.</target>
-<source>&New</source>
-<target>&Naujas</target>
-
<source>&Save</source>
<target>&Išsaugoti</target>
@@ -980,6 +999,9 @@ Komanda inicijuojama jei:
<source>Total bytes to copy</source>
<target>Viso baitų kopijuoti</target>
+<source>Arrange folder pair</source>
+<target>Sulygiuoti pagal aplanko porą</target>
+
<source>Folder pair:</source>
<target>Aplanko pora:</target>
@@ -1072,11 +1094,14 @@ Komanda inicijuojama jei:
<source>Naming convention:</source>
<target>Pavadinimų taisyklės:</target>
-<source>&Ignore errors</source>
-<target>&Ignoruoti klaidas</target>
+<source>Ignore errors</source>
+<target>Ignoruoti klaidas</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Rodyti pranešimą esant klaidoms ar perspėjimams</target>
+<source>Retry count:</source>
+<target>Skaičiuoti is naujo:</target>
+
+<source>Delay (in seconds):</source>
+<target>Uždelsimas (sekundėmis):</target>
<source>Run a command after synchronization:</source>
<target>Po sinchronizavimo vykdyti komandą:</target>
@@ -1084,9 +1109,6 @@ Komanda inicijuojama jei:
<source>OK</source>
<target>Gerai</target>
-<source>Arrange folder pair</source>
-<target>Sulygiuoti pagal aplanko porą</target>
-
<source>Enter your login details:</source>
<target>Įveskite išsamią prisijungimo informaciją:</target>
@@ -1183,12 +1205,12 @@ Komanda inicijuojama jei:
<source>Minimize to notification area</source>
<target>Nuleisti į apačią dešinėje</target>
-<source>Bytes copied:</source>
-<target>Nukopijuota baitų:</target>
-
<source>When finished:</source>
<target>Kai pabaigta:</target>
+<source>Auto-close</source>
+<target>Automatiškai uždaryti</target>
+
<source>Close</source>
<target>Uždaryti</target>
@@ -1201,12 +1223,18 @@ Komanda inicijuojama jei:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Sukurti paleidimo failą suvienodinimui be priežiūros. Norint jį paleisti reikia paspausti and failo du kartus pele arba nustatyti su užduočių planuotoju: %x</target>
+<source>Progress dialog:</source>
+<target>Eiga:</target>
+
<source>Run minimized</source>
<target>Vykdyti sumažinus</target>
<source>&Show error dialog</source>
<target>&Rodyti klaidų dialogą</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Rodyti pranešimą esant klaidoms ar perspėjimams</target>
+
<source>&Cancel</source>
<target>&Uždaryti</target>
@@ -1255,14 +1283,11 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Transfer file and folder permissions.</source>
<target>Failų ir aplankų perkėlimo leidimai.</target>
-<source>Automatic retry on error:</source>
-<target>Automatinis pakartojimas klaidos atveju:</target>
-
-<source>Retry count:</source>
-<target>Skaičiuoti is naujo:</target>
+<source>Show hidden dialogs again</source>
+<target>Vėl rodyti paslėptus dialogo langus</target>
-<source>Delay (in seconds):</source>
-<target>Uždelsimas (sekundėmis):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Vėl rodyti visus paslėptus dialogo langus ir įspėjamuosius pranešimus</target>
<source>Customize context menu:</source>
<target>Pagrindinio meniu pasirinkimai:</target>
@@ -1270,12 +1295,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Description</source>
<target>Apibūdinimas</target>
-<source>Show hidden dialogs again</source>
-<target>Vėl rodyti paslėptus dialogo langus</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Vėl rodyti visus paslėptus dialogo langus ir įspėjamuosius pranešimus</target>
-
<source>&Default</source>
<target>&Numatyta</target>
@@ -1330,14 +1349,23 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Activate offline</source>
<target>Aktyvuoti neprisijungus</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Paryškinti parametrus kurie nebuvo vykdomi daugiau nei dienų:</target>
+
+<source>Synchronization Settings</source>
+<target>Suvienodinimo parametrai</target>
+
+<source>Access Online Storage</source>
+<target>Pasiekti Suagyklą Internete</target>
+
<source>Save as a Batch Job</source>
<target>Išsuagoti kaip paketinį failą</target>
<source>Delete Items</source>
<target>Pašalinti elementai</target>
-<source>Copy items</source>
-<target>Kopijuoti elementus</target>
+<source>Copy Items</source>
+<target>Kopijuoti Elementus</target>
<source>Options</source>
<target>Parinktys</target>
@@ -1348,6 +1376,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donoro Versija</target>
+<source>Highlight Configurations</source>
+<target>Pažymėti Nustatymus</target>
+
<source>&Options</source>
<target>&Parinktys</target>
@@ -1475,9 +1506,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Select time span...</source>
<target>Pasirinkti laiko tarpą...</target>
-<source>Last session</source>
-<target>Paskutinė sesija</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Aplankų Palyginimas ir Suvienodinimas</target>
@@ -1496,8 +1524,11 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Do&n't save</source>
<target>&Nesaugoti</target>
-<source>Remove entry from list</source>
-<target>Pašalinti įrašą iš sarašo</target>
+<source>Hide configuration</source>
+<target>Paslėpti nustatymus</target>
+
+<source>Highlight...</source>
+<target>Pažymėti...</target>
<source>Clear filter</source>
<target>Panaikinti filtrą</target>
@@ -1577,6 +1608,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Paused</source>
<target>Pristabdyta</target>
+<source>Stop requested...</source>
+<target>Stabdomas užklausimas...</target>
+
<source>Initializing...</source>
<target>Pradedama...</target>
@@ -1586,9 +1620,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Comparing content...</source>
<target>Palyginimo turinys...</target>
-<source>Completed</source>
-<target>Baigta</target>
-
<source>Info</source>
<target>Informacija</target>
@@ -1673,12 +1704,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Parameters for opposite side</source>
<target>Parametrai priešingai pusei</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>
-
-<source>&Show</source>
-<target>&Rodyti</target>
-
<source>Downloading update...</source>
<target>Siunčiamas atanujinimas...</target>
@@ -1703,18 +1728,12 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Configure your own synchronization rules.</source>
<target>Nustatyti Jūsų pačių suvienodinimo taisykles.</target>
-<source>Synchronization Settings</source>
-<target>Suvienodinimo parametrai</target>
-
<source>Comparison</source>
<target>Palyginimas</target>
<source>Synchronization</source>
<target>Suvienodinimas</target>
-<source>Today</source>
-<target>Šiandien</target>
-
<source>This week</source>
<target>Ši savaitė</target>
@@ -1784,9 +1803,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Files</source>
<target>Failai</target>
-<source>Name</source>
-<target>Pavadinimas</target>
-
<source>Percentage</source>
<target>Procentai</target>
@@ -1900,16 +1916,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<pluralform>%x valandų</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>%x diena</pluralform>
-<pluralform>%x dienos</pluralform>
-<pluralform>%x dienų</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Nepavyksta nustatyti privilegijos %x.</target>
@@ -1973,8 +1979,11 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Desktop</source>
<target>Darbalaukis</target>
-<source>Start menu</source>
-<target>Pradėti meniu</target>
+<source>Start Menu</source>
+<target>Pradžios Meniu</target>
+
+<source>Send To</source>
+<target>Siųsti Į</target>
<source>Registering FreeFileSync file extensions</source>
<target>Registruojami FreeFileSync failų plėtiniai</target>
@@ -2003,6 +2012,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Prašome pasirinkti vietinio įdiegimo metodą arba pakeiskite aplaką.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Tylusis įdiegimo rėžimas galimas tik tai FreeFileSync Donoro Versijoje.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>%x įdiegiamoji parinktis yra tiktai FreeFileSync Donoro Versijoje.</target>
diff --git a/FreeFileSync/Build/Languages/norwegian.lng b/FreeFileSync/Build/Languages/norwegian.lng
index 8fd5f8e0..f7829a75 100755
--- a/FreeFileSync/Build/Languages/norwegian.lng
+++ b/FreeFileSync/Build/Languages/norwegian.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Syntaksfeil</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>En venstre og en høyre katalogbane forventes etter %x.</target>
+
<source>Cannot find file %x.</source>
<target>Kan ikke finne filen %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Hvis denne feilen blir ignorert vil mappene bli vurdert som tomme. Manglende mapper opprettes automatisk ved behov.</target>
+<source>Comparison finished:</source>
+<target>Sammenligning ferdig:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 punkt funnet</pluralform>
+<pluralform>%x punkter funnet</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Filen %x har en ugyldig dato.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Bruk av ikke-standard globale innstillinger:</target>
-<source>Starting comparison</source>
-<target>Starter sammenligning</target>
-
<source>A folder input field is empty.</source>
<target>Der er ikke skrevet inn noe mappenavn.</target>
@@ -318,15 +330,15 @@ Faktisk: %y bytes
<source>Unable to move %x to the recycle bin.</source>
<target>Kunne ikke flytte %x til papirkurven.</target>
+<source>Cannot find %x.</source>
+<target>Kan ikke finne %x.</target>
+
<source>Cannot open file %x.</source>
<target>Kan ikke åpne filen %x.</target>
<source>Cannot find device %x.</source>
<target>Kan ikke finne enhet %x.</target>
-<source>Cannot find %x.</source>
-<target>Kan ikke finne %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Elementtypen %x støttes ikke:</target>
@@ -432,6 +444,9 @@ Faktisk: %y bytes
<source>Lock owner:</source>
<target>Lås eier:</target>
+<source>Detecting abandoned lock...</source>
+<target>Finner etterlatt lås...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Faktisk: %y bytes
<pluralform>%x sek</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Finner etterlatt lås...</target>
-
<source>Items processed:</source>
<target>Elementer behandlet:</target>
@@ -456,8 +468,8 @@ Faktisk: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Behandlingsfeil i filen %x, rad %y, kolonne %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Kan ikke låse katalogen %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Kan ikke angi kataloglås for følgende mapper:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Faktisk: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>Volumnavnet %x er ikke en del av filstien %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Avbryter: Venter til aktuell oppgave avsluttes...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Kan ikke opprette tidsstempel til versjonen:</target>
@@ -513,6 +522,9 @@ Faktisk: %y bytes
<source>Select a folder</source>
<target>Velg en mappe</target>
+<source>&New</source>
+<target>&Ny</target>
+
<source>&Open...</source>
<target>&Åpne...</target>
@@ -728,26 +740,23 @@ Kommandoen utføres hvis:
<source>job name</source>
<target>jobbnavn</target>
-<source>Show summary</source>
-<target>Vis sammendrag</target>
+<source>System: Sleep</source>
+<target>System: Sov</target>
-<source>Sleep</source>
-<target>Hvilemodus</target>
+<source>System: Shut down</source>
+<target>System: Avslutt</target>
-<source>Shut down</source>
-<target>Avslutt</target>
-
-<source>Synchronization stopped</source>
-<target>Synkroniseringen stoppet</target>
+<source>Cleaning up old log files...</source>
+<target>Fjerner gamle loggfiler...</target>
<source>Stopped</source>
<target>Stoppet</target>
-<source>Synchronization completed with errors</source>
-<target>Synkronisering gjennomført med feil</target>
+<source>Completed with errors</source>
+<target>Avsluttet med feil</target>
-<source>Synchronization completed with warnings</source>
-<target>Synkronisering gjennomført med advarsler</target>
+<source>Completed with warnings</source>
+<target>Avsluttet med advarsler</target>
<source>Warning</source>
<target>Advarsel</target>
@@ -755,15 +764,12 @@ Kommandoen utføres hvis:
<source>Nothing to synchronize</source>
<target>Alt er synkronisert</target>
-<source>Synchronization completed successfully</source>
-<target>Synkronisering gjennomført uten feil</target>
+<source>Completed successfully</source>
+<target>Fullførte feilfritt</target>
<source>Executing command %x</source>
<target>Utfør kommandoen %x</target>
-<source>Cleaning up old log files...</source>
-<target>Fjerner gamle loggfiler...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Du kan skifte til FreeFileSync's hovedvindu for at løse dette problemet.</target>
@@ -779,14 +785,8 @@ Kommandoen utføres hvis:
<source>Switching to FreeFileSync's main window</source>
<target>Skifter til FreeFileSync's hovedvindu</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Prøver igjen om 1 sekund...</pluralform>
-<pluralform>Prøver igjen om %x sekunder...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Prøv igjen automatisk</target>
<source>Ignore &all</source>
<target>Ignorer &alt</target>
@@ -797,6 +797,27 @@ Kommandoen utføres hvis:
<source>Serious Error</source>
<target>Kritisk feil</target>
+<source>Last session</source>
+<target>Siste oppgave</target>
+
+<source>Today</source>
+<target>I dag</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dag</pluralform>
+<pluralform>%x dager</pluralform>
+</target>
+
+<source>Name</source>
+<target>Navn</target>
+
+<source>Last sync</source>
+<target>Sist synkronisert</target>
+
<source>Folder</source>
<target>Mappe</target>
@@ -860,9 +881,6 @@ Kommandoen utføres hvis:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Velg en mappe på lokalt filsystem, nettverk eller på en MTP-enhet.</target>
-<source>&New</source>
-<target>&Ny</target>
-
<source>&Save</source>
<target>&Lagre</target>
@@ -974,6 +992,9 @@ Kommandoen utføres hvis:
<source>Total bytes to copy</source>
<target>Antall bytes som kopieres</target>
+<source>Arrange folder pair</source>
+<target>Ordne mappepar</target>
+
<source>Folder pair:</source>
<target>Mappepar:</target>
@@ -1066,11 +1087,14 @@ Kommandoen utføres hvis:
<source>Naming convention:</source>
<target>Navne-regler:</target>
-<source>&Ignore errors</source>
-<target>&Ignorer feil</target>
+<source>Ignore errors</source>
+<target>Ignorér feil</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Vis feilmeldinger og advarsler</target>
+<source>Retry count:</source>
+<target>Antall forsøk:</target>
+
+<source>Delay (in seconds):</source>
+<target>Forsinkelse (i sekunder):</target>
<source>Run a command after synchronization:</source>
<target>Kjør en kommando etter synkronisering:</target>
@@ -1078,9 +1102,6 @@ Kommandoen utføres hvis:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Ordne mappepar</target>
-
<source>Enter your login details:</source>
<target>Skriv inn dine innloggingsdetaljer:</target>
@@ -1177,12 +1198,12 @@ Kommandoen utføres hvis:
<source>Minimize to notification area</source>
<target>Minimér til status-feltet</target>
-<source>Bytes copied:</source>
-<target>Byte kopiert:</target>
-
<source>When finished:</source>
<target>Når ferdig:</target>
+<source>Auto-close</source>
+<target>Auto-lukk</target>
+
<source>Close</source>
<target>Lukk</target>
@@ -1195,12 +1216,18 @@ Kommandoen utføres hvis:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Lag en batchfil til automatisk synkronisering. Start ved å dobbeltklikke på filen eller planlegg via oppgaveplanlegger: %x</target>
+<source>Progress dialog:</source>
+<target>Fremdriftsdialog:</target>
+
<source>Run minimized</source>
<target>Kjør minimert</target>
<source>&Show error dialog</source>
<target>& Vis feildialogboksen</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Vis feilmeldinger og advarsler</target>
+
<source>&Cancel</source>
<target>&Avbryt</target>
@@ -1249,14 +1276,11 @@ Sikrer prosessen ved alvorlige feil.
<source>Transfer file and folder permissions.</source>
<target>Overfør fil- og mappe-tillatelser.</target>
-<source>Automatic retry on error:</source>
-<target>Gjør automatisk nytt forsøk ved feil:</target>
-
-<source>Retry count:</source>
-<target>Antall forsøk:</target>
+<source>Show hidden dialogs again</source>
+<target>Vis skjulte vinduer igjen</target>
-<source>Delay (in seconds):</source>
-<target>Forsinkelse (i sekunder):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Vis alle skjulte vinduer og advarsler igjen</target>
<source>Customize context menu:</source>
<target>Tilpass kontekst-meny:</target>
@@ -1264,12 +1288,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Description</source>
<target>Beskrivelse</target>
-<source>Show hidden dialogs again</source>
-<target>Vis skjulte vinduer igjen</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Vis alle skjulte vinduer og advarsler igjen</target>
-
<source>&Default</source>
<target>&Standard</target>
@@ -1324,14 +1342,23 @@ Sikrer prosessen ved alvorlige feil.
<source>Activate offline</source>
<target>Aktivér frakoplet</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Uthev konfigurasjoner som ikke har blitt kjørt for mer enn følgende antall dager:</target>
+
+<source>Synchronization Settings</source>
+<target>Synkroniserings-innstillinger</target>
+
+<source>Access Online Storage</source>
+<target>Få tilgang til nettverkslagring</target>
+
<source>Save as a Batch Job</source>
<target>Lagre som en batchjobb</target>
<source>Delete Items</source>
<target>Slett elementene</target>
-<source>Copy items</source>
-<target>Kopier elementene</target>
+<source>Copy Items</source>
+<target>Kopiér elementer</target>
<source>Options</source>
<target>Valg</target>
@@ -1342,6 +1369,9 @@ Sikrer prosessen ved alvorlige feil.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Uthev konfigurasjoner</target>
+
<source>&Options</source>
<target>&Valg</target>
@@ -1465,9 +1495,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Select time span...</source>
<target>Velg tidsinterval...</target>
-<source>Last session</source>
-<target>Siste oppgave</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Mappe-sammenligning og synkronisering</target>
@@ -1486,8 +1513,11 @@ Sikrer prosessen ved alvorlige feil.
<source>Do&n't save</source>
<target>&Ikke lagre</target>
-<source>Remove entry from list</source>
-<target>Fjern valget fra listen</target>
+<source>Hide configuration</source>
+<target>Skjul konfigurasjoner</target>
+
+<source>Highlight...</source>
+<target>Uthev...</target>
<source>Clear filter</source>
<target>Slett filter</target>
@@ -1567,6 +1597,9 @@ Sikrer prosessen ved alvorlige feil.
<source>Paused</source>
<target>Pauset</target>
+<source>Stop requested...</source>
+<target>Stopp forespurt...</target>
+
<source>Initializing...</source>
<target>Forbereder...</target>
@@ -1576,9 +1609,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Comparing content...</source>
<target>Sammenligner innhold...</target>
-<source>Completed</source>
-<target>Gjennomført</target>
-
<source>Info</source>
<target>Info</target>
@@ -1660,12 +1690,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Parameters for opposite side</source>
<target>Parametere for motsatt side</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Vis gjemte vinduer og advarsler igjen?</target>
-
-<source>&Show</source>
-<target>&Vis</target>
-
<source>Downloading update...</source>
<target>Laster ned oppdatering...</target>
@@ -1690,18 +1714,12 @@ Sikrer prosessen ved alvorlige feil.
<source>Configure your own synchronization rules.</source>
<target>Opprett dine egne synkroniseringsregler.</target>
-<source>Synchronization Settings</source>
-<target>Synkroniserings-innstillinger</target>
-
<source>Comparison</source>
<target>Sammenligning</target>
<source>Synchronization</source>
<target>Synkronisering</target>
-<source>Today</source>
-<target>I dag</target>
-
<source>This week</source>
<target>Denne uke</target>
@@ -1771,9 +1789,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Files</source>
<target>Filer</target>
-<source>Name</source>
-<target>Navn</target>
-
<source>Percentage</source>
<target>Prosent</target>
@@ -1885,15 +1900,6 @@ Sikrer prosessen ved alvorlige feil.
<pluralform>%x timer</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 dag</pluralform>
-<pluralform>%x dager</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Kan ikke sette privilegier %x.</target>
@@ -1957,8 +1963,11 @@ Sikrer prosessen ved alvorlige feil.
<source>Desktop</source>
<target>Skrivebord</target>
-<source>Start menu</source>
-<target>Startmeny</target>
+<source>Start Menu</source>
+<target>Start-meny</target>
+
+<source>Send To</source>
+<target>Send til</target>
<source>Registering FreeFileSync file extensions</source>
<target>Registrerer FreeFileSync's filendelser</target>
@@ -1987,6 +1996,6 @@ Sikrer prosessen ved alvorlige feil.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Velg den lokale installasjonstype eller velge en annen mappe for installasjon.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Den tause installasjonsmodus er bare tilgjengelig i FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>Installasjonsalternativet %x er bare tilgjengelig i FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Languages/polish.lng b/FreeFileSync/Build/Languages/polish.lng
index 6ba18981..077c5115 100755
--- a/FreeFileSync/Build/Languages/polish.lng
+++ b/FreeFileSync/Build/Languages/polish.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Błąd składni</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target></target>
+
<source>Cannot find file %x.</source>
<target>Nie można odnaleźć pliku %x.</target>
@@ -115,6 +118,16 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Jeżeli ten błąd zostanie zignorowany, katalogi zostaną uznane za puste. Brakujące katalogi będą w razie potrzeby utworzone automatycznie.</target>
+<source>Comparison finished:</source>
+<target></target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Plik %x ma nieprawidłową datę.</target>
@@ -175,9 +188,6 @@
<source>Using non-default global settings:</source>
<target>Wykorzystane niestandardowe ustawienia globalne:</target>
-<source>Starting comparison</source>
-<target>Kompresowanie</target>
-
<source>A folder input field is empty.</source>
<target>Pole katalog źródłowy jest puste.</target>
@@ -318,15 +328,15 @@ Przesłany: %y bajtów
<source>Unable to move %x to the recycle bin.</source>
<target>Nie można przenieść %x do kosza.</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 find %x.</source>
-<target>Nie można odnaleźć %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Element typu %x nie jest wspierany:</target>
@@ -435,6 +445,9 @@ Przesłany: %y bajtów
<source>Lock owner:</source>
<target>Właściciel blokady:</target>
+<source>Detecting abandoned lock...</source>
+<target>Wykrywanie nieaktywnej blokady...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -445,9 +458,6 @@ Przesłany: %y bajtów
<pluralform>%x sekund</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Wykrywanie nieaktywnej blokady...</target>
-
<source>Items processed:</source>
<target>Przetworzone elementy:</target>
@@ -460,8 +470,8 @@ Przesłany: %y bajtów
<source>Error parsing file %x, row %y, column %z.</source>
<target>Błąd podczas parsowania pliku %x, rząd %y, kolumna %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Nie można utworzyć blokady dla katalogu %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target></target>
<source>
<pluralform>1 thread</pluralform>
@@ -503,9 +513,6 @@ Przesłany: %y bajtów
<source>Volume name %x is not part of file path %y.</source>
<target>Nazwa zasobu %x ni jest częścią ścieżki %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Przerwanie: Oczekiwanie na zakończenie aktualnej operacji...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Nie można utworzyć znacznika czasu:</target>
@@ -518,6 +525,9 @@ Przesłany: %y bajtów
<source>Select a folder</source>
<target>Wybierz katalog</target>
+<source>&New</source>
+<target>&Nowy</target>
+
<source>&Open...</source>
<target>&Otwórz...</target>
@@ -733,26 +743,23 @@ Komenda jest wykonywana gdy:
<source>job name</source>
<target>nazwa zadania</target>
-<source>Show summary</source>
-<target>Pokaż podsumowanie</target>
+<source>System: Sleep</source>
+<target></target>
-<source>Sleep</source>
-<target>Stan uśpienia</target>
+<source>System: Shut down</source>
+<target></target>
-<source>Shut down</source>
-<target>Wyłącz komputer</target>
-
-<source>Synchronization stopped</source>
-<target>Synchronizacja przerwana</target>
+<source>Cleaning up old log files...</source>
+<target>Usuwanie starych plików logów...</target>
<source>Stopped</source>
<target>Zatrzymana</target>
-<source>Synchronization completed with errors</source>
-<target>Synchronizacja zakończona z błędami</target>
+<source>Completed with errors</source>
+<target></target>
-<source>Synchronization completed with warnings</source>
-<target>Synchronizacja zakończona z ostrzeżeniami</target>
+<source>Completed with warnings</source>
+<target></target>
<source>Warning</source>
<target>Ostrzeżenie</target>
@@ -760,15 +767,12 @@ Komenda jest wykonywana gdy:
<source>Nothing to synchronize</source>
<target>Brak plików do synchronizacji</target>
-<source>Synchronization completed successfully</source>
-<target>Synchronizacja zakończona pomyślnie</target>
+<source>Completed successfully</source>
+<target></target>
<source>Executing command %x</source>
<target>Wykonywanie polecenia %x</target>
-<source>Cleaning up old log files...</source>
-<target>Usuwanie starych plików logów...</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>
@@ -784,15 +788,8 @@ Komenda jest wykonywana gdy:
<source>Switching to FreeFileSync's main window</source>
<target>Przejdź do głównego okna FreeFileSync.</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Automatyczne ponowienie za 1 sekundę...</pluralform>
-<pluralform>Automatyczne ponowienie za %x sekundy...</pluralform>
-<pluralform>Automatyczne ponowienie za %x sekund...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target></target>
<source>Ignore &all</source>
<target>Ignoruj &wszystkie</target>
@@ -803,6 +800,28 @@ Komenda jest wykonywana gdy:
<source>Serious Error</source>
<target>Poważny błąd</target>
+<source>Last session</source>
+<target>Ostatnia sesja</target>
+
+<source>Today</source>
+<target>Dzisiaj</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dzień</pluralform>
+<pluralform>%x dni</pluralform>
+<pluralform>%x dni</pluralform>
+</target>
+
+<source>Name</source>
+<target>Nazwa</target>
+
+<source>Last sync</source>
+<target></target>
+
<source>Folder</source>
<target>Katalog</target>
@@ -866,9 +885,6 @@ Komenda jest wykonywana gdy:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Okreś katalog lokalny, sieciowy bądź urządzenie MTP.</target>
-<source>&New</source>
-<target>&Nowy</target>
-
<source>&Save</source>
<target>&Zapisz</target>
@@ -980,6 +996,9 @@ Komenda jest wykonywana gdy:
<source>Total bytes to copy</source>
<target>Całkowity rozmiar do skopiowania</target>
+<source>Arrange folder pair</source>
+<target>Uporządkuj parę katalogów</target>
+
<source>Folder pair:</source>
<target>Para folderów:</target>
@@ -1072,11 +1091,14 @@ Komenda jest wykonywana gdy:
<source>Naming convention:</source>
<target>Konwencja nazewnictwa:</target>
-<source>&Ignore errors</source>
-<target>&Ignoruj błędy</target>
+<source>Ignore errors</source>
+<target></target>
-<source>Show pop-up on errors or warnings</source>
-<target>Pokazuj okna pop-up dla błędów i ostrzeżeń</target>
+<source>Retry count:</source>
+<target>Liczba prób:</target>
+
+<source>Delay (in seconds):</source>
+<target>Opóźnienie (w sekundach):</target>
<source>Run a command after synchronization:</source>
<target>Uruchom komendę po zakończonej synchronizacji:</target>
@@ -1084,9 +1106,6 @@ Komenda jest wykonywana gdy:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Uporządkuj parę katalogów</target>
-
<source>Enter your login details:</source>
<target>Wprowadź dane do logowania:</target>
@@ -1183,12 +1202,12 @@ Komenda jest wykonywana gdy:
<source>Minimize to notification area</source>
<target>Minimalizuj do obszaru powiadomień</target>
-<source>Bytes copied:</source>
-<target>Skopiowano bajtów:</target>
-
<source>When finished:</source>
<target>Gdy zakończono:</target>
+<source>Auto-close</source>
+<target></target>
+
<source>Close</source>
<target>Zamknij</target>
@@ -1201,12 +1220,18 @@ Komenda jest wykonywana gdy:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Utwórz plik wsadowy do zautomatyzowania procesu synchronizacji. Aby rozpocząć, klknij dwa razy plik lub zaplanuj zadanie w harmonogramie zadań: %x</target>
+<source>Progress dialog:</source>
+<target></target>
+
<source>Run minimized</source>
<target>Uruchom zminimalizowane</target>
<source>&Show error dialog</source>
<target>&Pokaż powiadomienie z błędem</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Pokazuj okna pop-up dla błędów i ostrzeżeń</target>
+
<source>&Cancel</source>
<target>&Anuluj</target>
@@ -1255,14 +1280,11 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Transfer file and folder permissions.</source>
<target>kopiuj uprawnienia plików i katalogów.</target>
-<source>Automatic retry on error:</source>
-<target>Automatyczne ponowienie operacji podczas błędu:</target>
-
-<source>Retry count:</source>
-<target>Liczba prób:</target>
+<source>Show hidden dialogs again</source>
+<target>Przywróć ukryte dialogi</target>
-<source>Delay (in seconds):</source>
-<target>Opóźnienie (w sekundach):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Przywróć wszystkie, stale ukryte dialogi i powiadomienia</target>
<source>Customize context menu:</source>
<target>Dostosuj menu kontekstowe:</target>
@@ -1270,12 +1292,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Description</source>
<target>Opis</target>
-<source>Show hidden dialogs again</source>
-<target>Przywróć ukryte dialogi</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Przywróć wszystkie, stale ukryte dialogi i powiadomienia</target>
-
<source>&Default</source>
<target>&Domyślne</target>
@@ -1330,14 +1346,23 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Activate offline</source>
<target>Aktywuj offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target></target>
+
+<source>Synchronization Settings</source>
+<target>Ustawienia synchronizacji</target>
+
+<source>Access Online Storage</source>
+<target></target>
+
<source>Save as a Batch Job</source>
<target>Zapisz jako plik wsadowy.</target>
<source>Delete Items</source>
<target>Usuń elementy</target>
-<source>Copy items</source>
-<target>Kopiuj element</target>
+<source>Copy Items</source>
+<target></target>
<source>Options</source>
<target>Opcje</target>
@@ -1348,6 +1373,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target></target>
+
<source>&Options</source>
<target>&Opcje</target>
@@ -1475,9 +1503,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Select time span...</source>
<target>Określ przedział czasowy...</target>
-<source>Last session</source>
-<target>Ostatnia sesja</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Porównywanie i Synchronizacja folderów</target>
@@ -1496,8 +1521,11 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Do&n't save</source>
<target>&Nie zapisuj</target>
-<source>Remove entry from list</source>
-<target>Usuń wpis z listy</target>
+<source>Hide configuration</source>
+<target></target>
+
+<source>Highlight...</source>
+<target></target>
<source>Clear filter</source>
<target>Wyczyść filtr</target>
@@ -1577,6 +1605,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Paused</source>
<target>Pauza</target>
+<source>Stop requested...</source>
+<target></target>
+
<source>Initializing...</source>
<target>Inicjalizacja...</target>
@@ -1586,9 +1617,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Comparing content...</source>
<target>Porównywanie zawartości...</target>
-<source>Completed</source>
-<target>Zakończono</target>
-
<source>Info</source>
<target>Info</target>
@@ -1673,12 +1701,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Parameters for opposite side</source>
<target>Parametry dla strony przeciwnej</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Przywrócić ukryte dialogi i powiadomienia?</target>
-
-<source>&Show</source>
-<target>&Przywróć</target>
-
<source>Downloading update...</source>
<target>Pobieranie aktualizacji...</target>
@@ -1703,18 +1725,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Configure your own synchronization rules.</source>
<target>Skonfiguruj swoje własne reguły synchronizacji.</target>
-<source>Synchronization Settings</source>
-<target>Ustawienia synchronizacji</target>
-
<source>Comparison</source>
<target>Porównanie</target>
<source>Synchronization</source>
<target>Synchronizacja</target>
-<source>Today</source>
-<target>Dzisiaj</target>
-
<source>This week</source>
<target>W tym tygodniu</target>
@@ -1784,9 +1800,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Files</source>
<target>Pliki</target>
-<source>Name</source>
-<target>Nazwa</target>
-
<source>Percentage</source>
<target>Procentowo</target>
@@ -1900,16 +1913,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<pluralform>%x godzin</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 dzień</pluralform>
-<pluralform>%x dni</pluralform>
-<pluralform>%x dni</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Nie można ustawić uprawnień %x.</target>
@@ -1973,8 +1976,11 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Desktop</source>
<target>Na Pulpicie</target>
-<source>Start menu</source>
-<target>Menu Start</target>
+<source>Start Menu</source>
+<target></target>
+
+<source>Send To</source>
+<target></target>
<source>Registering FreeFileSync file extensions</source>
<target>Rejestrowanie rozszerzeń plików FreeFileSync</target>
@@ -2003,6 +2009,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Wybierz lokalny typ instalacji lub określ inny katalog.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Konsolowy tryb instalacji dostępny jest tylko w wersji FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target></target>
diff --git a/FreeFileSync/Build/Languages/portuguese.lng b/FreeFileSync/Build/Languages/portuguese.lng
index fc969793..493c0a0b 100755
--- a/FreeFileSync/Build/Languages/portuguese.lng
+++ b/FreeFileSync/Build/Languages/portuguese.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Erro de sintaxe</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>É esperado um caminho de directório esquerdo e direito após %x.</target>
+
<source>Cannot find file %x.</source>
<target>Não é possível encontrar o ficheiro %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Se este erro é ignorado as pastas serão consideradas vazias. Pastas ausentes são criados automaticamente quando necessário.</target>
+<source>Comparison finished:</source>
+<target>Comparação terminada:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 item encontrado</pluralform>
+<pluralform>%x itens encontrados</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Ficheiro %x tem data inválida.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Usando definições globais não predefinidas:</target>
-<source>Starting comparison</source>
-<target>A iniciar a comparação</target>
-
<source>A folder input field is empty.</source>
<target>Um dos campos de directório para comparar está vazio.</target>
@@ -318,15 +330,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</source>
<target>Não é possível mover %x para a reciclagem.</target>
+<source>Cannot find %x.</source>
+<target>Não é possível encontrar %x.</target>
+
<source>Cannot open file %x.</source>
<target>Não é possível abrir o ficheiro %x.</target>
<source>Cannot find device %x.</source>
<target>Não é possível encontrar o dispositivo %x.</target>
-<source>Cannot find %x.</source>
-<target>Não é possível encontrar %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Tipo de item %x não é suportado:</target>
@@ -432,6 +444,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>Dono do bloqueio:</target>
+<source>Detecting abandoned lock...</source>
+<target>Detectado bloqueio abandonado...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Actual: %y bytes
<pluralform>%x segs</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Detectado bloqueio abandonado...</target>
-
<source>Items processed:</source>
<target>Elementos processados:</target>
@@ -456,8 +468,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Erro ao analisar ficheiro %x, linha %y, coluna %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Não é possível colocar o bloqueio de directório para %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Incapaz de definir bloqueios de directórios para as seguintes pastas:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>Nome de volume %x não faz parte do caminho do ficheiro %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Paragem solicitada: À espera que termine a operação actual...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Não é possível criar data/hora para controlo de versões:</target>
@@ -513,6 +522,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>Seleccione uma pasta</target>
+<source>&New</source>
+<target>&Novo</target>
+
<source>&Open...</source>
<target>&Abrir...</target>
@@ -717,7 +729,7 @@ O comando é executado se:
<target>A pasta de versão está contida em uma pasta base.</target>
<source>Synchronizing folder pair:</source>
-<target>A cincronizar o par de pastas:</target>
+<target>A sincronizar o par de pastas:</target>
<source>Generating database...</source>
<target>A gerar base de dados...</target>
@@ -728,26 +740,23 @@ O comando é executado se:
<source>job name</source>
<target>nome da tarefa</target>
-<source>Show summary</source>
-<target>Mostrar resumo</target>
-
-<source>Sleep</source>
+<source>System: Sleep</source>
<target>Suspender</target>
-<source>Shut down</source>
+<source>System: Shut down</source>
<target>Desligar</target>
-<source>Synchronization stopped</source>
-<target>Sincronização parada</target>
+<source>Cleaning up old log files...</source>
+<target>A limpar ficheiros de log antigos...</target>
<source>Stopped</source>
<target>Parado</target>
-<source>Synchronization completed with errors</source>
-<target>Sincronização completa com erros</target>
+<source>Completed with errors</source>
+<target>Concluído com erros</target>
-<source>Synchronization completed with warnings</source>
-<target>Sincronização completa com avisos</target>
+<source>Completed with warnings</source>
+<target>Concluído com avisos</target>
<source>Warning</source>
<target>Atenção</target>
@@ -755,15 +764,12 @@ O comando é executado se:
<source>Nothing to synchronize</source>
<target>Nada a sincronizar</target>
-<source>Synchronization completed successfully</source>
-<target>Sincronização completa com sucesso</target>
+<source>Completed successfully</source>
+<target>Concluído com sucesso</target>
<source>Executing command %x</source>
<target>A executar comando %x</target>
-<source>Cleaning up old log files...</source>
-<target>A limpar ficheiros de log antigos...</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 resolver este problema.</target>
@@ -779,14 +785,8 @@ O comando é executado se:
<source>Switching to FreeFileSync's main window</source>
<target>A mudar para a janela principal do FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Repetir automaticamente dentro de 1 segundo...</pluralform>
-<pluralform>Repetir automaticamente dentro de %x segundos...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Repetir automático</target>
<source>Ignore &all</source>
<target>Ignorar &todos</target>
@@ -797,6 +797,27 @@ O comando é executado se:
<source>Serious Error</source>
<target>Erro Grave</target>
+<source>Last session</source>
+<target>Última Sessão</target>
+
+<source>Today</source>
+<target>Hoje</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dia</pluralform>
+<pluralform>%x dias</pluralform>
+</target>
+
+<source>Name</source>
+<target>Nome</target>
+
+<source>Last sync</source>
+<target>Última sincronia</target>
+
<source>Folder</source>
<target>Pasta</target>
@@ -860,9 +881,6 @@ O comando é executado se:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Seleccione a pasta no sistema de ficheiros local, rede ou dispositivo MTP.</target>
-<source>&New</source>
-<target>&Novo</target>
-
<source>&Save</source>
<target>G&uardar</target>
@@ -974,6 +992,9 @@ O comando é executado se:
<source>Total bytes to copy</source>
<target>Total em bytes a copiar</target>
+<source>Arrange folder pair</source>
+<target>Organizar par da pasta</target>
+
<source>Folder pair:</source>
<target>Par da pasta:</target>
@@ -1066,11 +1087,14 @@ O comando é executado se:
<source>Naming convention:</source>
<target>Convenção de nomes:</target>
-<source>&Ignore errors</source>
-<target>&Ignorar erros</target>
+<source>Ignore errors</source>
+<target>Ignorar erros</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Mostrar popup em caso de erros ou avisos</target>
+<source>Retry count:</source>
+<target>Nº de tentativas:</target>
+
+<source>Delay (in seconds):</source>
+<target>Atraso (em segundos):</target>
<source>Run a command after synchronization:</source>
<target>Executar um comando após a sincronização:</target>
@@ -1078,9 +1102,6 @@ O comando é executado se:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Organizar par da pasta</target>
-
<source>Enter your login details:</source>
<target>Entre os detalhes do login:</target>
@@ -1177,12 +1198,12 @@ O comando é executado se:
<source>Minimize to notification area</source>
<target>Minimizar para a área de notificação</target>
-<source>Bytes copied:</source>
-<target>Bytes copiados:</target>
-
<source>When finished:</source>
<target>Quando concluído:</target>
+<source>Auto-close</source>
+<target>Fechar quando feito</target>
+
<source>Close</source>
<target>Fechar</target>
@@ -1195,12 +1216,18 @@ O comando é executado se:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Criar ficheiro batch para sincronização automática. Para iniciar, fazer duplo clique no ficheiro ou acrescentar ao planeador de tarefas: %x</target>
+<source>Progress dialog:</source>
+<target>Diálogo de progresso:</target>
+
<source>Run minimized</source>
<target>Correr minimizado</target>
<source>&Show error dialog</source>
<target>Mo&strar diálogo de erro</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Mostrar popup em caso de erros ou avisos</target>
+
<source>&Cancel</source>
<target>&Cancelar</target>
@@ -1249,14 +1276,11 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Transfer file and folder permissions.</source>
<target>Transferir permissões de pasta e ficheiro.</target>
-<source>Automatic retry on error:</source>
-<target>Repetir automaticamente em caso de erro:</target>
-
-<source>Retry count:</source>
-<target>Nº de tentativas:</target>
+<source>Show hidden dialogs again</source>
+<target>Mostrar diálogos ocultos novamente</target>
-<source>Delay (in seconds):</source>
-<target>Atraso (em segundos):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Mostrar todos os diálogos escondidos permanentemente e mensagens de aviso novamente</target>
<source>Customize context menu:</source>
<target>Personalizar menu de contexto:</target>
@@ -1264,12 +1288,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Description</source>
<target>Descrição</target>
-<source>Show hidden dialogs again</source>
-<target>Mostrar diálogos ocultos novamente</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Mostrar todos os diálogos escondidos permanentemente e mensagens de aviso novamente</target>
-
<source>&Default</source>
<target>&Config. Iniciais</target>
@@ -1324,14 +1342,23 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Activate offline</source>
<target>Activar offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Realce configurações que não foram executadas pelo seguinte número de dias:</target>
+
+<source>Synchronization Settings</source>
+<target>Definições de Sincronização</target>
+
+<source>Access Online Storage</source>
+<target>Acessar Armazenamento Online</target>
+
<source>Save as a Batch Job</source>
<target>Salvar como Tarefa em Lote</target>
<source>Delete Items</source>
<target>Eliminar Itens</target>
-<source>Copy items</source>
-<target>Copiar elementos</target>
+<source>Copy Items</source>
+<target>Copiar Itens</target>
<source>Options</source>
<target>Opções</target>
@@ -1342,6 +1369,9 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Realçar Configurações</target>
+
<source>&Options</source>
<target>&Opções</target>
@@ -1465,9 +1495,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Select time span...</source>
<target>Seleccione o intervalo de tempo...</target>
-<source>Last session</source>
-<target>Última Sessão</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Comparação e Sincronização de Pastas</target>
@@ -1486,8 +1513,11 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Do&n't save</source>
<target>Não g&uardar</target>
-<source>Remove entry from list</source>
-<target>Remover entrada da lista</target>
+<source>Hide configuration</source>
+<target>Ocultar configuração</target>
+
+<source>Highlight...</source>
+<target>Realçar...</target>
<source>Clear filter</source>
<target>Limpar filtro</target>
@@ -1567,6 +1597,9 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Paused</source>
<target>Em pausa</target>
+<source>Stop requested...</source>
+<target>Parar pedido...</target>
+
<source>Initializing...</source>
<target>A iniciar...</target>
@@ -1576,9 +1609,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Comparing content...</source>
<target>A comparar...</target>
-<source>Completed</source>
-<target>Terminado</target>
-
<source>Info</source>
<target>Info</target>
@@ -1660,12 +1690,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Parameters for opposite side</source>
<target>Parâmetros do lado oposto</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Mostrar diálogos ocultos e mensagens de erro novamente?</target>
-
-<source>&Show</source>
-<target>&Mostrar</target>
-
<source>Downloading update...</source>
<target>A descarregar actualização...</target>
@@ -1690,18 +1714,12 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Configure your own synchronization rules.</source>
<target>Configure as suas regras de sincronização.</target>
-<source>Synchronization Settings</source>
-<target>Definições de Sincronização</target>
-
<source>Comparison</source>
<target>Comparação</target>
<source>Synchronization</source>
<target>Sincronização</target>
-<source>Today</source>
-<target>Hoje</target>
-
<source>This week</source>
<target>Esta semana</target>
@@ -1771,9 +1789,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Files</source>
<target>Ficheiros</target>
-<source>Name</source>
-<target>Nome</target>
-
<source>Percentage</source>
<target>Percentagem</target>
@@ -1885,15 +1900,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<pluralform>%x horas</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 dia</pluralform>
-<pluralform>%x dias</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Não é possível definir o privilégio %x.</target>
@@ -1957,9 +1963,12 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Desktop</source>
<target>Área de trabalho</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Menu Iniciar</target>
+<source>Send To</source>
+<target>Enviar para</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>A registar as extensões do FreeFileSync</target>
@@ -1987,6 +1996,6 @@ Isto garante um estado consistente mesmo em caso de falha grave.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Por favor, escolha o tipo do local de instalação ou seleccione uma pasta diferente para instalar.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>A instalação silenciosa somente está disponível no FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>A opção de instalação %x está disponível somente no FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Languages/portuguese_br.lng b/FreeFileSync/Build/Languages/portuguese_br.lng
index 1b80e8d1..8639ec65 100755
--- a/FreeFileSync/Build/Languages/portuguese_br.lng
+++ b/FreeFileSync/Build/Languages/portuguese_br.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Erro de sintaxe</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Um caminho de diretório esquerdo e um direito são esperados após %x.</target>
+
<source>Cannot find file %x.</source>
<target>Não é possível encontrar o arquivo %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Se o erro for ignorado, as pastas serão consideradas vazias. Pastas não encontradas serão criadas automaticamentes quando necessário.</target>
+<source>Comparison finished:</source>
+<target>Comparação finalizada:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 item encontrado</pluralform>
+<pluralform>%x itens encontrados</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>O arquivo %x tem uma data inválida.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Usando configurações globais não predefinidas:</target>
-<source>Starting comparison</source>
-<target>Iniciando comparação</target>
-
<source>A folder input field is empty.</source>
<target>Um campo de entrada de pasta está vazio.</target>
@@ -318,15 +330,15 @@ Atual: %y bytes
<source>Unable to move %x to the recycle bin.</source>
<target>Não é possível mover %x para a Lixeira.</target>
+<source>Cannot find %x.</source>
+<target>Não é possível encontrar %x.</target>
+
<source>Cannot open file %x.</source>
<target>Não é possível abrir o arquivo %x.</target>
<source>Cannot find device %x.</source>
<target>Não é possível encontrar o dispositivo %x.</target>
-<source>Cannot find %x.</source>
-<target>Não é possível encontrar %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Tipo de item %x não é suportado:</target>
@@ -432,6 +444,9 @@ Atual: %y bytes
<source>Lock owner:</source>
<target>Proprietário de bloqueio:</target>
+<source>Detecting abandoned lock...</source>
+<target>Detectando bloqueamento abandonado...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Atual: %y bytes
<pluralform>%x s</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Detectando bloqueamento abandonado...</target>
-
<source>Items processed:</source>
<target>Elementos processados:</target>
@@ -456,8 +468,8 @@ Atual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Erro analisando o arquivo %x, linha %y, coluna %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Não é possível bloquear o diretório %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Não é possível estabelecer bloqueio de diretório para as seguintes pastas:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Atual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>O nome do volume %x não faz parte do caminho do arquivo %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Interromper solicitado: Aguardando operação ser finalizada...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Não é possível criar a estampa de tempo para o controle de versões:</target>
@@ -513,6 +522,9 @@ Atual: %y bytes
<source>Select a folder</source>
<target>Selecionar uma pasta</target>
+<source>&New</source>
+<target>&Novo</target>
+
<source>&Open...</source>
<target>&Abrir...</target>
@@ -728,26 +740,23 @@ O comando é disparado se:
<source>job name</source>
<target>nome da tarefa</target>
-<source>Show summary</source>
-<target>Mostrar resumo</target>
+<source>System: Sleep</source>
+<target>Sistema: Suspender</target>
-<source>Sleep</source>
-<target>Suspender</target>
+<source>System: Shut down</source>
+<target>Sistema: Desligar</target>
-<source>Shut down</source>
-<target>Desligar</target>
-
-<source>Synchronization stopped</source>
-<target>Sincronização interrompida</target>
+<source>Cleaning up old log files...</source>
+<target>Limpando arquivo de log antigo...</target>
<source>Stopped</source>
<target>Interrompido</target>
-<source>Synchronization completed with errors</source>
-<target>Sincronização finalizada com erros</target>
+<source>Completed with errors</source>
+<target>Concluído com erros</target>
-<source>Synchronization completed with warnings</source>
-<target>Sincronização finalizada com avisos</target>
+<source>Completed with warnings</source>
+<target>Concluído com avisos</target>
<source>Warning</source>
<target>Aviso</target>
@@ -755,15 +764,12 @@ O comando é disparado se:
<source>Nothing to synchronize</source>
<target>Nada para sincronizar</target>
-<source>Synchronization completed successfully</source>
-<target>Sincronização finalizada com êxito</target>
+<source>Completed successfully</source>
+<target>Concluído com sucesso</target>
<source>Executing command %x</source>
<target>Executando comando %x</target>
-<source>Cleaning up old log files...</source>
-<target>Limpando arquivo de log antigo...</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>
@@ -779,14 +785,8 @@ O comando é disparado se:
<source>Switching to FreeFileSync's main window</source>
<target>Alternando para a janela principal do FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Nova tentativa em 1 segundo...</pluralform>
-<pluralform>Nova tentativa em %x segundos...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Nova tentativa automática</target>
<source>Ignore &all</source>
<target>Ignorar &todos</target>
@@ -797,6 +797,27 @@ O comando é disparado se:
<source>Serious Error</source>
<target>Erro Grave</target>
+<source>Last session</source>
+<target>Última sessão</target>
+
+<source>Today</source>
+<target>Hoje</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dia</pluralform>
+<pluralform>%x dias</pluralform>
+</target>
+
+<source>Name</source>
+<target>Nome</target>
+
+<source>Last sync</source>
+<target>Últ. Sinc.</target>
+
<source>Folder</source>
<target>Pasta</target>
@@ -860,9 +881,6 @@ O comando é disparado se:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Selecione uma pasta em um sistema de arquivos local, de rede ou de um dispositivo MTP.</target>
-<source>&New</source>
-<target>&Novo</target>
-
<source>&Save</source>
<target>&Salvar</target>
@@ -927,7 +945,7 @@ O comando é disparado se:
<target>Remover par de pastas</target>
<source>Access online storage</source>
-<target>Acessar armazenamento on-line</target>
+<target>Acessar armazenamento online</target>
<source>Swap sides</source>
<target>Trocar lados</target>
@@ -974,6 +992,9 @@ O comando é disparado se:
<source>Total bytes to copy</source>
<target>Bytes totais a serem copiados</target>
+<source>Arrange folder pair</source>
+<target>Organizar par de pastas</target>
+
<source>Folder pair:</source>
<target>Par de pastas:</target>
@@ -1066,11 +1087,14 @@ O comando é disparado se:
<source>Naming convention:</source>
<target>Convenção de nomenclatura:</target>
-<source>&Ignore errors</source>
-<target>&Ignorar erros</target>
+<source>Ignore errors</source>
+<target>Ignorar erros</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Mostrar pop-up em caso de erros ou avisos</target>
+<source>Retry count:</source>
+<target>Número de tentativas:</target>
+
+<source>Delay (in seconds):</source>
+<target>Atraso (em segundos):</target>
<source>Run a command after synchronization:</source>
<target>Executar um comando após a sincronização:</target>
@@ -1078,9 +1102,6 @@ O comando é disparado se:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Organizar par de pastas</target>
-
<source>Enter your login details:</source>
<target>Entre com seus dados de login:</target>
@@ -1177,12 +1198,12 @@ O comando é disparado se:
<source>Minimize to notification area</source>
<target>Minimizar para a área de notificação</target>
-<source>Bytes copied:</source>
-<target>Bytes copiados:</target>
-
<source>When finished:</source>
<target>Quando concluído:</target>
+<source>Auto-close</source>
+<target>Fechamento automático</target>
+
<source>Close</source>
<target>Fechar</target>
@@ -1195,12 +1216,18 @@ O comando é disparado se:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Criar um arquivo de tarefa em lotes para sincronização desatendida. Para iniciar, dê um clique duplo neste arquivo ou insira no agendador de tarefas: %x</target>
+<source>Progress dialog:</source>
+<target>Caixa de diálogo de progresso:</target>
+
<source>Run minimized</source>
<target>Executar minimizado</target>
<source>&Show error dialog</source>
<target>&Mostrar caixa de diálogo de erro</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Mostrar pop-up em caso de erros ou avisos</target>
+
<source>&Cancel</source>
<target>&Cancelar</target>
@@ -1249,14 +1276,11 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Transfer file and folder permissions.</source>
<target>Transferir permissões de arquivos e pastas.</target>
-<source>Automatic retry on error:</source>
-<target>Nova tentativa em caso de erro:</target>
-
-<source>Retry count:</source>
-<target>Número de tentativas:</target>
+<source>Show hidden dialogs again</source>
+<target>Mostrar caixas de diálogo ocultadas</target>
-<source>Delay (in seconds):</source>
-<target>Atraso (em segundos):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Mostrar todos as caixas de diálogo e mensagens de aviso permanentemente ocultadas</target>
<source>Customize context menu:</source>
<target>Personalizar menu de contexto:</target>
@@ -1264,12 +1288,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Description</source>
<target>Descrição</target>
-<source>Show hidden dialogs again</source>
-<target>Mostrar caixas de diálogo ocultadas</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Mostrar todos as caixas de diálogo e mensagens de aviso permanentemente ocultadas</target>
-
<source>&Default</source>
<target>&Config. Padrão</target>
@@ -1280,7 +1298,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>Se você gosta do FreeFileSync:</target>
<source>Support with a donation</source>
-<target>Apoie com uma doação.</target>
+<target>Apoie com uma doação</target>
<source>Donation details</source>
<target>Detalhes da doação</target>
@@ -1298,7 +1316,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>E-mail</target>
<source>Published under the GNU General Public License</source>
-<target>Publicado sobre a GNU General Public License</target>
+<target>Publicado sob a GNU General Public License</target>
<source>Many thanks for localization:</source>
<target>Pela tradução, um agradecimento a:</target>
@@ -1310,7 +1328,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>1. Ativar pela internet agora:</target>
<source>Activate online</source>
-<target>Ativar on-line</target>
+<target>Ativar online</target>
<source>2. Retrieve an offline activation key from the following URL:</source>
<target>2. Recuperar uma chave de ativação off-line a partir da seguinte URL:</target>
@@ -1324,14 +1342,23 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Activate offline</source>
<target>Ativar off-line</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Realçar configurações que não foram executadas a mais do seguinte número de dias:</target>
+
+<source>Synchronization Settings</source>
+<target>Configurações de Sincronização</target>
+
+<source>Access Online Storage</source>
+<target>Acessar Armazenamento Online</target>
+
<source>Save as a Batch Job</source>
<target>Salvar como um Trabalho em Lotes</target>
<source>Delete Items</source>
<target>Excluir Itens</target>
-<source>Copy items</source>
-<target>Copiar itens</target>
+<source>Copy Items</source>
+<target>Copiar Itens</target>
<source>Options</source>
<target>Opções</target>
@@ -1342,6 +1369,9 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Edição do Doador</target>
+<source>Highlight Configurations</source>
+<target>Realçar Configurações</target>
+
<source>&Options</source>
<target>&Opções</target>
@@ -1373,7 +1403,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>FreeFileSync %x está disponível!</target>
<source>Installation files are corrupted. Please reinstall FreeFileSync.</source>
-<target>Os arquivos de instalação estão corrompidos. Por favor reinstale o FreeFileSync.</target>
+<target>Os arquivos de instalação estão corrompidos. Por favor, reinstale o FreeFileSync.</target>
<source>Local path not available for %x.</source>
<target>Caminho local não disponível para %x.</target>
@@ -1442,7 +1472,7 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<target>&Copiar para...</target>
<source>&Delete</source>
-<target>&Exluir</target>
+<target>&Excluir</target>
<source>Include all</source>
<target>Incluir todos</target>
@@ -1465,9 +1495,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Select time span...</source>
<target>Selecionar intervalo de tempo...</target>
-<source>Last session</source>
-<target>Última sessão</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Comparação e Sincronização de Pastas</target>
@@ -1486,8 +1513,11 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Do&n't save</source>
<target>&Não salvar</target>
-<source>Remove entry from list</source>
-<target>Remover entrada da lista</target>
+<source>Hide configuration</source>
+<target>Ocultar configuração</target>
+
+<source>Highlight...</source>
+<target>Realçar...</target>
<source>Clear filter</source>
<target>Limpar filtro</target>
@@ -1567,6 +1597,9 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Paused</source>
<target>Pausado</target>
+<source>Stop requested...</source>
+<target>Parada solicitada...</target>
+
<source>Initializing...</source>
<target>Inicializando...</target>
@@ -1576,9 +1609,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Comparing content...</source>
<target>Comparando conteúdo...</target>
-<source>Completed</source>
-<target>Finalizado</target>
-
<source>Info</source>
<target>Informações</target>
@@ -1660,12 +1690,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Parameters for opposite side</source>
<target>Parâmetros para o lado oposto</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Mostrar caixas de diálogo e mensagens de aviso ocultadas novamente?</target>
-
-<source>&Show</source>
-<target>&Mostrar</target>
-
<source>Downloading update...</source>
<target>Baixando atualização...</target>
@@ -1690,18 +1714,12 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Configure your own synchronization rules.</source>
<target>Configure as suas próprias regras de sincronização.</target>
-<source>Synchronization Settings</source>
-<target>Configurações de Sincronização</target>
-
<source>Comparison</source>
<target>Comparação</target>
<source>Synchronization</source>
<target>Sincronização</target>
-<source>Today</source>
-<target>Hoje</target>
-
<source>This week</source>
<target>Esta semana</target>
@@ -1771,9 +1789,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Files</source>
<target>Arquivos</target>
-<source>Name</source>
-<target>Nome</target>
-
<source>Percentage</source>
<target>Percentual</target>
@@ -1885,15 +1900,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<pluralform>%x horas</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 dia</pluralform>
-<pluralform>%x dias</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Não é possível estabelecer o privilégio %x.</target>
@@ -1957,9 +1963,12 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Desktop</source>
<target>Área de trabalho</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Menu Iniciar</target>
+<source>Send To</source>
+<target>Enviar para</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>Registrando as extensões de arquivos do FreeFileSync</target>
@@ -1987,6 +1996,6 @@ Isto garante um estado consistente mesmo em caso de erro grave.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Escolha o tipo de instalação local ou selecione uma pasta diferente para instalação.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>O modo silencioso de instalação está disponível apenas no FreeFileSync Edição do Doador.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>A opção de instalação %x está disponível apenas na Edição do Doador do FreeFileSync.</target>
diff --git a/FreeFileSync/Build/Languages/romanian.lng b/FreeFileSync/Build/Languages/romanian.lng
index 210ca459..aa9255ec 100755
--- a/FreeFileSync/Build/Languages/romanian.lng
+++ b/FreeFileSync/Build/Languages/romanian.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Eroare de sintaxă</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>O cale pentru dosarul stîng și cel drept e așteptată după %x.</target>
+
<source>Cannot find file %x.</source>
<target>Nu pot găsi fila %x.</target>
@@ -115,6 +118,19 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Dacă această eroare este ignorată, dosarele lipsă vor fi considerate goale. Dosarele lipsă vor fi create automat la nevoie.</target>
+<source>Comparison finished:</source>
+<target>Comparare terminată:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 element găsit</pluralform>
+<pluralform>%x elemente găsite</pluralform>
+<pluralform>%x de elemente găsite</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Fila %x are o dată nevalidă.</target>
@@ -175,9 +191,6 @@
<source>Using non-default global settings:</source>
<target>Folosirea de setări globale non-implicite:</target>
-<source>Starting comparison</source>
-<target>Pornesc compararea</target>
-
<source>A folder input field is empty.</source>
<target>Un cîmp de introducere a dosarului este gol.</target>
@@ -318,15 +331,15 @@ Actuală: %y baiți
<source>Unable to move %x to the recycle bin.</source>
<target>Nu pot muta %x în Reciclator.</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 find %x.</source>
-<target>Nu pot găsi %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Tipul de element %x nu e suportat:</target>
@@ -435,6 +448,9 @@ Actuală: %y baiți
<source>Lock owner:</source>
<target>Zăvorăște proprietarul:</target>
+<source>Detecting abandoned lock...</source>
+<target>Detectez zăvorîrea [lock] abandonată...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -445,9 +461,6 @@ Actuală: %y baiți
<pluralform>%x de sec</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Detectez zăvorîrea [lock] abandonată...</target>
-
<source>Items processed:</source>
<target>Elemente Procesate:</target>
@@ -460,8 +473,8 @@ Actuală: %y baiți
<source>Error parsing file %x, row %y, column %z.</source>
<target>Eroare la parsarea filei %x, rîndul %y, coloana %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Nu pot face zăvorîrea dosarului %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nu pot seta zăvorîrea [lock] pentru dosarele următoare:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -503,9 +516,6 @@ Actuală: %y baiți
<source>Volume name %x is not part of file path %y.</source>
<target>Numele volumului %x nu face parte din calea filei %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Oprire solicitată: Aștept terminarea operației în curs...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Nu pot crea marcajul de timp pentru versionare:</target>
@@ -518,6 +528,9 @@ Actuală: %y baiți
<source>Select a folder</source>
<target>Selectează un Dosar</target>
+<source>&New</source>
+<target>Configurație &Nouă</target>
+
<source>&Open...</source>
<target>&Deschide...</target>
@@ -733,26 +746,23 @@ Comanda este declanșată dacă:
<source>job name</source>
<target>numele sarcinii</target>
-<source>Show summary</source>
-<target>Arată sumarul (rezumatul)</target>
+<source>System: Sleep</source>
+<target>Sistem: Pune în Repaus [Sleep]</target>
-<source>Sleep</source>
-<target>Pune în repaus [sleep]</target>
+<source>System: Shut down</source>
+<target>Sistem: Închide PC-ul [Shut down]</target>
-<source>Shut down</source>
-<target>Închide PC-ul [Shut down]</target>
-
-<source>Synchronization stopped</source>
-<target>Sincronizare oprită</target>
+<source>Cleaning up old log files...</source>
+<target>Curăț filele de jurnalizare vechi...</target>
<source>Stopped</source>
<target>Oprită</target>
-<source>Synchronization completed with errors</source>
-<target>Sincronizare terminată cu erori</target>
+<source>Completed with errors</source>
+<target>Realizată cu erori</target>
-<source>Synchronization completed with warnings</source>
-<target>Sincronizare realizată, dar cu avertismente</target>
+<source>Completed with warnings</source>
+<target>Realizată cu atenționări</target>
<source>Warning</source>
<target>Atenție</target>
@@ -760,15 +770,12 @@ Comanda este declanșată dacă:
<source>Nothing to synchronize</source>
<target>Nu e nimic de sincronizat</target>
-<source>Synchronization completed successfully</source>
-<target>Sincronizare realizată cu succes</target>
+<source>Completed successfully</source>
+<target>Realizată cu succes</target>
<source>Executing command %x</source>
<target>Execut comanda %x</target>
-<source>Cleaning up old log files...</source>
-<target>Curăț filele de jurnalizare vechi...</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>
@@ -784,15 +791,8 @@ Comanda este declanșată dacă:
<source>Switching to FreeFileSync's main window</source>
<target>Comut la fereastra principală FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Reîncercare automată în 1 secundă...</pluralform>
-<pluralform>Reîncercare automată în %x secunde...</pluralform>
-<pluralform>Reîncercare automată în %x de secunde...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Reîncearcă Automat</target>
<source>Ignore &all</source>
<target>Ignoră &Tot</target>
@@ -803,6 +803,28 @@ Comanda este declanșată dacă:
<source>Serious Error</source>
<target>Eroare Serioasă</target>
+<source>Last session</source>
+<target>Ultima Sesiune</target>
+
+<source>Today</source>
+<target>Azi</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 zi</pluralform>
+<pluralform>%x zile</pluralform>
+<pluralform>%x de zile</pluralform>
+</target>
+
+<source>Name</source>
+<target>Nume</target>
+
+<source>Last sync</source>
+<target>Ultima Sincr.</target>
+
<source>Folder</source>
<target>Dosar</target>
@@ -813,7 +835,7 @@ Comanda este declanșată dacă:
<target>Cale Completă</target>
<source>Relative path</source>
-<target>Calea Relativă</target>
+<target>Cale Relativă</target>
<source>Item name</source>
<target>Numele Elementului</target>
@@ -866,9 +888,6 @@ Comanda este declanșată dacă:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Selectează un dosar de pe un sistem de file local, din rețea sau de pe un dispozitiv MTP (dispozitiv media portabil).</target>
-<source>&New</source>
-<target>Configurație &Nouă</target>
-
<source>&Save</source>
<target>&Salvează</target>
@@ -980,6 +999,9 @@ Comanda este declanșată dacă:
<source>Total bytes to copy</source>
<target>Numărul total de baiți copiați</target>
+<source>Arrange folder pair</source>
+<target>Aranjează perechea de dosare</target>
+
<source>Folder pair:</source>
<target>Perechea de Dosare:</target>
@@ -1072,11 +1094,14 @@ Comanda este declanșată dacă:
<source>Naming convention:</source>
<target>Convenție de numire:</target>
-<source>&Ignore errors</source>
-<target>&Ignoră Erorile</target>
+<source>Ignore errors</source>
+<target>Ignoră erorile</target>
-<source>Show pop-up on errors or warnings</source>
-<target>În caz de erori sau avertizări este arătată o fereastră popîc [popup]</target>
+<source>Retry count:</source>
+<target>Numărul reîncercărilor:</target>
+
+<source>Delay (in seconds):</source>
+<target>Întîrziere (în secunde):</target>
<source>Run a command after synchronization:</source>
<target>Rulează o comandă după sincronizare:</target>
@@ -1084,9 +1109,6 @@ Comanda este declanșată dacă:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Aranjează perechea de dosare</target>
-
<source>Enter your login details:</source>
<target>Introdu detaliile de logare:</target>
@@ -1183,12 +1205,12 @@ Comanda este declanșată dacă:
<source>Minimize to notification area</source>
<target>Minimizează în aria de notificare (sertar)</target>
-<source>Bytes copied:</source>
-<target>Baiți copiați:</target>
-
<source>When finished:</source>
<target>La terminare:</target>
+<source>Auto-close</source>
+<target>Închide Automat</target>
+
<source>Close</source>
<target>Închide</target>
@@ -1201,12 +1223,18 @@ Comanda este declanșată dacă:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Creează o filă set [batch file] pentru sincronizarea neasistată. Pentru efectuarea sincronizării, dublu-clichează această filă sau programează rularea ei folosind un Planificator de Sarcini [Task Scheduler]: %x</target>
+<source>Progress dialog:</source>
+<target>Dialogul Progresului:</target>
+
<source>Run minimized</source>
<target>Rulează minimizat</target>
<source>&Show error dialog</source>
<target>Arată dialo&gul erorilor</target>
+<source>Show pop-up on errors or warnings</source>
+<target>În caz de erori sau avertizări este arătată o fereastră popîc [popup]</target>
+
<source>&Cancel</source>
<target>&Anulează</target>
@@ -1255,14 +1283,11 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Transfer file and folder permissions.</source>
<target>Sînt transferate și permisiunile de accesare NTFS ale filelor și dosarelor (Atenție: doar pentru utilizatorii avansați!).</target>
-<source>Automatic retry on error:</source>
-<target>Reîncearcă automat în caz de eroare:</target>
-
-<source>Retry count:</source>
-<target>Numărul reîncercărilor:</target>
+<source>Show hidden dialogs again</source>
+<target>Arată din nou dialogurile ascunse</target>
-<source>Delay (in seconds):</source>
-<target>Întîrziere (în secunde):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Sînt arătate din nou dialogurile și mesajele de eroare care au fost ascunse permanent</target>
<source>Customize context menu:</source>
<target>Personalizează meniul contextual:</target>
@@ -1270,12 +1295,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Description</source>
<target>Descriere</target>
-<source>Show hidden dialogs again</source>
-<target>Arată din nou dialogurile ascunse</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Sînt arătate din nou dialogurile și mesajele de eroare care au fost ascunse permanent</target>
-
<source>&Default</source>
<target>Coloanele &Implicite</target>
@@ -1330,13 +1349,22 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Activate offline</source>
<target>Activează neconectat [offline]</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Evidențiază configurațiile care n-au fost rulate de mai multă vreme decît numărul de zile următor:</target>
+
+<source>Synchronization Settings</source>
+<target>Setările Sincronizării</target>
+
+<source>Access Online Storage</source>
+<target>Accesează Stocarea pe Internet</target>
+
<source>Save as a Batch Job</source>
<target>Salvează ca Sarcină Set</target>
<source>Delete Items</source>
<target>Șterge Elementele</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Copiază Elementele</target>
<source>Options</source>
@@ -1348,6 +1376,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Ediție pentru Donatori</target>
+<source>Highlight Configurations</source>
+<target>Evidențiază Configurațiile</target>
+
<source>&Options</source>
<target>&Opțiuni</target>
@@ -1473,10 +1504,7 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<target>Mari</target>
<source>Select time span...</source>
-<target>Selectează intervalul de timp...</target>
-
-<source>Last session</source>
-<target>Ultima Sesiune</target>
+<target>Selectează Intervalul de Timp...</target>
<source>Folder Comparison and Synchronization</source>
<target>Comparare și Sincronizare de Dosare</target>
@@ -1496,8 +1524,11 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Do&n't save</source>
<target>&Nu salva</target>
-<source>Remove entry from list</source>
-<target>Înlătură intrarea din listă</target>
+<source>Hide configuration</source>
+<target>Ascunde Configurația</target>
+
+<source>Highlight...</source>
+<target>Evidențiază...</target>
<source>Clear filter</source>
<target>Curăță Filtrul</target>
@@ -1577,6 +1608,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Paused</source>
<target>Sincronizare Pauzată</target>
+<source>Stop requested...</source>
+<target>Oprire cerută...</target>
+
<source>Initializing...</source>
<target>Inițializez...</target>
@@ -1586,9 +1620,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Comparing content...</source>
<target>Compar conținutul...</target>
-<source>Completed</source>
-<target>Sincronizare Terminată</target>
-
<source>Info</source>
<target>Informații</target>
@@ -1673,12 +1704,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Parameters for opposite side</source>
<target>Parametrii pentru partea opusă</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Arăt din nou dialogurile și mesajele de eroare ascunse?</target>
-
-<source>&Show</source>
-<target>&Arată</target>
-
<source>Downloading update...</source>
<target>Descarc actualizarea...</target>
@@ -1703,18 +1728,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Configure your own synchronization rules.</source>
<target>Reguli de sincronizare definite de utilizator pentru fiecare situație.</target>
-<source>Synchronization Settings</source>
-<target>Setările Sincronizării</target>
-
<source>Comparison</source>
<target>Comparare</target>
<source>Synchronization</source>
<target>Sincronizare</target>
-<source>Today</source>
-<target>Azi</target>
-
<source>This week</source>
<target>Săptămîna asta</target>
@@ -1784,9 +1803,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Files</source>
<target>File</target>
-<source>Name</source>
-<target>Nume</target>
-
<source>Percentage</source>
<target>Procent</target>
@@ -1900,16 +1916,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<pluralform>%x de ore</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 zi</pluralform>
-<pluralform>%x zile</pluralform>
-<pluralform>%x de zile</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Nu pot seta privilegiul %x.</target>
@@ -1973,8 +1979,11 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Desktop</source>
<target>Birou [Desktop]</target>
-<source>Start menu</source>
-<target>Meniul de Start</target>
+<source>Start Menu</source>
+<target>Meniu de Start [Start Menu]</target>
+
+<source>Send To</source>
+<target>Trimite La [Send To]</target>
<source>Registering FreeFileSync file extensions</source>
<target>Înregistrez extensiile de file FreeFileSync</target>
@@ -2003,6 +2012,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Alege instalarea locală sau selectează un dosar diferit pentru instalare.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Modul de instalare silențios e disponibil doar pentru FreeFileSync Ediția pentru Donatori.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>Opțiunea de instalare %x e disponibilă doar pentru FreeFileSync Ediția pentru Donatori.</target>
diff --git a/FreeFileSync/Build/Languages/russian.lng b/FreeFileSync/Build/Languages/russian.lng
index 5208d558..4273a175 100755
--- a/FreeFileSync/Build/Languages/russian.lng
+++ b/FreeFileSync/Build/Languages/russian.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Синтаксическая ошибка</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Левый и правый пути папок ожидаются после %x.</target>
+
<source>Cannot find file %x.</source>
<target>Невозможно найти файл %x.</target>
@@ -115,6 +118,19 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Если эта ошибка будет проигнорирована, то папки выше будут рассматриваться как пустые. Недостающие папки создаются автоматически, когда это необходимо.</target>
+<source>Comparison finished:</source>
+<target>Сравнение окончено:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>%x элемент найден</pluralform>
+<pluralform>%x элемента найдено</pluralform>
+<pluralform>%x элементов найдено</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Файл %x имеет недействительную дату.</target>
@@ -175,9 +191,6 @@
<source>Using non-default global settings:</source>
<target>Использование нестандартных глобальных настроек:</target>
-<source>Starting comparison</source>
-<target>Начать сравнение</target>
-
<source>A folder input field is empty.</source>
<target>Поле ввода папки пустое.</target>
@@ -318,15 +331,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>Невозможно найти %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Тип элемента %x не поддерживается:</target>
@@ -435,6 +448,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>Источник блокировки:</target>
+<source>Detecting abandoned lock...</source>
+<target>Обнаружение заброшенной блокировки...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -445,9 +461,6 @@ Actual: %y bytes
<pluralform>%x секунд</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Обнаружение заброшенной блокировки...</target>
-
<source>Items processed:</source>
<target>Элементов обработано:</target>
@@ -460,8 +473,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Ошибка при разборе файла %x, строка %y, колонка %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Невозможно установить блокировку папки для %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Невозможно установить блокировки для следующих папок:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -503,9 +516,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>Имя тома %x не является частью имени файла %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Запрошена остановка: Ожидайте, пока текущая операция завершится...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Невозможно создать отметку времени для архивирования файлов:</target>
@@ -518,6 +528,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>Выбрать папку</target>
+<source>&New</source>
+<target>&Новая</target>
+
<source>&Open...</source>
<target>&Открыть...</target>
@@ -733,26 +746,23 @@ The command is triggered if:
<source>job name</source>
<target>название</target>
-<source>Show summary</source>
-<target>Показать статистику</target>
+<source>System: Sleep</source>
+<target>Система: Спящий режим</target>
-<source>Sleep</source>
-<target>Спящий режим</target>
+<source>System: Shut down</source>
+<target>Система: Завершение работы</target>
-<source>Shut down</source>
-<target>Завершение работы</target>
-
-<source>Synchronization stopped</source>
-<target>Синхронизация остановлена</target>
+<source>Cleaning up old log files...</source>
+<target>Очистка старых лог-файлов (журналов)...</target>
<source>Stopped</source>
<target>Остановлено</target>
-<source>Synchronization completed with errors</source>
-<target>Синхронизация завершена. В процессе синхронизации возникли ошибки</target>
+<source>Completed with errors</source>
+<target>Выполнено с ошибками</target>
-<source>Synchronization completed with warnings</source>
-<target>Синхронизация завершена. В процессе синхронизации возникли проблемы</target>
+<source>Completed with warnings</source>
+<target>Выполнено с предупреждениями</target>
<source>Warning</source>
<target>Внимание</target>
@@ -760,15 +770,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>Ничего нет для синхронизации</target>
-<source>Synchronization completed successfully</source>
-<target>Синхронизация завершена успешно</target>
+<source>Completed successfully</source>
+<target>Выполнено успешно</target>
<source>Executing command %x</source>
<target>Выполнение команды %x</target>
-<source>Cleaning up old log files...</source>
-<target>Очистка старых лог-файлов (журналов)...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Вы можете переключиться на главное окно FreeFileSync для решения этой проблемы.</target>
@@ -784,15 +791,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>Переключение на главное окно FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Автоматически повторить через %x секунду...</pluralform>
-<pluralform>Автоматически повторить через %x секунды...</pluralform>
-<pluralform>Автоматически повторить через %x секунд...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Автоматический повтор</target>
<source>Ignore &all</source>
<target>Игнорировать &все</target>
@@ -803,6 +803,28 @@ The command is triggered if:
<source>Serious Error</source>
<target>Серьезная ошибка</target>
+<source>Last session</source>
+<target>Последняя сессия</target>
+
+<source>Today</source>
+<target>сегодня</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x день</pluralform>
+<pluralform>%x дня</pluralform>
+<pluralform>%x дней</pluralform>
+</target>
+
+<source>Name</source>
+<target>Имя</target>
+
+<source>Last sync</source>
+<target>Последняя синхронизация</target>
+
<source>Folder</source>
<target>Папка</target>
@@ -866,9 +888,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Пожалуйста, выберите папку в локальной файловой системе, сети или MTP устройстве.</target>
-<source>&New</source>
-<target>&Новая</target>
-
<source>&Save</source>
<target>&Сохранить</target>
@@ -980,6 +999,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>Всего байт для копирования</target>
+<source>Arrange folder pair</source>
+<target>Упорядочить пару папок</target>
+
<source>Folder pair:</source>
<target>Пара папок:</target>
@@ -1072,11 +1094,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>Условие переименования:</target>
-<source>&Ignore errors</source>
-<target>&Игнорировать ошибки</target>
+<source>Ignore errors</source>
+<target>Игнорировать ошибки</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Показывать всплывающие окна при ошибках и предупреждениях</target>
+<source>Retry count:</source>
+<target>Число повторений:</target>
+
+<source>Delay (in seconds):</source>
+<target>Задержка (в секундах):</target>
<source>Run a command after synchronization:</source>
<target>Запустить команду после синхронизации:</target>
@@ -1084,9 +1109,6 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Упорядочить пару папок</target>
-
<source>Enter your login details:</source>
<target>Введите свои данные для входа:</target>
@@ -1183,12 +1205,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>Свернуть в область уведомлений</target>
-<source>Bytes copied:</source>
-<target>Данных скопировано:</target>
-
<source>When finished:</source>
<target>По завершении:</target>
+<source>Auto-close</source>
+<target>Автоматически закрыть</target>
+
<source>Close</source>
<target>Закрыть</target>
@@ -1201,12 +1223,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Создать файл пакетного задания для автоматической синхронизации. Для запуска дважды кликните этот файл или запланируйте в планировщике задач: %x</target>
+<source>Progress dialog:</source>
+<target>Окно прогресса:</target>
+
<source>Run minimized</source>
<target>Запустить свернутым</target>
<source>&Show error dialog</source>
<target>&Показать окно ошибки</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Показывать всплывающие окна при ошибках и предупреждениях</target>
+
<source>&Cancel</source>
<target>&Остановить</target>
@@ -1255,14 +1283,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Передача прав доступа к файлам/папкам.</target>
-<source>Automatic retry on error:</source>
-<target>Автоматическое повторение при ошибках:</target>
-
-<source>Retry count:</source>
-<target>Число повторений:</target>
+<source>Show hidden dialogs again</source>
+<target>Показать скрытые окна снова</target>
-<source>Delay (in seconds):</source>
-<target>Задержка (в секундах):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Показать все скрытые окна и сообщения с предупреждениями снова</target>
<source>Customize context menu:</source>
<target>Кастомизация контекстного меню:</target>
@@ -1270,12 +1295,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>Описание</target>
-<source>Show hidden dialogs again</source>
-<target>Показать скрытые окна снова</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Показать все скрытые окна и сообщения с предупреждениями снова</target>
-
<source>&Default</source>
<target>&По умолчанию</target>
@@ -1330,13 +1349,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>Активировать в офлайн режиме</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Выделить конфигурации, которые не запускались больше указанного количества дней:</target>
+
+<source>Synchronization Settings</source>
+<target>Настройки синхронизации</target>
+
+<source>Access Online Storage</source>
+<target>Доступ к онлайн-хранилищу</target>
+
<source>Save as a Batch Job</source>
-<target>Сохранить как пакетное задание</target>
+<target>Сохранение пакетного задания</target>
<source>Delete Items</source>
<target>Удаление элементов</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Копирование элементов</target>
<source>Options</source>
@@ -1348,6 +1376,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>Платная версия FreeFileSync</target>
+<source>Highlight Configurations</source>
+<target>Выделение конфигураций</target>
+
<source>&Options</source>
<target>&Настройки</target>
@@ -1475,9 +1506,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Выберите промежуток времени...</target>
-<source>Last session</source>
-<target>Последняя сессия</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Сравнение и синхронизация</target>
@@ -1496,8 +1524,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&Не сохранять</target>
-<source>Remove entry from list</source>
-<target>Удалить запись из листа</target>
+<source>Hide configuration</source>
+<target>Удалить конфигурацию из списка</target>
+
+<source>Highlight...</source>
+<target>Выделить...</target>
<source>Clear filter</source>
<target>Очистить фильтр</target>
@@ -1577,6 +1608,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>Пауза</target>
+<source>Stop requested...</source>
+<target>Запрошена остановка...</target>
+
<source>Initializing...</source>
<target>Инициализация...</target>
@@ -1586,9 +1620,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>Сравнение содержания...</target>
-<source>Completed</source>
-<target>Завершено</target>
-
<source>Info</source>
<target>Информация</target>
@@ -1673,12 +1704,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Параметры для противоположной стороны</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Показать скрытые окна и сообщения с предупреждениями снова?</target>
-
-<source>&Show</source>
-<target>&Показать</target>
-
<source>Downloading update...</source>
<target>Загрузка обновления...</target>
@@ -1703,18 +1728,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>Настроить свои собственные правила синхронизации.</target>
-<source>Synchronization Settings</source>
-<target>Настройки синхронизации</target>
-
<source>Comparison</source>
<target>Сравнение</target>
<source>Synchronization</source>
<target>Синхронизация</target>
-<source>Today</source>
-<target>сегодня</target>
-
<source>This week</source>
<target>на этой неделе</target>
@@ -1784,9 +1803,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>Файлы</target>
-<source>Name</source>
-<target>Имя</target>
-
<source>Percentage</source>
<target>Проценты</target>
@@ -1900,16 +1916,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x часов</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>%x день</pluralform>
-<pluralform>%x дня</pluralform>
-<pluralform>%x дней</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Невозможно установить привилегии %x.</target>
@@ -1973,8 +1979,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>на рабочем столе</target>
-<source>Start menu</source>
-<target>в меню Пуск</target>
+<source>Start Menu</source>
+<target>Начальное меню</target>
+
+<source>Send To</source>
+<target>Отправить</target>
<source>Registering FreeFileSync file extensions</source>
<target>Регистрация расширений файлов FreeFileSync</target>
@@ -2003,6 +2012,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Пожалуйста, выберите локальный тип установки или выберите другую папку для установки.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Режим автоматической установки доступен только в платной версии FreeFileSync.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>%x опция установки доступна только в платной версии FreeFileSync.</target>
diff --git a/FreeFileSync/Build/Languages/slovak.lng b/FreeFileSync/Build/Languages/slovak.lng
index 9a5489ab..8ff29202 100755
--- a/FreeFileSync/Build/Languages/slovak.lng
+++ b/FreeFileSync/Build/Languages/slovak.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Chyba syntaxu</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Bude očakávaná pravá a ľavá adresárová cesta po %x.</target>
+
<source>Cannot find file %x.</source>
<target>Nie je možné nájsť súbor %x.</target>
@@ -115,6 +118,19 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Ak bude táto chyba ignorovaná, budú tieto priečinky považované za prázdne.</target>
+<source>Comparison finished:</source>
+<target>Dokončilo sa porovnávanie:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>Nájdená 1 položka</pluralform>
+<pluralform>Nájdené %x položky</pluralform>
+<pluralform>Nájdených %x položiek</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Súbor %x má chybný dátum.</target>
@@ -175,9 +191,6 @@
<source>Using non-default global settings:</source>
<target>Použiť ne-predvolené globálne nastavenia:</target>
-<source>Starting comparison</source>
-<target>Spustiť porovnávania</target>
-
<source>A folder input field is empty.</source>
<target>Nie je zadaná vstupný priečinok.</target>
@@ -318,15 +331,15 @@ Aktuálne: %y b
<source>Unable to move %x to the recycle bin.</source>
<target>Nie je možné presunúť %x do Koša.</target>
+<source>Cannot find %x.</source>
+<target>Nie je možné nájsť %x.</target>
+
<source>Cannot open file %x.</source>
<target>Nie je možné otvoriť súbor %x.</target>
<source>Cannot find device %x.</source>
<target>Nie je možné nájsť zariadenie %x.</target>
-<source>Cannot find %x.</source>
-<target>Nie je možné nájsť %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Typ položky %x nie je podporovaný:</target>
@@ -435,6 +448,9 @@ Aktuálne: %y b
<source>Lock owner:</source>
<target>Vlastník uzamknutia:</target>
+<source>Detecting abandoned lock...</source>
+<target>Preverovanie uzamknutia...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -445,9 +461,6 @@ Aktuálne: %y b
<pluralform>%x sekúnd</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Preverovanie uzamknutia...</target>
-
<source>Items processed:</source>
<target>Spracovaných položiek:</target>
@@ -460,8 +473,8 @@ Aktuálne: %y b
<source>Error parsing file %x, row %y, column %z.</source>
<target>Chyba spracovania súboru %x: na riadku %y v stĺpci %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Nie je možné nastaviť zámok adresára %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Nie je možné nastaviť uzamknutie adresárov pre nasledujúce priečinky:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -503,9 +516,6 @@ Aktuálne: %y b
<source>Volume name %x is not part of file path %y.</source>
<target>Názov disku %x nie je súčásťou cesty súboru %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Zastavovanie: Čakanie na dokončenie práve prebiehajúcej operácie...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Nie je možné vytvoriť časovú značku verzovania:</target>
@@ -518,6 +528,9 @@ Aktuálne: %y b
<source>Select a folder</source>
<target>Vyberte priečinok</target>
+<source>&New</source>
+<target>&Nový</target>
+
<source>&Open...</source>
<target>&Otvoriť...</target>
@@ -733,26 +746,23 @@ Príkaz bude spustení ak:
<source>job name</source>
<target>názov úlohy</target>
-<source>Show summary</source>
-<target>Zobraziť súhrn</target>
+<source>System: Sleep</source>
+<target>Systém: Uspať</target>
-<source>Sleep</source>
-<target>Uspať</target>
+<source>System: Shut down</source>
+<target>Systém: Vypnúť</target>
-<source>Shut down</source>
-<target>Vypnúť počítač</target>
-
-<source>Synchronization stopped</source>
-<target>Synchronizácia je zastavená</target>
+<source>Cleaning up old log files...</source>
+<target>Odstráňovanie starých log súborov...</target>
<source>Stopped</source>
<target>Zastavené</target>
-<source>Synchronization completed with errors</source>
-<target>Synchronizácia dokončena s chybami</target>
+<source>Completed with errors</source>
+<target>Ukončené s chybami</target>
-<source>Synchronization completed with warnings</source>
-<target>Synchronizácia dokončena s varovaním</target>
+<source>Completed with warnings</source>
+<target>Ukončené s varovaniami</target>
<source>Warning</source>
<target>Varovanie</target>
@@ -760,15 +770,12 @@ Príkaz bude spustení ak:
<source>Nothing to synchronize</source>
<target>Nie je čo synchronizovať</target>
-<source>Synchronization completed successfully</source>
-<target>Synchronizácia je úspešne dokončená</target>
+<source>Completed successfully</source>
+<target>Dokončenie bolo úspešné</target>
<source>Executing command %x</source>
<target>Spúšťací príkaz %x</target>
-<source>Cleaning up old log files...</source>
-<target>Odstráňovanie starých log súborov...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>K odstráneniu tohoto problému sa môžete prepnúť do hlavného okna FreeFileSync.</target>
@@ -784,15 +791,8 @@ Príkaz bude spustení ak:
<source>Switching to FreeFileSync's main window</source>
<target>Prepínanie do hlavného okna FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Automatické opakovanie za 1 sekundu...</pluralform>
-<pluralform>Automaticky opakovať za %x sekundy...</pluralform>
-<pluralform>Autoamticky opakovať za %x sekúnd...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Automatické opakovanie</target>
<source>Ignore &all</source>
<target>Ignorovať &všetky</target>
@@ -803,6 +803,28 @@ Príkaz bude spustení ak:
<source>Serious Error</source>
<target>Závažná chyba</target>
+<source>Last session</source>
+<target>Posledné sedenie</target>
+
+<source>Today</source>
+<target>Dnes</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 deň</pluralform>
+<pluralform>%x dni</pluralform>
+<pluralform>%x dní</pluralform>
+</target>
+
+<source>Name</source>
+<target>Názov</target>
+
+<source>Last sync</source>
+<target>Posledná synchronizácia</target>
+
<source>Folder</source>
<target>Priečinok</target>
@@ -866,9 +888,6 @@ Príkaz bude spustení ak:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Prosím vyberte priečinok v lokálnom súborovom systéme, sieti alebo multimediálnom zariadení.</target>
-<source>&New</source>
-<target>&Nový</target>
-
<source>&Save</source>
<target>&Uložiť</target>
@@ -933,7 +952,7 @@ Príkaz bude spustení ak:
<target>Odstrániť dvojicu priečinkov</target>
<source>Access online storage</source>
-<target>Prístup k online úložištiu</target>
+<target>Prístup k online úložisku</target>
<source>Swap sides</source>
<target>Zámena strán</target>
@@ -980,6 +999,9 @@ Príkaz bude spustení ak:
<source>Total bytes to copy</source>
<target>Celkový objem kopírovaných údajov</target>
+<source>Arrange folder pair</source>
+<target>Usporiadať dvojicu priečinkov</target>
+
<source>Folder pair:</source>
<target>Dvojica priečinkov:</target>
@@ -1072,11 +1094,14 @@ Príkaz bude spustení ak:
<source>Naming convention:</source>
<target>Pomenovanie:</target>
-<source>&Ignore errors</source>
-<target>&Ignorovať chyby</target>
+<source>Ignore errors</source>
+<target>Ignorovať chyby</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Zobraziť hlásenie pri chybe alebo varovaní</target>
+<source>Retry count:</source>
+<target>Počet opakovaní:</target>
+
+<source>Delay (in seconds):</source>
+<target>Oneskorenie (v sekundách):</target>
<source>Run a command after synchronization:</source>
<target>Spustiť príkaz po synchronizácií:</target>
@@ -1084,9 +1109,6 @@ Príkaz bude spustení ak:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Usporiadať dvojicu priečinkov</target>
-
<source>Enter your login details:</source>
<target>Zadajte prihlasovacie údaje:</target>
@@ -1183,12 +1205,12 @@ Príkaz bude spustení ak:
<source>Minimize to notification area</source>
<target>Minimalizovať do oznamovacej oblasti</target>
-<source>Bytes copied:</source>
-<target>Skopírovaných údajov:</target>
-
<source>When finished:</source>
<target>Po dokončení:</target>
+<source>Auto-close</source>
+<target>Automaticky zavrieť</target>
+
<source>Close</source>
<target>Zavrieť</target>
@@ -1201,12 +1223,18 @@ Príkaz bude spustení ak:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Vytvorí dávkový súbor pre automatickú synchronizáciu. Ku spusteniu dávky jednoducho pokliknite na vytvorený súbor alebo využite plánovač úloh vašeho systému: %x</target>
+<source>Progress dialog:</source>
+<target>Dialóg procesu:</target>
+
<source>Run minimized</source>
<target>Spustiť minimalizované</target>
<source>&Show error dialog</source>
<target>&Zobraziť chybový dialóg</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Zobraziť hlásenie pri chybe alebo varovaní</target>
+
<source>&Cancel</source>
<target>&Zrušiť</target>
@@ -1252,14 +1280,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Preniesť prístupové oprávnenie súborov a priečinkov.</target>
-<source>Automatic retry on error:</source>
-<target>Automaticky opakovať pri chybe:</target>
-
-<source>Retry count:</source>
-<target>Počet opakovaní:</target>
+<source>Show hidden dialogs again</source>
+<target>Znovu zobraziť skryté dialógy</target>
-<source>Delay (in seconds):</source>
-<target>Oneskorenie (v sekundách):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Zobraziť znovu všetky trvale skryté dialógy a varovné hlásenia</target>
<source>Customize context menu:</source>
<target>Prispôsobiť kontextovú ponuku:</target>
@@ -1267,12 +1292,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>Popis</target>
-<source>Show hidden dialogs again</source>
-<target>Znovu zobraziť skryté dialógy</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Zobraziť znovu všetky trvale skryté dialógy a varovné hlásenia</target>
-
<source>&Default</source>
<target>&Predvolené</target>
@@ -1327,13 +1346,22 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>Aktivovať offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Zvýrazniť konfigurácie, ktoré neboli vykonané viac ako nasledujúci počet dní:</target>
+
+<source>Synchronization Settings</source>
+<target>Nastavenia synchronizácie</target>
+
+<source>Access Online Storage</source>
+<target>Prístup k Online Storage</target>
+
<source>Save as a Batch Job</source>
<target>Uložiť ako Batch Job</target>
<source>Delete Items</source>
<target>Zmazať položky</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Kopírovať položky</target>
<source>Options</source>
@@ -1345,6 +1373,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Zvýrazniť konfigurácie</target>
+
<source>&Options</source>
<target>Nastavenie &programu</target>
@@ -1472,9 +1503,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Zadajte časové rozmedzie...</target>
-<source>Last session</source>
-<target>Posledné sedenie</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Porovnanie a synchronizácia priečinkov</target>
@@ -1493,8 +1521,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&Neukladať</target>
-<source>Remove entry from list</source>
-<target>Odstrániť položku zo zoznamu</target>
+<source>Hide configuration</source>
+<target>Skryť konfiguráciu</target>
+
+<source>Highlight...</source>
+<target>Zvýrazniť...</target>
<source>Clear filter</source>
<target>Vymazať filter</target>
@@ -1574,6 +1605,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>Pauza</target>
+<source>Stop requested...</source>
+<target>Zastavenie požiadavky...</target>
+
<source>Initializing...</source>
<target>Inicializácia...</target>
@@ -1583,9 +1617,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>Porovnávanie obsahu...</target>
-<source>Completed</source>
-<target>Hotovo</target>
-
<source>Info</source>
<target>Info</target>
@@ -1670,12 +1701,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Parametre pre protiľahlú stranu</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Zobraziť skryté dialógy a varovné hlásenia?</target>
-
-<source>&Show</source>
-<target>&Zobraziť</target>
-
<source>Downloading update...</source>
<target>Sťahovanie aktualizácie...</target>
@@ -1700,18 +1725,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>Nastavenie vlastných pravidiel synchronizácie.</target>
-<source>Synchronization Settings</source>
-<target>Nastavenia synchronizácie</target>
-
<source>Comparison</source>
<target>Porovnanie</target>
<source>Synchronization</source>
<target>Synchronizácia</target>
-<source>Today</source>
-<target>Dnes</target>
-
<source>This week</source>
<target>Tento týždeň</target>
@@ -1781,9 +1800,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>Súbory</target>
-<source>Name</source>
-<target>Názov</target>
-
<source>Percentage</source>
<target>Percentný podiel</target>
@@ -1897,16 +1913,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x hodín</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 deň</pluralform>
-<pluralform>%x dni</pluralform>
-<pluralform>%x dní</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Nie je možné nastaviť práva pre %x.</target>
@@ -1970,9 +1976,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>Plocha</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Ponuka Štart</target>
+<source>Send To</source>
+<target>Odoslať kam</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>Zaregistrovať príponu súborov FreeFileSync</target>
@@ -2000,6 +2009,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Prosím zvoľte lokálny typ inštalácie alebo vyberte iný priečinok pre inštaláciu.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Mód tichej inštalácie je možný iba v FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>Inštalačná možnosť %x je dostupná iba pri FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Languages/slovenian.lng b/FreeFileSync/Build/Languages/slovenian.lng
index 81d99194..b958ef19 100755
--- a/FreeFileSync/Build/Languages/slovenian.lng
+++ b/FreeFileSync/Build/Languages/slovenian.lng
@@ -118,6 +118,20 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>V primeru prezrtja te napake bo mapa smatrana kot prazna. Manjkajoče mape se po potrebi ustvarijo samodejno.</target>
+<source>Comparison finished:</source>
+<target>Primerjava je končana:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>%x najdena postavka</pluralform>
+<pluralform>%x najdeni postavki</pluralform>
+<pluralform>%x najdene postavke</pluralform>
+<pluralform>%x najdenih postavk</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Datoteka %x ima neveljaven datum.</target>
@@ -178,9 +192,6 @@
<source>Using non-default global settings:</source>
<target>Uporabljam neprivzete globalne nastavitve:</target>
-<source>Starting comparison</source>
-<target>Začenjam primerjavo</target>
-
<source>A folder input field is empty.</source>
<target>Polje za vnos mape je prazno.</target>
@@ -321,15 +332,15 @@ Dejansko: %y bajtov
<source>Unable to move %x to the recycle bin.</source>
<target>Ne morem premakniti %x v koš.</target>
+<source>Cannot find %x.</source>
+<target>Ne najdem %x.</target>
+
<source>Cannot open file %x.</source>
<target>Ne morem odpreti datoteke %x.</target>
<source>Cannot find device %x.</source>
<target>Ne najdem naprave %x.</target>
-<source>Cannot find %x.</source>
-<target>Ne najdem %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Vrsta postavke %x ni podprta:</target>
@@ -441,6 +452,9 @@ Dejansko: %y bajtov
<source>Lock owner:</source>
<target>Lastnik zaklepa:</target>
+<source>Detecting abandoned lock...</source>
+<target>Zaznavanje opuščenega zaklepa...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -452,9 +466,6 @@ Dejansko: %y bajtov
<pluralform>%x sek</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Zaznavanje opuščenega zaklepa...</target>
-
<source>Items processed:</source>
<target>Obdelanih postavk:</target>
@@ -511,9 +522,6 @@ Dejansko: %y bajtov
<source>Volume name %x is not part of file path %y.</source>
<target>Ime nosilca %x ni del poti datoteke %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Zahteva za ustavitev: čakam da se trenutni proces zaključi...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Časovnega žiga za oznčitev ni bilo mogoče ustvariti:</target>
@@ -526,6 +534,9 @@ Dejansko: %y bajtov
<source>Select a folder</source>
<target>Izberite imenik</target>
+<source>&New</source>
+<target>&Nova</target>
+
<source>&Open...</source>
<target>&Odpri...</target>
@@ -601,7 +612,7 @@ Ukaz se sproži če:
<target>Vizitka</target>
<source>Build: %x</source>
-<target>Grsdnja: %x</target>
+<target>Gradnja: %x</target>
<source>All files</source>
<target>Vse datoteke</target>
@@ -741,26 +752,23 @@ Ukaz se sproži če:
<source>job name</source>
<target>naziv opravila</target>
-<source>Show summary</source>
-<target>Pokaži povzetek</target>
+<source>System: Sleep</source>
+<target>Sistem: Spanje</target>
-<source>Sleep</source>
-<target>Spanje</target>
+<source>System: Shut down</source>
+<target>Sistem: Izključi računalnik</target>
-<source>Shut down</source>
-<target>Izključi računalnik</target>
-
-<source>Synchronization stopped</source>
-<target>Sinhnorizacija zaustavljena</target>
+<source>Cleaning up old log files...</source>
+<target>Čiščenje starih datotek dnevnika...</target>
<source>Stopped</source>
<target>Ustavljeno</target>
-<source>Synchronization completed with errors</source>
-<target>Sinhronizacija dokončana z napakami</target>
+<source>Completed with errors</source>
+<target>Dokončano z napakami</target>
-<source>Synchronization completed with warnings</source>
-<target>Sinhronizacija dokončana z opozorili</target>
+<source>Completed with warnings</source>
+<target>Dokončano z opozorili</target>
<source>Warning</source>
<target>Opozorilo</target>
@@ -768,15 +776,12 @@ Ukaz se sproži če:
<source>Nothing to synchronize</source>
<target>Nič za sinhroniziranje</target>
-<source>Synchronization completed successfully</source>
-<target>Sinhronizacija je uspešno končana</target>
+<source>Completed successfully</source>
+<target>Uspešno končano</target>
<source>Executing command %x</source>
<target>Izvedba ukaza %x</target>
-<source>Cleaning up old log files...</source>
-<target>Čiščenje starih datotek dnevnika...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Če želite odpraviti to težavo, lahko preklopite na glavno okno FreeFileSync.</target>
@@ -792,16 +797,8 @@ Ukaz se sproži če:
<source>Switching to FreeFileSync's main window</source>
<target>Preklop na glavno okno FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Samodejni poskus znova čez %x sekundo...</pluralform>
-<pluralform>Samodejni poskus znova čez %x sekundi...</pluralform>
-<pluralform>Samodejni poskus znova čez %x sekunde...</pluralform>
-<pluralform>Samodejni poskus znova čez %x sekund...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Samodejno poskusi znova</target>
<source>Ignore &all</source>
<target>Prezri &vse</target>
@@ -898,9 +895,6 @@ Ukaz se sproži če:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Prosim izberite mapo na lokalnem datotečnem sistemu, mreži ali na MTP napravi.</target>
-<source>&New</source>
-<target>&Nova</target>
-
<source>&Save</source>
<target>&Shrani</target>
@@ -1012,6 +1006,9 @@ Ukaz se sproži če:
<source>Total bytes to copy</source>
<target>Skupno bajtov za kopiranje</target>
+<source>Arrange folder pair</source>
+<target>Uredi pare map</target>
+
<source>Folder pair:</source>
<target>Par map:</target>
@@ -1104,11 +1101,14 @@ Ukaz se sproži če:
<source>Naming convention:</source>
<target>Imenovanje konvencije:</target>
-<source>&Ignore errors</source>
-<target>&Prezri napake</target>
+<source>Ignore errors</source>
+<target>Prezri napake</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Pokaži pojavna okna napak ali opozoril</target>
+<source>Retry count:</source>
+<target>Število poskusov:</target>
+
+<source>Delay (in seconds):</source>
+<target>Zakasnitev (v sekundah):</target>
<source>Run a command after synchronization:</source>
<target>Zaženi ukaz po sinhronizaciji:</target>
@@ -1116,9 +1116,6 @@ Ukaz se sproži če:
<source>OK</source>
<target>V redu</target>
-<source>Arrange folder pair</source>
-<target>Uredi pare map</target>
-
<source>Enter your login details:</source>
<target>Vnestite podatke za prijavo:</target>
@@ -1215,12 +1212,12 @@ Ukaz se sproži če:
<source>Minimize to notification area</source>
<target>Pomanjšaj v območje obvestil</target>
-<source>Bytes copied:</source>
-<target>Prepisanih bajtov:</target>
-
<source>When finished:</source>
<target>Po zaključku:</target>
+<source>Auto-close</source>
+<target>Samodejno zapri</target>
+
<source>Close</source>
<target>Zapri</target>
@@ -1233,12 +1230,18 @@ Ukaz se sproži če:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Ustvari paketno datoteko za nenadzorovano sinhronizacijo. Za začetek dvokliknite to datoteko ali določite v načrtovalniku nalog: %x</target>
+<source>Progress dialog:</source>
+<target>Okno napredka:</target>
+
<source>Run minimized</source>
<target>Zaženi minimirano</target>
<source>&Show error dialog</source>
<target>&Prikaži pogovorno okno napak</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Pokaži pojavna okna napak ali opozoril</target>
+
<source>&Cancel</source>
<target>&Prekliči</target>
@@ -1287,14 +1290,11 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Transfer file and folder permissions.</source>
<target>Prenesi dovoljenja za datoteke in mape.</target>
-<source>Automatic retry on error:</source>
-<target>Ob napaki samodejo poskusi znova:</target>
-
-<source>Retry count:</source>
-<target>Število poiskusov:</target>
+<source>Show hidden dialogs again</source>
+<target>Ponovno prikaži skrita pogovorna okna</target>
-<source>Delay (in seconds):</source>
-<target>Zakasnitev (v sekundah):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Prikaži vsa trajno skrita pogovorna okna in opozorilna sporočila</target>
<source>Customize context menu:</source>
<target>Prilagodi kontekstni meni:</target>
@@ -1302,12 +1302,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Description</source>
<target>Opis</target>
-<source>Show hidden dialogs again</source>
-<target>Ponovno prikaži skrita pogovorna okna</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Prikaži vsa trajno skrita pogovorna okna in opozorilna sporočila</target>
-
<source>&Default</source>
<target>&Privzeto</target>
@@ -1365,13 +1359,19 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Highlight configurations that have not been run for more than the following number of days:</source>
<target>Označite konfiguracije, ki se ne izvajajo več kot naslednje število dni:</target>
+<source>Synchronization Settings</source>
+<target>Nastavitve sinhnorizacije</target>
+
+<source>Access Online Storage</source>
+<target>Dostop do spletne shrambe</target>
+
<source>Save as a Batch Job</source>
<target>Shrani kot paketno opravilo</target>
<source>Delete Items</source>
<target>Izbriši postavke</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Kopiraj postavke</target>
<source>Options</source>
@@ -1619,6 +1619,9 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Paused</source>
<target>Začasno ustavljeno</target>
+<source>Stop requested...</source>
+<target>Ustavi zahtevano...</target>
+
<source>Initializing...</source>
<target>Inicializiram...</target>
@@ -1628,9 +1631,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Comparing content...</source>
<target>Primerjam vsebino...</target>
-<source>Completed</source>
-<target>Zaključeno</target>
-
<source>Info</source>
<target>Info</target>
@@ -1718,12 +1718,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Parameters for opposite side</source>
<target>Parametri za nasprotno stran</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Ponovno prikažem skrita pogovorna okna in opozorilna sporočila?</target>
-
-<source>&Show</source>
-<target>&Prikaži</target>
-
<source>Downloading update...</source>
<target>Prenašam posodobitve...</target>
@@ -1748,9 +1742,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Configure your own synchronization rules.</source>
<target>Konfigurirajte vaša lastna sinhronizacijska pravila.</target>
-<source>Synchronization Settings</source>
-<target>Nastavitve sinhnorizacije</target>
-
<source>Comparison</source>
<target>Primerjava</target>
@@ -2004,7 +1995,7 @@ To zagotavlja dosledno stanje tudi v primeru resne napake.
<source>Desktop</source>
<target>Namizje</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Meni Start</target>
<source>Send To</source>
diff --git a/FreeFileSync/Build/Languages/spanish.lng b/FreeFileSync/Build/Languages/spanish.lng
index a6c0ff4c..d440e564 100755
--- a/FreeFileSync/Build/Languages/spanish.lng
+++ b/FreeFileSync/Build/Languages/spanish.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Error de sintaxis</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Se esperan dos rutas de directorio izquierdo y derecho después de %x.</target>
+
<source>Cannot find file %x.</source>
<target>No se encuentra el archivo %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Si ignora este error, las carpetas se consideran vacías. Las carpetas que faltan son creadas automáticamente si es necesario.</target>
+<source>Comparison finished:</source>
+<target>Comparación finalizada:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 elemento encontrado</pluralform>
+<pluralform>%x elementos encontrados</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>El archivo %x tiene una fecha inválida.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Uso de configuración global no predeterminada:</target>
-<source>Starting comparison</source>
-<target>Iniciando la comparación</target>
-
<source>A folder input field is empty.</source>
<target>Un campo de entrada de la carpeta está vacío.</target>
@@ -318,15 +330,15 @@ Reales: %y bytes
<source>Unable to move %x to the recycle bin.</source>
<target>No es posible mover %x a la papelera de reciclaje.</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 find %x.</source>
-<target>No se encuentra %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>El tipo de objeto %x no esta soportado:</target>
@@ -432,6 +444,9 @@ Reales: %y bytes
<source>Lock owner:</source>
<target>Bloquear propietario:</target>
+<source>Detecting abandoned lock...</source>
+<target>Detección de bloqueo abandonado...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Reales: %y bytes
<pluralform>%x seg.</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Detección de bloqueo abandonado...</target>
-
<source>Items processed:</source>
<target>Elementos procesados:</target>
@@ -456,8 +468,8 @@ Reales: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Error analizando archivo %x, fila %y, columna %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>No se pudo bloquear el directorio %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>No se pudieron bloquear directorios para las carpetas siguientes:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Reales: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>El nombre de volumen %x no es parte de la ruta de archivo %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Detención solicitada: esperando a que la operación actual finalice...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>No es posible crear la fecha y hora para el versionado:</target>
@@ -513,6 +522,9 @@ Reales: %y bytes
<source>Select a folder</source>
<target>Seleccione una carpeta</target>
+<source>&New</source>
+<target>&Nuevo</target>
+
<source>&Open...</source>
<target>&Abrir...</target>
@@ -728,26 +740,23 @@ El comando es disparado si:
<source>job name</source>
<target>nombre de tarea</target>
-<source>Show summary</source>
-<target>Mostrar recapitulativo</target>
+<source>System: Sleep</source>
+<target>Sistema: suspender</target>
-<source>Sleep</source>
-<target>Suspender</target>
+<source>System: Shut down</source>
+<target>Sistema: apagar</target>
-<source>Shut down</source>
-<target>Apagar</target>
-
-<source>Synchronization stopped</source>
-<target>Sincronización detenida</target>
+<source>Cleaning up old log files...</source>
+<target>Limpiando antiguos archivos de registro...</target>
<source>Stopped</source>
<target>Detenido</target>
-<source>Synchronization completed with errors</source>
-<target>Sincronización completada con errores</target>
+<source>Completed with errors</source>
+<target>Completado con errores</target>
-<source>Synchronization completed with warnings</source>
-<target>Sincronización completada con avisos</target>
+<source>Completed with warnings</source>
+<target>Completado con avisos</target>
<source>Warning</source>
<target>Atención</target>
@@ -755,15 +764,12 @@ El comando es disparado si:
<source>Nothing to synchronize</source>
<target>Nada que sincronizar</target>
-<source>Synchronization completed successfully</source>
-<target>Sincronización completada satisfactoriamente</target>
+<source>Completed successfully</source>
+<target>Completado con éxito</target>
<source>Executing command %x</source>
<target>Ejecución del comando %x</target>
-<source>Cleaning up old log files...</source>
-<target>Limpiando antiguos archivos de registro...</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>
@@ -779,14 +785,8 @@ El comando es disparado si:
<source>Switching to FreeFileSync's main window</source>
<target>Cambiar a la ventana principal de FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Reintento automático en 1 segundo...</pluralform>
-<pluralform>Reintento automático en %x segundos...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Reintento automático</target>
<source>Ignore &all</source>
<target>Ignorar &todo</target>
@@ -797,6 +797,27 @@ El comando es disparado si:
<source>Serious Error</source>
<target>Error grave</target>
+<source>Last session</source>
+<target>Última sesión</target>
+
+<source>Today</source>
+<target>Hoy</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 día</pluralform>
+<pluralform>%x días</pluralform>
+</target>
+
+<source>Name</source>
+<target>Nombre</target>
+
+<source>Last sync</source>
+<target>Última sincronización</target>
+
<source>Folder</source>
<target>Carpeta</target>
@@ -860,9 +881,6 @@ El comando es disparado si:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Seleccione otra carpeta del systema de archivos local, en red o en un dispositivo MTP.</target>
-<source>&New</source>
-<target>&Nuevo</target>
-
<source>&Save</source>
<target>&Guardar</target>
@@ -974,6 +992,9 @@ El comando es disparado si:
<source>Total bytes to copy</source>
<target>Total de bytes a copiar</target>
+<source>Arrange folder pair</source>
+<target>Reorganizar pares de carpetas</target>
+
<source>Folder pair:</source>
<target>Par de carpetas:</target>
@@ -1066,11 +1087,14 @@ El comando es disparado si:
<source>Naming convention:</source>
<target>Convención de nombre:</target>
-<source>&Ignore errors</source>
-<target>&Ignorar errores</target>
+<source>Ignore errors</source>
+<target>Ignorar errores</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Mostrar ventana emergente de errores o avisos</target>
+<source>Retry count:</source>
+<target>Cuenta de reintentos:</target>
+
+<source>Delay (in seconds):</source>
+<target>Retardo (en segundos):</target>
<source>Run a command after synchronization:</source>
<target>Ejecutar un comando tras la sincronización:</target>
@@ -1078,9 +1102,6 @@ El comando es disparado si:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Reorganizar pares de carpetas</target>
-
<source>Enter your login details:</source>
<target>Escriba sus datos de conexión:</target>
@@ -1177,12 +1198,12 @@ El comando es disparado si:
<source>Minimize to notification area</source>
<target>Minimizar en el área de notificación</target>
-<source>Bytes copied:</source>
-<target>Bytes copiados:</target>
-
<source>When finished:</source>
<target>Tras finalizar:</target>
+<source>Auto-close</source>
+<target>Cierre automático</target>
+
<source>Close</source>
<target>Cerrar</target>
@@ -1195,12 +1216,18 @@ El comando es disparado si:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Crear tarea por lotes para sincronización desatendida. Para iniciar, haga doble clic en este archivo o prográmelo en el planificador de tareas : %x</target>
+<source>Progress dialog:</source>
+<target>Diálogo de progreso:</target>
+
<source>Run minimized</source>
<target>Ejecutar minimizado</target>
<source>&Show error dialog</source>
<target>Mo&strar diálogo de error</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Mostrar ventana emergente de errores o avisos</target>
+
<source>&Cancel</source>
<target>&Cancelar</target>
@@ -1249,14 +1276,11 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Transfer file and folder permissions.</source>
<target>Transferir permisos de archivos y carpetas.</target>
-<source>Automatic retry on error:</source>
-<target>Retardo automático en caso de error :</target>
-
-<source>Retry count:</source>
-<target>Cuenta de reintentos:</target>
+<source>Show hidden dialogs again</source>
+<target>Volver a mostrar los diálogos ocultos</target>
-<source>Delay (in seconds):</source>
-<target>Retardo (en segundos):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Volver a mostrar todos los diálogos y mensajes de advertencia que fueron permanentemente ocultados</target>
<source>Customize context menu:</source>
<target>Personalizar menú contextual :</target>
@@ -1264,12 +1288,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Description</source>
<target>Descripción</target>
-<source>Show hidden dialogs again</source>
-<target>Volver a mostrar los diálogos ocultos</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Volver a mostrar todos los diálogos y mensajes de advertencia que fueron permanentemente ocultados</target>
-
<source>&Default</source>
<target>&Configuración predeterminada</target>
@@ -1280,7 +1298,7 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<target>Si te resulta útil FreeFileSync:</target>
<source>Support with a donation</source>
-<target>¿Contribuye con tu donación!</target>
+<target>¡Contribuye con una donación!</target>
<source>Donation details</source>
<target>Detalles para donación</target>
@@ -1324,13 +1342,22 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Activate offline</source>
<target>Activar sin conexión</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Resaltar las configuraciones no utilizadas desde hace más del número de días:</target>
+
+<source>Synchronization Settings</source>
+<target>Opciones de sincronización</target>
+
+<source>Access Online Storage</source>
+<target>Acceder a almacenamiento en línea</target>
+
<source>Save as a Batch Job</source>
<target>Guardar como una tarea por lotes</target>
<source>Delete Items</source>
<target>Eliminar elementos</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Copiar elementos</target>
<source>Options</source>
@@ -1342,6 +1369,9 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Resaltar configuraciones</target>
+
<source>&Options</source>
<target>&Opciones</target>
@@ -1465,9 +1495,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Select time span...</source>
<target>Seleccionar duración...</target>
-<source>Last session</source>
-<target>Última sesión</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Comparación y sincronización de carpetas</target>
@@ -1486,8 +1513,11 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Do&n't save</source>
<target>&No guardar</target>
-<source>Remove entry from list</source>
-<target>Retirar la entrada de la lista</target>
+<source>Hide configuration</source>
+<target>Ocultar configuración</target>
+
+<source>Highlight...</source>
+<target>Resaltar...</target>
<source>Clear filter</source>
<target>Borrar filtro</target>
@@ -1567,6 +1597,9 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Paused</source>
<target>Pausado</target>
+<source>Stop requested...</source>
+<target>Detención solicitada...</target>
+
<source>Initializing...</source>
<target>Inicializando...</target>
@@ -1576,9 +1609,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Comparing content...</source>
<target>Comparando contenido...</target>
-<source>Completed</source>
-<target>Terminado</target>
-
<source>Info</source>
<target>Info</target>
@@ -1660,12 +1690,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Parameters for opposite side</source>
<target>Parámetros del lado opuesto</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>¿Volver a mostrar los diálogos ocultos y las advertencias?</target>
-
-<source>&Show</source>
-<target>Mo&strar</target>
-
<source>Downloading update...</source>
<target>Descargando actualización...</target>
@@ -1690,18 +1714,12 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Configure your own synchronization rules.</source>
<target>Configurar reglas de sincronización personalizadas.</target>
-<source>Synchronization Settings</source>
-<target>Opciones de sincronización</target>
-
<source>Comparison</source>
<target>Comparación</target>
<source>Synchronization</source>
<target>Sincronización</target>
-<source>Today</source>
-<target>Hoy</target>
-
<source>This week</source>
<target>Esta semana</target>
@@ -1771,9 +1789,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Files</source>
<target>Archivos</target>
-<source>Name</source>
-<target>Nombre</target>
-
<source>Percentage</source>
<target>Porcentaje</target>
@@ -1885,15 +1900,6 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<pluralform>%x horas</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 día</pluralform>
-<pluralform>%x días</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>No se puede asignar el privilegio %x.</target>
@@ -1957,9 +1963,12 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<source>Desktop</source>
<target>Escritorio</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Menú Inicio</target>
+<source>Send To</source>
+<target>Enviar a</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>Registrando las extensiones de archivo de FreeFileSync</target>
@@ -1976,17 +1985,17 @@ Esto garantiza un estado coherente incluso en caso de error grave.
<target>Base de datos de sincronización de FreeFileSync</target>
<source>RealTimeSync Configuration</source>
-<target>Configuration de RealTimeSync</target>
+<target>Configuración de RealTimeSync</target>
<source>Edit with FreeFileSync</source>
<target>Modificar con FreeFileSync</target>
<source>The FreeFileSync portable version cannot install into a subfolder of %x.</source>
-<target>No se puede instalar la version portátil de FreeFileSync en una subcarpeta de %x.</target>
+<target>No se puede instalar la versión portátil de FreeFileSync en una subcarpeta de %x.</target>
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Elija el tipo de instalación local o seleccione otra carpeta de instalación.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>El modo de instalación silenciosa sólo está disponible para FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>La opción %x de instalación sólo está disponible para la versión FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Languages/swedish.lng b/FreeFileSync/Build/Languages/swedish.lng
index 87f17c27..6963e231 100755
--- a/FreeFileSync/Build/Languages/swedish.lng
+++ b/FreeFileSync/Build/Languages/swedish.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Syntaxfel</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>En vänster och en höger mappsökväg förväntas efter %x.</target>
+
<source>Cannot find file %x.</source>
<target>Kan inte hitta filen %x.</target>
@@ -115,6 +118,18 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Om detta fel ignoreras, kommer mapparna att betraktas som tomma. Saknade mappar skapas automatiskt vid behov.</target>
+<source>Comparison finished:</source>
+<target>Jämförelse slutförd:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 objekt hittat</pluralform>
+<pluralform>%x objekt hittade</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Filen %x har ett ogiltigt datum.</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Använder icke-standard globala inställningar:</target>
-<source>Starting comparison</source>
-<target>Startar jämförelse</target>
-
<source>A folder input field is empty.</source>
<target>Ett inmatningsfält är tomt.</target>
@@ -318,15 +330,15 @@ Aktuell: %y byte
<source>Unable to move %x to the recycle bin.</source>
<target>Kan inte att flytta %x till papperskorgen.</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 find %x.</source>
-<target>Kan inte hitta %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Objekttyp %x stöds ej:</target>
@@ -432,6 +444,9 @@ Aktuell: %y byte
<source>Lock owner:</source>
<target>Låsägare:</target>
+<source>Detecting abandoned lock...</source>
+<target>Söker övergivna lås...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Aktuell: %y byte
<pluralform>%x sek</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Söker övergivna lås...</target>
-
<source>Items processed:</source>
<target>Processade poster:</target>
@@ -456,8 +468,8 @@ Aktuell: %y byte
<source>Error parsing file %x, row %y, column %z.</source>
<target>Tolkningsfel på filen %x, rad %y, kolumn %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Kan inte låsa %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Kan inte ange mapplås för följanda mappar:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Aktuell: %y byte
<source>Volume name %x is not part of file path %y.</source>
<target>Volymnamnet %x är inte en del av sökvägen %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Stopp begärt: Väntar på att aktuell åtgärd skall slutföras...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Kunde inte skapa tidsstämpel för versionshantering:</target>
@@ -513,6 +522,9 @@ Aktuell: %y byte
<source>Select a folder</source>
<target>Välj en mapp</target>
+<source>&New</source>
+<target>&Nytt</target>
+
<source>&Open...</source>
<target>&Öppna...</target>
@@ -728,26 +740,23 @@ Kommandot triggas om:
<source>job name</source>
<target>åtgärdsnamn</target>
-<source>Show summary</source>
-<target>Visa sammandrag</target>
+<source>System: Sleep</source>
+<target>System: Viloläge</target>
-<source>Sleep</source>
-<target>Strömsparläge</target>
+<source>System: Shut down</source>
+<target>System: Stäng av</target>
-<source>Shut down</source>
-<target>Stäng av datorn</target>
-
-<source>Synchronization stopped</source>
-<target>Synkroniseringen stoppad</target>
+<source>Cleaning up old log files...</source>
+<target>Rensar ut gamla loggfiler...</target>
<source>Stopped</source>
<target>Stoppad</target>
-<source>Synchronization completed with errors</source>
-<target>Synkronisering slutförd med fel</target>
+<source>Completed with errors</source>
+<target>Slutförd med fel</target>
-<source>Synchronization completed with warnings</source>
-<target>Synkronisering slutförd med varningar</target>
+<source>Completed with warnings</source>
+<target>Slutförd med varningar</target>
<source>Warning</source>
<target>Varning</target>
@@ -755,15 +764,12 @@ Kommandot triggas om:
<source>Nothing to synchronize</source>
<target>Det finns inget att synkronisera</target>
-<source>Synchronization completed successfully</source>
-<target>Synkronisering slutförd</target>
+<source>Completed successfully</source>
+<target>Korrekt slutförd</target>
<source>Executing command %x</source>
<target>Kör kommandot %x</target>
-<source>Cleaning up old log files...</source>
-<target>Rensar ut gamla loggfiler...</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>
@@ -779,14 +785,8 @@ Kommandot triggas om:
<source>Switching to FreeFileSync's main window</source>
<target>Växla till FreeFileSyncs programfönster</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Automatiskt återförsök om 1 sekund...</pluralform>
-<pluralform>Automatiskt återförsök om %x sekunder...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Automatiskt återförsök</target>
<source>Ignore &all</source>
<target>Ignorera &fel</target>
@@ -797,6 +797,27 @@ Kommandot triggas om:
<source>Serious Error</source>
<target>Allvarligt fel</target>
+<source>Last session</source>
+<target>Senaste session</target>
+
+<source>Today</source>
+<target>Idag</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 dag</pluralform>
+<pluralform>%x dagar</pluralform>
+</target>
+
+<source>Name</source>
+<target>Namn</target>
+
+<source>Last sync</source>
+<target>Senaste synkronisering</target>
+
<source>Folder</source>
<target>Mapp</target>
@@ -860,9 +881,6 @@ Kommandot triggas om:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Välj en mapp på i ett lokalt filsystem, nätverk eller en MTP-enhet.</target>
-<source>&New</source>
-<target>&Nytt</target>
-
<source>&Save</source>
<target>&Spara</target>
@@ -974,6 +992,9 @@ Kommandot triggas om:
<source>Total bytes to copy</source>
<target>Byte att kopiera</target>
+<source>Arrange folder pair</source>
+<target>Arrangera katalogpar</target>
+
<source>Folder pair:</source>
<target>Katalogpar:</target>
@@ -1066,11 +1087,14 @@ Kommandot triggas om:
<source>Naming convention:</source>
<target>Regler för namngivning:</target>
-<source>&Ignore errors</source>
-<target>&Ignorera fel</target>
+<source>Ignore errors</source>
+<target>Ignorera fel</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Visa popup vid fel och varningar</target>
+<source>Retry count:</source>
+<target>Antal försök:</target>
+
+<source>Delay (in seconds):</source>
+<target>Fördröjning (i sekunder):</target>
<source>Run a command after synchronization:</source>
<target>Kör ett kommando efter synkronisering:</target>
@@ -1078,9 +1102,6 @@ Kommandot triggas om:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Arrangera katalogpar</target>
-
<source>Enter your login details:</source>
<target>Ange dina inloggningsuppgifter:</target>
@@ -1177,12 +1198,12 @@ Kommandot triggas om:
<source>Minimize to notification area</source>
<target>Minimera till meddelandefältet</target>
-<source>Bytes copied:</source>
-<target>Kopierade byte:</target>
-
<source>When finished:</source>
<target>Vid slutfört:</target>
+<source>Auto-close</source>
+<target>Stäng automatiskt</target>
+
<source>Close</source>
<target>Stäng</target>
@@ -1195,12 +1216,18 @@ Kommandot triggas om:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Skapa en batch-fil för obevakad synkronisering. Dubbelklicka på filen för att starta den, eller schemalägg i en åtgärdshanterare: %x</target>
+<source>Progress dialog:</source>
+<target>Förloppsdialog:</target>
+
<source>Run minimized</source>
<target>Kör minimerad</target>
<source>&Show error dialog</source>
<target>&Visa feldialog</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Visa popup vid fel och varningar</target>
+
<source>&Cancel</source>
<target>&Avbryt</target>
@@ -1249,14 +1276,11 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Transfer file and folder permissions.</source>
<target>Överför behörighetsinställningar.</target>
-<source>Automatic retry on error:</source>
-<target>Automatiska återförsök vid fel:</target>
-
-<source>Retry count:</source>
-<target>Antal försök:</target>
+<source>Show hidden dialogs again</source>
+<target>Visa dolda dialoger igen</target>
-<source>Delay (in seconds):</source>
-<target>Fördröjning (i sekunder):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Visa alla permanent dolda dialoger och varningsmeddelanden igen</target>
<source>Customize context menu:</source>
<target>Anpassad kontextmeny:</target>
@@ -1264,12 +1288,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Description</source>
<target>Beskrivning</target>
-<source>Show hidden dialogs again</source>
-<target>Visa dolda dialoger igen</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Visa alla permanent dolda dialoger och varningsmeddelanden igen</target>
-
<source>&Default</source>
<target>&Standard</target>
@@ -1324,13 +1342,22 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Activate offline</source>
<target>Aktivera offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Färgmarkera konfigurationer som inte har körts på mer än följande antal dagar:</target>
+
+<source>Synchronization Settings</source>
+<target>Synkroniseringsinställningar</target>
+
+<source>Access Online Storage</source>
+<target>Anslut online-lagring</target>
+
<source>Save as a Batch Job</source>
<target>Spara som batch-fil</target>
<source>Delete Items</source>
<target>Ta bort objekt</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Kopiera objekt</target>
<source>Options</source>
@@ -1342,6 +1369,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Färgmarkera konfigurationer</target>
+
<source>&Options</source>
<target>&Alternativ</target>
@@ -1465,9 +1495,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Select time span...</source>
<target>Välj tidsintervall...</target>
-<source>Last session</source>
-<target>Senaste session</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Mappjämförelse och synkronisering</target>
@@ -1486,8 +1513,11 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Do&n't save</source>
<target>Spara &inte</target>
-<source>Remove entry from list</source>
-<target>Ta bort post från listan</target>
+<source>Hide configuration</source>
+<target>Dölj konfigurationen</target>
+
+<source>Highlight...</source>
+<target>Färgmarkera...</target>
<source>Clear filter</source>
<target>Rensa filter</target>
@@ -1567,6 +1597,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Paused</source>
<target>Pausad</target>
+<source>Stop requested...</source>
+<target>Stopp begärt...</target>
+
<source>Initializing...</source>
<target>Initierar...</target>
@@ -1576,9 +1609,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Comparing content...</source>
<target>Jämför innehåll...</target>
-<source>Completed</source>
-<target>Slutförd</target>
-
<source>Info</source>
<target>Info</target>
@@ -1660,12 +1690,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Parameters for opposite side</source>
<target>Parametrar för motstående sida</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Vill du visa dolda dialoger och varningsmeddelanden igen?</target>
-
-<source>&Show</source>
-<target>&Visa</target>
-
<source>Downloading update...</source>
<target>Laddar ner uppdatering...</target>
@@ -1690,18 +1714,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Configure your own synchronization rules.</source>
<target>Konfigurera dina egna synkroniseringsregler.</target>
-<source>Synchronization Settings</source>
-<target>Synkroniseringsinställningar</target>
-
<source>Comparison</source>
<target>Jämförelse</target>
<source>Synchronization</source>
<target>Synkronisering</target>
-<source>Today</source>
-<target>Idag</target>
-
<source>This week</source>
<target>Denna veckan</target>
@@ -1771,9 +1789,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Files</source>
<target>Filer</target>
-<source>Name</source>
-<target>Namn</target>
-
<source>Percentage</source>
<target>Procent</target>
@@ -1885,15 +1900,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<pluralform>%x timmar</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 dag</pluralform>
-<pluralform>%x dagar</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Kan inte att ange behörigheten %x.</target>
@@ -1957,9 +1963,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Desktop</source>
<target>Skrivbord</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Startmeny</target>
+<source>Send To</source>
+<target>Skicka till</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>Registrerar filformat för FreeFileSync</target>
@@ -1987,6 +1996,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Välj lokal installationstyp eller välj en annan mapp för installationen.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Tyst installationsläge är endast tillgängligt i FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>Installationsalternativet %x är endast tillgängligt i FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Languages/turkish.lng b/FreeFileSync/Build/Languages/turkish.lng
index 5afdd52e..8a87fc93 100755
--- a/FreeFileSync/Build/Languages/turkish.lng
+++ b/FreeFileSync/Build/Languages/turkish.lng
@@ -64,11 +64,14 @@
<source>Syntax error</source>
<target>Yazım hatası</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>%x ardından sol ve sağ klasör belirtilmelidir.</target>
+
<source>Cannot find file %x.</source>
<target>%x dosyası bulunamadı.</target>
<source>Error</source>
-<target>Hata</target>
+<target>Sorun</target>
<source>File %x does not contain a valid configuration.</source>
<target>%x dosyası geçerli yapılandırma bilgilerini içermiyor.</target>
@@ -77,7 +80,7 @@
<target>Sağdan ve soldan seçilen klasör sayısı aynı değil.</target>
<source>The config file must not contain settings at directory pair level when directories are set via command line.</source>
-<target>Klasörler komut satırından seçildiği zaman, ayar dosyasında klasör çifti düzeyinde ayarlar bulunmamalıdır.</target>
+<target>Klasörler komut satırından seçildiği zaman, yapılandırma dosyasında klasör çifti düzeyinde ayarlar bulunmamalıdır.</target>
<source>Directories cannot be set for more than one configuration file.</source>
<target>Klasörler birden fazla yapılandırma dosyasında kullanılamaz.</target>
@@ -89,19 +92,19 @@
<target>Yazım:</target>
<source>config files:</source>
-<target>ayar dosyaları:</target>
+<target>yapılandırma dosyaları:</target>
<source>directory</source>
<target>klasör</target>
<source>global config file:</source>
-<target>genel ayar dosyası:</target>
+<target>genel yapılandırma dosyası:</target>
<source>Any number of FreeFileSync .ffs_gui and/or .ffs_batch configuration files.</source>
<target>FreeFileSync .ffs_gui ya da .ffs_batch yapılandırma dosyalarının sayısı.</target>
<source>Any number of alternative directory pairs for at most one config file.</source>
-<target>En fazla bir ayar dosyası için herhangi bir sayıda alternatif klasör çifti.</target>
+<target>En fazla bir yapılandırma dosyası için herhangi bir sayıda alternatif klasör çifti.</target>
<source>Open the selected configuration for editing only without executing it.</source>
<target>Seçilmiş yapılandırmayı yürütmeden yalnız düzenlemek için açar.</target>
@@ -113,7 +116,19 @@
<target>Aşağıdaki klasörler bulunamadı:</target>
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
-<target>Bu sorun yoksayılırsa klasörler boş olarak kabul edilir. Eksik klasörler gerek duyulduğunda otomatik olarak oluşturulur.</target>
+<target>Bu sorun yok sayılırsa klasörler boş olarak kabul edilir. Eksik klasörler gerek duyulduğunda otomatik olarak oluşturulur.</target>
+
+<source>Comparison finished:</source>
+<target>Karşılaştırma tamamlandı:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>1 öge bulundu</pluralform>
+<pluralform>%x öge bulundu</pluralform>
+</target>
<source>File %x has an invalid date.</source>
<target>%x dosyasının tarihi geçersiz.</target>
@@ -143,7 +158,7 @@
<target>Dosya listesi oluşturuluyor...</target>
<source>Fail-safe file copy</source>
-<target>Dosyalar Hatasız Kopyalansın</target>
+<target>Dosyalar Sorunsuz Kopyalansın</target>
<source>Enabled</source>
<target>Etkin</target>
@@ -158,7 +173,7 @@
<target>Dosya Erişim İzinleri de Kopyalansın</target>
<source>File time tolerance</source>
-<target>Yoksayılacak dosya zamanı farkı</target>
+<target>Yok sayılacak dosya zamanı farkı</target>
<source>Folder access timeout</source>
<target>Klasör erişimi zaman aşımı</target>
@@ -175,9 +190,6 @@
<source>Using non-default global settings:</source>
<target>Varsayılan olmayan genel ayarlar kullanılıyor:</target>
-<source>Starting comparison</source>
-<target>Karşılaştırmaya başlanıyor</target>
-
<source>A folder input field is empty.</source>
<target>Bir klasör giriş alanı boş.</target>
@@ -318,15 +330,15 @@ Gerçekleşen: %y bayt
<source>Unable to move %x to the recycle bin.</source>
<target>%x geri dönüşüm kutusuna atılamadı.</target>
+<source>Cannot find %x.</source>
+<target>%x bulunamadı.</target>
+
<source>Cannot open file %x.</source>
<target>%x dosyası açılamadı.</target>
<source>Cannot find device %x.</source>
<target>%x aygıtı bulunamadı.</target>
-<source>Cannot find %x.</source>
-<target>%x bulunamadı.</target>
-
<source>Type of item %x is not supported:</source>
<target>%x ögesi türü desteklenmiyor:</target>
@@ -432,6 +444,9 @@ Gerçekleşen: %y bayt
<source>Lock owner:</source>
<target>Kilitleyen:</target>
+<source>Detecting abandoned lock...</source>
+<target>Kaldırılmış kilit algılanıyor...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -441,9 +456,6 @@ Gerçekleşen: %y bayt
<pluralform>%x saniye</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Kaldırılmış kilit algılanıyor...</target>
-
<source>Items processed:</source>
<target>İşlenen öge:</target>
@@ -454,10 +466,10 @@ Gerçekleşen: %y bayt
<target>Toplam süre:</target>
<source>Error parsing file %x, row %y, column %z.</source>
-<target>%x dosyası işlenirken hata, satır %y, sütun %z.</target>
+<target>%x dosyası işlenirken sorun çıktı, satır %y, sütun %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>%x için klasör kilidi uygulanamadı.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Şu klasörler kilitlenemedi:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -498,9 +510,6 @@ Gerçekleşen: %y bayt
<source>Volume name %x is not part of file path %y.</source>
<target>%x birim adı %y dosya yolunun bir parçası değil.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Durdurma istendi: Yürürlükteki işlemin bitmesi bekleniyor...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Sürümlendirme için zaman damgası oluşturulamadı:</target>
@@ -513,6 +522,9 @@ Gerçekleşen: %y bayt
<source>Select a folder</source>
<target>Bir klasör seçin</target>
+<source>&New</source>
+<target>&Yeni</target>
+
<source>&Open...</source>
<target>&Aç...</target>
@@ -672,7 +684,7 @@ Komut şu durumlarda yürütülür:
<target>%x ve %y farklı içeriklere sahip.</target>
<source>Data verification error:</source>
-<target>Veri doğrulama hatası:</target>
+<target>Veri doğrulama sorunu:</target>
<source>Creating a Volume Shadow Copy for %x...</source>
<target>%x için Birim Gölge Hizmeti oluşturuluyor...</target>
@@ -728,26 +740,23 @@ Komut şu durumlarda yürütülür:
<source>job name</source>
<target>iş adı</target>
-<source>Show summary</source>
-<target>Özet Görüntülensin</target>
+<source>System: Sleep</source>
+<target>Sistem: Uyku</target>
-<source>Sleep</source>
-<target>Bilgisayar Uykuya Dalsın</target>
+<source>System: Shut down</source>
+<target>Sistem: Kapat</target>
-<source>Shut down</source>
-<target>Bilgisayar Kapatılsın</target>
-
-<source>Synchronization stopped</source>
-<target>Eşitleme durduruldu</target>
+<source>Cleaning up old log files...</source>
+<target>Eski günlük dosyaları temizleniyor...</target>
<source>Stopped</source>
<target>Durduruldu</target>
-<source>Synchronization completed with errors</source>
-<target>Eşitleme bazı hatalarla tamamlandı</target>
+<source>Completed with errors</source>
+<target>Sorunlar ile tamamlandı</target>
-<source>Synchronization completed with warnings</source>
-<target>Eşitleme bazı uyarılar ile tamamlandı</target>
+<source>Completed with warnings</source>
+<target>Uyarılar ile tamamlandı</target>
<source>Warning</source>
<target>Uyarı</target>
@@ -755,15 +764,12 @@ Komut şu durumlarda yürütülür:
<source>Nothing to synchronize</source>
<target>Eşitlenecek bir şey yok</target>
-<source>Synchronization completed successfully</source>
-<target>Eşitleme tamamlandı</target>
+<source>Completed successfully</source>
+<target>Tamamlandı</target>
<source>Executing command %x</source>
<target>%x komutu yürütülüyor</target>
-<source>Cleaning up old log files...</source>
-<target>Eski günlük dosyaları temizleniyor...</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>
@@ -771,7 +777,7 @@ Komut şu durumlarda yürütülür:
<target>Bu &uyarı bir daha görüntülenmesin</target>
<source>&Ignore</source>
-<target>&Yoksay</target>
+<target>&Yok Say</target>
<source>&Switch</source>
<target>&Değiştir</target>
@@ -779,14 +785,8 @@ Komut şu durumlarda yürütülür:
<source>Switching to FreeFileSync's main window</source>
<target>FreeFileSync ana penceresine geçiliyor</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>1 saniye içinde yeniden denenecek...</pluralform>
-<pluralform>%x saniye içinde yeniden denenecek...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Otomatik yeniden denensin</target>
<source>Ignore &all</source>
<target>Tümünü Yok S&ay</target>
@@ -795,7 +795,28 @@ Komut şu durumlarda yürütülür:
<target>İşlem yeniden deneniyor...</target>
<source>Serious Error</source>
-<target>Ciddi Hata</target>
+<target>Ciddi Sorun</target>
+
+<source>Last session</source>
+<target>Önceki oturum</target>
+
+<source>Today</source>
+<target>Bugün</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>1 gün</pluralform>
+<pluralform>%x gün</pluralform>
+</target>
+
+<source>Name</source>
+<target>Ad</target>
+
+<source>Last sync</source>
+<target>Son eşitleme</target>
<source>Folder</source>
<target>Klasör</target>
@@ -822,7 +843,7 @@ Komut şu durumlarda yürütülür:
<target>Uzantı</target>
<source>Category</source>
-<target>Öge Tipi</target>
+<target>Öge Türü</target>
<source>Action</source>
<target>İşlem</target>
@@ -860,9 +881,6 @@ Komut şu durumlarda yürütülür:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Lütfen yerel dosya sistemi, ağ ya da MTP aygıtı üzerinde bulunan bir klasör seçin.</target>
-<source>&New</source>
-<target>&Yeni</target>
-
<source>&Save</source>
<target>&Kaydet</target>
@@ -974,6 +992,9 @@ Komut şu durumlarda yürütülür:
<source>Total bytes to copy</source>
<target>Toplam kopyalanacak bayt</target>
+<source>Arrange folder pair</source>
+<target>Klasör çiftini belirleyin</target>
+
<source>Folder pair:</source>
<target>Klasör Çifti:</target>
@@ -984,7 +1005,7 @@ Komut şu durumlarda yürütülür:
<target>Yerel Ayarlar Kullanılsın:</target>
<source>Select a variant:</source>
-<target>İşlem Tipini Seçin:</target>
+<target>İşlem Türünü Seçin:</target>
<source>Include &symbolic links:</source>
<target>&Sembolik Bağlantılar Katılsın:</target>
@@ -999,10 +1020,10 @@ Komut şu durumlarda yürütülür:
<target>Ayrıntılı Bilgiler</target>
<source>&Ignore time shift [hh:mm]</source>
-<target>&Yoksayılacak Zaman Farkı [ss:dd]</target>
+<target>&Yok Sayılacak Zaman Farkı [ss:dd]</target>
<source>List of file time offsets to ignore</source>
-<target>Zaman farkı yoksayılacak dosyaların listesi</target>
+<target>Zaman farkı yok sayılacak dosyaların listesi</target>
<source>Example:</source>
<target>Örnek:</target>
@@ -1066,11 +1087,14 @@ Komut şu durumlarda yürütülür:
<source>Naming convention:</source>
<target>Adlandırma Kuralı:</target>
-<source>&Ignore errors</source>
-<target>&Hatalar yok sayılsın</target>
+<source>Ignore errors</source>
+<target>Sorunlar yok sayılsın</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Hata ya da uyarılar açılır pencerede görüntülenir</target>
+<source>Retry count:</source>
+<target>Deneme Sayısı:</target>
+
+<source>Delay (in seconds):</source>
+<target>Bekleme (saniye):</target>
<source>Run a command after synchronization:</source>
<target>Eşitleme sonrası yürütülecek komut:</target>
@@ -1078,9 +1102,6 @@ Komut şu durumlarda yürütülür:
<source>OK</source>
<target>Tamam</target>
-<source>Arrange folder pair</source>
-<target>Klasör çiftini belirleyin</target>
-
<source>Enter your login details:</source>
<target>Oturum açma ayrıntılarınızı yazın:</target>
@@ -1151,7 +1172,7 @@ Komut şu durumlarda yürütülür:
<target>Eşitleme başlatılsın mı?</target>
<source>Variant:</source>
-<target>İşlem Tipi:</target>
+<target>İşlem Türü:</target>
<source>&Don't show this dialog again</source>
<target>Bu pencere bir daha &görüntülenmesin</target>
@@ -1177,12 +1198,12 @@ Komut şu durumlarda yürütülür:
<source>Minimize to notification area</source>
<target>Bildirim alanına küçült</target>
-<source>Bytes copied:</source>
-<target>Kopyalanan bayt:</target>
-
<source>When finished:</source>
<target>Tamamlandığında:</target>
+<source>Auto-close</source>
+<target>Otomatik kapat</target>
+
<source>Close</source>
<target>Kapat</target>
@@ -1195,17 +1216,23 @@ Komut şu durumlarda yürütülür:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Eşitleme işleminin hiç bir soru sorulmadan yapılması için bir toplu iş dosyası oluşturun. İşlemi başlatmak için bu dosyaya çift tıklayın ya da bir görev zamanlayıcıya şu şekilde ekleyin: %x</target>
+<source>Progress dialog:</source>
+<target>İlerleme penceresi:</target>
+
<source>Run minimized</source>
<target>Küçültülmüş Çalıştırılsın</target>
<source>&Show error dialog</source>
-<target>Hata &penceresi görüntülensin</target>
+<target>Sorun &penceresi görüntülensin</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Sorun ya da uyarılar açılır pencerede görüntülenir</target>
<source>&Cancel</source>
<target>İ&ptal edilsin</target>
<source>Stop synchronization at first error</source>
-<target>Oluşacak ilk hatada eşitleme durdurulsun</target>
+<target>Çıkan ilk sorunda eşitleme durdurulsun</target>
<source>Save log:</source>
<target>İşlem Günlüğü Kaydedilsin:</target>
@@ -1234,7 +1261,7 @@ This guarantees a consistent state even in case of a serious error.
</source>
<target>
Dosyalar önce geçici dosyaya kopyalanıp (*.ffs_tmp) sonra yeniden adlandırılır.
-Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak yapılmasını sağlar.
+Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak yapılmasını sağlar.
</target>
<source>recommended</source>
@@ -1249,14 +1276,11 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Transfer file and folder permissions.</source>
<target>Dosya ve klasör izinleri de aktarılır.</target>
-<source>Automatic retry on error:</source>
-<target>Hata Durumunda Yeniden Deneme:</target>
-
-<source>Retry count:</source>
-<target>Deneme Sayısı:</target>
+<source>Show hidden dialogs again</source>
+<target>Gizlenmiş Pencereleri Yeniden Görüntüle</target>
-<source>Delay (in seconds):</source>
-<target>Bekleme (saniye):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Kalıcı olarak gizlenmiş tüm ileti ve uyarılar yeniden görüntülenir</target>
<source>Customize context menu:</source>
<target>Sağ Tık Menüsü Uyarlamaları:</target>
@@ -1264,12 +1288,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Description</source>
<target>Açıklama</target>
-<source>Show hidden dialogs again</source>
-<target>Gizlenmiş Pencereleri Yeniden Görüntüle</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Kalıcı olarak gizlenmiş tüm ileti ve uyarılar yeniden görüntülenir</target>
-
<source>&Default</source>
<target>&Varsayılan</target>
@@ -1324,13 +1342,22 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Activate offline</source>
<target>Çevrimdışı Etkinleştir</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Şu kadar gündür çalıştırılmayan yapılandırmalar vurgulansın:</target>
+
+<source>Synchronization Settings</source>
+<target>Eşitleme Ayarları</target>
+
+<source>Access Online Storage</source>
+<target>Çevrimiçi Depolama Erişimi</target>
+
<source>Save as a Batch Job</source>
<target>Toplu İş Olarak Kaydet</target>
<source>Delete Items</source>
<target>Ögeleri Sil</target>
-<source>Copy items</source>
+<source>Copy Items</source>
<target>Ögeleri Kopyala</target>
<source>Options</source>
@@ -1342,6 +1369,9 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Yapılandırmalar Vurgulansın</target>
+
<source>&Options</source>
<target>&Ayarlar</target>
@@ -1465,9 +1495,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Select time span...</source>
<target>Zaman aralığını seçin...</target>
-<source>Last session</source>
-<target>Önceki oturum</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Klasör Karşılaştırma ve Eşitleme</target>
@@ -1486,8 +1513,11 @@ 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>Remove entry from list</source>
-<target>Kaydı Listeden Sil</target>
+<source>Hide configuration</source>
+<target>Yapılandırma gizlensin</target>
+
+<source>Highlight...</source>
+<target>Vurgula...</target>
<source>Clear filter</source>
<target>Süzgeci Temizle</target>
@@ -1567,6 +1597,9 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Paused</source>
<target>Duraklatıldı</target>
+<source>Stop requested...</source>
+<target>Durdurulması istendi...</target>
+
<source>Initializing...</source>
<target>Başlatılıyor...</target>
@@ -1576,9 +1609,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Comparing content...</source>
<target>İçerik karşılaştırılıyor...</target>
-<source>Completed</source>
-<target>Tamamlandı</target>
-
<source>Info</source>
<target>Bilgi</target>
@@ -1660,12 +1690,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Parameters for opposite side</source>
<target>Diğer tarafın parametreleri</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Gizlenmiş ileti ve uyarılar yeniden görüntülensin mi?</target>
-
-<source>&Show</source>
-<target>&Görüntülensin</target>
-
<source>Downloading update...</source>
<target>Güncelleme indiriliyor...</target>
@@ -1688,10 +1712,7 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<target>Sol taraftaki yeni ya da güncellenmiş dosyalar sağ tarafa kopyalanır.</target>
<source>Configure your own synchronization rules.</source>
-<target>Eşitleme kuralları kullanıcının isteğine göre belirlenir.</target>
-
-<source>Synchronization Settings</source>
-<target>Eşitleme Ayarları</target>
+<target>Eşitleme kuralları kullanıcının isteğine göre yapılandırılır.</target>
<source>Comparison</source>
<target>Karşılaştırma</target>
@@ -1699,9 +1720,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Synchronization</source>
<target>Eşitleme</target>
-<source>Today</source>
-<target>Bugün</target>
-
<source>This week</source>
<target>Bu hafta</target>
@@ -1771,9 +1789,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Files</source>
<target>Dosyalar</target>
-<source>Name</source>
-<target>Ad</target>
-
<source>Percentage</source>
<target>Yüzde</target>
@@ -1885,15 +1900,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<pluralform>%x saat</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>1 gün</pluralform>
-<pluralform>%x gün</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>%x izni verilemedi.</target>
@@ -1957,9 +1963,12 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Desktop</source>
<target>Masaüstü</target>
-<source>Start menu</source>
+<source>Start Menu</source>
<target>Başlat Menüsü</target>
+<source>Send To</source>
+<target>Gönder</target>
+
<source>Registering FreeFileSync file extensions</source>
<target>FreeFileSync dosya uzantıları kayıt defterine ekleniyor</target>
@@ -1987,6 +1996,6 @@ Bu yöntem, ciddi bir hata oluşması durumunda bile işlemin tutarlı olarak ya
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Kurulum için farklı bir klasör ya da yerel kurulum türünü seçin.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Sessiz kurulum kipi yalnız FreeFileSync Donation Edition sürümünde bulunur.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>%x kurulumu yalnız FreeFileSync Donation Sürümü ile yapılabilir.</target>
diff --git a/FreeFileSync/Build/Languages/ukrainian.lng b/FreeFileSync/Build/Languages/ukrainian.lng
index 7de37ffe..855507d3 100755
--- a/FreeFileSync/Build/Languages/ukrainian.lng
+++ b/FreeFileSync/Build/Languages/ukrainian.lng
@@ -64,6 +64,9 @@
<source>Syntax error</source>
<target>Синтаксична помилка</target>
+<source>A left and a right directory path are expected after %x.</source>
+<target>Шлях до каталогу ліворуч і праворуч очікується після %x.</target>
+
<source>Cannot find file %x.</source>
<target>Неможливо знайти файл %x.</target>
@@ -115,6 +118,19 @@
<source>If this error is ignored the folders will be considered empty. Missing folders are created automatically when needed.</source>
<target>Якщо цю помилку буде проігноровано папки будуть вважатися порожніми. Відсутні папки створюються автоматично, коли це необхідно.</target>
+<source>Comparison finished:</source>
+<target>Порівняння завершено:</target>
+
+<source>
+<pluralform>1 item found</pluralform>
+<pluralform>%x items found</pluralform>
+</source>
+<target>
+<pluralform>Знайдено %x элемент</pluralform>
+<pluralform>Знайдено %x элементи</pluralform>
+<pluralform>Знайдено %x элементів</pluralform>
+</target>
+
<source>File %x has an invalid date.</source>
<target>Файл %x має неіснуючу дату.</target>
@@ -175,9 +191,6 @@
<source>Using non-default global settings:</source>
<target>Використовувати глобальні налаштування не за замовчуванням:</target>
-<source>Starting comparison</source>
-<target>Запустити порівняння</target>
-
<source>A folder input field is empty.</source>
<target>Порожнє поле папки.</target>
@@ -318,15 +331,15 @@ Actual: %y bytes
<source>Unable to move %x to the recycle bin.</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 find %x.</source>
-<target>Не вдається знайти %x.</target>
-
<source>Type of item %x is not supported:</source>
<target>Тип елемента %x не підтримується:</target>
@@ -435,6 +448,9 @@ Actual: %y bytes
<source>Lock owner:</source>
<target>Власник блокування:</target>
+<source>Detecting abandoned lock...</source>
+<target>Виявлено покинуте блокування...</target>
+
<source>
<pluralform>1 sec</pluralform>
<pluralform>%x sec</pluralform>
@@ -445,9 +461,6 @@ Actual: %y bytes
<pluralform>%x сек</pluralform>
</target>
-<source>Detecting abandoned lock...</source>
-<target>Виявлено покинуте блокування...</target>
-
<source>Items processed:</source>
<target>Елементів оброблено:</target>
@@ -460,8 +473,8 @@ Actual: %y bytes
<source>Error parsing file %x, row %y, column %z.</source>
<target>Помилка розбору файлу %x, рядок %y, колонка %z.</target>
-<source>Cannot set directory lock for %x.</source>
-<target>Не вдається встановити блокування папки %x.</target>
+<source>Cannot set directory locks for the following folders:</source>
+<target>Неможливо встановити блокування каталогів для таких папок:</target>
<source>
<pluralform>1 thread</pluralform>
@@ -503,9 +516,6 @@ Actual: %y bytes
<source>Volume name %x is not part of file path %y.</source>
<target>Ім'я тому %x не є частиною шляху до файлу %y.</target>
-<source>Stop requested: Waiting for current operation to finish...</source>
-<target>Запит зупинки: очікування завершення поточної операції...</target>
-
<source>Unable to create time stamp for versioning:</source>
<target>Не вдається створити часової мітки для версій:</target>
@@ -518,6 +528,9 @@ Actual: %y bytes
<source>Select a folder</source>
<target>Вибрати папку</target>
+<source>&New</source>
+<target>&Створити</target>
+
<source>&Open...</source>
<target>&Відкрити...</target>
@@ -733,26 +746,23 @@ The command is triggered if:
<source>job name</source>
<target>назва завдання</target>
-<source>Show summary</source>
-<target>Показати підсумки</target>
+<source>System: Sleep</source>
+<target>Система: Сон</target>
-<source>Sleep</source>
-<target>Перейти в режим сну</target>
+<source>System: Shut down</source>
+<target>Система: Завершення роботи</target>
-<source>Shut down</source>
-<target>Вимкнути комп'ютер</target>
-
-<source>Synchronization stopped</source>
-<target>Синхронізацію зупинено</target>
+<source>Cleaning up old log files...</source>
+<target>Очистка старих журналів...</target>
<source>Stopped</source>
<target>Зупинено</target>
-<source>Synchronization completed with errors</source>
-<target>Синхронізація закінчилася з помилками</target>
+<source>Completed with errors</source>
+<target>Завершено з помилками</target>
-<source>Synchronization completed with warnings</source>
-<target>Синхронізація завершена з попередженнями</target>
+<source>Completed with warnings</source>
+<target>Завершено з попередженнями</target>
<source>Warning</source>
<target>Увага</target>
@@ -760,15 +770,12 @@ The command is triggered if:
<source>Nothing to synchronize</source>
<target>Нічого синхронізувати</target>
-<source>Synchronization completed successfully</source>
-<target>Синхронізація успішно завершена</target>
+<source>Completed successfully</source>
+<target>Завершено успішно</target>
<source>Executing command %x</source>
<target>Виконати команду %x</target>
-<source>Cleaning up old log files...</source>
-<target>Очистка старих журналів...</target>
-
<source>You can switch to FreeFileSync's main window to resolve this issue.</source>
<target>Ви можете перейти до головного вікна FreeFileSync щоб вирішити це питання.</target>
@@ -784,15 +791,8 @@ The command is triggered if:
<source>Switching to FreeFileSync's main window</source>
<target>Перехід до головного вікна FreeFileSync</target>
-<source>
-<pluralform>Automatic retry in 1 second...</pluralform>
-<pluralform>Automatic retry in %x seconds...</pluralform>
-</source>
-<target>
-<pluralform>Автоматичний повтор за %x секунду...</pluralform>
-<pluralform>Автоматичний повтор за %x секунди...</pluralform>
-<pluralform>Автоматичний повтор за %x секунд...</pluralform>
-</target>
+<source>Automatic retry</source>
+<target>Автоматична повторна спроба</target>
<source>Ignore &all</source>
<target>Ігнорувати &усі</target>
@@ -803,6 +803,28 @@ The command is triggered if:
<source>Serious Error</source>
<target>Серйозна помилка</target>
+<source>Last session</source>
+<target>Остання сесія</target>
+
+<source>Today</source>
+<target>Сьогодні</target>
+
+<source>
+<pluralform>1 day</pluralform>
+<pluralform>%x days</pluralform>
+</source>
+<target>
+<pluralform>%x день</pluralform>
+<pluralform>%x дні</pluralform>
+<pluralform>%x днів</pluralform>
+</target>
+
+<source>Name</source>
+<target>Назва</target>
+
+<source>Last sync</source>
+<target>Остання синхронізація</target>
+
<source>Folder</source>
<target>Папка</target>
@@ -866,9 +888,6 @@ The command is triggered if:
<source>Please select a folder on a local file system, network or an MTP device.</source>
<target>Будь ласка, виберіть папку на локальній файловій системі, в мережі чи на MTP пристрої.</target>
-<source>&New</source>
-<target>&Створити</target>
-
<source>&Save</source>
<target>&Зберегти</target>
@@ -980,6 +999,9 @@ The command is triggered if:
<source>Total bytes to copy</source>
<target>Всього скопіювати байтів</target>
+<source>Arrange folder pair</source>
+<target>Упорядкувати пару папок</target>
+
<source>Folder pair:</source>
<target>Пара папок:</target>
@@ -1072,11 +1094,14 @@ The command is triggered if:
<source>Naming convention:</source>
<target>Метод іменування:</target>
-<source>&Ignore errors</source>
-<target>&Ігнорувати помилки</target>
+<source>Ignore errors</source>
+<target>Ігнорувати помилки</target>
-<source>Show pop-up on errors or warnings</source>
-<target>Показувати виринаючі вікна при помилках та попередженнях</target>
+<source>Retry count:</source>
+<target>Кількість спроб:</target>
+
+<source>Delay (in seconds):</source>
+<target>Затримка (секунд):</target>
<source>Run a command after synchronization:</source>
<target>Виконати команду після синхронізації:</target>
@@ -1084,9 +1109,6 @@ The command is triggered if:
<source>OK</source>
<target>OK</target>
-<source>Arrange folder pair</source>
-<target>Упорядкувати пару папок</target>
-
<source>Enter your login details:</source>
<target>Введіть Ваші параметри входу:</target>
@@ -1183,12 +1205,12 @@ The command is triggered if:
<source>Minimize to notification area</source>
<target>Згорнути в область повідомлень</target>
-<source>Bytes copied:</source>
-<target>Байт скопійовано:</target>
-
<source>When finished:</source>
<target>Після завершення:</target>
+<source>Auto-close</source>
+<target>Автозавершення</target>
+
<source>Close</source>
<target>Закрити</target>
@@ -1201,12 +1223,18 @@ The command is triggered if:
<source>Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x</source>
<target>Створити пакетний файл для автоматичної синхронізації. Щоб запустити двічі клацніть цей файл або заплануйте в планувальнику завдань: %x</target>
+<source>Progress dialog:</source>
+<target>Діалог прогресу:</target>
+
<source>Run minimized</source>
<target>Запустити згорнутим</target>
<source>&Show error dialog</source>
<target>&Показати діалог з помилками</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Показувати виринаючі вікна при помилках та попередженнях</target>
+
<source>&Cancel</source>
<target>&Відмінити</target>
@@ -1255,14 +1283,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Transfer file and folder permissions.</source>
<target>Перенести права доступу файлів і папок.</target>
-<source>Automatic retry on error:</source>
-<target>Автоматичний повтор при помилці:</target>
-
-<source>Retry count:</source>
-<target>Кількість спроб:</target>
+<source>Show hidden dialogs again</source>
+<target>Показати сховані діалоги знову</target>
-<source>Delay (in seconds):</source>
-<target>Затримка (секунд):</target>
+<source>Show all permanently hidden dialogs and warning messages again</source>
+<target>Показати всі сховані діалоги і повідомлення з попередженнями знову</target>
<source>Customize context menu:</source>
<target>Налаштування контекстного меню:</target>
@@ -1270,12 +1295,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Description</source>
<target>Опис</target>
-<source>Show hidden dialogs again</source>
-<target>Показати сховані діалоги знову</target>
-
-<source>Show all permanently hidden dialogs and warning messages again</source>
-<target>Показати всі сховані діалоги і повідомлення з попередженнями знову</target>
-
<source>&Default</source>
<target>&За замовчуванням</target>
@@ -1330,14 +1349,23 @@ This guarantees a consistent state even in case of a serious error.
<source>Activate offline</source>
<target>Активувати offline</target>
+<source>Highlight configurations that have not been run for more than the following number of days:</source>
+<target>Виділити конфігурації що не запускались більше ніж наступну кількість днів:</target>
+
+<source>Synchronization Settings</source>
+<target>Налаштування Синхронізації</target>
+
+<source>Access Online Storage</source>
+<target>Доступ до Online Сховища</target>
+
<source>Save as a Batch Job</source>
<target>Зберегти як Пакетне Завдання</target>
<source>Delete Items</source>
<target>Вилучити Елементи</target>
-<source>Copy items</source>
-<target>Копіювати елементи</target>
+<source>Copy Items</source>
+<target>Копіювати Елементи</target>
<source>Options</source>
<target>Опції</target>
@@ -1348,6 +1376,9 @@ This guarantees a consistent state even in case of a serious error.
<source>FreeFileSync Donation Edition</source>
<target>FreeFileSync Donation Edition</target>
+<source>Highlight Configurations</source>
+<target>Налаштування виділення</target>
+
<source>&Options</source>
<target>&Опції</target>
@@ -1475,9 +1506,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Select time span...</source>
<target>Виберіть інтервал часу...</target>
-<source>Last session</source>
-<target>Остання сесія</target>
-
<source>Folder Comparison and Synchronization</source>
<target>Порівнювання та Синхронізація папок</target>
@@ -1496,8 +1524,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Do&n't save</source>
<target>&Не зберігати</target>
-<source>Remove entry from list</source>
-<target>Видалити запис зі списку</target>
+<source>Hide configuration</source>
+<target>Сховати конфігурацію</target>
+
+<source>Highlight...</source>
+<target>Виділити...</target>
<source>Clear filter</source>
<target>Очистити фільтр</target>
@@ -1577,6 +1608,9 @@ This guarantees a consistent state even in case of a serious error.
<source>Paused</source>
<target>Призупинено</target>
+<source>Stop requested...</source>
+<target>Зупинити запит...</target>
+
<source>Initializing...</source>
<target>Ініціалізація...</target>
@@ -1586,9 +1620,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Comparing content...</source>
<target>Порівнювання вмісту...</target>
-<source>Completed</source>
-<target>Завершено</target>
-
<source>Info</source>
<target>Інформація</target>
@@ -1673,12 +1704,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Parameters for opposite side</source>
<target>Параметри для протилежної сторони:</target>
-<source>Show hidden dialogs and warning messages again?</source>
-<target>Показати сховані діалоги і попереджувальні повідомлення знову?</target>
-
-<source>&Show</source>
-<target>&Показати</target>
-
<source>Downloading update...</source>
<target>Завантажується оновлення...</target>
@@ -1703,18 +1728,12 @@ This guarantees a consistent state even in case of a serious error.
<source>Configure your own synchronization rules.</source>
<target>Налаштувати власні правила синхронізації.</target>
-<source>Synchronization Settings</source>
-<target>Налаштування Синхронізації</target>
-
<source>Comparison</source>
<target>Порівняння</target>
<source>Synchronization</source>
<target>Синхронізація</target>
-<source>Today</source>
-<target>Сьогодні</target>
-
<source>This week</source>
<target>Цього тижня</target>
@@ -1784,9 +1803,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Files</source>
<target>Файли</target>
-<source>Name</source>
-<target>Назва</target>
-
<source>Percentage</source>
<target>Проценти</target>
@@ -1900,16 +1916,6 @@ This guarantees a consistent state even in case of a serious error.
<pluralform>%x годин</pluralform>
</target>
-<source>
-<pluralform>1 day</pluralform>
-<pluralform>%x days</pluralform>
-</source>
-<target>
-<pluralform>%x день</pluralform>
-<pluralform>%x дні</pluralform>
-<pluralform>%x днів</pluralform>
-</target>
-
<source>Cannot set privilege %x.</source>
<target>Не вдається встановити привілеї %x.</target>
@@ -1973,8 +1979,11 @@ This guarantees a consistent state even in case of a serious error.
<source>Desktop</source>
<target>Робочий стіл</target>
-<source>Start menu</source>
-<target>Меню Пуск</target>
+<source>Start Menu</source>
+<target>Меню "Пуск"</target>
+
+<source>Send To</source>
+<target>Відправити</target>
<source>Registering FreeFileSync file extensions</source>
<target>Реєстрація розширень файлів FreeFileSync</target>
@@ -2003,6 +2012,6 @@ This guarantees a consistent state even in case of a serious error.
<source>Please choose the local installation type or select a different folder for installation.</source>
<target>Будь ласка, виберіть локальний тип інсталяції чи іншу папку для встановлення.</target>
-<source>The silent installation mode is only available in the FreeFileSync Donation Edition.</source>
-<target>Режим автоматичного встановлення доступний тільки у FreeFileSync Donation Edition.</target>
+<source>The %x installation option is only available in the FreeFileSync Donation Edition.</source>
+<target>Варіант установки %x доступний тільки у FreeFileSync Donation Edition.</target>
diff --git a/FreeFileSync/Build/Resources.zip b/FreeFileSync/Build/Resources.zip
index c0c2c2ed..28e925b0 100755
--- a/FreeFileSync/Build/Resources.zip
+++ b/FreeFileSync/Build/Resources.zip
Binary files differ
diff --git a/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp b/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp
index f83eebb7..64d582dc 100755
--- a/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp
+++ b/FreeFileSync/Source/RealTimeSync/folder_selector2.cpp
@@ -21,6 +21,9 @@ using namespace rts;
namespace
{
+const std::chrono::milliseconds FOLDER_SELECTED_EXISTENCE_CHECK_TIME_MAX(200);
+
+
void setFolderPath(const Zstring& dirpath, wxTextCtrl* txtCtrl, wxWindow& tooltipWnd, wxStaticText* staticText) //pointers are optional
{
if (txtCtrl)
@@ -74,7 +77,7 @@ FolderSelector2::~FolderSelector2()
void FolderSelector2::onMouseWheel(wxMouseEvent& event)
{
- //for combobox: although switching through available items is wxWidgets default, this is NOT windows default, e.g. explorer
+ //for combobox: although switching through available items is wxWidgets default, this is NOT windows default, e.g. Explorer
//additionally this will delete manual entries, although all the users wanted is scroll the parent window!
//redirect to parent scrolled window!
@@ -130,7 +133,7 @@ void FolderSelector2::onSelectDir(wxCommandEvent& event)
{
auto ft = runAsync([folderPath] { return dirAvailable(folderPath); });
- if (ft.wait_for(std::chrono::milliseconds(200)) == std::future_status::ready && ft.get()) //potentially slow network access: wait 200ms at most
+ if (ft.wait_for(FOLDER_SELECTED_EXISTENCE_CHECK_TIME_MAX) == std::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 0f62f821..85b74527 100755
--- a/FreeFileSync/Source/RealTimeSync/gui_generated.cpp
+++ b/FreeFileSync/Source/RealTimeSync/gui_generated.cpp
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Nov 6 2017)
+// C++ code generated with wxFormBuilder (version Jan 23 2018)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@@ -131,32 +131,32 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
wxBoxSizer* bSizer20;
bSizer20 = new wxBoxSizer( wxHORIZONTAL );
- m_bpButtonAddFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW );
+ m_bpButtonAddFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonAddFolder->SetToolTip( _("Add folder") );
- bSizer20->Add( m_bpButtonAddFolder, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer20->Add( m_bpButtonAddFolder, 0, wxEXPAND, 5 );
- m_bpButtonRemoveTopFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW );
+ m_bpButtonRemoveTopFolder = new wxBitmapButton( m_panelMainFolder, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonRemoveTopFolder->SetToolTip( _("Remove folder") );
- bSizer20->Add( m_bpButtonRemoveTopFolder, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer20->Add( m_bpButtonRemoveTopFolder, 0, wxEXPAND, 5 );
- fgSizer1->Add( bSizer20, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ fgSizer1->Add( bSizer20, 0, wxEXPAND, 5 );
wxBoxSizer* bSizer19;
bSizer19 = new wxBoxSizer( wxHORIZONTAL );
- m_txtCtrlDirectoryMain = new wxTextCtrl( m_panelMainFolder, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 300, -1 ), 0 );
+ m_txtCtrlDirectoryMain = new wxTextCtrl( m_panelMainFolder, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), 0 );
bSizer19->Add( m_txtCtrlDirectoryMain, 1, wxALIGN_CENTER_VERTICAL, 5 );
m_buttonSelectFolderMain = new wxButton( m_panelMainFolder, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonSelectFolderMain->SetToolTip( _("Select a folder") );
- bSizer19->Add( m_buttonSelectFolderMain, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer19->Add( m_buttonSelectFolderMain, 0, wxEXPAND, 5 );
- fgSizer1->Add( bSizer19, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+ fgSizer1->Add( bSizer19, 0, wxEXPAND, 5 );
m_panelMainFolder->SetSizer( fgSizer1 );
@@ -261,10 +261,10 @@ FolderGenerated::FolderGenerated( wxWindow* parent, wxWindowID id, const wxPoint
wxBoxSizer* bSizer114;
bSizer114 = new wxBoxSizer( wxHORIZONTAL );
- m_bpButtonRemoveFolder = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW );
+ m_bpButtonRemoveFolder = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonRemoveFolder->SetToolTip( _("Remove folder") );
- bSizer114->Add( m_bpButtonRemoveFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer114->Add( m_bpButtonRemoveFolder, 0, wxEXPAND, 5 );
m_txtCtrlDirectory = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizer114->Add( m_txtCtrlDirectory, 1, wxALIGN_CENTER_VERTICAL, 5 );
@@ -272,7 +272,7 @@ FolderGenerated::FolderGenerated( wxWindow* parent, wxWindowID id, const wxPoint
m_buttonSelectFolder = new wxButton( this, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonSelectFolder->SetToolTip( _("Select a folder") );
- bSizer114->Add( m_buttonSelectFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer114->Add( m_buttonSelectFolder, 0, wxEXPAND, 5 );
this->SetSizer( bSizer114 );
diff --git a/FreeFileSync/Source/RealTimeSync/gui_generated.h b/FreeFileSync/Source/RealTimeSync/gui_generated.h
index 773d8c5a..eaead163 100755
--- a/FreeFileSync/Source/RealTimeSync/gui_generated.h
+++ b/FreeFileSync/Source/RealTimeSync/gui_generated.h
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Nov 6 2017)
+// C++ code generated with wxFormBuilder (version Jan 23 2018)
// 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 c6093389..3f009a1a 100755
--- a/FreeFileSync/Source/RealTimeSync/main_dlg.cpp
+++ b/FreeFileSync/Source/RealTimeSync/main_dlg.cpp
@@ -30,6 +30,9 @@ using namespace rts;
namespace
{
+ static const size_t MAX_ADD_FOLDERS = 6;
+
+
}
@@ -38,7 +41,10 @@ class rts::DirectoryPanel : public FolderGenerated
public:
DirectoryPanel(wxWindow* parent) :
FolderGenerated(parent),
- folderSelector_(*this, *m_buttonSelectFolder, *m_txtCtrlDirectory, nullptr /*staticText*/) {}
+ folderSelector_(*this, *m_buttonSelectFolder, *m_txtCtrlDirectory, nullptr /*staticText*/)
+ {
+ m_bpButtonRemoveFolder->SetBitmapLabel(getResourceImage(L"item_remove"));
+ }
void setPath(const Zstring& dirpath) { folderSelector_.setPath(dirpath); }
Zstring getPath() const { return folderSelector_.getPath(); }
@@ -63,18 +69,22 @@ MainDialog::MainDialog(wxDialog* dlg, const Zstring& cfgFileName)
setRelativeFontSize(*m_buttonStart, 1.5);
+ m_txtCtrlDirectoryMain->SetMinSize(wxSize(fastFromDIP(300), -1));
+
+ m_spinCtrlDelay->SetMinSize(wxSize(fastFromDIP(70), -1)); //Hack: set size (why does wxWindow::Size() not work?)
+
m_bpButtonRemoveTopFolder->Hide();
m_panelMainFolder->Layout();
m_bpButtonAddFolder ->SetBitmapLabel(getResourceImage(L"item_add"));
m_bpButtonRemoveTopFolder->SetBitmapLabel(getResourceImage(L"item_remove"));
- setBitmapTextLabel(*m_buttonStart, getResourceImage(L"startRts").ConvertToImage(), m_buttonStart->GetLabel(), 5, 8);
+ setBitmapTextLabel(*m_buttonStart, getResourceImage(L"startRts").ConvertToImage(), m_buttonStart->GetLabel(), fastFromDIP(5), fastFromDIP(8));
//register key event
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::OnKeyPressed), nullptr, this);
//prepare drag & drop
- dirpathFirst = std::make_unique<FolderSelector2>(*m_panelMainFolder, *m_buttonSelectFolderMain, *m_txtCtrlDirectoryMain, m_staticTextFinalPath);
+ firstFolderPanel_ = std::make_unique<FolderSelector2>(*m_panelMainFolder, *m_buttonSelectFolderMain, *m_txtCtrlDirectoryMain, m_staticTextFinalPath);
//--------------------------- load config values ------------------------------------
XmlRealConfig newConfig;
@@ -308,29 +318,26 @@ void MainDialog::onFilesDropped(FileDropEvent& event)
{
const auto& filePaths = event.getPaths();
if (!filePaths.empty())
- loadConfig(utfTo<Zstring>(filePaths[0]));
+ loadConfig(filePaths[0]);
}
void MainDialog::setConfiguration(const XmlRealConfig& cfg)
{
- //clear existing folders
- dirpathFirst->setPath(Zstring());
- clearAddFolders();
- if (!cfg.directories.empty())
- {
- //fill top folder
- dirpathFirst->setPath(*cfg.directories.begin());
+ const Zstring& firstFolderPath = cfg.directories.empty() ? Zstring() : cfg.directories[0];
+ const std::vector<Zstring> addFolderPaths = cfg.directories.empty() ? std::vector<Zstring>() :
+ std::vector<Zstring>(cfg.directories.begin() + 1, cfg.directories.end());
- //fill additional folders
- addFolder(std::vector<Zstring>(cfg.directories.begin() + 1, cfg.directories.end()));
- }
+ firstFolderPanel_->setPath(firstFolderPath);
+
+ bSizerFolders->Clear(true);
+ additionalFolderPanels_.clear();
+
+ insertAddFolder(addFolderPaths, 0);
- //fill commandline
m_textCtrlCommand->SetValue(utfTo<wxString>(cfg.commandline));
- //set delay
m_spinCtrlDelay->SetValue(static_cast<int>(cfg.delay));
}
@@ -339,9 +346,10 @@ XmlRealConfig MainDialog::getConfiguration()
{
XmlRealConfig output;
- output.directories.push_back(utfTo<Zstring>(dirpathFirst->getPath()));
- for (const DirectoryPanel* dne : dirpathsExtra)
- output.directories.push_back(utfTo<Zstring>(dne->getPath()));
+ output.directories.push_back(firstFolderPanel_->getPath());
+
+ for (const DirectoryPanel* dp : additionalFolderPanels_)
+ output.directories.push_back(dp->getPath());
output.commandline = utfTo<Zstring>(m_textCtrlCommand->GetValue());
output.delay = m_spinCtrlDelay->GetValue();
@@ -352,26 +360,25 @@ XmlRealConfig MainDialog::getConfiguration()
void MainDialog::OnAddFolder(wxCommandEvent& event)
{
- const Zstring topFolder = utfTo<Zstring>(dirpathFirst->getPath());
- //clear existing top folder first
- dirpathFirst->setPath(Zstring());
+ const Zstring topFolder = firstFolderPanel_->getPath();
- std::vector<Zstring> newFolders;
- newFolders.push_back(topFolder);
+ //clear existing top folder first
+ firstFolderPanel_->setPath(Zstring());
- addFolder(newFolders, true); //add pair in front of additonal pairs
+ insertAddFolder({ topFolder }, 0);
}
void MainDialog::OnRemoveFolder(wxCommandEvent& event)
{
+
//find folder pair originating the event
const wxObject* const eventObj = event.GetEventObject();
- for (auto it = dirpathsExtra.begin(); it != dirpathsExtra.end(); ++it)
+ for (auto it = additionalFolderPanels_.begin(); it != additionalFolderPanels_.end(); ++it)
if (eventObj == static_cast<wxObject*>((*it)->m_bpButtonRemoveFolder))
{
- removeAddFolder(it - dirpathsExtra.begin());
+ removeAddFolder(it - additionalFolderPanels_.begin());
return;
}
}
@@ -379,75 +386,61 @@ void MainDialog::OnRemoveFolder(wxCommandEvent& event)
void MainDialog::OnRemoveTopFolder(wxCommandEvent& event)
{
- if (dirpathsExtra.size() > 0)
+
+ if (!additionalFolderPanels_.empty())
{
- dirpathFirst->setPath(dirpathsExtra[0]->getPath());
+ firstFolderPanel_->setPath(additionalFolderPanels_[0]->getPath());
removeAddFolder(0); //remove first of additional folders
}
}
- static const size_t MAX_ADD_FOLDERS = 6;
-
-
-void MainDialog::addFolder(const std::vector<Zstring>& newFolders, bool addFront)
+void MainDialog::insertAddFolder(const std::vector<Zstring>& newFolders, size_t pos)
{
- if (newFolders.size() == 0)
- return;
+ assert(pos <= additionalFolderPanels_.size() && additionalFolderPanels_.size() == bSizerFolders->GetItemCount());
+ pos = std::min(pos, additionalFolderPanels_.size());
-
- int folderHeight = 0;
- for (const Zstring& dirpath : newFolders)
+ for (size_t i = 0; i < newFolders.size(); ++i)
{
//add new folder pair
DirectoryPanel* newFolder = new DirectoryPanel(m_scrolledWinFolders);
- newFolder->m_bpButtonRemoveFolder->SetBitmapLabel(getResourceImage(L"item_remove"));
- //get size of scrolled window
- folderHeight = newFolder->GetSize().GetHeight();
-
- if (addFront)
- {
- bSizerFolders->Insert(0, newFolder, 0, wxEXPAND, 5);
- dirpathsExtra.insert(dirpathsExtra.begin(), newFolder);
- }
- else
- {
- bSizerFolders->Add(newFolder, 0, wxEXPAND, 5);
- dirpathsExtra.push_back(newFolder);
- }
+ bSizerFolders->Insert(pos + i, newFolder, 0, wxEXPAND);
+ additionalFolderPanels_.insert(additionalFolderPanels_.begin() + pos + i, newFolder);
//register events
newFolder->m_bpButtonRemoveFolder->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolder), nullptr, this );
- //insert directory name
- newFolder->setPath(dirpath);
+ //make sure panel has proper default height
+ newFolder->GetSizer()->SetSizeHints(newFolder); //~=Fit() + SetMinSize()
+
+ newFolder->setPath(newFolders[i]);
}
//set size of scrolled window
- const size_t additionalRows = std::min(dirpathsExtra.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown
- m_scrolledWinFolders->SetMinSize(wxSize( -1, folderHeight * static_cast<int>(additionalRows)));
+ const int folderHeight = additionalFolderPanels_.empty() ? 0 : additionalFolderPanels_[0]->GetSize().GetHeight();
+ const size_t visibleRows = std::min(additionalFolderPanels_.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown
+
+ m_scrolledWinFolders->SetMinSize(wxSize(-1, folderHeight * static_cast<int>(visibleRows)));
//adapt delete top folder pair button
- m_bpButtonRemoveTopFolder->Show();
+ m_bpButtonRemoveTopFolder->Show(!additionalFolderPanels_.empty());
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
- Layout();
+
Refresh(); //remove a little flicker near the start button
}
void MainDialog::removeAddFolder(size_t pos)
{
-
- if (pos < dirpathsExtra.size())
+ if (pos < additionalFolderPanels_.size())
{
//remove folder pairs from window
- DirectoryPanel* pairToDelete = dirpathsExtra[pos];
- const int folderHeight = pairToDelete->GetSize().GetHeight();
+ DirectoryPanel* pairToDelete = additionalFolderPanels_[pos];
bSizerFolders->Detach(pairToDelete); //Remove() does not work on Window*, so do it manually
- dirpathsExtra.erase(dirpathsExtra.begin() + pos); //remove last element in vector
+ additionalFolderPanels_.erase(additionalFolderPanels_.begin() + pos); //remove last element in vector
//more (non-portable) wxWidgets bullshit: on OS X wxWindow::Destroy() screws up and calls "operator delete" directly rather than
//the deferred deletion it is expected to do (and which is implemented correctly on Windows and Linux)
//http://bb10.com/python-wxpython-devel/2012-09/msg00004.html
@@ -455,35 +448,16 @@ void MainDialog::removeAddFolder(size_t pos)
guiQueue_.processAsync([] {}, [pairToDelete] { pairToDelete->Destroy(); });
//set size of scrolled window
- const size_t additionalRows = std::min(dirpathsExtra.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown
- m_scrolledWinFolders->SetMinSize(wxSize( -1, folderHeight * static_cast<int>(additionalRows)));
+ const int folderHeight = additionalFolderPanels_.empty() ? 0 : additionalFolderPanels_[0]->GetSize().GetHeight();
+ const size_t visibleRows = std::min(additionalFolderPanels_.size(), MAX_ADD_FOLDERS); //up to MAX_ADD_FOLDERS additional folders shall be shown
+
+ m_scrolledWinFolders->SetMinSize(wxSize(-1, folderHeight * static_cast<int>(visibleRows)));
//adapt delete top folder pair button
- if (dirpathsExtra.size() == 0)
- {
- m_bpButtonRemoveTopFolder->Hide();
- m_panelMainFolder->Layout();
- }
+ m_bpButtonRemoveTopFolder->Show(!additionalFolderPanels_.empty());
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
- Layout();
+
Refresh(); //remove a little flicker near the start button
}
}
-
-
-void MainDialog::clearAddFolders()
-{
-
- bSizerFolders->Clear(true);
- dirpathsExtra.clear();
-
- m_scrolledWinFolders->SetMinSize(wxSize(-1, 0));
-
- m_bpButtonRemoveTopFolder->Hide();
- m_panelMainFolder->Layout();
-
- GetSizer()->SetSizeHints(this); //~=Fit()
- Layout();
- Refresh(); //remove a little flicker near the start button
-}
diff --git a/FreeFileSync/Source/RealTimeSync/main_dlg.h b/FreeFileSync/Source/RealTimeSync/main_dlg.h
index cecf26c8..bc2eaacb 100755
--- a/FreeFileSync/Source/RealTimeSync/main_dlg.h
+++ b/FreeFileSync/Source/RealTimeSync/main_dlg.h
@@ -54,12 +54,11 @@ private:
XmlRealConfig getConfiguration();
void setLastUsedConfig(const Zstring& filepath);
- void addFolder(const std::vector<Zstring>& newFolders, bool addFront = false);
+ void insertAddFolder(const std::vector<Zstring>& newFolders, size_t pos);
void removeAddFolder(size_t pos);
- void clearAddFolders();
- std::unique_ptr<FolderSelector2> dirpathFirst;
- std::vector<DirectoryPanel*> dirpathsExtra; //additional pairs to the standard pair
+ std::unique_ptr<FolderSelector2> firstFolderPanel_;
+ std::vector<DirectoryPanel*> additionalFolderPanels_; //additional pairs to the standard pair
const Zstring lastRunConfigPath_;
diff --git a/FreeFileSync/Source/RealTimeSync/xml_proc.cpp b/FreeFileSync/Source/RealTimeSync/xml_proc.cpp
index 0cf23407..9d022b5d 100755
--- a/FreeFileSync/Source/RealTimeSync/xml_proc.cpp
+++ b/FreeFileSync/Source/RealTimeSync/xml_proc.cpp
@@ -88,14 +88,14 @@ XmlRealConfig convertBatchToReal(const fff::XmlBatchConfig& batchCfg, const Zstr
std::set<Zstring, LessFilePath> uniqueFolders;
//add main folders
- uniqueFolders.insert(batchCfg.mainCfg.firstPair.folderPathPhraseLeft_);
- uniqueFolders.insert(batchCfg.mainCfg.firstPair.folderPathPhraseRight_);
+ uniqueFolders.insert(batchCfg.mainCfg.firstPair.folderPathPhraseLeft);
+ uniqueFolders.insert(batchCfg.mainCfg.firstPair.folderPathPhraseRight);
//additional folders
- for (const fff::FolderPairEnh& fp : batchCfg.mainCfg.additionalPairs)
+ for (const fff::LocalPairConfig& lpc : batchCfg.mainCfg.additionalPairs)
{
- uniqueFolders.insert(fp.folderPathPhraseLeft_);
- uniqueFolders.insert(fp.folderPathPhraseRight_);
+ uniqueFolders.insert(lpc.folderPathPhraseLeft);
+ uniqueFolders.insert(lpc.folderPathPhraseRight);
}
erase_if(uniqueFolders, [](const Zstring& str) { return trimCpy(str).empty(); });
diff --git a/FreeFileSync/Source/algorithm.cpp b/FreeFileSync/Source/algorithm.cpp
index 2316cd27..faab26af 100755
--- a/FreeFileSync/Source/algorithm.cpp
+++ b/FreeFileSync/Source/algorithm.cpp
@@ -658,15 +658,15 @@ private:
std::vector<DirectionConfig> fff::extractDirectionCfg(const MainConfiguration& mainCfg)
{
//merge first and additional pairs
- std::vector<FolderPairEnh> allPairs;
+ std::vector<LocalPairConfig> allPairs;
allPairs.push_back(mainCfg.firstPair);
allPairs.insert(allPairs.end(),
mainCfg.additionalPairs.begin(), //add additional pairs
mainCfg.additionalPairs.end());
std::vector<DirectionConfig> output;
- for (const FolderPairEnh& fp : allPairs)
- output.push_back(fp.altSyncConfig.get() ? fp.altSyncConfig->directionCfg : mainCfg.syncCfg.directionCfg);
+ for (const LocalPairConfig& lpc : allPairs)
+ output.push_back(lpc.localSyncCfg ? lpc.localSyncCfg->directionCfg : mainCfg.syncCfg.directionCfg);
return output;
}
@@ -1034,7 +1034,7 @@ void fff::applyFiltering(FolderComparison& folderCmp, const MainConfiguration& m
throw std::logic_error("Contract violation! " + std::string(__FILE__) + ":" + numberTo<std::string>(__LINE__));
//merge first and additional pairs
- std::vector<FolderPairEnh> allPairs;
+ std::vector<LocalPairConfig> allPairs;
allPairs.push_back(mainCfg.firstPair);
allPairs.insert(allPairs.end(),
mainCfg.additionalPairs.begin(), //add additional pairs
diff --git a/FreeFileSync/Source/application.cpp b/FreeFileSync/Source/application.cpp
index 0c6a4382..5a6e717a 100755
--- a/FreeFileSync/Source/application.cpp
+++ b/FreeFileSync/Source/application.cpp
@@ -49,12 +49,14 @@ const wxEventType EVENT_ENTER_EVENT_LOOP = wxNewEventType();
//##################################################################################################################
+
bool Application::OnInit()
{
//do not call wxApp::OnInit() to avoid using wxWidgets command line parser
::gtk_init(nullptr, nullptr);
- ::gtk_rc_parse((getResourceDirPf() + "styles.gtk_rc").c_str()); //remove inner border from bitmap buttons
+ //::gtk_rc_parse((getResourceDirPf() + "styles.gtk_rc").c_str()); //remove inner border from bitmap buttons
+ //=> looks bad on Suse Linux!
//Windows User Experience Interaction Guidelines: tool tips should have 5s timeout, info tips no timeout => compromise:
wxToolTip::Enable(true); //yawn, a wxWidgets screw-up: wxToolTip::SetAutoPop is no-op if global tooltip window is not yet constructed: wxToolTip::Enable creates it
@@ -62,7 +64,7 @@ bool Application::OnInit()
SetAppName(L"FreeFileSync"); //if not set, the default is the executable's name!
- initResourceImages(getResourceDirPf() + Zstr("Resources.zip"));
+ initResourceImages(getResourceDirPf() + Zstr("Resources.zip")); //parallel xBRZ-scaling! => run as early as possible
try
{
@@ -322,11 +324,11 @@ void Application::launch(const std::vector<Zstring>& commandArgs)
}
//----------------------------------------------------------------------------------------------------
- auto hasNonDefaultConfig = [](const FolderPairEnh& fp)
+ auto hasNonDefaultConfig = [](const LocalPairConfig& lpc)
{
- return !(fp == FolderPairEnh(fp.folderPathPhraseLeft_,
- fp.folderPathPhraseRight_,
- nullptr, nullptr, FilterConfig()));
+ return lpc != LocalPairConfig(lpc.folderPathPhraseLeft,
+ lpc.folderPathPhraseRight,
+ NoValue(), NoValue(), FilterConfig());
};
auto replaceDirectories = [&](MainConfiguration& mainCfg)
@@ -344,12 +346,12 @@ void Application::launch(const std::vector<Zstring>& commandArgs)
for (size_t i = 0; i < dirPathPhrasePairs.size(); ++i)
if (i == 0)
{
- mainCfg.firstPair.folderPathPhraseLeft_ = dirPathPhrasePairs[0].first;
- mainCfg.firstPair.folderPathPhraseRight_ = dirPathPhrasePairs[0].second;
+ mainCfg.firstPair.folderPathPhraseLeft = dirPathPhrasePairs[0].first;
+ mainCfg.firstPair.folderPathPhraseRight = dirPathPhrasePairs[0].second;
}
else
mainCfg.additionalPairs.emplace_back(dirPathPhrasePairs[i].first, dirPathPhrasePairs[i].second,
- nullptr, nullptr, FilterConfig());
+ NoValue(), NoValue(), FilterConfig());
}
return true;
};
@@ -556,8 +558,8 @@ void runBatchMode(const Zstring& globalConfigFilePath, const XmlBatchConfig& bat
globalCfg.lastSyncsLogFileSizeMax,
batchCfg.mainCfg.ignoreErrors,
batchCfg.batchExCfg.batchErrorDialog,
- globalCfg.automaticRetryCount,
- globalCfg.automaticRetryDelay,
+ batchCfg.mainCfg.automaticRetryCount,
+ batchCfg.mainCfg.automaticRetryDelay,
returnCode,
batchCfg.mainCfg.postSyncCommand,
batchCfg.mainCfg.postSyncCondition,
diff --git a/FreeFileSync/Source/comparison.cpp b/FreeFileSync/Source/comparison.cpp
index ca7c6d03..61001120 100755
--- a/FreeFileSync/Source/comparison.cpp
+++ b/FreeFileSync/Source/comparison.cpp
@@ -22,21 +22,21 @@ using namespace fff;
std::vector<FolderPairCfg> fff::extractCompareCfg(const MainConfiguration& mainCfg)
{
//merge first and additional pairs
- std::vector<FolderPairEnh> allPairs = { mainCfg.firstPair };
+ std::vector<LocalPairConfig> allPairs = { mainCfg.firstPair };
append(allPairs, mainCfg.additionalPairs);
std::vector<FolderPairCfg> output;
std::transform(allPairs.begin(), allPairs.end(), std::back_inserter(output),
- [&](const FolderPairEnh& enhPair) -> FolderPairCfg
+ [&](const LocalPairConfig& lpc) -> FolderPairCfg
{
- return FolderPairCfg(enhPair.folderPathPhraseLeft_, enhPair.folderPathPhraseRight_,
- enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->compareVar : mainCfg.cmpConfig.compareVar,
- enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->handleSymlinks : mainCfg.cmpConfig.handleSymlinks,
- enhPair.altCmpConfig.get() ? enhPair.altCmpConfig->ignoreTimeShiftMinutes : mainCfg.cmpConfig.ignoreTimeShiftMinutes,
+ return FolderPairCfg(lpc.folderPathPhraseLeft, lpc.folderPathPhraseRight,
+ lpc.localCmpCfg ? lpc.localCmpCfg->compareVar : mainCfg.cmpConfig.compareVar,
+ lpc.localCmpCfg ? lpc.localCmpCfg->handleSymlinks : mainCfg.cmpConfig.handleSymlinks,
+ lpc.localCmpCfg ? lpc.localCmpCfg->ignoreTimeShiftMinutes : mainCfg.cmpConfig.ignoreTimeShiftMinutes,
- normalizeFilters(mainCfg.globalFilter, enhPair.localFilter),
+ normalizeFilters(mainCfg.globalFilter, lpc.localFilter),
- enhPair.altSyncConfig.get() ? enhPair.altSyncConfig->directionCfg : mainCfg.syncCfg.directionCfg);
+ lpc.localSyncCfg ? lpc.localSyncCfg->directionCfg : mainCfg.syncCfg.directionCfg);
});
return output;
}
@@ -505,8 +505,8 @@ public:
std::vector<FilePair*>& undefinedFilesOut,
std::vector<SymlinkPair*>& undefinedSymlinksOut) :
failedItemReads_(failedItemReads),
- undefinedFiles(undefinedFilesOut),
- undefinedSymlinks(undefinedSymlinksOut) {}
+ undefinedFiles_(undefinedFilesOut),
+ undefinedSymlinks_(undefinedSymlinksOut) {}
void execute(const FolderContainer& lhs, const FolderContainer& rhs, ContainerObject& output)
{
@@ -526,8 +526,8 @@ private:
const std::wstring* checkFailedRead(FileSystemObject& fsObj, const std::wstring* errorMsg);
const std::map<Zstring, std::wstring, LessFilePath>& failedItemReads_; //base-relative paths or empty if read-error for whole base directory
- std::vector<FilePair*>& undefinedFiles;
- std::vector<SymlinkPair*>& undefinedSymlinks;
+ std::vector<FilePair*>& undefinedFiles_;
+ std::vector<SymlinkPair*>& undefinedSymlinks_;
};
@@ -631,7 +631,7 @@ void MergeSides::mergeTwoSides(const FolderContainer& lhs, const FolderContainer
fileRight.first,
fileRight.second);
if (!checkFailedRead(newItem, errorMsg))
- undefinedFiles.push_back(&newItem);
+ undefinedFiles_.push_back(&newItem);
static_assert(IsSameType<ContainerObject::FileList, FixedList<FilePair>>::value, ""); //ContainerObject::addSubFile() must NOT invalidate references used in "undefinedFiles"!
});
@@ -650,7 +650,7 @@ void MergeSides::mergeTwoSides(const FolderContainer& lhs, const FolderContainer
symlinkRight.first,
symlinkRight.second);
if (!checkFailedRead(newItem, errorMsg))
- undefinedSymlinks.push_back(&newItem);
+ undefinedSymlinks_.push_back(&newItem);
});
//-----------------------------------------------------------------------------------------------
diff --git a/FreeFileSync/Source/file_hierarchy.cpp b/FreeFileSync/Source/file_hierarchy.cpp
index bc6db6d6..7ef11e37 100755
--- a/FreeFileSync/Source/file_hierarchy.cpp
+++ b/FreeFileSync/Source/file_hierarchy.cpp
@@ -15,6 +15,48 @@ using namespace fff;
+std::wstring fff::getShortDisplayNameForFolderPair(const AbstractPath& itemPathL, const AbstractPath& itemPathR)
+{
+ Zstring commonTrail;
+ AbstractPath tmpPathL = itemPathL;
+ AbstractPath tmpPathR = itemPathR;
+ for (;;)
+ {
+ Opt<AbstractPath> parentPathL = AFS::getParentFolderPath(tmpPathL);
+ Opt<AbstractPath> parentPathR = AFS::getParentFolderPath(tmpPathR);
+ if (!parentPathL || !parentPathR)
+ break;
+
+ const Zstring itemNameL = AFS::getItemName(tmpPathL);
+ const Zstring itemNameR = AFS::getItemName(tmpPathR);
+ if (!strEqual(itemNameL, itemNameR, CmpNaturalSort())) //let's compare case-insensitively even on Linux!
+ break;
+
+ tmpPathL = *parentPathL;
+ tmpPathR = *parentPathR;
+
+ commonTrail = AFS::appendPaths(itemNameL, commonTrail, FILE_NAME_SEPARATOR);
+ }
+ if (!commonTrail.empty())
+ return utfTo<std::wstring>(commonTrail);
+
+ auto getLastComponent = [](const AbstractPath& itemPath)
+ {
+ if (!AFS::getParentFolderPath(itemPath)) //= device root
+ return AFS::getDisplayPath(itemPath);
+ return utfTo<std::wstring>(AFS::getItemName(itemPath));
+ };
+
+ if (AFS::isNullPath(itemPathL))
+ return getLastComponent(itemPathR);
+ else if (AFS::isNullPath(itemPathR))
+ return getLastComponent(itemPathL);
+ else
+ return getLastComponent(itemPathL) + SPACED_DASH +
+ getLastComponent(itemPathR);
+}
+
+
void ContainerObject::removeEmptyRec()
{
bool emptyExisting = false;
diff --git a/FreeFileSync/Source/file_hierarchy.h b/FreeFileSync/Source/file_hierarchy.h
index d6a7c6fc..f25d7684 100755
--- a/FreeFileSync/Source/file_hierarchy.h
+++ b/FreeFileSync/Source/file_hierarchy.h
@@ -102,6 +102,10 @@ struct SelectParam<RIGHT_SIDE>
//------------------------------------------------------------------
+std::wstring getShortDisplayNameForFolderPair(const AbstractPath& itemPathL, const AbstractPath& itemPathR);
+
+//------------------------------------------------------------------
+
struct FolderContainer
{
//------------------------------------------------------------------
@@ -381,6 +385,8 @@ struct FSObjectVisitor
};
+
+
//inherit from this class to allow safe random access by id instead of unsafe raw pointer
//allow for similar semantics like std::weak_ptr without having to use std::shared_ptr
template <class T>
@@ -413,7 +419,6 @@ private:
static std::unordered_set<const ObjectMgr*> inst;
return inst; //external linkage (even in header file!)
}
-
};
//------------------------------------------------------------------
diff --git a/FreeFileSync/Source/fs/abstract.h b/FreeFileSync/Source/fs/abstract.h
index 4899f32a..233d4faa 100755
--- a/FreeFileSync/Source/fs/abstract.h
+++ b/FreeFileSync/Source/fs/abstract.h
@@ -12,7 +12,7 @@
#include <zen/zstring.h>
#include <zen/optional.h>
#include <zen/serialize.h> //InputStream/OutputStream support buffered stream concept
-#include "../lib/icon_holder.h"
+#include <wx+/image_holder.h> //NOT a wxWidgets dependency!
namespace fff
@@ -119,8 +119,8 @@ struct AbstractFileSystem //THREAD-SAFETY: "const" member functions must model t
static std::string getSymlinkBinaryContent(const AbstractPath& ap) { return ap.afs->getSymlinkBinaryContent(ap.afsPath); } //throw FileError
//----------------------------------------------------------------------------------------------------------------
//noexcept; optional return value:
- static ImageHolder getFileIcon (const AbstractPath& ap, int pixelSize) { return ap.afs->getFileIcon (ap.afsPath, pixelSize); }
- static ImageHolder getThumbnailImage(const AbstractPath& ap, int pixelSize) { return ap.afs->getThumbnailImage(ap.afsPath, pixelSize); }
+ static zen::ImageHolder getFileIcon (const AbstractPath& ap, int pixelSize) { return ap.afs->getFileIcon (ap.afsPath, pixelSize); }
+ static zen::ImageHolder getThumbnailImage(const AbstractPath& ap, int pixelSize) { return ap.afs->getThumbnailImage(ap.afsPath, pixelSize); }
static void connectNetworkFolder(const AbstractPath& ap, bool allowUserInteraction) { return ap.afs->connectNetworkFolder(ap.afsPath, allowUserInteraction); } //throw FileError
//----------------------------------------------------------------------------------------------------------------
@@ -368,8 +368,8 @@ private:
virtual void copySymlinkForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget, bool copyFilePermissions) const = 0; //throw FileError
//----------------------------------------------------------------------------------------------------------------
- virtual ImageHolder getFileIcon (const AfsPath& afsPath, int pixelSize) const = 0; //noexcept; optional return value
- virtual ImageHolder getThumbnailImage(const AfsPath& afsPath, int pixelSize) const = 0; //
+ virtual zen::ImageHolder getFileIcon (const AfsPath& afsPath, int pixelSize) const = 0; //noexcept; optional return value
+ virtual zen::ImageHolder getThumbnailImage(const AfsPath& afsPath, int pixelSize) const = 0; //
virtual void connectNetworkFolder(const AfsPath& afsPath, bool allowUserInteraction) const = 0; //throw FileError
//----------------------------------------------------------------------------------------------------------------
diff --git a/FreeFileSync/Source/fs/native.cpp b/FreeFileSync/Source/fs/native.cpp
index 98a7becc..5ea0c9bb 100755
--- a/FreeFileSync/Source/fs/native.cpp
+++ b/FreeFileSync/Source/fs/native.cpp
@@ -446,7 +446,7 @@ private:
//target existing: undefined behavior! (fail/overwrite/auto-rename) => Native will fail and give a clear error message
void renameItemForSameAfsType(const AfsPath& afsPathSource, const AbstractPath& apTarget) const override //throw FileError, ErrorDifferentVolume
{
- //perf test: detecting different volumes by path is ~30 times faster than having MoveFileEx fail with ERROR_NOT_SAME_DEVICE (6s vs 190s)
+ //perf test: detecting different volumes by path is ~30 times faster than having MoveFileEx fail with ERROR_NOT_SAME_DEVICE (6µs vs 190µs)
//=> maybe we can even save some actual I/O in some cases?
if (compareDeviceRootSameAfsType(getAfs(apTarget)) != 0)
throw ErrorDifferentVolume(replaceCpy(replaceCpy(_("Cannot move file %x to %y."),
diff --git a/FreeFileSync/Source/lib/binary.cpp b/FreeFileSync/Source/lib/binary.cpp
index e4ac6fc3..bfa5cb97 100755
--- a/FreeFileSync/Source/lib/binary.cpp
+++ b/FreeFileSync/Source/lib/binary.cpp
@@ -12,6 +12,7 @@ using namespace zen;
using namespace fff;
using AFS = AbstractFileSystem;
+
namespace
{
/*
diff --git a/FreeFileSync/Source/lib/dir_exist_async.h b/FreeFileSync/Source/lib/dir_exist_async.h
index e61cdc41..ea518316 100755
--- a/FreeFileSync/Source/lib/dir_exist_async.h
+++ b/FreeFileSync/Source/lib/dir_exist_async.h
@@ -30,7 +30,8 @@ struct FolderStatus
std::map<AbstractPath, zen::FileError, AFS::LessAbstractPath> failedChecks;
};
-FolderStatus getFolderStatusNonBlocking(const std::set<AbstractPath, AFS::LessAbstractPath>& folderPaths, int folderAccessTimeout, bool allowUserInteraction, ProcessCallback& procCallback)
+FolderStatus getFolderStatusNonBlocking(const std::set<AbstractPath, AFS::LessAbstractPath>& folderPaths, int folderAccessTimeout,
+ bool allowUserInteraction, ProcessCallback& procCallback)
{
using namespace zen;
diff --git a/FreeFileSync/Source/lib/error_log.h b/FreeFileSync/Source/lib/error_log.h
index 062c8fbb..022bf836 100755
--- a/FreeFileSync/Source/lib/error_log.h
+++ b/FreeFileSync/Source/lib/error_log.h
@@ -33,7 +33,7 @@ void logFatalError(const std::string& msg) //noexcept
using namespace zen;
assert(false); //this is stuff we like to debug
- const std::string logEntry = "[" + formatTime<std::string>(FORMAT_DATE) + " "+ formatTime<std::string>(FORMAT_TIME) + "] " + msg;
+ const std::string logEntry = "[" + formatTime<std::string>(FORMAT_DATE) + " " + formatTime<std::string>(FORMAT_TIME) + "] " + msg;
try
{
saveBinContainer(getConfigDirPathPf() + Zstr("LastError.log"), logEntry, nullptr /*notifyUnbufferedIO*/); //throw FileError
diff --git a/FreeFileSync/Source/lib/hard_filter.cpp b/FreeFileSync/Source/lib/hard_filter.cpp
index 0f8ebeea..a24dc65f 100755
--- a/FreeFileSync/Source/lib/hard_filter.cpp
+++ b/FreeFileSync/Source/lib/hard_filter.cpp
@@ -275,7 +275,7 @@ bool NameFilter::passFileFilter(const Zstring& relFilePath) const
bool NameFilter::passDirFilter(const Zstring& relDirPath, bool* childItemMightMatch) const
{
assert(!startsWith(relDirPath, FILE_NAME_SEPARATOR));
- assert(!childItemMightMatch || *childItemMightMatch == true); //check correct usage
+ assert(!childItemMightMatch || *childItemMightMatch); //check correct usage
const Zstring& pathFmt = relDirPath; //nothing to do here
diff --git a/FreeFileSync/Source/lib/hard_filter.h b/FreeFileSync/Source/lib/hard_filter.h
index 4f6acb56..0f312ea6 100755
--- a/FreeFileSync/Source/lib/hard_filter.h
+++ b/FreeFileSync/Source/lib/hard_filter.h
@@ -126,7 +126,7 @@ const Zchar FILTER_ITEM_SEPARATOR = Zstr('|');
inline
bool NullFilter::passDirFilter(const Zstring& relDirPath, bool* childItemMightMatch) const
{
- assert(!childItemMightMatch || *childItemMightMatch == true); //check correct usage
+ assert(!childItemMightMatch || *childItemMightMatch); //check correct usage
return true;
}
diff --git a/FreeFileSync/Source/lib/icon_buffer.cpp b/FreeFileSync/Source/lib/icon_buffer.cpp
index 650bbb55..7efe713c 100755
--- a/FreeFileSync/Source/lib/icon_buffer.cpp
+++ b/FreeFileSync/Source/lib/icon_buffer.cpp
@@ -10,6 +10,7 @@
#include <zen/thread.h> //includes <std/thread.hpp>
#include <zen/scope_guard.h>
#include <wx+/image_resources.h>
+#include <wx+/dc.h>
#include "icon_loader.h"
@@ -34,7 +35,7 @@ wxBitmap extractWxBitmap(ImageHolder&& ih)
wxImage img(ih.getWidth(), ih.getHeight(), ih.releaseRgb(), false /*static_data*/); //pass ownership
if (ih.getAlpha())
- img.SetAlpha(ih.releaseAlpha(), false);
+ img.SetAlpha(ih.releaseAlpha(), false /*static_data*/);
return wxBitmap(img);
}
@@ -78,7 +79,7 @@ class WorkLoad
{
public:
//context of main thread
- void setWorkload(const std::vector<AbstractPath>& newLoad)
+ void set(const std::vector<AbstractPath>& newLoad)
{
assert(std::this_thread::get_id() == mainThreadId);
{
@@ -92,7 +93,7 @@ public:
//condition handling, see: http://www.boost.org/doc/libs/1_43_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref
}
- void addToWorkload(const AbstractPath& filePath) //context of main thread
+ void add(const AbstractPath& filePath) //context of main thread
{
assert(std::this_thread::get_id() == mainThreadId);
{
@@ -103,7 +104,7 @@ public:
}
//context of worker thread, blocking:
- AbstractPath extractNextFile() //throw ThreadInterruption
+ AbstractPath extractNext() //throw ThreadInterruption
{
assert(std::this_thread::get_id() != mainThreadId);
std::unique_lock<std::mutex> dummy(lockFiles_);
@@ -170,7 +171,7 @@ public:
}
//must be called by main thread only! => ~wxBitmap() is NOT thread-safe!
- //call at an appropriate time, e.g. after Workload::setWorkload()
+ //call at an appropriate time, e.g. after Workload::set()
void limitSize()
{
assert(std::this_thread::get_id() == mainThreadId);
@@ -201,10 +202,10 @@ private:
void priorityListPopFront()
{
assert(firstInsertPos_!= iconList.end());
- firstInsertPos_ = refData(firstInsertPos_).next_;
+ firstInsertPos_ = refData(firstInsertPos_).next;
if (firstInsertPos_ != iconList.end())
- refData(firstInsertPos_).prev_ = iconList.end();
+ refData(firstInsertPos_).prev = iconList.end();
else //priority list size > BUFFER_SIZE_MAX in this context, but still for completeness:
lastInsertPos_ = iconList.end();
}
@@ -216,13 +217,13 @@ private:
{
assert(firstInsertPos_ == iconList.end());
firstInsertPos_ = lastInsertPos_ = it;
- refData(it).prev_ = refData(it).next_ = iconList.end();
+ refData(it).prev = refData(it).next = iconList.end();
}
else
{
- refData(it).next_ = iconList.end();
- refData(it).prev_ = lastInsertPos_;
- refData(lastInsertPos_).next_ = it;
+ refData(it).next = iconList.end();
+ refData(it).prev = lastInsertPos_;
+ refData(lastInsertPos_).next = it;
lastInsertPos_ = it;
}
}
@@ -231,12 +232,12 @@ private:
void markAsHot(FileIconMap::iterator it) //mark existing buffer entry as if newly inserted
{
assert(it != iconList.end());
- if (refData(it).next_ != iconList.end())
+ if (refData(it).next != iconList.end())
{
- if (refData(it).prev_ != iconList.end())
+ if (refData(it).prev != iconList.end())
{
- refData(refData(it).prev_).next_ = refData(it).next_; //remove somewhere from the middle
- refData(refData(it).next_).prev_ = refData(it).prev_; //
+ refData(refData(it).prev).next = refData(it).next; //remove somewhere from the middle
+ refData(refData(it).next).prev = refData(it).prev; //
}
else
{
@@ -247,7 +248,7 @@ private:
}
else
{
- if (refData(it).prev_ != iconList.end())
+ if (refData(it).prev != iconList.end())
assert(it == lastInsertPos_); //nothing to do
else
assert(iconList.size() == 1 && it == firstInsertPos_ && it == lastInsertPos_); //nothing to do
@@ -257,7 +258,7 @@ private:
struct IconData
{
IconData() {}
- IconData(IconData&& tmp) : iconRaw(std::move(tmp.iconRaw)), iconFmt(std::move(tmp.iconFmt)), prev_(tmp.prev_), next_(tmp.next_) {}
+ IconData(IconData&& tmp) : iconRaw(std::move(tmp.iconRaw)), iconFmt(std::move(tmp.iconFmt)), prev(tmp.prev), next(tmp.next) {}
ImageHolder iconRaw; //native icon representation: may be used by any thread
@@ -267,8 +268,8 @@ private:
//- prohibit calls to ~wxBitmap() and transitively ~IconData()
//- prohibit even wxBitmap() default constructor - better be safe than sorry!
- FileIconMap::iterator prev_; //store list sorted by time of insertion into buffer
- FileIconMap::iterator next_; //
+ FileIconMap::iterator prev; //store list sorted by time of insertion into buffer
+ FileIconMap::iterator next; //
};
mutable std::mutex lockIconList_;
@@ -279,50 +280,14 @@ private:
//################################################################################################################################################
-class WorkerThread //lifetime is part of icon buffer
-{
-public:
- WorkerThread(const std::shared_ptr<WorkLoad>& workload,
- const std::shared_ptr<Buffer>& buffer,
- IconBuffer::IconSize st) :
- workload_(workload),
- buffer_(buffer),
- iconSizeType_(st) {}
-
- void operator()() const; //thread entry
-
-private:
- std::shared_ptr<WorkLoad> workload_; //main/worker thread may access different shared_ptr instances safely (even though they have the same target!)
- std::shared_ptr<Buffer> buffer_; //http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm?sess=8153b05b34d890e02d48730db1ff7ddc#ThreadSafety
- const IconBuffer::IconSize iconSizeType_;
-};
-
-
-
-
-void WorkerThread::operator()() const //thread entry
-{
- setCurrentThreadName("Icon Buffer Worker");
- for (;;)
- {
- interruptionPoint(); //throw ThreadInterruption
- //needed? extractNextFile() is already interruptible...
-
- //start work: blocks until next icon to load is retrieved:
- const AbstractPath itemPath = workload_->extractNextFile(); //throw ThreadInterruption
-
- if (!buffer_->hasIcon(itemPath)) //perf: workload may contain duplicate entries?
- buffer_->insert(itemPath, getDisplayIcon(itemPath, iconSizeType_));
- }
-
-}
//######################### redirect to impl #####################################################
struct IconBuffer::Impl
{
- std::shared_ptr<WorkLoad> workload = std::make_shared<WorkLoad>();
- std::shared_ptr<Buffer> buffer = std::make_shared<Buffer>();
+ //communication channel used by threads:
+ WorkLoad workload; //manage life time: enclose InterruptibleThread's (until joined)!!!
+ Buffer buffer; //
InterruptibleThread worker;
@@ -333,7 +298,18 @@ struct IconBuffer::Impl
IconBuffer::IconBuffer(IconSize sz) : pimpl_(std::make_unique<Impl>()), iconSizeType_(sz)
{
- pimpl_->worker = InterruptibleThread(WorkerThread(pimpl_->workload, pimpl_->buffer, sz));
+ pimpl_->worker = InterruptibleThread([&workload = pimpl_->workload, &buffer = pimpl_->buffer, sz]
+ {
+ setCurrentThreadName("Icon Buffer");
+ for (;;)
+ {
+ //start work: blocks until next icon to load is retrieved:
+ const AbstractPath itemPath = workload.extractNext(); //throw ThreadInterruption
+
+ if (!buffer.hasIcon(itemPath)) //perf: workload may contain duplicate entries?
+ buffer.insert(itemPath, getDisplayIcon(itemPath, sz));
+ }
+ });
}
@@ -347,15 +323,15 @@ IconBuffer::~IconBuffer()
int IconBuffer::getSize(IconSize sz)
{
- //coordinate with getThumbSizeType() and linkOverlayIcon()!
+ //coordinate with getIconByIndexImpl() and linkOverlayIcon()!
switch (sz)
{
case IconBuffer::SIZE_SMALL:
- return 24;
+ return fastFromDIP(24);
case IconBuffer::SIZE_MEDIUM:
- return 48;
+ return fastFromDIP(48);
case IconBuffer::SIZE_LARGE:
- return 128;
+ return fastFromDIP(128);
}
assert(false);
return 0;
@@ -364,18 +340,18 @@ int IconBuffer::getSize(IconSize sz)
bool IconBuffer::readyForRetrieval(const AbstractPath& filePath)
{
- return pimpl_->buffer->hasIcon(filePath);
+ return pimpl_->buffer.hasIcon(filePath);
}
Opt<wxBitmap> IconBuffer::retrieveFileIcon(const AbstractPath& filePath)
{
- if (Opt<wxBitmap> ico = pimpl_->buffer->retrieve(filePath))
+ if (Opt<wxBitmap> ico = pimpl_->buffer.retrieve(filePath))
return ico;
//since this icon seems important right now, we don't want to wait until next setWorkload() to start retrieving
- pimpl_->workload->addToWorkload(filePath);
- pimpl_->buffer->limitSize();
+ pimpl_->workload.add(filePath);
+ pimpl_->buffer.limitSize();
return NoValue();
}
@@ -384,8 +360,8 @@ void IconBuffer::setWorkload(const std::vector<AbstractPath>& load)
{
assert(load.size() < BUFFER_SIZE_MAX / 2);
- pimpl_->workload->setWorkload(load); //since buffer can only increase due to new workload,
- pimpl_->buffer->limitSize(); //this is the place to impose the limit from main thread!
+ pimpl_->workload.set(load); //since buffer can only increase due to new workload,
+ pimpl_->buffer.limitSize(); //this is the place to impose the limit from main thread!
}
@@ -427,9 +403,9 @@ wxBitmap IconBuffer::linkOverlayIcon(IconSize sz)
{
const int pixelSize = IconBuffer::getSize(sz);
- if (pixelSize >= 128) return L"link_128";
- if (pixelSize >= 48) return L"link_48";
- if (pixelSize >= 24) return L"link_24";
+ if (pixelSize >= fastFromDIP(128)) return L"link_128";
+ if (pixelSize >= fastFromDIP(48)) return L"link_48";
+ if (pixelSize >= fastFromDIP(24)) return L"link_24";
return L"link_16";
}());
}
diff --git a/FreeFileSync/Source/lib/icon_loader.h b/FreeFileSync/Source/lib/icon_loader.h
index efbd530f..7f14ff54 100755
--- a/FreeFileSync/Source/lib/icon_loader.h
+++ b/FreeFileSync/Source/lib/icon_loader.h
@@ -8,7 +8,7 @@
#define ICON_LOADER_H_1348701985713445
#include <zen/zstring.h>
-#include "icon_holder.h"
+#include <wx+/image_holder.h>
namespace fff
@@ -17,11 +17,11 @@ namespace fff
//!!!Note: init COM + system image list before loading icons!!!
//return null icon on failure:
-ImageHolder getIconByTemplatePath(const Zstring& templatePath, int pixelSize);
-ImageHolder genericFileIcon(int pixelSize);
-ImageHolder genericDirIcon(int pixelSize);
-ImageHolder getFileIcon(const Zstring& filePath, int pixelSize);
-ImageHolder getThumbnailImage(const Zstring& filePath, int pixelSize);
+zen::ImageHolder getIconByTemplatePath(const Zstring& templatePath, int pixelSize);
+zen::ImageHolder genericFileIcon(int pixelSize);
+zen::ImageHolder genericDirIcon(int pixelSize);
+zen::ImageHolder getFileIcon(const Zstring& filePath, int pixelSize);
+zen::ImageHolder getThumbnailImage(const Zstring& filePath, int pixelSize);
}
#endif //ICON_LOADER_H_1348701985713445
diff --git a/FreeFileSync/Source/lib/localization.cpp b/FreeFileSync/Source/lib/localization.cpp
index a60e34e2..bc27e6ea 100755
--- a/FreeFileSync/Source/lib/localization.cpp
+++ b/FreeFileSync/Source/lib/localization.cpp
@@ -341,8 +341,8 @@ public:
void init(wxLanguage lng)
{
- locale.reset(); //avoid global locale lifetime overlap! wxWidgets cannot handle this and will crash!
- locale = std::make_unique<wxLocale>();
+ locale_.reset(); //avoid global locale lifetime overlap! wxWidgets cannot handle this and will crash!
+ locale_ = std::make_unique<wxLocale>();
const wxLanguageInfo* sysLngInfo = wxLocale::GetLanguageInfo(wxLocale::GetSystemLanguage());
const wxLanguageInfo* selLngInfo = wxLocale::GetLanguageInfo(lng);
@@ -352,23 +352,22 @@ public:
wxLogNull dummy; //rather than implementing a reasonable error handling wxWidgets decides to shows a modal dialog in wxLocale::Init -> at least we can shut it up!
if (sysLangIsRTL == selectedLangIsRTL)
- locale->Init(wxLANGUAGE_DEFAULT); //use sys-lang to preserve sub-language specific rules (e.g. german swiss number punctation)
+ locale_->Init(wxLANGUAGE_DEFAULT); //use sys-lang to preserve sub-language specific rules (e.g. german swiss number punctation)
else
- locale->Init(lng); //have to use the supplied language to enable RTL layout different than user settings
- locLng = lng;
+ locale_->Init(lng); //have to use the supplied language to enable RTL layout different than user settings
+ locLng_ = lng;
}
- void tearDown() { locale.reset(); locLng = wxLANGUAGE_UNKNOWN; }
-
- wxLanguage getLanguage() const { return locLng; }
+ void tearDown() { locale_.reset(); locLng_ = wxLANGUAGE_UNKNOWN; }
+ wxLanguage getLanguage() const { return locLng_; }
private:
wxWidgetsLocale() {}
- ~wxWidgetsLocale() { assert(!locale); }
+ ~wxWidgetsLocale() { assert(!locale_); }
- std::unique_ptr<wxLocale> locale;
- wxLanguage locLng = wxLANGUAGE_UNKNOWN;
+ std::unique_ptr<wxLocale> locale_;
+ wxLanguage locLng_ = wxLANGUAGE_UNKNOWN;
};
}
diff --git a/FreeFileSync/Source/lib/parallel_scan.cpp b/FreeFileSync/Source/lib/parallel_scan.cpp
index 3ff7c9b6..702b7aac 100755
--- a/FreeFileSync/Source/lib/parallel_scan.cpp
+++ b/FreeFileSync/Source/lib/parallel_scan.cpp
@@ -20,6 +20,7 @@ using namespace fff;
namespace
{
+
/*
#ifdef ZEN_WIN
@@ -164,17 +165,18 @@ public:
//blocking call: context of worker thread
FillBufferCallback::HandleError reportError(const std::wstring& msg, size_t retryNumber) //throw ThreadInterruption
{
+ assert(std::this_thread::get_id() != mainThreadId);
std::unique_lock<std::mutex> dummy(lockErrorInfo_);
interruptibleWait(conditionCanReportError_, dummy, [this] { return !errorInfo_ && !errorResponse_; }); //throw ThreadInterruption
- errorInfo_ = std::make_unique<std::pair<BasicWString, size_t>>(copyStringTo<BasicWString>(msg), retryNumber);
+ errorInfo_ = std::make_pair(copyStringTo<BasicWString>(msg), retryNumber);
interruptibleWait(conditionGotResponse_, dummy, [this] { return static_cast<bool>(errorResponse_); }); //throw ThreadInterruption
FillBufferCallback::HandleError rv = *errorResponse_;
- errorInfo_ .reset();
- errorResponse_.reset();
+ errorInfo_ = NoValue();
+ errorResponse_ = NoValue();
dummy.unlock(); //optimization for condition_variable::notify_all()
conditionCanReportError_.notify_all(); //instead of notify_one(); workaround bug: https://svn.boost.org/trac/boost/ticket/7796
@@ -185,18 +187,18 @@ public:
//context of main thread, call repreatedly
void processErrors(FillBufferCallback& callback)
{
+ assert(std::this_thread::get_id() == mainThreadId);
std::unique_lock<std::mutex> dummy(lockErrorInfo_);
- if (errorInfo_.get() && !errorResponse_.get())
+ if (errorInfo_ && !errorResponse_)
{
- FillBufferCallback::HandleError rv = callback.reportError(copyStringTo<std::wstring>(errorInfo_->first), errorInfo_->second); //throw!
- errorResponse_ = std::make_unique<FillBufferCallback::HandleError>(rv);
+ errorResponse_ = callback.reportError(copyStringTo<std::wstring>(errorInfo_->first), errorInfo_->second); //throw!
dummy.unlock(); //optimization for condition_variable::notify_all()
conditionGotResponse_.notify_all(); //instead of notify_one(); workaround bug: https://svn.boost.org/trac/boost/ticket/7796
}
}
- void incrementNotifyingThreadId() { ++notifyingThreadID_; } //context of main thread
+ void incrementNotifyingThreadId() {assert(std::this_thread::get_id() == mainThreadId); ++notifyingThreadID_; } //context of main thread
//perf optimization: comparison phase is 7% faster by avoiding needless std::wstring contstruction for reportCurrentFile()
bool mayReportCurrentFile(int threadID, std::chrono::steady_clock::time_point& lastReportTime) const
@@ -217,12 +219,14 @@ public:
void reportCurrentFile(const std::wstring& filepath) //context of worker thread
{
+ assert(std::this_thread::get_id() != mainThreadId);
std::lock_guard<std::mutex> dummy(lockCurrentStatus_);
currentFile_ = copyStringTo<BasicWString>(filepath);
}
std::wstring getCurrentStatus() //context of main thread, call repreatedly
{
+ assert(std::this_thread::get_id() == mainThreadId);
std::wstring filepath;
{
std::lock_guard<std::mutex> dummy(lockCurrentStatus_);
@@ -255,8 +259,8 @@ private:
std::mutex lockErrorInfo_;
std::condition_variable conditionCanReportError_;
std::condition_variable conditionGotResponse_;
- std::unique_ptr<std::pair<BasicWString, size_t>> errorInfo_; //error message + retry number
- std::unique_ptr<FillBufferCallback::HandleError> errorResponse_;
+ Opt<std::pair<BasicWString, size_t>> errorInfo_; //error message + retry number
+ Opt<FillBufferCallback::HandleError> errorResponse_;
//---- status updates ----
std::atomic<int> notifyingThreadID_ { 0 }; //CAVEAT: do NOT use boost::thread::id: https://svn.boost.org/trac/boost/ticket/5754
@@ -276,43 +280,27 @@ private:
struct TraverserConfig
{
-public:
- TraverserConfig(int threadID,
- const AbstractPath& baseFolderPath,
- const HardFilter::FilterRef& filter,
- SymLinkHandling handleSymlinks,
- std::map<Zstring, std::wstring, LessFilePath>& failedFolderReads,
- std::map<Zstring, std::wstring, LessFilePath>& failedItemReads,
- AsyncCallback& acb) :
- baseFolderPath_(baseFolderPath),
- filter_(filter),
- handleSymlinks_(handleSymlinks),
- failedDirReads_ (failedFolderReads),
- failedItemReads_(failedItemReads),
- acb_(acb),
- threadID_(threadID) {}
-
- const AbstractPath baseFolderPath_;
- const HardFilter::FilterRef filter_; //always bound!
- const SymLinkHandling handleSymlinks_;
-
- std::map<Zstring, std::wstring, LessFilePath>& failedDirReads_;
- std::map<Zstring, std::wstring, LessFilePath>& failedItemReads_;
-
- AsyncCallback& acb_;
- const int threadID_;
- std::chrono::steady_clock::time_point lastReportTime_;
+ const AbstractPath baseFolderPath; //thread-safe like an int! :)
+ const HardFilter::FilterRef filter; //always bound!
+ const SymLinkHandling handleSymlinks;
+
+ std::map<Zstring, std::wstring, LessFilePath>& failedDirReads;
+ std::map<Zstring, std::wstring, LessFilePath>& failedItemReads;
+
+ AsyncCallback& acb;
+ const int threadID;
+ std::chrono::steady_clock::time_point lastReportTime;
};
class DirCallback : public AFS::TraverserCallback
{
public:
- DirCallback(TraverserConfig& config,
+ DirCallback(TraverserConfig& cfg,
const Zstring& parentRelPathPf, //postfixed with FILE_NAME_SEPARATOR!
FolderContainer& output,
int level) :
- cfg(config),
+ cfg_(cfg),
parentRelPathPf_(parentRelPathPf),
output_(output),
level_(level) {}
@@ -325,7 +313,7 @@ public:
HandleError reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) override; //
private:
- TraverserConfig& cfg;
+ TraverserConfig& cfg_;
const Zstring parentRelPathPf_;
FolderContainer& output_;
const int level_;
@@ -344,12 +332,12 @@ void DirCallback::onFile(const FileInfo& fi) //throw ThreadInterruption
const Zstring fileRelPath = parentRelPathPf_ + fi.itemName;
//update status information no matter whether item is excluded or not!
- if (cfg.acb_.mayReportCurrentFile(cfg.threadID_, cfg.lastReportTime_))
- cfg.acb_.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg.baseFolderPath_, fileRelPath)));
+ if (cfg_.acb.mayReportCurrentFile(cfg_.threadID, cfg_.lastReportTime))
+ cfg_.acb.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg_.baseFolderPath, fileRelPath)));
//------------------------------------------------------------------------------------
//apply filter before processing (use relative name!)
- if (!cfg.filter_->passFileFilter(fileRelPath))
+ if (!cfg_.filter->passFileFilter(fileRelPath))
return;
// std::string fileId = details.fileSize >= 1024 * 1024U ? util::retrieveFileID(filepath) : std::string();
@@ -365,7 +353,7 @@ void DirCallback::onFile(const FileInfo& fi) //throw ThreadInterruption
output_.addSubFile(fi.itemName, FileAttributes(fi.modTime, fi.fileSize, fi.fileId, fi.symlinkInfo != nullptr));
- cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator
+ cfg_.acb.incItemsScanned(); //add 1 element to the progress indicator
}
@@ -376,31 +364,31 @@ std::unique_ptr<AFS::TraverserCallback> DirCallback::onFolder(const FolderInfo&
const Zstring& folderRelPath = parentRelPathPf_ + fi.itemName;
//update status information no matter whether item is excluded or not!
- if (cfg.acb_.mayReportCurrentFile(cfg.threadID_, cfg.lastReportTime_))
- cfg.acb_.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg.baseFolderPath_, folderRelPath)));
+ if (cfg_.acb.mayReportCurrentFile(cfg_.threadID, cfg_.lastReportTime))
+ cfg_.acb.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg_.baseFolderPath, folderRelPath)));
//------------------------------------------------------------------------------------
//apply filter before processing (use relative name!)
bool childItemMightMatch = true;
- const bool passFilter = cfg.filter_->passDirFilter(folderRelPath, &childItemMightMatch);
+ const bool passFilter = cfg_.filter->passDirFilter(folderRelPath, &childItemMightMatch);
if (!passFilter && !childItemMightMatch)
return nullptr; //do NOT traverse subdirs
//else: attention! ensure directory filtering is applied later to exclude actually filtered directories
FolderContainer& subFolder = output_.addSubFolder(fi.itemName, fi.symlinkInfo != nullptr);
if (passFilter)
- cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator
+ cfg_.acb.incItemsScanned(); //add 1 element to the progress indicator
//------------------------------------------------------------------------------------
if (level_ > 100) //Win32 traverser: stack overflow approximately at level 1000
//check after FolderContainer::addSubFolder()
if (!tryReportingItemError([&] //throw ThreadInterruption
{
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", AFS::getDisplayPath(AFS::appendRelPath(cfg.baseFolderPath_, folderRelPath))), L"Endless recursion.");
+ throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", AFS::getDisplayPath(AFS::appendRelPath(cfg_.baseFolderPath, folderRelPath))), L"Endless recursion.");
}, *this, fi.itemName))
return nullptr;
- return std::make_unique<DirCallback>(cfg, folderRelPath + FILE_NAME_SEPARATOR, subFolder, level_ + 1);
+ return std::make_unique<DirCallback>(cfg_, folderRelPath + FILE_NAME_SEPARATOR, subFolder, level_ + 1);
}
@@ -411,29 +399,29 @@ DirCallback::HandleLink DirCallback::onSymlink(const SymlinkInfo& si) //throw Th
const Zstring& linkRelPath = parentRelPathPf_ + si.itemName;
//update status information no matter whether item is excluded or not!
- if (cfg.acb_.mayReportCurrentFile(cfg.threadID_, cfg.lastReportTime_))
- cfg.acb_.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg.baseFolderPath_, linkRelPath)));
+ if (cfg_.acb.mayReportCurrentFile(cfg_.threadID, cfg_.lastReportTime))
+ cfg_.acb.reportCurrentFile(AFS::getDisplayPath(AFS::appendRelPath(cfg_.baseFolderPath, linkRelPath)));
- switch (cfg.handleSymlinks_)
+ switch (cfg_.handleSymlinks)
{
case SymLinkHandling::EXCLUDE:
return LINK_SKIP;
case SymLinkHandling::DIRECT:
- if (cfg.filter_->passFileFilter(linkRelPath)) //always use file filter: Link type may not be "stable" on Linux!
+ if (cfg_.filter->passFileFilter(linkRelPath)) //always use file filter: Link type may not be "stable" on Linux!
{
output_.addSubLink(si.itemName, LinkAttributes(si.modTime));
- cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator
+ cfg_.acb.incItemsScanned(); //add 1 element to the progress indicator
}
return LINK_SKIP;
case SymLinkHandling::FOLLOW:
//filter symlinks before trying to follow them: handle user-excluded broken symlinks!
//since we don't know yet what type the symlink will resolve to, only do this when both variants agree:
- if (!cfg.filter_->passFileFilter(linkRelPath))
+ if (!cfg_.filter->passFileFilter(linkRelPath))
{
bool childItemMightMatch = true;
- if (!cfg.filter_->passDirFilter(linkRelPath, &childItemMightMatch))
+ if (!cfg_.filter->passDirFilter(linkRelPath, &childItemMightMatch))
if (!childItemMightMatch)
return LINK_SKIP;
}
@@ -447,10 +435,10 @@ DirCallback::HandleLink DirCallback::onSymlink(const SymlinkInfo& si) //throw Th
DirCallback::HandleError DirCallback::reportDirError(const std::wstring& msg, size_t retryNumber) //throw ThreadInterruption
{
- switch (cfg.acb_.reportError(msg, retryNumber)) //throw ThreadInterruption
+ switch (cfg_.acb.reportError(msg, retryNumber)) //throw ThreadInterruption
{
case FillBufferCallback::ON_ERROR_CONTINUE:
- cfg.failedDirReads_[beforeLast(parentRelPathPf_, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)] = msg;
+ cfg_.failedDirReads[beforeLast(parentRelPathPf_, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_NONE)] = msg;
return ON_ERROR_CONTINUE;
case FillBufferCallback::ON_ERROR_RETRY:
@@ -463,10 +451,10 @@ DirCallback::HandleError DirCallback::reportDirError(const std::wstring& msg, si
DirCallback::HandleError DirCallback::reportItemError(const std::wstring& msg, size_t retryNumber, const Zstring& itemName) //throw ThreadInterruption
{
- switch (cfg.acb_.reportError(msg, retryNumber)) //throw ThreadInterruption
+ switch (cfg_.acb.reportError(msg, retryNumber)) //throw ThreadInterruption
{
case FillBufferCallback::ON_ERROR_CONTINUE:
- cfg.failedItemReads_[parentRelPathPf_ + itemName] = msg;
+ cfg_.failedItemReads[parentRelPathPf_ + itemName] = msg;
return ON_ERROR_CONTINUE;
case FillBufferCallback::ON_ERROR_RETRY:
@@ -475,48 +463,6 @@ DirCallback::HandleError DirCallback::reportItemError(const std::wstring& msg, s
assert(false);
return ON_ERROR_CONTINUE;
}
-
-//------------------------------------------------------------------------------------------
-
-class WorkerThread
-{
-public:
- WorkerThread(int threadID,
- const std::shared_ptr<AsyncCallback>& acb,
- const AbstractPath& baseFolderPath, //always bound!
- const HardFilter::FilterRef& filter, //
- SymLinkHandling handleSymlinks,
- DirectoryValue& dirOutput) :
- acb_(acb),
- outputContainer_(dirOutput.folderCont),
- travCfg_(threadID,
- baseFolderPath,
- filter,
- handleSymlinks, //shared by all(!) instances of DirCallback while traversing a folder hierarchy
- dirOutput.failedFolderReads,
- dirOutput.failedItemReads,
- *acb_) {}
-
- void operator()() //thread entry
- {
- setCurrentThreadName("Folder Traverser");
-
- acb_->incActiveWorker();
- ZEN_ON_SCOPE_EXIT(acb_->decActiveWorker());
-
- if (acb_->mayReportCurrentFile(travCfg_.threadID_, travCfg_.lastReportTime_))
- acb_->reportCurrentFile(AFS::getDisplayPath(travCfg_.baseFolderPath_)); //just in case first directory access is blocking
-
- DirCallback cb(travCfg_, Zstring(), outputContainer_, 0);
-
- AFS::traverseFolder(travCfg_.baseFolderPath_, cb); //throw ThreadInterruption
- }
-
-private:
- std::shared_ptr<AsyncCallback> acb_;
- FolderContainer& outputContainer_;
- TraverserConfig travCfg_;
-};
}
@@ -527,6 +473,9 @@ void fff::fillBuffer(const std::set<DirectoryKey>& keysToRead, //in
{
buf.clear();
+ //communication channel used by threads
+ AsyncCallback acb(cbInterval); //manage life time: enclose InterruptibleThread's!!!
+
FixedList<InterruptibleThread> worker;
ZEN_ON_SCOPE_FAIL
@@ -535,24 +484,39 @@ void fff::fillBuffer(const std::set<DirectoryKey>& keysToRead, //in
wt.interrupt(); //interrupt all first, then join
for (InterruptibleThread& 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::try_join_for() below!
+ wt.join(); //in this context it is possible a thread is *not* joinable anymore due to the tryJoinFor() below!
);
- auto acb = std::make_shared<AsyncCallback>(cbInterval);
-
//init worker threads
for (const DirectoryKey& key : keysToRead)
{
- assert(buf.find(key) == buf.end());
DirectoryValue& dirOutput = buf[key];
const int threadId = static_cast<int>(worker.size());
- worker.emplace_back(WorkerThread(threadId,
- acb,
- key.folderPath, //AbstractPath is thread-safe like an int! :)
- key.filter,
- key.handleSymlinks,
- dirOutput));
+ worker.emplace_back([&outputContainer = dirOutput.folderCont,
+ travCfg = TraverserConfig //shared by all(!) instances of DirCallback while traversing a folder hierarchy
+ {
+ key.folderPath,
+ key.filter,
+ key.handleSymlinks,
+ dirOutput.failedFolderReads,
+ dirOutput.failedItemReads,
+ acb,
+ threadId,
+ }]() mutable
+ {
+ setCurrentThreadName("Folder Traverser");
+
+ travCfg.acb.incActiveWorker();
+ ZEN_ON_SCOPE_EXIT(travCfg.acb.decActiveWorker());
+
+ if (travCfg.acb.mayReportCurrentFile(travCfg.threadID, travCfg.lastReportTime))
+ travCfg.acb.reportCurrentFile(AFS::getDisplayPath(travCfg.baseFolderPath)); //just in case first directory access is blocking
+
+ DirCallback cb(travCfg, Zstring(), outputContainer, 0);
+
+ AFS::traverseFolder(travCfg.baseFolderPath, cb); //throw ThreadInterruption
+ });
}
//wait until done
@@ -560,14 +524,11 @@ void fff::fillBuffer(const std::set<DirectoryKey>& keysToRead, //in
{
do
{
- //update status
- callback.reportStatus(acb->getCurrentStatus(), acb->getItemsScanned()); //throw!
-
- //process errors
- acb->processErrors(callback);
+ callback.reportStatus(acb.getCurrentStatus(), acb.getItemsScanned()); //throw!
+ acb.processErrors(callback);
}
while (!wt.tryJoinFor(cbInterval));
- acb->incrementNotifyingThreadId(); //process info messages of one thread at a time only
+ 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 78aa4a88..86faca28 100755
--- a/FreeFileSync/Source/lib/parse_lng.h
+++ b/FreeFileSync/Source/lib/parse_lng.h
@@ -725,8 +725,8 @@ std::string generateLng(const TranslationUnorderedList& in, const TransHeader& h
out += tokens.text(Token::TK_SRC_END) + '\n';
out += tokens.text(Token::TK_TRG_BEGIN);
- if (!forms.empty())
- out += '\n';
+ if (!forms.empty()) //translators will be searching for "<target></target>"
+ out += '\n';
for (std::string plForm : forms)
{
formatMultiLineText(plForm);
diff --git a/FreeFileSync/Source/lib/perf_check.cpp b/FreeFileSync/Source/lib/perf_check.cpp
index fe4727c7..8b6f52d6 100755
--- a/FreeFileSync/Source/lib/perf_check.cpp
+++ b/FreeFileSync/Source/lib/perf_check.cpp
@@ -45,8 +45,8 @@ std::tuple<double /*timeDelta*/, int /*itemsDelta*/, double /*bytesDelta*/> Perf
const int itemsDelta = itBack->second.items - itFront->second.items;
const double bytesDelta = itBack->second.bytes - itFront->second.bytes;
- //return { timeDelta, itemsDelta, bytesDelta }; -> requires C++17 (Linux only issue)
- return std::make_tuple(timeDelta, itemsDelta, bytesDelta);
+ //return { timeDelta, itemsDelta, bytesDelta }; -> requires C++17 (Linux-only issue)
+ return std::make_tuple(timeDelta, itemsDelta, bytesDelta);
}
diff --git a/FreeFileSync/Source/lib/process_xml.cpp b/FreeFileSync/Source/lib/process_xml.cpp
index 2b9b52c8..d7db65df 100755
--- a/FreeFileSync/Source/lib/process_xml.cpp
+++ b/FreeFileSync/Source/lib/process_xml.cpp
@@ -21,8 +21,8 @@ using namespace fff; //functionally needed for correct overload resolution!!!
namespace
{
//-------------------------------------------------------------------------------------------------------------------------------
-const int XML_FORMAT_VER_GLOBAL = 8; //2018-02-01
-const int XML_FORMAT_VER_FFS_CFG = 9; //2018-02-01
+const int XML_FORMAT_VER_GLOBAL = 8; //2018-02-01
+const int XML_FORMAT_VER_FFS_CFG = 10; //2018-02-24
//-------------------------------------------------------------------------------------------------------------------------------
}
@@ -955,22 +955,22 @@ void readConfig(const XmlIn& in, FilterConfig& filter, int formatVer)
}
-void readConfig(const XmlIn& in, FolderPairEnh& enhPair, int formatVer)
+void readConfig(const XmlIn& in, LocalPairConfig& lpc, int formatVer)
{
//read folder pairs
- in["Left" ](enhPair.folderPathPhraseLeft_);
- in["Right"](enhPair.folderPathPhraseRight_);
+ in["Left" ](lpc.folderPathPhraseLeft);
+ in["Right"](lpc.folderPathPhraseRight);
//TODO: remove after migration - 2016-07-24
auto ciReplace = [](Zstring& pathPhrase, const Zstring& oldTerm, const Zstring& newTerm) { pathPhrase = ciReplaceCpy(pathPhrase, oldTerm, newTerm); };
- ciReplace(enhPair.folderPathPhraseLeft_, Zstr("%csidl_MyDocuments%"), Zstr("%csidl_Documents%"));
- ciReplace(enhPair.folderPathPhraseLeft_, Zstr("%csidl_MyMusic%" ), Zstr("%csidl_Music%"));
- ciReplace(enhPair.folderPathPhraseLeft_, Zstr("%csidl_MyPictures%" ), Zstr("%csidl_Pictures%"));
- ciReplace(enhPair.folderPathPhraseLeft_, Zstr("%csidl_MyVideos%" ), Zstr("%csidl_Videos%"));
- ciReplace(enhPair.folderPathPhraseRight_, Zstr("%csidl_MyDocuments%"), Zstr("%csidl_Documents%"));
- ciReplace(enhPair.folderPathPhraseRight_, Zstr("%csidl_MyMusic%" ), Zstr("%csidl_Music%"));
- ciReplace(enhPair.folderPathPhraseRight_, Zstr("%csidl_MyPictures%" ), Zstr("%csidl_Pictures%"));
- ciReplace(enhPair.folderPathPhraseRight_, Zstr("%csidl_MyVideos%" ), Zstr("%csidl_Videos%"));
+ ciReplace(lpc.folderPathPhraseLeft, Zstr("%csidl_MyDocuments%"), Zstr("%csidl_Documents%"));
+ ciReplace(lpc.folderPathPhraseLeft, Zstr("%csidl_MyMusic%" ), Zstr("%csidl_Music%"));
+ ciReplace(lpc.folderPathPhraseLeft, Zstr("%csidl_MyPictures%" ), Zstr("%csidl_Pictures%"));
+ ciReplace(lpc.folderPathPhraseLeft, Zstr("%csidl_MyVideos%" ), Zstr("%csidl_Videos%"));
+ ciReplace(lpc.folderPathPhraseRight, Zstr("%csidl_MyDocuments%"), Zstr("%csidl_Documents%"));
+ ciReplace(lpc.folderPathPhraseRight, Zstr("%csidl_MyMusic%" ), Zstr("%csidl_Music%"));
+ ciReplace(lpc.folderPathPhraseRight, Zstr("%csidl_MyPictures%" ), Zstr("%csidl_Pictures%"));
+ ciReplace(lpc.folderPathPhraseRight, Zstr("%csidl_MyVideos%" ), Zstr("%csidl_Videos%"));
//TODO: remove after migration 2016-09-27
if (formatVer < 6) //the-base64-encoded password is now stored as an option at the string end
@@ -988,50 +988,59 @@ void readConfig(const XmlIn& in, FolderPairEnh& enhPair, int formatVer)
Zstr("|pass64=") + Zstring(pathPhrase.begin() + pos + strLength(Zstr(":[base64]")), pathPhrase.begin() + posEnd);
}
};
- updateSftpSyntax(enhPair.folderPathPhraseLeft_);
- updateSftpSyntax(enhPair.folderPathPhraseRight_);
+ updateSftpSyntax(lpc.folderPathPhraseLeft);
+ updateSftpSyntax(lpc.folderPathPhraseRight);
}
//###########################################################
//alternate comp configuration (optional)
- if (XmlIn inAltCmp = in["CompareConfig"])
+ if (XmlIn inLocalCmp = in[formatVer < 10 ? "CompareConfig" : "Compare"]) //TODO: remove if parameter migration after some time! 2018-02-25
{
- CompConfig altCmpCfg;
- readConfig(inAltCmp, altCmpCfg);
+ CompConfig cmpCfg;
+ readConfig(inLocalCmp, cmpCfg);
- enhPair.altCmpConfig = std::make_shared<CompConfig>(altCmpCfg);
+ lpc.localCmpCfg = cmpCfg;
}
//###########################################################
//alternate sync configuration (optional)
- if (XmlIn inAltSync = in["SyncConfig"])
+ if (XmlIn inLocalSync = in[formatVer < 10 ? "SyncConfig" : "Synchronize"]) //TODO: remove if parameter migration after some time! 2018-02-25
{
- SyncConfig altSyncCfg;
- readConfig(inAltSync, altSyncCfg);
+ SyncConfig syncCfg;
+ readConfig(inLocalSync, syncCfg);
- enhPair.altSyncConfig = std::make_shared<SyncConfig>(altSyncCfg);
+ lpc.localSyncCfg = syncCfg;
}
//###########################################################
//alternate filter configuration
- if (XmlIn inLocFilter = in["LocalFilter"])
- readConfig(inLocFilter, enhPair.localFilter, formatVer);
+ if (XmlIn inLocFilter = in[formatVer < 10 ? "LocalFilter" : "Filter"]) //TODO: remove if parameter migration after some time! 2018-02-25
+ readConfig(inLocFilter, lpc.localFilter, formatVer);
}
void readConfig(const XmlIn& in, MainConfiguration& mainCfg, int formatVer)
{
- //read compare settings
- XmlIn inMain = in["MainConfig"];
+ XmlIn inMain = formatVer < 10 ? in["MainConfig"] : in; //TODO: remove if parameter migration after some time! 2018-02-25
- readConfig(inMain["Comparison"], mainCfg.cmpConfig);
+ if (formatVer < 10) //TODO: remove if parameter migration after some time! 2018-02-25
+ readConfig(inMain["Comparison"], mainCfg.cmpConfig);
+ else
+ readConfig(inMain["Compare"], mainCfg.cmpConfig);
//###########################################################
//read sync configuration
- readConfig(inMain["SyncConfig"], mainCfg.syncCfg);
+ if (formatVer < 10) //TODO: remove if parameter migration after some time! 2018-02-25
+ readConfig(inMain["SyncConfig"], mainCfg.syncCfg);
+ else
+ readConfig(inMain["Synchronize"], mainCfg.syncCfg);
+
//###########################################################
//read filter settings
- readConfig(inMain["GlobalFilter"], mainCfg.globalFilter, formatVer);
+ if (formatVer < 10) //TODO: remove if parameter migration after some time! 2018-02-25
+ readConfig(inMain["GlobalFilter"], mainCfg.globalFilter, formatVer);
+ else
+ readConfig(inMain["Filter"], mainCfg.globalFilter, formatVer);
//###########################################################
//read all folder pairs
@@ -1040,16 +1049,16 @@ void readConfig(const XmlIn& in, MainConfiguration& mainCfg, int formatVer)
bool firstItem = true;
for (XmlIn inPair = inMain["FolderPairs"]["Pair"]; inPair; inPair.next())
{
- FolderPairEnh newPair;
- readConfig(inPair, newPair, formatVer);
+ LocalPairConfig lpc;
+ readConfig(inPair, lpc, formatVer);
if (firstItem)
{
firstItem = false;
- mainCfg.firstPair = newPair; //set first folder pair
+ mainCfg.firstPair = lpc; //set first folder pair
}
else
- mainCfg.additionalPairs.push_back(newPair); //set additional folder pairs
+ mainCfg.additionalPairs.push_back(lpc); //set additional folder pairs
}
//TODO: remove if parameter migration after some time! 2017-10-24
@@ -1057,7 +1066,16 @@ void readConfig(const XmlIn& in, MainConfiguration& mainCfg, int formatVer)
inMain["OnCompletion"](mainCfg.postSyncCommand);
else
{
- inMain["IgnoreErrors"](mainCfg.ignoreErrors);
+ //TODO: remove if parameter migration after some time! 2018-02-24
+ if (formatVer < 10)
+ inMain["IgnoreErrors"](mainCfg.ignoreErrors);
+ else
+ {
+ inMain["Errors"].attribute("Ignore", mainCfg.ignoreErrors);
+ inMain["Errors"].attribute("Retry", mainCfg.automaticRetryCount);
+ inMain["Errors"].attribute("Delay", mainCfg.automaticRetryDelay);
+ }
+
inMain["PostSyncCommand"](mainCfg.postSyncCommand);
inMain["PostSyncCommand"].attribute("Condition", mainCfg.postSyncCondition);
}
@@ -1070,7 +1088,7 @@ void readConfig(const XmlIn& in, XmlGuiConfig& cfg, int formatVer)
readConfig(in, cfg.mainCfg, formatVer);
//read GUI specific config data
- XmlIn inGuiCfg = in["GuiConfig"];
+ XmlIn inGuiCfg = in[formatVer < 10 ? "GuiConfig" : "Gui"]; //TODO: remove if parameter migration after some time! 2018-02-25
std::string val;
if (inGuiCfg["MiddleGridView"](val)) //refactor into enum!?
@@ -1092,7 +1110,7 @@ void readConfig(const XmlIn& in, XmlGuiConfig& cfg, int formatVer)
void readConfig(const XmlIn& in, BatchExclusiveConfig& cfg, int formatVer)
{
- XmlIn inBatchCfg = in["BatchConfig"];
+ XmlIn inBatchCfg = in[formatVer < 10 ? "BatchConfig" : "Batch"]; //TODO: remove if parameter migration after some time! 2018-02-25
//TODO: remove if clause after migration! 2018-02-01
if (formatVer < 9)
@@ -1197,8 +1215,6 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& cfg, int formatVer)
inGeneral["FailSafeFileCopy" ].attribute("Enabled", cfg.failSafeFileCopy);
inGeneral["CopyLockedFiles" ].attribute("Enabled", cfg.copyLockedFiles);
inGeneral["CopyFilePermissions" ].attribute("Enabled", cfg.copyFilePermissions);
- inGeneral["AutomaticRetry" ].attribute("Count", cfg.automaticRetryCount);
- inGeneral["AutomaticRetry" ].attribute("Delay", cfg.automaticRetryDelay);
inGeneral["FileTimeTolerance" ].attribute("Seconds", cfg.fileTimeTolerance);
inGeneral["FolderAccessTimeout" ].attribute("Seconds", cfg.folderAccessTimeout);
inGeneral["RunWithBackgroundPriority"].attribute("Enabled", cfg.runWithBackgroundPriority);
@@ -1207,7 +1223,7 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& cfg, int formatVer)
inGeneral["LastSyncsLogSizeMax" ].attribute("Bytes", cfg.lastSyncsLogFileSizeMax);
inGeneral["NotificationSound" ].attribute("CompareFinished", cfg.soundFileCompareFinished);
inGeneral["NotificationSound" ].attribute("SyncFinished", cfg.soundFileSyncFinished);
- inGeneral["ProgressDialog" ].attribute("AutoClose", cfg.autoCloseProgressDialog);
+ inGeneral["ProgressDialog" ].attribute("AutoClose", cfg.autoCloseProgressDialog);
//TODO: remove old parameter after migration! 2018-02-04
if (formatVer < 8)
@@ -1643,54 +1659,54 @@ void writeConfig(const FilterConfig& filter, XmlOut& out)
}
-void writeConfig(const FolderPairEnh& enhPair, XmlOut& out)
+void writeConfig(const LocalPairConfig& lpc, XmlOut& out)
{
XmlOut outPair = out.ref().addChild("Pair");
//read folder pairs
- outPair["Left" ](enhPair.folderPathPhraseLeft_);
- outPair["Right"](enhPair.folderPathPhraseRight_);
+ outPair["Left" ](lpc.folderPathPhraseLeft);
+ outPair["Right"](lpc.folderPathPhraseRight);
//###########################################################
//alternate comp configuration (optional)
- if (enhPair.altCmpConfig.get())
+ if (lpc.localCmpCfg)
{
- XmlOut outAlt = outPair["CompareConfig"];
- writeConfig(*enhPair.altCmpConfig, outAlt);
+ XmlOut outLocalCmp = outPair["Compare"];
+ writeConfig(*lpc.localCmpCfg, outLocalCmp);
}
//###########################################################
//alternate sync configuration (optional)
- if (enhPair.altSyncConfig.get())
+ if (lpc.localSyncCfg)
{
- XmlOut outAltSync = outPair["SyncConfig"];
- writeConfig(*enhPair.altSyncConfig, outAltSync);
+ XmlOut outLocalSync = outPair["Synchronize"];
+ writeConfig(*lpc.localSyncCfg, outLocalSync);
}
//###########################################################
//alternate filter configuration
- if (enhPair.localFilter != FilterConfig()) //don't spam .ffs_gui file with default filter entries
+ if (lpc.localFilter != FilterConfig()) //don't spam .ffs_gui file with default filter entries
{
- XmlOut outFilter = outPair["LocalFilter"];
- writeConfig(enhPair.localFilter, outFilter);
+ XmlOut outFilter = outPair["Filter"];
+ writeConfig(lpc.localFilter, outFilter);
}
}
void writeConfig(const MainConfiguration& mainCfg, XmlOut& out)
{
- XmlOut outMain = out["MainConfig"];
+ XmlOut outMain = out;
- XmlOut outCmp = outMain["Comparison"];
+ XmlOut outCmp = outMain["Compare"];
writeConfig(mainCfg.cmpConfig, outCmp);
//###########################################################
- XmlOut outSync = outMain["SyncConfig"];
+ XmlOut outSync = outMain["Synchronize"];
writeConfig(mainCfg.syncCfg, outSync);
//###########################################################
- XmlOut outFilter = outMain["GlobalFilter"];
+ XmlOut outFilter = outMain["Filter"];
//write filter settings
writeConfig(mainCfg.globalFilter, outFilter);
@@ -1703,10 +1719,13 @@ void writeConfig(const MainConfiguration& mainCfg, XmlOut& out)
writeConfig(mainCfg.firstPair, outFp);
//write additional folder pairs
- for (const FolderPairEnh& fp : mainCfg.additionalPairs)
- writeConfig(fp, outFp);
+ for (const LocalPairConfig& lpc : mainCfg.additionalPairs)
+ writeConfig(lpc, outFp);
+
+ outMain["Errors"].attribute("Ignore", mainCfg.ignoreErrors);
+ outMain["Errors"].attribute("Retry", mainCfg.automaticRetryCount);
+ outMain["Errors"].attribute("Delay", mainCfg.automaticRetryDelay);
- outMain["IgnoreErrors"](mainCfg.ignoreErrors);
outMain["PostSyncCommand"](mainCfg.postSyncCommand);
outMain["PostSyncCommand"].attribute("Condition", mainCfg.postSyncCondition);
}
@@ -1717,7 +1736,7 @@ void writeConfig(const XmlGuiConfig& cfg, XmlOut& out)
writeConfig(cfg.mainCfg, out); //write main config
//write GUI specific config data
- XmlOut outGuiCfg = out["GuiConfig"];
+ XmlOut outGuiCfg = out["Gui"];
outGuiCfg["MiddleGridView"](cfg.highlightSyncAction ? "Action" : "Category"); //refactor into enum!?
}
@@ -1725,11 +1744,11 @@ void writeConfig(const XmlGuiConfig& cfg, XmlOut& out)
void writeConfig(const BatchExclusiveConfig& cfg, XmlOut& out)
{
- XmlOut outBatchCfg = out["BatchConfig"];
+ XmlOut outBatchCfg = out["Batch"];
outBatchCfg["ProgressDialog"].attribute("Minimized", cfg.runMinimized);
outBatchCfg["ProgressDialog"].attribute("AutoClose", cfg.autoCloseSummary);
- outBatchCfg["ErrorDialog" ](cfg.batchErrorDialog);
+ outBatchCfg["ErrorDialog" ](cfg.batchErrorDialog);
outBatchCfg["PostSyncAction"](cfg.postSyncAction);
outBatchCfg["LogfileFolder"](cfg.logFolderPathPhrase);
outBatchCfg["LogfileFolder"].attribute("Limit", cfg.logfilesCountLimit);
@@ -1752,8 +1771,6 @@ void writeConfig(const XmlGlobalSettings& cfg, XmlOut& out)
outGeneral["FailSafeFileCopy" ].attribute("Enabled", cfg.failSafeFileCopy);
outGeneral["CopyLockedFiles" ].attribute("Enabled", cfg.copyLockedFiles);
outGeneral["CopyFilePermissions" ].attribute("Enabled", cfg.copyFilePermissions);
- outGeneral["AutomaticRetry" ].attribute("Count", cfg.automaticRetryCount);
- outGeneral["AutomaticRetry" ].attribute("Delay", cfg.automaticRetryDelay);
outGeneral["FileTimeTolerance" ].attribute("Seconds", cfg.fileTimeTolerance);
outGeneral["FolderAccessTimeout" ].attribute("Seconds", cfg.folderAccessTimeout);
outGeneral["RunWithBackgroundPriority"].attribute("Enabled", cfg.runWithBackgroundPriority);
@@ -1762,7 +1779,7 @@ void writeConfig(const XmlGlobalSettings& cfg, XmlOut& out)
outGeneral["LastSyncsLogSizeMax" ].attribute("Bytes", cfg.lastSyncsLogFileSizeMax);
outGeneral["NotificationSound" ].attribute("CompareFinished", cfg.soundFileCompareFinished);
outGeneral["NotificationSound" ].attribute("SyncFinished", cfg.soundFileSyncFinished);
- outGeneral["ProgressDialog" ].attribute("AutoClose", cfg.autoCloseProgressDialog);
+ outGeneral["ProgressDialog" ].attribute("AutoClose", cfg.autoCloseProgressDialog);
XmlOut outOpt = outGeneral["OptionalDialogs"];
outOpt["ConfirmStartSync" ].attribute("Show", cfg.confirmDlgs.confirmSyncStart);
diff --git a/FreeFileSync/Source/lib/process_xml.h b/FreeFileSync/Source/lib/process_xml.h
index eeaf5c1b..13709ec6 100755
--- a/FreeFileSync/Source/lib/process_xml.h
+++ b/FreeFileSync/Source/lib/process_xml.h
@@ -183,8 +183,6 @@ struct XmlGlobalSettings
bool failSafeFileCopy = true;
bool copyLockedFiles = false; //safer default: avoid copies of partially written files
bool copyFilePermissions = false;
- size_t automaticRetryCount = 0;
- size_t automaticRetryDelay = 5; //unit: [sec]
int fileTimeTolerance = 2; //max. allowed file time deviation; < 0 means unlimited tolerance; default 2s: FAT vs NTFS
int folderAccessTimeout = 20; //unit: [s]; consider CD-ROM insert or hard disk spin up time from sleep
diff --git a/FreeFileSync/Source/lib/soft_filter.h b/FreeFileSync/Source/lib/soft_filter.h
index 95ff5a79..f0b7eec8 100755
--- a/FreeFileSync/Source/lib/soft_filter.h
+++ b/FreeFileSync/Source/lib/soft_filter.h
@@ -105,7 +105,7 @@ bool SoftFilter::isNull() const //filter is equivalent to NullFilter, but may be
return timeFrom_ == std::numeric_limits<time_t>::min() &&
sizeMin_ == 0U &&
sizeMax_ == std::numeric_limits<uint64_t>::max() &&
- matchesFolder_ == true;
+ matchesFolder_;
}
}
diff --git a/FreeFileSync/Source/lib/versioning.cpp b/FreeFileSync/Source/lib/versioning.cpp
index 6d8ea721..9033bea8 100755
--- a/FreeFileSync/Source/lib/versioning.cpp
+++ b/FreeFileSync/Source/lib/versioning.cpp
@@ -15,9 +15,10 @@ Zstring getDotExtension(const Zstring& relativePath) //including "." if extensio
};
}
+
bool fff::impl::isMatchingVersion(const Zstring& shortname, const Zstring& shortnameVersioned) //e.g. ("Sample.txt", "Sample.txt 2012-05-15 131513.txt")
{
- auto it = shortnameVersioned.begin();
+ auto it = shortnameVersioned.begin();
auto itLast = shortnameVersioned.end();
auto nextDigit = [&]() -> bool
diff --git a/FreeFileSync/Source/structures.cpp b/FreeFileSync/Source/structures.cpp
index 47552362..79c3029e 100755
--- a/FreeFileSync/Source/structures.cpp
+++ b/FreeFileSync/Source/structures.cpp
@@ -183,18 +183,18 @@ DirectionSet fff::getTwoWayUpdateSet()
}
-std::wstring MainConfiguration::getCompVariantName() const
+std::wstring fff::getCompVariantName(const MainConfiguration& mainCfg)
{
- const CompareVariant firstVariant = firstPair.altCmpConfig.get() ?
- firstPair.altCmpConfig->compareVar :
- cmpConfig.compareVar; //fallback to main sync cfg
+ const CompareVariant firstVariant = mainCfg.firstPair.localCmpCfg ?
+ mainCfg.firstPair.localCmpCfg->compareVar :
+ mainCfg.cmpConfig.compareVar; //fallback to main sync cfg
//test if there's a deviating variant within the additional folder pairs
- for (const FolderPairEnh& fp : additionalPairs)
+ for (const LocalPairConfig& lpc : mainCfg.additionalPairs)
{
- const CompareVariant thisVariant = fp.altCmpConfig.get() ?
- fp.altCmpConfig->compareVar :
- cmpConfig.compareVar; //fallback to main sync cfg
+ const CompareVariant thisVariant = lpc.localCmpCfg ?
+ lpc.localCmpCfg->compareVar :
+ mainCfg.cmpConfig.compareVar; //fallback to main sync cfg
if (thisVariant != firstVariant)
return _("Multiple...");
}
@@ -204,18 +204,18 @@ std::wstring MainConfiguration::getCompVariantName() const
}
-std::wstring MainConfiguration::getSyncVariantName() const
+std::wstring fff::getSyncVariantName(const MainConfiguration& mainCfg)
{
- const DirectionConfig::Variant firstVariant = firstPair.altSyncConfig.get() ?
- firstPair.altSyncConfig->directionCfg.var :
- syncCfg.directionCfg.var; //fallback to main sync cfg
+ const DirectionConfig::Variant firstVariant = mainCfg.firstPair.localSyncCfg ?
+ mainCfg.firstPair.localSyncCfg->directionCfg.var :
+ mainCfg.syncCfg.directionCfg.var; //fallback to main sync cfg
//test if there's a deviating variant within the additional folder pairs
- for (const FolderPairEnh& fp : additionalPairs)
+ for (const LocalPairConfig& lpc : mainCfg.additionalPairs)
{
- const DirectionConfig::Variant thisVariant = fp.altSyncConfig.get() ?
- fp.altSyncConfig->directionCfg.var :
- syncCfg.directionCfg.var;
+ const DirectionConfig::Variant thisVariant = lpc.localSyncCfg ?
+ lpc.localSyncCfg->directionCfg.var :
+ mainCfg.syncCfg.directionCfg.var;
if (thisVariant != firstVariant)
return _("Multiple...");
}
@@ -315,60 +315,54 @@ int daysSinceBeginOfWeek(int dayOfWeek) //0-6, 0=Monday, 6=Sunday
time_t resolve(size_t value, UnitTime unit, time_t defaultVal)
{
TimeComp tcLocal = getLocalTime();
- if (tcLocal == TimeComp())
- {
- assert(false);
- return defaultVal;
- }
-
- switch (unit)
- {
- case UnitTime::NONE:
- return defaultVal;
-
- case UnitTime::TODAY:
- tcLocal.second = 0; //0-61
- tcLocal.minute = 0; //0-59
- tcLocal.hour = 0; //0-23
- return localToTimeT(tcLocal); //convert local time back to UTC
-
- //case UnitTime::THIS_WEEK:
- //{
- // localTimeFmt->tm_sec = 0; //0-61
- // localTimeFmt->tm_min = 0; //0-59
- // localTimeFmt->tm_hour = 0; //0-23
- // const time_t timeFrom = ::mktime(localTimeFmt);
-
- // int dayOfWeek = (localTimeFmt->tm_wday + 6) % 7; //tm_wday := days since Sunday 0-6
- // // +6 == -1 in Z_7
-
- // return int64_t(timeFrom) - daysSinceBeginOfWeek(dayOfWeek) * 24 * 3600;
- //}
-
- case UnitTime::THIS_MONTH:
- tcLocal.second = 0; //0-61
- tcLocal.minute = 0; //0-59
- tcLocal.hour = 0; //0-23
- tcLocal.day = 1; //1-31
- return localToTimeT(tcLocal);
-
- case UnitTime::THIS_YEAR:
- tcLocal.second = 0; //0-61
- tcLocal.minute = 0; //0-59
- tcLocal.hour = 0; //0-23
- tcLocal.day = 1; //1-31
- tcLocal.month = 1; //1-12
- return localToTimeT(tcLocal);
-
- case UnitTime::LAST_X_DAYS:
- tcLocal.second = 0; //0-61
- tcLocal.minute = 0; //0-59
- tcLocal.hour = 0; //0-23
- return localToTimeT(tcLocal) - value * 24 * 3600;
- }
-
+ if (tcLocal != TimeComp())
+ switch (unit)
+ {
+ case UnitTime::NONE:
+ return defaultVal;
+
+ case UnitTime::TODAY:
+ tcLocal.second = 0; //0-61
+ tcLocal.minute = 0; //0-59
+ tcLocal.hour = 0; //0-23
+ return localToTimeT(tcLocal); //convert local time back to UTC
+
+ //case UnitTime::THIS_WEEK:
+ //{
+ // localTimeFmt->tm_sec = 0; //0-61
+ // localTimeFmt->tm_min = 0; //0-59
+ // localTimeFmt->tm_hour = 0; //0-23
+ // const time_t timeFrom = ::mktime(localTimeFmt);
+
+ // int dayOfWeek = (localTimeFmt->tm_wday + 6) % 7; //tm_wday := days since Sunday 0-6
+ // // +6 == -1 in Z_7
+
+ // return int64_t(timeFrom) - daysSinceBeginOfWeek(dayOfWeek) * 24 * 3600;
+ //}
+
+ case UnitTime::THIS_MONTH:
+ tcLocal.second = 0; //0-61
+ tcLocal.minute = 0; //0-59
+ tcLocal.hour = 0; //0-23
+ tcLocal.day = 1; //1-31
+ return localToTimeT(tcLocal);
+
+ case UnitTime::THIS_YEAR:
+ tcLocal.second = 0; //0-61
+ tcLocal.minute = 0; //0-59
+ tcLocal.hour = 0; //0-23
+ tcLocal.day = 1; //1-31
+ tcLocal.month = 1; //1-12
+ return localToTimeT(tcLocal);
+
+ case UnitTime::LAST_X_DAYS:
+ tcLocal.second = 0; //0-61
+ tcLocal.minute = 0; //0-59
+ tcLocal.hour = 0; //0-23
+ return localToTimeT(tcLocal) - value * 24 * 3600;
+ }
assert(false);
- return localToTimeT(tcLocal);
+ return defaultVal;
}
@@ -464,10 +458,10 @@ FilterConfig mergeFilterConfig(const FilterConfig& global, const FilterConfig& l
inline
-bool effectivelyEmpty(const FolderPairEnh& fp)
+bool effectivelyEmpty(const LocalPairConfig& lpc)
{
- return trimCpy(fp.folderPathPhraseLeft_ ).empty() &&
- trimCpy(fp.folderPathPhraseRight_).empty();
+ return trimCpy(lpc.folderPathPhraseLeft ).empty() &&
+ trimCpy(lpc.folderPathPhraseRight).empty();
}
}
@@ -482,33 +476,34 @@ MainConfiguration fff::merge(const std::vector<MainConfiguration>& mainCfgs)
return mainCfgs[0]; //
//merge folder pair config
- std::vector<FolderPairEnh> fpMerged;
+ std::vector<LocalPairConfig> mergedCfgs;
for (const MainConfiguration& mainCfg : mainCfgs)
{
- std::vector<FolderPairEnh> fpTmp;
+ std::vector<LocalPairConfig> tmpCfgs;
//skip empty folder pairs
if (!effectivelyEmpty(mainCfg.firstPair))
- fpTmp.push_back(mainCfg.firstPair);
- for (const FolderPairEnh& fp : mainCfg.additionalPairs)
- if (!effectivelyEmpty(fp))
- fpTmp.push_back(fp);
+ tmpCfgs.push_back(mainCfg.firstPair);
+
+ for (const LocalPairConfig& lpc : mainCfg.additionalPairs)
+ if (!effectivelyEmpty(lpc))
+ tmpCfgs.push_back(lpc);
//move all configuration down to item level
- for (FolderPairEnh& fp : fpTmp)
+ for (LocalPairConfig& lpc : tmpCfgs)
{
- if (!fp.altCmpConfig.get())
- fp.altCmpConfig = std::make_shared<CompConfig>(mainCfg.cmpConfig);
+ if (!lpc.localCmpCfg)
+ lpc.localCmpCfg = mainCfg.cmpConfig;
- if (!fp.altSyncConfig.get())
- fp.altSyncConfig = std::make_shared<SyncConfig>(mainCfg.syncCfg);
+ if (!lpc.localSyncCfg)
+ lpc.localSyncCfg = mainCfg.syncCfg;
- fp.localFilter = mergeFilterConfig(mainCfg.globalFilter, fp.localFilter);
+ lpc.localFilter = mergeFilterConfig(mainCfg.globalFilter, lpc.localFilter);
}
- append(fpMerged, fpTmp);
+ append(mergedCfgs, tmpCfgs);
}
- if (fpMerged.empty())
+ if (mergedCfgs.empty())
return MainConfiguration();
//optimization: remove redundant configuration
@@ -517,11 +512,11 @@ MainConfiguration fff::merge(const std::vector<MainConfiguration>& mainCfgs)
//find out which comparison and synchronization setting are used most often and use them as new "header"
std::vector<std::pair<CompConfig, int>> cmpCfgStat;
std::vector<std::pair<SyncConfig, int>> syncCfgStat;
- for (const FolderPairEnh& fp : fpMerged)
+ for (const LocalPairConfig& lpc : mergedCfgs)
{
//a rather inefficient algorithm, but it does not require a less-than operator:
{
- const CompConfig& cmpCfg = *fp.altCmpConfig;
+ const CompConfig& cmpCfg = *lpc.localCmpCfg;
auto it = std::find_if(cmpCfgStat.begin(), cmpCfgStat.end(),
[&](const std::pair<CompConfig, int>& entry) { return effectivelyEqual(entry.first, cmpCfg); });
@@ -531,7 +526,7 @@ MainConfiguration fff::merge(const std::vector<MainConfiguration>& mainCfgs)
++(it->second);
}
{
- const SyncConfig& syncCfg = *fp.altSyncConfig;
+ const SyncConfig& syncCfg = *lpc.localSyncCfg;
auto it = std::find_if(syncCfgStat.begin(), syncCfgStat.end(),
[&](const std::pair<SyncConfig, int>& entry) { return effectivelyEqual(entry.first, syncCfg); });
@@ -553,24 +548,24 @@ MainConfiguration fff::merge(const std::vector<MainConfiguration>& mainCfgs)
//########################################################################################################################
FilterConfig globalFilter;
- const bool allFiltersEqual = std::all_of(fpMerged.begin(), fpMerged.end(), [&](const FolderPairEnh& fp) { return fp.localFilter == fpMerged[0].localFilter; });
+ const bool allFiltersEqual = std::all_of(mergedCfgs.begin(), mergedCfgs.end(), [&](const LocalPairConfig& lpc) { return lpc.localFilter == mergedCfgs[0].localFilter; });
if (allFiltersEqual)
- globalFilter = fpMerged[0].localFilter;
+ globalFilter = mergedCfgs[0].localFilter;
//strip redundancy...
- for (FolderPairEnh& fp : fpMerged)
+ for (LocalPairConfig& lpc : mergedCfgs)
{
//if local config matches output global config we don't need local one
- if (fp.altCmpConfig &&
- effectivelyEqual(*fp.altCmpConfig, cmpCfgHead))
- fp.altCmpConfig.reset();
+ if (lpc.localCmpCfg &&
+ effectivelyEqual(*lpc.localCmpCfg, cmpCfgHead))
+ lpc.localCmpCfg = NoValue();
- if (fp.altSyncConfig &&
- effectivelyEqual(*fp.altSyncConfig, syncCfgHead))
- fp.altSyncConfig.reset();
+ if (lpc.localSyncCfg &&
+ effectivelyEqual(*lpc.localSyncCfg, syncCfgHead))
+ lpc.localSyncCfg = NoValue();
if (allFiltersEqual) //use global filter in this case
- fp.localFilter = FilterConfig();
+ lpc.localFilter = FilterConfig();
}
//final assembly
@@ -578,9 +573,16 @@ MainConfiguration fff::merge(const std::vector<MainConfiguration>& mainCfgs)
cfgOut.cmpConfig = cmpCfgHead;
cfgOut.syncCfg = syncCfgHead;
cfgOut.globalFilter = globalFilter;
- cfgOut.firstPair = fpMerged[0];
- cfgOut.additionalPairs.assign(fpMerged.begin() + 1, fpMerged.end());
+ cfgOut.firstPair = mergedCfgs[0];
+ cfgOut.additionalPairs.assign(mergedCfgs.begin() + 1, mergedCfgs.end());
cfgOut.ignoreErrors = std::all_of(mainCfgs.begin(), mainCfgs.end(), [](const MainConfiguration& mainCfg) { return mainCfg.ignoreErrors; });
+
+ cfgOut.automaticRetryCount = std::max_element(mainCfgs.begin(), mainCfgs.end(),
+ [](const MainConfiguration& lhs, const MainConfiguration& rhs) { return lhs.automaticRetryCount < rhs.automaticRetryCount; })->automaticRetryCount;
+
+ cfgOut.automaticRetryDelay = std::max_element(mainCfgs.begin(), mainCfgs.end(),
+ [](const MainConfiguration& lhs, const MainConfiguration& rhs) { return lhs.automaticRetryDelay < rhs.automaticRetryDelay; })->automaticRetryDelay;
+
//cfgOut.postSyncCommand = mainCfgs[0].postSyncCommand; -> better leave at default ... !?
//cfgOut.postSyncCondition = mainCfgs[0].postSyncCondition; ->
return cfgOut;
diff --git a/FreeFileSync/Source/structures.h b/FreeFileSync/Source/structures.h
index 4f9b6a65..298eda76 100755
--- a/FreeFileSync/Source/structures.h
+++ b/FreeFileSync/Source/structures.h
@@ -10,6 +10,7 @@
#include <vector>
#include <memory>
#include <zen/zstring.h>
+#include <zen/optional.h>
namespace fff
@@ -324,46 +325,40 @@ void resolveUnits(size_t timeSpan, UnitTime unitTimeSpan,
uint64_t& sizeMaxBy); //unit: bytes
-struct FolderPairEnh //enhanced folder pairs with (optional) alternate configuration
+struct LocalPairConfig //enhanced folder pairs with (optional) alternate configuration
{
- FolderPairEnh() {}
-
- FolderPairEnh(const Zstring& folderPathPhraseLeft,
- const Zstring& folderPathPhraseRight,
- const std::shared_ptr<const CompConfig>& cmpConfig,
- const std::shared_ptr<const SyncConfig>& syncConfig,
- const FilterConfig& filter) :
- folderPathPhraseLeft_ (folderPathPhraseLeft),
- folderPathPhraseRight_(folderPathPhraseRight),
- altCmpConfig(cmpConfig),
- altSyncConfig(syncConfig),
+ LocalPairConfig() {}
+
+ LocalPairConfig(const Zstring& phraseLeft,
+ const Zstring& phraseRight,
+ const zen::Opt<CompConfig>& cmpConfig,
+ const zen::Opt<SyncConfig>& syncConfig,
+ const FilterConfig& filter) :
+ folderPathPhraseLeft (phraseLeft),
+ folderPathPhraseRight(phraseRight),
+ localCmpCfg(cmpConfig),
+ localSyncCfg(syncConfig),
localFilter(filter) {}
- Zstring folderPathPhraseLeft_; //unresolved directory names as entered by user!
- Zstring folderPathPhraseRight_; //
+ Zstring folderPathPhraseLeft; //unresolved directory names as entered by user!
+ Zstring folderPathPhraseRight; //
- std::shared_ptr<const CompConfig> altCmpConfig; //optional
- std::shared_ptr<const SyncConfig> altSyncConfig; //
- FilterConfig localFilter;
+ zen::Opt<CompConfig> localCmpCfg;
+ zen::Opt<SyncConfig> localSyncCfg;
+ FilterConfig localFilter;
};
inline
-bool operator==(const FolderPairEnh& lhs, const FolderPairEnh& rhs)
+bool operator==(const LocalPairConfig& lhs, const LocalPairConfig& rhs)
{
- return lhs.folderPathPhraseLeft_ == rhs.folderPathPhraseLeft_ &&
- lhs.folderPathPhraseRight_ == rhs.folderPathPhraseRight_ &&
-
- (lhs.altCmpConfig.get() && rhs.altCmpConfig.get() ?
- *lhs.altCmpConfig == *rhs.altCmpConfig :
- lhs.altCmpConfig.get() == rhs.altCmpConfig.get()) &&
-
- (lhs.altSyncConfig.get() && rhs.altSyncConfig.get() ?
- *lhs.altSyncConfig == *rhs.altSyncConfig :
- lhs.altSyncConfig.get() == rhs.altSyncConfig.get()) &&
-
- lhs.localFilter == rhs.localFilter;
+ return lhs.folderPathPhraseLeft == rhs.folderPathPhraseLeft &&
+ lhs.folderPathPhraseRight == rhs.folderPathPhraseRight &&
+ lhs.localCmpCfg == rhs.localCmpCfg &&
+ lhs.localSyncCfg == rhs.localSyncCfg &&
+ lhs.localFilter == rhs.localFilter;
}
+inline bool operator!=(const LocalPairConfig& lhs, const LocalPairConfig& rhs) { return !(lhs == rhs); }
enum class PostSyncCondition
@@ -380,30 +375,34 @@ struct MainConfiguration
SyncConfig syncCfg; //global synchronisation settings: may be overwritten by folder pair settings
FilterConfig globalFilter; //global filter settings: combined with folder pair settings
- FolderPairEnh firstPair; //there needs to be at least one pair!
- std::vector<FolderPairEnh> additionalPairs;
+ LocalPairConfig firstPair; //there needs to be at least one pair!
+ std::vector<LocalPairConfig> additionalPairs;
bool ignoreErrors = false; //true: errors will still be logged
+ size_t automaticRetryCount = 0;
+ size_t automaticRetryDelay = 5; //unit: [sec]
Zstring postSyncCommand; //user-defined command line
PostSyncCondition postSyncCondition = PostSyncCondition::COMPLETION;
-
- std::wstring getCompVariantName() const;
- std::wstring getSyncVariantName() const;
};
+std::wstring getCompVariantName(const MainConfiguration& mainCfg);
+std::wstring getSyncVariantName(const MainConfiguration& mainCfg);
+
inline
bool operator==(const MainConfiguration& lhs, const MainConfiguration& rhs)
{
- return lhs.cmpConfig == rhs.cmpConfig &&
- lhs.syncCfg == rhs.syncCfg &&
- lhs.globalFilter == rhs.globalFilter &&
- lhs.firstPair == rhs.firstPair &&
- lhs.additionalPairs == rhs.additionalPairs &&
- lhs.ignoreErrors == rhs.ignoreErrors &&
- lhs.postSyncCommand == rhs.postSyncCommand &&
- lhs.postSyncCondition == rhs.postSyncCondition;
+ return lhs.cmpConfig == rhs.cmpConfig &&
+ lhs.syncCfg == rhs.syncCfg &&
+ lhs.globalFilter == rhs.globalFilter &&
+ lhs.firstPair == rhs.firstPair &&
+ lhs.additionalPairs == rhs.additionalPairs &&
+ lhs.ignoreErrors == rhs.ignoreErrors &&
+ lhs.automaticRetryCount == rhs.automaticRetryCount &&
+ lhs.automaticRetryDelay == rhs.automaticRetryDelay &&
+ lhs.postSyncCommand == rhs.postSyncCommand &&
+ lhs.postSyncCondition == rhs.postSyncCondition;
}
diff --git a/FreeFileSync/Source/synchronization.cpp b/FreeFileSync/Source/synchronization.cpp
index b7a51fe5..a4d064d7 100755
--- a/FreeFileSync/Source/synchronization.cpp
+++ b/FreeFileSync/Source/synchronization.cpp
@@ -248,15 +248,15 @@ void SyncStatistics::processFolder(const FolderPair& folder)
std::vector<FolderPairSyncCfg> fff::extractSyncCfg(const MainConfiguration& mainCfg)
{
//merge first and additional pairs
- std::vector<FolderPairEnh> allPairs = { mainCfg.firstPair };
- append(allPairs, mainCfg.additionalPairs);
+ std::vector<LocalPairConfig> localCfgs = { mainCfg.firstPair };
+ append(localCfgs, mainCfg.additionalPairs);
std::vector<FolderPairSyncCfg> output;
//process all pairs
- for (const FolderPairEnh& fp : allPairs)
+ for (const LocalPairConfig& lpc : localCfgs)
{
- SyncConfig syncCfg = fp.altSyncConfig.get() ? *fp.altSyncConfig : mainCfg.syncCfg;
+ SyncConfig syncCfg = lpc.localSyncCfg ? *lpc.localSyncCfg : mainCfg.syncCfg;
output.push_back(
FolderPairSyncCfg(syncCfg.directionCfg.var == DirectionConfig::TWO_WAY || detectMovedFilesEnabled(syncCfg.directionCfg),
diff --git a/FreeFileSync/Source/ui/batch_config.cpp b/FreeFileSync/Source/ui/batch_config.cpp
index 0e4ff689..fe647828 100755
--- a/FreeFileSync/Source/ui/batch_config.cpp
+++ b/FreeFileSync/Source/ui/batch_config.cpp
@@ -75,9 +75,12 @@ BatchDialog::BatchDialog(wxWindow* parent, BatchDialogConfig& dlgCfg) :
{
setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonSaveAs).setCancel(m_buttonCancel));
- m_staticTextDescr->SetLabel(replaceCpy(m_staticTextDescr->GetLabel(), L"%x", L"FreeFileSync.exe <" + _("job name") + L">.ffs_batch"));
+ m_staticTextHeader->SetLabel(replaceCpy(m_staticTextHeader->GetLabel(), L"%x", L"FreeFileSync.exe <" + _("job name") + L">.ffs_batch"));
+ m_staticTextHeader->Wrap(fastFromDIP(520));
- m_bitmapBatchJob->SetBitmap(getResourceImage(L"batch"));
+ m_spinCtrlLogfileLimit->SetMinSize(wxSize(fastFromDIP(70), -1)); //Hack: set size (why does wxWindow::Size() not work?)
+
+ m_bitmapBatchJob->SetBitmap(getResourceImage(L"file_batch"));
logfileDir_ = std::make_unique<FolderSelector>(*m_panelLogfile, *m_buttonSelectLogFolder, *m_bpButtonSelectAltLogFolder, *m_logFolderPath, nullptr /*staticText*/, nullptr /*wxWindow*/);
@@ -90,7 +93,7 @@ BatchDialog::BatchDialog(wxWindow* parent, BatchDialogConfig& dlgCfg) :
setConfig(dlgCfg);
- //enable dialog-specific key local events
+ //enable dialog-specific key events
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(BatchDialog::onLocalKeyEvent), nullptr, this);
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
@@ -105,7 +108,7 @@ void BatchDialog::updateGui() //re-evaluate gui after config changes
{
const BatchDialogConfig dlgCfg = getConfig(); //resolve parameter ownership: some on GUI controls, others member variables
- m_bitmapIgnoreErrors->SetBitmap(getResourceImage(dlgCfg.ignoreErrors ? L"msg_error_medium_ignored" : L"msg_error_medium"));
+ m_bitmapIgnoreErrors->SetBitmap(dlgCfg.ignoreErrors ? getResourceImage(L"error_ignore_active") : greyScale(getResourceImage(L"error_ignore_inactive")));
m_radioBtnErrorDialogShow ->Enable(!dlgCfg.ignoreErrors);
m_radioBtnErrorDialogCancel->Enable(!dlgCfg.ignoreErrors);
diff --git a/FreeFileSync/Source/ui/batch_status_handler.cpp b/FreeFileSync/Source/ui/batch_status_handler.cpp
index be007e09..6d49ac08 100755
--- a/FreeFileSync/Source/ui/batch_status_handler.cpp
+++ b/FreeFileSync/Source/ui/batch_status_handler.cpp
@@ -166,7 +166,7 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress,
automaticRetryCount_(automaticRetryCount),
automaticRetryDelay_(automaticRetryDelay),
progressDlg_(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, nullptr /*parentWindow*/, showProgress, autoCloseDialog,
-jobName, soundFileSyncComplete, ignoreErrors, [&]
+jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, [&]
{
switch (postSyncAction)
{
@@ -235,7 +235,7 @@ BatchStatusHandler::~BatchStatusHandler()
getBytesTotal(PHASE_SYNCHRONIZING) == 0)
finalStatusMsg = _("Nothing to synchronize"); //even if "ignored conflicts" occurred!
else
- finalStatusMsg = _("Completed");
+ finalStatusMsg = _("Completed successfully");
errorLog_.logMsg(finalStatusMsg, MSG_TYPE_INFO);
}
diff --git a/FreeFileSync/Source/ui/cfg_grid.cpp b/FreeFileSync/Source/ui/cfg_grid.cpp
index 775a3f16..f6af408f 100755
--- a/FreeFileSync/Source/ui/cfg_grid.cpp
+++ b/FreeFileSync/Source/ui/cfg_grid.cpp
@@ -236,8 +236,8 @@ private:
switch (static_cast<ColumnTypeCfg>(colType))
{
case ColumnTypeCfg::NAME:
- rectTmp.x += COLUMN_GAP_LEFT;
- rectTmp.width -= COLUMN_GAP_LEFT;
+ rectTmp.x += getColumnGapLeft();
+ rectTmp.width -= getColumnGapLeft();
switch (item->cfgType)
{
@@ -250,8 +250,8 @@ private:
drawBitmapRtlNoMirror(dc, enabled ? batchIconSmall_ : batchIconSmall_.ConvertToDisabled(), rectTmp, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
break;
}
- rectTmp.x += fileIconSize_ + COLUMN_GAP_LEFT;
- rectTmp.width -= fileIconSize_ + COLUMN_GAP_LEFT;
+ rectTmp.x += fileIconSize_ + getColumnGapLeft();
+ rectTmp.width -= fileIconSize_ + getColumnGapLeft();
drawCellText(dc, rectTmp, getValue(row, colType));
break;
@@ -276,10 +276,10 @@ private:
switch (static_cast<ColumnTypeCfg>(colType))
{
case ColumnTypeCfg::NAME:
- return COLUMN_GAP_LEFT + fileIconSize_ + COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth() + COLUMN_GAP_LEFT;
+ return getColumnGapLeft() + fileIconSize_ + getColumnGapLeft() + dc.GetTextExtent(getValue(row, colType)).GetWidth() + getColumnGapLeft();
case ColumnTypeCfg::LAST_SYNC:
- return COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth() + COLUMN_GAP_LEFT;
+ return getColumnGapLeft() + dc.GetTextExtent(getValue(row, colType)).GetWidth() + getColumnGapLeft();
}
return 0;
}
@@ -297,14 +297,14 @@ private:
wxRect rectInside = drawColumnLabelBorder(dc, rect);
drawColumnLabelBackground(dc, rectInside, highlighted);
- rectInside.x += COLUMN_GAP_LEFT;
- rectInside.width -= COLUMN_GAP_LEFT;
+ rectInside.x += getColumnGapLeft();
+ rectInside.width -= getColumnGapLeft();
drawColumnLabelText(dc, rectInside, getColumnLabel(colType));
auto sortInfo = cfgView_.getSortDirection();
if (colType == static_cast<ColumnType>(sortInfo.first))
{
- const wxBitmap& marker = getResourceImage(sortInfo.second ? L"sortAscending" : L"sortDescending");
+ const wxBitmap& marker = getResourceImage(sortInfo.second ? L"sort_ascending" : L"sort_descending");
drawBitmapRtlNoMirror(dc, marker, rectInside, wxALIGN_CENTER_HORIZONTAL);
}
}
@@ -325,23 +325,27 @@ private:
ConfigView cfgView_;
int syncOverdueDays_ = 0;
const int fileIconSize_;
- const wxBitmap syncIconSmall_ = getResourceImage(L"sync" ).ConvertToImage().Scale(fileIconSize_, fileIconSize_, wxIMAGE_QUALITY_BILINEAR); //looks sharper than wxIMAGE_QUALITY_HIGH!
- const wxBitmap batchIconSmall_ = getResourceImage(L"batch").ConvertToImage().Scale(fileIconSize_, fileIconSize_, wxIMAGE_QUALITY_BILINEAR);
+ const wxBitmap syncIconSmall_ = getResourceImage(L"file_sync" ).ConvertToImage().Scale(fileIconSize_, fileIconSize_, wxIMAGE_QUALITY_BILINEAR); //looks sharper than wxIMAGE_QUALITY_HIGH!
+ const wxBitmap batchIconSmall_ = getResourceImage(L"file_batch").ConvertToImage().Scale(fileIconSize_, fileIconSize_, wxIMAGE_QUALITY_BILINEAR);
};
}
void cfggrid::init(Grid& grid)
{
- const int rowHeight = GridDataCfg::getRowDefaultHeight(grid);
+ const int rowHeight = GridDataCfg::getRowDefaultHeight(grid);
- auto prov = std::make_shared<GridDataCfg>(rowHeight /*fileIconSize*/);
+ int fileIconSize = rowHeight - fastFromDIP(2); /*border*/
+ if (fileIconSize < 16) //no border for very small icons
+ fileIconSize = rowHeight;
+
+ auto prov = std::make_shared<GridDataCfg>(fileIconSize);
grid.setDataProvider(prov);
grid.showRowLabel(false);
grid.setRowHeight(rowHeight);
- grid.setColumnLabelHeight(rowHeight + 2);
+ grid.setColumnLabelHeight(rowHeight + fastFromDIP(2));
}
diff --git a/FreeFileSync/Source/ui/cfg_grid.h b/FreeFileSync/Source/ui/cfg_grid.h
index 7633d3c2..d0d02442 100755
--- a/FreeFileSync/Source/ui/cfg_grid.h
+++ b/FreeFileSync/Source/ui/cfg_grid.h
@@ -9,6 +9,7 @@
#include <wx+/grid.h>
#include <zen/zstring.h>
+#include <wx+/dc.h>
namespace fff
@@ -31,10 +32,11 @@ struct ColAttributesCfg
inline
std::vector<ColAttributesCfg> getCfgGridDefaultColAttribs()
{
+ using namespace zen;
return
{
- { ColumnTypeCfg::NAME, -75, 1, true },
- { ColumnTypeCfg::LAST_SYNC, 75, 0, true },
+ { ColumnTypeCfg::NAME, fastFromDIP(-75), 1, true },
+ { ColumnTypeCfg::LAST_SYNC, fastFromDIP( 75), 0, true },
};
}
diff --git a/FreeFileSync/Source/ui/command_box.cpp b/FreeFileSync/Source/ui/command_box.cpp
index 3468415a..81a0aa6f 100755
--- a/FreeFileSync/Source/ui/command_box.cpp
+++ b/FreeFileSync/Source/ui/command_box.cpp
@@ -10,6 +10,7 @@
#include <algorithm>
#include <zen/stl_tools.h>
#include <zen/utf.h>
+#include <wx+/dc.h>
using namespace zen;
using namespace fff;
@@ -48,7 +49,7 @@ CommandBox::CommandBox(wxWindow* parent,
defaultCommands_(getDefaultCommands())
{
//####################################
- /*#*/ SetMinSize(wxSize(150, -1)); //# workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox
+ /*#*/ SetMinSize(wxSize(fastFromDIP(150), -1)); //# workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox
//####################################
Connect(wxEVT_KEY_DOWN, wxKeyEventHandler (CommandBox::OnKeyEvent ), nullptr, this);
diff --git a/FreeFileSync/Source/ui/file_grid.cpp b/FreeFileSync/Source/ui/file_grid.cpp
index 7e704ba1..7ff66729 100755
--- a/FreeFileSync/Source/ui/file_grid.cpp
+++ b/FreeFileSync/Source/ui/file_grid.cpp
@@ -42,6 +42,7 @@ inline wxColor getColorNotActive() { return { 228, 228, 228 }; } //light grey
inline wxColor getColorGridLine () { return { 192, 192, 192 }; } //light grey
const size_t ROW_COUNT_IF_NO_DATA = 0;
+const int FILE_GRID_GAP_SIZE_DIP = 2;
/*
class hierarchy:
@@ -197,7 +198,7 @@ public:
void setIconManager(const std::shared_ptr<IconManager>& iconMgr) { iconMgr_ = iconMgr; }
- void setItemPathForm(ItemPathFormat fmt) { itemPathFormat = fmt; }
+ void setItemPathForm(ItemPathFormat fmt) { itemPathFormat_ = fmt; }
void getUnbufferedIconsForPreload(std::vector<std::pair<ptrdiff_t, AbstractPath>>& newLoad) //return (priority, filepath) list
{
@@ -256,15 +257,15 @@ public:
}
private:
- bool isFailedLoad(size_t row) const { return row < failedLoads.size() ? failedLoads[row] != 0 : false; }
+ bool isFailedLoad(size_t row) const { return row < failedLoads_.size() ? failedLoads_[row] != 0 : false; }
void setFailedLoad(size_t row, bool failed = true)
{
- if (failedLoads.size() != refGrid().getRowCount())
- failedLoads.resize(refGrid().getRowCount());
+ if (failedLoads_.size() != refGrid().getRowCount())
+ failedLoads_.resize(refGrid().getRowCount());
- if (row < failedLoads.size())
- failedLoads[row] = failed;
+ if (row < failedLoads_.size())
+ failedLoads_[row] = failed;
}
//icon buffer will load reversely, i.e. if we want to go from inside out, we need to start from outside in
@@ -280,7 +281,7 @@ protected:
if (enabled)
{
if (selected)
- dc.GradientFillLinear(rect, Grid::getColorSelectionGradientFrom(), Grid::getColorSelectionGradientTo(), wxEAST);
+ dc.GradientFillLinear(rect, getColorSelectionGradientFrom(), getColorSelectionGradientTo(), wxEAST);
//ignore focus
else
{
@@ -371,7 +372,7 @@ private:
switch (colTypeRim)
{
case ColumnTypeRim::ITEM_PATH:
- switch (itemPathFormat)
+ switch (itemPathFormat_)
{
case ItemPathFormat::FULL_PATH:
return AFS::getDisplayPath(folder.getAbstractPath<side>());
@@ -403,7 +404,7 @@ private:
switch (colTypeRim)
{
case ColumnTypeRim::ITEM_PATH:
- switch (itemPathFormat)
+ switch (itemPathFormat_)
{
case ItemPathFormat::FULL_PATH:
return AFS::getDisplayPath(file.getAbstractPath<side>());
@@ -436,7 +437,7 @@ private:
switch (colTypeRim)
{
case ColumnTypeRim::ITEM_PATH:
- switch (itemPathFormat)
+ switch (itemPathFormat_)
{
case ItemPathFormat::FULL_PATH:
return AFS::getDisplayPath(symlink.getAbstractPath<side>());
@@ -463,8 +464,6 @@ private:
return std::wstring();
}
- static const int GAP_SIZE = 2;
-
void renderCell(wxDC& dc, const wxRect& rect, size_t row, ColumnType colType, bool enabled, bool selected, HoverArea rowHover) override
{
//don't forget to harmonize with getBestSize()!!!
@@ -486,8 +485,8 @@ private:
auto drawTextBlock = [&](const std::wstring& text)
{
- rectTmp.x += GAP_SIZE;
- rectTmp.width -= GAP_SIZE;
+ rectTmp.x += gridGap_;
+ rectTmp.width -= gridGap_;
const wxSize extent = drawCellText(dc, rectTmp, text, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
rectTmp.x += extent.GetWidth();
rectTmp.width -= extent.GetWidth();
@@ -524,8 +523,8 @@ private:
drawTextBlock(pathPrefix);
//draw file icon
- rectTmp.x += GAP_SIZE;
- rectTmp.width -= GAP_SIZE;
+ rectTmp.x += gridGap_;
+ rectTmp.width -= gridGap_;
const int iconSize = iconMgr_->refIconBuffer().getSize();
if (rectTmp.GetWidth() >= iconSize)
@@ -592,7 +591,7 @@ private:
case ColumnTypeRim::SIZE:
if (refGrid().GetLayoutDirection() != wxLayout_RightToLeft)
{
- rectTmp.width -= GAP_SIZE; //have file size right-justified (but don't change for RTL languages)
+ rectTmp.width -= gridGap_; //have file size right-justified (but don't change for RTL languages)
drawCellText(dc, rectTmp, cellValue, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
}
else
@@ -632,14 +631,14 @@ private:
int bestSize = 0;
if (!pathPrefix.empty())
- bestSize += GAP_SIZE + dc.GetTextExtent(pathPrefix).GetWidth();
+ bestSize += gridGap_ + dc.GetTextExtent(pathPrefix).GetWidth();
- bestSize += GAP_SIZE + iconMgr_->refIconBuffer().getSize();
- bestSize += GAP_SIZE + dc.GetTextExtent(itemName).GetWidth() + GAP_SIZE;
+ bestSize += gridGap_ + iconMgr_->refIconBuffer().getSize();
+ bestSize += gridGap_ + dc.GetTextExtent(itemName).GetWidth() + gridGap_;
return bestSize;
}
else
- return GAP_SIZE + dc.GetTextExtent(cellValue).GetWidth() + GAP_SIZE;
+ return gridGap_ + dc.GetTextExtent(cellValue).GetWidth() + gridGap_;
// + 1 pix for cell border line ? -> not used anymore!
}
@@ -648,7 +647,7 @@ private:
switch (static_cast<ColumnTypeRim>(colType))
{
case ColumnTypeRim::ITEM_PATH:
- switch (itemPathFormat)
+ switch (itemPathFormat_)
{
case ItemPathFormat::FULL_PATH:
return _("Full path");
@@ -675,8 +674,8 @@ private:
wxRect rectInside = drawColumnLabelBorder(dc, rect);
drawColumnLabelBackground(dc, rectInside, highlighted);
- rectInside.x += COLUMN_GAP_LEFT;
- rectInside.width -= COLUMN_GAP_LEFT;
+ rectInside.x += getColumnGapLeft();
+ rectInside.width -= getColumnGapLeft();
drawColumnLabelText(dc, rectInside, getColumnLabel(colType));
//draw sort marker
@@ -687,7 +686,7 @@ private:
{
if (colType == static_cast<ColumnType>(sortInfo->type) && (side == LEFT_SIDE) == sortInfo->onLeft)
{
- const wxBitmap& marker = getResourceImage(sortInfo->ascending ? L"sortAscending" : L"sortDescending");
+ const wxBitmap& marker = getResourceImage(sortInfo->ascending ? L"sort_ascending" : L"sort_descending");
drawBitmapRtlNoMirror(dc, marker, rectInside, wxALIGN_CENTER_HORIZONTAL);
}
}
@@ -765,11 +764,13 @@ private:
return toolTip;
}
+ const int gridGap_ = fastFromDIP(FILE_GRID_GAP_SIZE_DIP);
+
std::shared_ptr<IconManager> iconMgr_; //optional
- ItemPathFormat itemPathFormat = ItemPathFormat::FULL_PATH;
+ ItemPathFormat itemPathFormat_ = ItemPathFormat::FULL_PATH;
- std::vector<char> failedLoads; //effectively a vector<bool> of size "number of rows"
- Opt<wxBitmap> renderBuf; //avoid costs of recreating this temporary variable
+ std::vector<char> failedLoads_; //effectively a vector<bool> of size "number of rows"
+ Opt<wxBitmap> renderBuf_; //avoid costs of recreating this temporary variable
};
@@ -826,7 +827,7 @@ private:
{
wxRect rectTmp = rect;
rectTmp.width /= 20;
- dc.GradientFillLinear(rectTmp, Grid::getColorSelectionGradientFrom(), GridDataRim<LEFT_SIDE>::getBackGroundColor(row), wxEAST);
+ dc.GradientFillLinear(rectTmp, getColorSelectionGradientFrom(), GridDataRim<LEFT_SIDE>::getBackGroundColor(row), wxEAST);
}
}
}
@@ -956,7 +957,7 @@ private:
if (enabled)
{
if (selected)
- dc.GradientFillLinear(rect, Grid::getColorSelectionGradientFrom(), Grid::getColorSelectionGradientTo(), wxEAST);
+ dc.GradientFillLinear(rect, getColorSelectionGradientFrom(), getColorSelectionGradientTo(), wxEAST);
else
{
if (const FileSystemObject* fsObj = getRawData(row))
@@ -1111,7 +1112,7 @@ private:
wxRect rectInside = drawColumnLabelBorder(dc, rect);
drawColumnLabelBackground(dc, rectInside, highlighted);
- const wxBitmap& cmpIcon = getResourceImage(L"compare_small");
+ const wxBitmap& cmpIcon = getResourceImage(L"compare_sicon");
drawBitmapRtlNoMirror(dc, highlightSyncAction_ ? greyScale(cmpIcon) : cmpIcon, rectInside, wxALIGN_CENTER);
}
break;
@@ -1121,7 +1122,7 @@ private:
wxRect rectInside = drawColumnLabelBorder(dc, rect);
drawColumnLabelBackground(dc, rectInside, highlighted);
- const wxBitmap& syncIcon = getResourceImage(L"sync_small");
+ const wxBitmap& syncIcon = getResourceImage(L"file_sync_sicon");
drawBitmapRtlNoMirror(dc, highlightSyncAction_ ? syncIcon : greyScale(syncIcon), rectInside, wxALIGN_CENTER);
}
break;
@@ -1590,9 +1591,9 @@ void filegrid::init(Grid& gridLeft, Grid& gridCenter, Grid& gridRight)
//gridLeft .showScrollBars(Grid::SB_SHOW_AUTOMATIC, Grid::SB_SHOW_NEVER); -> redundant: configuration happens in GridEventManager::onAlignScrollBars()
//gridCenter.showScrollBars(Grid::SB_SHOW_NEVER, Grid::SB_SHOW_NEVER);
- const int widthCheckbox = getResourceImage(L"checkbox_true").GetWidth() + 4 + getResourceImage(L"notch").GetWidth();
- const int widthCategory = 30;
- const int widthAction = 45;
+ const int widthCheckbox = getResourceImage(L"checkbox_true").GetWidth() + fastFromDIP(3);
+ const int widthCategory = 2 * getResourceImage(L"cat_left_only_small").GetWidth() + getResourceImage(L"notch").GetWidth();
+ const int widthAction = 3 * getResourceImage(L"so_create_left_sicon").GetWidth();
gridCenter.SetSize(widthCategory + widthCheckbox + widthAction, -1);
gridCenter.setColumnConfig(
@@ -1688,7 +1689,7 @@ void filegrid::setupIcons(Grid& gridLeft, Grid& gridCenter, Grid& gridRight, boo
iconHeight = IconBuffer::getSize(IconBuffer::SIZE_SMALL);
}
- const int newRowHeight = std::max(iconHeight, gridLeft.getMainWin().GetCharHeight()) + 1; //add some space
+ const int newRowHeight = std::max(iconHeight, gridLeft.getMainWin().GetCharHeight()) + fastFromDIP(1); //add some space
gridLeft .setRowHeight(newRowHeight);
gridCenter.setRowHeight(newRowHeight);
@@ -1758,31 +1759,31 @@ wxBitmap fff::getSyncOpImage(SyncOperation syncOp)
switch (syncOp) //evaluate comparison result and sync direction
{
case SO_CREATE_NEW_LEFT:
- return getResourceImage(L"so_create_left_small");
+ return getResourceImage(L"so_create_left_sicon");
case SO_CREATE_NEW_RIGHT:
- return getResourceImage(L"so_create_right_small");
+ return getResourceImage(L"so_create_right_sicon");
case SO_DELETE_LEFT:
- return getResourceImage(L"so_delete_left_small");
+ return getResourceImage(L"so_delete_left_sicon");
case SO_DELETE_RIGHT:
- return getResourceImage(L"so_delete_right_small");
+ return getResourceImage(L"so_delete_right_sicon");
case SO_MOVE_LEFT_FROM:
- return getResourceImage(L"so_move_left_source_small");
+ return getResourceImage(L"so_move_left_source_sicon");
case SO_MOVE_LEFT_TO:
- return getResourceImage(L"so_move_left_target_small");
+ return getResourceImage(L"so_move_left_target_sicon");
case SO_MOVE_RIGHT_FROM:
- return getResourceImage(L"so_move_right_source_small");
+ return getResourceImage(L"so_move_right_source_sicon");
case SO_MOVE_RIGHT_TO:
- return getResourceImage(L"so_move_right_target_small");
+ return getResourceImage(L"so_move_right_target_sicon");
case SO_OVERWRITE_LEFT:
- return getResourceImage(L"so_update_left_small");
+ return getResourceImage(L"so_update_left_sicon");
case SO_OVERWRITE_RIGHT:
- return getResourceImage(L"so_update_right_small");
+ return getResourceImage(L"so_update_right_sicon");
case SO_COPY_METADATA_TO_LEFT:
- return getResourceImage(L"so_move_left_small");
+ return getResourceImage(L"so_move_left_sicon");
case SO_COPY_METADATA_TO_RIGHT:
- return getResourceImage(L"so_move_right_small");
+ return getResourceImage(L"so_move_right_sicon");
case SO_DO_NOTHING:
- return getResourceImage(L"so_none_small");
+ return getResourceImage(L"so_none_sicon");
case SO_EQUAL:
return getResourceImage(L"cat_equal_small");
case SO_UNRESOLVED_CONFLICT:
diff --git a/FreeFileSync/Source/ui/file_grid_attr.h b/FreeFileSync/Source/ui/file_grid_attr.h
index ea3c6303..ea5f1b54 100755
--- a/FreeFileSync/Source/ui/file_grid_attr.h
+++ b/FreeFileSync/Source/ui/file_grid_attr.h
@@ -9,6 +9,7 @@
#include <vector>
#include <cassert>
+#include <wx+/dc.h>
namespace fff
@@ -32,12 +33,13 @@ struct ColAttributesRim
inline
std::vector<ColAttributesRim> getFileGridDefaultColAttribsLeft()
{
+ using namespace zen;
return //harmonize with main_dlg.cpp::onGridLabelContextRim() => expects stretched ITEM_PATH and non-stretched other columns!
{
- { ColumnTypeRim::ITEM_PATH, -100, 1, true },
- { ColumnTypeRim::EXTENSION, 60, 0, false },
- { ColumnTypeRim::DATE, 140, 0, false },
- { ColumnTypeRim::SIZE, 100, 0, true },
+ { ColumnTypeRim::ITEM_PATH, fastFromDIP(-100), 1, true },
+ { ColumnTypeRim::EXTENSION, fastFromDIP( 60), 0, false },
+ { ColumnTypeRim::DATE, fastFromDIP( 140), 0, false },
+ { ColumnTypeRim::SIZE, fastFromDIP( 100), 0, true },
};
}
diff --git a/FreeFileSync/Source/ui/file_view.cpp b/FreeFileSync/Source/ui/file_view.cpp
index c68357b0..19a77f8c 100755
--- a/FreeFileSync/Source/ui/file_view.cpp
+++ b/FreeFileSync/Source/ui/file_view.cpp
@@ -64,7 +64,7 @@ void FileView::updateView(Predicate pred)
if (pred(*fsObj))
{
//save row position for direct random access to FilePair or FolderPair
- this->rowPositions_.emplace(ref.objId, viewRef_.size()); //costs: 0.28 s per call - MSVC based on std::set
+ this->rowPositions_.emplace(ref.objId, viewRef_.size()); //costs: 0.28 µs per call - MSVC based on std::set
//"this->" required by two-pass lookup as enforced by GCC 4.7
//save row position to identify first child *on sorted subview* of FolderPair or BaseFolderPair in case latter are filtered out
diff --git a/FreeFileSync/Source/ui/folder_history_box.cpp b/FreeFileSync/Source/ui/folder_history_box.cpp
index fc4902d9..57a2a5fd 100755
--- a/FreeFileSync/Source/ui/folder_history_box.cpp
+++ b/FreeFileSync/Source/ui/folder_history_box.cpp
@@ -7,6 +7,7 @@
#include "folder_history_box.h"
#include <list>
#include <zen/scope_guard.h>
+#include <wx+/dc.h>
#include "../lib/resolve_path.h"
#include <gtk/gtk.h>
@@ -27,7 +28,7 @@ FolderHistoryBox::FolderHistoryBox(wxWindow* parent,
wxComboBox(parent, id, value, pos, size, n, choices, style, validator, name)
{
//#####################################
- /*##*/ SetMinSize(wxSize(150, -1)); //## workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox
+ /*##*/ SetMinSize(wxSize(fastFromDIP(150), -1)); //## workaround yet another wxWidgets bug: default minimum size is much too large for a wxComboBox
//#####################################
Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(FolderHistoryBox::OnKeyEvent), nullptr, this);
diff --git a/FreeFileSync/Source/ui/folder_pair.h b/FreeFileSync/Source/ui/folder_pair.h
index 5b71c09a..640907fa 100755
--- a/FreeFileSync/Source/ui/folder_pair.h
+++ b/FreeFileSync/Source/ui/folder_pair.h
@@ -28,29 +28,26 @@ template <class GuiPanel>
class FolderPairPanelBasic : private wxEvtHandler
{
public:
- using AltCompCfgPtr = std::shared_ptr<const CompConfig>;
- using AltSyncCfgPtr = std::shared_ptr<const SyncConfig>;
-
- void setConfig(AltCompCfgPtr compConfig, AltSyncCfgPtr syncCfg, const FilterConfig& filter)
+ void setConfig(const zen::Opt<CompConfig>& compConfig, const zen::Opt<SyncConfig>& syncCfg, const FilterConfig& filter)
{
- altCompConfig_ = compConfig;
- altSyncConfig_ = syncCfg;
- localFilter_ = filter;
+ localCmpCfg_ = compConfig;
+ localSyncCfg_ = syncCfg;
+ localFilter_ = filter;
refreshButtons();
}
- AltCompCfgPtr getAltCompConfig () const { return altCompConfig_; }
- AltSyncCfgPtr getAltSyncConfig () const { return altSyncConfig_; }
- FilterConfig getAltFilterConfig() const { return localFilter_; }
+ zen::Opt<CompConfig> getCompConfig () const { return localCmpCfg_; }
+ zen::Opt<SyncConfig> getSyncConfig () const { return localSyncCfg_; }
+ FilterConfig getFilterConfig() const { return localFilter_; }
FolderPairPanelBasic(GuiPanel& basicPanel) : //takes reference on basic panel to be enhanced
basicPanel_(basicPanel)
{
//register events for removal of alternate configuration
- basicPanel_.m_bpButtonAltCompCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnAltCompCfgContext ), nullptr, this);
- basicPanel_.m_bpButtonAltSyncCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfgContext ), nullptr, this);
- basicPanel_.m_bpButtonLocalFilter->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgContext), nullptr, this);
+ basicPanel_.m_bpButtonLocalCompCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalCompCfgContext ), nullptr, this);
+ basicPanel_.m_bpButtonLocalSyncCfg ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalSyncCfgContext ), nullptr, this);
+ basicPanel_.m_bpButtonLocalFilter ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfgContext), nullptr, this);
basicPanel_.m_bpButtonRemovePair->SetBitmapLabel(zen::getResourceImage(L"item_remove"));
}
@@ -60,65 +57,65 @@ private:
{
using namespace zen;
- if (altCompConfig_.get())
+ if (localCmpCfg_)
{
- setImage(*basicPanel_.m_bpButtonAltCompCfg, getResourceImage(L"cfg_compare_small"));
- basicPanel_.m_bpButtonAltCompCfg->SetToolTip(_("Local comparison settings") + L" (" + getVariantName(altCompConfig_->compareVar) + L")");
+ setImage(*basicPanel_.m_bpButtonLocalCompCfg, getResourceImage(L"cfg_compare_small"));
+ basicPanel_.m_bpButtonLocalCompCfg->SetToolTip(_("Local comparison settings") + L" (" + getVariantName(localCmpCfg_->compareVar) + L")");
}
else
{
- setImage(*basicPanel_.m_bpButtonAltCompCfg, greyScale(getResourceImage(L"cfg_compare_small")));
- basicPanel_.m_bpButtonAltCompCfg->SetToolTip(_("Local comparison settings"));
+ setImage(*basicPanel_.m_bpButtonLocalCompCfg, greyScale(getResourceImage(L"cfg_compare_small")));
+ basicPanel_.m_bpButtonLocalCompCfg->SetToolTip(_("Local comparison settings"));
}
- if (altSyncConfig_.get())
+ if (localSyncCfg_)
{
- setImage(*basicPanel_.m_bpButtonAltSyncCfg, getResourceImage(L"cfg_sync_small"));
- basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(_("Local synchronization settings") + L" (" + getVariantName(altSyncConfig_->directionCfg.var) + L")");
+ setImage(*basicPanel_.m_bpButtonLocalSyncCfg, getResourceImage(L"cfg_sync_small"));
+ basicPanel_.m_bpButtonLocalSyncCfg->SetToolTip(_("Local synchronization settings") + L" (" + getVariantName(localSyncCfg_->directionCfg.var) + L")");
}
else
{
- setImage(*basicPanel_.m_bpButtonAltSyncCfg, greyScale(getResourceImage(L"cfg_sync_small")));
- basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(_("Local synchronization settings"));
+ setImage(*basicPanel_.m_bpButtonLocalSyncCfg, greyScale(getResourceImage(L"cfg_sync_small")));
+ basicPanel_.m_bpButtonLocalSyncCfg->SetToolTip(_("Local synchronization settings"));
}
if (!isNullFilter(localFilter_))
{
- setImage(*basicPanel_.m_bpButtonLocalFilter, getResourceImage(L"filter_small"));
+ setImage(*basicPanel_.m_bpButtonLocalFilter, getResourceImage(L"cfg_filter_small"));
basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("Local filter") + L" (" + _("Active") + L")");
}
else
{
- setImage(*basicPanel_.m_bpButtonLocalFilter, greyScale(getResourceImage(L"filter_small")));
+ setImage(*basicPanel_.m_bpButtonLocalFilter, greyScale(getResourceImage(L"cfg_filter_small")));
basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("Local filter") + L" (" + _("None") + L")");
}
}
- void OnAltCompCfgContext(wxCommandEvent& event)
+ void OnLocalCompCfgContext(wxCommandEvent& event)
{
- auto removeAltCompCfg = [&]
+ auto removeLocalCompCfg = [&]
{
- this->altCompConfig_.reset(); //"this->" galore: workaround GCC compiler bugs
+ this->localCmpCfg_ = zen::NoValue(); //"this->" galore: workaround GCC compiler bugs
this->refreshButtons();
- this->onAltCompCfgChange();
+ this->onLocalCompCfgChange();
};
zen::ContextMenu menu;
- menu.addItem(_("Remove local settings"), removeAltCompCfg, nullptr, altCompConfig_.get() != nullptr);
+ menu.addItem(_("Remove local settings"), removeLocalCompCfg, nullptr, static_cast<bool>(localCmpCfg_));
menu.popup(basicPanel_);
}
- void OnAltSyncCfgContext(wxCommandEvent& event)
+ void OnLocalSyncCfgContext(wxCommandEvent& event)
{
- auto removeAltSyncCfg = [&]
+ auto removeLocalSyncCfg = [&]
{
- this->altSyncConfig_.reset();
+ this->localSyncCfg_ = zen::NoValue();
this->refreshButtons();
- this->onAltSyncCfgChange();
+ this->onLocalSyncCfgChange();
};
zen::ContextMenu menu;
- menu.addItem(_("Remove local settings"), removeAltSyncCfg, nullptr, altSyncConfig_.get() != nullptr);
+ menu.addItem(_("Remove local settings"), removeLocalSyncCfg, nullptr, static_cast<bool>(localSyncCfg_));
menu.popup(basicPanel_);
}
@@ -157,16 +154,16 @@ private:
virtual wxWindow* getParentWindow() = 0;
virtual std::unique_ptr<FilterConfig>& getFilterCfgOnClipboardRef() = 0;
- virtual void onAltCompCfgChange() = 0;
- virtual void onAltSyncCfgChange() = 0;
+ virtual void onLocalCompCfgChange () = 0;
+ virtual void onLocalSyncCfgChange () = 0;
virtual void onLocalFilterCfgChange() = 0;
GuiPanel& basicPanel_; //panel to be enhanced by this template
//alternate configuration attached to it
- AltCompCfgPtr altCompConfig_; //optional
- AltSyncCfgPtr altSyncConfig_; //
- FilterConfig localFilter_;
+ zen::Opt<CompConfig> localCmpCfg_;
+ zen::Opt<SyncConfig> localSyncCfg_;
+ FilterConfig localFilter_;
};
}
diff --git a/FreeFileSync/Source/ui/folder_selector.cpp b/FreeFileSync/Source/ui/folder_selector.cpp
index eed43dc6..ac501107 100755
--- a/FreeFileSync/Source/ui/folder_selector.cpp
+++ b/FreeFileSync/Source/ui/folder_selector.cpp
@@ -27,6 +27,9 @@ using namespace fff;
namespace
{
+const std::chrono::milliseconds FOLDER_SELECTED_EXISTENCE_CHECK_TIME_MAX(200);
+
+
void setFolderPathPhrase(const Zstring& folderPathPhrase, FolderHistoryBox* comboBox, wxWindow& tooltipWnd, wxStaticText* staticText) //pointers are optional
{
if (comboBox)
@@ -104,7 +107,7 @@ FolderSelector::~FolderSelector()
void FolderSelector::onMouseWheel(wxMouseEvent& event)
{
- //for combobox: although switching through available items is wxWidgets default, this is NOT windows default, e.g. explorer
+ //for combobox: although switching through available items is wxWidgets default, this is NOT windows default, e.g. Explorer
//additionally this will delete manual entries, although all the users wanted is scroll the parent window!
//redirect to parent scrolled window!
@@ -181,7 +184,7 @@ void FolderSelector::onSelectFolder(wxCommandEvent& event)
}
catch (FileError&) { return false; }
});
- return ft.wait_for(std::chrono::milliseconds(200)) == std::future_status::ready && ft.get(); //potentially slow network access: wait 200ms at most
+ return ft.wait_for(FOLDER_SELECTED_EXISTENCE_CHECK_TIME_MAX) == std::future_status::ready && ft.get(); //potentially slow network access: wait 200ms at most
};
const Zstring folderPathPhrase = getPath();
diff --git a/FreeFileSync/Source/ui/gui_generated.cpp b/FreeFileSync/Source/ui/gui_generated.cpp
index 747095d1..47843381 100755
--- a/FreeFileSync/Source/ui/gui_generated.cpp
+++ b/FreeFileSync/Source/ui/gui_generated.cpp
@@ -5,14 +5,6 @@
// PLEASE DO *NOT* EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
-#include "command_box.h"
-#include "folder_history_box.h"
-#include "triple_splitter.h"
-#include "wx+/bitmap_button.h"
-#include "wx+/graph.h"
-#include "wx+/grid.h"
-#include "wx+/toggle_button.h"
-
#include "gui_generated.h"
///////////////////////////////////////////////////////////////////////////
@@ -167,7 +159,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
bSizer198->Add( m_bpButtonCmpConfig, 1, wxEXPAND, 5 );
- m_bpButtonCmpContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 17, -1 ), wxBU_AUTODRAW );
+ m_bpButtonCmpContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonCmpContext->SetToolTip( _("dummy") );
bSizer198->Add( m_bpButtonCmpContext, 0, wxEXPAND, 5 );
@@ -184,10 +176,12 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer199;
bSizer199 = new wxBoxSizer( wxHORIZONTAL );
- m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 60, -1 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
+ m_bpButtonFilter = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
+ m_bpButtonFilter->SetToolTip( _("dummy") );
+
bSizer199->Add( m_bpButtonFilter, 1, wxEXPAND, 5 );
- m_bpButtonFilterContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 17, -1 ), wxBU_AUTODRAW );
+ m_bpButtonFilterContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonFilterContext->SetToolTip( _("dummy") );
bSizer199->Add( m_bpButtonFilterContext, 0, wxEXPAND, 5 );
@@ -209,7 +203,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
bSizer200->Add( m_bpButtonSyncConfig, 1, wxEXPAND, 5 );
- m_bpButtonSyncContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 17, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSyncContext = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSyncContext->SetToolTip( _("dummy") );
bSizer200->Add( m_bpButtonSyncContext, 0, wxEXPAND, 5 );
@@ -264,18 +258,18 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer159;
bSizer159 = new wxBoxSizer( wxHORIZONTAL );
- m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW );
+ m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonAddPair->SetToolTip( _("Add folder pair") );
- bSizer159->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer159->Add( m_bpButtonAddPair, 0, wxEXPAND, 5 );
- m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW );
+ m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
- bSizer159->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer159->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 );
- fgSizer8->Add( bSizer159, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ fgSizer8->Add( bSizer159, 0, wxEXPAND, 5 );
wxBoxSizer* bSizer182;
bSizer182 = new wxBoxSizer( wxHORIZONTAL );
@@ -286,9 +280,9 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_buttonSelectFolderLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") );
- bSizer182->Add( m_buttonSelectFolderLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer182->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 );
- m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") );
bSizer182->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 );
@@ -300,15 +294,12 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_panelTopLeft->SetSizer( fgSizer8 );
m_panelTopLeft->Layout();
fgSizer8->Fit( m_panelTopLeft );
- bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_BOTTOM, 5 );
m_panelTopCenter = 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_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSwapSides->SetToolTip( _("Swap sides") );
@@ -317,26 +308,29 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer160;
bSizer160 = new wxBoxSizer( wxHORIZONTAL );
- m_bpButtonAltCompCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW );
- bSizer160->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bpButtonLocalCompCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalCompCfg->SetToolTip( _("dummy") );
+
+ bSizer160->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 );
- m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW );
- bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalFilter->SetToolTip( _("dummy") );
- m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW );
- bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer160->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 );
+ m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panelTopCenter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") );
- bSizer1771->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer160->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 5 );
- bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 );
+ bSizer1771->Add( bSizer160, 1, wxALIGN_CENTER_HORIZONTAL, 5 );
m_panelTopCenter->SetSizer( bSizer1771 );
m_panelTopCenter->Layout();
bSizer1771->Fit( m_panelTopCenter );
- bSizer91->Add( m_panelTopCenter, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
+ bSizer91->Add( m_panelTopCenter, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_panelTopRight->SetMinSize( wxSize( 1, -1 ) );
@@ -357,9 +351,9 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_buttonSelectFolderRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
m_buttonSelectFolderRight->SetToolTip( _("Select a folder") );
- bSizer179->Add( m_buttonSelectFolderRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer179->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 );
- m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelTopRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") );
bSizer179->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 );
@@ -371,7 +365,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_panelTopRight->SetSizer( bSizer183 );
m_panelTopRight->Layout();
bSizer183->Fit( m_panelTopRight );
- bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+ bSizer91->Add( m_panelTopRight, 1, wxRIGHT|wxALIGN_BOTTOM, 5 );
bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 );
@@ -586,16 +580,16 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer1713;
bSizer1713 = new wxBoxSizer( wxHORIZONTAL );
- m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW );
+ m_bpButtonHideSearch = new wxBitmapButton( m_panelSearch, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonHideSearch->SetToolTip( _("Close search bar") );
- bSizer1713->Add( m_bpButtonHideSearch, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+ bSizer1713->Add( m_bpButtonHideSearch, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 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 ), wxTE_PROCESS_ENTER|wxWANTS_CHARS );
+ m_textCtrlSearchTxt = new wxTextCtrl( m_panelSearch, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_PROCESS_ENTER|wxWANTS_CHARS );
bSizer1713->Add( m_textCtrlSearchTxt, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
m_checkBoxMatchCase = new wxCheckBox( m_panelSearch, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -615,7 +609,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer17611;
bSizer17611 = new wxBoxSizer( wxVERTICAL );
- m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonNew = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonNew->SetToolTip( _("dummy") );
bSizer17611->Add( m_bpButtonNew, 0, wxEXPAND, 5 );
@@ -630,7 +624,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer1761;
bSizer1761 = new wxBoxSizer( wxVERTICAL );
- m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonOpen->SetToolTip( _("dummy") );
bSizer1761->Add( m_bpButtonOpen, 0, wxEXPAND, 5 );
@@ -645,7 +639,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer175;
bSizer175 = new wxBoxSizer( wxVERTICAL );
- m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSave->SetToolTip( _("dummy") );
bSizer175->Add( m_bpButtonSave, 0, wxEXPAND, 5 );
@@ -663,12 +657,12 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer1772;
bSizer1772 = new wxBoxSizer( wxHORIZONTAL );
- m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonSaveAs = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSaveAs->SetToolTip( _("dummy") );
bSizer1772->Add( m_bpButtonSaveAs, 1, 0, 5 );
- m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonSaveAsBatch = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSaveAsBatch->SetToolTip( _("dummy") );
bSizer1772->Add( m_bpButtonSaveAsBatch, 1, 0, 5 );
@@ -703,10 +697,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_staticTextViewType->Wrap( -1 );
bSizerViewFilter->Add( m_staticTextViewType, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonViewTypeSyncAction = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 82, 42 ), wxBU_AUTODRAW );
+ m_bpButtonViewTypeSyncAction = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
- m_bpButtonShowExcluded = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowExcluded = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowExcluded, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
@@ -716,46 +710,46 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_staticTextSelectView->Wrap( -1 );
bSizerViewFilter->Add( m_staticTextSelectView, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowDeleteLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowDeleteLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowUpdateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowUpdateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowCreateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowCreateLeft = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowLeftOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowLeftOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowLeftNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowLeftNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowEqual = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowEqual = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowDoNothing = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowDoNothing = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowDifferent = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowDifferent = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowRightNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowRightNewer = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowRightOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowRightOnly = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowCreateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowCreateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowUpdateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowUpdateRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowDeleteRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowDeleteRight = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonShowConflict = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42, 42 ), wxBU_AUTODRAW );
+ m_bpButtonShowConflict = new zen::ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
@@ -968,6 +962,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
this->SetSizer( bSizerPanelHolder );
this->Layout();
+ bSizerPanelHolder->Fit( this );
// Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) );
@@ -1007,9 +1002,9 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
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_bpButtonAltCompCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalCompCfg ), NULL, this );
+ m_bpButtonLocalCompCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalCompCfg ), NULL, this );
m_bpButtonLocalFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalFilterCfg ), NULL, this );
- m_bpButtonAltSyncCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalSyncCfg ), NULL, this );
+ m_bpButtonLocalSyncCfg->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnTopLocalSyncCfg ), 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 );
@@ -1054,6 +1049,106 @@ MainDialogGenerated::~MainDialogGenerated()
{
}
+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( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonFolderPairOptions->SetToolTip( _("Arrange folder pair") );
+
+ bSizer134->Add( m_bpButtonFolderPairOptions, 0, wxEXPAND, 5 );
+
+ m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") );
+
+ bSizer134->Add( m_bpButtonRemovePair, 0, wxEXPAND, 5 );
+
+ m_folderPathLeft = new fff::FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer134->Add( m_folderPathLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectFolderLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") );
+
+ bSizer134->Add( m_buttonSelectFolderLeft, 0, wxEXPAND, 5 );
+
+ m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") );
+
+ bSizer134->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 );
+
+
+ m_panelLeft->SetSizer( bSizer134 );
+ m_panelLeft->Layout();
+ bSizer134->Fit( m_panelLeft );
+ bSizer74->Add( m_panelLeft, 0, wxLEFT|wxEXPAND, 5 );
+
+ m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer95;
+ bSizer95 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bpButtonLocalCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalCompCfg->SetToolTip( _("dummy") );
+
+ bSizer95->Add( m_bpButtonLocalCompCfg, 0, wxEXPAND, 5 );
+
+ m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalFilter->SetToolTip( _("dummy") );
+
+ bSizer95->Add( m_bpButtonLocalFilter, 0, wxEXPAND, 5 );
+
+ m_bpButtonLocalSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonLocalSyncCfg->SetToolTip( _("dummy") );
+
+ bSizer95->Add( m_bpButtonLocalSyncCfg, 0, wxEXPAND, 5 );
+
+
+ m_panel20->SetSizer( bSizer95 );
+ m_panel20->Layout();
+ bSizer95->Fit( m_panel20 );
+ bSizer74->Add( m_panel20, 0, 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_folderPathRight = new fff::FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer135->Add( m_folderPathRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_buttonSelectFolderRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectFolderRight->SetToolTip( _("Select a folder") );
+
+ bSizer135->Add( m_buttonSelectFolderRight, 0, wxEXPAND, 5 );
+
+ m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") );
+
+ bSizer135->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 );
+
+
+ m_panelRight->SetSizer( bSizer135 );
+ m_panelRight->Layout();
+ bSizer135->Fit( m_panelRight );
+ bSizer74->Add( m_panelRight, 1, wxRIGHT|wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer74 );
+ this->Layout();
+ bSizer74->Fit( this );
+}
+
+FolderPairPanelGenerated::~FolderPairPanelGenerated()
+{
+}
+
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 );
@@ -1079,30 +1174,30 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer190->Add( bSizer1911, 0, wxEXPAND|wxLEFT, 5 );
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 ) );
+ m_panelCompSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelCompSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer275;
bSizer275 = new wxBoxSizer( wxVERTICAL );
bSizerHeaderCompSettings = new wxBoxSizer( wxVERTICAL );
- m_staticTextMainCompSettings = new wxStaticText( m_panelCompSettingsHolder, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextMainCompSettings = new wxStaticText( m_panelCompSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextMainCompSettings->Wrap( -1 );
bSizerHeaderCompSettings->Add( m_staticTextMainCompSettings, 0, wxALL, 10 );
- m_checkBoxUseLocalCmpOptions = new wxCheckBox( m_panelCompSettingsHolder, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxUseLocalCmpOptions = new wxCheckBox( m_panelCompSettingsTab, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
m_checkBoxUseLocalCmpOptions->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizerHeaderCompSettings->Add( m_checkBoxUseLocalCmpOptions, 0, wxALL|wxEXPAND, 10 );
- m_staticlineCompHeader = new wxStaticLine( m_panelCompSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ m_staticlineCompHeader = new wxStaticLine( m_panelCompSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizerHeaderCompSettings->Add( m_staticlineCompHeader, 0, wxEXPAND, 5 );
bSizer275->Add( bSizerHeaderCompSettings, 0, wxEXPAND, 5 );
- m_panelComparisonSettings = new wxPanel( m_panelCompSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelComparisonSettings = new wxPanel( m_panelCompSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_panelComparisonSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer159;
@@ -1121,17 +1216,17 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer2381;
bSizer2381 = new wxBoxSizer( wxVERTICAL );
- m_toggleBtnByTimeSize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1, 30 ), 0 );
+ m_toggleBtnByTimeSize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_toggleBtnByTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
bSizer2381->Add( m_toggleBtnByTimeSize, 0, wxEXPAND|wxBOTTOM, 5 );
- m_toggleBtnByContent = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1, 30 ), 0 );
+ m_toggleBtnByContent = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_toggleBtnByContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
bSizer2381->Add( m_toggleBtnByContent, 0, wxEXPAND|wxBOTTOM, 5 );
- m_toggleBtnBySize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File size"), wxDefaultPosition, wxSize( -1, 30 ), 0 );
+ m_toggleBtnBySize = new wxToggleButton( m_panelComparisonSettings, wxID_ANY, _("File size"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_toggleBtnBySize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
bSizer2381->Add( m_toggleBtnBySize, 0, wxEXPAND, 5 );
@@ -1249,33 +1344,33 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
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 ) );
+ m_panelCompSettingsTab->SetSizer( bSizer275 );
+ m_panelCompSettingsTab->Layout();
+ bSizer275->Fit( m_panelCompSettingsTab );
+ m_notebook->AddPage( m_panelCompSettingsTab, _("dummy"), false );
+ m_panelFilterSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelFilterSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer278;
bSizer278 = new wxBoxSizer( wxVERTICAL );
bSizerHeaderFilterSettings = new wxBoxSizer( wxVERTICAL );
- m_staticTextMainFilterSettings = new wxStaticText( m_panelFilterSettingsHolder, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextMainFilterSettings = new wxStaticText( m_panelFilterSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextMainFilterSettings->Wrap( -1 );
bSizerHeaderFilterSettings->Add( m_staticTextMainFilterSettings, 0, wxALL, 10 );
- m_staticTextLocalFilterSettings = new wxStaticText( m_panelFilterSettingsHolder, wxID_ANY, _("Local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextLocalFilterSettings = new wxStaticText( m_panelFilterSettingsTab, wxID_ANY, _("Local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextLocalFilterSettings->Wrap( -1 );
bSizerHeaderFilterSettings->Add( m_staticTextLocalFilterSettings, 0, wxALL, 10 );
- m_staticlineFilterHeader = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ m_staticlineFilterHeader = new wxStaticLine( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizerHeaderFilterSettings->Add( m_staticlineFilterHeader, 0, wxEXPAND, 5 );
bSizer278->Add( bSizerHeaderFilterSettings, 0, wxEXPAND, 5 );
- m_panelFilterSettings = new wxPanel( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelFilterSettings = new wxPanel( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_panelFilterSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer1591;
@@ -1290,7 +1385,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer1661;
bSizer1661 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmapInclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, 30 ), 0 );
+ m_bitmapInclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
wxBoxSizer* bSizer1731;
@@ -1301,15 +1396,13 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
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, wxEXPAND|wxTOP, 5 );
bSizer1661->Add( bSizer1731, 1, wxEXPAND, 5 );
- bSizer166->Add( bSizer1661, 1, wxEXPAND|wxLEFT, 5 );
+ bSizer166->Add( bSizer1661, 3, wxEXPAND|wxLEFT, 5 );
m_staticline22 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizer166->Add( m_staticline22, 0, wxEXPAND, 5 );
@@ -1320,7 +1413,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer1651;
bSizer1651 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmapExclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, 30 ), 0 );
+ m_bitmapExclude = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
wxBoxSizer* bSizer1742;
@@ -1349,7 +1442,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer1651->Add( bSizer1742, 1, wxEXPAND, 5 );
- bSizer166->Add( bSizer1651, 2, wxEXPAND|wxLEFT, 5 );
+ bSizer166->Add( bSizer1651, 5, wxEXPAND|wxLEFT, 5 );
bSizer1591->Add( bSizer166, 1, wxEXPAND, 5 );
@@ -1363,7 +1456,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer167;
bSizer167 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmapFilterDate = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34, 34 ), 0 );
+ m_bitmapFilterDate = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
wxBoxSizer* bSizer165;
@@ -1385,7 +1478,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
- bSizer160->Add( bSizer167, 0, wxEXPAND|wxALL, 5 );
+ bSizer160->Add( bSizer167, 1, wxEXPAND|wxALL, 5 );
m_staticline23 = new wxStaticLine( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 );
@@ -1393,7 +1486,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer168;
bSizer168 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmapFilterSize = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32, 32 ), 0 );
+ m_bitmapFilterSize = new wxStaticBitmap( m_panelFilterSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
wxBoxSizer* bSizer158;
@@ -1443,7 +1536,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
- bSizer160->Add( bSizer168, 1, wxEXPAND|wxALL, 5 );
+ bSizer160->Add( bSizer168, 0, wxEXPAND|wxALL, 5 );
bSizer1591->Add( bSizer160, 0, wxEXPAND, 5 );
@@ -1454,55 +1547,55 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer1591->Fit( m_panelFilterSettings );
bSizer278->Add( m_panelFilterSettings, 1, wxEXPAND, 5 );
- m_staticline62 = new wxStaticLine( m_panelFilterSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ m_staticline62 = new wxStaticLine( m_panelFilterSettingsTab, 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 );
+ m_staticTextFilterDescr = new wxStaticText( m_panelFilterSettingsTab, 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_staticTextFilterDescr->Wrap( -1 );
+ bSizer280->Add( m_staticTextFilterDescr, 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 );
+ m_staticline46 = new wxStaticLine( m_panelFilterSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
bSizer280->Add( m_staticline46, 0, wxEXPAND, 5 );
- m_buttonClear = new wxButton( m_panelFilterSettingsHolder, wxID_ANY, _("C&lear"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_buttonClear = new wxButton( m_panelFilterSettingsTab, wxID_ANY, _("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 ) );
+ m_panelFilterSettingsTab->SetSizer( bSizer278 );
+ m_panelFilterSettingsTab->Layout();
+ bSizer278->Fit( m_panelFilterSettingsTab );
+ m_notebook->AddPage( m_panelFilterSettingsTab, _("dummy"), false );
+ m_panelSyncSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelSyncSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer276;
bSizer276 = new wxBoxSizer( wxVERTICAL );
bSizerHeaderSyncSettings = new wxBoxSizer( wxVERTICAL );
- m_staticTextMainSyncSettings = new wxStaticText( m_panelSyncSettingsHolder, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextMainSyncSettings = new wxStaticText( m_panelSyncSettingsTab, wxID_ANY, _("Main settings:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextMainSyncSettings->Wrap( -1 );
bSizerHeaderSyncSettings->Add( m_staticTextMainSyncSettings, 0, wxALL, 10 );
- m_checkBoxUseLocalSyncOptions = new wxCheckBox( m_panelSyncSettingsHolder, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxUseLocalSyncOptions = new wxCheckBox( m_panelSyncSettingsTab, wxID_ANY, _("Use local settings:"), wxDefaultPosition, wxDefaultSize, 0 );
bSizerHeaderSyncSettings->Add( m_checkBoxUseLocalSyncOptions, 0, wxALL|wxEXPAND, 10 );
- m_staticlineSyncHeader = new wxStaticLine( m_panelSyncSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ m_staticlineSyncHeader = new wxStaticLine( m_panelSyncSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
bSizerHeaderSyncSettings->Add( m_staticlineSyncHeader, 0, wxEXPAND, 5 );
bSizer276->Add( bSizerHeaderSyncSettings, 0, wxEXPAND, 5 );
- m_panelSyncSettings = new wxPanel( m_panelSyncSettingsHolder, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelSyncSettings = new wxPanel( m_panelSyncSettingsTab, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_panelSyncSettings->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer232;
@@ -1521,22 +1614,22 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer236;
bSizer236 = new wxBoxSizer( wxVERTICAL );
- m_toggleBtnTwoWay = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, 30 ), 0 );
+ m_toggleBtnTwoWay = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_toggleBtnTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
bSizer236->Add( m_toggleBtnTwoWay, 0, wxBOTTOM|wxEXPAND, 5 );
- m_toggleBtnMirror = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, 30 ), 0 );
+ m_toggleBtnMirror = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
bSizer236->Add( m_toggleBtnMirror, 0, wxEXPAND|wxBOTTOM, 5 );
- m_toggleBtnUpdate = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, 30 ), 0 );
+ m_toggleBtnUpdate = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
bSizer236->Add( m_toggleBtnUpdate, 0, wxEXPAND|wxBOTTOM, 5 );
- m_toggleBtnCustom = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, 30 ), 0 );
+ m_toggleBtnCustom = new wxToggleButton( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
bSizer236->Add( m_toggleBtnCustom, 0, wxEXPAND, 5 );
@@ -1556,64 +1649,64 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer238->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizer233 = new wxBoxSizer( wxHORIZONTAL );
+ bSizerSyncDirHolder = new wxBoxSizer( wxHORIZONTAL );
bSizerSyncDirections = new wxBoxSizer( wxVERTICAL );
- m_staticText119 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText119->Wrap( -1 );
- bSizerSyncDirections->Add( m_staticText119, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ m_staticTextCategory = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCategory->Wrap( -1 );
+ bSizerSyncDirections->Add( m_staticTextCategory, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 );
ffgSizer11->SetFlexibleDirection( wxBOTH );
ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
- m_bitmapLeftOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45, 45 ), 0 );
+ m_bitmapLeftOnly = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") );
ffgSizer11->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 = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_bitmapLeftNewer->SetToolTip( _("Left side is newer") );
ffgSizer11->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 = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_bitmapDifferent->SetToolTip( _("Items have different content") );
ffgSizer11->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 = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") );
ffgSizer11->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 = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_bitmapRightNewer->SetToolTip( _("Right side is newer") );
ffgSizer11->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 = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") );
ffgSizer11->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 );
+ m_bpButtonLeftOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
ffgSizer11->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 );
+ m_bpButtonLeftNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
ffgSizer11->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 );
+ m_bpButtonDifferent = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
ffgSizer11->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 );
+ m_bpButtonConflict = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
ffgSizer11->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 );
+ m_bpButtonRightNewer = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
ffgSizer11->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 );
+ m_bpButtonRightOnly = new wxBitmapButton( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
ffgSizer11->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
@@ -1624,30 +1717,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizerSyncDirections->Add( m_staticText120, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
- bSizer233->Add( bSizerSyncDirections, 0, 0, 5 );
-
- wxBoxSizer* bSizerKeepVerticalHeight;
- bSizerKeepVerticalHeight = new wxBoxSizer( wxVERTICAL );
-
- m_staticText140 = new wxStaticText( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText140->Wrap( -1 );
- bSizerKeepVerticalHeight->Add( m_staticText140, 0, 0, 5 );
-
-
- bSizerKeepVerticalHeight->Add( 0, 45, 0, 0, 5 );
-
-
- bSizerKeepVerticalHeight->Add( 0, 5, 0, 0, 5 );
-
-
- bSizerKeepVerticalHeight->Add( 0, 46, 0, 0, 5 );
-
- m_staticText1401 = new wxStaticText( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText1401->Wrap( -1 );
- bSizerKeepVerticalHeight->Add( m_staticText1401, 0, wxTOP, 5 );
-
-
- bSizer233->Add( bSizerKeepVerticalHeight, 0, 0, 5 );
+ bSizerSyncDirHolder->Add( bSizerSyncDirections, 0, 0, 5 );
bSizerDatabase = new wxWrapSizer( wxVERTICAL );
@@ -1659,22 +1729,22 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_staticText145 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("sync.ffs_db"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText145->Wrap( -1 );
- m_staticText145->SetFont( wxFont( 9, wxFONTFAMILY_SWISS, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxT("Arial") ) );
+ m_staticText145->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_SWISS, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL, false, wxT("Arial") ) );
m_staticText145->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
bSizerDatabase->Add( m_staticText145, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizer233->Add( bSizerDatabase, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizerSyncDirHolder->Add( bSizerDatabase, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_staticTextSyncVarDescription = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_staticTextSyncVarDescription->Wrap( -1 );
m_staticTextSyncVarDescription->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
- bSizer233->Add( m_staticTextSyncVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
+ bSizerSyncDirHolder->Add( m_staticTextSyncVarDescription, 0, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
- bSizer238->Add( bSizer233, 0, wxALL, 10 );
+ bSizer238->Add( bSizerSyncDirHolder, 0, wxALL, 10 );
bSizer238->Add( 0, 0, 1, wxEXPAND, 5 );
@@ -1686,7 +1756,6 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer201 = new wxBoxSizer( wxHORIZONTAL );
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") );
bSizer201->Add( m_checkBoxDetectMove, 0, wxALL|wxEXPAND, 5 );
@@ -1736,8 +1805,10 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_staticline531 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
bSizer2361->Add( m_staticline531, 0, wxEXPAND, 5 );
- wxBoxSizer* bSizer2351;
- bSizer2351 = new wxBoxSizer( wxVERTICAL );
+ bSizerVersioningHolder = new wxBoxSizer( wxVERTICAL );
+
+
+ bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 );
wxBoxSizer* bSizer2331;
bSizer2331 = new wxBoxSizer( wxHORIZONTAL );
@@ -1758,7 +1829,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer2331->Add( m_hyperlinkVersioning, 0, wxALIGN_BOTTOM|wxTOP|wxRIGHT|wxLEFT, 5 );
- bSizer2351->Add( bSizer2331, 0, wxALL|wxEXPAND, 5 );
+ bSizerVersioningHolder->Add( bSizer2331, 0, wxALL|wxEXPAND, 5 );
m_panelVersioning = new wxPanel( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_panelVersioning->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
@@ -1777,7 +1848,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer156->Add( m_buttonSelectVersioningFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_bpButtonSelectAltFolder = new wxBitmapButton( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltFolder = new wxBitmapButton( m_panelVersioning, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSelectAltFolder->SetToolTip( _("Access online storage") );
bSizer156->Add( m_bpButtonSelectAltFolder, 0, wxEXPAND, 5 );
@@ -1823,10 +1894,13 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_panelVersioning->SetSizer( bSizer191 );
m_panelVersioning->Layout();
bSizer191->Fit( m_panelVersioning );
- bSizer2351->Add( m_panelVersioning, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+ bSizerVersioningHolder->Add( m_panelVersioning, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+
+
+ bSizerVersioningHolder->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizer2361->Add( bSizer2351, 1, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer2361->Add( bSizerVersioningHolder, 1, wxALIGN_CENTER_VERTICAL, 5 );
bSizer232->Add( bSizer2361, 0, wxEXPAND, 5 );
@@ -1836,28 +1910,56 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizerMiscConfig = new wxBoxSizer( wxHORIZONTAL );
- wxBoxSizer* bSizer242;
- bSizer242 = new wxBoxSizer( wxHORIZONTAL );
+ wxFlexGridSizer* fgSizer61;
+ fgSizer61 = new wxFlexGridSizer( 0, 2, 5, 5 );
+ fgSizer61->SetFlexibleDirection( wxBOTH );
+ fgSizer61->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
m_bitmapIgnoreErrors = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizer242->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+ fgSizer61->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_checkBoxIgnoreErrors = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ fgSizer61->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_checkBoxIgnoreErrors = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("&Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxIgnoreErrors->SetToolTip( _("Show pop-up on errors or warnings") );
+ m_bitmapRetryErrors = new wxStaticBitmap( m_panelSyncSettings, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer61->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizer242->Add( m_checkBoxIgnoreErrors, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_checkBoxAutoRetry = new wxCheckBox( m_panelSyncSettings, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 );
+ fgSizer61->Add( m_checkBoxAutoRetry, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- bSizerMiscConfig->Add( bSizer242, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizerMiscConfig->Add( fgSizer61, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
+
+ fgSizerAutoRetry = new wxFlexGridSizer( 0, 2, 5, 10 );
+ fgSizerAutoRetry->SetFlexibleDirection( wxBOTH );
+ fgSizerAutoRetry->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_staticText96 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Retry count:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText96->Wrap( -1 );
+ fgSizerAutoRetry->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextAutoRetryDelay = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Delay (in seconds):"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextAutoRetryDelay->Wrap( -1 );
+ fgSizerAutoRetry->Add( m_staticTextAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_spinCtrlAutoRetryCount = new wxSpinCtrl( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 0 );
+ fgSizerAutoRetry->Add( m_spinCtrlAutoRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_spinCtrlAutoRetryDelay = new wxSpinCtrl( m_panelSyncSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ fgSizerAutoRetry->Add( m_spinCtrlAutoRetryDelay, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerMiscConfig->Add( fgSizerAutoRetry, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 10 );
m_staticline57 = new wxStaticLine( m_panelSyncSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
bSizerMiscConfig->Add( m_staticline57, 0, wxEXPAND, 5 );
- bSizerOnCompletion = new wxBoxSizer( wxVERTICAL );
+ wxBoxSizer* bSizer247;
+ bSizer247 = new wxBoxSizer( wxVERTICAL );
m_staticText89 = new wxStaticText( m_panelSyncSettings, wxID_ANY, _("Run a command after synchronization:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText89->Wrap( -1 );
- bSizerOnCompletion->Add( m_staticText89, 0, wxBOTTOM, 5 );
+ bSizer247->Add( m_staticText89, 0, wxBOTTOM, 5 );
wxBoxSizer* bSizer251;
bSizer251 = new wxBoxSizer( wxHORIZONTAL );
@@ -1871,10 +1973,10 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer251->Add( m_comboBoxPostSyncCommand, 1, wxALIGN_CENTER_VERTICAL, 5 );
- bSizerOnCompletion->Add( bSizer251, 0, wxEXPAND, 5 );
+ bSizer247->Add( bSizer251, 0, wxEXPAND, 5 );
- bSizerMiscConfig->Add( bSizerOnCompletion, 1, wxALL, 10 );
+ bSizerMiscConfig->Add( bSizer247, 1, wxALL|wxALIGN_CENTER_VERTICAL, 10 );
bSizer232->Add( bSizerMiscConfig, 1, wxEXPAND, 5 );
@@ -1886,10 +1988,10 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
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 );
+ m_panelSyncSettingsTab->SetSizer( bSizer276 );
+ m_panelSyncSettingsTab->Layout();
+ bSizer276->Fit( m_panelSyncSettingsTab );
+ m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), true );
bSizer190->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
@@ -1962,6 +2064,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_hyperlinkVersioning->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( ConfigDlgGenerated::OnHelpVersioning ), NULL, this );
m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( ConfigDlgGenerated::OnChangeSyncOption ), NULL, this );
m_checkBoxIgnoreErrors->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleIgnoreErrors ), NULL, this );
+ m_checkBoxAutoRetry->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnToggleAutoRetry ), NULL, this );
m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnOkay ), NULL, this );
m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ConfigDlgGenerated::OnCancel ), NULL, this );
}
@@ -1970,106 +2073,6 @@ ConfigDlgGenerated::~ConfigDlgGenerated()
{
}
-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_folderPathLeft = new fff::FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer134->Add( m_folderPathLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectFolderLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectFolderLeft->SetToolTip( _("Select a folder") );
-
- bSizer134->Add( m_buttonSelectFolderLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonSelectAltFolderLeft = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW );
- m_bpButtonSelectAltFolderLeft->SetToolTip( _("Access online storage") );
-
- bSizer134->Add( m_bpButtonSelectAltFolderLeft, 0, wxEXPAND, 5 );
-
-
- m_panelLeft->SetSizer( bSizer134 );
- m_panelLeft->Layout();
- bSizer134->Fit( m_panelLeft );
- bSizer74->Add( m_panelLeft, 0, 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( 26, 25 ), wxBU_AUTODRAW );
- bSizer95->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 25 ), wxBU_AUTODRAW );
- bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 26, 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, 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_folderPathRight = new fff::FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer135->Add( m_folderPathRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_buttonSelectFolderRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
- m_buttonSelectFolderRight->SetToolTip( _("Select a folder") );
-
- bSizer135->Add( m_buttonSelectFolderRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonSelectAltFolderRight = new wxBitmapButton( m_panelRight, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW );
- m_bpButtonSelectAltFolderRight->SetToolTip( _("Access online storage") );
-
- bSizer135->Add( m_bpButtonSelectAltFolderRight, 0, wxEXPAND, 5 );
-
-
- m_panelRight->SetSizer( bSizer135 );
- m_panelRight->Layout();
- bSizer135->Fit( m_panelRight );
- bSizer74->Add( m_panelRight, 1, wxRIGHT|wxEXPAND, 5 );
-
-
- this->SetSizer( bSizer74 );
- this->Layout();
- bSizer74->Fit( this );
-}
-
-FolderPairPanelGenerated::~FolderPairPanelGenerated()
-{
-}
-
CloudSetupDlgGenerated::CloudSetupDlgGenerated( 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 );
@@ -2130,14 +2133,14 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id,
m_staticText12311->Wrap( -1 );
bSizer245->Add( m_staticText12311, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
- m_textCtrlServer = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 260, -1 ), 0 );
+ m_textCtrlServer = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), 0 );
bSizer245->Add( m_textCtrlServer, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_staticText1233 = new wxStaticText( m_panel41, wxID_ANY, _("Port:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText1233->Wrap( -1 );
bSizer245->Add( m_staticText1233, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
- m_textCtrlPort = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60, -1 ), 0 );
+ m_textCtrlPort = new wxTextCtrl( m_panel41, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), 0 );
bSizer245->Add( m_textCtrlPort, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
@@ -2337,7 +2340,7 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id,
m_staticText12341->Wrap( -1 );
fgSizer1611->Add( m_staticText12341, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
- m_spinCtrlConnectionCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ m_spinCtrlConnectionCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
fgSizer1611->Add( m_spinCtrlConnectionCountSftp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_staticTextSftpConnectionCountHint = new wxStaticText( m_panel411, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -2350,7 +2353,7 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id,
m_staticText1231111->Wrap( -1 );
fgSizer1611->Add( m_staticText1231111, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT, 5 );
- m_spinCtrlChannelCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ m_spinCtrlChannelCountSftp = new wxSpinCtrl( m_panel411, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
fgSizer1611->Add( m_spinCtrlChannelCountSftp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_button42 = new wxButton( m_panel411, wxID_ANY, _("Detect server limit"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -2411,7 +2414,7 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id,
m_staticText123411->Wrap( -1 );
fgSizer16111->Add( m_staticText123411, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 );
- m_spinCtrlConnectionCountFtp = new wxSpinCtrl( m_panel4111, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ m_spinCtrlConnectionCountFtp = new wxSpinCtrl( m_panel4111, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
fgSizer16111->Add( m_spinCtrlConnectionCountFtp, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_staticTextFtpConnectionCountHint = new wxStaticText( m_panel4111, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
@@ -2441,7 +2444,7 @@ CloudSetupDlgGenerated::CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id,
m_buttonOkay->SetDefault();
m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
- bSizerStdButtons->Add( m_buttonOkay, 0, wxALL, 5 );
+ bSizerStdButtons->Add( m_buttonOkay, 0, wxALL|wxALIGN_CENTER_VERTICAL, 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 );
@@ -2507,7 +2510,7 @@ AbstractFolderPickerGenerated::AbstractFolderPickerGenerated( wxWindow* parent,
wxBoxSizer* bSizer185;
bSizer185 = new wxBoxSizer( wxVERTICAL );
- m_treeCtrlFileSystem = new wxTreeCtrl( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( 350, 400 ), wxTR_FULL_ROW_HIGHLIGHT|wxTR_HAS_BUTTONS|wxTR_LINES_AT_ROOT|wxTR_NO_LINES|wxNO_BORDER );
+ m_treeCtrlFileSystem = new wxTreeCtrl( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), wxTR_FULL_ROW_HIGHLIGHT|wxTR_HAS_BUTTONS|wxTR_LINES_AT_ROOT|wxTR_NO_LINES|wxNO_BORDER );
bSizer185->Add( m_treeCtrlFileSystem, 1, wxEXPAND, 5 );
@@ -2525,7 +2528,7 @@ AbstractFolderPickerGenerated::AbstractFolderPickerGenerated( wxWindow* parent,
m_buttonOkay->SetDefault();
m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
- bSizerStdButtons->Add( m_buttonOkay, 0, wxALL, 5 );
+ bSizerStdButtons->Add( m_buttonOkay, 0, wxALL|wxALIGN_CENTER_VERTICAL, 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 );
@@ -2867,16 +2870,33 @@ CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWi
wxBoxSizer* bSizer199;
bSizer199 = new wxBoxSizer( wxHORIZONTAL );
- bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL );
+ bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapRetryErrors = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText1461 = new wxStaticText( this, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1461->Wrap( -1 );
+ bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextRetryCount = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextRetryCount->Wrap( -1 );
+ bSizerErrorsRetry->Add( m_staticTextRetryCount, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+
+ bSizer199->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ bSizerErrorsIgnore = new wxBoxSizer( wxHORIZONTAL );
m_bitmapIgnoreErrors = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerProgressFooter->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizerErrorsIgnore->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("&Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizerProgressFooter->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+ m_staticText146 = new wxStaticText( this, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText146->Wrap( -1 );
+ bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
- bSizer199->Add( bSizerProgressFooter, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer199->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
bSizerProgressGraph = new wxBoxSizer( wxHORIZONTAL );
@@ -2902,7 +2922,7 @@ CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWi
bSizerProgressGraph->Add( bSizer247, 0, 0, 5 );
- bSizer199->Add( bSizerProgressGraph, 1, 0, 5 );
+ bSizer199->Add( bSizerProgressGraph, 1, wxALIGN_CENTER_VERTICAL, 5 );
bSizer181->Add( bSizer199, 0, wxTOP|wxEXPAND, 5 );
@@ -2914,9 +2934,6 @@ CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWi
this->SetSizer( bSizer40 );
this->Layout();
bSizer40->Fit( this );
-
- // Connect Events
- m_checkBoxIgnoreErrors->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( CompareProgressDlgGenerated::OnToggleIgnoreErrors ), NULL, this );
}
CompareProgressDlgGenerated::~CompareProgressDlgGenerated()
@@ -2930,27 +2947,30 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
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 );
+ m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 );
bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 );
m_staticTextPhase = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextPhase->Wrap( -1 );
m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
- bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
+ bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
+
+ wxBoxSizer* bSizer247;
+ bSizer247 = new wxBoxSizer( wxHORIZONTAL );
- bSizer42->Add( 0, 0, 1, wxEXPAND, 5 );
+ bSizer247->Add( 0, 0, 1, 0, 5 );
- m_bpButtonMinimizeToTray = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32, 32 ), wxBU_AUTODRAW );
+ m_bpButtonMinimizeToTray = new wxBitmapButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonMinimizeToTray->SetToolTip( _("Minimize to notification area") );
- bSizer42->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer247->Add( m_bpButtonMinimizeToTray, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer42->Add( bSizer247, 1, wxALIGN_CENTER_VERTICAL, 5 );
bSizerRoot->Add( bSizer42, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
@@ -2983,7 +3003,7 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
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, wxEXPAND, 15 );
+ bSizer161->Add( m_panelGraphBytes, 1, wxEXPAND|wxLEFT, 10 );
wxBoxSizer* bSizer232;
bSizer232 = new wxBoxSizer( wxHORIZONTAL );
@@ -3135,7 +3155,7 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
bSizer175->Add( m_bitmapGraphKeyBytes, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
wxStaticText* m_staticText99;
- m_staticText99 = new wxStaticText( m_panelProgress, wxID_ANY, _("Bytes copied:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText99 = new wxStaticText( m_panelProgress, wxID_ANY, _("Bytes"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText99->Wrap( -1 );
bSizer175->Add( m_staticText99, 0, wxALIGN_CENTER_VERTICAL, 5 );
@@ -3149,7 +3169,7 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
bSizer174->Add( m_bitmapGraphKeyItems, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
wxStaticText* m_staticText100;
- m_staticText100 = new wxStaticText( m_panelProgress, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText100 = new wxStaticText( m_panelProgress, wxID_ANY, _("Items"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText100->Wrap( -1 );
bSizer174->Add( m_staticText100, 0, wxALIGN_CENTER_VERTICAL, 5 );
@@ -3165,18 +3185,40 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
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( m_panelGraphItems, 1, wxEXPAND|wxLEFT, 10 );
+ bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL );
- bSizer161->Add( 550, 0, 0, 0, 5 );
+ bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL );
- bSizerProgressFooter = new wxBoxSizer( wxHORIZONTAL );
+ m_bitmapRetryErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerErrorsRetry->Add( m_bitmapRetryErrors, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText1461 = new wxStaticText( m_panelProgress, wxID_ANY, _("Automatic retry"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1461->Wrap( -1 );
+ bSizerErrorsRetry->Add( m_staticText1461, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+ m_staticTextRetryCount = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextRetryCount->Wrap( -1 );
+ bSizerErrorsRetry->Add( m_staticTextRetryCount, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+
+ bSizerProgressFooter->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
+ bSizerErrorsIgnore = new wxBoxSizer( wxHORIZONTAL );
m_bitmapIgnoreErrors = new wxStaticBitmap( m_panelProgress, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerProgressFooter->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+ bSizerErrorsIgnore->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticText146 = new wxStaticText( m_panelProgress, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText146->Wrap( -1 );
+ bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
+
+
+ bSizerProgressFooter->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+
- m_checkBoxIgnoreErrors = new wxCheckBox( m_panelProgress, wxID_ANY, _("&Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizerProgressFooter->Add( m_checkBoxIgnoreErrors, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+ bSizerProgressFooter->Add( 0, 0, 1, wxEXPAND, 5 );
m_staticText137 = new wxStaticText( m_panelProgress, wxID_ANY, _("When finished:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText137->Wrap( -1 );
@@ -3188,15 +3230,12 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
bSizerProgressFooter->Add( m_choicePostSyncAction, 0, wxALIGN_CENTER_VERTICAL, 5 );
- bSizer161->Add( bSizerProgressFooter, 0, wxEXPAND|wxBOTTOM|wxRIGHT, 10 );
+ bSizer161->Add( bSizerProgressFooter, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 10 );
bSizer173->Add( bSizer161, 1, wxEXPAND|wxLEFT, 10 );
- bSizer173->Add( 0, 340, 0, 0, 5 );
-
-
m_panelProgress->SetSizer( bSizer173 );
m_panelProgress->Layout();
bSizer173->Fit( m_panelProgress );
@@ -3213,8 +3252,11 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind
bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
- m_checkBoxAutoClose = new wxCheckBox( this, wxID_ANY, _("Auto-Close"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStdButtons->Add( m_checkBoxAutoClose, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+ m_checkBoxAutoClose = new wxCheckBox( this, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStdButtons->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_buttonClose->SetDefault();
@@ -3251,13 +3293,13 @@ LogPanelGenerated::LogPanelGenerated( wxWindow* parent, wxWindowID id, const wxP
wxBoxSizer* bSizer154;
bSizer154 = new wxBoxSizer( wxVERTICAL );
- m_bpButtonErrors = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49, 49 ), wxBU_AUTODRAW );
+ m_bpButtonErrors = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonWarnings = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49, 49 ), wxBU_AUTODRAW );
+ m_bpButtonWarnings = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonInfo = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 49, 49 ), wxBU_AUTODRAW );
+ m_bpButtonInfo = new zen::ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
@@ -3299,9 +3341,9 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
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 );
+ m_staticTextHeader = 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_staticTextHeader->Wrap( -1 );
+ bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
bSizer54->Add( bSizer72, 0, 0, 5 );
@@ -3338,8 +3380,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
ffgSizer11->Add( 0, 0, 1, wxEXPAND, 5 );
- m_checkBoxAutoClose = new wxCheckBox( m_panel35, wxID_ANY, _("Auto-Close"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxAutoClose->SetValue(true);
+ m_checkBoxAutoClose = new wxCheckBox( m_panel35, wxID_ANY, _("Auto-close"), wxDefaultPosition, wxDefaultSize, 0 );
ffgSizer11->Add( m_checkBoxAutoClose, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
@@ -3360,7 +3401,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_bitmapIgnoreErrors = new wxStaticBitmap( m_panel35, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
bSizer243->Add( m_bitmapIgnoreErrors, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_checkBoxIgnoreErrors = new wxCheckBox( m_panel35, wxID_ANY, _("&Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxIgnoreErrors = new wxCheckBox( m_panel35, wxID_ANY, _("Ignore errors"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer243->Add( m_checkBoxIgnoreErrors, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
@@ -3426,14 +3467,17 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer238 = new wxBoxSizer( wxHORIZONTAL );
m_checkBoxSaveLog = new wxCheckBox( m_panel35, wxID_ANY, _("Save log:"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer238->Add( m_checkBoxSaveLog, 1, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer238->Add( m_checkBoxSaveLog, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer238->Add( 0, 0, 1, wxEXPAND, 5 );
m_checkBoxLogfilesLimit = new wxCheckBox( m_panel35, wxID_ANY, _("Limit:"), wxDefaultPosition, wxDefaultSize, 0 );
m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") );
bSizer238->Add( m_checkBoxLogfilesLimit, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
- m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") );
bSizer238->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
@@ -3455,7 +3499,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer1721->Add( m_buttonSelectLogFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltLogFolder = new wxBitmapButton( m_panelLogfile, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSelectAltLogFolder->SetToolTip( _("Access online storage") );
bSizer1721->Add( m_bpButtonSelectAltLogFolder, 0, wxEXPAND, 5 );
@@ -3536,7 +3580,7 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w
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 = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextHeader->Wrap( -1 );
bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
@@ -3558,7 +3602,7 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w
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 );
+ m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 );
@@ -3573,7 +3617,10 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w
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 );
+ bSizerStdButtons->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
m_buttonOK = new wxButton( this, wxID_OK, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_buttonOK->SetDefault();
@@ -3619,8 +3666,8 @@ CopyToDlgGenerated::CopyToDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_bitmapCopyTo = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
bSizer72->Add( m_bitmapCopyTo, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
- m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0|wxNO_BORDER );
- m_staticTextHeader->Wrap( 460 );
+ m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextHeader->Wrap( -1 );
bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
@@ -3644,7 +3691,7 @@ CopyToDlgGenerated::CopyToDlgGenerated( wxWindow* parent, wxWindowID id, const w
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 );
+ m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
bSizer185->Add( m_textCtrlFileList, 1, wxEXPAND, 5 );
@@ -3661,7 +3708,7 @@ CopyToDlgGenerated::CopyToDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer182->Add( m_buttonSelectTargetFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_bpButtonSelectAltTargetFolder = new wxBitmapButton( m_panel31, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30, -1 ), wxBU_AUTODRAW );
+ m_bpButtonSelectAltTargetFolder = new wxBitmapButton( m_panel31, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
m_bpButtonSelectAltTargetFolder->SetToolTip( _("Access online storage") );
bSizer182->Add( m_bpButtonSelectAltTargetFolder, 0, wxEXPAND, 5 );
@@ -3692,7 +3739,10 @@ CopyToDlgGenerated::CopyToDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer189->Add( m_checkBoxOverwriteIfExists, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
- bSizerStdButtons->Add( bSizer189, 1, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizerStdButtons->Add( bSizer189, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStdButtons->Add( 0, 0, 1, wxEXPAND, 5 );
m_buttonOK = new wxButton( this, wxID_OK, _("Copy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
m_buttonOK->SetDefault();
@@ -3740,7 +3790,7 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const
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 );
+ m_staticText44->Wrap( -1 );
bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 10 );
@@ -3851,42 +3901,25 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizer160->Add( bSizer178, 0, wxEXPAND, 5 );
- bSizer186->Add( bSizer160, 0, wxEXPAND|wxALL, 5 );
+ bSizer186->Add( bSizer160, 0, wxALL|wxALIGN_CENTER_VERTICAL, 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, 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 );
+ wxBoxSizer* bSizer1881;
+ bSizer1881 = new wxBoxSizer( wxVERTICAL );
- 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 );
+ m_buttonResetDialogs = new zen::BitmapTextButton( m_panel39, wxID_ANY, _("Show hidden dialogs again"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ bSizer1881->Add( m_buttonResetDialogs, 0, wxALL, 5 );
+ m_staticTextResetDialogs = new wxStaticText( m_panel39, wxID_ANY, _("Show all permanently hidden dialogs and warning messages again"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextResetDialogs->Wrap( -1 );
+ m_staticTextResetDialogs->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
- bSizer188->Add( fgSizer6, 0, wxLEFT, 10 );
+ bSizer1881->Add( m_staticTextResetDialogs, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
- bSizer186->Add( bSizer188, 0, wxALL, 10 );
+ bSizer186->Add( bSizer1881, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
bSizer166->Add( bSizer186, 0, wxEXPAND, 5 );
@@ -3904,18 +3937,16 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const
m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
// Grid
- m_gridCustomCommand->CreateGrid( 5, 2 );
+ m_gridCustomCommand->CreateGrid( 3, 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->SetColLabelSize( -1 );
m_gridCustomCommand->SetColLabelValue( 0, _("Description") );
m_gridCustomCommand->SetColLabelValue( 1, _("Command line") );
m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
@@ -3923,7 +3954,7 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const
// Rows
m_gridCustomCommand->EnableDragRowSize( false );
m_gridCustomCommand->SetRowLabelSize( 1 );
- m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE );
+ m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE );
// Label Appearance
@@ -3934,11 +3965,11 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const
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_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizer193->Add( m_bpButtonAddRow, 0, wxEXPAND, 5 );
- m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25, 25 ), wxBU_AUTODRAW );
- bSizer193->Add( m_bpButtonRemoveRow, 0, 0, 5 );
+ m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), wxBU_AUTODRAW );
+ bSizer193->Add( m_bpButtonRemoveRow, 0, wxEXPAND, 5 );
bSizer193->Add( 0, 0, 1, wxEXPAND, 5 );
@@ -3952,24 +3983,6 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const
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 );
- bSizer1881->Add( m_buttonResetDialogs, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_staticText923 = new wxStaticText( m_panel39, wxID_ANY, _("Show all permanently hidden dialogs and warning messages again"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText923->Wrap( 350 );
- m_staticText923->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
-
- bSizer1881->Add( m_staticText923, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
-
-
- bSizer166->Add( bSizer1881, 0, wxALL, 5 );
-
m_panel39->SetSizer( bSizer166 );
m_panel39->Layout();
@@ -4008,11 +4021,10 @@ OptionsDlgGenerated::OptionsDlgGenerated( wxWindow* parent, wxWindowID id, const
// Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( OptionsDlgGenerated::OnClose ) );
- m_spinCtrlAutoRetryCount->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( OptionsDlgGenerated::OnToggleAutoRetryCount ), NULL, this );
+ m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( OptionsDlgGenerated::OnResetDialogs ), 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 );
@@ -4416,11 +4428,11 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
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(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
+ m_staticTextThanksForLoc = new wxStaticText( m_panel41, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_staticTextThanksForLoc->Wrap( -1 );
+ m_staticTextThanksForLoc->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) );
- bSizer177->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
+ bSizer177->Add( m_staticTextThanksForLoc, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
bSizer177->Add( 0, 5, 0, 0, 5 );
@@ -4428,7 +4440,6 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
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 );
@@ -4441,7 +4452,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer177->Add( m_scrolledWindowTranslators, 1, wxLEFT|wxEXPAND, 5 );
- bSizer174->Add( bSizer177, 0, wxEXPAND|wxTOP|wxLEFT, 5 );
+ bSizer174->Add( bSizer177, 0, wxTOP|wxLEFT|wxEXPAND, 5 );
bSizer162->Add( bSizer174, 0, 0, 5 );
@@ -4495,8 +4506,8 @@ DownloadProgressDlgGenerated::DownloadProgressDlgGenerated( wxWindow* parent, wx
m_bitmapDownloading = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
bSizer72->Add( m_bitmapDownloading, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 );
- m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0|wxNO_BORDER );
- m_staticTextHeader->Wrap( 460 );
+ m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextHeader->Wrap( -1 );
bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxALL, 10 );
@@ -4514,8 +4525,6 @@ DownloadProgressDlgGenerated::DownloadProgressDlgGenerated( wxWindow* parent, wx
m_staticTextDetails = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
m_staticTextDetails->Wrap( -1 );
- m_staticTextDetails->SetMinSize( wxSize( 550, -1 ) );
-
bSizer212->Add( m_staticTextDetails, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
@@ -4654,7 +4663,6 @@ ActivationDlgGenerated::ActivationDlgGenerated( wxWindow* parent, wxWindowID id,
bSizer236->Add( m_staticText1361, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
m_buttonCopyUrl = new wxButton( m_panel351, wxID_ANY, _("&Copy to clipboard"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
- m_buttonCopyUrl->SetDefault();
m_buttonCopyUrl->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxEmptyString ) );
bSizer236->Add( m_buttonCopyUrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
@@ -4662,8 +4670,8 @@ ActivationDlgGenerated::ActivationDlgGenerated( wxWindow* parent, wxWindowID id,
bSizer237->Add( bSizer236, 0, wxEXPAND, 5 );
- m_textCtrlManualActivationUrl = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220, 55 ), wxTE_MULTILINE|wxTE_READONLY|wxWANTS_CHARS );
- bSizer237->Add( m_textCtrlManualActivationUrl, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+ m_textCtrlManualActivationUrl = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, 55 ), wxTE_MULTILINE|wxTE_READONLY );
+ bSizer237->Add( m_textCtrlManualActivationUrl, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 );
wxBoxSizer* bSizer235;
bSizer235 = new wxBoxSizer( wxHORIZONTAL );
@@ -4672,7 +4680,7 @@ ActivationDlgGenerated::ActivationDlgGenerated( wxWindow* parent, wxWindowID id,
m_staticText13611->Wrap( -1 );
bSizer235->Add( m_staticText13611, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
- m_textCtrlOfflineActivationKey = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220, -1 ), wxTE_PROCESS_ENTER|wxWANTS_CHARS );
+ m_textCtrlOfflineActivationKey = new wxTextCtrl( m_panel351, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 250, -1 ), wxTE_PROCESS_ENTER );
bSizer235->Add( m_textCtrlOfflineActivationKey, 1, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_buttonActivateOffline = new wxButton( m_panel351, wxID_ANY, _("Activate offline"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
@@ -4740,12 +4748,12 @@ CfgHighlightDlgGenerated::CfgHighlightDlgGenerated( wxWindow* parent, wxWindowID
wxBoxSizer* bSizer238;
bSizer238 = new wxBoxSizer( wxVERTICAL );
- m_staticText145 = new wxStaticText( m_panel35, wxID_ANY, _("Highlight configurations that have not been run for more than the following number of days:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText145->Wrap( 300 );
- bSizer238->Add( m_staticText145, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
+ m_staticTextHighlight = new wxStaticText( m_panel35, wxID_ANY, _("Highlight configurations that have not been run for more than the following number of days:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextHighlight->Wrap( -1 );
+ bSizer238->Add( m_staticTextHighlight, 0, wxTOP|wxRIGHT|wxLEFT, 5 );
- m_spinCtrlSyncOverdueDays = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 70, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- bSizer238->Add( m_spinCtrlSyncOverdueDays, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ m_spinCtrlOverdueDays = new wxSpinCtrl( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1, -1 ), wxSP_ARROW_KEYS, 0, 2000000000, 0 );
+ bSizer238->Add( m_spinCtrlOverdueDays, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
bSizer98->Add( bSizer238, 1, wxALL|wxEXPAND, 5 );
diff --git a/FreeFileSync/Source/ui/gui_generated.h b/FreeFileSync/Source/ui/gui_generated.h
index 3b2287e1..3b7034db 100755
--- a/FreeFileSync/Source/ui/gui_generated.h
+++ b/FreeFileSync/Source/ui/gui_generated.h
@@ -11,14 +11,13 @@
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
-namespace fff { class CommandBox; }
-namespace fff { class FolderHistoryBox; }
-namespace fff { class TripleSplitter; }
-namespace zen { class BitmapTextButton; }
-namespace zen { class Graph2D; }
-namespace zen { class Grid; }
-namespace zen { class ToggleButton; }
-
+#include "wx+/bitmap_button.h"
+#include "folder_history_box.h"
+#include "wx+/grid.h"
+#include "triple_splitter.h"
+#include "wx+/toggle_button.h"
+#include "command_box.h"
+#include "wx+/graph.h"
#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
@@ -246,22 +245,52 @@ public:
wxBitmapButton* m_bpButtonRemovePair;
fff::FolderHistoryBox* m_folderPathLeft;
wxBitmapButton* m_bpButtonSelectAltFolderLeft;
- wxBitmapButton* m_bpButtonAltCompCfg;
+ wxBitmapButton* m_bpButtonLocalCompCfg;
wxBitmapButton* m_bpButtonLocalFilter;
- wxBitmapButton* m_bpButtonAltSyncCfg;
+ wxBitmapButton* m_bpButtonLocalSyncCfg;
wxPanel* m_panelTopRight;
fff::FolderHistoryBox* m_folderPathRight;
wxBitmapButton* m_bpButtonSelectAltFolderRight;
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( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
~MainDialogGenerated();
};
///////////////////////////////////////////////////////////////////////////////
+/// Class FolderPairPanelGenerated
+///////////////////////////////////////////////////////////////////////////////
+class FolderPairPanelGenerated : public wxPanel
+{
+private:
+
+protected:
+ wxButton* m_buttonSelectFolderLeft;
+ wxButton* m_buttonSelectFolderRight;
+
+public:
+ wxPanel* m_panelLeft;
+ wxBitmapButton* m_bpButtonFolderPairOptions;
+ wxBitmapButton* m_bpButtonRemovePair;
+ fff::FolderHistoryBox* m_folderPathLeft;
+ wxBitmapButton* m_bpButtonSelectAltFolderLeft;
+ wxPanel* m_panel20;
+ wxBitmapButton* m_bpButtonLocalCompCfg;
+ wxBitmapButton* m_bpButtonLocalFilter;
+ wxBitmapButton* m_bpButtonLocalSyncCfg;
+ wxPanel* m_panelRight;
+ fff::FolderHistoryBox* m_folderPathRight;
+ wxBitmapButton* m_bpButtonSelectAltFolderRight;
+
+ FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 );
+ ~FolderPairPanelGenerated();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
/// Class ConfigDlgGenerated
///////////////////////////////////////////////////////////////////////////////
class ConfigDlgGenerated : public wxDialog
@@ -272,7 +301,7 @@ protected:
wxStaticText* m_staticTextFolderPairLabel;
wxListBox* m_listBoxFolderPair;
wxNotebook* m_notebook;
- wxPanel* m_panelCompSettingsHolder;
+ wxPanel* m_panelCompSettingsTab;
wxBoxSizer* bSizerHeaderCompSettings;
wxStaticText* m_staticTextMainCompSettings;
wxCheckBox* m_checkBoxUseLocalCmpOptions;
@@ -298,7 +327,7 @@ protected:
wxHyperlinkCtrl* m_hyperlink241;
wxStaticLine* m_staticline441;
wxStaticLine* m_staticline331;
- wxPanel* m_panelFilterSettingsHolder;
+ wxPanel* m_panelFilterSettingsTab;
wxBoxSizer* bSizerHeaderFilterSettings;
wxStaticText* m_staticTextMainFilterSettings;
wxStaticText* m_staticTextLocalFilterSettings;
@@ -327,10 +356,9 @@ protected:
wxSpinCtrl* m_spinCtrlMaxSize;
wxChoice* m_choiceUnitMaxSize;
wxStaticLine* m_staticline62;
- wxStaticText* m_staticText44;
wxStaticLine* m_staticline46;
wxButton* m_buttonClear;
- wxPanel* m_panelSyncSettingsHolder;
+ wxPanel* m_panelSyncSettingsTab;
wxBoxSizer* bSizerHeaderSyncSettings;
wxStaticText* m_staticTextMainSyncSettings;
wxCheckBox* m_checkBoxUseLocalSyncOptions;
@@ -342,9 +370,9 @@ protected:
wxToggleButton* m_toggleBtnUpdate;
wxToggleButton* m_toggleBtnCustom;
wxStaticLine* m_staticline53;
- wxBoxSizer* bSizer233;
+ wxBoxSizer* bSizerSyncDirHolder;
wxBoxSizer* bSizerSyncDirections;
- wxStaticText* m_staticText119;
+ wxStaticText* m_staticTextCategory;
wxFlexGridSizer* ffgSizer11;
wxStaticBitmap* m_bitmapLeftOnly;
wxStaticBitmap* m_bitmapLeftNewer;
@@ -359,8 +387,6 @@ protected:
wxBitmapButton* m_bpButtonRightNewer;
wxBitmapButton* m_bpButtonRightOnly;
wxStaticText* m_staticText120;
- wxStaticText* m_staticText140;
- wxStaticText* m_staticText1401;
wxWrapSizer* bSizerDatabase;
wxStaticBitmap* m_bitmapDatabase;
wxStaticText* m_staticText145;
@@ -375,6 +401,7 @@ protected:
wxToggleButton* m_toggleBtnPermanent;
wxToggleButton* m_toggleBtnVersioning;
wxStaticLine* m_staticline531;
+ wxBoxSizer* bSizerVersioningHolder;
wxStaticBitmap* m_bitmapDeletionType;
wxStaticText* m_staticTextDeletionTypeDescription;
wxHyperlinkCtrl* m_hyperlinkVersioning;
@@ -390,8 +417,13 @@ protected:
wxBoxSizer* bSizerMiscConfig;
wxStaticBitmap* m_bitmapIgnoreErrors;
wxCheckBox* m_checkBoxIgnoreErrors;
+ wxCheckBox* m_checkBoxAutoRetry;
+ wxFlexGridSizer* fgSizerAutoRetry;
+ wxStaticText* m_staticText96;
+ wxStaticText* m_staticTextAutoRetryDelay;
+ wxSpinCtrl* m_spinCtrlAutoRetryCount;
+ wxSpinCtrl* m_spinCtrlAutoRetryDelay;
wxStaticLine* m_staticline57;
- wxBoxSizer* bSizerOnCompletion;
wxStaticText* m_staticText89;
fff::CommandBox* m_comboBoxPostSyncCommand;
wxBoxSizer* bSizerStdButtons;
@@ -439,50 +471,23 @@ protected:
virtual void OnHelpVersioning( wxHyperlinkEvent& event ) { event.Skip(); }
virtual void OnChangeSyncOption( wxCommandEvent& event ) { event.Skip(); }
virtual void OnToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnToggleAutoRetry( wxCommandEvent& event ) { event.Skip(); }
virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
public:
+ wxStaticText* m_staticTextFilterDescr;
wxBitmapButton* m_bpButtonSelectAltFolder;
+ wxStaticBitmap* m_bitmapRetryErrors;
wxChoice* m_choicePostSyncCondition;
- 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( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization Settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
~ConfigDlgGenerated();
};
///////////////////////////////////////////////////////////////////////////////
-/// Class FolderPairPanelGenerated
-///////////////////////////////////////////////////////////////////////////////
-class FolderPairPanelGenerated : public wxPanel
-{
-private:
-
-protected:
- wxButton* m_buttonSelectFolderLeft;
- wxButton* m_buttonSelectFolderRight;
-
-public:
- wxPanel* m_panelLeft;
- wxBitmapButton* m_bpButtonFolderPairOptions;
- wxBitmapButton* m_bpButtonRemovePair;
- fff::FolderHistoryBox* m_folderPathLeft;
- wxBitmapButton* m_bpButtonSelectAltFolderLeft;
- wxPanel* m_panel20;
- wxBitmapButton* m_bpButtonAltCompCfg;
- wxBitmapButton* m_bpButtonLocalFilter;
- wxBitmapButton* m_bpButtonAltSyncCfg;
- wxPanel* m_panelRight;
- fff::FolderHistoryBox* m_folderPathRight;
- wxBitmapButton* m_bpButtonSelectAltFolderRight;
-
- FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 );
- ~FolderPairPanelGenerated();
-
-};
-
-///////////////////////////////////////////////////////////////////////////////
/// Class CloudSetupDlgGenerated
///////////////////////////////////////////////////////////////////////////////
class CloudSetupDlgGenerated : public wxDialog
@@ -576,7 +581,7 @@ protected:
public:
- CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Access online storage"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
+ CloudSetupDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Access Online Storage"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
~CloudSetupDlgGenerated();
};
@@ -683,17 +688,17 @@ protected:
wxStaticText* m_staticTextTimeRemaining;
wxStaticText* m_staticTextTimeElapsed;
wxStaticText* m_staticTextStatus;
+ wxStaticText* m_staticText1461;
+ wxStaticText* m_staticTextRetryCount;
+ wxStaticText* m_staticText146;
wxBoxSizer* bSizerProgressGraph;
zen::Graph2D* m_panelProgressGraph;
- // Virtual event handlers, overide them in your derived class
- virtual void OnToggleIgnoreErrors( wxCommandEvent& event ) { event.Skip(); }
-
-
public:
- wxBoxSizer* bSizerProgressFooter;
+ wxBoxSizer* bSizerErrorsRetry;
+ wxStaticBitmap* m_bitmapRetryErrors;
+ wxBoxSizer* bSizerErrorsIgnore;
wxStaticBitmap* m_bitmapIgnoreErrors;
- wxCheckBox* m_checkBoxIgnoreErrors;
CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxRAISED_BORDER );
~CompareProgressDlgGenerated();
@@ -709,6 +714,8 @@ private:
protected:
wxBoxSizer* bSizer42;
+ wxStaticText* m_staticText1461;
+ wxStaticText* m_staticText146;
wxStaticText* m_staticText137;
public:
@@ -733,8 +740,11 @@ public:
wxStaticBitmap* m_bitmapGraphKeyItems;
zen::Graph2D* m_panelGraphItems;
wxBoxSizer* bSizerProgressFooter;
+ wxBoxSizer* bSizerErrorsRetry;
+ wxStaticBitmap* m_bitmapRetryErrors;
+ wxStaticText* m_staticTextRetryCount;
+ wxBoxSizer* bSizerErrorsIgnore;
wxStaticBitmap* m_bitmapIgnoreErrors;
- wxCheckBox* m_checkBoxIgnoreErrors;
wxChoice* m_choicePostSyncAction;
wxNotebook* m_notebookResult;
wxStaticLine* m_staticlineFooter;
@@ -785,7 +795,7 @@ private:
protected:
wxStaticBitmap* m_bitmapBatchJob;
- wxStaticText* m_staticTextDescr;
+ wxStaticText* m_staticTextHeader;
wxStaticLine* m_staticline18;
wxPanel* m_panel35;
wxStaticText* m_staticText146;
@@ -904,7 +914,7 @@ public:
fff::FolderHistoryBox* m_targetFolderPath;
wxBitmapButton* m_bpButtonSelectAltTargetFolder;
- CopyToDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Copy items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
+ CopyToDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Copy Items"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1, -1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER );
~CopyToDlgGenerated();
};
@@ -935,20 +945,14 @@ protected:
wxStaticText* m_staticText93;
wxStaticText* m_staticText932;
wxStaticLine* m_staticline39;
- wxStaticText* m_staticText95;
- wxStaticText* m_staticText96;
- wxSpinCtrl* m_spinCtrlAutoRetryCount;
- wxStaticText* m_staticTextAutoRetryDelay;
- wxSpinCtrl* m_spinCtrlAutoRetryDelay;
+ zen::BitmapTextButton* m_buttonResetDialogs;
+ wxStaticText* m_staticTextResetDialogs;
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;
- wxStaticText* m_staticText923;
wxStaticLine* m_staticline36;
wxBoxSizer* bSizerStdButtons;
wxButton* m_buttonDefault;
@@ -957,11 +961,10 @@ protected:
// 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 OnResetDialogs( 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(); }
@@ -1067,7 +1070,7 @@ protected:
wxStaticBitmap* m_bitmapGpl;
wxHyperlinkCtrl* m_hyperlink5;
wxStaticLine* m_staticline37;
- wxStaticText* m_staticText54;
+ wxStaticText* m_staticTextThanksForLoc;
wxScrolledWindow* m_scrolledWindowTranslators;
wxFlexGridSizer* fgSizerTranslators;
wxStaticLine* m_staticline36;
@@ -1170,8 +1173,8 @@ private:
protected:
wxPanel* m_panel35;
- wxStaticText* m_staticText145;
- wxSpinCtrl* m_spinCtrlSyncOverdueDays;
+ wxStaticText* m_staticTextHighlight;
+ wxSpinCtrl* m_spinCtrlOverdueDays;
wxStaticLine* m_staticline21;
wxBoxSizer* bSizerStdButtons;
wxButton* m_buttonOkay;
diff --git a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp
index ee14082a..4a1bebbd 100755
--- a/FreeFileSync/Source/ui/gui_status_handler.cpp
+++ b/FreeFileSync/Source/ui/gui_status_handler.cpp
@@ -23,7 +23,7 @@ using namespace fff;
StatusHandlerTemporaryPanel::StatusHandlerTemporaryPanel(MainDialog& dlg) : mainDlg_(dlg)
{
{
- mainDlg_.compareStatus_->init(*this, false /*ignoreErrors*/); //clear old values before showing panel
+ mainDlg_.compareStatus_->init(*this, false /*ignoreErrors*/, 0 /*automaticRetryCount*/); //clear old values before showing panel
//------------------------------------------------------------------
const wxAuiPaneInfo& topPanel = mainDlg_.auiMgr_.GetPane(mainDlg_.m_panelTopButtons);
@@ -238,7 +238,7 @@ StatusHandlerFloatingDialog::StatusHandlerFloatingDialog(wxFrame* parentDlg,
bool& exitAfterSync,
bool& autoCloseDialog) :
progressDlg_(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, parentDlg, true /*showProgress*/, autoCloseDialog,
-jobName, soundFileSyncComplete, ignoreErrors, PostSyncAction2::NONE)),
+jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, PostSyncAction2::NONE)),
lastSyncsLogFileSizeMax_(lastSyncsLogFileSizeMax),
automaticRetryCount_(automaticRetryCount),
automaticRetryDelay_(automaticRetryDelay),
@@ -285,7 +285,7 @@ StatusHandlerFloatingDialog::~StatusHandlerFloatingDialog()
getBytesTotal(PHASE_SYNCHRONIZING) == 0)
finalStatusMsg = _("Nothing to synchronize"); //even if "ignored conflicts" occurred!
else
- finalStatusMsg = _("Completed");
+ finalStatusMsg = _("Completed successfully");
errorLog_.logMsg(finalStatusMsg, MSG_TYPE_INFO);
}
diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp
index b20b4b08..4a0d4ed1 100755
--- a/FreeFileSync/Source/ui/main_dlg.cpp
+++ b/FreeFileSync/Source/ui/main_dlg.cpp
@@ -52,11 +52,12 @@ using namespace zen;
using namespace fff;
-
namespace
{
-const size_t EXT_APP_MASS_INVOKE_THRESHOLD = 10; //more than this is likely a user mistake (Explorer uses limit of 15)
-const int TOP_BUTTON_OPTIMAL_WIDTH = 180;
+const size_t EXT_APP_MASS_INVOKE_THRESHOLD = 10; //more is likely a user mistake (Explorer uses limit of 15)
+const int TOP_BUTTON_OPTIMAL_WIDTH_DIP = 180;
+const std::chrono::milliseconds LAST_USED_CFG_EXISTENCE_CHECK_TIME_MAX(500);
+const std::chrono::milliseconds FILE_GRID_POST_UPDATE_DELAY(400);
IconBuffer::IconSize convert(FileIconSize isize)
@@ -145,8 +146,8 @@ private:
wxWindow* getParentWindow() override { return &mainDlg_; }
std::unique_ptr<FilterConfig>& getFilterCfgOnClipboardRef() override { return mainDlg_.filterCfgOnClipboard_; }
- void onAltCompCfgChange () override { mainDlg_.applyCompareConfig(false /*setDefaultViewType*/); }
- void onAltSyncCfgChange () override { mainDlg_.applySyncConfig(); }
+ void onLocalCompCfgChange () override { mainDlg_.applyCompareConfig(false /*setDefaultViewType*/); }
+ void onLocalSyncCfgChange () override { mainDlg_.applySyncConfig(); }
void onLocalFilterCfgChange() override { mainDlg_.applyFilterConfig(); } //re-apply filter
MainDialog& mainDlg_;
@@ -176,14 +177,14 @@ public:
m_bpButtonFolderPairOptions->SetBitmapLabel(getResourceImage(L"button_arrow_down"));
}
- void setValues(const FolderPairEnh& fp)
+ void setValues(const LocalPairConfig& lpc)
{
- setConfig(fp.altCmpConfig, fp.altSyncConfig, fp.localFilter);
- folderSelectorLeft_ .setPath(fp.folderPathPhraseLeft_);
- folderSelectorRight_.setPath(fp.folderPathPhraseRight_);
+ setConfig(lpc.localCmpCfg, lpc.localSyncCfg, lpc.localFilter);
+ folderSelectorLeft_ .setPath(lpc.folderPathPhraseLeft);
+ folderSelectorRight_.setPath(lpc.folderPathPhraseRight);
}
- FolderPairEnh getValues() const { return FolderPairEnh(folderSelectorLeft_.getPath(), folderSelectorRight_.getPath(), getAltCompConfig(), getAltSyncConfig(), getAltFilterConfig()); }
+ LocalPairConfig getValues() const { return LocalPairConfig(folderSelectorLeft_.getPath(), folderSelectorRight_.getPath(), getCompConfig(), getSyncConfig(), getFilterConfig()); }
private:
//support for drag and drop
@@ -228,14 +229,14 @@ public:
mainDialog.m_panelTopRight ->Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::onTopFolderPairKeyEvent), nullptr, &mainDialog);
}
- void setValues(const FolderPairEnh& fp)
+ void setValues(const LocalPairConfig& lpc)
{
- setConfig(fp.altCmpConfig, fp.altSyncConfig, fp.localFilter);
- folderSelectorLeft_ .setPath(fp.folderPathPhraseLeft_);
- folderSelectorRight_.setPath(fp.folderPathPhraseRight_);
+ setConfig(lpc.localCmpCfg, lpc.localSyncCfg, lpc.localFilter);
+ folderSelectorLeft_ .setPath(lpc.folderPathPhraseLeft);
+ folderSelectorRight_.setPath(lpc.folderPathPhraseRight);
}
- FolderPairEnh getValues() const { return FolderPairEnh(folderSelectorLeft_.getPath(), folderSelectorRight_.getPath(), getAltCompConfig(), getAltSyncConfig(), getAltFilterConfig()); }
+ LocalPairConfig getValues() const { return LocalPairConfig(folderSelectorLeft_.getPath(), folderSelectorRight_.getPath(), getCompConfig(), getSyncConfig(), getFilterConfig()); }
private:
//support for drag and drop
@@ -258,12 +259,12 @@ void updateTopButton(wxBitmapButton& btn, const wxBitmap& bmp, const wxString& v
const wxImage& iconImage = makeGrey ? greyScale(bmp.ConvertToImage()) : bmp.ConvertToImage();
wxImage dynImage = btn.GetLayoutDirection() != wxLayout_RightToLeft ?
- stackImages(iconImage, descrImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, 5) :
- stackImages(descrImage, iconImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, 5);
+ stackImages(iconImage, descrImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, fastFromDIP(5)) :
+ stackImages(descrImage, iconImage, ImageStackLayout::HORIZONTAL, ImageStackAlignment::CENTER, fastFromDIP(5));
//SetMinSize() instead of SetSize() is needed here for wxWindows layout determination to work correctly
- wxSize minSize = dynImage.GetSize() + wxSize(16, 16); //add border space
- minSize.x = std::max(minSize.x, TOP_BUTTON_OPTIMAL_WIDTH);
+ wxSize minSize = dynImage.GetSize() + wxSize(fastFromDIP(16), fastFromDIP(16)); //add border space
+ minSize.x = std::max(minSize.x, fastFromDIP(TOP_BUTTON_OPTIMAL_WIDTH_DIP));
btn.SetMinSize(minSize);
@@ -312,7 +313,7 @@ void MainDialog::create(const Zstring& globalConfigFilePath)
});
//potentially slow network access: give all checks 500ms to finish
- const bool allFilesAvailable = firstUnavailableFile.timedWait(std::chrono::milliseconds(500)) && //false: time elapsed
+ const bool allFilesAvailable = firstUnavailableFile.timedWait(LAST_USED_CFG_EXISTENCE_CHECK_TIME_MAX) && //false: time elapsed
!firstUnavailableFile.get(); //no missing
if (!allFilesAvailable)
cfgFilePaths.clear(); //we do NOT want to show an error due to last config file missing on application start!
@@ -412,13 +413,18 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath,
m_bpButtonFilterContext->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"button_arrow_right")));
m_bpButtonSyncContext ->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"button_arrow_right")));
- m_bpButtonNew ->SetBitmapLabel(getResourceImage(L"new"));
- m_bpButtonOpen ->SetBitmapLabel(getResourceImage(L"load"));
- m_bpButtonSaveAs ->SetBitmapLabel(getResourceImage(L"sync"));
- m_bpButtonSaveAsBatch->SetBitmapLabel(getResourceImage(L"batch"));
+ m_bpButtonNew ->SetBitmapLabel(getResourceImage(L"file_new"));
+ m_bpButtonOpen ->SetBitmapLabel(getResourceImage(L"file_load"));
+ m_bpButtonSaveAs ->SetBitmapLabel(getResourceImage(L"file_sync"));
+ m_bpButtonSaveAsBatch->SetBitmapLabel(getResourceImage(L"file_batch"));
+
m_bpButtonAddPair ->SetBitmapLabel(getResourceImage(L"item_add"));
m_bpButtonHideSearch ->SetBitmapLabel(getResourceImage(L"close_panel"));
+ m_textCtrlSearchTxt->SetMinSize(wxSize(fastFromDIP(220), -1));
+
+ initViewFilterButtons();
+
//we have to use the OS X naming convention by default, because wxMac permanently populates the display menu when the wxMenuItem is created for the first time!
//=> other wx ports are not that badly programmed; therefore revert:
assert(m_menuItemOptions->GetItemLabel() == _("&Preferences") + L"\tCtrl+,"); //"Ctrl" is automatically mapped to command button!
@@ -446,33 +452,39 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath,
m_panelTopButtons->GetSizer()->SetSizeHints(m_panelTopButtons); //~=Fit() + SetMinSize()
setBitmapTextLabel(*m_buttonCancel, wxImage(), m_buttonCancel->GetLabel()); //we can't use a wxButton for cancel: it's rendered smaller on OS X than a wxBitmapButton!
- m_buttonCancel->SetMinSize(wxSize(std::max(m_buttonCancel->GetSize().x, TOP_BUTTON_OPTIMAL_WIDTH),
+ m_buttonCancel->SetMinSize(wxSize(std::max(m_buttonCancel->GetSize().x, fastFromDIP(TOP_BUTTON_OPTIMAL_WIDTH_DIP)),
std::max(m_buttonCancel->GetSize().y, m_buttonCompare->GetSize().y)));
auiMgr_.AddPane(m_panelTopButtons,
- wxAuiPaneInfo().Name(L"TopPanel").Layer(2).Top().Row(1).Caption(_("Main Bar")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(TOP_BUTTON_OPTIMAL_WIDTH, m_panelTopButtons->GetSize().GetHeight()));
+ wxAuiPaneInfo().Name(L"TopPanel").Layer(2).Top().Row(1).Caption(_("Main Bar")).CaptionVisible(false).
+ PaneBorder(false).Gripper().MinSize(fastFromDIP(TOP_BUTTON_OPTIMAL_WIDTH_DIP), m_panelTopButtons->GetSize().GetHeight()));
//note: min height is calculated incorrectly by wxAuiManager if panes with and without caption are in the same row => use smaller min-size
auiMgr_.AddPane(compareStatus_->getAsWindow(),
- wxAuiPaneInfo().Name(L"ProgressPanel").Layer(2).Top().Row(2).CaptionVisible(false).PaneBorder(false).Hide()
+ wxAuiPaneInfo().Name(L"ProgressPanel").Layer(2).Top().Row(2).CaptionVisible(false).PaneBorder(false).Hide().
//wxAui does not consider the progress panel's wxRAISED_BORDER and set's too small a panel height! => use correct value from wxWindow::GetSize()
- .MinSize(200, compareStatus_->getAsWindow()->GetSize().GetHeight())); //bonus: minimal height isn't a bad idea anyway
+ MinSize(-1, compareStatus_->getAsWindow()->GetSize().GetHeight())); //bonus: minimal height isn't a bad idea anyway
}
auiMgr_.AddPane(m_panelDirectoryPairs,
wxAuiPaneInfo().Name(L"FoldersPanel").Layer(2).Top().Row(3).Caption(_("Folder Pairs")).CaptionVisible(false).PaneBorder(false).Gripper());
auiMgr_.AddPane(m_panelSearch,
- wxAuiPaneInfo().Name(L"SearchPanel").Layer(2).Bottom().Row(2).Caption(_("Find")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(200, m_bpButtonHideSearch->GetSize().GetHeight()).Hide());
+ wxAuiPaneInfo().Name(L"SearchPanel").Layer(2).Bottom().Row(2).Caption(_("Find")).CaptionVisible(false).PaneBorder(false).Gripper().
+ MinSize(fastFromDIP(100), m_panelSearch->GetSize().y).Hide());
+ m_panelViewFilter->GetSizer()->SetSizeHints(m_panelViewFilter); //~=Fit() + SetMinSize()
auiMgr_.AddPane(m_panelViewFilter,
- wxAuiPaneInfo().Name(L"ViewFilterPanel").Layer(2).Bottom().Row(1).Caption(_("View Settings")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(m_bpButtonViewTypeSyncAction->GetSize().GetWidth(), m_panelViewFilter->GetSize().GetHeight()));
+ wxAuiPaneInfo().Name(L"ViewFilterPanel").Layer(2).Bottom().Row(1).Caption(_("View Settings")).CaptionVisible(false).
+ PaneBorder(false).Gripper().MinSize(fastFromDIP(100), m_panelViewFilter->GetSize().y));
+ m_panelConfig->GetSizer()->SetSizeHints(m_panelConfig); //~=Fit() + SetMinSize()
auiMgr_.AddPane(m_panelConfig,
wxAuiPaneInfo().Name(L"ConfigPanel").Layer(3).Left().Position(1).Caption(_("Configuration")).MinSize(bSizerCfgHistoryButtons->GetSize()));
auiMgr_.AddPane(m_gridOverview,
- wxAuiPaneInfo().Name(L"OverviewPanel").Layer(3).Left().Position(2).Caption(_("Overview")).MinSize(300, m_gridOverview->GetSize().GetHeight())); //MinSize(): just default size, see comment below
+ wxAuiPaneInfo().Name(L"OverviewPanel").Layer(3).Left().Position(2).Caption(_("Overview")).
+ MinSize(fastFromDIP(300), m_gridOverview->GetSize().GetHeight())); //MinSize(): just default size, see comment below
auiMgr_.Update();
@@ -482,7 +494,7 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath,
font.SetWeight(wxFONTWEIGHT_BOLD);
font.SetPointSize(wxNORMAL_FONT->GetPointSize()); //= larger than the wxAuiDockArt default; looks better on OS X
artProvider->SetFont(wxAUI_DOCKART_CAPTION_FONT, font);
- artProvider->SetMetric(wxAUI_DOCKART_CAPTION_SIZE, font.GetPixelSize().GetHeight() + 2 + 2);
+ artProvider->SetMetric(wxAUI_DOCKART_CAPTION_SIZE, font.GetPixelSize().GetHeight() + fastFromDIP(2 + 2));
//- fix wxWidgets 3.1.0 insane color scheme
artProvider->SetColor(wxAUI_DOCKART_INACTIVE_CAPTION_COLOUR, wxColor(220, 220, 220)); //light grey
@@ -561,23 +573,23 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath,
m_bitmapSmallFileRight ->SetBitmap(bmpFile);
}
- m_menuItemNew ->SetBitmap(getResourceImage(L"new_small"));
- m_menuItemLoad ->SetBitmap(getResourceImage(L"load_small"));
- m_menuItemSave ->SetBitmap(getResourceImage(L"save_small"));
- m_menuItemSaveAsBatch->SetBitmap(getResourceImage(L"batch_small"));
+ m_menuItemNew ->SetBitmap(getResourceImage(L"file_new_sicon"));
+ m_menuItemLoad ->SetBitmap(getResourceImage(L"file_load_sicon"));
+ m_menuItemSave ->SetBitmap(getResourceImage(L"file_save_sicon"));
+ m_menuItemSaveAsBatch->SetBitmap(getResourceImage(L"file_batch_sicon"));
- m_menuItemCompare ->SetBitmap(getResourceImage(L"compare_small"));
- m_menuItemCompSettings->SetBitmap(getResourceImage(L"cfg_compare_small"));
- m_menuItemFilter ->SetBitmap(getResourceImage(L"filter_small"));
- m_menuItemSyncSettings->SetBitmap(getResourceImage(L"cfg_sync_small"));
- m_menuItemSynchronize ->SetBitmap(getResourceImage(L"sync_small"));
+ m_menuItemCompare ->SetBitmap(getResourceImage(L"compare_sicon"));
+ m_menuItemCompSettings->SetBitmap(getResourceImage(L"cfg_compare_sicon"));
+ m_menuItemFilter ->SetBitmap(getResourceImage(L"cfg_filter_sicon"));
+ m_menuItemSyncSettings->SetBitmap(getResourceImage(L"cfg_sync_sicon"));
+ m_menuItemSynchronize ->SetBitmap(getResourceImage(L"file_sync_sicon"));
- m_menuItemOptions ->SetBitmap(getResourceImage(L"settings_small"));
- m_menuItemFind ->SetBitmap(getResourceImage(L"find_small"));
+ m_menuItemOptions ->SetBitmap(getResourceImage(L"settings_sicon"));
+ m_menuItemFind ->SetBitmap(getResourceImage(L"find_sicon"));
- m_menuItemHelp ->SetBitmap(getResourceImage(L"help_small"));
- m_menuItemAbout->SetBitmap(getResourceImage(L"about_small"));
- m_menuItemCheckVersionNow->SetBitmap(getResourceImage(L"update_check_small"));
+ m_menuItemHelp ->SetBitmap(getResourceImage(L"help_sicon"));
+ m_menuItemAbout->SetBitmap(getResourceImage(L"about_sicon"));
+ m_menuItemCheckVersionNow->SetBitmap(getResourceImage(L"update_check_sicon"));
//create language selection menu
for (const TranslationInfo& ti : getExistingTranslations())
@@ -634,8 +646,6 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath,
//init handling of first folder pair
firstFolderPair_ = std::make_unique<FolderPairFirst>(*this);
- initViewFilterButtons();
-
//init grid settings
filegrid::init(*m_gridMainL, *m_gridMainC, *m_gridMainR);
treegrid::init(*m_gridOverview);
@@ -652,7 +662,7 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath,
m_gridOverview->getMainWin().Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::onTreeButtonEvent), nullptr, this);
- //enable dialog-specific key local events
+ //enable dialog-specific key events
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::onLocalKeyEvent), nullptr, this);
//drag and drop .ffs_gui and .ffs_batch on main dialog
@@ -717,10 +727,10 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath,
std::vector<AbstractPath> folderPathsToCheck;
- auto addFolderCheck = [&](const FolderPairEnh& fp)
+ auto addFolderCheck = [&](const LocalPairConfig& lpc)
{
- const AbstractPath folderPathL = createAbstractPath(fp.folderPathPhraseLeft_);
- const AbstractPath folderPathR = createAbstractPath(fp.folderPathPhraseRight_);
+ const AbstractPath folderPathL = createAbstractPath(lpc.folderPathPhraseLeft);
+ const AbstractPath folderPathR = createAbstractPath(lpc.folderPathPhraseRight);
if (AFS::isNullPath(folderPathL) != AFS::isNullPath(folderPathR)) //only skip check if both sides are empty!
havePartialPair = true;
@@ -734,8 +744,8 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath,
};
addFolderCheck(currMainCfg.firstPair);
- for (const FolderPairEnh& fp : currMainCfg.additionalPairs)
- addFolderCheck(fp);
+ for (const LocalPairConfig& lpc : currMainCfg.additionalPairs)
+ addFolderCheck(lpc);
//------------------------------------------------------------------------------------------
if (havePartialPair != haveFullPair) //either all pairs full or all half-filled -> validity check!
@@ -875,8 +885,11 @@ void MainDialog::setGlobalCfgOnInit(const XmlGlobalSettings& globalSettings)
else
Center();
}
- else
+ else //default window size and position
+ {
+ SetClientSize(wxSize(fastFromDIP(900), fastFromDIP(550))); //=~ 900 x 600 total size
Center();
+ }
if (globalSettings.gui.mainDlg.isMaximized) //no real need to support both maximize and full screen functions
{
@@ -1150,7 +1163,7 @@ std::vector<FileSystemObject*> MainDialog::getTreeSelection() const
if (auto root = dynamic_cast<const TreeView::RootNode*>(node.get()))
{
//selecting root means "select everything", *ignoring* current view filter!
- BaseFolderPair& baseDir = root->baseFolder_;
+ BaseFolderPair& baseDir = root->baseFolder;
std::vector<FileSystemObject*> dirsFilesAndLinks;
@@ -1164,9 +1177,9 @@ std::vector<FileSystemObject*> MainDialog::getTreeSelection() const
append(output, dirsFilesAndLinks);
}
else if (auto dir = dynamic_cast<const TreeView::DirNode*>(node.get()))
- output.push_back(&(dir->folder_));
+ output.push_back(&(dir->folder));
else if (auto file = dynamic_cast<const TreeView::FilesNode*>(node.get()))
- append(output, file->filesAndLinks_);
+ append(output, file->filesAndLinks);
else assert(false);
}
return output;
@@ -1390,8 +1403,8 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool
if (selectionLeft.empty() && selectionRight.empty())
return openFolderInFileBrowser(leftSide ?
- createAbstractPath(firstFolderPair_->getValues().folderPathPhraseLeft_) :
- createAbstractPath(firstFolderPair_->getValues().folderPathPhraseRight_));
+ createAbstractPath(firstFolderPair_->getValues().folderPathPhraseLeft) :
+ createAbstractPath(firstFolderPair_->getValues().folderPathPhraseRight));
//in this context either left or right selection is filled with exactly one item
if (!selectionLeft.empty())
{
@@ -1662,8 +1675,7 @@ void MainDialog::enableAllElements()
m_panelTopButtons->Enable();
m_panelTopButtons->Layout();
- //at least wxWidgets on OS X fails to do this after enabling:
- Refresh();
+ Refresh(); //at least wxWidgets on OS X fails to do this after enabling:
}
@@ -1698,11 +1710,11 @@ void MainDialog::OnResizeConfigPanel(wxEvent& event)
void MainDialog::OnResizeViewPanel(wxEvent& event)
{
//we need something more fancy for the statistics:
- const int parentOrient = m_panelViewFilter->GetSize().GetWidth() > m_panelViewFilter->GetSize().GetHeight() ? wxHORIZONTAL : wxVERTICAL; //check window NOT sizer width!
- if (bSizerViewFilter->GetOrientation() != parentOrient)
+ const int newOrientation = m_panelViewFilter->GetSize().GetWidth() > m_panelViewFilter->GetSize().GetHeight() ? wxHORIZONTAL : wxVERTICAL; //check window NOT sizer width!
+ if (bSizerViewFilter->GetOrientation() != newOrientation)
{
//apply opposite orientation for child sizers
- const int childOrient = parentOrient == wxHORIZONTAL ? wxVERTICAL : wxHORIZONTAL;
+ const int childOrient = newOrientation == wxHORIZONTAL ? wxVERTICAL : wxHORIZONTAL;
wxSizerItemList& sl = bSizerStatistics->GetChildren();
for (auto it = sl.begin(); it != sl.end(); ++it) //yet another wxWidgets bug keeps us from using std::for_each
{
@@ -1712,8 +1724,8 @@ void MainDialog::OnResizeViewPanel(wxEvent& event)
sizerChild->SetOrientation(childOrient);
}
- bSizerStatistics->SetOrientation(parentOrient);
- bSizerViewFilter->SetOrientation(parentOrient);
+ bSizerStatistics->SetOrientation(newOrientation);
+ bSizerViewFilter->SetOrientation(newOrientation);
m_panelViewFilter->Layout();
m_panelStatistics->Layout();
}
@@ -1995,18 +2007,18 @@ void MainDialog::onTreeGridSelection(GridSelectEvent& event)
if (std::unique_ptr<TreeView::Node> node = treegrid::getDataView(*m_gridOverview).getLine(event.rowFirst_))
{
if (const TreeView::RootNode* root = dynamic_cast<const TreeView::RootNode*>(node.get()))
- leadRow = filegrid::getDataView(*m_gridMainC).findRowFirstChild(&(root->baseFolder_));
+ leadRow = filegrid::getDataView(*m_gridMainC).findRowFirstChild(&(root->baseFolder));
else if (const TreeView::DirNode* dir = dynamic_cast<const TreeView::DirNode*>(node.get()))
{
- leadRow = filegrid::getDataView(*m_gridMainC).findRowDirect(&(dir->folder_));
+ leadRow = filegrid::getDataView(*m_gridMainC).findRowDirect(&(dir->folder));
if (leadRow < 0) //directory was filtered out! still on tree view (but NOT on grid view)
- leadRow = filegrid::getDataView(*m_gridMainC).findRowFirstChild(&(dir->folder_));
+ leadRow = filegrid::getDataView(*m_gridMainC).findRowFirstChild(&(dir->folder));
}
else if (const TreeView::FilesNode* files = dynamic_cast<const TreeView::FilesNode*>(node.get()))
{
- assert(!files->filesAndLinks_.empty());
- if (!files->filesAndLinks_.empty())
- leadRow = filegrid::getDataView(*m_gridMainC).findRowDirect(files->filesAndLinks_[0]->getId());
+ assert(!files->filesAndLinks.empty());
+ if (!files->filesAndLinks.empty())
+ leadRow = filegrid::getDataView(*m_gridMainC).findRowDirect(files->filesAndLinks[0]->getId());
}
}
@@ -2029,11 +2041,11 @@ void MainDialog::onTreeGridSelection(GridSelectEvent& event)
if (std::unique_ptr<TreeView::Node> node = treegrid::getDataView(*m_gridOverview).getLine(row))
{
if (const TreeView::RootNode* root = dynamic_cast<const TreeView::RootNode*>(node.get()))
- markedContainer.insert(&(root->baseFolder_));
+ markedContainer.insert(&(root->baseFolder));
else if (const TreeView::DirNode* dir = dynamic_cast<const TreeView::DirNode*>(node.get()))
- markedContainer.insert(&(dir->folder_));
+ markedContainer.insert(&(dir->folder));
else if (const TreeView::FilesNode* files = dynamic_cast<const TreeView::FilesNode*>(node.get()))
- markedFilesAndLinks.insert(files->filesAndLinks_.begin(), files->filesAndLinks_.end());
+ markedFilesAndLinks.insert(files->filesAndLinks.begin(), files->filesAndLinks.end());
}
filegrid::setNavigationMarker(*m_gridMainL, std::move(markedFilesAndLinks), std::move(markedContainer));
@@ -2104,8 +2116,8 @@ void MainDialog::onTreeGridContext(GridClickEvent& event)
[this, &selection, include] { filterItems(selection, include); }, &getResourceImage(iconName));
}
};
- addFilterMenu(_("Include via filter:"), L"filter_include_small", true);
- addFilterMenu(_("Exclude via filter:"), L"filter_exclude_small", false);
+ addFilterMenu(_("Include via filter:"), L"filter_include_sicon", true);
+ addFilterMenu(_("Exclude via filter:"), L"filter_exclude_sicon", false);
//----------------------------------------------------------------------------------------------------
if (!selection.empty())
@@ -2239,8 +2251,8 @@ void MainDialog::onMainGridContextRim(bool leftSide)
[this, &selection, include] { filterItems(selection, include); }, &getResourceImage(iconName));
}
};
- addFilterMenu(_("Include via filter:"), L"filter_include_small", true);
- addFilterMenu(_("Exclude via filter:"), L"filter_exclude_small", false);
+ addFilterMenu(_("Include via filter:"), L"filter_include_sicon", true);
+ addFilterMenu(_("Exclude via filter:"), L"filter_exclude_sicon", false);
//----------------------------------------------------------------------------------------------------
@@ -2611,9 +2623,9 @@ void MainDialog::OnCompSettingsContext(wxEvent& event)
const wxBitmap iconGrey = greyScale(iconNormal);
menu.addItem(getVariantName(cmpVar), [&setVariant, cmpVar] { setVariant(cmpVar); }, activeCmpVar == cmpVar ? &iconNormal : &iconGrey);
};
- addVariantItem(CompareVariant::TIME_SIZE, L"file-time-small");
- addVariantItem(CompareVariant::CONTENT, L"file-content-small");
- addVariantItem(CompareVariant::SIZE, L"file-size-small");
+ addVariantItem(CompareVariant::TIME_SIZE, L"cmp_file_time_sicon");
+ addVariantItem(CompareVariant::CONTENT, L"cmp_file_content_sicon");
+ addVariantItem(CompareVariant::SIZE, L"cmp_file_size_sicon");
//menu.addRadio(getVariantName(CompareVariant::TIME_SIZE), [&] { setVariant(CompareVariant::TIME_SIZE); }, activeCmpVar == CompareVariant::TIME_SIZE);
//menu.addRadio(getVariantName(CompareVariant::CONTENT ), [&] { setVariant(CompareVariant::CONTENT); }, activeCmpVar == CompareVariant::CONTENT);
@@ -2718,7 +2730,7 @@ void MainDialog::updateUnsavedCfgStatus()
return img;
};
- setImage(*m_bpButtonSave, allowSave ? getResourceImage(L"save") : makeBrightGrey(getResourceImage(L"save")));
+ setImage(*m_bpButtonSave, allowSave ? getResourceImage(L"file_save") : makeBrightGrey(getResourceImage(L"file_save")));
m_bpButtonSave->Enable(allowSave);
m_menuItemSave->Enable(allowSave); //bitmap is automatically greyscaled on Win7 (introducing a crappy looking shift), but not on XP
@@ -3309,8 +3321,6 @@ XmlGuiConfig MainDialog::getConfig() const
void MainDialog::updateGuiDelayedIf(bool condition)
{
- const int delay = 400;
-
if (condition)
{
filegrid::refresh(*m_gridMainL, *m_gridMainC, *m_gridMainR);
@@ -3318,7 +3328,8 @@ void MainDialog::updateGuiDelayedIf(bool condition)
m_gridMainC->Update();
m_gridMainR->Update();
- wxMilliSleep(delay); //some delay to show the changed GUI before removing rows from sight
+ //some delay to show the changed GUI before removing rows from sight
+ std::this_thread::sleep_for(FILE_GRID_POST_UPDATE_DELAY);
}
updateGui();
@@ -3327,144 +3338,120 @@ void MainDialog::updateGuiDelayedIf(bool condition)
void MainDialog::showConfigDialog(SyncConfigPanel panelToShow, int localPairIndexToShow)
{
- std::vector<LocalPairConfig> folderPairConfig;
- auto addPairCfg = [&](const FolderPairEnh& fp)
- {
- LocalPairConfig fpCfg;
- fpCfg.folderPairName = getShortDisplayNameForFolderPair(createAbstractPath(fp.folderPathPhraseLeft_ ),
- createAbstractPath(fp.folderPathPhraseRight_));
- fpCfg.altCmpConfig = fp.altCmpConfig;
- fpCfg.altSyncConfig = fp.altSyncConfig;
- fpCfg.localFilter = fp.localFilter;
- folderPairConfig.push_back(fpCfg);
- };
+ GlobalPairConfig globalPairCfg;
+ globalPairCfg.cmpConfig = currentCfg_.mainCfg.cmpConfig;
+ globalPairCfg.syncCfg = currentCfg_.mainCfg.syncCfg;
+ globalPairCfg.filter = currentCfg_.mainCfg.globalFilter;
+
+ globalPairCfg.miscCfg.ignoreErrors = currentCfg_.mainCfg.ignoreErrors;
+ globalPairCfg.miscCfg.automaticRetryCount = currentCfg_.mainCfg.automaticRetryCount;
+ globalPairCfg.miscCfg.automaticRetryDelay = currentCfg_.mainCfg.automaticRetryDelay;
+ globalPairCfg.miscCfg.postSyncCommand = currentCfg_.mainCfg.postSyncCommand;
+ globalPairCfg.miscCfg.postSyncCondition = currentCfg_.mainCfg.postSyncCondition;
+ globalPairCfg.miscCfg.commandHistory = globalCfg_.gui.commandHistory;
//don't recalculate value but consider current screen status!!!
//e.g. it's possible that the first folder pair local config is shown with all config initial if user just removed local config via mouse context menu!
- const bool showLocalCfgFirstPair = m_bpButtonAltCompCfg->IsShown();
+ const bool showLocalCfg = m_bpButtonLocalCompCfg->IsShown();
//harmonize with MainDialog::updateGuiForFolderPair()!
- assert(m_bpButtonAltCompCfg->IsShown() == m_bpButtonAltSyncCfg->IsShown() &&
- m_bpButtonAltCompCfg->IsShown() == m_bpButtonLocalFilter->IsShown());
+ assert(m_bpButtonLocalCompCfg->IsShown() == m_bpButtonLocalSyncCfg->IsShown() &&
+ m_bpButtonLocalCompCfg->IsShown() == m_bpButtonLocalFilter->IsShown());
- if (showLocalCfgFirstPair)
+ std::vector<LocalPairConfig> localCfgs;
+ if (showLocalCfg)
{
- addPairCfg(firstFolderPair_->getValues());
+ localCfgs.push_back(firstFolderPair_->getValues());
+
for (const FolderPairPanel* panel : additionalFolderPairs_)
- addPairCfg(panel->getValues());
+ localCfgs.push_back(panel->getValues());
}
//------------------------------------------------
-
- const std::vector<LocalPairConfig> folderPairConfigOld = folderPairConfig;
-
- const CompConfig cmpCfgOld = currentCfg_.mainCfg.cmpConfig;
- const SyncConfig syncCfgOld = currentCfg_.mainCfg.syncCfg;
- const FilterConfig filterCfgOld = currentCfg_.mainCfg.globalFilter;
-
- const bool ignoreErrorsOld = currentCfg_.mainCfg.ignoreErrors;
- const Zstring postSyncCommandOld = currentCfg_.mainCfg.postSyncCommand;
- const PostSyncCondition postSyncConditionOld = currentCfg_.mainCfg.postSyncCondition;
- const std::vector<Zstring> commandHistoryOld = globalCfg_.gui.commandHistory;
+ const GlobalPairConfig globalPairCfgOld = globalPairCfg;
+ const std::vector<LocalPairConfig> localPairCfgOld = localCfgs;
if (showSyncConfigDlg(this,
panelToShow,
localPairIndexToShow,
- folderPairConfig,
+ globalPairCfg,
+ localCfgs,
+ globalCfg_.gui.commandHistItemsMax) != ReturnSyncConfig::BUTTON_OKAY)
+ return;
- currentCfg_.mainCfg.cmpConfig,
- currentCfg_.mainCfg.syncCfg,
- currentCfg_.mainCfg.globalFilter,
+ assert(localCfgs.size() == localPairCfgOld.size());
- currentCfg_.mainCfg.ignoreErrors,
- currentCfg_.mainCfg.postSyncCommand,
- currentCfg_.mainCfg.postSyncCondition,
- globalCfg_.gui.commandHistory,
- globalCfg_.gui.commandHistItemsMax) == ReturnSyncConfig::BUTTON_OKAY)
- {
- assert(folderPairConfig.size() == folderPairConfigOld.size());
+ currentCfg_.mainCfg.cmpConfig = globalPairCfg.cmpConfig;
+ currentCfg_.mainCfg.syncCfg = globalPairCfg.syncCfg;
+ currentCfg_.mainCfg.globalFilter = globalPairCfg.filter;
- if (showLocalCfgFirstPair)
- {
- {
- auto fp = firstFolderPair_->getValues();
- fp.altCmpConfig = folderPairConfig[0].altCmpConfig;
- fp.altSyncConfig = folderPairConfig[0].altSyncConfig;
- fp.localFilter = folderPairConfig[0].localFilter;
- firstFolderPair_->setValues(fp);
- }
+ currentCfg_.mainCfg.ignoreErrors = globalPairCfg.miscCfg.ignoreErrors;
+ currentCfg_.mainCfg.automaticRetryCount = globalPairCfg.miscCfg.automaticRetryCount;
+ currentCfg_.mainCfg.automaticRetryDelay = globalPairCfg.miscCfg.automaticRetryDelay;
+ currentCfg_.mainCfg.postSyncCommand = globalPairCfg.miscCfg.postSyncCommand;
+ currentCfg_.mainCfg.postSyncCondition = globalPairCfg.miscCfg.postSyncCondition;
+ globalCfg_.gui.commandHistory = globalPairCfg.miscCfg.commandHistory;
- for (size_t i = 1; i < folderPairConfig.size(); ++i)
- {
- auto fp = additionalFolderPairs_[i - 1]->getValues();
- fp.altCmpConfig = folderPairConfig[i].altCmpConfig;
- fp.altSyncConfig = folderPairConfig[i].altSyncConfig;
- fp.localFilter = folderPairConfig[i].localFilter;
- additionalFolderPairs_[i - 1]->setValues(fp);
- }
- }
+ if (showLocalCfg)
+ {
+ firstFolderPair_->setValues(localCfgs[0]);
- //------------------------------------------------
+ for (size_t i = 1; i < localCfgs.size(); ++i)
+ additionalFolderPairs_[i - 1]->setValues(localCfgs[i]);
+ }
- const bool cmpConfigChanged = currentCfg_.mainCfg.cmpConfig != cmpCfgOld || [&]
- {
- for (size_t i = 0; i < folderPairConfig.size(); ++i)
- {
- if ((folderPairConfig[i].altCmpConfig.get() == nullptr) != (folderPairConfigOld[i].altCmpConfig.get() == nullptr))
- return true;
- if (folderPairConfig[i].altCmpConfig.get())
- if (*folderPairConfig[i].altCmpConfig != *folderPairConfigOld[i].altCmpConfig)
- return true;
- }
- return false;
- }();
+ //------------------------------------------------
- const bool syncConfigChanged = currentCfg_.mainCfg.syncCfg != syncCfgOld || [&]
- {
- for (size_t i = 0; i < folderPairConfig.size(); ++i)
- {
- if ((folderPairConfig[i].altSyncConfig.get() == nullptr) != (folderPairConfigOld[i].altSyncConfig.get() == nullptr))
- return true;
- if (folderPairConfig[i].altSyncConfig.get())
- if (*folderPairConfig[i].altSyncConfig != *folderPairConfigOld[i].altSyncConfig)
- return true;
- }
- return false;
- }();
+ const bool cmpConfigChanged = globalPairCfg.cmpConfig != globalPairCfgOld.cmpConfig || [&]
+ {
+ for (size_t i = 0; i < localCfgs.size(); ++i)
+ if (localCfgs[i].localCmpCfg != localPairCfgOld[i].localCmpCfg)
+ return true;
+ return false;
+ }();
- const bool filterConfigChanged = currentCfg_.mainCfg.globalFilter != filterCfgOld || [&]
- {
- for (size_t i = 0; i < folderPairConfig.size(); ++i)
- if (folderPairConfig[i].localFilter != folderPairConfigOld[i].localFilter)
- return true;
- return false;
- }();
+ const bool syncConfigChanged = globalPairCfg.syncCfg != globalPairCfgOld.syncCfg || [&]
+ {
+ for (size_t i = 0; i < localCfgs.size(); ++i)
+ if (localCfgs[i].localSyncCfg != localPairCfgOld[i].localSyncCfg)
+ return true;
+ return false;
+ }();
- const bool miscConfigChanged = currentCfg_.mainCfg.ignoreErrors != ignoreErrorsOld ||
- currentCfg_.mainCfg.postSyncCommand != postSyncCommandOld ||
- currentCfg_.mainCfg.postSyncCondition != postSyncConditionOld;
- //globalCfg.gui.commandHistory != commandHistoryOld;
+ const bool filterConfigChanged = globalPairCfg.filter != globalPairCfgOld.filter || [&]
+ {
+ for (size_t i = 0; i < localCfgs.size(); ++i)
+ if (localCfgs[i].localFilter != localPairCfgOld[i].localFilter)
+ return true;
+ return false;
+ }();
- //------------------------------------------------
+ const bool miscConfigChanged = globalPairCfg.miscCfg.ignoreErrors != globalPairCfgOld.miscCfg.ignoreErrors ||
+ globalPairCfg.miscCfg.automaticRetryCount != globalPairCfgOld.miscCfg.automaticRetryCount ||
+ globalPairCfg.miscCfg.automaticRetryDelay != globalPairCfgOld.miscCfg.automaticRetryDelay ||
+ globalPairCfg.miscCfg.postSyncCommand != globalPairCfgOld.miscCfg.postSyncCommand ||
+ globalPairCfg.miscCfg.postSyncCondition != globalPairCfgOld.miscCfg.postSyncCondition;
+ //globalPairCfg.miscCfg.commandHistory != globalPairCfgOld.miscCfg.commandHistory;
- if (cmpConfigChanged)
- {
- const bool setDefaultViewType = currentCfg_.mainCfg.cmpConfig.compareVar != cmpCfgOld.compareVar;
- applyCompareConfig(setDefaultViewType);
- }
+ //------------------------------------------------
- if (syncConfigChanged)
- applySyncConfig();
+ if (cmpConfigChanged)
+ {
+ const bool setDefaultViewType = globalPairCfg.cmpConfig.compareVar != globalPairCfgOld.cmpConfig.compareVar;
+ applyCompareConfig(setDefaultViewType);
+ }
- if (filterConfigChanged)
- {
- updateGlobalFilterButton(); //refresh global filter icon
- applyFilterConfig(); //re-apply filter
- }
+ if (syncConfigChanged)
+ applySyncConfig();
- if (miscConfigChanged)
- updateUnsavedCfgStatus(); //usually included by: updateGui();
+ if (filterConfigChanged)
+ {
+ updateGlobalFilterButton(); //refresh global filter icon
+ applyFilterConfig(); //re-apply filter
}
+
+ if (miscConfigChanged)
+ updateUnsavedCfgStatus(); //usually included by: updateGui();
}
@@ -3518,19 +3505,24 @@ void MainDialog::OnToggleViewButton(wxCommandEvent& event)
inline
-wxBitmap buttonPressed(const std::string& name)
+wxBitmap buttonPressed(const wchar_t* name)
{
- wxBitmap background = getResourceImage(L"buttonPressed");
- return mirrorIfRtl(layOver(background, getResourceImage(utfTo<wxString>(name))));
+ wxBitmap background = getResourceImage(L"button_pressed");
+ return mirrorIfRtl(layOver(background, getResourceImage(name)));
}
inline
-wxBitmap buttonReleased(const std::string& name)
+wxBitmap buttonReleased(const wchar_t* name)
{
- wxImage output = getResourceImage(utfTo<wxString>(name)).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally!
+ wxImage output = getResourceImage(name).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally!
//moveImage(output, 1, 0); //move image right one pixel
+ //enlarge (needed for m_bpButtonShowExcluded)
+ const wxSize diff = getResourceImage(L"button_pressed").GetSize() - output.GetSize();
+ if (diff != wxSize())
+ output.Resize(diff + output.GetSize(), wxPoint(diff.x, diff.y) / 2);
+
brighten(output, 80);
return mirrorIfRtl(output);
}
@@ -3538,30 +3530,31 @@ wxBitmap buttonReleased(const std::string& name)
void MainDialog::initViewFilterButtons()
{
- m_bpButtonViewTypeSyncAction->init(getResourceImage(L"viewtype_sync_action"), getResourceImage(L"viewtype_cmp_result"));
+ m_bpButtonViewTypeSyncAction->init(mirrorIfRtl(getResourceImage(L"viewtype_sync_action")),
+ mirrorIfRtl(getResourceImage(L"viewtype_cmp_result")));
//tooltip is updated dynamically in setViewTypeSyncAction()
- auto initButton = [](ToggleButton& btn, const char* imgName, const wxString& tooltip) { btn.init(buttonPressed(imgName), buttonReleased(imgName)); btn.SetToolTip(tooltip); };
+ auto initButton = [](ToggleButton& btn, const wchar_t* imgName, const wxString& tooltip) { btn.init(buttonPressed(imgName), buttonReleased(imgName)); btn.SetToolTip(tooltip); };
//compare result buttons
- initButton(*m_bpButtonShowLeftOnly, "cat_left_only", _("Show files that exist on left side only"));
- initButton(*m_bpButtonShowRightOnly, "cat_right_only", _("Show files that exist on right side only"));
- initButton(*m_bpButtonShowLeftNewer, "cat_left_newer", _("Show files that are newer on left"));
- initButton(*m_bpButtonShowRightNewer, "cat_right_newer", _("Show files that are newer on right"));
- initButton(*m_bpButtonShowEqual, "cat_equal", _("Show files that are equal"));
- initButton(*m_bpButtonShowDifferent, "cat_different", _("Show files that are different"));
- initButton(*m_bpButtonShowConflict, "cat_conflict", _("Show conflicts"));
+ initButton(*m_bpButtonShowLeftOnly, L"cat_left_only", _("Show files that exist on left side only"));
+ initButton(*m_bpButtonShowRightOnly, L"cat_right_only", _("Show files that exist on right side only"));
+ initButton(*m_bpButtonShowLeftNewer, L"cat_left_newer", _("Show files that are newer on left"));
+ initButton(*m_bpButtonShowRightNewer, L"cat_right_newer", _("Show files that are newer on right"));
+ initButton(*m_bpButtonShowEqual, L"cat_equal", _("Show files that are equal"));
+ initButton(*m_bpButtonShowDifferent, L"cat_different", _("Show files that are different"));
+ initButton(*m_bpButtonShowConflict, L"cat_conflict", _("Show conflicts"));
//sync preview buttons
- initButton(*m_bpButtonShowCreateLeft, "so_create_left", _("Show files that will be created on the left side"));
- initButton(*m_bpButtonShowCreateRight, "so_create_right", _("Show files that will be created on the right side"));
- initButton(*m_bpButtonShowDeleteLeft, "so_delete_left", _("Show files that will be deleted on the left side"));
- initButton(*m_bpButtonShowDeleteRight, "so_delete_right", _("Show files that will be deleted on the right side"));
- initButton(*m_bpButtonShowUpdateLeft, "so_update_left", _("Show files that will be updated on the left side"));
- initButton(*m_bpButtonShowUpdateRight, "so_update_right", _("Show files that will be updated on the right side"));
- initButton(*m_bpButtonShowDoNothing, "so_none", _("Show files that won't be copied"));
+ initButton(*m_bpButtonShowCreateLeft, L"so_create_left", _("Show files that will be created on the left side"));
+ initButton(*m_bpButtonShowCreateRight, L"so_create_right", _("Show files that will be created on the right side"));
+ initButton(*m_bpButtonShowDeleteLeft, L"so_delete_left", _("Show files that will be deleted on the left side"));
+ initButton(*m_bpButtonShowDeleteRight, L"so_delete_right", _("Show files that will be deleted on the right side"));
+ initButton(*m_bpButtonShowUpdateLeft, L"so_update_left", _("Show files that will be updated on the left side"));
+ initButton(*m_bpButtonShowUpdateRight, L"so_update_right", _("Show files that will be updated on the right side"));
+ initButton(*m_bpButtonShowDoNothing, L"so_none", _("Show files that won't be copied"));
- initButton(*m_bpButtonShowExcluded, "checkbox_false", _("Show filtered or temporarily excluded files"));
+ initButton(*m_bpButtonShowExcluded, L"checkbox_false", _("Show filtered or temporarily excluded files"));
}
@@ -3632,12 +3625,12 @@ void MainDialog::updateGlobalFilterButton()
std::wstring status;
if (!isNullFilter(currentCfg_.mainCfg.globalFilter))
{
- setImage(*m_bpButtonFilter, getResourceImage(L"filter"));
+ setImage(*m_bpButtonFilter, getResourceImage(L"cfg_filter"));
status = _("Active");
}
else
{
- setImage(*m_bpButtonFilter, greyScale(getResourceImage(L"filter")));
+ setImage(*m_bpButtonFilter, greyScale(getResourceImage(L"cfg_filter")));
status = _("None");
}
@@ -3741,8 +3734,8 @@ void MainDialog::updateGui()
updateUnsavedCfgStatus();
- updateTopButton(*m_buttonCompare, getResourceImage(L"compare"), getConfig().mainCfg.getCompVariantName(), false /*makeGrey*/);
- updateTopButton(*m_buttonSync, getResourceImage(L"sync"), getConfig().mainCfg.getSyncVariantName(), folderCmp_.empty());
+ updateTopButton(*m_buttonCompare, getResourceImage(L"compare"), getCompVariantName(getConfig().mainCfg), false /*makeGrey*/);
+ updateTopButton(*m_buttonSync, getResourceImage(L"file_sync"), getSyncVariantName(getConfig().mainCfg), folderCmp_.empty());
m_panelTopButtons->Layout();
m_menuItemExportList->Enable(!folderCmp_.empty()); //a CSV without even folder names confuses users: https://www.freefilesync.org/forum/viewtopic.php?t=4787
@@ -3792,13 +3785,13 @@ void MainDialog::updateStatistics()
//update preview of item count and bytes to be transferred:
const SyncStatistics st(folderCmp_);
- setValue(*m_staticTextData, st.getBytesToProcess() == 0, formatFilesizeShort(st.getBytesToProcess()), *m_bitmapData, L"data");
- setIntValue(*m_staticTextCreateLeft, st.createCount< LEFT_SIDE>(), *m_bitmapCreateLeft, L"so_create_left_small");
- setIntValue(*m_staticTextUpdateLeft, st.updateCount< LEFT_SIDE>(), *m_bitmapUpdateLeft, L"so_update_left_small");
- setIntValue(*m_staticTextDeleteLeft, st.deleteCount< LEFT_SIDE>(), *m_bitmapDeleteLeft, L"so_delete_left_small");
- setIntValue(*m_staticTextCreateRight, st.createCount<RIGHT_SIDE>(), *m_bitmapCreateRight, L"so_create_right_small");
- setIntValue(*m_staticTextUpdateRight, st.updateCount<RIGHT_SIDE>(), *m_bitmapUpdateRight, L"so_update_right_small");
- setIntValue(*m_staticTextDeleteRight, st.deleteCount<RIGHT_SIDE>(), *m_bitmapDeleteRight, L"so_delete_right_small");
+ setValue(*m_staticTextData, st.getBytesToProcess() == 0, formatFilesizeShort(st.getBytesToProcess()), *m_bitmapData, L"data");
+ setIntValue(*m_staticTextCreateLeft, st.createCount< LEFT_SIDE>(), *m_bitmapCreateLeft, L"so_create_left_sicon");
+ setIntValue(*m_staticTextUpdateLeft, st.updateCount< LEFT_SIDE>(), *m_bitmapUpdateLeft, L"so_update_left_sicon");
+ setIntValue(*m_staticTextDeleteLeft, st.deleteCount< LEFT_SIDE>(), *m_bitmapDeleteLeft, L"so_delete_left_sicon");
+ setIntValue(*m_staticTextCreateRight, st.createCount<RIGHT_SIDE>(), *m_bitmapCreateRight, L"so_create_right_sicon");
+ setIntValue(*m_staticTextUpdateRight, st.updateCount<RIGHT_SIDE>(), *m_bitmapUpdateRight, L"so_update_right_sicon");
+ setIntValue(*m_staticTextDeleteRight, st.deleteCount<RIGHT_SIDE>(), *m_bitmapDeleteRight, L"so_delete_right_sicon");
m_panelStatistics->Layout();
m_panelStatistics->Refresh(); //fix small mess up on RTL layout
@@ -3843,7 +3836,7 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
bool dontShowAgain = false;
if (showSyncConfirmationDlg(this,
- getConfig().mainCfg.getSyncVariantName(),
+ getSyncVariantName(getConfig().mainCfg),
SyncStatistics(folderCmp_),
dontShowAgain) != ReturnSmallDlg::BUTTON_OKAY)
return;
@@ -3868,9 +3861,9 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
StatusHandlerFloatingDialog statusHandler(this, //throw AbortProcess
syncStartTime,
globalCfg_.lastSyncsLogFileSizeMax,
- currentCfg_.mainCfg.ignoreErrors,
- globalCfg_.automaticRetryCount,
- globalCfg_.automaticRetryDelay,
+ guiCfg.mainCfg.ignoreErrors,
+ guiCfg.mainCfg.automaticRetryCount,
+ guiCfg.mainCfg.automaticRetryDelay,
extractJobName(activeCfgFilePath),
globalCfg_.soundFileSyncFinished,
guiCfg.mainCfg.postSyncCommand,
@@ -4017,15 +4010,15 @@ void MainDialog::onGridLabelLeftClickC(GridLabelClickEvent& event)
void MainDialog::OnSwapSides(wxCommandEvent& event)
{
//swap directory names:
- FolderPairEnh fp1st = firstFolderPair_->getValues();
- std::swap(fp1st.folderPathPhraseLeft_, fp1st.folderPathPhraseRight_);
- firstFolderPair_->setValues(fp1st);
+ LocalPairConfig lpc1st = firstFolderPair_->getValues();
+ std::swap(lpc1st.folderPathPhraseLeft, lpc1st.folderPathPhraseRight);
+ firstFolderPair_->setValues(lpc1st);
for (FolderPairPanel* panel : additionalFolderPairs_)
{
- FolderPairEnh fp = panel->getValues();
- std::swap(fp.folderPathPhraseLeft_, fp.folderPathPhraseRight_);
- panel->setValues(fp);
+ LocalPairConfig lpc = panel->getValues();
+ std::swap(lpc.folderPathPhraseLeft, lpc.folderPathPhraseRight);
+ panel->setValues(lpc);
}
//swap view filter
@@ -4347,7 +4340,7 @@ void MainDialog::startFindNext(bool searchAscending) //F3 or ENTER in m_textCtrl
void MainDialog::OnTopFolderPairAdd(wxCommandEvent& event)
{
- insertAddFolderPair({ FolderPairEnh() }, 0);
+ insertAddFolderPair({ LocalPairConfig() }, 0);
moveAddFolderPairUp(0);
}
@@ -4368,7 +4361,7 @@ void MainDialog::OnLocalCompCfg(wxCommandEvent& event)
{
const wxObject* const eventObj = event.GetEventObject(); //find folder pair originating the event
for (auto it = additionalFolderPairs_.begin(); it != additionalFolderPairs_.end(); ++it)
- if (eventObj == (*it)->m_bpButtonAltCompCfg)
+ if (eventObj == (*it)->m_bpButtonLocalCompCfg)
{
showConfigDialog(SyncConfigPanel::COMPARISON, (it - additionalFolderPairs_.begin()) + 1);
break;
@@ -4380,7 +4373,7 @@ void MainDialog::OnLocalSyncCfg(wxCommandEvent& event)
{
const wxObject* const eventObj = event.GetEventObject(); //find folder pair originating the event
for (auto it = additionalFolderPairs_.begin(); it != additionalFolderPairs_.end(); ++it)
- if (eventObj == (*it)->m_bpButtonAltSyncCfg)
+ if (eventObj == (*it)->m_bpButtonLocalSyncCfg)
{
showConfigDialog(SyncConfigPanel::SYNC, (it - additionalFolderPairs_.begin()) + 1);
break;
@@ -4423,10 +4416,10 @@ void MainDialog::OnShowFolderPairOptions(wxEvent& event)
const ptrdiff_t pos = it - additionalFolderPairs_.begin();
ContextMenu menu;
- menu.addItem(_("Add folder pair"), [this, pos] { insertAddFolderPair({ FolderPairEnh() }, pos); }, &getResourceImage(L"item_add_small"));
+ menu.addItem(_("Add folder pair"), [this, pos] { insertAddFolderPair({ LocalPairConfig() }, pos); }, &getResourceImage(L"item_add_sicon"));
menu.addSeparator();
- menu.addItem(_("Move up" ) + L"\tAlt+Page Up", [this, pos] { moveAddFolderPairUp(pos); }, &getResourceImage(L"move_up_small"));
- menu.addItem(_("Move down") + L"\tAlt+Page Down", [this, pos] { moveAddFolderPairUp(pos + 1); }, &getResourceImage(L"move_down_small"), pos + 1 < makeSigned(additionalFolderPairs_.size()));
+ menu.addItem(_("Move up" ) + L"\tAlt+Page Up", [this, pos] { moveAddFolderPairUp(pos); }, &getResourceImage(L"move_up_sicon"));
+ menu.addItem(_("Move down") + L"\tAlt+Page Down", [this, pos] { moveAddFolderPairUp(pos + 1); }, &getResourceImage(L"move_down_sicon"), pos + 1 < makeSigned(additionalFolderPairs_.size()));
wxPoint ctxPos = (*it)->m_bpButtonFolderPairOptions->GetPosition();
ctxPos.x += (*it)->m_bpButtonFolderPairOptions->GetSize().GetWidth();
@@ -4509,14 +4502,14 @@ void MainDialog::updateGuiForFolderPair()
m_panelTopLeft->Layout();
//adapt local filter and sync cfg for first folder pair
- const bool showLocalCfgFirstPair = !additionalFolderPairs_.empty() ||
- firstFolderPair_->getAltCompConfig().get() != nullptr ||
- firstFolderPair_->getAltSyncConfig().get() != nullptr ||
- !isNullFilter(firstFolderPair_->getAltFilterConfig());
+ const bool showLocalCfgFirstPair = !additionalFolderPairs_.empty() ||
+ firstFolderPair_->getCompConfig() ||
+ firstFolderPair_->getSyncConfig() ||
+ !isNullFilter(firstFolderPair_->getFilterConfig());
//harmonize with MainDialog::showConfigDialog()!
- m_bpButtonAltCompCfg ->Show(showLocalCfgFirstPair);
- m_bpButtonAltSyncCfg ->Show(showLocalCfgFirstPair);
+ m_bpButtonLocalCompCfg ->Show(showLocalCfgFirstPair);
+ m_bpButtonLocalSyncCfg ->Show(showLocalCfgFirstPair);
m_bpButtonLocalFilter->Show(showLocalCfgFirstPair);
setImage(*m_bpButtonSwapSides, getResourceImage(showLocalCfgFirstPair ? L"swap_slim" : L"swap"));
@@ -4558,7 +4551,7 @@ void MainDialog::updateGuiForFolderPair()
}
-void MainDialog::insertAddFolderPair(const std::vector<FolderPairEnh>& newPairs, size_t pos)
+void MainDialog::insertAddFolderPair(const std::vector<LocalPairConfig>& newPairs, size_t pos)
{
assert(pos <= additionalFolderPairs_.size() && additionalFolderPairs_.size() == bSizerAddFolderPairs->GetItemCount());
pos = std::min(pos, additionalFolderPairs_.size());
@@ -4575,8 +4568,8 @@ void MainDialog::insertAddFolderPair(const std::vector<FolderPairEnh>& newPairs,
const int width = m_panelTopLeft->GetSize().GetWidth();
newPair->m_panelLeft->SetMinSize(wxSize(width, -1));
- bSizerAddFolderPairs->Insert(pos, newPair, 0, wxEXPAND);
- additionalFolderPairs_.insert(additionalFolderPairs_.begin() + pos, newPair);
+ bSizerAddFolderPairs->Insert(pos + i, newPair, 0, wxEXPAND);
+ additionalFolderPairs_.insert(additionalFolderPairs_.begin() + pos + i, newPair);
//register events
newPair->m_bpButtonFolderPairOptions->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxEventHandler(MainDialog::OnShowFolderPairOptions), nullptr, this);
@@ -4584,17 +4577,20 @@ void MainDialog::insertAddFolderPair(const std::vector<FolderPairEnh>& newPairs,
newPair->m_bpButtonRemovePair ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnRemoveFolderPair ), nullptr, this);
static_cast<FolderPairPanelGenerated*>(newPair)->Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::onAddFolderPairKeyEvent), nullptr, this);
- newPair->m_bpButtonAltCompCfg ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalCompCfg ), nullptr, this);
- newPair->m_bpButtonAltSyncCfg ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalSyncCfg ), nullptr, this);
- newPair->m_bpButtonLocalFilter->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalFilterCfg), nullptr, this);
+ newPair->m_bpButtonLocalCompCfg->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalCompCfg ), nullptr, this);
+ newPair->m_bpButtonLocalSyncCfg->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalSyncCfg ), nullptr, this);
+ newPair->m_bpButtonLocalFilter ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(MainDialog::OnLocalFilterCfg), nullptr, this);
+
+ //important: make sure panel has proper default height!
+ newPair->GetSizer()->SetSizeHints(newPair); //~=Fit() + SetMinSize()
+
+ //wxComboBox screws up miserably if width/height is smaller than the magic number 4! Problem occurs when trying to set tooltip
+ //so we have to update window sizes before setting configuration:
+ newPair->setValues(newPairs[i]);
}
updateGuiForFolderPair();
- //wxComboBox screws up miserably if width/height is smaller than the magic number 4! Problem occurs when trying to set tooltip
- //so we have to update window sizes before setting configuration:
- for (auto it = newPairs.begin(); it != newPairs.end(); ++it)//set alternate configuration
- additionalFolderPairs_[pos + (it - newPairs.begin())]->setValues(*it);
clearGrid(); //+ GUI update
}
@@ -4604,7 +4600,7 @@ void MainDialog::moveAddFolderPairUp(size_t pos)
assert(pos < additionalFolderPairs_.size());
if (pos < additionalFolderPairs_.size())
{
- const FolderPairEnh cfgTmp = additionalFolderPairs_[pos]->getValues();
+ const LocalPairConfig cfgTmp = additionalFolderPairs_[pos]->getValues();
if (pos == 0)
{
additionalFolderPairs_[pos]->setValues(firstFolderPair_->getValues());
@@ -4648,7 +4644,7 @@ void MainDialog::removeAddFolderPair(size_t pos)
}
-void MainDialog::setAddFolderPairs(const std::vector<FolderPairEnh>& newPairs)
+void MainDialog::setAddFolderPairs(const std::vector<LocalPairConfig>& newPairs)
{
additionalFolderPairs_.clear();
@@ -4862,8 +4858,8 @@ void MainDialog::OnLayoutWindowAsync(wxIdleEvent& event)
for (FolderPairPanel* panel : additionalFolderPairs_)
panel->Layout();
- m_panelTopButtons->Layout();
Layout(); //strangely this layout call works if called in next idle event only
+ m_panelTopButtons->Layout();
auiMgr_.Update(); //fix view filter distortion
}
diff --git a/FreeFileSync/Source/ui/main_dlg.h b/FreeFileSync/Source/ui/main_dlg.h
index 646bfd58..40496410 100755
--- a/FreeFileSync/Source/ui/main_dlg.h
+++ b/FreeFileSync/Source/ui/main_dlg.h
@@ -92,10 +92,10 @@ private:
void cfgHistoryRemoveObsolete(const std::vector<Zstring>& filepaths);
- void insertAddFolderPair(const std::vector<FolderPairEnh>& newPairs, size_t pos);
+ void insertAddFolderPair(const std::vector<LocalPairConfig>& newPairs, size_t pos);
void moveAddFolderPairUp(size_t pos);
void removeAddFolderPair(size_t pos);
- void setAddFolderPairs(const std::vector<FolderPairEnh>& newPairs);
+ void setAddFolderPairs(const std::vector<LocalPairConfig>& newPairs);
void updateGuiForFolderPair(); //helper method: add usability by showing/hiding buttons related to folder pairs
diff --git a/FreeFileSync/Source/ui/progress_indicator.cpp b/FreeFileSync/Source/ui/progress_indicator.cpp
index 10e9664b..dcb9539c 100755
--- a/FreeFileSync/Source/ui/progress_indicator.cpp
+++ b/FreeFileSync/Source/ui/progress_indicator.cpp
@@ -29,6 +29,7 @@
#include <zen/thread.h>
#include <wx+/rtl.h>
#include <wx+/choice_enum.h>
+#include <wx+/focus.h>
#include "gui_generated.h"
#include "../lib/ffs_paths.h"
#include "../lib/perf_check.h"
@@ -46,6 +47,10 @@ namespace
//window size used for statistics
const std::chrono::seconds WINDOW_REMAINING_TIME(60); //USB memory stick scenario can have drop outs of 40 seconds => 60 sec. window size handles it
const std::chrono::seconds WINDOW_BYTES_PER_SEC (5); //
+const std::chrono::milliseconds SPEED_ESTIMATE_UPDATE_INTERVAL(500);
+const std::chrono::seconds SPEED_ESTIMATE_SAMPLE_INTERVAL(1);
+
+const size_t PROGRESS_GRAPH_SAMPLE_SIZE_MAX = 2500000; //sizeof(single node) worst case ~ 3 * 8 byte ptr + 16 byte key/value = 40 byte
inline wxColor getColorGridLine() { return { 192, 192, 192 }; } //light grey
@@ -144,7 +149,7 @@ std::wstring getDialogPhaseText(const Statistics* syncStat, bool paused, SyncPro
case SyncProgressDialog::RESULT_FINISHED_WITH_WARNINGS:
return _("Completed with warnings");
case SyncProgressDialog::RESULT_FINISHED_WITH_SUCCESS:
- return _("Completed");
+ return _("Completed successfully");
}
return std::wstring();
}
@@ -199,17 +204,17 @@ class CompareProgressDialog::Impl : public CompareProgressDlgGenerated
public:
Impl(wxFrame& parentWindow);
- void init(const Statistics& syncStat, bool ignoreErrors); //constructor/destructor semantics, but underlying Window is reused
- void teardown(); //
+ void init(const Statistics& syncStat, bool ignoreErrors, size_t automaticRetryCount); //constructor/destructor semantics, but underlying Window is reused
+ void teardown(); //
void initNewPhase();
void updateProgressGui();
- bool getOptionIgnoreErrors() const { return m_checkBoxIgnoreErrors->GetValue(); }
- void setOptionIgnoreErrors(bool ignoreErrors) { m_checkBoxIgnoreErrors->SetValue(ignoreErrors); updateStaticGui(); }
+ bool getOptionIgnoreErrors() const { return ignoreErrors_; }
+ void setOptionIgnoreErrors(bool ignoreErrors) { ignoreErrors_ = ignoreErrors; updateStaticGui(); }
private:
- void OnToggleIgnoreErrors(wxCommandEvent& event) override { updateStaticGui(); }
+ //void OnToggleIgnoreErrors(wxCommandEvent& event) override { updateStaticGui(); }
void updateStaticGui();
@@ -229,6 +234,8 @@ private:
std::shared_ptr<CurveDataProgressBar> curveDataBytes_{ std::make_shared<CurveDataProgressBar>(true /*drawTop*/) };
std::shared_ptr<CurveDataProgressBar> curveDataItems_{ std::make_shared<CurveDataProgressBar>(false /*drawTop*/) };
+
+ bool ignoreErrors_ = false;
};
@@ -236,6 +243,9 @@ CompareProgressDialog::Impl::Impl(wxFrame& parentWindow) :
CompareProgressDlgGenerated(&parentWindow),
parentWindow_(parentWindow)
{
+ m_bitmapIgnoreErrors->SetBitmap(getResourceImage(L"error_ignore_active"));
+ m_bitmapRetryErrors ->SetBitmap(getResourceImage(L"error_retry"));
+
//make sure that standard height matches PHASE_COMPARING_CONTENT statistics layout
m_staticTextItemsFoundLabel->Hide();
m_staticTextItemsFound ->Hide();
@@ -252,15 +262,15 @@ CompareProgressDialog::Impl::Impl(wxFrame& parentWindow) :
m_panelProgressGraph->addCurve(std::make_shared<CurveDataProgressSeparatorLine>(), Graph2D::CurveAttributes().setLineWidth(1).setColor(Graph2D::getBorderColor()));
- m_panelStatistics->Layout();
Layout();
+ m_panelStatistics->Layout();
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
//=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!!
}
-void CompareProgressDialog::Impl::init(const Statistics& syncStat, bool ignoreErrors)
+void CompareProgressDialog::Impl::init(const Statistics& syncStat, bool ignoreErrors, size_t automaticRetryCount)
{
syncStat_ = &syncStat;
parentTitleBackup_ = parentWindow_.GetTitle();
@@ -287,14 +297,17 @@ void CompareProgressDialog::Impl::init(const Statistics& syncStat, bool ignoreEr
m_staticTextTimeRemainingLabel->Hide();
m_staticTextTimeRemaining ->Hide();
+ setText(*m_staticTextRetryCount, std::wstring(L"(") + formatNumber(automaticRetryCount) + MULT_SIGN + L")");
+ bSizerErrorsRetry->Show(automaticRetryCount > 0);
+
//allow changing a few options dynamically during sync
- m_checkBoxIgnoreErrors->SetValue(ignoreErrors);
+ ignoreErrors_ = ignoreErrors;
updateStaticGui();
updateProgressGui();
- m_panelStatistics->Layout();
Layout();
+ m_panelStatistics->Layout();
}
@@ -335,8 +348,8 @@ void CompareProgressDialog::Impl::initNewPhase()
m_staticTextTimeRemainingLabel->Show();
m_staticTextTimeRemaining ->Show();
- m_panelStatistics->Layout();
Layout();
+ m_panelStatistics->Layout();
break;
}
@@ -346,7 +359,8 @@ void CompareProgressDialog::Impl::initNewPhase()
void CompareProgressDialog::Impl::updateStaticGui()
{
- m_bitmapIgnoreErrors->SetBitmap(getResourceImage(m_checkBoxIgnoreErrors->GetValue() ? L"msg_error_medium_ignored" : L"msg_error_medium"));
+ bSizerErrorsIgnore->Show(ignoreErrors_);
+ Layout();
}
@@ -417,11 +431,11 @@ void CompareProgressDialog::Impl::updateProgressGui()
//remaining time and speed: only visible during binary comparison
assert(perf_);
if (perf_)
- if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= std::chrono::milliseconds(500))
+ if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= SPEED_ESTIMATE_UPDATE_INTERVAL)
{
timeLastSpeedEstimate_ = timeElapsed;
- if (numeric::dist(binCompStart_, timeElapsed) >= std::chrono::seconds(1)) //discard stats for first second: probably messy
+ if (numeric::dist(binCompStart_, timeElapsed) >= SPEED_ESTIMATE_SAMPLE_INTERVAL) //discard stats for first second: probably messy
perf_->addSample(timeElapsed, itemsCurrent, bytesCurrent);
//current speed -> Win 7 copy uses 1 sec update interval instead
@@ -450,8 +464,8 @@ void CompareProgressDialog::Impl::updateProgressGui()
if (layoutChanged)
{
- m_panelStatistics->Layout();
Layout();
+ m_panelStatistics->Layout();
}
//do the ui update
@@ -463,7 +477,7 @@ void CompareProgressDialog::Impl::updateProgressGui()
//redirect to implementation
CompareProgressDialog::CompareProgressDialog(wxFrame& parentWindow) : pimpl_(new Impl(parentWindow)) {} //owned by parentWindow
wxWindow* CompareProgressDialog::getAsWindow() { return pimpl_; }
-void CompareProgressDialog::init(const Statistics& syncStat, bool ignoreErrors) { pimpl_->init(syncStat, ignoreErrors); }
+void CompareProgressDialog::init(const Statistics& syncStat, bool ignoreErrors, size_t automaticRetryCount) { pimpl_->init(syncStat, ignoreErrors, automaticRetryCount); }
void CompareProgressDialog::teardown() { pimpl_->teardown(); }
void CompareProgressDialog::initNewPhase() { pimpl_->initNewPhase(); }
void CompareProgressDialog::updateGui() { pimpl_->updateProgressGui(); }
@@ -474,21 +488,10 @@ void CompareProgressDialog::setOptionIgnoreErrors(bool ignoreErrors) { pimpl_->s
namespace
{
-//pretty much the same like "bool wxWindowBase::IsDescendant(wxWindowBase* child) const" but without the obvious misnomer
-inline
-bool isComponentOf(const wxWindow* child, const wxWindow* top)
-{
- for (const wxWindow* wnd = child; wnd != nullptr; wnd = wnd->GetParent())
- if (wnd == top)
- return true;
- return false;
-}
-
-
inline
wxBitmap getImageButtonPressed(const wchar_t* name)
{
- return layOver(getResourceImage(L"log button pressed"), getResourceImage(name));
+ return layOver(getResourceImage(L"msg_button_pressed"), getResourceImage(name));
}
@@ -684,21 +687,21 @@ public:
switch (entry->type)
{
case MSG_TYPE_INFO:
- drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_info_small"), rectTmp, wxALIGN_CENTER);
+ drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_info_sicon"), rectTmp, wxALIGN_CENTER);
break;
case MSG_TYPE_WARNING:
- drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_warning_small"), rectTmp, wxALIGN_CENTER);
+ drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_warning_sicon"), rectTmp, wxALIGN_CENTER);
break;
case MSG_TYPE_ERROR:
case MSG_TYPE_FATAL_ERROR:
- drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_error_small"), rectTmp, wxALIGN_CENTER);
+ drawBitmapRtlNoMirror(dc, getResourceImage(L"msg_error_sicon"), rectTmp, wxALIGN_CENTER);
break;
}
break;
case ColumnTypeMsg::TEXT:
- rectTmp.x += COLUMN_GAP_LEFT;
- rectTmp.width -= COLUMN_GAP_LEFT;
+ rectTmp.x += getColumnGapLeft();
+ rectTmp.width -= getColumnGapLeft();
drawCellText(dc, rectTmp, getValue(row, colType));
break;
}
@@ -712,13 +715,13 @@ public:
switch (static_cast<ColumnTypeMsg>(colType))
{
case ColumnTypeMsg::TIME:
- return 2 * COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth();
+ return 2 * getColumnGapLeft() + dc.GetTextExtent(getValue(row, colType)).GetWidth();
case ColumnTypeMsg::CATEGORY:
- return getResourceImage(L"msg_info_small").GetWidth();
+ return getResourceImage(L"msg_info_sicon").GetWidth();
case ColumnTypeMsg::TEXT:
- return COLUMN_GAP_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth();
+ return getColumnGapLeft() + dc.GetTextExtent(getValue(row, colType)).GetWidth();
}
return 0;
}
@@ -727,17 +730,17 @@ public:
{
wxClientDC dc(&grid.getMainWin());
dc.SetFont(grid.getMainWin().GetFont());
- return 2 * COLUMN_GAP_LEFT + dc.GetTextExtent(formatTime<wxString>(FORMAT_TIME)).GetWidth();
+ return 2 * getColumnGapLeft() + dc.GetTextExtent(formatTime<wxString>(FORMAT_TIME)).GetWidth();
}
static int getColumnCategoryDefaultWidth()
{
- return getResourceImage(L"msg_info_small").GetWidth();
+ return getResourceImage(L"msg_info_sicon").GetWidth();
}
static int getRowDefaultHeight(const Grid& grid)
{
- return std::max(getResourceImage(L"msg_info_small").GetHeight(), grid.getMainWin().GetCharHeight() + 2) + 1; //+ some space + bottom border
+ return std::max(getResourceImage(L"msg_info_sicon").GetHeight(), grid.getMainWin().GetCharHeight() + fastFromDIP(2)) + 1; //+ some space + bottom border
}
std::wstring getToolTip(size_t row, ColumnType colType) const override
@@ -810,7 +813,7 @@ public:
m_gridMessages->Connect(EVENT_GRID_MOUSE_RIGHT_UP, GridClickEventHandler(LogPanel::onMsgGridContext), nullptr, this);
- //enable dialog-specific key local events
+ //enable dialog-specific key events
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(LogPanel::onLocalKeyEvent), nullptr, this);
updateGrid();
@@ -1033,7 +1036,7 @@ public:
//documentation differs about whether "hint" should be before or after the to be inserted element!
//however "std::map<>::end()" is interpreted correctly by GCC and VS2010
- if (samples_.size() > MAX_BUFFER_SIZE) //limit buffer size
+ if (samples_.size() > PROGRESS_GRAPH_SAMPLE_SIZE_MAX) //limit buffer size
samples_.erase(samples_.begin());
}
@@ -1091,8 +1094,6 @@ private:
return CurvePoint(std::chrono::duration<double>(it->first).count(), it->second);
}
- static const size_t MAX_BUFFER_SIZE = 2500000; //sizeof(single node) worst case ~ 3 * 8 byte ptr + 16 byte key/value = 40 byte
-
std::map <std::chrono::nanoseconds, double> samples_; //[!] don't use std::multimap, see getLessEq()
std::pair<std::chrono::nanoseconds, double> lastSample_; //artificial most current record at the end of samples to visualize current time!
};
@@ -1220,6 +1221,7 @@ struct LabelFormatterTimeElapsed : public LabelFormatter
{
if (!drawLabel_)
return wxString();
+
return timeElapsed < 60 ?
wxString(_P("1 sec", "%x sec", numeric::round(timeElapsed))) :
timeElapsed < 3600 ?
@@ -1253,6 +1255,7 @@ public:
const wxString& jobName,
const Zstring& soundFileSyncComplete,
bool ignoreErrors,
+ size_t automaticRetryCount,
PostSyncAction2 postSyncAction);
~SyncProgressDialogImpl() override;
@@ -1267,8 +1270,8 @@ public:
void notifyProgressChange() override;
void updateGui () override { updateProgressGui(true /*allowYield*/); }
- bool getOptionIgnoreErrors() const override { return pnl_.m_checkBoxIgnoreErrors->GetValue(); }
- void setOptionIgnoreErrors(bool ignoreErrors) override { pnl_.m_checkBoxIgnoreErrors->SetValue(ignoreErrors); updateStaticGui(); }
+ bool getOptionIgnoreErrors() const override { return ignoreErrors_; }
+ void setOptionIgnoreErrors(bool ignoreErrors) override { ignoreErrors_ = ignoreErrors; updateStaticGui(); }
PostSyncAction2 getOptionPostSyncAction() const override { return getEnumVal(enumPostSyncAction_, *pnl_.m_choicePostSyncAction); }
bool getOptionAutoCloseDialog() const override { return pnl_.m_checkBoxAutoClose->GetValue(); }
@@ -1294,7 +1297,7 @@ private:
void OnClose (wxCloseEvent& event);
void OnIconize(wxIconizeEvent& event);
void OnMinimizeToTray(wxCommandEvent& event) { minimizeToTray(); }
- void OnToggleIgnoreErrors(wxCommandEvent& event) { updateStaticGui(); }
+ //void OnToggleIgnoreErrors(wxCommandEvent& event) { updateStaticGui(); }
void minimizeToTray();
void resumeFromSystray();
@@ -1314,12 +1317,13 @@ private:
std::function<void()> notifyWindowTerminate_; //call once in OnClose(), NOT in destructor which is called far too late somewhere in wxWidgets main loop!
- bool wereDead_ = false; //set after wxWindow::Delete(), which equals "delete this" on OS X!
-
//status variables
const Statistics* syncStat_; //
AbortCallback* abortCb_; //valid only while sync is running
- bool paused_ = false; //valid only while sync is running
+ bool paused_ = false;
+ const std::shared_ptr<int> lifeSign_ = std::make_shared<int>(42); //only bound while instance exists, see pause handling in updateProgressGui()
+ //wxWindow::Delete(), equals "delete this" on OS X!
+
SyncResult finalResult_ = RESULT_ABORTED; //set after sync
//remaining time
@@ -1340,6 +1344,7 @@ private:
std::unique_ptr<FfsTrayIcon> trayIcon_; //optional: if filled all other windows should be hidden and conversely
std::unique_ptr<Taskbar> taskbar_;
+ bool ignoreErrors_ = false;
EnumDescrList<PostSyncAction2> enumPostSyncAction_;
};
@@ -1356,6 +1361,7 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF
const wxString& jobName,
const Zstring& soundFileSyncComplete,
bool ignoreErrors,
+ size_t automaticRetryCount,
PostSyncAction2 postSyncAction) :
TopLevelDialog(parentFrame, wxID_ANY, wxString(), wxDefaultPosition, wxDefaultSize, style), //title is overwritten anyway in setExternalStatus()
pnl_(*new SyncProgressPanelGenerated(this)), //ownership passed to "this"
@@ -1371,7 +1377,8 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF
assert((IsSameType<TopLevelDialog, wxFrame>::value == !parentFrame));
//finish construction of this dialog:
- this->SetMinSize(wxSize(470, 280)); //== minimum size! no idea why SetMinSize() is not used...
+ this->pnl_.m_panelProgress->SetMinSize(wxSize(fastFromDIP(550), fastFromDIP(340)));
+
wxBoxSizer* bSizer170 = new wxBoxSizer(wxVERTICAL);
bSizer170->Add(&pnl_, 1, wxEXPAND);
this->SetSizer(bSizer170); //pass ownership
@@ -1384,7 +1391,6 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF
pnl_.m_buttonPause->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(SyncProgressDialogImpl::OnPause ), NULL, this);
pnl_.m_buttonStop ->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(SyncProgressDialogImpl::OnCancel), NULL, this);
pnl_.m_bpButtonMinimizeToTray->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(SyncProgressDialogImpl::OnMinimizeToTray), NULL, this);
- pnl_.m_checkBoxIgnoreErrors->Connect(wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(SyncProgressDialogImpl::OnToggleIgnoreErrors), NULL, this);
if (parentFrame_)
parentFrame_->Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SyncProgressDialogImpl::onParentKeyEvent), nullptr, this);
@@ -1420,9 +1426,12 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF
pnl_.m_bpButtonMinimizeToTray->SetBitmapLabel(getResourceImage(L"minimize_to_tray"));
+ pnl_.m_bitmapIgnoreErrors->SetBitmap(getResourceImage(L"error_ignore_active"));
+ pnl_.m_bitmapRetryErrors ->SetBitmap(getResourceImage(L"error_retry"));
+
//init graph
- const int xLabelHeight = this->GetCharHeight() + 2 * 1 /*border*/; //use same height for both graphs to make sure they stretch evenly
- const int yLabelWidth = 70;
+ const int xLabelHeight = this->GetCharHeight() + fastFromDIP(2) /*margin*/; //use same height for both graphs to make sure they stretch evenly
+ const int yLabelWidth = fastFromDIP(70);
pnl_.m_panelGraphBytes->setAttributes(Graph2D::MainAttributes().
setLabelX(Graph2D::LABEL_X_TOP, xLabelHeight, std::make_shared<LabelFormatterTimeElapsed>(true)).
setLabelY(Graph2D::LABEL_Y_RIGHT, yLabelWidth, std::make_shared<LabelFormatterBytes>()).
@@ -1459,8 +1468,11 @@ SyncProgressDialogImpl<TopLevelDialog>::SyncProgressDialogImpl(long style, //wxF
pnl_.m_bitmapGraphKeyBytes->SetBitmap(generateSquareBitmap(getColorBytes(), getColorBytesRim()));
pnl_.m_bitmapGraphKeyItems->SetBitmap(generateSquareBitmap(getColorItems(), getColorItemsRim()));
+ setText(*pnl_.m_staticTextRetryCount, std::wstring(L"(") + formatNumber(automaticRetryCount) + MULT_SIGN + L")");
+ pnl_.bSizerErrorsRetry->Show(automaticRetryCount > 0);
+
//allow changing a few options dynamically during sync
- pnl_.m_checkBoxIgnoreErrors->SetValue(ignoreErrors);
+ ignoreErrors_ = ignoreErrors;
enumPostSyncAction_.add(PostSyncAction2::NONE, L"");
if (parentFrame_) //enable EXIT option for gui mode sync
@@ -1711,11 +1723,11 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield)
//remaining time and speed
assert(perf_);
if (perf_)
- if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= std::chrono::milliseconds(500))
+ if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= SPEED_ESTIMATE_UPDATE_INTERVAL)
{
timeLastSpeedEstimate_ = timeElapsed;
- if (numeric::dist(phaseStart_, timeElapsed) >= std::chrono::seconds(1)) //discard stats for first second: probably messy
+ if (numeric::dist(phaseStart_, timeElapsed) >= SPEED_ESTIMATE_SAMPLE_INTERVAL) //discard stats for first second: probably messy
perf_->addSample(timeElapsed, itemsCurrent, bytesCurrent);
//current speed -> Win 7 copy uses 1 sec update interval instead
@@ -1760,7 +1772,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield)
{
pnl_.m_panelProgress->Layout();
//small statistics panels:
- //pnl.m_panelItemsProcessed->Layout();
+ //pnl.m_panelItemsProcessed ->Layout(); -> hidden
pnl_.m_panelItemsRemaining->Layout();
pnl_.m_panelTimeRemaining ->Layout();
//pnl.m_panelTimeElapsed->Layout(); -> needed?
@@ -1772,25 +1784,19 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateProgressGui(bool allowYield)
//support for pause button
if (paused_)
{
- /*
- ZEN_ON_SCOPE_EXIT(resumeTimer()); -> crashes on Fedora; WHY???
- => likely compiler bug!!!
- 1. no crash on Fedora for: ZEN_ON_SCOPE_EXIT(this->resumeTimer());
- 1. no crash if we derive from wxFrame instead of template "TopLevelDialog"
- 2. no crash on Ubuntu GCC
- 3. following makes GCC crash already during compilation: auto dfd = zen::makeGuard([this]{ resumeTimer(); });
- */
timerSetStatus(false /*active*/);
+ std::weak_ptr<int> lifeSignWeak(lifeSign_);
while (paused_)
{
wxTheApp->Yield(); //receive UI message that end pause OR forceful termination!
//*first* refresh GUI (removing flicker) before sleeping!
std::this_thread::sleep_for(UI_UPDATE_INTERVAL);
+
+ //after SyncProgressDialogImpl::OnClose() called wxWindow::Destroy() on OS X this instance is instantly toast!
+ if (!lifeSignWeak.lock())
+ return; //GTFO and don't call this->timerSetStatus(); we're fine: https://isocpp.org/wiki/faq/freestore-mgmt#delete-this
}
- //after SyncProgressDialogImpl::OnClose() called wxWindow::Destroy() on OS X this instance is instantly toast!
- if (wereDead_)
- return; //GTFO and don't call this->timerSetStatus()
timerSetStatus(true /*active*/);
}
@@ -1911,11 +1917,11 @@ void SyncProgressDialogImpl<TopLevelDialog>::updateStaticGui() //depends on "syn
if (syncStat_) //sync running
pnl_.m_buttonPause->SetLabel(paused_ ? _("&Continue") : _("&Pause"));
-
- pnl_.m_bitmapIgnoreErrors->SetBitmap(getResourceImage(pnl_.m_checkBoxIgnoreErrors->GetValue() ? L"msg_error_medium_ignored" : L"msg_error_medium"));
+ pnl_.bSizerErrorsIgnore->Show(ignoreErrors_);
pnl_.Layout();
- this->Refresh(); //a few pixels below the status text need refreshing
+ pnl_.m_panelProgress->Layout(); //for bSizerErrorsIgnore
+ //this->Refresh(); //a few pixels below the status text need refreshing -> still needed?
}
@@ -2037,7 +2043,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult resultId, co
//-------------------------------------------------------------
- pnl_.m_notebookResult->SetPadding(wxSize(2, 0)); //height cannot be changed
+ pnl_.m_notebookResult->SetPadding(wxSize(fastFromDIP(2), 0)); //height cannot be changed
const size_t pagePosProgress = 0;
const size_t pagePosLog = 1;
@@ -2060,8 +2066,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult resultId, co
pnl_.m_notebookResult->ChangeSelection(pagePosLog);
//fill image list to cope with wxNotebook image setting design desaster...
- const int imgListSize = getResourceImage(L"log_file_small").GetHeight();
- assert(imgListSize == 16); //Windows default size for panel caption
+ const int imgListSize = getResourceImage(L"log_file_sicon").GetHeight();
auto imgList = std::make_unique<wxImageList>(imgListSize, imgListSize);
auto addToImageList = [&](const wxBitmap& bmp)
@@ -2070,8 +2075,8 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult resultId, co
assert(bmp.GetHeight() <= imgListSize);
imgList->Add(bmp);
};
- addToImageList(getResourceImage(L"progress_small"));
- addToImageList(getResourceImage(L"log_file_small"));
+ addToImageList(getResourceImage(L"progress_sicon"));
+ addToImageList(getResourceImage(L"log_file_sicon"));
pnl_.m_notebookResult->AssignImageList(imgList.release()); //pass ownership
@@ -2088,7 +2093,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::showSummary(SyncResult resultId, co
//small statistics panels:
pnl_.m_panelItemsProcessed->Layout();
pnl_.m_panelItemsRemaining->Layout();
- //pnl.m_panelTimeRemaining->Layout();
+ //pnl.m_panelTimeRemaining->Layout(); -> hidden
//pnl.m_panelTimeElapsed->Layout(); -> needed?
//play (optional) sound notification after sync has completed -> only play when waiting on results dialog, seems to be pointless otherwise!
@@ -2129,7 +2134,7 @@ void SyncProgressDialogImpl<TopLevelDialog>::OnCancel(wxCommandEvent& event)
paused_ = false;
updateStaticGui(); //update status + pause button
- //no Layout() or UI-update here to avoid cascaded Yield()-call!
+ //no UI-update here to avoid cascaded Yield()-call!
}
@@ -2159,7 +2164,6 @@ void SyncProgressDialogImpl<TopLevelDialog>::OnClose(wxCloseEvent& event)
syncStat_ = nullptr;
abortCb_ = nullptr;
- wereDead_ = true;
this->Destroy(); //wxWidgets OS X: simple "delete"!!!!!!!
}
@@ -2250,6 +2254,7 @@ SyncProgressDialog* fff::createProgressDialog(AbortCallback& abortCb,
const wxString& jobName,
const Zstring& soundFileSyncComplete,
bool ignoreErrors,
+ size_t automaticRetryCount,
PostSyncAction2 postSyncAction)
{
if (parentWindow) //sync from GUI
@@ -2258,13 +2263,13 @@ SyncProgressDialog* fff::createProgressDialog(AbortCallback& abortCb,
//https://groups.google.com/forum/#!topic/wx-users/J5SjjLaBOQE
return new SyncProgressDialogImpl<wxDialog>(wxDEFAULT_DIALOG_STYLE | wxMAXIMIZE_BOX | wxMINIMIZE_BOX | wxRESIZE_BORDER,
[&](wxDialog& progDlg) { return parentWindow; },
- abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, jobName, soundFileSyncComplete, ignoreErrors, postSyncAction);
+ abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, postSyncAction);
}
else //FFS batch job
{
auto dlg = new SyncProgressDialogImpl<wxFrame>(wxDEFAULT_FRAME_STYLE,
[](wxFrame& progDlg) { return &progDlg; },
- abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, jobName, soundFileSyncComplete, ignoreErrors, postSyncAction);
+ abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, postSyncAction);
//only top level windows should have an icon:
dlg->SetIcon(getFfsIcon());
diff --git a/FreeFileSync/Source/ui/progress_indicator.h b/FreeFileSync/Source/ui/progress_indicator.h
index 3562db96..ca45bd72 100755
--- a/FreeFileSync/Source/ui/progress_indicator.h
+++ b/FreeFileSync/Source/ui/progress_indicator.h
@@ -24,7 +24,7 @@ public:
wxWindow* getAsWindow(); //convenience! don't abuse!
- void init(const Statistics& syncStat, bool ignoreErrors); //begin of sync: make visible, set pointer to "syncStat", initialize all status values
+ void init(const Statistics& syncStat, bool ignoreErrors, size_t automaticRetryCount); //begin of sync: make visible, set pointer to "syncStat", initialize all status values
void teardown(); //end of sync: hide again, clear pointer to "syncStat"
void initNewPhase(); //call after "StatusHandler::initNewPhase"
@@ -96,6 +96,7 @@ SyncProgressDialog* createProgressDialog(AbortCallback& abortCb,
const wxString& jobName,
const Zstring& soundFileSyncComplete,
bool ignoreErrors,
+ size_t automaticRetryCount,
PostSyncAction2 postSyncAction);
//DON'T delete the pointer! it will be deleted by the user clicking "OK/Cancel"/wxWindow::Destroy() after showSummary() or closeDirectly()
diff --git a/FreeFileSync/Source/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp
index c3889a94..1fd6229b 100755
--- a/FreeFileSync/Source/ui/small_dlgs.cpp
+++ b/FreeFileSync/Source/ui/small_dlgs.cpp
@@ -62,7 +62,7 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
{
m_panelThankYou->Hide();
- m_bitmapDonate->SetBitmap(getResourceImage(L"freefilesync-heart"));
+ m_bitmapDonate->SetBitmap(getResourceImage(L"ffs_heart"));
setRelativeFontSize(*m_staticTextDonate, 1.25);
setRelativeFontSize(*m_buttonDonate, 1.25);
}
@@ -70,16 +70,18 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
//m_animCtrlWink->SetAnimation(getResourceAnimation(L"wink"));
//m_animCtrlWink->Play();
+ m_staticTextThanksForLoc->SetMinSize(wxSize(fastFromDIP(200), -1));
+ m_staticTextThanksForLoc->Wrap(fastFromDIP(200));
+
//create language credits
for (const TranslationInfo& ti : getExistingTranslations())
{
//flag
- wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, getResourceImage(ti.languageFlag), wxDefaultPosition, wxSize(-1, 11), 0);
+ wxStaticBitmap* staticBitmapFlag = new wxStaticBitmap(m_scrolledWindowTranslators, wxID_ANY, getResourceImage(ti.languageFlag));
fgSizerTranslators->Add(staticBitmapFlag, 0, wxALIGN_CENTER);
//translator name
wxStaticText* staticTextTranslator = new wxStaticText(m_scrolledWindowTranslators, wxID_ANY, ti.translatorName, wxDefaultPosition, wxDefaultSize, 0);
- staticTextTranslator->Wrap(-1);
fgSizerTranslators->Add(staticTextTranslator, 0, wxALIGN_CENTER_VERTICAL);
staticBitmapFlag ->SetToolTip(ti.languageName);
@@ -115,8 +117,9 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
ImageStackAlignment::CENTER);
wxImage versionImage = stackImages(appnameImg, buildImg, ImageStackLayout::VERTICAL, ImageStackAlignment::CENTER, 0);
- const int BORDER_SIZE = 5;
- wxBitmap headerBmp(GetClientSize().GetWidth(), versionImage.GetHeight() + 2 * BORDER_SIZE, 24);
+ const int borderSize = fastFromDIP(5);
+
+ wxBitmap headerBmp(GetClientSize().GetWidth(), versionImage.GetHeight() + 2 * borderSize, 24);
//attention: *must* pass 24 bits, auto-determination fails on Windows high-contrast colors schemes!!!
//problem only shows when calling wxDC::DrawBitmap
{
@@ -128,15 +131,15 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
dc.DrawBitmap(bmpGradient, wxPoint(0, (headerBmp.GetHeight() - bmpGradient.GetHeight()) / 2));
const int logoSize = versionImage.GetHeight();
- const wxBitmap logoBmp = getResourceImage(L"FreeFileSync").ConvertToImage().Scale(logoSize, logoSize, wxIMAGE_QUALITY_HIGH);
- dc.DrawBitmap(logoBmp, wxPoint(2 * BORDER_SIZE, (headerBmp.GetHeight() - logoBmp.GetHeight()) / 2));
+ const wxBitmap logoBmp = getResourceImage(L"FreeFileSync").ConvertToImage().Scale(logoSize, logoSize, wxIMAGE_QUALITY_HIGH); //looks smooth unlike wxIMAGE_QUALITY_BILINEAR!
+ dc.DrawBitmap(logoBmp, wxPoint(2 * borderSize, (headerBmp.GetHeight() - logoBmp.GetHeight()) / 2));
dc.DrawBitmap(versionImage, wxPoint((headerBmp.GetWidth () - versionImage.GetWidth ()) / 2,
(headerBmp.GetHeight() - versionImage.GetHeight()) / 2));
}
m_bitmapLogo->SetBitmap(headerBmp);
- //enable dialog-specific key local events
+ //enable dialog-specific key events
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(AboutDlg::onLocalKeyEvent), nullptr, this);
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
@@ -216,6 +219,8 @@ CopyToDialog::CopyToDialog(wxWindow* parent,
m_targetFolderPath->init(folderHistory_);
+ m_textCtrlFileList->SetMinSize(wxSize(fastFromDIP(500), fastFromDIP(200)));
+
/*
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!
@@ -229,7 +234,7 @@ CopyToDialog::CopyToDialog(wxWindow* parent,
const wxString header = _P("Copy the following item to another folder?",
"Copy the following %x items to another folder?", selectionInfo.second);
m_staticTextHeader->SetLabel(header);
- m_staticTextHeader->Wrap(460); //needs to be reapplied after SetLabel()
+ m_staticTextHeader->Wrap(fastFromDIP(460)); //needs to be reapplied after SetLabel()
m_textCtrlFileList->ChangeValue(selectionInfo.first);
@@ -239,7 +244,7 @@ CopyToDialog::CopyToDialog(wxWindow* parent,
m_checkBoxOverwriteIfExists->SetValue(overwriteIfExists);
//----------------- /set config --------------------------------
- //enable dialog-specific key local events
+ //enable dialog-specific key events
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(CopyToDialog::onLocalKeyEvent), nullptr, this);
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
@@ -339,17 +344,17 @@ DeleteDialog::DeleteDialog(wxWindow* parent,
setMainInstructionFont(*m_staticTextHeader);
- m_checkBoxUseRecycler->SetValue(useRecycleBin);
+ m_textCtrlFileList->SetMinSize(wxSize(fastFromDIP(500), fastFromDIP(200)));
+ m_checkBoxUseRecycler->SetValue(useRecycleBin);
updateGui();
- //enable dialog-specific key local events
+ //enable dialog-specific key events
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(DeleteDialog::onLocalKeyEvent), nullptr, this);
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
//=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!!
- Layout();
Center(); //needs to be re-applied after a dialog size change!
m_buttonOK->SetFocus();
@@ -377,7 +382,7 @@ void DeleteDialog::updateGui()
m_buttonOK->SetLabel(replaceCpy(_("&Delete"), L"&", L""));
}
m_staticTextHeader->SetLabel(header);
- m_staticTextHeader->Wrap(460); //needs to be reapplied after SetLabel()
+ m_staticTextHeader->Wrap(fastFromDIP(460)); //needs to be reapplied after SetLabel()
m_textCtrlFileList->ChangeValue(delInfo.first);
/*
@@ -451,7 +456,7 @@ SyncConfirmationDlg::SyncConfirmationDlg(wxWindow* parent,
setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonStartSync).setCancel(m_buttonCancel));
setMainInstructionFont(*m_staticTextHeader);
- m_bitmapSync->SetBitmap(getResourceImage(L"sync"));
+ m_bitmapSync->SetBitmap(getResourceImage(L"file_sync"));
m_staticTextVariant->SetLabel(variantName);
m_checkBoxDontShowAgain->SetValue(dontShowAgain);
@@ -478,15 +483,13 @@ SyncConfirmationDlg::SyncConfirmationDlg(wxWindow* parent,
setValue(txtControl, value == 0, formatNumber(value), bmpControl, bmpName);
};
- setValue(*m_staticTextData, st.getBytesToProcess() == 0, formatFilesizeShort(st.getBytesToProcess()), *m_bitmapData, L"data");
- setIntValue(*m_staticTextCreateLeft, st.createCount< LEFT_SIDE>(), *m_bitmapCreateLeft, L"so_create_left_small");
- setIntValue(*m_staticTextUpdateLeft, st.updateCount< LEFT_SIDE>(), *m_bitmapUpdateLeft, L"so_update_left_small");
- setIntValue(*m_staticTextDeleteLeft, st.deleteCount< LEFT_SIDE>(), *m_bitmapDeleteLeft, L"so_delete_left_small");
- setIntValue(*m_staticTextCreateRight, st.createCount<RIGHT_SIDE>(), *m_bitmapCreateRight, L"so_create_right_small");
- setIntValue(*m_staticTextUpdateRight, st.updateCount<RIGHT_SIDE>(), *m_bitmapUpdateRight, L"so_update_right_small");
- setIntValue(*m_staticTextDeleteRight, st.deleteCount<RIGHT_SIDE>(), *m_bitmapDeleteRight, L"so_delete_right_small");
-
- m_panelStatistics->Layout();
+ setValue(*m_staticTextData, st.getBytesToProcess() == 0, formatFilesizeShort(st.getBytesToProcess()), *m_bitmapData, L"data");
+ setIntValue(*m_staticTextCreateLeft, st.createCount< LEFT_SIDE>(), *m_bitmapCreateLeft, L"so_create_left_sicon");
+ setIntValue(*m_staticTextUpdateLeft, st.updateCount< LEFT_SIDE>(), *m_bitmapUpdateLeft, L"so_update_left_sicon");
+ setIntValue(*m_staticTextDeleteLeft, st.deleteCount< LEFT_SIDE>(), *m_bitmapDeleteLeft, L"so_delete_left_sicon");
+ setIntValue(*m_staticTextCreateRight, st.createCount<RIGHT_SIDE>(), *m_bitmapCreateRight, L"so_create_right_sicon");
+ setIntValue(*m_staticTextUpdateRight, st.updateCount<RIGHT_SIDE>(), *m_bitmapUpdateRight, L"so_update_right_sicon");
+ setIntValue(*m_staticTextDeleteRight, st.deleteCount<RIGHT_SIDE>(), *m_bitmapDeleteRight, L"so_delete_right_sicon");
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
//=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!!
@@ -543,8 +546,6 @@ private:
//work around defunct keyboard focus on macOS (or is it wxMac?) => not needed for this dialog!
//void onLocalKeyEvent(wxKeyEvent& event);
- void OnToggleAutoRetryCount(wxCommandEvent& event) override { updateGui(); }
-
void setExtApp(const std::vector<ExternalApp>& extApp);
std::vector<ExternalApp> getExtApp() const;
@@ -581,13 +582,12 @@ OptionsDlg::OptionsDlg(wxWindow* parent, XmlGlobalSettings& globalSettings) :
m_bpButtonRemoveRow->SetBitmapLabel(getResourceImage(L"item_remove"));
setBitmapTextLabel(*m_buttonResetDialogs, getResourceImage(L"reset_dialogs").ConvertToImage(), m_buttonResetDialogs->GetLabel());
+ m_staticTextResetDialogs->Wrap(std::max(fastFromDIP(200), m_buttonResetDialogs->GetMinSize().x));
+
m_checkBoxFailSafe ->SetValue(globalSettings.failSafeFileCopy);
m_checkBoxCopyLocked ->SetValue(globalSettings.copyLockedFiles);
m_checkBoxCopyPermissions->SetValue(globalSettings.copyFilePermissions);
- m_spinCtrlAutoRetryCount->SetValue(globalSettings.automaticRetryCount);
- m_spinCtrlAutoRetryDelay->SetValue(globalSettings.automaticRetryDelay);
-
setExtApp(globalSettings.gui.externalApps);
updateGui();
@@ -601,15 +601,20 @@ OptionsDlg::OptionsDlg(wxWindow* parent, XmlGlobalSettings& globalSettings) :
L"\n" +
L"%item_path2%, %folder_path2%, %local_path2% \t" + _("Parameters for opposite side");
- m_gridCustomCommand->GetGridWindow()->SetToolTip(toolTip);
+ m_gridCustomCommand->GetGridWindow() ->SetToolTip(toolTip);
m_gridCustomCommand->GetGridColLabelWindow()->SetToolTip(toolTip);
m_gridCustomCommand->SetMargins(0, 0);
+ //temporarily set dummy value for window height calculations:
+ setExtApp(std::vector<ExternalApp>(globalSettings.gui.externalApps.size() + 1));
+
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
//=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!!
- Layout();
Center(); //needs to be re-applied after a dialog size change!
+ //restore actual value:
+ setExtApp(globalSettings.gui.externalApps);
+
//automatically fit column width to match total grid width
Connect(wxEVT_SIZE, wxSizeEventHandler(OptionsDlg::onResize), nullptr, this);
wxSizeEvent dummy;
@@ -622,16 +627,14 @@ OptionsDlg::OptionsDlg(wxWindow* parent, XmlGlobalSettings& globalSettings) :
void OptionsDlg::onResize(wxSizeEvent& event)
{
const int widthTotal = m_gridCustomCommand->GetGridWindow()->GetClientSize().GetWidth();
+ assert(m_gridCustomCommand->GetNumberCols() == 2);
- if (widthTotal >= 0 && m_gridCustomCommand->GetNumberCols() == 2)
- {
- const int w0 = widthTotal * 2 / 5; //ratio 2 : 3
- const int w1 = widthTotal - w0;
- m_gridCustomCommand->SetColSize(0, w0);
- m_gridCustomCommand->SetColSize(1, w1);
+ const int w0 = widthTotal * 2 / 5; //ratio 2 : 3
+ const int w1 = widthTotal - w0;
+ m_gridCustomCommand->SetColSize(0, w0);
+ m_gridCustomCommand->SetColSize(1, w1);
- m_gridCustomCommand->Refresh(); //required on Ubuntu
- }
+ m_gridCustomCommand->Refresh(); //required on Ubuntu
event.Skip();
}
@@ -639,10 +642,6 @@ void OptionsDlg::onResize(wxSizeEvent& event)
void OptionsDlg::updateGui()
{
- const bool autoRetryActive = m_spinCtrlAutoRetryCount->GetValue() > 0;
- m_staticTextAutoRetryDelay->Enable(autoRetryActive);
- m_spinCtrlAutoRetryDelay ->Enable(autoRetryActive);
-
m_buttonResetDialogs->Enable(confirmDlgs_ != defaultCfg_.confirmDlgs ||
warnDlgs_ != defaultCfg_.warnDlgs ||
autoCloseProgressDialog_ != defaultCfg_.autoCloseProgressDialog);
@@ -664,9 +663,6 @@ void OptionsDlg::OnDefault(wxCommandEvent& event)
m_checkBoxCopyLocked ->SetValue(defaultCfg_.copyLockedFiles);
m_checkBoxCopyPermissions->SetValue(defaultCfg_.copyFilePermissions);
- m_spinCtrlAutoRetryCount->SetValue(defaultCfg_.automaticRetryCount);
- m_spinCtrlAutoRetryDelay->SetValue(defaultCfg_.automaticRetryDelay);
-
setExtApp(defaultCfg_.gui.externalApps);
updateGui();
}
@@ -679,9 +675,6 @@ void OptionsDlg::OnOkay(wxCommandEvent& event)
globalCfgOut_.copyLockedFiles = m_checkBoxCopyLocked->GetValue();
globalCfgOut_.copyFilePermissions = m_checkBoxCopyPermissions->GetValue();
- globalCfgOut_.automaticRetryCount = m_spinCtrlAutoRetryCount->GetValue();
- globalCfgOut_.automaticRetryDelay = m_spinCtrlAutoRetryDelay->GetValue();
-
globalCfgOut_.gui.externalApps = getExtApp();
globalCfgOut_.confirmDlgs = confirmDlgs_;
@@ -694,19 +687,17 @@ void OptionsDlg::OnOkay(wxCommandEvent& event)
void OptionsDlg::setExtApp(const std::vector<ExternalApp>& extApps)
{
- auto extAppsTmp = extApps;
- erase_if(extAppsTmp, [](auto& entry) { return entry.description.empty() && entry.cmdLine.empty(); });
+ int rowDiff = static_cast<int>(extApps.size()) - m_gridCustomCommand->GetNumberRows();
+ ++rowDiff; //append empty row to facilitate insertions by user
- extAppsTmp.emplace_back(); //append empty row to facilitate insertions by user
-
- const int rowCount = m_gridCustomCommand->GetNumberRows();
- if (rowCount > 0)
- m_gridCustomCommand->DeleteRows(0, rowCount);
+ if (rowDiff >= 0)
+ m_gridCustomCommand->AppendRows(rowDiff);
+ else
+ m_gridCustomCommand->DeleteRows(0, -rowDiff);
- m_gridCustomCommand->AppendRows(static_cast<int>(extAppsTmp.size()));
- for (auto it = extAppsTmp.begin(); it != extAppsTmp.end(); ++it)
+ for (auto it = extApps.begin(); it != extApps.end(); ++it)
{
- const int row = it - extAppsTmp.begin();
+ const int row = it - extApps.begin();
const std::wstring description = zen::translate(it->description);
if (description != it->description) //remember english description to save in GlobalSettings.xml later rather than hard-code translation
@@ -740,12 +731,14 @@ std::vector<ExternalApp> OptionsDlg::getExtApp() const
void OptionsDlg::OnAddRow(wxCommandEvent& event)
{
-
const int selectedRow = m_gridCustomCommand->GetGridCursorRow();
if (0 <= selectedRow && selectedRow < m_gridCustomCommand->GetNumberRows())
m_gridCustomCommand->InsertRows(selectedRow);
else
m_gridCustomCommand->AppendRows();
+
+ wxSizeEvent dummy2;
+ onResize(dummy2);
}
@@ -753,13 +746,15 @@ void OptionsDlg::OnRemoveRow(wxCommandEvent& event)
{
if (m_gridCustomCommand->GetNumberRows() > 0)
{
-
const int selectedRow = m_gridCustomCommand->GetGridCursorRow();
if (0 <= selectedRow && selectedRow < m_gridCustomCommand->GetNumberRows())
m_gridCustomCommand->DeleteRows(selectedRow);
else
m_gridCustomCommand->DeleteRows(m_gridCustomCommand->GetNumberRows() - 1);
}
+
+ wxSizeEvent dummy2;
+ onResize(dummy2);
}
@@ -827,7 +822,7 @@ SelectTimespanDlg::SelectTimespanDlg(wxWindow* parent, time_t& timeFrom, time_t&
m_calendarFrom->SetDate(timeFromTmp);
m_calendarTo ->SetDate(timeToTmp );
- //enable dialog-specific key local events
+ //enable dialog-specific key events
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SelectTimespanDlg::onLocalKeyEvent), nullptr, this);
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
@@ -851,7 +846,7 @@ void SelectTimespanDlg::OnOkay(wxCommandEvent& event)
//align to full days
from.ResetTime();
- to.ResetTime(); //reset local(!) time
+ to .ResetTime(); //reset local(!) time
to += wxTimeSpan::Day();
to -= wxTimeSpan::Second(); //go back to end of previous day
@@ -905,21 +900,26 @@ CfgHighlightDlg::CfgHighlightDlg(wxWindow* parent, int& cfgHistSyncOverdueDays)
CfgHighlightDlgGenerated(parent),
cfgHistSyncOverdueDaysOut_(cfgHistSyncOverdueDays)
{
+
+ m_staticTextHighlight->Wrap(fastFromDIP(300));
+
+ m_spinCtrlOverdueDays->SetMinSize(wxSize(fastFromDIP(70), -1)); //Hack: set size (why does wxWindow::Size() not work?)
+
setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel));
- m_spinCtrlSyncOverdueDays->SetValue(cfgHistSyncOverdueDays);
+ m_spinCtrlOverdueDays->SetValue(cfgHistSyncOverdueDays);
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
//=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!!
Center(); //needs to be re-applied after a dialog size change!
- m_spinCtrlSyncOverdueDays->SetFocus();
+ m_spinCtrlOverdueDays->SetFocus();
}
void CfgHighlightDlg::OnOkay(wxCommandEvent& event)
{
- cfgHistSyncOverdueDaysOut_ = m_spinCtrlSyncOverdueDays->GetValue();
+ cfgHistSyncOverdueDaysOut_ = m_spinCtrlOverdueDays->GetValue();
EndModal(ReturnSmallDlg::BUTTON_OKAY);
}
@@ -961,6 +961,7 @@ ActivationDlg::ActivationDlg(wxWindow* parent,
//setMainInstructionFont(*m_staticTextMain);
m_bitmapActivation->SetBitmap(getResourceImage(L"website"));
+ m_textCtrlOfflineActivationKey->ForceUpper();
m_textCtrlLastError ->ChangeValue(lastErrorMsg);
m_textCtrlManualActivationUrl ->ChangeValue(manualActivationUrl);
@@ -1059,6 +1060,9 @@ DownloadProgressWindow::Impl::Impl(wxWindow* parent, int64_t fileSizeTotal) :
setStandardButtonLayout(*bSizerStdButtons, StdButtons().setCancel(m_buttonCancel));
setMainInstructionFont(*m_staticTextHeader);
+ m_staticTextHeader->Wrap(fastFromDIP(460)); //*after* font change!
+
+ m_staticTextDetails->SetMinSize(wxSize(fastFromDIP(550), -1));
m_bitmapDownloading->SetBitmap(getResourceImage(L"website"));
diff --git a/FreeFileSync/Source/ui/sync_cfg.cpp b/FreeFileSync/Source/ui/sync_cfg.cpp
index 3f73a263..38aa8940 100755
--- a/FreeFileSync/Source/ui/sync_cfg.cpp
+++ b/FreeFileSync/Source/ui/sync_cfg.cpp
@@ -22,6 +22,7 @@
#include "../file_hierarchy.h"
#include "../lib/help_provider.h"
#include "../lib/norm_filter.h"
+#include "../fs/concrete.h"
using namespace zen;
@@ -30,22 +31,7 @@ using namespace fff;
namespace
{
-struct MiscSyncConfig
-{
- bool ignoreErrors = false;
- Zstring postSyncCommand;
- PostSyncCondition postSyncCondition = PostSyncCondition::COMPLETION;
- std::vector<Zstring> commandHistory;
-};
-
-
-struct GlobalSyncConfig
-{
- CompConfig cmpConfig;
- SyncConfig syncCfg;
- FilterConfig filter;
- MiscSyncConfig miscCfg;
-};
+const int CFG_DESCRIPTION_WIDTH_DIP = 250;
class ConfigDialog : public ConfigDlgGenerated
@@ -54,8 +40,8 @@ public:
ConfigDialog(wxWindow* parent,
SyncConfigPanel panelToShow,
int localPairIndexToShow,
- std::vector<LocalPairConfig>& folderPairConfig,
- GlobalSyncConfig& globalCfg,
+ GlobalPairConfig& globalPairCfg,
+ std::vector<LocalPairConfig>& localPairConfig,
size_t commandHistItemsMax);
private:
@@ -91,8 +77,8 @@ private:
void OnChangeCompOption (wxCommandEvent& event) override { updateCompGui(); }
void onlTimeShiftKeyDown (wxKeyEvent& event) override;
- std::shared_ptr<const CompConfig> getCompConfig() const;
- void setCompConfig(std::shared_ptr<const CompConfig> compCfg);
+ Opt<CompConfig> getCompConfig() const;
+ void setCompConfig(const CompConfig* compCfg);
void updateCompGui();
@@ -142,8 +128,8 @@ private:
void OnHelpDetectMovedFiles(wxHyperlinkEvent& event) override { displayHelpEntry(L"synchronization-settings", this); }
void OnHelpVersioning (wxHyperlinkEvent& event) override { displayHelpEntry(L"versioning", this); }
- std::shared_ptr<const SyncConfig> getSyncConfig() const;
- void setSyncConfig(std::shared_ptr<const SyncConfig> syncCfg);
+ Opt<SyncConfig> getSyncConfig() const;
+ void setSyncConfig(const SyncConfig* syncCfg);
void updateSyncGui();
@@ -152,6 +138,7 @@ private:
//-----------------------------------------------------
void OnToggleIgnoreErrors(wxCommandEvent& event) override { updateMiscGui(); }
+ void OnToggleAutoRetry (wxCommandEvent& event) override { updateMiscGui(); }
MiscSyncConfig getMiscSyncOptions() const;
void setMiscSyncOptions(const MiscSyncConfig& miscCfg);
@@ -171,12 +158,12 @@ private:
bool unselectFolderPairConfig(); //returns false on error: shows message box!
//output-only parameters
- GlobalSyncConfig& globalCfgOut_;
- std::vector<LocalPairConfig>& folderPairConfigOut_;
+ GlobalPairConfig& globalPairCfgOut_;
+ std::vector<LocalPairConfig>& localPairCfgOut_;
//working copy of ALL config parameters: only one folder pair is selected at a time!
- GlobalSyncConfig globalCfg_;
- std::vector<LocalPairConfig> folderPairConfig_;
+ GlobalPairConfig globalPairCfg_;
+ std::vector<LocalPairConfig> localPairCfg_;
int selectedPairIndexToShow_ = EMPTY_PAIR_INDEX_SELECTED;
static const int EMPTY_PAIR_INDEX_SELECTED = -2;
@@ -223,26 +210,23 @@ std::wstring getSyncVariantDescription(DirectionConfig::Variant var)
ConfigDialog::ConfigDialog(wxWindow* parent,
SyncConfigPanel panelToShow,
int localPairIndexToShow,
- std::vector<LocalPairConfig>& folderPairConfig,
- GlobalSyncConfig& globalCfg,
+ GlobalPairConfig& globalPairCfg,
+ std::vector<LocalPairConfig>& localPairConfig,
size_t commandHistItemsMax) :
ConfigDlgGenerated(parent),
versioningFolder_(*m_panelVersioning, *m_buttonSelectVersioningFolder, *m_bpButtonSelectAltFolder, *m_versioningFolderPath, nullptr /*staticText*/, nullptr /*dropWindow2*/),
- globalCfgOut_(globalCfg),
- folderPairConfigOut_(folderPairConfig),
- globalCfg_(globalCfg),
- folderPairConfig_(folderPairConfig),
+ globalPairCfgOut_(globalPairCfg),
+ localPairCfgOut_(localPairConfig),
+ globalPairCfg_(globalPairCfg),
+ localPairCfg_(localPairConfig),
commandHistItemsMax_(commandHistItemsMax)
{
setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel));
- SetTitle(_("Synchronization Settings"));
-
- m_notebook->SetPadding(wxSize(2, 0)); //height cannot be changed
+ m_notebook->SetPadding(wxSize(fastFromDIP(2), 0)); //height cannot be changed
//fill image list to cope with wxNotebook image setting design desaster...
- const int imgListSize = getResourceImage(L"cfg_compare_small").GetHeight();
- assert(imgListSize == 16); //Windows default size for panel caption
+ const int imgListSize = getResourceImage(L"cfg_compare_sicon").GetHeight();
auto imgList = std::make_unique<wxImageList>(imgListSize, imgListSize);
auto addToImageList = [&](const wxBitmap& bmp)
@@ -253,9 +237,9 @@ ConfigDialog::ConfigDialog(wxWindow* parent,
imgList->Add(greyScale(bmp));
};
//add images in same sequence like ConfigTypeImage enum!!!
- addToImageList(getResourceImage(L"cfg_compare_small"));
- addToImageList(getResourceImage(L"filter_small" ));
- addToImageList(getResourceImage(L"cfg_sync_small" ));
+ addToImageList(getResourceImage(L"cfg_compare_sicon"));
+ addToImageList(getResourceImage(L"cfg_filter_sicon"));
+ addToImageList(getResourceImage(L"cfg_sync_sicon"));
assert(imgList->GetImageCount() == static_cast<int>(ConfigTypeImage::SYNC_GREY) + 1);
m_notebook->AssignImageList(imgList.release()); //pass ownership
@@ -275,12 +259,18 @@ ConfigDialog::ConfigDialog(wxWindow* parent,
m_toggleBtnByContent ->SetToolTip(getCompVariantDescription(CompareVariant::CONTENT));
m_toggleBtnBySize ->SetToolTip(getCompVariantDescription(CompareVariant::SIZE));
+ m_staticTextCompVarDescription->SetMinSize(wxSize(fastFromDIP(CFG_DESCRIPTION_WIDTH_DIP), -1));
+
//------------- filter panel --------------------------
+ m_textCtrlInclude->SetMinSize(wxSize(fastFromDIP(280), -1));
+
assert(!contains(m_buttonClear->GetLabel(), L"&C") && !contains(m_buttonClear->GetLabel(), L"&c")); //gazillionth wxWidgets bug on OS X: Command + C mistakenly hits "&C" access key!
m_textCtrlInclude->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(ConfigDialog::onFilterKeyEvent), nullptr, this);
m_textCtrlExclude->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(ConfigDialog::onFilterKeyEvent), nullptr, this);
+ m_staticTextFilterDescr->Wrap(fastFromDIP(590));
+
enumTimeDescr_.
add(UnitTime::NONE, L"(" + _("None") + L")"). //meta options should be enclosed in parentheses
add(UnitTime::TODAY, _("Today")).
@@ -318,10 +308,15 @@ ConfigDialog::ConfigDialog(wxWindow* parent,
setRelativeFontSize(*m_toggleBtnUpdate, 1.25);
setRelativeFontSize(*m_toggleBtnCustom, 1.25);
+ m_staticTextSyncVarDescription->SetMinSize(wxSize(fastFromDIP(CFG_DESCRIPTION_WIDTH_DIP), -1));
+
m_toggleBtnRecycler ->SetToolTip(_("Retain deleted and overwritten files in the recycle bin"));
m_toggleBtnPermanent ->SetToolTip(_("Delete and overwrite files permanently"));
m_toggleBtnVersioning->SetToolTip(_("Move files to a user-defined folder"));
+ m_spinCtrlAutoRetryCount->SetMinSize(wxSize(fastFromDIP(60), -1)); //Hack: set size (why does wxWindow::Size() not work?)
+ m_spinCtrlAutoRetryDelay->SetMinSize(wxSize(fastFromDIP(60), -1)); //
+
enumVersioningStyle_.
add(VersioningStyle::REPLACE, _("Replace"), _("Move files and replace if existing")).
add(VersioningStyle::ADD_TIMESTAMP, _("Time stamp"), _("Append a time stamp to each file name"));
@@ -334,38 +329,50 @@ ConfigDialog::ConfigDialog(wxWindow* parent,
m_comboBoxPostSyncCommand->SetHint(_("Example:") + L" systemctl poweroff");
- //use spacer to keep dialog height stable, no matter if versioning options are visible
- //bSizerDelHandling->Add(0, m_panelVersioning->GetSize().GetHeight());
-
//-----------------------------------------------------
- //enable dialog-specific key local events
+ //enable dialog-specific key events
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(ConfigDialog::onLocalKeyEvent), nullptr, this);
assert(!m_listBoxFolderPair->IsSorted());
m_listBoxFolderPair->Append(_("Main config"));
- for (const LocalPairConfig& cfg : folderPairConfig)
+ for (const LocalPairConfig& lpc : localPairConfig)
{
- auto fpName = utfTo<std::wstring>(cfg.folderPairName);
+ std::wstring fpName = getShortDisplayNameForFolderPair(createAbstractPath(lpc.folderPathPhraseLeft ),
+ createAbstractPath(lpc.folderPathPhraseRight));
if (trimCpy(fpName).empty())
fpName = L"<" + _("empty") + L">";
+
m_listBoxFolderPair->Append(L" " + fpName);
}
- if (folderPairConfig.empty())
+ if (localPairConfig.empty())
{
m_listBoxFolderPair->Hide();
m_staticTextFolderPairLabel->Hide();
}
- selectFolderPairConfig(-1); //temporarily set main config as reference for window height calculations:
+ //temporarily set main config as reference for window height calculations:
+ globalPairCfg_ = GlobalPairConfig();
+ globalPairCfg_.syncCfg.directionCfg.var = DirectionConfig::MIRROR; //
+ globalPairCfg_.syncCfg.handleDeletion = DeletionPolicy::VERSIONING; //set tentatively for sync dir height calculation below
+ globalPairCfg_.syncCfg.versioningFolderPhrase = Zstr("dummy"); //
+
+ selectFolderPairConfig(-1);
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
//=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!!
Center(); //needs to be re-applied after a dialog size change!
+ //keep stable sizer height: "two way" description is smaller than grid of sync directions
+ bSizerSyncDirHolder ->SetMinSize(-1, bSizerSyncDirections ->GetSize().y);
+ bSizerVersioningHolder->SetMinSize(-1, bSizerVersioningHolder->GetSize().y);
+
unselectFolderPairConfig();
+ globalPairCfg_ = globalPairCfg; //restore proper value
+
+ //set actual sync config
selectFolderPairConfig(localPairIndexToShow);
//more useful and Enter is redirected to m_buttonOkay anyway:
@@ -501,30 +508,29 @@ void ConfigDialog::onlTimeShiftKeyDown(wxKeyEvent& event)
}
-std::shared_ptr<const CompConfig> ConfigDialog::getCompConfig() const
+Opt<CompConfig> ConfigDialog::getCompConfig() const
{
if (!m_checkBoxUseLocalCmpOptions->GetValue())
- return nullptr;
+ return NoValue();
CompConfig compCfg;
compCfg.compareVar = localCmpVar_;
compCfg.handleSymlinks = !m_checkBoxSymlinksInclude->GetValue() ? SymLinkHandling::EXCLUDE : m_radioBtnSymlinksDirect->GetValue() ? SymLinkHandling::DIRECT : SymLinkHandling::FOLLOW;
compCfg.ignoreTimeShiftMinutes = fromTimeShiftPhrase(copyStringTo<std::wstring>(m_textCtrlTimeShift->GetValue()));
-
- return std::make_shared<const CompConfig>(compCfg);
+ return compCfg;
}
-void ConfigDialog::setCompConfig(std::shared_ptr<const CompConfig> compCfg)
+void ConfigDialog::setCompConfig(const CompConfig* compCfg)
{
- m_checkBoxUseLocalCmpOptions->SetValue(compCfg != nullptr);
+ m_checkBoxUseLocalCmpOptions->SetValue(compCfg);
- if (!compCfg) //when local settings are inactive, display (current) global settings instead:
- compCfg = std::make_shared<const CompConfig>(globalCfg_.cmpConfig);
+ //when local settings are inactive, display (current) global settings instead:
+ const CompConfig tmpCfg = compCfg ? *compCfg : globalPairCfg_.cmpConfig;
- localCmpVar_ = compCfg->compareVar;
+ localCmpVar_ = tmpCfg.compareVar;
- switch (compCfg->handleSymlinks)
+ switch (tmpCfg.handleSymlinks)
{
case SymLinkHandling::EXCLUDE:
m_checkBoxSymlinksInclude->SetValue(false);
@@ -540,7 +546,7 @@ void ConfigDialog::setCompConfig(std::shared_ptr<const CompConfig> compCfg)
break;
}
- m_textCtrlTimeShift->ChangeValue(toTimeShiftPhrase(compCfg->ignoreTimeShiftMinutes));
+ m_textCtrlTimeShift->ChangeValue(toTimeShiftPhrase(tmpCfg.ignoreTimeShiftMinutes));
updateCompGui();
}
@@ -583,19 +589,19 @@ void ConfigDialog::updateCompGui()
switch (localCmpVar_) //unconditionally update image, including "local options off"
{
case CompareVariant::TIME_SIZE:
- setBitmap(*m_bitmapCompVariant, getResourceImage(L"file-time"));
+ setBitmap(*m_bitmapCompVariant, getResourceImage(L"cmp_file_time"));
break;
case CompareVariant::CONTENT:
- setBitmap(*m_bitmapCompVariant, getResourceImage(L"file-content"));
+ setBitmap(*m_bitmapCompVariant, getResourceImage(L"cmp_file_content"));
break;
case CompareVariant::SIZE:
- setBitmap(*m_bitmapCompVariant, getResourceImage(L"file-size"));
+ setBitmap(*m_bitmapCompVariant, getResourceImage(L"cmp_file_size"));
break;
}
//active variant description:
setText(*m_staticTextCompVarDescription, getCompVariantDescription(localCmpVar_));
- m_staticTextCompVarDescription->Wrap(400); //needs to be reapplied after SetLabel()
+ m_staticTextCompVarDescription->Wrap(fastFromDIP(CFG_DESCRIPTION_WIDTH_DIP)); //needs to be reapplied after SetLabel()
m_radioBtnSymlinksDirect->Enable(m_checkBoxSymlinksInclude->GetValue());
m_radioBtnSymlinksFollow->Enable(m_checkBoxSymlinksInclude->GetValue());
@@ -668,8 +674,8 @@ void ConfigDialog::updateFilterGui()
};
setStatusBitmap(*m_bitmapInclude, L"filter_include", !NameFilter::isNull(activeCfg.includeFilter, FilterConfig().excludeFilter));
setStatusBitmap(*m_bitmapExclude, L"filter_exclude", !NameFilter::isNull(FilterConfig().includeFilter, activeCfg.excludeFilter));
- setStatusBitmap(*m_bitmapFilterDate, L"file-time", activeCfg.unitTimeSpan != UnitTime::NONE);
- setStatusBitmap(*m_bitmapFilterSize, L"file-size", activeCfg.unitSizeMin != UnitSize::NONE || activeCfg.unitSizeMax != UnitSize::NONE);
+ setStatusBitmap(*m_bitmapFilterDate, L"cmp_file_time", activeCfg.unitTimeSpan != UnitTime::NONE);
+ setStatusBitmap(*m_bitmapFilterSize, L"cmp_file_size", activeCfg.unitSizeMin != UnitSize::NONE || activeCfg.unitSizeMax != UnitSize::NONE);
m_spinCtrlTimespan->Enable(activeCfg.unitTimeSpan == UnitTime::LAST_X_DAYS);
m_spinCtrlMinSize ->Enable(activeCfg.unitSizeMin != UnitSize::NONE);
@@ -871,32 +877,31 @@ void updateSyncDirectionIcons(const DirectionConfig& directionCfg,
}
-std::shared_ptr<const SyncConfig> ConfigDialog::getSyncConfig() const
+Opt<SyncConfig> ConfigDialog::getSyncConfig() const
{
if (!m_checkBoxUseLocalSyncOptions->GetValue())
- return nullptr;
+ return NoValue();
SyncConfig syncCfg;
syncCfg.directionCfg = directionCfg_;
syncCfg.handleDeletion = handleDeletion_;
syncCfg.versioningFolderPhrase = versioningFolder_.getPath();
syncCfg.versioningStyle = getEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle);
-
- return std::make_shared<const SyncConfig>(syncCfg);
+ return syncCfg;
}
-void ConfigDialog::setSyncConfig(std::shared_ptr<const SyncConfig> syncCfg)
+void ConfigDialog::setSyncConfig(const SyncConfig* syncCfg)
{
- m_checkBoxUseLocalSyncOptions->SetValue(syncCfg != nullptr);
+ m_checkBoxUseLocalSyncOptions->SetValue(syncCfg);
- if (!syncCfg) //when local settings are inactive, display (current) global settings instead:
- syncCfg = std::make_shared<const SyncConfig>(globalCfg_.syncCfg);
+ //when local settings are inactive, display (current) global settings instead:
+ const SyncConfig tmpCfg = syncCfg ? *syncCfg : globalPairCfg_.syncCfg;
- directionCfg_ = syncCfg->directionCfg; //make working copy; ownership *not* on GUI
- handleDeletion_ = syncCfg->handleDeletion;
- versioningFolder_.setPath(syncCfg->versioningFolderPhrase);
- setEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle, syncCfg->versioningStyle);
+ directionCfg_ = tmpCfg.directionCfg; //make working copy; ownership *not* on GUI
+ handleDeletion_ = tmpCfg.handleDeletion;
+ versioningFolder_.setPath(tmpCfg.versioningFolderPhrase);
+ setEnumVal(enumVersioningStyle_, *m_choiceVersioningStyle, tmpCfg.versioningStyle);
updateSyncGui();
}
@@ -938,7 +943,7 @@ void ConfigDialog::updateSyncGui()
setBitmap(*m_bitmapDatabase, getResourceImage(L"database"));
else
{
- const CompareVariant activeCmpVar = m_checkBoxUseLocalCmpOptions->GetValue() ? localCmpVar_ : globalCfg_.cmpConfig.compareVar;
+ const CompareVariant activeCmpVar = m_checkBoxUseLocalCmpOptions->GetValue() ? localCmpVar_ : globalPairCfg_.cmpConfig.compareVar;
m_bitmapLeftNewer ->Show(activeCmpVar == CompareVariant::TIME_SIZE);
m_bpButtonLeftNewer ->Show(activeCmpVar == CompareVariant::TIME_SIZE);
@@ -951,7 +956,7 @@ void ConfigDialog::updateSyncGui()
//active variant description:
setText(*m_staticTextSyncVarDescription, getSyncVariantDescription(directionCfg_.var));
- m_staticTextSyncVarDescription->Wrap(220); //needs to be reapplied after SetLabel()
+ m_staticTextSyncVarDescription->Wrap(fastFromDIP(CFG_DESCRIPTION_WIDTH_DIP)); //needs to be reapplied after SetLabel()
//update toggle buttons -> they have no parameter-ownership at all!
m_toggleBtnTwoWay->SetValue(false);
@@ -1009,7 +1014,7 @@ void ConfigDialog::updateSyncGui()
setText(*m_staticTextDeletionTypeDescription, _("Move files to a user-defined folder"));
break;
}
- //m_staticTextDeletionTypeDescription->Wrap(200); //needs to be reapplied after SetLabel()
+ //m_staticTextDeletionTypeDescription->Wrap(fastFromDIP(200)); //needs to be reapplied after SetLabel()
const bool versioningSelected = handleDeletion_ == DeletionPolicy::VERSIONING;
m_panelVersioning ->Show(versioningSelected);
@@ -1037,7 +1042,6 @@ void ConfigDialog::updateSyncGui()
}
m_panelSyncSettings->Layout();
- //Layout();
//Refresh(); //removes a few artifacts when toggling display of versioning folder
}
@@ -1047,7 +1051,10 @@ MiscSyncConfig ConfigDialog::getMiscSyncOptions() const
assert(selectedPairIndexToShow_ == -1);
MiscSyncConfig miscCfg;
- miscCfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue();
+ miscCfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue();
+ miscCfg.automaticRetryCount = m_checkBoxAutoRetry->GetValue() ? m_spinCtrlAutoRetryCount->GetValue() : 0;
+ miscCfg.automaticRetryDelay = m_spinCtrlAutoRetryDelay->GetValue();
+
miscCfg.postSyncCommand = m_comboBoxPostSyncCommand->getValue();
miscCfg.postSyncCondition = getEnumVal(enumPostSyncCondition_, *m_choicePostSyncCondition),
miscCfg.commandHistory = m_comboBoxPostSyncCommand->getHistory();
@@ -1058,6 +1065,10 @@ MiscSyncConfig ConfigDialog::getMiscSyncOptions() const
void ConfigDialog::setMiscSyncOptions(const MiscSyncConfig& miscCfg)
{
m_checkBoxIgnoreErrors->SetValue(miscCfg.ignoreErrors);
+ m_checkBoxAutoRetry ->SetValue(miscCfg.automaticRetryCount > 0);
+ m_spinCtrlAutoRetryCount->SetValue(std::max<size_t>(miscCfg.automaticRetryCount, 0));
+ m_spinCtrlAutoRetryDelay->SetValue(miscCfg.automaticRetryDelay);
+
m_comboBoxPostSyncCommand->setValue(miscCfg.postSyncCommand);
setEnumVal(enumPostSyncCondition_, *m_choicePostSyncCondition, miscCfg.postSyncCondition),
m_comboBoxPostSyncCommand->setHistory(miscCfg.commandHistory, commandHistItemsMax_);
@@ -1068,17 +1079,22 @@ void ConfigDialog::setMiscSyncOptions(const MiscSyncConfig& miscCfg)
void ConfigDialog::updateMiscGui()
{
- const MiscSyncConfig activeCfg = getMiscSyncOptions();
+ const MiscSyncConfig miscCfg = getMiscSyncOptions();
+
+ m_bitmapIgnoreErrors->SetBitmap(miscCfg.ignoreErrors ? getResourceImage(L"error_ignore_active") : greyScale(getResourceImage(L"error_ignore_inactive")));
+ m_bitmapRetryErrors ->SetBitmap(miscCfg.automaticRetryCount > 0 ? getResourceImage(L"error_retry") : greyScale(getResourceImage(L"error_retry")));
+
+ fgSizerAutoRetry->Show(miscCfg.automaticRetryCount > 0);
- m_bitmapIgnoreErrors->SetBitmap(getResourceImage(activeCfg.ignoreErrors ? L"msg_error_medium_ignored" : L"msg_error_medium"));
+ bSizerMiscConfig->Layout();
}
void ConfigDialog::selectFolderPairConfig(int newPairIndexToShow)
{
assert(selectedPairIndexToShow_ == EMPTY_PAIR_INDEX_SELECTED);
- assert(newPairIndexToShow == -1 || makeUnsigned(newPairIndexToShow) < folderPairConfig_.size());
- numeric::clamp(newPairIndexToShow, -1, static_cast<int>(folderPairConfig_.size()) - 1);
+ assert(newPairIndexToShow == -1 || makeUnsigned(newPairIndexToShow) < localPairCfg_.size());
+ numeric::clamp(newPairIndexToShow, -1, static_cast<int>(localPairCfg_.size()) - 1);
selectedPairIndexToShow_ = newPairIndexToShow;
m_listBoxFolderPair->SetSelection(newPairIndexToShow + 1);
@@ -1086,47 +1102,46 @@ void ConfigDialog::selectFolderPairConfig(int newPairIndexToShow)
//show/hide controls that are only relevant for main/local config
const bool mainConfigSelected = newPairIndexToShow < 0;
//comparison panel:
- m_staticTextMainCompSettings->Show( mainConfigSelected && !folderPairConfig_.empty());
- m_checkBoxUseLocalCmpOptions->Show(!mainConfigSelected && !folderPairConfig_.empty());
- m_staticlineCompHeader->Show(!folderPairConfig_.empty());
- m_panelCompSettingsHolder->Layout(); //fix comp panel glitch on Win 7 125% font size
+ m_staticTextMainCompSettings->Show( mainConfigSelected && !localPairCfg_.empty());
+ m_checkBoxUseLocalCmpOptions->Show(!mainConfigSelected && !localPairCfg_.empty());
+ m_staticlineCompHeader->Show(!localPairCfg_.empty());
+ m_panelCompSettingsTab->Layout(); //fix comp panel glitch on Win 7 125% font size
//filter panel
- m_staticTextMainFilterSettings ->Show( mainConfigSelected && !folderPairConfig_.empty());
- m_staticTextLocalFilterSettings->Show(!mainConfigSelected && !folderPairConfig_.empty());
- m_staticlineFilterHeader->Show(!folderPairConfig_.empty());
- m_panelFilterSettingsHolder->Layout();
+ m_staticTextMainFilterSettings ->Show( mainConfigSelected && !localPairCfg_.empty());
+ m_staticTextLocalFilterSettings->Show(!mainConfigSelected && !localPairCfg_.empty());
+ m_staticlineFilterHeader->Show(!localPairCfg_.empty());
+ m_panelFilterSettingsTab->Layout();
//sync panel:
- m_staticTextMainSyncSettings ->Show( mainConfigSelected && !folderPairConfig_.empty());
- m_checkBoxUseLocalSyncOptions->Show(!mainConfigSelected && !folderPairConfig_.empty());
- m_staticlineSyncHeader->Show(!folderPairConfig_.empty());
- m_panelSyncSettingsHolder->Layout();
+ m_staticTextMainSyncSettings ->Show( mainConfigSelected && !localPairCfg_.empty());
+ m_checkBoxUseLocalSyncOptions->Show(!mainConfigSelected && !localPairCfg_.empty());
+ m_staticlineSyncHeader->Show(!localPairCfg_.empty());
+ m_panelSyncSettingsTab->Layout();
//misc
bSizerMiscConfig->Show(mainConfigSelected);
- Layout();
if (mainConfigSelected)
{
- setCompConfig (std::make_shared<const CompConfig>(globalCfg_.cmpConfig));
- setSyncConfig (std::make_shared<const SyncConfig>(globalCfg_.syncCfg));
- setFilterConfig (globalCfg_.filter);
- setMiscSyncOptions(globalCfg_.miscCfg);
+ setCompConfig (&globalPairCfg_.cmpConfig);
+ setSyncConfig (&globalPairCfg_.syncCfg);
+ setFilterConfig (globalPairCfg_.filter);
+ setMiscSyncOptions(globalPairCfg_.miscCfg);
}
else
{
- setCompConfig (folderPairConfig_[selectedPairIndexToShow_].altCmpConfig);
- setSyncConfig (folderPairConfig_[selectedPairIndexToShow_].altSyncConfig);
- setFilterConfig(folderPairConfig_[selectedPairIndexToShow_].localFilter);
+ setCompConfig (localPairCfg_[selectedPairIndexToShow_].localCmpCfg .get());
+ setSyncConfig (localPairCfg_[selectedPairIndexToShow_].localSyncCfg.get());
+ setFilterConfig(localPairCfg_[selectedPairIndexToShow_].localFilter);
}
}
bool ConfigDialog::unselectFolderPairConfig()
{
- assert(selectedPairIndexToShow_ == -1 || makeUnsigned(selectedPairIndexToShow_) < folderPairConfig_.size());
+ assert(selectedPairIndexToShow_ == -1 || makeUnsigned(selectedPairIndexToShow_) < localPairCfg_.size());
- auto compCfg = getCompConfig();
- auto syncCfg = getSyncConfig();
- auto filterCfg = getFilterConfig();
+ Opt<CompConfig> compCfg = getCompConfig();
+ Opt<SyncConfig> syncCfg = getSyncConfig();
+ FilterConfig filterCfg = getFilterConfig();
//------- parameter validation (BEFORE writing output!) -------
@@ -1151,16 +1166,16 @@ bool ConfigDialog::unselectFolderPairConfig()
if (selectedPairIndexToShow_ < 0)
{
- globalCfg_.cmpConfig = *compCfg;
- globalCfg_.syncCfg = *syncCfg;
- globalCfg_.filter = filterCfg;
- globalCfg_.miscCfg = getMiscSyncOptions();
+ globalPairCfg_.cmpConfig = *compCfg;
+ globalPairCfg_.syncCfg = *syncCfg;
+ globalPairCfg_.filter = filterCfg;
+ globalPairCfg_.miscCfg = getMiscSyncOptions();
}
else
{
- folderPairConfig_[selectedPairIndexToShow_].altCmpConfig = compCfg;
- folderPairConfig_[selectedPairIndexToShow_].altSyncConfig = syncCfg;
- folderPairConfig_[selectedPairIndexToShow_].localFilter = filterCfg;
+ localPairCfg_[selectedPairIndexToShow_].localCmpCfg = compCfg;
+ localPairCfg_[selectedPairIndexToShow_].localSyncCfg = syncCfg;
+ localPairCfg_[selectedPairIndexToShow_].localFilter = filterCfg;
}
selectedPairIndexToShow_ = EMPTY_PAIR_INDEX_SELECTED;
@@ -1174,8 +1189,8 @@ void ConfigDialog::OnOkay(wxCommandEvent& event)
if (!unselectFolderPairConfig())
return;
- globalCfgOut_ = globalCfg_;
- folderPairConfigOut_ = folderPairConfig_;
+ globalPairCfgOut_ = globalPairCfg_;
+ localPairCfgOut_ = localPairCfg_;
EndModal(ReturnSyncConfig::BUTTON_OKAY);
}
@@ -1187,48 +1202,16 @@ ReturnSyncConfig::ButtonPressed fff::showSyncConfigDlg(wxWindow* parent,
SyncConfigPanel panelToShow,
int localPairIndexToShow,
- std::vector<LocalPairConfig>& folderPairConfig,
-
- CompConfig& globalCmpConfig,
- SyncConfig& globalSyncCfg,
- FilterConfig& globalFilter,
-
- bool& ignoreErrors,
- Zstring& postSyncCommand,
- PostSyncCondition& postSyncCondition,
- std::vector<Zstring>& commandHistory,
+ GlobalPairConfig& globalPairCfg,
+ std::vector<LocalPairConfig>& localPairConfig,
size_t commandHistItemsMax)
{
- GlobalSyncConfig globalCfg;
- globalCfg.cmpConfig = globalCmpConfig;
- globalCfg.syncCfg = globalSyncCfg;
- globalCfg.filter = globalFilter;
-
- globalCfg.miscCfg.ignoreErrors = ignoreErrors;
- globalCfg.miscCfg.postSyncCommand = postSyncCommand;
- globalCfg.miscCfg.postSyncCondition = postSyncCondition;
- globalCfg.miscCfg.commandHistory = commandHistory;
-
ConfigDialog syncDlg(parent,
panelToShow,
localPairIndexToShow,
- folderPairConfig,
- globalCfg,
+ globalPairCfg,
+ localPairConfig,
commandHistItemsMax);
- const auto rv = static_cast<ReturnSyncConfig::ButtonPressed>(syncDlg.ShowModal());
-
- if (rv != ReturnSyncConfig::BUTTON_CANCEL)
- {
- globalCmpConfig = globalCfg.cmpConfig;
- globalSyncCfg = globalCfg.syncCfg;
- globalFilter = globalCfg.filter;
-
- ignoreErrors = globalCfg.miscCfg.ignoreErrors;
- postSyncCommand = globalCfg.miscCfg.postSyncCommand ;
- postSyncCondition = globalCfg.miscCfg.postSyncCondition;
- commandHistory = globalCfg.miscCfg.commandHistory;
- }
-
- return rv;
+ return static_cast<ReturnSyncConfig::ButtonPressed>(syncDlg.ShowModal());
}
diff --git a/FreeFileSync/Source/ui/sync_cfg.h b/FreeFileSync/Source/ui/sync_cfg.h
index 9d64ffcf..a18207de 100755
--- a/FreeFileSync/Source/ui/sync_cfg.h
+++ b/FreeFileSync/Source/ui/sync_cfg.h
@@ -8,7 +8,7 @@
#define SYNC_CFG_H_31289470134253425
#include <wx/window.h>
-#include "../lib/process_xml.h"
+#include "../structures.h"
namespace fff
@@ -29,12 +29,22 @@ enum class SyncConfigPanel
SYNC = 2, //
};
-struct LocalPairConfig
+struct MiscSyncConfig
{
- Zstring folderPairName; //read-only!
- std::shared_ptr<const CompConfig> altCmpConfig; //optional
- std::shared_ptr<const SyncConfig> altSyncConfig; //
- FilterConfig localFilter;
+ bool ignoreErrors = false;
+ size_t automaticRetryCount = 0;
+ size_t automaticRetryDelay = 0;
+ Zstring postSyncCommand;
+ PostSyncCondition postSyncCondition = PostSyncCondition::COMPLETION;
+ std::vector<Zstring> commandHistory;
+};
+
+struct GlobalPairConfig
+{
+ CompConfig cmpConfig;
+ SyncConfig syncCfg;
+ FilterConfig filter;
+ MiscSyncConfig miscCfg;
};
@@ -42,16 +52,8 @@ ReturnSyncConfig::ButtonPressed showSyncConfigDlg(wxWindow* parent,
SyncConfigPanel panelToShow,
int localPairIndexToShow, //< 0 to show global config
- std::vector<LocalPairConfig>& folderPairConfig,
-
- CompConfig& globalCmpConfig,
- SyncConfig& globalSyncCfg,
- FilterConfig& globalFilter,
-
- bool& ignoreErrors,
- Zstring& postSyncCommand,
- PostSyncCondition& postSyncCondition,
- std::vector<Zstring>& commandHistory,
+ GlobalPairConfig& globalPairCfg,
+ std::vector<LocalPairConfig>& localPairConfig,
size_t commandHistoryMax);
}
diff --git a/FreeFileSync/Source/ui/tray_icon.cpp b/FreeFileSync/Source/ui/tray_icon.cpp
index 98412723..4508f7a6 100755
--- a/FreeFileSync/Source/ui/tray_icon.cpp
+++ b/FreeFileSync/Source/ui/tray_icon.cpp
@@ -133,7 +133,7 @@ wxIcon FfsTrayIcon::ProgressIconGenerator::get(double fraction)
class FfsTrayIcon::TaskBarImpl : public wxTaskBarIcon
{
public:
- TaskBarImpl(const std::function<void()>& onRequestResume) : onRequestResume_(onRequestResume)
+ TaskBarImpl(const std::function<void()>& requestResume) : requestResume_(requestResume)
{
Connect(wxEVT_TASKBAR_LEFT_DCLICK, wxEventHandler(TaskBarImpl::OnDoubleClick), nullptr, this);
@@ -143,12 +143,12 @@ public:
//=> the only way to distinguish single left click and double-click is to wait wxSystemSettings::GetMetric(wxSYS_DCLICK_MSEC) (480ms) which is way too long!
}
- void dontCallbackAnymore() { onRequestResume_ = nullptr; }
+ void dontCallbackAnymore() { requestResume_ = nullptr; }
private:
wxMenu* CreatePopupMenu() override
{
- if (!onRequestResume_)
+ if (!requestResume_)
return nullptr;
wxMenu* contextMenu = new wxMenu;
@@ -170,16 +170,16 @@ private:
switch (static_cast<Selection>(event.GetId()))
{
case CONTEXT_RESTORE:
- if (onRequestResume_)
- onRequestResume_();
+ if (requestResume_)
+ requestResume_();
break;
}
}
void OnDoubleClick(wxEvent& event)
{
- if (onRequestResume_)
- onRequestResume_();
+ if (requestResume_)
+ requestResume_();
}
//void OnLeftDownClick(wxEvent& event)
@@ -192,12 +192,12 @@ private:
// }
//}
- std::function<void()> onRequestResume_;
+ std::function<void()> requestResume_;
};
-FfsTrayIcon::FfsTrayIcon(const std::function<void()>& onRequestResume) :
- trayIcon_(new TaskBarImpl(onRequestResume)),
+FfsTrayIcon::FfsTrayIcon(const std::function<void()>& requestResume) :
+ trayIcon_(new TaskBarImpl(requestResume)),
iconGenerator_(std::make_unique<ProgressIconGenerator>(getResourceImage(L"FFS_tray_24x24").ConvertToImage()))
{
trayIcon_->SetIcon(iconGenerator_->get(activeFraction_), activeToolTip_);
diff --git a/FreeFileSync/Source/ui/tray_icon.h b/FreeFileSync/Source/ui/tray_icon.h
index e99d5127..d0aeaf78 100755
--- a/FreeFileSync/Source/ui/tray_icon.h
+++ b/FreeFileSync/Source/ui/tray_icon.h
@@ -27,7 +27,7 @@ namespace fff
class FfsTrayIcon
{
public:
- FfsTrayIcon(const std::function<void()>& onRequestResume); //callback only held during lifetime of this instance
+ FfsTrayIcon(const std::function<void()>& requestResume); //callback only held during lifetime of this instance
~FfsTrayIcon();
void setToolTip(const wxString& toolTip);
diff --git a/FreeFileSync/Source/ui/tree_grid.cpp b/FreeFileSync/Source/ui/tree_grid.cpp
index b802f294..d17985f7 100755
--- a/FreeFileSync/Source/ui/tree_grid.cpp
+++ b/FreeFileSync/Source/ui/tree_grid.cpp
@@ -24,7 +24,12 @@ using namespace fff;
namespace
{
-const int WIDTH_PERCENTAGE_BAR = 60;
+//let's NOT create wxWidgets objects statically:
+const int PERCENTAGE_BAR_WIDTH_DIP = 60;
+const int TREE_GRID_GAP_SIZE_DIP = 2;
+
+inline wxColor getColorPercentBorder () { return { 198, 198, 198 }; }
+inline wxColor getColorPercentBackground() { return { 0xf8, 0xf8, 0xf8 }; }
}
@@ -157,48 +162,6 @@ void calcPercentage(std::vector<std::pair<uint64_t, int*>>& workList)
}
-Zstring fff::getShortDisplayNameForFolderPair(const AbstractPath& itemPathL, const AbstractPath& itemPathR)
-{
- Zstring commonTrail;
- AbstractPath tmpPathL = itemPathL;
- AbstractPath tmpPathR = itemPathR;
- for (;;)
- {
- Opt<AbstractPath> parentPathL = AFS::getParentFolderPath(tmpPathL);
- Opt<AbstractPath> parentPathR = AFS::getParentFolderPath(tmpPathR);
- if (!parentPathL || !parentPathR)
- break;
-
- const Zstring itemNameL = AFS::getItemName(tmpPathL);
- const Zstring itemNameR = AFS::getItemName(tmpPathR);
- if (!strEqual(itemNameL, itemNameR, CmpNaturalSort())) //let's compare case-insensitively even on Linux!
- break;
-
- tmpPathL = *parentPathL;
- tmpPathR = *parentPathR;
-
- commonTrail = AFS::appendPaths(itemNameL, commonTrail, FILE_NAME_SEPARATOR);
- }
- if (!commonTrail.empty())
- return commonTrail;
-
- auto getLastComponent = [](const AbstractPath& itemPath)
- {
- if (!AFS::getParentFolderPath(itemPath)) //= device root
- return utfTo<Zstring>(AFS::getDisplayPath(itemPath));
- return AFS::getItemName(itemPath);
- };
-
- if (AFS::isNullPath(itemPathL))
- return getLastComponent(itemPathR);
- else if (AFS::isNullPath(itemPathR))
- return getLastComponent(itemPathL);
- else
- return getLastComponent(itemPathL) + utfTo<Zstring>(SPACED_DASH) +
- getLastComponent(itemPathR);
-}
-
-
template <bool ascending>
struct TreeView::LessShortName
{
@@ -216,8 +179,9 @@ struct TreeView::LessShortName
switch (lhs.type)
{
case TreeView::TYPE_ROOT:
- return makeSortDirection(LessNaturalSort() /*even on Linux*/, Int2Type<ascending>())(static_cast<const RootNodeImpl*>(lhs.node)->displayName,
- static_cast<const RootNodeImpl*>(rhs.node)->displayName);
+ return makeSortDirection(LessNaturalSort() /*even on Linux*/,
+ Int2Type<ascending>())(utfTo<Zstring>(static_cast<const RootNodeImpl*>(lhs.node)->displayName),
+ utfTo<Zstring>(static_cast<const RootNodeImpl*>(rhs.node)->displayName));
case TreeView::TYPE_DIRECTORY:
{
@@ -698,16 +662,6 @@ std::unique_ptr<TreeView::Node> TreeView::getLine(size_t row) const
namespace
{
-//let's NOT create wxWidgets objects statically:
-inline wxColor getColorPercentBorder () { return { 198, 198, 198 }; }
-inline wxColor getColorPercentBackground() { return { 0xf8, 0xf8, 0xf8 }; }
-
-inline wxColor getColorTreeSelectionGradientFrom() { return Grid::getColorSelectionGradientFrom(); }
-inline wxColor getColorTreeSelectionGradientTo () { return Grid::getColorSelectionGradientTo (); }
-
-const int iconSizeSmall = IconBuffer::getSize(IconBuffer::SIZE_SMALL);
-
-
wxColor getColorForLevel(size_t level)
{
switch (level % 12)
@@ -746,10 +700,10 @@ class GridDataTree : private wxEvtHandler, public GridData
{
public:
GridDataTree(Grid& grid) :
- rootBmp_(getResourceImage(L"rootFolder").ConvertToImage().Scale(iconSizeSmall, iconSizeSmall, wxIMAGE_QUALITY_HIGH)),
- widthNodeIcon_(iconSizeSmall),
+ widthNodeIcon_(IconBuffer::getSize(IconBuffer::SIZE_SMALL)),
widthLevelStep_(widthNodeIcon_),
widthNodeStatus_(getResourceImage(L"node_expanded").GetWidth()),
+ rootBmp_(getResourceImage(L"rootFolder").ConvertToImage().Scale(widthNodeIcon_, widthNodeIcon_, wxIMAGE_QUALITY_BILINEAR)), //looks sharper than wxIMAGE_QUALITY_HIGH!
grid_(grid)
{
grid.getMainWin().Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(GridDataTree::onKeyDown), nullptr, this);
@@ -775,8 +729,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 std::wstring& dirLeft = AFS::getDisplayPath(root->baseFolder_.getAbstractPath< LEFT_SIDE>());
- const std::wstring& dirRight = AFS::getDisplayPath(root->baseFolder_.getAbstractPath<RIGHT_SIDE>());
+ const std::wstring& dirLeft = AFS::getDisplayPath(root->baseFolder.getAbstractPath< LEFT_SIDE>());
+ const std::wstring& dirRight = AFS::getDisplayPath(root->baseFolder.getAbstractPath<RIGHT_SIDE>());
if (dirLeft.empty())
return dirRight;
else if (dirRight.empty())
@@ -799,9 +753,9 @@ private:
{
case ColumnTypeTree::FOLDER_NAME:
if (const TreeView::RootNode* root = dynamic_cast<const TreeView::RootNode*>(node.get()))
- return utfTo<std::wstring>(root->displayName_);
+ return root->displayName;
else if (const TreeView::DirNode* dir = dynamic_cast<const TreeView::DirNode*>(node.get()))
- return utfTo<std::wstring>(dir->folder_.getPairItemName());
+ return utfTo<std::wstring>(dir->folder.getPairItemName());
else if (dynamic_cast<const TreeView::FilesNode*>(node.get()))
return _("Files");
break;
@@ -821,20 +775,18 @@ private:
wxRect rectInside = drawColumnLabelBorder(dc, rect);
drawColumnLabelBackground(dc, rectInside, highlighted);
- rectInside.x += COLUMN_GAP_LEFT;
- rectInside.width -= COLUMN_GAP_LEFT;
+ rectInside.x += getColumnGapLeft();
+ rectInside.width -= getColumnGapLeft();
drawColumnLabelText(dc, rectInside, getColumnLabel(colType));
auto sortInfo = treeDataView_.getSortDirection();
if (colType == static_cast<ColumnType>(sortInfo.first))
{
- const wxBitmap& marker = getResourceImage(sortInfo.second ? L"sortAscending" : L"sortDescending");
+ const wxBitmap& marker = getResourceImage(sortInfo.second ? L"sort_ascending" : L"sort_descending");
drawBitmapRtlNoMirror(dc, marker, rectInside, wxALIGN_CENTER_HORIZONTAL);
}
}
- static const int GAP_SIZE = 2;
-
enum class HoverAreaTree
{
NODE,
@@ -845,7 +797,7 @@ private:
if (enabled)
{
if (selected)
- dc.GradientFillLinear(rect, getColorTreeSelectionGradientFrom(), getColorTreeSelectionGradientTo(), wxEAST);
+ dc.GradientFillLinear(rect, getColorSelectionGradientFrom(), getColorSelectionGradientTo(), wxEAST);
//ignore focus
else
clearArea(dc, rect, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
@@ -871,17 +823,17 @@ private:
{
////clear first secion:
//clearArea(dc, wxRect(rect.GetTopLeft(), wxSize(
- // node->level_ * widthLevelStep_ + GAP_SIZE + //width
- // (showPercentBar ? WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE : 0) + //
- // widthNodeStatus_ + GAP_SIZE + widthNodeIcon + GAP_SIZE, //
+ // node->level_ * widthLevelStep_ + gridGap_ + //width
+ // (showPercentBar ? percentageBarWidth_ + 2 * gridGap_ : 0) + //
+ // widthNodeStatus_ + gridGap_ + widthNodeIcon + gridGap_, //
// rect.height)), wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
//consume space
rectTmp.x += static_cast<int>(node->level_) * widthLevelStep_;
rectTmp.width -= static_cast<int>(node->level_) * widthLevelStep_;
- rectTmp.x += GAP_SIZE;
- rectTmp.width -= GAP_SIZE;
+ rectTmp.x += gridGap_;
+ rectTmp.width -= gridGap_;
if (rectTmp.width > 0)
{
@@ -889,7 +841,7 @@ private:
if (showPercentBar_)
{
- const wxRect areaPerc(rectTmp.x, rectTmp.y + 2, WIDTH_PERCENTAGE_BAR, rectTmp.height - 4);
+ const wxRect areaPerc(rectTmp.x, rectTmp.y + 2, percentageBarWidth_, rectTmp.height - 4);
{
//clear background
wxDCPenChanger dummy (dc, getColorPercentBorder());
@@ -910,8 +862,8 @@ private:
wxDCTextColourChanger dummy3(dc, *wxBLACK); //accessibility: always set both foreground AND background colors!
drawCellText(dc, areaPerc, numberTo<std::wstring>(node->percent_) + L"%", wxALIGN_CENTER);
- rectTmp.x += WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE;
- rectTmp.width -= WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE;
+ rectTmp.x += percentageBarWidth_ + 2 * gridGap_;
+ rectTmp.width -= percentageBarWidth_ + 2 * gridGap_;
}
if (rectTmp.width > 0)
{
@@ -941,8 +893,8 @@ private:
break;
}
- rectTmp.x += widthNodeStatus_ + GAP_SIZE;
- rectTmp.width -= widthNodeStatus_ + GAP_SIZE;
+ rectTmp.x += widthNodeStatus_ + gridGap_;
+ rectTmp.width -= widthNodeStatus_ + gridGap_;
if (rectTmp.width > 0)
{
wxBitmap nodeIcon;
@@ -953,7 +905,7 @@ private:
else if (auto dir = dynamic_cast<const TreeView::DirNode*>(node.get()))
{
nodeIcon = dirIcon_;
- isActive = dir->folder_.isActive();
+ isActive = dir->folder.isActive();
}
else if (dynamic_cast<const TreeView::FilesNode*>(node.get()))
nodeIcon = fileIcon_;
@@ -963,8 +915,8 @@ private:
drawBitmapRtlNoMirror(dc, nodeIcon, rectTmp, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
- rectTmp.x += widthNodeIcon_ + GAP_SIZE;
- rectTmp.width -= widthNodeIcon_ + GAP_SIZE;
+ rectTmp.x += widthNodeIcon_ + gridGap_;
+ rectTmp.width -= widthNodeIcon_ + gridGap_;
if (rectTmp.width > 0)
{
@@ -987,13 +939,13 @@ private:
if ((static_cast<ColumnTypeTree>(colType) == ColumnTypeTree::BYTES ||
static_cast<ColumnTypeTree>(colType) == ColumnTypeTree::ITEM_COUNT) && grid_.GetLayoutDirection() != wxLayout_RightToLeft)
{
- rectTmp.width -= 2 * GAP_SIZE;
+ rectTmp.width -= 2 * gridGap_;
alignment = wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL;
}
else //left-justified
{
- rectTmp.x += 2 * GAP_SIZE;
- rectTmp.width -= 2 * GAP_SIZE;
+ rectTmp.x += 2 * gridGap_;
+ rectTmp.width -= 2 * gridGap_;
}
drawCellText(dc, rectTmp, getValue(row, colType), alignment);
@@ -1007,15 +959,15 @@ private:
if (static_cast<ColumnTypeTree>(colType) == ColumnTypeTree::FOLDER_NAME)
{
if (std::unique_ptr<TreeView::Node> node = treeDataView_.getLine(row))
- return node->level_ * widthLevelStep_ + GAP_SIZE + (showPercentBar_ ? WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE : 0) + widthNodeStatus_ + GAP_SIZE
- + widthNodeIcon_ + GAP_SIZE + dc.GetTextExtent(getValue(row, colType)).GetWidth() +
- GAP_SIZE; //additional gap from right
+ return node->level_ * widthLevelStep_ + gridGap_ + (showPercentBar_ ? percentageBarWidth_ + 2 * gridGap_ : 0) + widthNodeStatus_ + gridGap_
+ + widthNodeIcon_ + gridGap_ + dc.GetTextExtent(getValue(row, colType)).GetWidth() +
+ gridGap_; //additional gap from right
else
return 0;
}
else
- return 2 * GAP_SIZE + dc.GetTextExtent(getValue(row, colType)).GetWidth() +
- 2 * GAP_SIZE; //include gap from right!
+ return 2 * gridGap_ + dc.GetTextExtent(getValue(row, colType)).GetWidth() +
+ 2 * gridGap_; //include gap from right!
}
HoverArea getRowMouseHover(size_t row, ColumnType colType, int cellRelativePosX, int cellWidth) override
@@ -1026,7 +978,7 @@ private:
if (std::unique_ptr<TreeView::Node> node = treeDataView_.getLine(row))
{
const int tolerance = 2;
- const int nodeStatusXFirst = -tolerance + static_cast<int>(node->level_) * widthLevelStep_ + GAP_SIZE + (showPercentBar_ ? WIDTH_PERCENTAGE_BAR + 2 * GAP_SIZE : 0);
+ const int nodeStatusXFirst = -tolerance + static_cast<int>(node->level_) * widthLevelStep_ + gridGap_ + (showPercentBar_ ? percentageBarWidth_ + 2 * gridGap_ : 0);
const int nodeStatusXLast = (nodeStatusXFirst + tolerance) + widthNodeStatus_ + tolerance;
// -> synchronize renderCell() <-> getBestSize() <-> getRowMouseHover()
@@ -1231,14 +1183,19 @@ private:
TreeView treeDataView_;
+ const int gridGap_ = fastFromDIP(TREE_GRID_GAP_SIZE_DIP);
+ const int percentageBarWidth_ = fastFromDIP(PERCENTAGE_BAR_WIDTH_DIP);
+
const wxBitmap fileIcon_ = IconBuffer::genericFileIcon(IconBuffer::SIZE_SMALL);
const wxBitmap dirIcon_ = IconBuffer::genericDirIcon (IconBuffer::SIZE_SMALL);
- const wxBitmap rootBmp_;
- Opt<wxBitmap> renderBuf_; //avoid costs of recreating this temporary variable
const int widthNodeIcon_;
const int widthLevelStep_;
const int widthNodeStatus_;
+
+ const wxBitmap rootBmp_;
+ Opt<wxBitmap> renderBuf_; //avoid costs of recreating this temporary variable
+
Grid& grid_;
bool showPercentBar_ = true;
};
diff --git a/FreeFileSync/Source/ui/tree_grid.h b/FreeFileSync/Source/ui/tree_grid.h
index af57070d..22ae293d 100755
--- a/FreeFileSync/Source/ui/tree_grid.h
+++ b/FreeFileSync/Source/ui/tree_grid.h
@@ -69,25 +69,25 @@ public:
struct FilesNode : public Node
{
- FilesNode(int percent, uint64_t bytes, int itemCount, unsigned int level, const std::vector<FileSystemObject*>& filesAndLinks) :
- Node(percent, bytes, itemCount, level, STATUS_EMPTY), filesAndLinks_(filesAndLinks) {}
+ FilesNode(int percent, uint64_t bytes, int itemCount, unsigned int level, const std::vector<FileSystemObject*>& fsos) :
+ Node(percent, bytes, itemCount, level, STATUS_EMPTY), filesAndLinks(fsos) {}
- std::vector<FileSystemObject*> filesAndLinks_; //files and symlinks matching view filter; pointers are bound!
+ std::vector<FileSystemObject*> filesAndLinks; //files and symlinks matching view filter; pointers are bound!
};
struct DirNode : public Node
{
- DirNode(int percent, uint64_t bytes, int itemCount, unsigned int level, NodeStatus status, FolderPair& folder) : Node(percent, bytes, itemCount, level, status), folder_(folder) {}
- FolderPair& folder_;
+ DirNode(int percent, uint64_t bytes, int itemCount, unsigned int level, NodeStatus status, FolderPair& fp) : Node(percent, bytes, itemCount, level, status), folder(fp) {}
+ FolderPair& folder;
};
struct RootNode : public Node
{
- RootNode(int percent, uint64_t bytes, int itemCount, NodeStatus status, BaseFolderPair& baseFolder, const Zstring& displayName) :
- Node(percent, bytes, itemCount, 0, status), baseFolder_(baseFolder), displayName_(displayName) {}
+ RootNode(int percent, uint64_t bytes, int itemCount, NodeStatus status, BaseFolderPair& bFolder, const std::wstring& dispName) :
+ Node(percent, bytes, itemCount, 0, status), baseFolder(bFolder), displayName(dispName) {}
- BaseFolderPair& baseFolder_;
- const Zstring displayName_;
+ BaseFolderPair& baseFolder;
+ const std::wstring displayName;
};
std::unique_ptr<Node> getLine(size_t row) const; //return nullptr on error
@@ -126,7 +126,7 @@ private:
struct RootNodeImpl : public Container
{
std::shared_ptr<BaseFolderPair> baseFolder;
- Zstring displayName;
+ std::wstring displayName;
};
enum NodeType
@@ -170,9 +170,6 @@ private:
};
-Zstring getShortDisplayNameForFolderPair(const AbstractPath& itemPathL, const AbstractPath& itemPathR);
-
-
namespace treegrid
{
void init(zen::Grid& grid);
diff --git a/FreeFileSync/Source/ui/tree_grid_attr.h b/FreeFileSync/Source/ui/tree_grid_attr.h
index ce37e468..aea8130a 100755
--- a/FreeFileSync/Source/ui/tree_grid_attr.h
+++ b/FreeFileSync/Source/ui/tree_grid_attr.h
@@ -9,6 +9,7 @@
#include <vector>
#include <cassert>
+#include <wx+/dc.h>
namespace fff
@@ -32,16 +33,17 @@ struct ColAttributesTree
inline
std::vector<ColAttributesTree> getTreeGridDefaultColAttribs()
{
+ using namespace zen;
return //harmonize with tree_view.cpp::onGridLabelContext() => expects stretched FOLDER_NAME and non-stretched other columns!
{
- { ColumnTypeTree::FOLDER_NAME, -120, 1, true }, //stretch to full width and substract sum of fixed size widths
- { ColumnTypeTree::ITEM_COUNT, 60, 0, true },
- { ColumnTypeTree::BYTES, 60, 0, true }, //GTK needs a few pixels more width
+ { ColumnTypeTree::FOLDER_NAME, fastFromDIP(-120), 1, true }, //stretch to full width and substract sum of fixed size widths
+ { ColumnTypeTree::ITEM_COUNT, fastFromDIP( 60), 0, true },
+ { ColumnTypeTree::BYTES, fastFromDIP( 60), 0, true }, //GTK needs a few pixels more width
};
}
-const bool treeGridShowPercentageDefault = true;
-const ColumnTypeTree treeGridLastSortColumnDefault = ColumnTypeTree::BYTES;
+const bool treeGridShowPercentageDefault = true;
+const ColumnTypeTree treeGridLastSortColumnDefault = ColumnTypeTree::BYTES;
inline
bool getDefaultSortDirection(ColumnTypeTree colType)
diff --git a/FreeFileSync/Source/ui/triple_splitter.cpp b/FreeFileSync/Source/ui/triple_splitter.cpp
index 0bc43101..0797b807 100755
--- a/FreeFileSync/Source/ui/triple_splitter.cpp
+++ b/FreeFileSync/Source/ui/triple_splitter.cpp
@@ -7,6 +7,7 @@
#include "triple_splitter.h"
#include <algorithm>
#include <zen/stl_tools.h>
+#include <wx+/dc.h>
using namespace zen;
using namespace fff;
@@ -15,10 +16,12 @@ using namespace fff;
namespace
{
//------------ Grid Constants -------------------------------
-const int SASH_HIT_TOLERANCE = 5; //currently only a placebo!
-const int SASH_SIZE = 10;
+const int SASH_HIT_TOLERANCE_DIP = 5; //currently only a placebo!
+const int SASH_SIZE_DIP = 10;
+const int SASH_GRADIENT_SIZE_DIP = 3;
+
const double SASH_GRAVITY = 0.5; //value within [0, 1]; 1 := resize left only, 0 := resize right only
-const int CHILD_WINDOW_MIN_SIZE = 50; //min. size of managed windows
+const int CHILD_WINDOW_MIN_SIZE_DIP = 50; //min. size of managed windows
//let's NOT create wxWidgets objects statically:
inline wxColor getColorSashGradientFrom() { return { 192, 192, 192 }; } //light grey
@@ -30,12 +33,13 @@ TripleSplitter::TripleSplitter(wxWindow* parent,
wxWindowID id,
const wxPoint& pos,
const wxSize& size,
- long style) : wxWindow(parent, id, pos, size, style | wxTAB_TRAVERSAL) //tab between windows
+ long style) : wxWindow(parent, id, pos, size, style | wxTAB_TRAVERSAL), //tab between windows
+ sashSize_ (fastFromDIP(SASH_SIZE_DIP)),
+ childWindowMinSize_(fastFromDIP(CHILD_WINDOW_MIN_SIZE_DIP))
{
- Connect(wxEVT_PAINT, wxPaintEventHandler(TripleSplitter::onPaintEvent ), nullptr, this);
- Connect(wxEVT_SIZE, wxSizeEventHandler (TripleSplitter::onSizeEvent ), nullptr, this);
- //http://wiki.wxwidgets.org/Flicker-Free_Drawing
- Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(TripleSplitter::onEraseBackGround), nullptr, this);
+ Connect(wxEVT_PAINT, wxPaintEventHandler(TripleSplitter::onPaintEvent), nullptr, this);
+ Connect(wxEVT_SIZE, wxSizeEventHandler (TripleSplitter::onSizeEvent ), nullptr, this);
+ Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing
SetBackgroundStyle(wxBG_STYLE_PAINT);
@@ -43,8 +47,8 @@ TripleSplitter::TripleSplitter(wxWindow* parent,
Connect(wxEVT_LEFT_UP, wxMouseEventHandler(TripleSplitter::onMouseLeftUp ), nullptr, this);
Connect(wxEVT_MOTION, wxMouseEventHandler(TripleSplitter::onMouseMovement ), nullptr, this);
Connect(wxEVT_LEAVE_WINDOW, wxMouseEventHandler(TripleSplitter::onLeaveWindow ), nullptr, this);
- Connect(wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEventHandler(TripleSplitter::onMouseCaptureLost), nullptr, this);
Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(TripleSplitter::onMouseLeftDouble), nullptr, this);
+ Connect(wxEVT_MOUSE_CAPTURE_LOST, wxMouseCaptureLostEventHandler(TripleSplitter::onMouseCaptureLost), nullptr, this);
}
@@ -65,7 +69,7 @@ void TripleSplitter::updateWindowSizes()
const int widthR = clientRect.width - windowRposX;
windowL_->SetSize(0, 0, widthL, clientRect.height);
- windowC_->SetSize(widthL + SASH_SIZE, 0, windowC_->GetSize().GetWidth(), clientRect.height);
+ windowC_->SetSize(widthL + sashSize_, 0, windowC_->GetSize().GetWidth(), clientRect.height);
windowR_->SetSize(windowRposX, 0, widthR, clientRect.height);
wxClientDC dc(this);
@@ -101,7 +105,7 @@ private:
inline
int TripleSplitter::getCenterWidth() const
{
- return 2 * SASH_SIZE + (windowC_ ? windowC_->GetSize().GetWidth() : 0);
+ return 2 * sashSize_ + (windowC_ ? windowC_->GetSize().GetWidth() : 0);
}
@@ -120,12 +124,12 @@ int TripleSplitter::getCenterPosX() const
const int centerPosXOptimal = getCenterPosXOptimal();
//normalize "centerPosXOptimal + centerOffset"
- if (clientRect.width < 2 * CHILD_WINDOW_MIN_SIZE + centerWidth)
- //use fixed "centeroffset" when "clientRect.width == 2 * CHILD_WINDOW_MIN_SIZE + centerWidth"
- return centerPosXOptimal + CHILD_WINDOW_MIN_SIZE - static_cast<int>(2 * CHILD_WINDOW_MIN_SIZE * SASH_GRAVITY); //avoid rounding error
+ if (clientRect.width < 2 * childWindowMinSize_ + centerWidth)
+ //use fixed "centeroffset" when "clientRect.width == 2 * childWindowMinSize_ + centerWidth"
+ return centerPosXOptimal + childWindowMinSize_ - static_cast<int>(2 * childWindowMinSize_ * SASH_GRAVITY); //avoid rounding error
//make sure transition between conditional branches is continuous!
- return std::max(CHILD_WINDOW_MIN_SIZE, //make sure centerPosXOptimal + offset is within bounds
- std::min(centerPosXOptimal + centerOffset_, clientRect.width - CHILD_WINDOW_MIN_SIZE - centerWidth));
+ return std::max(childWindowMinSize_, //make sure centerPosXOptimal + offset is within bounds
+ std::min(centerPosXOptimal + centerOffset_, clientRect.width - childWindowMinSize_ - centerWidth));
}
@@ -136,19 +140,16 @@ void TripleSplitter::drawSash(wxDC& dc)
auto draw = [&](wxRect rect)
{
- const int sash2ndHalf = 3;
- rect.width -= sash2ndHalf;
+ rect.width = fastFromDIP(SASH_GRADIENT_SIZE_DIP);
dc.GradientFillLinear(rect, getColorSashGradientFrom(), getColorSashGradientTo(), wxEAST);
rect.x += rect.width;
- rect.width = sash2ndHalf;
+ rect.width = sashSize_ - fastFromDIP(SASH_GRADIENT_SIZE_DIP);
dc.GradientFillLinear(rect, getColorSashGradientFrom(), getColorSashGradientTo(), wxWEST);
-
- static_assert(SASH_SIZE > sash2ndHalf, "");
};
- const wxRect rectSashL(centerPosX, 0, SASH_SIZE, GetClientRect().height);
- const wxRect rectSashR(centerPosX + centerWidth - SASH_SIZE, 0, SASH_SIZE, GetClientRect().height);
+ const wxRect rectSashL(centerPosX, 0, sashSize_, GetClientRect().height);
+ const wxRect rectSashR(centerPosX + centerWidth - sashSize_, 0, sashSize_, GetClientRect().height);
draw(rectSashL);
draw(rectSashR);
@@ -160,10 +161,10 @@ bool TripleSplitter::hitOnSashLine(int posX) const
const int centerPosX = getCenterPosX();
const int centerWidth = getCenterWidth();
- //we don't get events outside of sash, so SASH_HIT_TOLERANCE is currently *useless*
- auto hitSash = [&](int sashX) { return sashX - SASH_HIT_TOLERANCE <= posX && posX < sashX + SASH_SIZE + SASH_HIT_TOLERANCE; };
+ //we don't get events outside of sash, so SASH_HIT_TOLERANCE_DIP is currently *useless*
+ auto hitSash = [&](int sashX) { return sashX - fastFromDIP(SASH_HIT_TOLERANCE_DIP) <= posX && posX < sashX + sashSize_ + fastFromDIP(SASH_HIT_TOLERANCE_DIP); };
- return hitSash(centerPosX) || hitSash(centerPosX + centerWidth - SASH_SIZE); //hit one of the two sash lines
+ return hitSash(centerPosX) || hitSash(centerPosX + centerWidth - sashSize_); //hit one of the two sash lines
}
diff --git a/FreeFileSync/Source/ui/triple_splitter.h b/FreeFileSync/Source/ui/triple_splitter.h
index f14e8039..ea7974fe 100755
--- a/FreeFileSync/Source/ui/triple_splitter.h
+++ b/FreeFileSync/Source/ui/triple_splitter.h
@@ -49,7 +49,6 @@ public:
void setSashOffset(int off) { centerOffset_ = off; updateWindowSizes(); }
private:
- void onEraseBackGround(wxEraseEvent& event) {}
void onSizeEvent(wxSizeEvent& event) { updateWindowSizes(); event.Skip(); }
void onPaintEvent(wxPaintEvent& event)
@@ -77,6 +76,8 @@ private:
std::unique_ptr<SashMove> activeMove_;
int centerOffset_ = 0; //offset to add after "gravity" stretching
+ const int sashSize_;
+ const int childWindowMinSize_;
wxWindow* windowL_ = nullptr;
wxWindow* windowC_ = nullptr;
diff --git a/FreeFileSync/Source/ui/version_check_impl.h b/FreeFileSync/Source/ui/version_check_impl.h
index b33bb55b..ccf2c387 100644..100755
--- a/FreeFileSync/Source/ui/version_check_impl.h
+++ b/FreeFileSync/Source/ui/version_check_impl.h
@@ -45,7 +45,7 @@ time_t getVersionCheckCurrentTime()
}
-inline
+//as declared in version_check.h:
bool shouldRunAutomaticUpdateCheck(time_t lastUpdateCheck)
{
if (lastUpdateCheck == getVersionCheckInactiveId())
diff --git a/FreeFileSync/Source/version/version.h b/FreeFileSync/Source/version/version.h
index 44e25841..677f9556 100755
--- a/FreeFileSync/Source/version/version.h
+++ b/FreeFileSync/Source/version/version.h
@@ -3,7 +3,7 @@
namespace fff
{
-const char ffsVersion[] = "9.8"; //internal linkage!
+const char ffsVersion[] = "9.9"; //internal linkage!
const char FFS_VERSION_SEPARATOR = '.';
}
diff --git a/wx+/bitmap_button.h b/wx+/bitmap_button.h
index 379cf52d..dc7615c1 100755
--- a/wx+/bitmap_button.h
+++ b/wx+/bitmap_button.h
@@ -9,6 +9,7 @@
#include <wx/bmpbuttn.h>
#include "image_tools.h"
+#include "dc.h"
namespace zen
@@ -28,7 +29,7 @@ public:
wxBitmapButton(parent, id, wxNullBitmap, pos, size, style | wxBU_AUTODRAW, validator, name) { SetLabel(label); }
};
-void setBitmapTextLabel(wxBitmapButton& btn, const wxImage& img, const wxString& text, int gap = 5, int border = 5);
+void setBitmapTextLabel(wxBitmapButton& btn, const wxImage& img, const wxString& text, int gap = fastFromDIP(5), int border = fastFromDIP(5));
//set bitmap label flicker free:
void setImage(wxBitmapButton& button, const wxBitmap& bmp);
diff --git a/wx+/choice_enum.h b/wx+/choice_enum.h
index 6b2edd01..97c40b68 100755
--- a/wx+/choice_enum.h
+++ b/wx+/choice_enum.h
@@ -107,8 +107,6 @@ template <class Enum> void updateTooltipEnumVal(const EnumDescrList<Enum>& mappi
if (item.first == value)
ctrl.SetToolTip(item.second.second);
}
-
}
-
#endif //CHOICE_ENUM_H_132413545345687
diff --git a/wx+/dc.h b/wx+/dc.h
index 55047a53..23c70d3f 100755
--- a/wx+/dc.h
+++ b/wx+/dc.h
@@ -9,7 +9,9 @@
#include <unordered_map>
#include <zen/optional.h>
+#include <zen/basic_math.h>
#include <wx/dcbuffer.h> //for macro: wxALWAYS_NATIVE_DOUBLE_BUFFER
+#include <wx/dcscreen.h>
namespace zen
@@ -41,6 +43,25 @@ void clearArea(wxDC& dc, const wxRect& rect, const wxColor& col)
}
+/*
+Standard DPI:
+ Windows/Ubuntu: 96 x 96
+ macOS: wxWidgets uses DIP (note: wxScreenDC().GetPPI() returns 72 x 72 which is a lie; looks like 96 x 96)
+*/
+inline
+int fastFromDIP(int d) //like wxWindow::FromDIP (but tied to primary monitor and buffered)
+{
+
+#ifdef wxHAVE_DPI_INDEPENDENT_PIXELS //pulled from wx/window.h
+ return d; //e.g. macOS, GTK3
+#else
+ assert(wxTheApp); //only call after wxWidgets was initalized!
+ static const int dpiY = wxScreenDC().GetPPI().y; //perf: buffering for calls to ::GetDeviceCaps() needed!?
+ const int defaultDpi = 96;
+ return numeric::round(1.0 * d * dpiY / defaultDpi);
+#endif
+}
+
diff --git a/wx+/font_size.h b/wx+/font_size.h
index 636b07aa..2f2d377c 100755
--- a/wx+/font_size.h
+++ b/wx+/font_size.h
@@ -10,6 +10,7 @@
#include <zen/basic_math.h>
#include <wx/window.h>
#include <zen/scope_guard.h>
+#include "dc.h"
namespace zen
diff --git a/wx+/graph.cpp b/wx+/graph.cpp
index dbce3769..b006cda0 100755
--- a/wx+/graph.cpp
+++ b/wx+/graph.cpp
@@ -203,12 +203,11 @@ void drawYLabel(wxDC& dc, double yMin, double yMax, int blockCount, const Conver
void drawCornerText(wxDC& dc, const wxRect& graphArea, const wxString& txt, Graph2D::PosCorner pos, const wxColor& backgroundColor)
{
if (txt.empty()) return;
- const int borderX = 5;
- const int borderY = 2; //it looks like wxDC::GetMultiLineTextExtent() precisely returns width, but too large a height: maybe they consider "text row height"?
- wxSize txtExtent = dc.GetMultiLineTextExtent(txt);
- txtExtent.x += 2 * borderX;
- txtExtent.y += 2 * borderY;
+ const wxSize border(fastFromDIP(5), fastFromDIP(2));
+ //it looks like wxDC::GetMultiLineTextExtent() precisely returns width, but too large a height: maybe they consider "text row height"?
+
+ const wxSize boxExtent = dc.GetMultiLineTextExtent(txt) + 2 * border;
wxPoint drawPos = graphArea.GetTopLeft();
switch (pos)
@@ -216,24 +215,24 @@ void drawCornerText(wxDC& dc, const wxRect& graphArea, const wxString& txt, Grap
case Graph2D::CORNER_TOP_LEFT:
break;
case Graph2D::CORNER_TOP_RIGHT:
- drawPos.x += graphArea.width - txtExtent.GetWidth();
+ drawPos.x += graphArea.width - boxExtent.GetWidth();
break;
case Graph2D::CORNER_BOTTOM_LEFT:
- drawPos.y += graphArea.height - txtExtent.GetHeight();
+ drawPos.y += graphArea.height - boxExtent.GetHeight();
break;
case Graph2D::CORNER_BOTTOM_RIGHT:
- drawPos.x += graphArea.width - txtExtent.GetWidth();
- drawPos.y += graphArea.height - txtExtent.GetHeight();
+ drawPos.x += graphArea.width - boxExtent.GetWidth();
+ drawPos.y += graphArea.height - boxExtent.GetHeight();
break;
}
{
//add text shadow to improve readability:
wxDCTextColourChanger dummy(dc, backgroundColor);
- dc.DrawText(txt, drawPos + wxPoint(borderX + 1, borderY + 1));
+ dc.DrawText(txt, drawPos + border + wxSize(fastFromDIP(1), fastFromDIP(1)));
}
wxDCTextColourChanger dummy(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
- dc.DrawText(txt, drawPos + wxPoint(borderX, borderY));
+ dc.DrawText(txt, drawPos + border);
}
@@ -452,8 +451,7 @@ Graph2D::Graph2D(wxWindow* parent,
{
Connect(wxEVT_PAINT, wxPaintEventHandler(Graph2D::onPaintEvent), nullptr, this);
Connect(wxEVT_SIZE, wxSizeEventHandler (Graph2D::onSizeEvent ), nullptr, this);
- //http://wiki.wxwidgets.org/Flicker-Free_Drawing
- Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(Graph2D::onEraseBackGround), nullptr, this);
+ Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing
//SetDoubleBuffered(true); slow as hell!
@@ -548,6 +546,9 @@ void Graph2D::render(wxDC& dc) const
//wxPanel::GetClassDefaultAttributes().colBg :
//wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
+ const int xLabelHeight = attr_.xLabelHeight ? *attr_.xLabelHeight : GetCharHeight() + fastFromDIP(2) /*margin*/;
+ const int yLabelWidth = attr_.yLabelWidth ? *attr_.yLabelWidth : dc.GetTextExtent(L"1,23457e+07").x;
+
/*
-----------------------
| | x-label |
@@ -562,12 +563,12 @@ void Graph2D::render(wxDC& dc) const
switch (attr_.labelposX)
{
case LABEL_X_TOP:
- graphArea.y += attr_.xLabelHeight;
- graphArea.height -= attr_.xLabelHeight;
+ graphArea.y += xLabelHeight;
+ graphArea.height -= xLabelHeight;
break;
case LABEL_X_BOTTOM:
- xLabelPosY += clientRect.height - attr_.xLabelHeight;
- graphArea.height -= attr_.xLabelHeight;
+ xLabelPosY += clientRect.height - xLabelHeight;
+ graphArea.height -= xLabelHeight;
break;
case LABEL_X_NONE:
break;
@@ -575,17 +576,20 @@ void Graph2D::render(wxDC& dc) const
switch (attr_.labelposY)
{
case LABEL_Y_LEFT:
- graphArea.x += attr_.yLabelWidth;
- graphArea.width -= attr_.yLabelWidth;
+ graphArea.x += yLabelWidth;
+ graphArea.width -= yLabelWidth;
break;
case LABEL_Y_RIGHT:
- yLabelPosX += clientRect.width - attr_.yLabelWidth;
- graphArea.width -= attr_.yLabelWidth;
+ yLabelPosX += clientRect.width - yLabelWidth;
+ graphArea.width -= yLabelWidth;
break;
case LABEL_Y_NONE:
break;
}
+ assert(attr_.labelposX == LABEL_X_NONE || attr_.labelFmtX);
+ assert(attr_.labelposY == LABEL_Y_NONE || attr_.labelFmtY);
+
{
//paint graph background (excluding label area)
wxDCPenChanger dummy (dc, getBorderColor());
@@ -597,13 +601,13 @@ void Graph2D::render(wxDC& dc) const
}
//set label areas respecting graph area border!
- const wxRect xLabelArea(graphArea.x, xLabelPosY, graphArea.width, attr_.xLabelHeight);
- const wxRect yLabelArea(yLabelPosX, graphArea.y, attr_.yLabelWidth, graphArea.height);
+ const wxRect xLabelArea(graphArea.x, xLabelPosY, graphArea.width, xLabelHeight);
+ const wxRect yLabelArea(yLabelPosX, graphArea.y, yLabelWidth, graphArea.height);
const wxPoint graphAreaOrigin = graphArea.GetTopLeft();
//detect x value range
- double minX = attr_.minXauto ? std::numeric_limits<double>::infinity() : attr_.minX; //automatic: ensure values are initialized by first curve
- double maxX = attr_.maxXauto ? -std::numeric_limits<double>::infinity() : attr_.maxX; //
+ double minX = attr_.minX ? *attr_.minX : std::numeric_limits<double>::infinity(); //automatic: ensure values are initialized by first curve
+ double maxX = attr_.maxX ? *attr_.maxX : -std::numeric_limits<double>::infinity(); //
for (auto it = curves_.begin(); it != curves_.end(); ++it)
if (const CurveData* curve = it->first.get())
{
@@ -611,9 +615,9 @@ void Graph2D::render(wxDC& dc) const
assert(rangeX.first <= rangeX.second + 1.0e-9);
//GCC fucks up badly when comparing two *binary identical* doubles and finds "begin > end" with diff of 1e-18
- if (attr_.minXauto)
+ if (!attr_.minX)
minX = std::min(minX, rangeX.first);
- if (attr_.maxXauto)
+ if (!attr_.maxX)
maxX = std::max(maxX, rangeX.second);
}
@@ -630,8 +634,8 @@ void Graph2D::render(wxDC& dc) const
*attr_.labelFmtX);
//get raw values + detect y value range
- double minY = attr_.minYauto ? std::numeric_limits<double>::infinity() : attr_.minY; //automatic: ensure values are initialized by first curve
- double maxY = attr_.maxYauto ? -std::numeric_limits<double>::infinity() : attr_.maxY; //
+ double minY = attr_.minY ? *attr_.minY : std::numeric_limits<double>::infinity(); //automatic: ensure values are initialized by first curve
+ double maxY = attr_.maxY ? *attr_.maxY : -std::numeric_limits<double>::infinity(); //
std::vector<std::vector<CurvePoint>> curvePoints(curves_.size());
std::vector<std::vector<char>> oobMarker (curves_.size()); //effectively a std::vector<bool> marking points that start an out-of-bounds line
@@ -650,12 +654,12 @@ void Graph2D::render(wxDC& dc) const
const bool doPolygonCut = curves_[index].second.fillMode == CurveAttributes::FILL_POLYGON; //impacts auto minY/maxY!!
cutPointsOutsideX(points, marker, minX, maxX, doPolygonCut);
- if (attr_.minYauto || attr_.maxYauto)
+ if (!attr_.minY || !attr_.maxY)
{
auto itPair = std::minmax_element(points.begin(), points.end(), [](const CurvePoint& lhs, const CurvePoint& rhs) { return lhs.y < rhs.y; });
- if (attr_.minYauto)
+ if (!attr_.minY)
minY = std::min(minY, itPair.first->y);
- if (attr_.maxYauto)
+ if (!attr_.maxY)
maxY = std::max(maxY, itPair.second->y);
}
}
@@ -805,8 +809,8 @@ void Graph2D::render(wxDC& dc) const
}
//3. draw labels and background grid
- drawXLabel(dc, minX, maxX, blockCountX, cvrtX, graphArea, xLabelArea, *attr_.labelFmtX);
- drawYLabel(dc, minY, maxY, blockCountY, cvrtY, graphArea, yLabelArea, *attr_.labelFmtY);
+ if (attr_.labelFmtX) drawXLabel(dc, minX, maxX, blockCountX, cvrtX, graphArea, xLabelArea, *attr_.labelFmtX);
+ if (attr_.labelFmtY) drawYLabel(dc, minY, maxY, blockCountY, cvrtY, graphArea, yLabelArea, *attr_.labelFmtY);
//4. finally draw curves
{
diff --git a/wx+/graph.h b/wx+/graph.h
index 45129c4b..bf0e7a70 100755
--- a/wx+/graph.h
+++ b/wx+/graph.h
@@ -101,12 +101,12 @@ private:
struct VectorCurveData : public ArrayCurveData
{
- std::vector<double>& refData() { return data; }
+ std::vector<double>& refData() { return data_; }
private:
- double getValue(size_t pos) const override { return pos < data.size() ? data[pos] : 0; }
- size_t getSize() const override { return data.size(); }
+ double getValue(size_t pos) const override { return pos < data_.size() ? data_[pos] : 0; }
+ size_t getSize() const override { return data_.size(); }
- std::vector<double> data;
+ std::vector<double> data_;
};
//------------------------------------------------------------------------------------------------------------
@@ -128,7 +128,7 @@ double nextNiceNumber(double blockSize); //round to next number which is conveni
struct DecimalNumberFormatter : public LabelFormatter
{
double getOptimalBlockSize(double sizeProposed ) const override { return nextNiceNumber(sizeProposed); }
- wxString formatText (double value, double optimalBlockSize) const override { return zen::numberTo<wxString>(value); }
+ wxString formatText (double value, double optimalBlockSize) const override { return numberTo<wxString>(value); }
};
//------------------------------------------------------------------------------------------------------------
@@ -178,7 +178,7 @@ public:
{
public:
CurveAttributes() {} //required by GCC
- CurveAttributes& setColor (const wxColor& col) { color = col; autoColor = false; return *this; }
+ CurveAttributes& setColor (const wxColor& col) { color = col; autoColor = false; return *this; }
CurveAttributes& fillCurveArea (const wxColor& col) { fillColor = col; fillMode = FILL_CURVE; return *this; }
CurveAttributes& fillPolygonArea(const wxColor& col) { fillColor = col; fillMode = FILL_POLYGON; return *this; }
CurveAttributes& setLineWidth(size_t width) { lineWidth = static_cast<int>(width); return *this; }
@@ -240,26 +240,26 @@ public:
class MainAttributes
{
public:
- MainAttributes& setMinX(double newMinX) { minX = newMinX; minXauto = false; return *this; }
- MainAttributes& setMaxX(double newMaxX) { maxX = newMaxX; maxXauto = false; return *this; }
+ MainAttributes& setMinX(double newMinX) { minX = newMinX; return *this; }
+ MainAttributes& setMaxX(double newMaxX) { maxX = newMaxX; return *this; }
- MainAttributes& setMinY(double newMinY) { minY = newMinY; minYauto = false; return *this; }
- MainAttributes& setMaxY(double newMaxY) { maxY = newMaxY; maxYauto = false; return *this; }
+ MainAttributes& setMinY(double newMinY) { minY = newMinY; return *this; }
+ MainAttributes& setMaxY(double newMaxY) { maxY = newMaxY; return *this; }
- MainAttributes& setAutoSize() { minXauto = maxXauto = minYauto = maxYauto = true; return *this; }
+ MainAttributes& setAutoSize() { minX = maxX = minY = maxY = NoValue(); return *this; }
- MainAttributes& setLabelX(PosLabelX posX, size_t height = 25, std::shared_ptr<LabelFormatter> newLabelFmt = std::make_shared<DecimalNumberFormatter>())
+ MainAttributes& setLabelX(PosLabelX posX, int height = -1, std::shared_ptr<LabelFormatter> newLabelFmt = nullptr)
{
- labelposX = posX;
- xLabelHeight = static_cast<int>(height);
- labelFmtX = newLabelFmt;
+ labelposX = posX;
+ if (height >= 0) xLabelHeight = height;
+ if (newLabelFmt) labelFmtX = newLabelFmt;
return *this;
}
- MainAttributes& setLabelY(PosLabelY posY, size_t width = 60, std::shared_ptr<LabelFormatter> newLabelFmt = std::make_shared<DecimalNumberFormatter>())
+ MainAttributes& setLabelY(PosLabelY posY, int width = -1, std::shared_ptr<LabelFormatter> newLabelFmt = nullptr)
{
- labelposY = posY;
- yLabelWidth = static_cast<int>(width);
- labelFmtY = newLabelFmt;
+ labelposY = posY;
+ if (width >= 0) yLabelWidth = width;
+ if (newLabelFmt) labelFmtY = newLabelFmt;
return *this;
}
@@ -272,22 +272,18 @@ public:
private:
friend class Graph2D;
- bool minXauto = true; //autodetect range for X value
- bool maxXauto = true;
- double minX = 0; //x-range to visualize
- double maxX = 0; //
+ Opt<double> minX; //x-range to visualize
+ Opt<double> maxX; //
- bool minYauto = true; //autodetect range for Y value
- bool maxYauto = true;
- double minY = 0; //y-range to visualize
- double maxY = 0; //
+ Opt<double> minY; //y-range to visualize
+ Opt<double> maxY; //
PosLabelX labelposX = LABEL_X_BOTTOM;
- int xLabelHeight = 25;
+ Opt<int> xLabelHeight;
std::shared_ptr<LabelFormatter> labelFmtX = std::make_shared<DecimalNumberFormatter>();
PosLabelY labelposY = LABEL_Y_LEFT;
- int yLabelWidth = 60;
+ Opt<int> yLabelWidth;
std::shared_ptr<LabelFormatter> labelFmtY = std::make_shared<DecimalNumberFormatter>();
std::map<PosCorner, wxString> cornerTexts;
@@ -295,6 +291,7 @@ public:
wxColor backgroundColor = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
SelMode mouseSelMode = SELECT_RECTANGLE;
};
+
void setAttributes(const MainAttributes& newAttr) { attr_ = newAttr; Refresh(); }
MainAttributes getAttributes() const { return attr_; }
@@ -315,7 +312,6 @@ private:
void onPaintEvent(wxPaintEvent& event);
void onSizeEvent(wxSizeEvent& event) { Refresh(); event.Skip(); }
- void onEraseBackGround(wxEraseEvent& event) {}
void render(wxDC& dc) const;
diff --git a/wx+/grid.cpp b/wx+/grid.cpp
index 64f7f4a6..a1beee01 100755
--- a/wx+/grid.cpp
+++ b/wx+/grid.cpp
@@ -25,15 +25,15 @@
using namespace zen;
-wxColor Grid::getColorSelectionGradientFrom() { return { 137, 172, 255 }; } //blue: HSL: 158, 255, 196 HSV: 222, 0.46, 1
-wxColor Grid::getColorSelectionGradientTo () { return { 225, 234, 255 }; } // HSL: 158, 255, 240 HSV: 222, 0.12, 1
+//let's NOT create wxWidgets objects statically:
+wxColor GridData::getColorSelectionGradientFrom() { return { 137, 172, 255 }; } //blue: HSL: 158, 255, 196 HSV: 222, 0.46, 1
+wxColor GridData::getColorSelectionGradientTo () { return { 225, 234, 255 }; } // HSL: 158, 255, 240 HSV: 222, 0.12, 1
-const int GridData::COLUMN_GAP_LEFT = 4;
+int GridData::getColumnGapLeft() { return fastFromDIP(4); }
namespace
{
-//let's NOT create wxWidgets objects statically:
//------------------------------ Grid Parameters --------------------------------
inline wxColor getColorLabelText() { return wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); }
inline wxColor getColorGridLine() { return { 192, 192, 192 }; } //light grey
@@ -42,15 +42,16 @@ inline wxColor getColorLabelGradientFrom() { return wxSystemSettings::GetColour(
inline wxColor getColorLabelGradientTo () { return { 200, 200, 200 }; } //light grey
inline wxColor getColorLabelGradientFocusFrom() { return getColorLabelGradientFrom(); }
-inline wxColor getColorLabelGradientFocusTo () { return Grid::getColorSelectionGradientFrom(); }
+inline wxColor getColorLabelGradientFocusTo () { return GridData::getColorSelectionGradientFrom(); }
-const double MOUSE_DRAG_ACCELERATION = 1.5; //unit: [rows / (pixel * sec)] -> same value like Explorer!
-const int DEFAULT_COL_LABEL_BORDER = 6; //top + bottom border in addition to label height
-const int COLUMN_MOVE_DELAY = 5; //unit: [pixel] (from Explorer)
-const int COLUMN_MIN_WIDTH = 40; //only honored when resizing manually!
-const int ROW_LABEL_BORDER = 3;
-const int COLUMN_RESIZE_TOLERANCE = 6; //unit [pixel]
-const int COLUMN_FILL_GAP_TOLERANCE = 10; //enlarge column to fill full width when resizing
+const double MOUSE_DRAG_ACCELERATION_DIP = 1.5; //unit: [rows / (DIP * sec)] -> same value like Explorer!
+const int DEFAULT_COL_LABEL_BORDER_DIP = 6; //top + bottom border in addition to label height
+const int COLUMN_MOVE_DELAY_DIP = 5; //unit: [pixel] (from Explorer)
+const int COLUMN_MIN_WIDTH_DIP = 40; //only honored when resizing manually!
+const int ROW_LABEL_BORDER_DIP = 3;
+const int COLUMN_RESIZE_TOLERANCE_DIP = 6; //unit [pixel]
+const int COLUMN_FILL_GAP_TOLERANCE_DIP = 10; //enlarge column to fill full width when resizing
+const int COLUMN_MOVE_MARKER_WIDTH_DIP = 3;
const bool fillGapAfterColumns = true; //draw rows/column label to fill full window width; may become an instance variable some time?
}
@@ -77,15 +78,15 @@ void GridData::renderCell(wxDC& dc, const wxRect& rect, size_t row, ColumnType c
{
wxRect rectTmp = drawCellBorder(dc, rect);
- rectTmp.x += COLUMN_GAP_LEFT;
- rectTmp.width -= COLUMN_GAP_LEFT;
+ rectTmp.x += getColumnGapLeft();
+ rectTmp.width -= getColumnGapLeft();
drawCellText(dc, rectTmp, getValue(row, colType));
}
int GridData::getBestSize(wxDC& dc, size_t row, ColumnType colType)
{
- return dc.GetTextExtent(getValue(row, colType)).GetWidth() + 2 * COLUMN_GAP_LEFT + 1; //gap on left and right side + border
+ return dc.GetTextExtent(getValue(row, colType)).GetWidth() + 2 * getColumnGapLeft() + 1; //gap on left and right side + border
}
@@ -104,7 +105,7 @@ void GridData::drawCellBackground(wxDC& dc, const wxRect& rect, bool enabled, bo
if (enabled)
{
if (selected)
- dc.GradientFillLinear(rect, Grid::getColorSelectionGradientFrom(), Grid::getColorSelectionGradientTo(), wxEAST);
+ dc.GradientFillLinear(rect, getColorSelectionGradientFrom(), getColorSelectionGradientTo(), wxEAST);
else
clearArea(dc, rect, backgroundColor);
}
@@ -186,8 +187,8 @@ void GridData::renderColumnLabel(Grid& grid, wxDC& dc, const wxRect& rect, Colum
wxRect rectTmp = drawColumnLabelBorder(dc, rect);
drawColumnLabelBackground(dc, rectTmp, highlighted);
- rectTmp.x += COLUMN_GAP_LEFT;
- rectTmp.width -= COLUMN_GAP_LEFT;
+ rectTmp.x += getColumnGapLeft();
+ rectTmp.width -= getColumnGapLeft();
drawColumnLabelText(dc, rectTmp, getColumnLabel(colType));
}
@@ -245,15 +246,14 @@ public:
{
Connect(wxEVT_PAINT, wxPaintEventHandler(SubWindow::onPaintEvent), nullptr, this);
Connect(wxEVT_SIZE, wxSizeEventHandler (SubWindow::onSizeEvent), nullptr, this);
- //http://wiki.wxwidgets.org/Flicker-Free_Drawing
- Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(SubWindow::onEraseBackGround), nullptr, this);
+ Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing
//SetDoubleBuffered(true); slow as hell!
SetBackgroundStyle(wxBG_STYLE_PAINT);
- Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(SubWindow::onFocus), nullptr, this);
- Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(SubWindow::onFocus), nullptr, this);
+ Connect(wxEVT_SET_FOCUS, wxFocusEventHandler(SubWindow::onFocus), nullptr, this);
+ Connect(wxEVT_KILL_FOCUS, wxFocusEventHandler(SubWindow::onFocus), nullptr, this);
Connect(wxEVT_CHILD_FOCUS, wxEventHandler(SubWindow::onChildFocus), nullptr, this);
Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler(SubWindow::onMouseLeftDown ), nullptr, this);
@@ -364,8 +364,6 @@ private:
event.Skip();
}
- void onEraseBackGround(wxEraseEvent& event) {}
-
Grid& parent_;
Opt<wxBitmap> doubleBuffer_;
};
@@ -429,7 +427,7 @@ public:
int bestWidth = 0;
for (ptrdiff_t i = rowFrom; i <= rowTo; ++i)
- bestWidth = std::max(bestWidth, dc.GetTextExtent(formatRow(i)).GetWidth() + 2 * ROW_LABEL_BORDER);
+ bestWidth = std::max(bestWidth, dc.GetTextExtent(formatRow(i)).GetWidth() + fastFromDIP(2 * ROW_LABEL_BORDER_DIP));
return bestWidth;
}
@@ -671,10 +669,12 @@ private:
if (refParent().allowColumnMove_)
if (activeClickOrMove_ && activeClickOrMove_->isRealMove())
{
+ const int markerWidth = fastFromDIP(COLUMN_MOVE_MARKER_WIDTH_DIP);
+
if (col + 1 == activeClickOrMove_->refColumnTo()) //handle pos 1, 2, .. up to "at end" position
- dc.GradientFillLinear(wxRect(rect.GetTopRight(), rect.GetBottomRight() + wxPoint(-2, 0)), getColorLabelGradientFrom(), *wxBLUE, wxSOUTH);
+ dc.GradientFillLinear(wxRect(rect.x + rect.width - markerWidth, rect.y, markerWidth, rect.height), getColorLabelGradientFrom(), *wxBLUE, wxSOUTH);
else if (col == activeClickOrMove_->refColumnTo() && col == 0) //pos 0
- dc.GradientFillLinear(wxRect(rect.GetTopLeft(), rect.GetBottomLeft() + wxPoint(2, 0)), getColorLabelGradientFrom(), *wxBLUE, wxSOUTH);
+ dc.GradientFillLinear(wxRect(rect.GetTopLeft(), wxSize(markerWidth, rect.height)), getColorLabelGradientFrom(), *wxBLUE, wxSOUTH);
}
}
}
@@ -769,7 +769,7 @@ private:
//check if there's a small gap after last column, if yes, fill it
const int gapWidth = GetClientSize().GetWidth() - refParent().getColWidthsSum(GetClientSize().GetWidth());
- if (std::abs(gapWidth) < COLUMN_FILL_GAP_TOLERANCE)
+ if (std::abs(gapWidth) < fastFromDIP(COLUMN_FILL_GAP_TOLERANCE_DIP))
refParent().setColumnWidth(newWidth + gapWidth, col, ALLOW_GRID_EVENT);
refParent().Refresh(); //refresh columns on main grid as well!
@@ -777,7 +777,7 @@ private:
else if (activeClickOrMove_)
{
const int clientPosX = event.GetPosition().x;
- if (std::abs(clientPosX - activeClickOrMove_->getStartPosX()) > COLUMN_MOVE_DELAY) //real move (not a single click)
+ if (std::abs(clientPosX - activeClickOrMove_->getStartPosX()) > fastFromDIP(COLUMN_MOVE_DELAY_DIP)) //real move (not a single click)
{
activeClickOrMove_->setRealMove();
@@ -1163,13 +1163,13 @@ private:
wnd_.refParent().GetScrollPixelsPerUnit(nullptr, &pixelsPerUnitY);
if (pixelsPerUnitY <= 0) return;
- const double mouseDragSpeedIncScrollU = pixelsPerUnitY > 0 ? MOUSE_DRAG_ACCELERATION * wnd_.rowLabelWin_.getRowHeight() / pixelsPerUnitY : 0; //unit: [scroll units / (pixel * sec)]
+ const double mouseDragSpeedIncScrollU = pixelsPerUnitY > 0 ? MOUSE_DRAG_ACCELERATION_DIP * wnd_.rowLabelWin_.getRowHeight() / pixelsPerUnitY : 0; //unit: [scroll units / (DIP * sec)]
auto autoScroll = [&](int overlapPix, double& toScroll)
{
if (overlapPix != 0)
{
- const double scrollSpeed = overlapPix * mouseDragSpeedIncScrollU; //unit: [scroll units / sec]
+ const double scrollSpeed = wnd_.ToDIP(overlapPix) * mouseDragSpeedIncScrollU; //unit: [scroll units / sec]
toScroll += scrollSpeed * deltaSecs;
}
else
@@ -1291,7 +1291,7 @@ Grid::Grid(wxWindow* parent,
colLabelWin_ = new ColLabelWin(*this); //
mainWin_ = new MainWin (*this, *rowLabelWin_, *colLabelWin_); //
- colLabelHeight_ = 2 * DEFAULT_COL_LABEL_BORDER + [&]() -> int
+ colLabelHeight_ = fastFromDIP(2 * DEFAULT_COL_LABEL_BORDER_DIP) + [&]
{
//coordinate with ColLabelWin::render():
wxFont labelFont = colLabelWin_->GetFont();
@@ -1306,9 +1306,9 @@ Grid::Grid(wxWindow* parent,
assert(GetClientSize() == GetSize()); //borders are NOT allowed for Grid
//reason: updateWindowSizes() wants to use "GetSize()" as a "GetClientSize()" including scrollbars
- Connect(wxEVT_PAINT, wxPaintEventHandler(Grid::onPaintEvent ), nullptr, this);
- Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(Grid::onEraseBackGround), nullptr, this);
- Connect(wxEVT_SIZE, wxSizeEventHandler (Grid::onSizeEvent ), nullptr, this);
+ Connect(wxEVT_PAINT, wxPaintEventHandler(Grid::onPaintEvent), nullptr, this);
+ Connect(wxEVT_SIZE, wxSizeEventHandler (Grid::onSizeEvent ), nullptr, this);
+ Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing
Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(Grid::onKeyDown), nullptr, this);
}
@@ -1820,7 +1820,7 @@ Opt<Grid::ColAction> Grid::clientPosToColumnAction(const wxPoint& pos) const
const int absPosX = CalcUnscrolledPosition(pos).x;
if (absPosX >= 0)
{
- const int resizeTolerance = allowColumnResize_ ? COLUMN_RESIZE_TOLERANCE : 0;
+ const int resizeTolerance = allowColumnResize_ ? fastFromDIP(COLUMN_RESIZE_TOLERANCE_DIP) : 0;
std::vector<ColumnWidth> absWidths = getColWidths(); //resolve stretched widths
int accuWidth = 0;
@@ -2104,10 +2104,10 @@ void Grid::setColumnWidth(int width, size_t col, GridEventPolicy columnResizeEve
return;
}
//CAVEATS:
- //I. fixed-size columns: normalize offset so that resulting width is at least COLUMN_MIN_WIDTH: this is NOT enforced by getColWidths()!
+ //I. fixed-size columns: normalize offset so that resulting width is at least COLUMN_MIN_WIDTH_DIP: this is NOT enforced by getColWidths()!
//II. stretched columns: do not allow user to set offsets so small that they result in negative (non-normalized) widths: this gives an
//unusual delay when enlarging the column again later
- width = std::max(width, COLUMN_MIN_WIDTH);
+ width = std::max(width, fastFromDIP(COLUMN_MIN_WIDTH_DIP));
vcRs.offset = width - stretchedWidths[col]; //width := stretchedWidth + offset
@@ -2119,7 +2119,7 @@ void Grid::setColumnWidth(int width, size_t col, GridEventPolicy columnResizeEve
//4. now verify that the stretched column is resizing immediately if main window is enlarged again
for (size_t col2 = 0; col2 < visibleCols_.size(); ++col2)
if (visibleCols_[col2].stretch > 0) //normalize stretched columns only
- visibleCols_[col2].offset = std::max(visibleCols_[col2].offset, COLUMN_MIN_WIDTH - stretchedWidths[col2]);
+ visibleCols_[col2].offset = std::max(visibleCols_[col2].offset, fastFromDIP(COLUMN_MIN_WIDTH_DIP) - stretchedWidths[col2]);
if (columnResizeEventPolicy == ALLOW_GRID_EVENT)
{
@@ -2213,9 +2213,9 @@ std::vector<Grid::ColumnWidth> Grid::getColWidths(int mainWinWidth) const //eval
int width = stretchedWidths[col2] + vc.offset;
if (vc.stretch > 0)
- width = std::max(width, COLUMN_MIN_WIDTH); //normalization really needed here: e.g. smaller main window would result in negative width
+ width = std::max(width, fastFromDIP(COLUMN_MIN_WIDTH_DIP)); //normalization really needed here: e.g. smaller main window would result in negative width
else
- width = std::max(width, 0); //support smaller width than COLUMN_MIN_WIDTH if set via configuration
+ width = std::max(width, 0); //support smaller width than COLUMN_MIN_WIDTH_DIP if set via configuration
output.push_back({ vc.type, width });
}
diff --git a/wx+/grid.h b/wx+/grid.h
index a5c1a783..c90981b5 100755
--- a/wx+/grid.h
+++ b/wx+/grid.h
@@ -118,7 +118,9 @@ public:
virtual void renderColumnLabel(Grid& grid, wxDC& dc, const wxRect& rect, ColumnType colType, bool highlighted); //default implementation
virtual std::wstring getToolTip(ColumnType colType) const { return std::wstring(); }
- static const int COLUMN_GAP_LEFT; //for left-aligned text
+ static int getColumnGapLeft(); //for left-aligned text
+ static wxColor getColorSelectionGradientFrom();
+ static wxColor getColorSelectionGradientTo();
//optional helper routines:
static wxSize drawCellText (wxDC& dc, const wxRect& rect, const std::wstring& text, int alignment = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL); //returns text extent
@@ -223,12 +225,8 @@ public:
//############################################################################################################
- static wxColor getColorSelectionGradientFrom();
- static wxColor getColorSelectionGradientTo();
-
private:
void onPaintEvent(wxPaintEvent& event);
- void onEraseBackGround(wxEraseEvent& event) {} //[!]
void onSizeEvent(wxSizeEvent& event) { updateWindowSizes(); event.Skip(); }
void onKeyDown(wxKeyEvent& event);
diff --git a/FreeFileSync/Source/lib/icon_holder.h b/wx+/image_holder.h
index 52bfe474..6804d5fc 100755
--- a/FreeFileSync/Source/lib/icon_holder.h
+++ b/wx+/image_holder.h
@@ -9,9 +9,10 @@
#include <memory>
-
//used by fs/abstract.h => check carefully before adding dependencies!
-namespace fff
+//DO NOT add any wx/wx+ includes!
+
+namespace zen
{
struct ImageHolder //prepare conversion to wxImage as much as possible while staying thread-safe (in contrast to wxIcon/wxBitmap)
{
diff --git a/wx+/image_resources.cpp b/wx+/image_resources.cpp
index d4547d35..e87b245c 100755
--- a/wx+/image_resources.cpp
+++ b/wx+/image_resources.cpp
@@ -9,12 +9,17 @@
#include <map>
#include <zen/utf.h>
#include <zen/globals.h>
+#include <zen/perf.h>
#include <zen/thread.h>
#include <wx/wfstream.h>
#include <wx/zipstrm.h>
#include <wx/image.h>
#include <wx/mstream.h>
+#include <xBRZ/src/xbrz.h>
+#include <xBRZ/src/xbrz_tools.h>
#include "image_tools.h"
+#include "image_holder.h"
+#include "dc.h"
using namespace zen;
@@ -22,6 +27,195 @@ using namespace zen;
namespace
{
+
+ImageHolder dpiScale(int width, int height, int dpiWidth, int dpiHeight, const unsigned char* imageRgb, const unsigned char* imageAlpha, int hqScale)
+{
+ assert(imageRgb && imageAlpha); //see convertToVanillaImage()
+ if (width <= 0 || height <= 0 || dpiWidth <= 0 || dpiHeight <= 0)
+ return ImageHolder(0, 0, true /*withAlpha*/);
+
+ const int hqWidth = width * hqScale;
+ const int hqHeight = height * hqScale;
+
+ //get rid of allocation and buffer std::vector<> at thread-level? => no discernable perf improvement
+ std::vector<uint32_t> buf(hqWidth * hqHeight + std::max(width * height, dpiWidth * dpiHeight));
+ uint32_t* const argbSrc = &buf[0] + hqWidth * hqHeight;
+ uint32_t* const xbrTrg = &buf[0];
+ uint32_t* const dpiTrg = argbSrc;
+
+ //convert RGB (RGB byte order) to ARGB (BGRA byte order)
+ {
+ const unsigned char* rgb = imageRgb;
+ const unsigned char* rgbEnd = rgb + 3 * width * height;
+ const unsigned char* alpha = imageAlpha;
+ uint32_t* out = argbSrc;
+
+ for (; rgb < rgbEnd; rgb += 3)
+ *out++ = xbrz::makePixel(*alpha++, rgb[0], rgb[1], rgb[2]);
+ }
+ //-----------------------------------------------------
+ xbrz::scale(hqScale, //size_t factor, //valid range: 2 - SCALE_FACTOR_MAX
+ argbSrc, //const uint32_t* src,
+ xbrTrg, //uint32_t* trg,
+ width, height, //int srcWidth, int srcHeight,
+ xbrz::ColorFormat::ARGB_UNBUFFERED); //ColorFormat colFmt,
+ //test: total xBRZ scaling time with ARGB: 300ms, ARGB_UNBUFFERED: 50ms
+ //-----------------------------------------------------
+ xbrz::bilinearScale(xbrTrg, //const uint32_t* src,
+ hqWidth, hqHeight, //int srcWidth, int srcHeight,
+ dpiTrg, //uint32_t* trg,
+ dpiWidth, dpiHeight); //int trgWidth, int trgHeight
+ //-----------------------------------------------------
+ //convert BGRA to RGB + alpha
+ ImageHolder trgImg(dpiWidth, dpiHeight, true /*withAlpha*/);
+ {
+ unsigned char* rgb = trgImg.getRgb();
+ unsigned char* alpha = trgImg.getAlpha();
+
+ std::for_each(dpiTrg, dpiTrg + dpiWidth * dpiHeight, [&](uint32_t col)
+ {
+ *alpha++ = xbrz::getAlpha(col);
+ *rgb++ = xbrz::getRed (col);
+ *rgb++ = xbrz::getGreen(col);
+ *rgb++ = xbrz::getBlue (col);
+ });
+ }
+ return trgImg;
+}
+
+
+struct WorkItem
+{
+ Zbase<wchar_t> name;
+ int width = 0;
+ int height = 0;
+ int dpiWidth = 0;
+ int dpiHeight = 0;
+ const unsigned char* rgb = nullptr;
+ const unsigned char* alpha = nullptr;
+};
+
+
+class WorkLoad
+{
+public:
+ void add(const WorkItem& wi) //context of main thread
+ {
+ assert(std::this_thread::get_id() == mainThreadId);
+ {
+ std::lock_guard<std::mutex> dummy(lockWork_);
+ workLoad_.push_back(wi);
+ }
+ conditionNewWork_.notify_all();
+ }
+
+ void noMoreWork()
+ {
+ assert(std::this_thread::get_id() == mainThreadId);
+ {
+ std::lock_guard<std::mutex> dummy(lockWork_);
+ expectMoreWork_ = false;
+ }
+ conditionNewWork_.notify_all();
+ }
+
+ //context of worker thread, blocking:
+ Opt<WorkItem> extractNext() //throw ThreadInterruption
+ {
+ assert(std::this_thread::get_id() != mainThreadId);
+ std::unique_lock<std::mutex> dummy(lockWork_);
+
+ interruptibleWait(conditionNewWork_, dummy, [this] { return !workLoad_.empty() || !expectMoreWork_; }); //throw ThreadInterruption
+
+ if (workLoad_.empty())
+ return NoValue();
+
+ WorkItem wi = workLoad_.back(); //
+ workLoad_.pop_back(); //yes, no strong exception guarantee (std::bad_alloc)
+ return wi; //
+ }
+
+private:
+ bool expectMoreWork_ = true;
+ std::vector<WorkItem> workLoad_;
+ std::mutex lockWork_;
+ std::condition_variable conditionNewWork_; //signal event: data for processing available
+};
+
+
+class DpiParallelScaler
+{
+public:
+ DpiParallelScaler(int hqScale)
+ {
+ assert(hqScale > 1);
+ const int threadCount = std::max<int>(std::thread::hardware_concurrency(), 1); //hardware_concurrency() == 0 if "not computable or well defined"
+
+ for (int i = 0; i < threadCount; ++i)
+ worker_.push_back([hqScale, &workload = workload_, &result = result_]
+ {
+ setCurrentThreadName("xBRZ Scaler");
+ while (Opt<WorkItem> wi = workload.extractNext()) //throw ThreadInterruption
+ {
+ ImageHolder ih = dpiScale(wi->width, wi->height,
+ wi->dpiWidth, wi->dpiHeight,
+ wi->rgb, wi->alpha, hqScale);
+ result.access([&](std::vector<std::pair<Zbase<wchar_t>, ImageHolder>>& r) { r.emplace_back(wi->name, std::move(ih)); });
+ }
+ });
+ }
+
+ ~DpiParallelScaler()
+ {
+ for (InterruptibleThread& w : worker_)
+ w.interrupt();
+
+ for (InterruptibleThread& w : worker_)
+ if (w.joinable())
+ w.join();
+ }
+
+ void add(const wxString& name, const wxImage& img)
+ {
+ imgKeeper_.push_back(img); //retain (ref-counted) wxImage so that the rgb/alpha pointers remain valid after passed to threads
+ workload_.add({ copyStringTo<Zbase<wchar_t>>(name),
+ img.GetWidth(), img.GetHeight(),
+ fastFromDIP(img.GetWidth()), fastFromDIP(img.GetHeight()), //don't call fastFromDIP() from worker thread (wxWidgets function!)
+ img.GetData(), img.GetAlpha() });
+ }
+
+ std::map<wxString, wxBitmap> waitAndGetResult()
+ {
+ workload_.noMoreWork();
+
+ for (InterruptibleThread& w : worker_)
+ w.join();
+
+ std::map<wxString, wxBitmap> output;
+
+ result_.access([&](std::vector<std::pair<Zbase<wchar_t>, ImageHolder>>& r)
+ {
+ for (auto& item : r)
+ {
+ ImageHolder& ih = item.second;
+
+ wxImage img(ih.getWidth(), ih.getHeight(), ih.releaseRgb(), false /*static_data*/); //pass ownership
+ img.SetAlpha(ih.releaseAlpha(), false /*static_data*/);
+
+ output[utfTo<wxString>(item.first)] = wxBitmap(img);
+ }
+ });
+ return output;
+ }
+
+private:
+ std::vector<InterruptibleThread> worker_;
+ WorkLoad workload_;
+ Protected<std::vector<std::pair<Zbase<wchar_t>, ImageHolder>>> result_;
+ std::vector<wxImage> imgKeeper_;
+};
+
+
void loadAnimFromZip(wxZipInputStream& zipInput, wxAnimation& anim)
{
//work around wxWidgets bug:
@@ -39,6 +233,8 @@ void loadAnimFromZip(wxZipInputStream& zipInput, wxAnimation& anim)
anim.Load(seekAbleStream, wxANIMATION_TYPE_GIF);
}
+//================================================================================================
+//================================================================================================
class GlobalBitmaps
{
@@ -51,32 +247,35 @@ public:
}
GlobalBitmaps() {}
- ~GlobalBitmaps() { assert(bitmaps.empty() && anims.empty()); } //don't leave wxWidgets objects for static destruction!
+ ~GlobalBitmaps() { assert(bitmaps_.empty() && anims_.empty()); } //don't leave wxWidgets objects for static destruction!
void init(const Zstring& filepath);
void cleanup()
{
- bitmaps.clear();
- anims.clear();
+ bitmaps_.clear();
+ anims_ .clear();
+ dpiScaler_.reset();
}
- const wxBitmap& getImage (const wxString& name) const;
+ const wxBitmap& getImage (const wxString& name);
const wxAnimation& getAnimation(const wxString& name) const;
private:
GlobalBitmaps (const GlobalBitmaps&) = delete;
GlobalBitmaps& operator=(const GlobalBitmaps&) = delete;
- std::map<wxString, wxBitmap> bitmaps;
- std::map<wxString, wxAnimation> anims;
+ std::map<wxString, wxBitmap> bitmaps_;
+ std::map<wxString, wxAnimation> anims_;
+
+ std::unique_ptr<DpiParallelScaler> dpiScaler_;
};
-void GlobalBitmaps::init(const Zstring& filepath)
+void GlobalBitmaps::init(const Zstring& filePath)
{
- assert(bitmaps.empty() && anims.empty());
+ assert(bitmaps_.empty() && anims_.empty());
- wxFFileInputStream input(utfTo<wxString>(filepath));
+ wxFFileInputStream input(utfTo<wxString>(filePath));
if (input.IsOk()) //if not... we don't want to react too harsh here
{
//activate support for .png files
@@ -85,36 +284,49 @@ void GlobalBitmaps::init(const Zstring& filepath)
wxZipInputStream streamIn(input, wxConvUTF8);
//do NOT rely on wxConvLocal! On failure shows unhelpful popup "Cannot convert from the charset 'Unknown encoding (-1)'!"
- for (;;)
- {
- std::unique_ptr<wxZipEntry> entry(streamIn.GetNextEntry()); //take ownership!
- if (!entry)
- break;
+ //do we need xBRZ scaling for high quality DPI images?
+ const int hqScale = numeric::clampCpy<int>(std::ceil(fastFromDIP(1000) / 1000.0), 1, xbrz::SCALE_FACTOR_MAX);
+ //even for 125% DPI scaling, "2xBRZ + bilinear downscale" gives a better result than mere "125% bilinear upscale"!
+ if (hqScale > 1)
+ dpiScaler_ = std::make_unique<DpiParallelScaler>(hqScale);
+ while (const auto& entry = std::unique_ptr<wxZipEntry>(streamIn.GetNextEntry())) //take ownership!)
+ {
const wxString name = entry->GetName();
- //generic image loading
if (endsWith(name, L".png"))
{
wxImage img(streamIn, wxBITMAP_TYPE_PNG);
//end this alpha/no-alpha/mask/wxDC::DrawBitmap/RTL/high-contrast-scheme interoperability nightmare here and now!!!!
- //=> there's only one type of png image: with alpha channel, no mask!!!
+ //=> there's only one type of wxImage: with alpha channel, no mask!!!
convertToVanillaImage(img);
- bitmaps.emplace(name, img);
+ if (dpiScaler_)
+ dpiScaler_->add(name, img); //scale in parallel!
+ else
+ bitmaps_.emplace(name, img);
}
else if (endsWith(name, L".gif"))
- loadAnimFromZip(streamIn, anims[name]);
+ loadAnimFromZip(streamIn, anims_[name]);
}
}
}
-const wxBitmap& GlobalBitmaps::getImage(const wxString& name) const
+const wxBitmap& GlobalBitmaps::getImage(const wxString& name)
{
- auto it = bitmaps.find(contains(name, L'.') ? name : name + L".png"); //assume .png ending if nothing else specified
- if (it != bitmaps.end())
+ //test: this function is first called about 220ms after GlobalBitmaps::init() has ended
+ // => should be enough time to finish xBRZ scaling in parallel (which takes 50ms)
+ //debug perf: extra 800-1000ms during startup
+ if (dpiScaler_)
+ {
+ bitmaps_ = dpiScaler_->waitAndGetResult();
+ dpiScaler_.reset();
+ }
+
+ auto it = bitmaps_.find(contains(name, L'.') ? name : name + L".png"); //assume .png ending if nothing else specified
+ if (it != bitmaps_.end())
return it->second;
assert(false);
return wxNullBitmap;
@@ -123,8 +335,8 @@ const wxBitmap& GlobalBitmaps::getImage(const wxString& name) const
const wxAnimation& GlobalBitmaps::getAnimation(const wxString& name) const
{
- auto it = anims.find(contains(name, L'.') ? name : name + L".gif");
- if (it != anims.end())
+ auto it = anims_.find(contains(name, L'.') ? name : name + L".gif");
+ if (it != anims_.end())
return it->second;
assert(false);
return wxNullAnimation;
diff --git a/wx+/image_resources.h b/wx+/image_resources.h
index cc4ab2cc..5ea56679 100755
--- a/wx+/image_resources.h
+++ b/wx+/image_resources.h
@@ -14,7 +14,7 @@
namespace zen
{
-void initResourceImages(const Zstring& filepath); //pass resources .zip file at application startup
+void initResourceImages(const Zstring& filePath); //pass resources .zip file at application startup
void cleanupResourceImages();
const wxBitmap& getResourceImage (const wxString& name);
diff --git a/wx+/image_tools.cpp b/wx+/image_tools.cpp
index 235ebe59..26a5b37c 100755
--- a/wx+/image_tools.cpp
+++ b/wx+/image_tools.cpp
@@ -9,9 +9,9 @@
#include <zen/zstring.h>
#include <wx/app.h>
-
using namespace zen;
+
namespace
{
void writeToImage(const wxImage& source, wxImage& target, const wxPoint& pos)
diff --git a/wx+/popup_dlg.cpp b/wx+/popup_dlg.cpp
index 5babaff3..6633d2ab 100755
--- a/wx+/popup_dlg.cpp
+++ b/wx+/popup_dlg.cpp
@@ -15,18 +15,12 @@
using namespace zen;
+
namespace
{
-void setAsStandard(wxButton& btn)
-{
- btn.SetDefault();
- btn.SetFocus();
-}
-
-
void setBestInitialSize(wxTextCtrl& ctrl, const wxString& text, wxSize maxSize)
{
- const int scrollbarWidth = 30;
+ const int scrollbarWidth = fastFromDIP(20);
if (maxSize.x <= scrollbarWidth) //implicitly checks for non-zero, too!
return;
maxSize.x -= scrollbarWidth;
@@ -117,8 +111,9 @@ public:
SetTitle(wxTheApp->GetAppDisplayName() + SPACED_DASH + titleTmp);
}
- int maxWidth = 500;
- int maxHeight = 400; //try to determine better value based on actual display resolution:
+ int maxWidth = fastFromDIP(500);
+ int maxHeight = fastFromDIP(400); //try to determine better value based on actual display resolution:
+ //int [maxWidth, maxHeight] = wxSize(fastFromDIP(500), fastFromDIP(400));
if (parent)
{
@@ -139,7 +134,10 @@ public:
if (!cfg.textDetail.empty())
{
- const wxString& text = L"\n" + trimCpy(cfg.textDetail) + L"\n"; //add empty top/bottom lines *instead* of using border space!
+ wxString text;
+ if (!cfg.textMain.empty())
+ text += L"\n";
+ text += trimCpy(cfg.textDetail) + L"\n"; //add empty top/bottom lines *instead* of using border space!
setBestInitialSize(*m_textCtrlTextDetail, text, wxSize(maxWidth, maxHeight));
m_textCtrlTextDetail->ChangeValue(text);
}
@@ -200,9 +198,10 @@ public:
//set std order after button visibility was set
setStandardButtonLayout(*bSizerStdButtons, stdBtns);
- setAsStandard(*m_buttonAccept);
GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize()
Center(); //needs to be re-applied after a dialog size change!
+
+ m_buttonAccept->SetFocus();
}
private:
diff --git a/wx+/popup_dlg_generated.cpp b/wx+/popup_dlg_generated.cpp
index c8c504ae..25ac00e1 100755
--- a/wx+/popup_dlg_generated.cpp
+++ b/wx+/popup_dlg_generated.cpp
@@ -1,8 +1,8 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 17 2015)
+// C++ code generated with wxFormBuilder (version Jan 23 2018)
// http://www.wxformbuilder.org/
//
-// PLEASE DO "NOT" EDIT THIS FILE!
+// PLEASE DO *NOT* EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#include "popup_dlg_generated.h"
@@ -63,6 +63,7 @@ PopupDialogGenerated::PopupDialogGenerated( wxWindow* parent, wxWindowID id, con
bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL );
m_buttonAccept = new wxButton( this, wxID_YES, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
+ m_buttonAccept->SetDefault();
bSizerStdButtons->Add( m_buttonAccept, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_buttonAcceptAll = new wxButton( this, wxID_YESTOALL, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 );
diff --git a/wx+/popup_dlg_generated.h b/wx+/popup_dlg_generated.h
index 896f8d0c..0d3459e2 100755
--- a/wx+/popup_dlg_generated.h
+++ b/wx+/popup_dlg_generated.h
@@ -1,8 +1,8 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version Jun 17 2015)
+// C++ code generated with wxFormBuilder (version Jan 23 2018)
// http://www.wxformbuilder.org/
//
-// PLEASE DO "NOT" EDIT THIS FILE!
+// PLEASE DO *NOT* EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////
#ifndef __POPUP_DLG_GENERATED_H__
diff --git a/wx+/std_button_layout.h b/wx+/std_button_layout.h
index 8fe5f405..cf0152de 100755
--- a/wx+/std_button_layout.h
+++ b/wx+/std_button_layout.h
@@ -10,6 +10,7 @@
#include <algorithm>
#include <wx/sizer.h>
#include <wx/button.h>
+#include "dc.h"
namespace zen
@@ -71,9 +72,9 @@ void setStandardButtonLayout(wxBoxSizer& sizer, const StdButtons& buttons)
detach(buttonsTmp.btnCancel);
//GNOME Human Interface Guidelines: https://developer.gnome.org/hig-book/3.2/hig-book.html#alert-spacing
- const int spaceH = 6; //OK
- const int spaceRimH = 12; //OK
- const int spaceRimV = 12; //OK
+ const int spaceH = fastFromDIP( 6); //OK
+ const int spaceRimH = fastFromDIP(12); //OK
+ const int spaceRimV = fastFromDIP(12); //OK
bool settingFirstButton = true;
auto attach = [&](wxButton* btn)
@@ -82,7 +83,7 @@ void setStandardButtonLayout(wxBoxSizer& sizer, const StdButtons& buttons)
{
assert(btn->GetMinSize().GetHeight() == -1); //let OS or this routine do the sizing! note: OS X does not allow changing the (visible!) button height!
const int defaultHeight = wxButton::GetDefaultSize().GetHeight(); //buffered by wxWidgets
- btn->SetMinSize(wxSize(-1, std::max(defaultHeight, 30))); //default button height is much too small => increase!
+ btn->SetMinSize(wxSize(-1, std::max(defaultHeight, fastFromDIP(30)))); //default button height is much too small => increase!
if (settingFirstButton)
settingFirstButton = false;
diff --git a/wx+/tooltip.cpp b/wx+/tooltip.cpp
index a8fd1da1..a7bf85fe 100755
--- a/wx+/tooltip.cpp
+++ b/wx+/tooltip.cpp
@@ -11,20 +11,22 @@
#include <wx/statbmp.h>
#include <wx/settings.h>
#include <wx/app.h>
-#include <wx+/image_tools.h>
+#include "image_tools.h"
+#include "dc.h"
using namespace zen;
+namespace
+{
+const int TIP_WINDOW_OFFSET_DIP = 30;
+}
+
+
class Tooltip::TooltipDlgGenerated : public wxDialog
{
public:
- TooltipDlgGenerated(wxWindow* parent,
- wxWindowID id = wxID_ANY,
- const wxString& title = {},
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = 0) : wxDialog(parent, id, title, pos, size, style)
+ TooltipDlgGenerated(wxWindow* parent) : wxDialog(parent, wxID_ANY, L"" /*title*/, wxDefaultPosition, wxDefaultSize, 0 /*style*/)
{
//Suse Linux/X11: needs parent window, else there are z-order issues
@@ -66,15 +68,15 @@ void Tooltip::show(const wxString& text, wxPoint mousePos, const wxBitmap* bmp)
if (text != tipWindow_->staticTextMain_->GetLabel())
{
tipWindow_->staticTextMain_->SetLabel(text);
- tipWindow_->staticTextMain_->Wrap(600);
+ tipWindow_->staticTextMain_->Wrap(fastFromDIP(600));
}
tipWindow_->GetSizer()->SetSizeHints(tipWindow_); //~=Fit() + SetMinSize()
//Linux: Fit() seems to be broken => this needs to be called EVERY time inside show, not only if text or bmp change
const wxPoint newPos = wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft ?
- mousePos - wxPoint(30 + tipWindow_->GetSize().GetWidth(), 0) :
- mousePos + wxPoint(30, 0);
+ mousePos - wxPoint(fastFromDIP(TIP_WINDOW_OFFSET_DIP) + tipWindow_->GetSize().GetWidth(), 0) :
+ mousePos + wxPoint(fastFromDIP(TIP_WINDOW_OFFSET_DIP), 0);
if (newPos != tipWindow_->GetScreenPosition())
tipWindow_->SetSize(newPos.x, newPos.y, wxDefaultCoord, wxDefaultCoord);
diff --git a/wx+/zlib_wrap.cpp b/wx+/zlib_wrap.cpp
index 540854a1..cb6e3083 100755
--- a/wx+/zlib_wrap.cpp
+++ b/wx+/zlib_wrap.cpp
@@ -5,7 +5,9 @@
// *****************************************************************************
#include "zlib_wrap.h"
- #include <zlib.h> //let's pray this is the same version wxWidgets is linking against!
+//include the SAME zlib version that wxWidgets is linking against!
+ //#include <wx/../../../../../Source/src/zlib/zlib.h> //wxWidgets compiled with: --with-zlib=builtin
+ #include <zlib.h> //use same library as used by Curl (zlib is required for HTTP)
using namespace zen;
diff --git a/zen/format_unit.cpp b/zen/format_unit.cpp
index 09134c07..931a29be 100755
--- a/zen/format_unit.cpp
+++ b/zen/format_unit.cpp
@@ -161,38 +161,39 @@ std::wstring zen::formatFraction(double fraction)
-std::wstring zen::impl::includeNumberSeparator(const std::wstring& number)
+std::wstring zen::formatNumber(int64_t n)
{
//we have to include thousands separator ourselves; this doesn't work for all countries (e.g india), but is better than nothing
//::setlocale (LC_ALL, ""); -> implicitly called by wxLocale
- const lconv* localInfo = ::localeconv(); //always bound according to doc
- const std::wstring& thousandSep = zen::utfTo<std::wstring>(localInfo->thousands_sep);
+ const lconv& localInfo = *::localeconv(); //always bound according to doc
+ const std::wstring& thousandSep = utfTo<std::wstring>(localInfo.thousands_sep);
// THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t>>(std::locale("")).thousands_sep(); - why not working?
// DECIMAL_POINT = std::use_facet<std::numpunct<wchar_t>>(std::locale("")).decimal_point();
- std::wstring output(number);
- size_t i = output.size();
+ std::wstring number = numberTo<std::wstring>(n);
+
+ size_t i = number.size();
for (;;)
{
if (i <= 3)
break;
i -= 3;
- if (!isDigit(output[i - 1])) //stop on +, - signs
+ if (!isDigit(number[i - 1])) //stop on +, - signs
break;
- output.insert(i, thousandSep);
+ number.insert(i, thousandSep);
}
- return output;
+ return number;
}
-std::wstring zen::formatUtcToLocalTime(int64_t utcTime)
+std::wstring zen::formatUtcToLocalTime(time_t utcTime)
{
auto errorMsg = [&] { return _("Error") + L" (time_t: " + numberTo<std::wstring>(utcTime) + L")"; };
TimeComp loc = getLocalTime(utcTime);
-
+
std::wstring dateString = formatTime<std::wstring>(L"%x %X", loc);
return !dateString.empty() ? dateString : errorMsg();
}
diff --git a/zen/format_unit.h b/zen/format_unit.h
index 9c6a4690..23ab33fb 100755
--- a/zen/format_unit.h
+++ b/zen/format_unit.h
@@ -18,36 +18,14 @@ namespace zen
std::wstring formatFilesizeShort(int64_t filesize);
std::wstring formatRemainingTime(double timeInSec);
std::wstring formatFraction(double fraction); //within [0, 1]
-std::wstring formatUtcToLocalTime(int64_t utcTime); //like Windows Explorer would...
+std::wstring formatUtcToLocalTime(time_t utcTime); //like Windows Explorer would...
std::wstring formatTwoDigitPrecision (double value); //format with fixed number of digits
std::wstring formatThreeDigitPrecision(double value); //(unless value is too large)
-template <class NumberType>
-std::wstring formatNumber(NumberType number); //format integer number including thousands separator
+std::wstring formatNumber(int64_t n); //format integer number including thousands separator
-
-
-
-
-
-
-
-
-
-//--------------- inline impelementation -------------------------------------------
-namespace impl
-{
-std::wstring includeNumberSeparator(const std::wstring& number);
-}
-
-template <class NumberType> inline
-std::wstring formatNumber(NumberType number)
-{
- static_assert(IsInteger<NumberType>::value, "");
- return impl::includeNumberSeparator(zen::numberTo<std::wstring>(number));
-}
}
#endif
diff --git a/zen/globals.h b/zen/globals.h
index c57d97ff..2066c380 100755
--- a/zen/globals.h
+++ b/zen/globals.h
@@ -22,17 +22,17 @@ public:
Global()
{
static_assert(std::is_trivially_destructible<Pod>::value, "this memory needs to live forever");
- assert(!pod.inst && !pod.spinLock); //we depend on static zero-initialization!
+ assert(!pod_.inst && !pod_.spinLock); //we depend on static zero-initialization!
}
explicit Global(std::unique_ptr<T>&& newInst) { set(std::move(newInst)); }
~Global() { set(nullptr); }
std::shared_ptr<T> get() //=> return std::shared_ptr to let instance life time be handled by caller (MT usage!)
{
- while (pod.spinLock.exchange(true)) ;
- ZEN_ON_SCOPE_EXIT(pod.spinLock = false);
- if (pod.inst)
- return *pod.inst;
+ while (pod_.spinLock.exchange(true)) ;
+ ZEN_ON_SCOPE_EXIT(pod_.spinLock = false);
+ if (pod_.inst)
+ return *pod_.inst;
return nullptr;
}
@@ -42,9 +42,9 @@ public:
if (newInst)
tmpInst = new std::shared_ptr<T>(std::move(newInst));
{
- while (pod.spinLock.exchange(true)) ;
- ZEN_ON_SCOPE_EXIT(pod.spinLock = false);
- std::swap(pod.inst, tmpInst);
+ while (pod_.spinLock.exchange(true)) ;
+ ZEN_ON_SCOPE_EXIT(pod_.spinLock = false);
+ std::swap(pod_.inst, tmpInst);
}
delete tmpInst;
}
@@ -58,7 +58,7 @@ private:
std::shared_ptr<T>* inst; // = nullptr;
std::atomic<bool> spinLock; // { false }; rely entirely on static zero-initialization! => avoid potential contention with worker thread during Global<> construction!
//serialize access; can't use std::mutex: has non-trival destructor
- } pod;
+ } pod_;
};
}
diff --git a/zen/guid.h b/zen/guid.h
index 633547ad..b2ada48c 100755
--- a/zen/guid.h
+++ b/zen/guid.h
@@ -21,7 +21,7 @@ inline
std::string generateGUID() //creates a 16-byte GUID
{
//perf: generator: 0.38ms per creation;
- // retrieve GUID: 0.13s per call
+ // retrieve GUID: 0.13µs per call
//generator is only thread-safe like an int => keep thread-local
thread_local boost::uuids::random_generator gen;
const boost::uuids::uuid nativeRep = gen();
diff --git a/zen/optional.h b/zen/optional.h
index 0ef5f1db..88928ac0 100755
--- a/zen/optional.h
+++ b/zen/optional.h
@@ -7,7 +7,7 @@
#ifndef OPTIONAL_H_2857428578342203589
#define OPTIONAL_H_2857428578342203589
-#include <cassert>
+//#include <cassert>
#include <type_traits>
@@ -96,6 +96,20 @@ private:
std::aligned_storage_t<sizeof(T), alignof(T)> rawMem_; //don't require T to be default-constructible!
bool valid_ = false;
};
+
+
+template <class T> inline
+bool operator==(const Opt<T>& lhs, const Opt<T>& rhs)
+{
+ if (static_cast<bool>(lhs) != static_cast<bool>(rhs))
+ return false;
+ if (!lhs)
+ return true;
+ return *lhs == *rhs;
+}
+template <class T> inline
+bool operator!=(const Opt<T>& lhs, const Opt<T>& rhs) { return !(lhs == rhs); }
+
}
#endif //OPTIONAL_H_2857428578342203589
diff --git a/zen/perf.h b/zen/perf.h
index 72b57f52..2006bdab 100755
--- a/zen/perf.h
+++ b/zen/perf.h
@@ -19,6 +19,13 @@
#define PERF_STOP perfTest.showResult();
//###########################################################################
+/* Example: Aggregated function call time:
+
+ static zen::PerfTimer timer;
+ timer.resume();
+ ZEN_ON_SCOPE_EXIT(timer.pause());
+*/
+
namespace zen
{
class PerfTimer
diff --git a/zen/process_priority.cpp b/zen/process_priority.cpp
index e925f142..c2a7ed20 100755
--- a/zen/process_priority.cpp
+++ b/zen/process_priority.cpp
@@ -11,6 +11,8 @@
using namespace zen;
+//wxPowerResourceBlocker? http://docs.wxwidgets.org/trunk/classwx_power_resource_blocker.html
+//nah, "currently the power events are only available under Windows"
struct PreventStandby::Impl {};
PreventStandby::PreventStandby() {}
PreventStandby::~PreventStandby() {}
diff --git a/zen/scope_guard.h b/zen/scope_guard.h
index 6945b011..328e2caa 100755
--- a/zen/scope_guard.h
+++ b/zen/scope_guard.h
@@ -115,6 +115,10 @@ auto makeGuard(F&& fun) { return ScopeGuard<runMode, std::decay_t<F>>(std::forwa
#define ZEN_CONCAT_SUB(X, Y) X ## Y
#define ZEN_CONCAT(X, Y) ZEN_CONCAT_SUB(X, Y)
+#define ZEN_CHECK_CASE_FOR_CONSTANT(X) case X: return ZEN_CHECK_CASE_FOR_CONSTANT_IMPL(#X)
+#define ZEN_CHECK_CASE_FOR_CONSTANT_IMPL(X) L ## X
+
+
#define ZEN_ON_SCOPE_EXIT(X) auto ZEN_CONCAT(dummy, __LINE__) = zen::makeGuard<zen::ScopeGuardRunMode::ON_EXIT >([&]{ X; }); (void)ZEN_CONCAT(dummy, __LINE__);
#define ZEN_ON_SCOPE_FAIL(X) auto ZEN_CONCAT(dummy, __LINE__) = zen::makeGuard<zen::ScopeGuardRunMode::ON_FAIL >([&]{ X; }); (void)ZEN_CONCAT(dummy, __LINE__);
#define ZEN_ON_SCOPE_SUCCESS(X) auto ZEN_CONCAT(dummy, __LINE__) = zen::makeGuard<zen::ScopeGuardRunMode::ON_SUCCESS>([&]{ X; }); (void)ZEN_CONCAT(dummy, __LINE__);
diff --git a/zen/sys_error.h b/zen/sys_error.h
index 31eb8209..c179ec8a 100755
--- a/zen/sys_error.h
+++ b/zen/sys_error.h
@@ -81,7 +81,11 @@ std::wstring formatSystemError(const std::wstring& functionName, long long lastE
inline
std::wstring formatSystemError(const std::wstring& functionName, ErrorCode ec)
{
- return formatSystemError(functionName, replaceCpy(_("Error Code %x"), L"%x", numberTo<std::wstring>(ec)), formatSystemErrorRaw(ec));
+ //static_assert(sizeof(ec) == sizeof(int), "");
+ //const std::wstring errorCode = printNumber<std::wstring>(L"0x%08x", static_cast<int>(ec));
+ const std::wstring errorCode = numberTo<std::wstring>(ec);
+
+ return formatSystemError(functionName, replaceCpy(_("Error Code %x"), L"%x", errorCode), formatSystemErrorRaw(ec));
}
diff --git a/zen/thread.h b/zen/thread.h
index bfb66c31..3721b3c7 100755
--- a/zen/thread.h
+++ b/zen/thread.h
@@ -37,12 +37,11 @@ public:
template <class Rep, class Period>
bool tryJoinFor(const std::chrono::duration<Rep, Period>& relTime)
{
- if (threadCompleted_.wait_for(relTime) == std::future_status::ready)
- {
- stdThread_.join(); //runs thread-local destructors => this better be fast!!!
- return true;
- }
- return false;
+ if (threadCompleted_.wait_for(relTime) != std::future_status::ready)
+ return false;
+
+ stdThread_.join(); //runs thread-local destructors => this better be fast!!!
+ return true;
}
private:
@@ -297,7 +296,7 @@ public:
setConditionVar(&cv);
ZEN_ON_SCOPE_EXIT(setConditionVar(nullptr));
- //"interrupted" is not protected by cv's mutex => signal may get lost!!! => add artifical time out to mitigate! CPU: 0.25% vs 0% for longer time out!
+ //"interrupted_" is not protected by cv's mutex => signal may get lost!!! => add artifical time out to mitigate! CPU: 0.25% vs 0% for longer time out!
while (!cv.wait_for(lock, std::chrono::milliseconds(1), [&] { return this->interrupted_ || pred(); }))
;
diff --git a/zen/time.h b/zen/time.h
index 74898c7c..723614ef 100755
--- a/zen/time.h
+++ b/zen/time.h
@@ -48,9 +48,9 @@ template <class String, class String2>
String formatTime(const String2& format, const TimeComp& tc = getLocalTime()); //format as specified by "std::strftime", returns empty string on failure
//the "format" parameter of formatTime() is partially specialized with the following type tags:
-const struct FormatDateTag {} FORMAT_DATE = {}; //%x - locale dependent date representation: e.g. 08/23/01
-const struct FormatTimeTag {} FORMAT_TIME = {}; //%X - locale dependent time representation: e.g. 14:55:02
-const struct FormatDateTimeTag {} FORMAT_DATE_TIME = {}; //%c - locale dependent date and time: e.g. Thu Aug 23 14:55:02 2001
+const struct FormatDateTag {} FORMAT_DATE = {}; //%x - locale dependent date representation: e.g. 8/23/2001
+const struct FormatTimeTag {} FORMAT_TIME = {}; //%X - locale dependent time representation: e.g. 2:55:02 PM
+const struct FormatDateTimeTag {} FORMAT_DATE_TIME = {}; //%c - locale dependent date and time: e.g. 8/23/2001 2:55:02 PM
const struct FormatIsoDateTag {} FORMAT_ISO_DATE = {}; //%Y-%m-%d - e.g. 2001-08-23
const struct FormatIsoTimeTag {} FORMAT_ISO_TIME = {}; //%H:%M:%S - e.g. 14:55:02
diff --git a/zen/zstring.h b/zen/zstring.h
index b96842b5..258603dc 100755
--- a/zen/zstring.h
+++ b/zen/zstring.h
@@ -79,6 +79,7 @@ const wchar_t* const SPACED_DASH = L" \u2013 "; //using 'EN DASH'
const wchar_t LTR_MARK = L'\u200E'; //UTF-8: E2 80 8E
const wchar_t RTL_MARK = L'\u200F'; //UTF-8: E2 80 8F
const wchar_t ELLIPSIS = L'\u2026'; //"..."
+const wchar_t MULT_SIGN = L'\u00D7'; //fancy "x"
diff --git a/zenXml/zenxml/bind.h b/zenXml/zenxml/bind.h
index 824c6cc6..e33809d2 100755
--- a/zenXml/zenxml/bind.h
+++ b/zenXml/zenxml/bind.h
@@ -78,7 +78,7 @@ public:
\endcode
Output:
\verbatim
- <?xml version="1.0" encoding="UTF-8"?>
+ <?xml version="1.0" encoding="utf-8"?>
<Root>
<elem1>1</elem1>
<elem2>2</elem2>
@@ -130,7 +130,7 @@ public:
\endcode
Output:
\verbatim
- <?xml version="1.0" encoding="UTF-8"?>
+ <?xml version="1.0" encoding="utf-8"?>
<Root>
<elem attr1="1" attr2="2" attr3="-3"/>
</Root>
@@ -205,7 +205,7 @@ public:
/**
<b>Example:</b> Loop over all XML child elements named "Item"
\verbatim
- <?xml version="1.0" encoding="UTF-8"?>
+ <?xml version="1.0" encoding="utf-8"?>
<Root>
<Item>1</Item>
<Item>3</Item>
diff --git a/zenXml/zenxml/dom.h b/zenXml/zenxml/dom.h
index c8959e4b..15700ee2 100755
--- a/zenXml/zenxml/dom.h
+++ b/zenXml/zenxml/dom.h
@@ -275,7 +275,7 @@ bool XmlElement::getValue(std::string& value) const { value = value_; return tru
class XmlDoc
{
public:
- ///Default constructor setting up an empty XML document with a standard declaration: <?xml version="1.0" encoding="UTF-8" ?>
+ ///Default constructor setting up an empty XML document with a standard declaration: <?xml version="1.0" encoding="utf-8" ?>
XmlDoc() {}
XmlDoc(XmlDoc&& tmp) { swap(tmp); }
@@ -350,7 +350,7 @@ private:
XmlDoc& operator=(const XmlDoc&) = delete;
std::string version_ { "1.0" };
- std::string encoding_{ "UTF-8" };
+ std::string encoding_{ "utf-8" };
std::string standalone_;
XmlElement root_{ "Root" };
diff --git a/zenXml/zenxml/parser.h b/zenXml/zenxml/parser.h
index 5c6a9ec2..76497ce7 100755
--- a/zenXml/zenxml/parser.h
+++ b/zenXml/zenxml/parser.h
@@ -262,7 +262,7 @@ std::string serialize(const XmlDoc& doc,
Grammar for XML parser
-------------------------------
document-expression:
- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+ <?xml version="1.0" encoding="utf-8" standalone="yes"?>
element-expression:
element-expression:
bgstack15