diff options
author | Daniel Wilhelm <shieldwed@outlook.com> | 2018-05-09 00:11:35 +0200 |
---|---|---|
committer | Daniel Wilhelm <shieldwed@outlook.com> | 2018-05-09 00:11:35 +0200 |
commit | 015bb675d6eb177900c8ac94a6d35edc5ad90576 (patch) | |
tree | edde4153ce9b2ba6bdaf9d3c0af0966ed6dfd717 | |
parent | 9.8 (diff) | |
download | FreeFileSync-015bb675d6eb177900c8ac94a6d35edc5ad90576.tar.gz FreeFileSync-015bb675d6eb177900c8ac94a6d35edc5ad90576.tar.bz2 FreeFileSync-015bb675d6eb177900c8ac94a6d35edc5ad90576.zip |
9.9
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 Binary files differindex c0c2c2ed..28e925b0 100755 --- a/FreeFileSync/Build/Resources.zip +++ b/FreeFileSync/Build/Resources.zip 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 @@ -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 }); } @@ -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_; }; } @@ -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 @@ -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(); })) ; @@ -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: |