From 17994eb3eda9d2be9aad55dae41562ce13531d99 Mon Sep 17 00:00:00 2001 From: B Stack Date: Thu, 15 Aug 2019 15:51:34 -0400 Subject: add upstream 10.15 --- Changelog.txt | 17 +- FreeFileSync/Build/Resources/Gtk2Styles.rc | 7 + FreeFileSync/Build/Resources/Gtk3Styles.css | 7 + FreeFileSync/Build/Resources/Icons.zip | Bin 288295 -> 288396 bytes FreeFileSync/Build/Resources/Languages/arabic.lng | 428 ++-- .../Build/Resources/Languages/bulgarian.lng | 511 ++--- .../Build/Resources/Languages/chinese_simple.lng | 411 ++-- .../Resources/Languages/chinese_traditional.lng | 541 ++--- .../Build/Resources/Languages/croatian.lng | 521 ++--- FreeFileSync/Build/Resources/Languages/czech.lng | 517 ++--- FreeFileSync/Build/Resources/Languages/danish.lng | 415 ++-- FreeFileSync/Build/Resources/Languages/dutch.lng | 417 ++-- .../Build/Resources/Languages/english_uk.lng | 415 ++-- FreeFileSync/Build/Resources/Languages/french.lng | 183 +- FreeFileSync/Build/Resources/Languages/german.lng | 42 +- FreeFileSync/Build/Resources/Languages/greek.lng | 417 ++-- FreeFileSync/Build/Resources/Languages/hebrew.lng | 509 ++--- FreeFileSync/Build/Resources/Languages/hindi.lng | 417 ++-- .../Build/Resources/Languages/hungarian.lng | 511 ++--- FreeFileSync/Build/Resources/Languages/italian.lng | 415 ++-- .../Build/Resources/Languages/japanese.lng | 411 ++-- FreeFileSync/Build/Resources/Languages/korean.lng | 501 ++--- .../Build/Resources/Languages/lithuanian.lng | 521 ++--- .../Build/Resources/Languages/norwegian.lng | 511 ++--- FreeFileSync/Build/Resources/Languages/polish.lng | 523 ++--- .../Build/Resources/Languages/portuguese.lng | 415 ++-- .../Build/Resources/Languages/portuguese_br.lng | 515 ++--- .../Build/Resources/Languages/romanian.lng | 521 ++--- FreeFileSync/Build/Resources/Languages/russian.lng | 419 ++-- FreeFileSync/Build/Resources/Languages/slovak.lng | 169 +- .../Build/Resources/Languages/slovenian.lng | 423 ++-- FreeFileSync/Build/Resources/Languages/spanish.lng | 417 ++-- FreeFileSync/Build/Resources/Languages/swedish.lng | 415 ++-- FreeFileSync/Build/Resources/Languages/turkish.lng | 2118 ++++++++++++++++++++ .../Build/Resources/Languages/ukrainian.lng | 42 +- FreeFileSync/Build/Resources/styles.gtk_rc | 7 - FreeFileSync/Source/Makefile | 11 +- FreeFileSync/Source/RealTimeSync/Makefile | 1 - FreeFileSync/Source/RealTimeSync/application.cpp | 34 +- FreeFileSync/Source/RealTimeSync/config.cpp | 22 +- FreeFileSync/Source/RealTimeSync/main_dlg.cpp | 14 +- FreeFileSync/Source/RealTimeSync/tray_menu.cpp | 12 +- FreeFileSync/Source/afs/abstract.cpp | 9 +- FreeFileSync/Source/afs/ftp.cpp | 4 +- FreeFileSync/Source/afs/gdrive.cpp | 2 +- FreeFileSync/Source/afs/init_curl_libssh2.cpp | 2 +- FreeFileSync/Source/afs/libssh2/init_libssh2.cpp | 4 - FreeFileSync/Source/afs/libssh2/init_open_ssl.cpp | 45 - FreeFileSync/Source/afs/libssh2/init_open_ssl.h | 16 - FreeFileSync/Source/afs/native.cpp | 2 +- FreeFileSync/Source/afs/sftp.cpp | 2 +- FreeFileSync/Source/base/algorithm.cpp | 2 +- FreeFileSync/Source/base/application.cpp | 63 +- FreeFileSync/Source/base/comparison.cpp | 4 +- FreeFileSync/Source/base/config.cpp | 88 +- FreeFileSync/Source/base/config.h | 22 +- FreeFileSync/Source/base/db_file.cpp | 238 ++- FreeFileSync/Source/base/db_file.h | 2 +- FreeFileSync/Source/base/generate_logfile.cpp | 314 --- FreeFileSync/Source/base/generate_logfile.h | 30 - FreeFileSync/Source/base/icon_buffer.cpp | 2 +- FreeFileSync/Source/base/icon_loader.cpp | 136 +- FreeFileSync/Source/base/localization.cpp | 5 +- FreeFileSync/Source/base/log_file.cpp | 314 +++ FreeFileSync/Source/base/log_file.h | 30 + FreeFileSync/Source/base/parse_plural.h | 2 +- FreeFileSync/Source/base/process_callback.h | 4 +- FreeFileSync/Source/base/return_codes.h | 32 +- FreeFileSync/Source/base/status_handler.h | 7 +- FreeFileSync/Source/base/status_handler_impl.h | 4 +- FreeFileSync/Source/base/synchronization.cpp | 6 +- FreeFileSync/Source/base/versioning.cpp | 4 +- FreeFileSync/Source/ui/abstract_folder_picker.cpp | 4 +- FreeFileSync/Source/ui/batch_config.cpp | 14 +- FreeFileSync/Source/ui/batch_status_handler.cpp | 243 +-- FreeFileSync/Source/ui/batch_status_handler.h | 9 +- FreeFileSync/Source/ui/cfg_grid.cpp | 12 +- FreeFileSync/Source/ui/cfg_grid.h | 4 +- FreeFileSync/Source/ui/command_box.cpp | 36 +- FreeFileSync/Source/ui/command_box.h | 4 +- FreeFileSync/Source/ui/file_grid.cpp | 24 +- FreeFileSync/Source/ui/folder_history_box.cpp | 12 +- FreeFileSync/Source/ui/folder_selector.h | 2 +- FreeFileSync/Source/ui/gui_generated.cpp | 509 ++--- FreeFileSync/Source/ui/gui_generated.h | 56 +- FreeFileSync/Source/ui/gui_status_handler.cpp | 248 +-- FreeFileSync/Source/ui/gui_status_handler.h | 4 +- FreeFileSync/Source/ui/log_panel.cpp | 2 +- FreeFileSync/Source/ui/main_dlg.cpp | 295 +-- FreeFileSync/Source/ui/progress_indicator.cpp | 547 +++-- FreeFileSync/Source/ui/progress_indicator.h | 41 +- FreeFileSync/Source/ui/small_dlgs.cpp | 24 +- FreeFileSync/Source/ui/sync_cfg.cpp | 8 +- FreeFileSync/Source/ui/taskbar.cpp | 63 +- FreeFileSync/Source/ui/taskbar.h | 9 - FreeFileSync/Source/ui/tray_icon.h | 5 +- FreeFileSync/Source/ui/triple_splitter.cpp | 2 +- FreeFileSync/Source/ui/version_check.cpp | 30 +- FreeFileSync/Source/version/version.h | 2 +- wx+/graph.cpp | 2 +- wx+/grid.cpp | 4 +- wx+/image_tools.h | 2 +- wx+/popup_dlg.cpp | 24 +- wx+/popup_dlg.h | 34 +- wx+/rtl.h | 2 +- wx+/tooltip.cpp | 16 +- xBRZ/src/xbrz.cpp | 4 +- zen/base64.h | 2 +- zen/basic_math.h | 4 +- zen/dir_watcher.h | 4 +- zen/guid.h | 7 +- zen/http.cpp | 13 +- zen/json.h | 6 +- zen/open_ssl.cpp | 38 +- zen/open_ssl.h | 7 +- zen/process_priority.cpp | 2 +- zen/shell_execute.h | 2 +- zen/stl_tools.h | 2 +- zen/type_traits.h | 4 +- zen/utf.h | 4 +- zen/zstring.cpp | 2 +- zenXml/zenxml/parser.h | 10 +- zenXml/zenxml/xml.h | 6 +- 123 files changed, 10725 insertions(+), 7803 deletions(-) create mode 100755 FreeFileSync/Build/Resources/Gtk2Styles.rc create mode 100755 FreeFileSync/Build/Resources/Gtk3Styles.css create mode 100755 FreeFileSync/Build/Resources/Languages/turkish.lng delete mode 100755 FreeFileSync/Build/Resources/styles.gtk_rc mode change 100644 => 100755 FreeFileSync/Source/Makefile delete mode 100644 FreeFileSync/Source/afs/libssh2/init_open_ssl.cpp delete mode 100644 FreeFileSync/Source/afs/libssh2/init_open_ssl.h delete mode 100644 FreeFileSync/Source/base/generate_logfile.cpp delete mode 100644 FreeFileSync/Source/base/generate_logfile.h create mode 100644 FreeFileSync/Source/base/log_file.cpp create mode 100644 FreeFileSync/Source/base/log_file.h diff --git a/Changelog.txt b/Changelog.txt index 31c831b9..74415e95 100755 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,18 @@ +FreeFileSync 10.15 [2019-08-15] +------------------------------- +Redesigned progress indicator stats +Fixed crash when progress dialog is closed right before showing error +Consider fail-safe file copy when creating sync.ffs_db files +Prepare support for GTK3 GUI framework (Linux) +Support sound output via SDL (Linux) +Shrink standard system icons if needed (Linux) +Add Windows Defender exclusions asynchronously +Fixed main dialog out-of-screen position on startup (macOS) +Activated CDN for all web accesses +Redirect error dialog to stderr during sound playback (Linux) +Updated translation files + + FreeFileSync 10.14 [2019-07-14] ------------------------------- Warn if versioning folder paths differ only in case @@ -34,7 +49,7 @@ Show sync start time and date in progress dialog title Added duration of comparison to log Show all total times in full HH:MM:SS format Added sync start time to log file header -Add Windows Defender exclusions to fix CURLE_OPERATION_TIMEDOUT +Add Windows Defender exclusions to fix CURLE_PARTIAL_FILE New RealTimeSync option to hide console window Support launching through symlink (Windows) Dropped support for Windows XP, Server 2003, and Vista diff --git a/FreeFileSync/Build/Resources/Gtk2Styles.rc b/FreeFileSync/Build/Resources/Gtk2Styles.rc new file mode 100755 index 00000000..b13985a0 --- /dev/null +++ b/FreeFileSync/Build/Resources/Gtk2Styles.rc @@ -0,0 +1,7 @@ +style "no-inner-border" +{ + GtkButton::inner-border = {0, 0, 0, 0} /*remove excessive borders on Gnome*/ + /*GtkButton::focus-padding = 0 => keep default: minor difference + looks better on KDE */ +} + +class "GtkButton" style "no-inner-border" diff --git a/FreeFileSync/Build/Resources/Gtk3Styles.css b/FreeFileSync/Build/Resources/Gtk3Styles.css new file mode 100755 index 00000000..977d45e3 --- /dev/null +++ b/FreeFileSync/Build/Resources/Gtk3Styles.css @@ -0,0 +1,7 @@ +button +{ + /*remove excessive inner border from bitmap buttons*/ + padding: 2px; + min-width: 0; + min-height: 0; +} diff --git a/FreeFileSync/Build/Resources/Icons.zip b/FreeFileSync/Build/Resources/Icons.zip index 899c2e93..af35c0b3 100755 Binary files a/FreeFileSync/Build/Resources/Icons.zip and b/FreeFileSync/Build/Resources/Icons.zip differ diff --git a/FreeFileSync/Build/Resources/Languages/arabic.lng b/FreeFileSync/Build/Resources/Languages/arabic.lng index 022fb2eb..dea9b522 100755 --- a/FreeFileSync/Build/Resources/Languages/arabic.lng +++ b/FreeFileSync/Build/Resources/Languages/arabic.lng @@ -7,8 +7,162 @@ n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5 -&Configure - +Cannot read file %x. +لا يمكن قراءة الملف %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +حجم غير متوقع لتدفق البيانات. +المتوقع: ‎%x bytes +الفعلي: ‎%y bytes + + +Cannot write file %x. +لا يمكن كتابة الملف %x. + +Cannot write permissions of %x. +لا يمكن كتابة أذونات %x. + +Operation not supported between different devices. +العملية غير مدعومة بين الأجهزة المختلفة. + +Cannot delete file %x. +لا يمكن حذف الملف %x. + +Cannot delete symbolic link %x. +لا يمكن حذف الرابط الرمزي %x. + +Cannot delete directory %x. +لا يمكن حذف المسار %x. + +Cannot move file %x to %y. +لا يمكن نقل الملف %x إلى %y. + +Cannot copy symbolic link %x to %y. +لا يمكن نسخ الرابط الرمزي من %x إلى %y. + +Error Code %x +رمز الخطأ %x + +Cannot read directory %x. +لا يمكن قراءة الدليل %x. + +Cannot write modification time of %x. +لا يمكن كتابة وقت تعديل %x. + +Cannot read file attributes of %x. +لا يمكن قراءة سمات الملف %x. + +Cannot create directory %x. +لا يمكن إنشاء المسار %x. + +Cannot determine final path for %x. +تعذر تحديد المسار النهائي لـ %x. + +Operation not supported by device. +العملية غير مدعومة للجهاز. + +Cannot resolve symbolic link %x. +لا يمكن حل الارتباط الرمزي %x. + +Unable to move %x to the recycle bin. +تعذر نقل %x إلى سلة المحذوفات. + +Authentication completed. +نجحت المصادقة. + +You may close this page now and continue with FreeFileSync. +يمكنك غلق هذه الصفحة والاستمرار باستخدام FreeFileSync. + +Authentication failed. +فشلت المصادقة. + +Unable to connect to %x. +لا يمكن الاتصال بـ %x. + +Cannot find %x. +لا يمكن العثور على %x. + +The name %x is used by more than one item in the folder. +الاسم %x تم استخدامه اكثر من مرة فى نفس المجلد. + +Please authorize access to user account %x. +من فضلك امنح الاذن للمستحدم %x. + +Cannot open file %x. +تعذر فتح الملف %x. + +The name %x is already used by another item. +الأسم %x مستخدم بالفعل فى عنصر أخر. + +Cannot determine free disk space for %x. +لا يمكن تحديد مساحة القرص الحرة لـ %x. + +Unable to disconnect from %x. +غير قادر على قطع الاتصال من %x. + +Unable to access %x. +لا يمكن الوصول إلى %x. + +Failed to get information about server %x. +فشل الحصول على معلومات حول الخادم %x. + +Cannot monitor directory %x. +لا يمكن مراقبة المسار %x. + +Cannot find device %x. +لا يمكن العثور على الجهاز %x. + +Cannot open directory %x. +لا يمكن فتح المسار %x. + +Unsupported item type. +نوع العنصر غير مدعم. + +Incorrect command line: +سطر أوامر خاطئ: + +The server does not support authentication via %x. +لا يدعم الخادم المصادقة عبر %x. + +Required: +مطلوب: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +انقضت مهلة العملية بعد 0 ثانية. +انقضت مهلة العملية بعد 1 ثانية. +انقضت مهلة العملية بعد 2 ثانية. +انقضت مهلة العملية بعد %x ثوان. +انقضت مهلة العملية بعد %x ثانية. +انقضت مهلة العملية بعد %x ثانية. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +لا يمكن الانتظار على أكثر 0 اتصال في وقت واحد. +لا يمكن الانتظار على أكثر 1 اتصال في وقت واحد. +لا يمكن الانتظار على أكثر 2 اتصال في وقت واحد. +لا يمكن الانتظار على أكثر %x اتصالات في وقت واحد. +لا يمكن الانتظار على أكثر من %x اتصالات في وقت واحد. +لا يمكن الانتظار على أكثر من %x اتصالات في وقت واحد. + + +Active connections: %x +الاتصال النشط: %x + +Failed to open SFTP channel number %x. +فشل فتح قناة SFTP رقم %x. Both sides have changed since last synchronization. كلا الجانبين قد تغير منذ المزامنة الأخيرة. @@ -112,9 +266,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. ملفات التثبيت تالفة. الرجاء إعادة تثبيت FreeFileSync. -Cannot load file %x. -لا يمكن فتح الملف %x. - Cannot find the following folders: تعذر العثور على المجلدات التالية: @@ -146,6 +297,9 @@ %x عناصر تم العثور عليها +Time elapsed: +الوقت المنقضي: + File %x has an invalid date. يحتوي الملف %x تاريخ غير صالح. @@ -164,9 +318,6 @@ Items differ in attributes only العناصر مختلفة في السمات فقط -The name %x is used by more than one item in the folder. -الاسم %x تم استخدامه اكثر من مرة فى نفس المجلد. - Resolving symbolic link %x جاري حل المسار الرمزي %x @@ -227,6 +378,15 @@ Out of memory. نفدت الذاكرة. +Show in Explorer +إظهار في المستكشف + +Open with default application +فتح باستخدام التطبيق الافتراضي + +Browse directory +تصفح المسار + Database file %x is incompatible. ملف قاعدة البيانات %x غير متوافق. @@ -239,12 +399,6 @@ Database file is corrupted: ملف قاعدة البيانات تالف: -Cannot write file %x. -لا يمكن كتابة الملف %x. - -Cannot read file %x. -لا يمكن قراءة الملف %x. - The database files do not yet contain information about the last synchronization. لا تحتوي ملفات قاعدة البيانات حتى الآن على معلومات حول المزامنة الأخيرة. @@ -263,9 +417,6 @@ Cannot get process information. لا يمكن الحصول على معلومات العملية. -Cannot read file attributes of %x. -لا يمكن قراءة سمات الملف %x. - Waiting while directory is locked: انتظر بينما يتم إنشاء قفل للمسار: @@ -400,27 +551,12 @@ %x بند -Cannot read directory %x. -لا يمكن قراءة الدليل %x. - %x/sec %x ثانية %x items %x عناصر -Show in Explorer -إظهار في المستكشف - -Open with default application -فتح باستخدام التطبيق الافتراضي - -Browse directory -تصفح المسار - -Unable to connect to %x. -لا يمكن الاتصال بـ %x. - Completed successfully تم بنجاح @@ -466,9 +602,6 @@ Cannot write file attributes of %x. لا يمكن كتابة سمات الملف %x. -Cannot open file %x. -تعذر فتح الملف %x. - %x and %y have different content. %x و %y لديهما محتوى مختلف. @@ -499,29 +632,20 @@ Source item %x not found العنصر المصدر %x لم يتم ايجاده -Cannot move file %x to %y. -لا يمكن نقل الملف %x إلى %y. - Parent folder %x is not existing. المجلد الأصل %x غير موجود. -The name %x is already used by another item. -الأسم %x مستخدم بالفعل فى عنصر أخر. - Cannot copy file %x to %y. لا يمكن نسخ الملف %x إلى %y. -Cannot copy symbolic link %x to %y. -لا يمكن نسخ الرابط الرمزي من %x إلى %y. - Creating a Volume Shadow Copy for %x... جاري إنشاء نسخة ظل وسيطة لـ %x... Cannot find folder %x. تعذر العثور على المجلد %x. -Target folder %x already existing. -المجلد الهدف %x موجود سابقاً. +Target folder %x is already existing, but was not available during folder comparison. + Target folder input field must not be empty. يجب أن لا يكون حقل إدخال المجلد الهدف فارغاً. @@ -544,17 +668,14 @@ Not enough free disk space available in: المساحة الحرة المتوفرة على القرص غير كافية: -Required: -مطلوب: - Available: متاح: Some files will be synchronized as part of multiple base folders. ستتم مزامنة بعض الملفات كجزء من مجلدات قاعدة متعددة. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -لتجنب التعارضات، قم بإعداد مرشحات استبعاد بحيث يتم النظر في كل ملف محدث من قبل مجلد أساسي واحد فقط. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. + Versioning folder: مجلد الإصدار: @@ -580,130 +701,6 @@ Unable to create time stamp for versioning: تعذر إنشاء بصمة زمنية من أجل المفاضلة الزمنية: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -حجم غير متوقع لتدفق البيانات. -المتوقع: ‎%x bytes -الفعلي: ‎%y bytes - - -Cannot write permissions of %x. -لا يمكن كتابة أذونات %x. - -Operation not supported between different devices. -العملية غير مدعومة بين الأجهزة المختلفة. - -Cannot delete file %x. -لا يمكن حذف الملف %x. - -Cannot delete symbolic link %x. -لا يمكن حذف الرابط الرمزي %x. - -Cannot delete directory %x. -لا يمكن حذف المسار %x. - -Error Code %x -رمز الخطأ %x - -Cannot write modification time of %x. -لا يمكن كتابة وقت تعديل %x. - -Cannot create directory %x. -لا يمكن إنشاء المسار %x. - -Cannot determine final path for %x. -تعذر تحديد المسار النهائي لـ %x. - -Operation not supported by device. -العملية غير مدعومة للجهاز. - -Cannot resolve symbolic link %x. -لا يمكن حل الارتباط الرمزي %x. - -Unable to move %x to the recycle bin. -تعذر نقل %x إلى سلة المحذوفات. - -Authentication completed. -نجحت المصادقة. - -You may close this page now and continue with FreeFileSync. -يمكنك غلق هذه الصفحة والاستمرار باستخدام FreeFileSync. - -Authentication failed. -فشلت المصادقة. - -Cannot find %x. -لا يمكن العثور على %x. - -Please authorize access to user account %x. -من فضلك امنح الاذن للمستحدم %x. - -Cannot determine free disk space for %x. -لا يمكن تحديد مساحة القرص الحرة لـ %x. - -Unable to disconnect from %x. -غير قادر على قطع الاتصال من %x. - -Unable to access %x. -لا يمكن الوصول إلى %x. - -Failed to get information about server %x. -فشل الحصول على معلومات حول الخادم %x. - -Cannot monitor directory %x. -لا يمكن مراقبة المسار %x. - -Cannot find device %x. -لا يمكن العثور على الجهاز %x. - -Cannot open directory %x. -لا يمكن فتح المسار %x. - -Unsupported item type. -نوع العنصر غير مدعم. - -Incorrect command line: -سطر أوامر خاطئ: - -The server does not support authentication via %x. -لا يدعم الخادم المصادقة عبر %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -انقضت مهلة العملية بعد 0 ثانية. -انقضت مهلة العملية بعد 1 ثانية. -انقضت مهلة العملية بعد 2 ثانية. -انقضت مهلة العملية بعد %x ثوان. -انقضت مهلة العملية بعد %x ثانية. -انقضت مهلة العملية بعد %x ثانية. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -لا يمكن الانتظار على أكثر 0 اتصال في وقت واحد. -لا يمكن الانتظار على أكثر 1 اتصال في وقت واحد. -لا يمكن الانتظار على أكثر 2 اتصال في وقت واحد. -لا يمكن الانتظار على أكثر %x اتصالات في وقت واحد. -لا يمكن الانتظار على أكثر من %x اتصالات في وقت واحد. -لا يمكن الانتظار على أكثر من %x اتصالات في وقت واحد. - - -Active connections: %x -الاتصال النشط: %x - -Failed to open SFTP channel number %x. -فشل فتح قناة SFTP رقم %x. - Drag && drop سحب و إفلات @@ -770,6 +767,9 @@ Actual: %y bytes Command line: سطر الأوامر: +&Hide console window + + The command is triggered if: - files or subfolders change @@ -805,6 +805,9 @@ The command is triggered if: Waiting until directory is available: بإنتظار توافر المسار: +&Configure + + &Show error message أ&ظهر رسائل الخطأ. @@ -842,8 +845,8 @@ The command is triggered if: Scanning... جاري الفحص... -job name -اسم المهمة +configuration file + System: Sleep النظام: سكون @@ -854,8 +857,8 @@ The command is triggered if: Nothing to synchronize لا يوجد شيء للمزامنة -Executing command %x -تنفيذ الأمر %x +Executing command: + You can switch to FreeFileSync's main window to resolve this issue. بإمكانك العودة إلى نافذة FreeFileSync الرئيسية لحل هذه المشكلة. @@ -1059,6 +1062,12 @@ The command is triggered if: Match case مطابقة الحالة +Processed: + + +Remaining: + + New جديد @@ -1295,14 +1304,17 @@ The command is triggered if: &Don't show this dialog again &لا تظهر نافذة الحوار هذه مرة ثانية -Items found: -العناصر التي تم العثور عليها: +Bytes: + -Time remaining: -الوقت المتبقي: +Items: + -Time elapsed: -الوقت المنقضي: +Synchronizing... +مزامنة... + +Minimize to notification area +تصغير إلى منطقة التنبيهات Bytes بايت @@ -1310,12 +1322,6 @@ The command is triggered if: Items العناصر -Synchronizing... -مزامنة... - -Minimize to notification area -تصغير إلى منطقة التنبيهات - When finished: عند الانتهاء: @@ -1391,6 +1397,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: &ازالة السجلات بعد x يوم: +Notification sounds: + + +Synchronization finished: + + Customize context menu: تخصيص القائمة المحلية: @@ -1611,12 +1623,6 @@ This guarantees a consistent state even in case of a serious error. &Delete &حذف -Include all -شمول الكل - -Exclude all -استبعاد الكل - Show icons: إظهار الأيقونات: @@ -1653,6 +1659,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &لا تحفظ +%x cannot be renamed. + + +New name: + + +Rename Configuration + + +Configuration name must not be empty. + + +&Rename... + + Hide configuration اخفاء التكوين @@ -1764,8 +1785,8 @@ This guarantees a consistent state even in case of a serious error. Password: كلمة المرور: -Key password: -كلمة المرور الرئيسية: +Key passphrase: + Please enter a file path. الرجاء إدخال مسار الملف. @@ -2010,6 +2031,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: الملف مقفول من قبل عملية أخرى: +Failed to determine file permission support for folder %x. + + Cannot read security context of %x. لا يمكن قراءة سياق الأمان %x. @@ -2069,12 +2093,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. تعذر تغيير أولويات I/O للعملية. -Unable to shut down the system. -غير فادر على إيقاف تشغيل النظام. - Checking recycle bin failed for folder %x. فشل تصفح سلة المهملات من أجل الملف %x. +Unable to shut down the system. +غير فادر على إيقاف تشغيل النظام. + Prepare installation الاستعداد للتثبيت diff --git a/FreeFileSync/Build/Resources/Languages/bulgarian.lng b/FreeFileSync/Build/Resources/Languages/bulgarian.lng index 3efecf07..b0ecdafd 100755 --- a/FreeFileSync/Build/Resources/Languages/bulgarian.lng +++ b/FreeFileSync/Build/Resources/Languages/bulgarian.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +Не може да прочете файл %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Неочакван размер на потока данни. +Очаквани: %x байта +Фактически: %y байта + + +Cannot write file %x. +Не може да запише файл %x. + +Cannot write permissions of %x. +Не може да запише правата за достъп на %x. + +Operation not supported between different devices. +Операцията не се поддържа между различни устройства. + +Cannot delete file %x. +Не може да изтрие файл %x. + +Cannot delete symbolic link %x. +Не може да изтрие символна връзка %x. + +Cannot delete directory %x. +Не може да изтрие директория %x. + +Cannot move file %x to %y. +Не може да премести файл %x в %y. + +Cannot copy symbolic link %x to %y. +Не може да копира символна връзка %x в %y. + +Error Code %x +Код на грешка %x + +Cannot read directory %x. +Не може да прочете директория %x. + +Cannot write modification time of %x. +Не може да запише времето на промяна на %x. + +Cannot read file attributes of %x. +Не може да прочете атрибутите на файл %x. + +Cannot create directory %x. +Не може да създаде директория %x. + +Cannot determine final path for %x. +Не може да определи крайния път за %x. + +Operation not supported by device. +Операцията не се поддържа от устройството. + +Cannot resolve symbolic link %x. +Не може да проследи символна връзка %x. + +Unable to move %x to the recycle bin. +Не може да премести %x в кошчето. + +Authentication completed. +Аутентификацията завърши. + +You may close this page now and continue with FreeFileSync. +Може да затворите тази страница и да продължите с FreeFileSync. + +Authentication failed. +Аутентификацията неуспешна. + +Unable to connect to %x. +Не може да се свърже със %x. + +Cannot find %x. +Не може да намери %x. + +The name %x is used by more than one item in the folder. +Името %x се използва от повече от един елемент в папката. + +Please authorize access to user account %x. +Моля, оторизирайте достъпа до потребителски акаунт %x. + +Cannot open file %x. +Не може да отвори файл %x. + +The name %x is already used by another item. +Името %x вече се използва от друг елемент. + +Cannot determine free disk space for %x. +Не може да определи свободното дисково пространство за %x. + +Unable to disconnect from %x. +Не може да прекъсне връзката от %x. + +Unable to access %x. +Няма достъп до %x. + +Failed to get information about server %x. +Не може да получи информация за сървъра %x. + +Cannot monitor directory %x. +Не може да следи директория %x. + +Cannot find device %x. +Не може да намери устройство %x. + +Cannot open directory %x. +Не може да отвори директория %x. + +Unsupported item type. +Неподдържан тип елемент. + +Incorrect command line: +Невалиден команден ред: + +The server does not support authentication via %x. +Сървърът не поддържа идентификация чрез %x. + +Required: +Необходимо: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Времето на операцията изтича след 1 секунда. +Времето на операцията изтича след %x секунди. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Не може да чака за повече от 1 връзка едновременно. +Не може да чака за повече от %x връзки едновременно. + + +Active connections: %x +Активни връзки: %x + +Failed to open SFTP channel number %x. +Не може да отвори SFTP-канал номер %x. + Both sides have changed since last synchronization. Двете страни променени след последната синхронизация. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Инсталационните файлове са повредени. Моля, преинсталирайте FreeFileSync. -Cannot load file %x. -Не може да зареди файл %x. - Cannot find the following folders: Не може да намери следните папки: @@ -139,6 +285,9 @@ %x елемента намерени +Time elapsed: +Изминало време: + File %x has an invalid date. Файл %x има невалидна дата. @@ -157,9 +306,6 @@ Items differ in attributes only Елементите се различават само по атрибути -The name %x is used by more than one item in the folder. -Името %x се използва от повече от един елемент в папката. - Resolving symbolic link %x Проследява символна връзка %x @@ -220,6 +366,15 @@ Out of memory. Недостатъчна памет. +Show in Explorer +Покажи в Експлорера + +Open with default application +Отвори с подразбираното приложение + +Browse directory +Преглед на директорията + Database file %x is incompatible. Базата данни %x е несъвместима. @@ -232,12 +387,6 @@ Database file is corrupted: Базата данни е повредена: -Cannot write file %x. -Не може да запише файл %x. - -Cannot read file %x. -Не може да прочете файл %x. - The database files do not yet contain information about the last synchronization. Базите данни още не съдържат информация за последната синхронизация. @@ -256,9 +405,6 @@ Cannot get process information. Не може да получи информация за процеса. -Cannot read file attributes of %x. -Не може да прочете атрибутите на файл %x. - Waiting while directory is locked: Изчаква, докато е заключена директорията: @@ -331,6 +477,27 @@ Update attributes on right Актуализирай атрибутите на десния елемент +Error parsing file %x, row %y, column %z. +Грешка при анализ на файл %x, ред %y, колона %z. + +Services +Услуги + +Show All +Покажи всички + +Hide Others +Скрий другите + +Hide %x +Скрий %x + +Quit %x +Край на %x + +Cannot set directory locks for the following folders: +Не може да заключи директориите за следните папки: + Errors: Грешки: @@ -355,27 +522,6 @@ Cleaning up log files: Почистване на log-файловете: -Error parsing file %x, row %y, column %z. -Грешка при анализ на файл %x, ред %y, колона %z. - -Services -Услуги - -Show All -Покажи всички - -Hide Others -Скрий другите - -Hide %x -Скрий %x - -Quit %x -Край на %x - -Cannot set directory locks for the following folders: -Не може да заключи директориите за следните папки: - 1 thread %x threads @@ -385,27 +531,12 @@ %x нишки -Cannot read directory %x. -Не може да прочете директория %x. - %x/sec %x/сек. %x items %x елемента -Show in Explorer -Покажи в Експлорера - -Open with default application -Отвори с подразбираното приложение - -Browse directory -Преглед на директорията - -Unable to connect to %x. -Не може да се свърже със %x. - Completed successfully Завърши успешно @@ -451,9 +582,6 @@ Cannot write file attributes of %x. Не може да запише файловите атрибути на %x. -Cannot open file %x. -Не може да отвори файл %x. - %x and %y have different content. %x и %y имат различно съдържание. @@ -484,29 +612,20 @@ Source item %x not found Изходен елемент %x не е намерен -Cannot move file %x to %y. -Не може да премести файл %x в %y. - Parent folder %x is not existing. Родителска папка %x не съществува. -The name %x is already used by another item. -Името %x вече се използва от друг елемент. - Cannot copy file %x to %y. Не може да копира файл %x в %y. -Cannot copy symbolic link %x to %y. -Не може да копира символна връзка %x в %y. - Creating a Volume Shadow Copy for %x... Създава се Volume Shadow Copy за %x... Cannot find folder %x. Не е намерена папка %x. -Target folder %x already existing. -Целевата папка %x вече съществува. +Target folder %x is already existing, but was not available during folder comparison. +Целевата папка %x вече съществува, но не е била достъпна при сравняването на папки. Target folder input field must not be empty. Полето за целева папка не бива да е празно. @@ -529,17 +648,14 @@ Not enough free disk space available in: Недостатъчно свободно дисково пространство в: -Required: -Необходимо: - Available: Налично: Some files will be synchronized as part of multiple base folders. Някои файлове ще бъдат синхронизирани като част от повече базови папки. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -За избягване конфликти задайте изключващи филтри, тъй че всеки актуализиран файл да бъде следен само от една базова папка. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +За избягване на конфликти задайте изключващи филтри, така че всеки обновен файл да е включен само в една базова папка. Versioning folder: Папка за версии: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Не може да маркира времето на версиите: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Неочакван размер на потока данни. -Очаквани: %x байта -Фактически: %y байта - - -Cannot write permissions of %x. -Не може да запише правата за достъп на %x. - -Operation not supported between different devices. -Операцията не се поддържа между различни устройства. - -Cannot delete file %x. -Не може да изтрие файл %x. - -Cannot delete symbolic link %x. -Не може да изтрие символна връзка %x. - -Cannot delete directory %x. -Не може да изтрие директория %x. - -Error Code %x -Код на грешка %x - -Cannot write modification time of %x. -Не може да запише времето на промяна на %x. - -Cannot create directory %x. -Не може да създаде директория %x. - -Cannot determine final path for %x. -Не може да определи крайния път за %x. - -Operation not supported by device. -Операцията не се поддържа от устройството. - -Cannot resolve symbolic link %x. -Не може да проследи символна връзка %x. - -Unable to move %x to the recycle bin. -Не може да премести %x в кошчето. - -Authentication completed. -Аутентификацията завърши. - -You may close this page now and continue with FreeFileSync. -Може да затворите тази страница и да продължите с FreeFileSync. - -Authentication failed. -Аутентификацията неуспешна. - -Cannot find %x. -Не може да намери %x. - -Please authorize access to user account %x. -Моля, оторизирайте достъпа до потребителски акаунт %x. - -Cannot determine free disk space for %x. -Не може да определи свободното дисково пространство за %x. - -Unable to disconnect from %x. -Не може да прекъсне връзката от %x. - -Unable to access %x. -Няма достъп до %x. - -Failed to get information about server %x. -Не може да получи информация за сървъра %x. - -Cannot monitor directory %x. -Не може да следи директория %x. - -Cannot find device %x. -Не може да намери устройство %x. - -Cannot open directory %x. -Не може да отвори директория %x. - -Unsupported item type. -Неподдържан тип елемент. - -Incorrect command line: -Невалиден команден ред: - -The server does not support authentication via %x. -Сървърът не поддържа идентификация чрез %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Времето на операцията изтича след 1 секунда. -Времето на операцията изтича след %x секунди. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Не може да чака за повече от 1 връзка едновременно. -Не може да чака за повече от %x връзки едновременно. - - -Active connections: %x -Активни връзки: %x - -Failed to open SFTP channel number %x. -Не може да отвори SFTP-канал номер %x. - Drag && drop Влачете и пуснете @@ -747,6 +747,9 @@ Actual: %y bytes Command line: Команден ред: +&Hide console window +&Скрий прозореца на конзолата + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ The command is triggered if: Waiting until directory is available: Изчаква достъп до директорията: -&Restore -&Възстановяване +&Configure +&Конфигурирай &Show error message &Покажи съобщение за грешка @@ -818,8 +821,8 @@ The command is triggered if: Scanning... Търси файлове... -job name -име на задача +configuration file +конфигурационен файл System: Sleep Система: Заспиване @@ -830,8 +833,8 @@ The command is triggered if: Nothing to synchronize Нищо за синхронизиране -Executing command %x -Изпълнява команда %x +Executing command: +Изпълнява команда: You can switch to FreeFileSync's main window to resolve this issue. Може да идете в главния прозорец на FreeFileSync, за да решите проблема. @@ -1031,6 +1034,12 @@ The command is triggered if: Match case Големи/малки букви +Processed: +Обработени: + +Remaining: +Оставащи: + New Нова @@ -1267,14 +1276,17 @@ The command is triggered if: &Don't show this dialog again &Не показвай повече този диалог -Items found: -Открити елементи: +Bytes: +Байтове: -Time remaining: -Оставащо време: +Items: +Елементи: -Time elapsed: -Изминало време: +Synchronizing... +Синхронизация... + +Minimize to notification area +Минимизирай в известяващото поле Bytes Байтове @@ -1282,12 +1294,6 @@ The command is triggered if: Items Елементи -Synchronizing... -Синхронизация... - -Minimize to notification area -Минимизирай в известяващото поле - When finished: След завършване: @@ -1363,6 +1369,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: &Изтрий протоколите след x дни: +Notification sounds: +Известяващи звуци: + +Synchronization finished: +Синхронизацията завърши: + Customize context menu: Настрой контекстното меню: @@ -1513,33 +1525,6 @@ This guarantees a consistent state even in case of a serious error. &Execute &Изпълни - -1 directory -%x directories - - -1 директория -%x директории - - - -1 file -%x files - - -1 файл -%x файла - - - -Showing %y of 1 row -Showing %y of %x rows - - -Показани: %y от 1 ред -Показани: %y от %x реда - - Set direction: Задай посока: @@ -1567,12 +1552,6 @@ This guarantees a consistent state even in case of a serious error. &Delete &Изтрий -Include all -Включи всички - -Exclude all -Изключи всички - Show icons: Покажи иконите: @@ -1609,6 +1588,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &Не запазвай +%x cannot be renamed. +%x не може да се преименува. + +New name: +Ново име: + +Rename Configuration +Преименувай конфигурацията + +Configuration name must not be empty. +Името на конфигурацията не бива да е празно. + +&Rename... +&Преименувай... + Hide configuration Скрий конфигурацията @@ -1669,6 +1663,33 @@ This guarantees a consistent state even in case of a serious error. All files are in sync Всички файлове са синхронизирани + +1 directory +%x directories + + +1 директория +%x директории + + + +1 file +%x files + + +1 файл +%x файла + + + +Showing %y of 1 row +Showing %y of %x rows + + +Показани: %y от 1 ред +Показани: %y от %x реда + + Cannot find %x Не е открит %x @@ -1720,8 +1741,8 @@ This guarantees a consistent state even in case of a serious error. Password: Парола: -Key password: -Ключова фраза: +Key passphrase: +Фраза за достъп: Please enter a file path. Моля, въведете файлов път. @@ -1885,6 +1906,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. Минималния брой версии трябва да е по-малък от максималния. +&Restore +&Възстановяване + Files Файлове @@ -1951,6 +1975,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: Файлът е заключен от друг процес: +Failed to determine file permission support for folder %x. +Не може да определи поддръжката на права за достъп за папка %x. + Cannot read security context of %x. Не може да прочете контекста за сигурност на %x. @@ -2002,12 +2029,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. Не може да промени I/O-приоритетите на процеса. -Unable to shut down the system. -Не може да изключи системата. - Checking recycle bin failed for folder %x. Неуспешна проверка на кошчето за папка %x. +Unable to shut down the system. +Не може да изключи системата. + Prepare installation Подготовка за инсталиране diff --git a/FreeFileSync/Build/Resources/Languages/chinese_simple.lng b/FreeFileSync/Build/Resources/Languages/chinese_simple.lng index 7935f2d9..7b00b32b 100755 --- a/FreeFileSync/Build/Resources/Languages/chinese_simple.lng +++ b/FreeFileSync/Build/Resources/Languages/chinese_simple.lng @@ -7,6 +7,153 @@ 0 +Cannot read file %x. +无法读取文件 %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +意外大小的数据流. +预期: %x 字节 +实际: %y 字节 + + +Cannot write file %x. +无法写入文件 %x. + +Cannot write permissions of %x. +无法写入 %x 的权限. + +Operation not supported between different devices. +不同设备之间不支持此操作. + +Cannot delete file %x. +无法删除文件 %x. + +Cannot delete symbolic link %x. +无法删除符号链接 %x. + +Cannot delete directory %x. +无法删除目录 %x. + +Cannot move file %x to %y. +无法移动文件 %x 到 %y. + +Cannot copy symbolic link %x to %y. +无法复制符号连接 %x 到 %y. + +Error Code %x +错误代码 %x + +Cannot read directory %x. +无法读取目录 %x. + +Cannot write modification time of %x. +无法写入 %x 的最后修改时间. + +Cannot read file attributes of %x. +无法读取 %x 的文件属性. + +Cannot create directory %x. +无法创建目录 %x. + +Cannot determine final path for %x. +无法确定 %x 的最终路径. + +Operation not supported by device. +设备不支持此操作. + +Cannot resolve symbolic link %x. +无法解决符号连接 %x. + +Unable to move %x to the recycle bin. +无法将 %x 移动到回收站. + +Authentication completed. +验证完成. + +You may close this page now and continue with FreeFileSync. +你可以现在关闭本页面并继续使用 FreeFileSync. + +Authentication failed. +验证失败. + +Unable to connect to %x. +无法连接到 %x. + +Cannot find %x. +无法找到 %x. + +The name %x is used by more than one item in the folder. +%x 此名称在文件夹中被一个以上的项目所使用. + +Please authorize access to user account %x. +请为用户账户 %x 授权访问. + +Cannot open file %x. +无法打开文件 %x. + +The name %x is already used by another item. +名称 %x 已被其他项目使用. + +Cannot determine free disk space for %x. +无法确定 %x 上的可用磁盘空间. + +Unable to disconnect from %x. +无法从 %x 断开连接. + +Unable to access %x. +无法访问 %x. + +Failed to get information about server %x. +获取关于服务器 %x 的信息时失败. + +Cannot monitor directory %x. +无法监视目录 %x. + +Cannot find device %x. +无法找到设备 %x. + +Cannot open directory %x. +无法打开目录 %x. + +Unsupported item type. +不支持的项目类型. + +Incorrect command line: +不正确的命令行: + +The server does not support authentication via %x. +此服务器并不支持通过 %x 进行认证. + +Required: +必需: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +%x 秒后操作超时. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +一次无法等待多于 %x 个的连接. + + +Active connections: %x +活动的连接: %x + +Failed to open SFTP channel number %x. +打开SFTP通道号 %x 时失败. + Both sides have changed since last synchronization. 在最后的同步之后两边均已改变. @@ -109,9 +256,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. 安装文件已损坏, 请重新安装FreeFileSync. -Cannot load file %x. -不能载入文件 %x. - Cannot find the following folders: 无法找到如下文件夹: @@ -138,6 +282,9 @@ 找到 %x 个项目 +Time elapsed: +已用时间: + File %x has an invalid date. 文件 %x 的日期非法. @@ -156,9 +303,6 @@ Items differ in attributes only 项目仅是文件属性不同 -The name %x is used by more than one item in the folder. -%x 此名称在文件夹中被一个以上的项目所使用. - Resolving symbolic link %x 正在解决符号连接 %x @@ -219,6 +363,15 @@ Out of memory. 内存不足. +Show in Explorer +在Explorer中显示 + +Open with default application +用默认应用软件打开 + +Browse directory +浏览目录 + Database file %x is incompatible. 数据库文件 %x 不兼容. @@ -231,12 +384,6 @@ Database file is corrupted: 数据库文件已损坏: -Cannot write file %x. -无法写入文件 %x. - -Cannot read file %x. -无法读取文件 %x. - The database files do not yet contain information about the last synchronization. 此数据库文件并未包含 有关最后同步的信息. @@ -255,9 +402,6 @@ Cannot get process information. 无法取得进程信息. -Cannot read file attributes of %x. -无法读取 %x 的文件属性. - Waiting while directory is locked: 正在等待因目录被锁定: @@ -382,27 +526,12 @@ %x 线程 -Cannot read directory %x. -无法读取目录 %x. - %x/sec %x/秒 %x items %x 个项目 -Show in Explorer -在Explorer中显示 - -Open with default application -用默认应用软件打开 - -Browse directory -浏览目录 - -Unable to connect to %x. -无法连接到 %x. - Completed successfully 成功完成 @@ -448,9 +577,6 @@ Cannot write file attributes of %x. 无法写入 %x 的文件属性. -Cannot open file %x. -无法打开文件 %x. - %x and %y have different content. %x 和 %y 有着不同的内容. @@ -481,29 +607,20 @@ Source item %x not found 来源项目 %x 未找到 -Cannot move file %x to %y. -无法移动文件 %x 到 %y. - Parent folder %x is not existing. 上级文件夹 %x 不存在. -The name %x is already used by another item. -名称 %x 已被其他项目使用. - Cannot copy file %x to %y. 无法复制文件 %x 到 %y. -Cannot copy symbolic link %x to %y. -无法复制符号连接 %x 到 %y. - Creating a Volume Shadow Copy for %x... 正在为 %x 创建一个卷影副本... Cannot find folder %x. 无法找到文件夹 %x. -Target folder %x already existing. -目标文件夹 %x 已经存在. +Target folder %x is already existing, but was not available during folder comparison. +目标文件夹 %x 已经存在, 但比较期间不可用. Target folder input field must not be empty. 目标文件夹输入框必须不为空. @@ -526,17 +643,14 @@ Not enough free disk space available in: 没有足够的可用磁盘空间: -Required: -必需: - Available: 可用: Some files will be synchronized as part of multiple base folders. 某些文件将作为多个基础文件夹 的一部分被同步. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -为了避免冲突, 请设置排除过滤器, 以便每个已更新的文件 仅被一个基础文件夹所考虑. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +为避免冲突, 请设置排除过滤器, 以便每个已更新的文件只被一个基础文件夹所包含. Versioning folder: 历史版本文件夹: @@ -562,120 +676,6 @@ Unable to create time stamp for versioning: 无法为历史版本创建时间戳: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -意外大小的数据流. -预期: %x 字节 -实际: %y 字节 - - -Cannot write permissions of %x. -无法写入 %x 的权限. - -Operation not supported between different devices. -不同设备之间不支持此操作. - -Cannot delete file %x. -无法删除文件 %x. - -Cannot delete symbolic link %x. -无法删除符号链接 %x. - -Cannot delete directory %x. -无法删除目录 %x. - -Error Code %x -错误代码 %x - -Cannot write modification time of %x. -无法写入 %x 的最后修改时间. - -Cannot create directory %x. -无法创建目录 %x. - -Cannot determine final path for %x. -无法确定 %x 的最终路径. - -Operation not supported by device. -设备不支持此操作. - -Cannot resolve symbolic link %x. -无法解决符号连接 %x. - -Unable to move %x to the recycle bin. -无法将 %x 移动到回收站. - -Authentication completed. -验证完成. - -You may close this page now and continue with FreeFileSync. -你可以现在关闭本页面并继续使用 FreeFileSync. - -Authentication failed. -验证失败. - -Cannot find %x. -无法找到 %x. - -Please authorize access to user account %x. -请为用户账户 %x 授权访问. - -Cannot determine free disk space for %x. -无法确定 %x 上的可用磁盘空间. - -Unable to disconnect from %x. -无法从 %x 断开连接. - -Unable to access %x. -无法访问 %x. - -Failed to get information about server %x. -获取关于服务器 %x 的信息时失败. - -Cannot monitor directory %x. -无法监视目录 %x. - -Cannot find device %x. -无法找到设备 %x. - -Cannot open directory %x. -无法打开目录 %x. - -Unsupported item type. -不支持的项目类型. - -Incorrect command line: -不正确的命令行: - -The server does not support authentication via %x. -此服务器并不支持通过 %x 进行认证. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -%x 秒后操作超时. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -一次无法等待多于 %x 个的连接. - - -Active connections: %x -活动的连接: %x - -Failed to open SFTP channel number %x. -打开SFTP通道号 %x 时失败. - Drag && drop 拖放 @@ -742,6 +742,9 @@ Actual: %y bytes Command line: 命令行: +&Hide console window +隐藏控制台窗口(&H) + The command is triggered if: - files or subfolders change @@ -777,8 +780,8 @@ The command is triggered if: Waiting until directory is available: 等待直到目录可用: -&Restore -恢复(&R) +&Configure +配置(&C) &Show error message 显示错误信息(&S) @@ -812,8 +815,8 @@ The command is triggered if: Scanning... 正扫描... -job name -作业名称 +configuration file +配置文件 System: Sleep 系统: 休眠 @@ -824,8 +827,8 @@ The command is triggered if: Nothing to synchronize 没有什么可同步 -Executing command %x -正在执行命令 %x +Executing command: +执行命令: You can switch to FreeFileSync's main window to resolve this issue. 你可以切换至 FreeFileSync 的主窗口来解决这个问题. @@ -1024,6 +1027,12 @@ The command is triggered if: Match case 匹配大小写 +Processed: +已处理: + +Remaining: +剩余: + New 新建 @@ -1260,14 +1269,17 @@ The command is triggered if: &Don't show this dialog again 不要再显示这个对话框(&D) -Items found: -已找到的项目: +Bytes: +字节: -Time remaining: -剩余时间: +Items: +项目: -Time elapsed: -已用时间: +Synchronizing... +同步中... + +Minimize to notification area +最小化到系统托盘 Bytes 字节 @@ -1275,12 +1287,6 @@ The command is triggered if: Items 项目 -Synchronizing... -同步中... - -Minimize to notification area -最小化到系统托盘 - When finished: 当完成时: @@ -1353,6 +1359,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: 在 x 天后删除日志(&D): +Notification sounds: +通知声音: + +Synchronization finished: +同步完成: + Customize context menu: 自定义右键菜单: @@ -1553,12 +1565,6 @@ This guarantees a consistent state even in case of a serious error. &Delete 删除(&D) -Include all -包括所有 - -Exclude all -排除所有 - Show icons: 显示图标: @@ -1595,6 +1601,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save 不保存(&N) +%x cannot be renamed. +%x 无法被重命名. + +New name: +新文件名: + +Rename Configuration +重命名配置 + +Configuration name must not be empty. +配置名称必须不为空. + +&Rename... +重命名(&R)... + Hide configuration 隐藏配置文件 @@ -1706,8 +1727,8 @@ This guarantees a consistent state even in case of a serious error. Password: 密码: -Key password: -密钥密码: +Key passphrase: +密钥口令短语: Please enter a file path. 请输入一个文件路径. @@ -1868,6 +1889,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. 最小版本计数必须小于最大计数. +&Restore +恢复(&R) + Files 文件 @@ -1934,6 +1958,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: 此文件被另一进程锁定: +Failed to determine file permission support for folder %x. +无法确定文件夹 %x 所支持的权限. + Cannot read security context of %x. 无法读取 %x 的安全上下文. @@ -1983,12 +2010,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. 无法更改进程的I/O优先级. -Unable to shut down the system. -无法关闭系统. - Checking recycle bin failed for folder %x. 检查文件夹 %x 的回收站失败. +Unable to shut down the system. +无法关闭系统. + Prepare installation 准备安装 diff --git a/FreeFileSync/Build/Resources/Languages/chinese_traditional.lng b/FreeFileSync/Build/Resources/Languages/chinese_traditional.lng index 95c942d2..901500b9 100755 --- a/FreeFileSync/Build/Resources/Languages/chinese_traditional.lng +++ b/FreeFileSync/Build/Resources/Languages/chinese_traditional.lng @@ -7,6 +7,153 @@ 0 +Cannot read file %x. +無法讀取檔案 %x。 + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +非預期的資料流大小。 +預期:%x 位元組 +實際:%y 位元組 + + +Cannot write file %x. +無法寫入檔案 %x。 + +Cannot write permissions of %x. +無法寫入 %x 的權限。 + +Operation not supported between different devices. +不支援不同裝置間的操作。 + +Cannot delete file %x. +無法刪除目錄 %x。 + +Cannot delete symbolic link %x. +無法刪除符號連結 %x。 + +Cannot delete directory %x. +無法刪除目錄 %x。 + +Cannot move file %x to %y. +無法移動檔案 %x 到 %y。 + +Cannot copy symbolic link %x to %y. +無法複製符號連結 %x 到 %y。 + +Error Code %x +錯誤碼 %x + +Cannot read directory %x. +無法讀取目錄 %x。 + +Cannot write modification time of %x. +無法寫入 %x 的修改時間。 + +Cannot read file attributes of %x. +無法讀取 %x 的檔案屬性。 + +Cannot create directory %x. +無法建立目錄 %x。 + +Cannot determine final path for %x. +無法確定 %x 最後路徑。 + +Operation not supported by device. +不支援該裝置的操作。 + +Cannot resolve symbolic link %x. +無法解析符號連結 %x。 + +Unable to move %x to the recycle bin. +無法將 %x 移動到資源回收筒。 + +Authentication completed. +驗證完成。 + +You may close this page now and continue with FreeFileSync. +您可以立即關閉此頁面並繼續使用FreeFileSync。 + +Authentication failed. +驗證失敗。 + +Unable to connect to %x. +無法連接到 %x。 + +Cannot find %x. +找不到 %x。 + +The name %x is used by more than one item in the folder. +名稱 %x 已被資料夾中的多個項目使用。 + +Please authorize access to user account %x. +請授權存取使用者帳號 %x。 + +Cannot open file %x. +無法開啟檔案 %x。 + +The name %x is already used by another item. +名稱 %x 已被另一個項目使用。 + +Cannot determine free disk space for %x. +無法確定 %x 的可用磁碟空間。 + +Unable to disconnect from %x. +無法中斷 %x 的連線。 + +Unable to access %x. +無法存取 %x。 + +Failed to get information about server %x. +無法取得關於伺服器 %x 的資訊。 + +Cannot monitor directory %x. +無法監測目錄 %x。 + +Cannot find device %x. +找不到裝置 %x。 + +Cannot open directory %x. +無法開啟目錄 %x。 + +Unsupported item type. +不支援的項目類型。 + +Incorrect command line: +不正確的命令列: + +The server does not support authentication via %x. +伺服器不支援 %x 進行驗證。 + +Required: +必要: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +在 %x 秒後操作逾時。 + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +無法一次等待超過 %x 個連線數。 + + +Active connections: %x +活動連線數:%x + +Failed to open SFTP channel number %x. +無法開啟SFTP通道號 %x。 + Both sides have changed since last synchronization. 自上次同步後,兩邊均已變更過。 @@ -77,7 +224,7 @@ 目錄透過命令列設定時,該設定檔不能包含配對目錄層級的設定。 Directories cannot be set for more than one configuration file. -目錄無法設定多個配置檔。 +目錄無法設定多個配置檔案。 Command line 命令列 @@ -109,9 +256,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. 安裝檔已損壞。請重新安裝FreeFileSync。 -Cannot load file %x. -無法載入檔案 %x。 - Cannot find the following folders: 找不到下列資料夾: @@ -122,7 +266,7 @@ 這些資料夾是在需要時自動建立的。 The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses. -以下資料夾路徑大小寫不同。請使用單一形式,避免重複存取。 +下列資料夾路徑大小寫不同。請使用單一形式,避免重複存取。 Scanning: 正在掃瞄: @@ -138,6 +282,9 @@ 找到 %x 個項目。 +Time elapsed: +經過時間: + File %x has an invalid date. 檔案 %x 的日期無效。 @@ -156,9 +303,6 @@ Items differ in attributes only 只有項目的屬性不同 -The name %x is used by more than one item in the folder. -名稱 %x 已被資料夾中的多個項目使用。 - Resolving symbolic link %x 正在解析符號連結 %x @@ -175,7 +319,7 @@ 啟用 Disabled -禁用 +停用 Copy locked files 複製被鎖定的檔案 @@ -202,7 +346,7 @@ 資料夾輸入欄位是空白。 The corresponding folder will be considered as empty. -對應的資料夾將視為空的。 +對應的資料夾將視為空資料夾。 Exclude: 排除: @@ -219,6 +363,15 @@ Out of memory. 記憶體不足。 +Show in Explorer +在檔案總管中顯示 + +Open with default application +使用預設的應用程式開啟 + +Browse directory +瀏覽目錄 + Database file %x is incompatible. 資料庫檔案 %x 不相容。 @@ -231,14 +384,8 @@ Database file is corrupted: 資料庫檔案已損壞: -Cannot write file %x. -無法寫入檔案 %x。 - -Cannot read file %x. -無法讀取檔案 %x。 - The database files do not yet contain information about the last synchronization. -資料庫檔案尚未包含關於上次同步資訊。 +資料庫檔案未包含上次同步資訊。 Loading file %x... 正在讀取檔案 %x… @@ -255,9 +402,6 @@ Cannot get process information. 無法取得處理訊息。 -Cannot read file attributes of %x. -無法讀取 %x 的檔案屬性。 - Waiting while directory is locked: 等待目錄被鎖定: @@ -309,10 +453,10 @@ 刪除右邊項目 Move file on left -移動左邊的檔案 +移動左邊檔案 Move file on right -移動右邊的檔案 +移動右邊檔案 Update left item 更新左邊項目 @@ -324,10 +468,31 @@ 維持原狀 Update attributes on left -更新左邊的屬性 +更新左邊屬性 Update attributes on right -更新右邊的屬性 +更新右邊屬性 + +Error parsing file %x, row %y, column %z. +解析 %x 檔案,第 %y 列,第 %z 行出現錯誤。 + +Services +服務 + +Show All +顯示全部 + +Hide Others +隱藏其他 + +Hide %x +隱藏 %x + +Quit %x +結束 %x + +Cannot set directory locks for the following folders: +無法為以下資料夾設定目錄鎖定: Errors: 錯誤: @@ -353,27 +518,6 @@ Cleaning up log files: 清除紀錄檔: -Error parsing file %x, row %y, column %z. -解析 %x 檔案,第 %y 列,第 %z 行出現錯誤。 - -Services -服務 - -Show All -顯示全部 - -Hide Others -隱藏其他 - -Hide %x -隱藏 %x - -Quit %x -結束 %x - -Cannot set directory locks for the following folders: -無法為以下資料夾設定目錄鎖定: - 1 thread %x threads @@ -382,27 +526,12 @@ %x 個執行緒 -Cannot read directory %x. -無法讀取目錄 %x。 - %x/sec %x/秒 %x items %x 項目 -Show in Explorer -在資源管理器中顯示 - -Open with default application -使用預設的應用程式開啟 - -Browse directory -瀏覽目錄 - -Unable to connect to %x. -無法連接到 %x。 - Completed successfully 成功完成 @@ -448,9 +577,6 @@ Cannot write file attributes of %x. 無法寫入 %x 的檔案屬性。 -Cannot open file %x. -無法開啟檔案 %x。 - %x and %y have different content. %x 和 %y 具有不同的內容。 @@ -481,29 +607,20 @@ Source item %x not found 找不到來源項目 %x -Cannot move file %x to %y. -無法移動檔案 %x 到 %y。 - Parent folder %x is not existing. 上層資料夾 %x 不存在。 -The name %x is already used by another item. -名稱 %x 已被另一個項目使用。 - Cannot copy file %x to %y. 無法複製檔案 %x 到 %y。 -Cannot copy symbolic link %x to %y. -無法複製符號連結 %x 到 %y。 - Creating a Volume Shadow Copy for %x... 正在建立磁碟區陰影複製為 %x… Cannot find folder %x. 找不到資料夾 %x。 -Target folder %x already existing. -目標資料夾 %x 已存在。 +Target folder %x is already existing, but was not available during folder comparison. +目標資料夾 %x 已存在,在資料夾比對時不可用。 Target folder input field must not be empty. 目標資料夾輸入欄位不能為空白。 @@ -526,17 +643,14 @@ Not enough free disk space available in: 沒有足夠的可用磁碟空間: -Required: -必要: - Available: 可用: Some files will be synchronized as part of multiple base folders. 某些檔案將作為多個底層資料夾的一部分進行同步。 -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -為了避免衝突,設定排除過濾器,以便每個更新過的檔案被視為只有一個底層資料夾。 +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +為了避免衝突,請設定排除篩選器,以便每個更新檔案僅包含一個底層資料夾。 Versioning folder: 版本控制資料夾: @@ -562,120 +676,6 @@ Unable to create time stamp for versioning: 無法建立時間戳記的版本控制: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -非預期的資料流大小。 -預期:%x 位元組 -實際:%y 位元組 - - -Cannot write permissions of %x. -無法寫入 %x 的權限。 - -Operation not supported between different devices. -不支援不同裝置間的操作。 - -Cannot delete file %x. -無法刪除目錄 %x。 - -Cannot delete symbolic link %x. -無法刪除符號連結 %x。 - -Cannot delete directory %x. -無法刪除目錄 %x。 - -Error Code %x -錯誤代碼 %x - -Cannot write modification time of %x. -無法寫入 %x 的修改時間。 - -Cannot create directory %x. -無法建立目錄 %x。 - -Cannot determine final path for %x. -無法確定 %x 最後路徑。 - -Operation not supported by device. -不支援該裝置的操作。 - -Cannot resolve symbolic link %x. -無法解析符號連結 %x。 - -Unable to move %x to the recycle bin. -無法將 %x 移動到資源回收筒。 - -Authentication completed. -認證完成。 - -You may close this page now and continue with FreeFileSync. -您可以立即關閉此頁面並繼續使用FreeFileSync。 - -Authentication failed. -認證失敗。 - -Cannot find %x. -找不到 %x。 - -Please authorize access to user account %x. -請授權存取使用者帳號 %x。 - -Cannot determine free disk space for %x. -無法確定 %x 的可用磁碟空間。 - -Unable to disconnect from %x. -無法中斷 %x 的連線。 - -Unable to access %x. -無法存取 %x。 - -Failed to get information about server %x. -無法取得關於伺服器 %x 的資訊。 - -Cannot monitor directory %x. -無法監測目錄 %x。 - -Cannot find device %x. -找不到裝置 %x。 - -Cannot open directory %x. -無法開啟目錄 %x。 - -Unsupported item type. -不支援的項類型。 - -Incorrect command line: -不正確的命令列: - -The server does not support authentication via %x. -伺服器不支援 %x 進行認證。 - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -在 %x 秒後操作逾時。 - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -無法一次等待超過 %x 個連線數。 - - -Active connections: %x -活動連線數:%x - -Failed to open SFTP channel number %x. -無法開啟SFTP通道號 %x。 - Drag && drop 拖放 @@ -742,6 +742,9 @@ Actual: %y bytes Command line: 命令列: +&Hide console window +隱藏主控台視窗(&H) + The command is triggered if: - files or subfolders change @@ -777,8 +780,8 @@ The command is triggered if: Waiting until directory is available: 正在等待可用目錄: -&Restore -還原(&R) +&Configure +配置(&C) &Show error message 顯示錯誤訊息(&S) @@ -812,8 +815,8 @@ The command is triggered if: Scanning... 正在掃瞄… -job name -工作名稱 +configuration file +配置檔案 System: Sleep 系統:睡眠 @@ -824,8 +827,8 @@ The command is triggered if: Nothing to synchronize 沒有要同步的內容 -Executing command %x -執行命令 %x +Executing command: +執行命令: You can switch to FreeFileSync's main window to resolve this issue. 您可以切換到FreeFileSync的主視窗來解決此問題。 @@ -1024,6 +1027,12 @@ The command is triggered if: Match case 區分大小寫 +Processed: +已處理: + +Remaining: +剩餘: + New 新增 @@ -1192,7 +1201,7 @@ The command is triggered if: 連線類型: Connected user accounts: -連線的使用者帳號: +已連線的使用者帳號: &Add connection 新增連線(&A) @@ -1213,13 +1222,13 @@ The command is triggered if: 加密: &Disabled -已禁用(&D) +停用(&D) &Explicit SSL/TLS 外顯式SSL/TLS(&E) Authentication: -認證: +驗證: &Password 密碼(&P): @@ -1260,14 +1269,17 @@ The command is triggered if: &Don't show this dialog again 不再顯示此對話框(&D) -Items found: -找到的項目: +Bytes: +位元組: -Time remaining: -剩餘時間: +Items: +項目: -Time elapsed: -經過時間: +Synchronizing... +正在同步… + +Minimize to notification area +最小化到通知區域 Bytes 位元組 @@ -1275,12 +1287,6 @@ The command is triggered if: Items 項目 -Synchronizing... -正在同步… - -Minimize to notification area -最小化到通知區域 - When finished: 完成後: @@ -1342,7 +1348,7 @@ This guarantees a consistent state even in case of a serious error. 共用的副本或鎖定的檔案使用磁碟區陰影複製服務。 requires administrator rights -需要管理員權限 +需要系統管理員權限 Transfer file and folder permissions. 傳輸檔案和資料夾的權限。 @@ -1356,8 +1362,14 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: 在 x 天後刪除紀錄(&D): +Notification sounds: +通知音效: + +Synchronization finished: +同步完成: + Customize context menu: -自訂內容功能表: +自訂右鍵功能表: Description 描述 @@ -1384,7 +1396,7 @@ This guarantees a consistent state even in case of a serious error. 贊助與支持 The auto updater was disabled by the administrator. -自動更新程式已被管理員禁用。 +自動更新程式被系統管理員停用。 Donation details 贊助詳情 @@ -1459,7 +1471,7 @@ This guarantees a consistent state even in case of a serious error. 選項(&O) Main Bar -主欄位 +主要欄位 Folder Pairs 配對資料夾 @@ -1505,30 +1517,6 @@ This guarantees a consistent state even in case of a serious error. &Execute 執行(&E) - -1 directory -%x directories - - -%x 個目錄 - - - -1 file -%x files - - -%x 個檔案 - - - -Showing %y of 1 row -Showing %y of %x rows - - -顯示第 %x 列中的第 %y 列 - - Set direction: 設定方向: @@ -1556,12 +1544,6 @@ This guarantees a consistent state even in case of a serious error. &Delete 刪除(&D) -Include all -包含所有 - -Exclude all -排除所有 - Show icons: 顯示圖示: @@ -1598,6 +1580,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save 不儲存(&N) +%x cannot be renamed. +%x 無法重新命名。 + +New name: +新名稱: + +Rename Configuration +重新命名配置名稱 + +Configuration name must not be empty. +配置名稱不能空白。 + +&Rename... +重新命名(&R)… + Hide configuration 隱藏配置 @@ -1620,10 +1617,10 @@ This guarantees a consistent state even in case of a serious error. 顯示右邊較新的檔案 Show files that are equal -顯示相同的檔案 +顯示相同檔案 Show files that are different -顯示不同的檔案 +顯示不同檔案 Show conflicts 顯示衝突 @@ -1658,6 +1655,30 @@ This guarantees a consistent state even in case of a serious error. All files are in sync 所有檔案都同步 + +1 directory +%x directories + + +%x 個目錄 + + + +1 file +%x files + + +%x 個檔案 + + + +Showing %y of 1 row +Showing %y of %x rows + + +顯示第 %x 列中的第 %y 列 + + Cannot find %x 找不到 %x @@ -1709,7 +1730,7 @@ This guarantees a consistent state even in case of a serious error. Password: 密碼: -Key password: +Key passphrase: 金鑰密碼: Please enter a file path. @@ -1755,7 +1776,7 @@ This guarantees a consistent state even in case of a serious error. 複製DACL、SACL、擁有者、群組 Integrate external applications into context menu. The following macros are available: -整合內容功能表中的外部應用程式。可使用下列的巨集: +整合右鍵功能表中的外部應用程式。可使用下列的巨集: Full file or folder path 完整檔案或資料夾路徑 @@ -1871,6 +1892,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. 最小版本總數必須小於最大總數。 +&Restore +還原(&R) + Files 檔案 @@ -1937,6 +1961,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: 檔案被另一個處理程序鎖定: +Failed to determine file permission support for folder %x. +無法確定資料夾 %x 的檔案權限。 + Cannot read security context of %x. 無法讀取 %x 的安全內容。 @@ -1986,17 +2013,17 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. 無法更改I/O處理優先順序。 -Unable to shut down the system. -無法關閉系統。 - Checking recycle bin failed for folder %x. 檢查資源回收筒的資料夾 %x 失敗。 +Unable to shut down the system. +無法關閉系統。 + Prepare installation 準備安裝 Choose which components you want to install. -選擇您想要安裝哪些元件。 +選擇您要安裝的元件。 Select installation type: 選擇安裝類型: @@ -2014,7 +2041,7 @@ This guarantees a consistent state even in case of a serious error. 註冊FreeFileSync檔案關聯 Create Explorer context menu entries -建立資源管理器右鍵選單項目 +建立檔案總管右鍵功能表 Save settings in installation directory 儲存設定到安裝目錄 diff --git a/FreeFileSync/Build/Resources/Languages/croatian.lng b/FreeFileSync/Build/Resources/Languages/croatian.lng index 09495a23..1acf95e3 100755 --- a/FreeFileSync/Build/Resources/Languages/croatian.lng +++ b/FreeFileSync/Build/Resources/Languages/croatian.lng @@ -7,6 +7,157 @@ n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2 +Cannot read file %x. +Ne mogu čitati datoteku %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Neočekivana veličina podataka. +Očekivano: %x bajta +Stvarno: %y bajta + + +Cannot write file %x. +Ne mogu zapisati datoteku %x. + +Cannot write permissions of %x. +Ne mogu zapisati dopuštenja za %x. + +Operation not supported between different devices. +Zadatak nije podržan između različitih uređaja. + +Cannot delete file %x. +Ne mogu izbrisati datoteku %x. + +Cannot delete symbolic link %x. +Nije moguće brisanje simbolične poveznice %x. + +Cannot delete directory %x. +Ne mogu izbrisati mapu %x. + +Cannot move file %x to %y. +Ne mogu premjestiti datoteku %x u %y. + +Cannot copy symbolic link %x to %y. +Ne može se kopirati simbolična poveznica %x prema %y. + +Error Code %x +Kod greške %x. + +Cannot read directory %x. +Nije moguće učitati mapu %x. + +Cannot write modification time of %x. +Ne mogu zapisati vrijeme izmjene %x. + +Cannot read file attributes of %x. +Ne mogu pročitati osobine od %x. + +Cannot create directory %x. +Ne mogu izraditi mapu %x. + +Cannot determine final path for %x. +Ne mogu odrediti završnu putanju za %x. + +Operation not supported by device. +Zadatak nije podržan od uređaja. + +Cannot resolve symbolic link %x. +Ne mogu odrediti simboličnu poveznicu %x. + +Unable to move %x to the recycle bin. +Nije moguće premjestiti %x u koš za smeće. + +Authentication completed. +Provjera autentičnosti dovršena. + +You may close this page now and continue with FreeFileSync. +Sada možete zatvoriti ovu stranicu i nastaviti sa FreeFileSync. + +Authentication failed. +Provjera autentičnosti nije uspjela. + +Unable to connect to %x. +Nije moguće povezivanje na %x. + +Cannot find %x. +Nije moguće pronaći %x. + +The name %x is used by more than one item in the folder. +Naziv %x se koristi za više od jedne stavke u mapi. + +Please authorize access to user account %x. +Molimo odobrite pristup korisničkom računu %x. + +Cannot open file %x. +Ne mogu otvoriti datoteku %x. + +The name %x is already used by another item. +Naziv %x se već koristi u drugoj datoteci. + +Cannot determine free disk space for %x. +Nije moguće izračunati slobodan prostor diska za %x. + +Unable to disconnect from %x. +Nije moguće prekinuti vezu s %x. + +Unable to access %x. +Nije moguće pristupiti %x. + +Failed to get information about server %x. +Nije moguće pristupiti informacijama servera %x. + +Cannot monitor directory %x. +Ne mogu nadzirati direktorij %x. + +Cannot find device %x. +Nije moguće pronaći uređaj %x. + +Cannot open directory %x. +Ne mogu otvoriti mapu %x. + +Unsupported item type. +Nepodržan tip datoteke. + +Incorrect command line: +Netočna naredbena linija: + +The server does not support authentication via %x. +Server ne podržava provjeru autentičnosti preko %x. + +Required: +Potrebno: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Vrijeme za operaciju je isteklo nakon %x sekundu. +Vrijeme za operaciju je isteklo nakon %x sekundi. +Vrijeme za operaciju je isteklo nakon %x sekundi. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Ne može se čekati na više od %x konekcije istovremeno. +Ne može se čekati na više od %x konekcija istovremeno. +Ne može se čekati na više od %x konekcija istovremeno. + + +Active connections: %x +Aktivne konekcije: %x + +Failed to open SFTP channel number %x. +Nije uspjelo povezivanje na SFTP kanal broj %x. + Both sides have changed since last synchronization. Obje strane su promjenjene nakon zadnje sinkronizacije. @@ -109,9 +260,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Instalacijske datoteke su oštećene. Molimo ponovno instalirajte FreeFileSync. -Cannot load file %x. -Ne mogu učitati datoteku %x. - Cannot find the following folders: Ne mogu pronaći slijedeće mape: @@ -140,6 +288,9 @@ %x stavki pronađeno +Time elapsed: +Proteklo vremena: + File %x has an invalid date. Datoteka %x ima nevažeći datum. @@ -158,9 +309,6 @@ Items differ in attributes only Stavke se razlikuju samo u atributima -The name %x is used by more than one item in the folder. -Naziv %x se koristi za više od jedne stavke u mapi. - Resolving symbolic link %x Rješavam simboličku vezu %x @@ -221,6 +369,15 @@ Out of memory. Nedostatak memorije. +Show in Explorer +Prikaži u Exploreru + +Open with default application +Otvori s zadanom aplikacijom + +Browse directory +Odaberi direktorij + Database file %x is incompatible. Datoteka baze %x je nekompatibilna. @@ -233,12 +390,6 @@ Database file is corrupted: Datoteka baze je oštećena: -Cannot write file %x. -Ne mogu zapisati datoteku %x. - -Cannot read file %x. -Ne mogu čitati datoteku %x. - The database files do not yet contain information about the last synchronization. Datoteke baze još uvijek ne sadrže informacije o zadnjoj sinkronizaciji. @@ -257,9 +408,6 @@ Cannot get process information. Ne mogu dobit informacije o procesu. -Cannot read file attributes of %x. -Ne mogu pročitati osobine od %x. - Waiting while directory is locked: Čekam dok se mapa zaključa: @@ -333,6 +481,27 @@ Update attributes on right Osvježi atribute desno +Error parsing file %x, row %y, column %z. +Greška u analizi datoteke %x, red %y, stupac %z. + +Services +Servisi + +Show All +Prikaži sve + +Hide Others +Sakrij ostale + +Hide %x +Sakrij %x + +Quit %x +Napusti %x + +Cannot set directory locks for the following folders: +Nije moguće zaključavanje slijedećih foldera: + Errors: Pogreške: @@ -357,27 +526,6 @@ Cleaning up log files: Brisanje log datoteka: -Error parsing file %x, row %y, column %z. -Greška u analizi datoteke %x, red %y, stupac %z. - -Services -Servisi - -Show All -Prikaži sve - -Hide Others -Sakrij ostale - -Hide %x -Sakrij %x - -Quit %x -Napusti %x - -Cannot set directory locks for the following folders: -Nije moguće zaključavanje slijedećih foldera: - 1 thread %x threads @@ -388,27 +536,12 @@ %x niti -Cannot read directory %x. -Nije moguće učitati mapu %x. - %x/sec %x/sek %x items %x stavki -Show in Explorer -Prikaži u Exploreru - -Open with default application -Otvori s zadanom aplikacijom - -Browse directory -Odaberi direktorij - -Unable to connect to %x. -Nije moguće povezivanje na %x. - Completed successfully Dovršeno uspješno @@ -454,9 +587,6 @@ Cannot write file attributes of %x. Ne mogu zapisati svojstva od %x. -Cannot open file %x. -Ne mogu otvoriti datoteku %x. - %x and %y have different content. %x. i %y imaju različit sadržaj. @@ -487,29 +617,20 @@ Source item %x not found Izvorna datoteka %x nije pronađena -Cannot move file %x to %y. -Ne mogu premjestiti datoteku %x u %y. - Parent folder %x is not existing. Glavna mapa %x ne postoji. -The name %x is already used by another item. -Naziv %x se već koristi u drugoj datoteci. - Cannot copy file %x to %y. Ne mogu kopirati datoteku %x na %y. -Cannot copy symbolic link %x to %y. -Ne može se kopirati simbolična poveznica %x prema %y. - Creating a Volume Shadow Copy for %x... Kreiranje Volume Shadow Copy za %x... Cannot find folder %x. Ne mogu pronaći mapu %x. -Target folder %x already existing. -Odredišna mapa %x već postoji. +Target folder %x is already existing, but was not available during folder comparison. +Ciljna mapa %x već postoji, ali nije bila dostupna prilikom usporedbe mapa. Target folder input field must not be empty. Odredišna mapa ne može biti prazna. @@ -532,17 +653,14 @@ Not enough free disk space available in: Nedovoljno prostora na disku: -Required: -Potrebno: - Available: Dostupno: Some files will be synchronized as part of multiple base folders. Neke datoteke će biti sinkronizirane kao dio više baznih mapa. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Da bi izbjegli konflikt, postavite filtere za izdvajanje tako da se svaka ažurirana datoteka uzima u obzir samo kod jedne bazne mape. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Da biste izbjegli sukobe, postavite filtere za izuzeće tako da svaka ažurirana datoteka bude sadržana u samo jednoj baznoj mapi. Versioning folder: Verzija mape: @@ -568,124 +686,6 @@ Unable to create time stamp for versioning: Nije moguća izrada vremenske oznake za označavanje: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Neočekivana veličina podataka. -Očekivano: %x bajta -Stvarno: %y bajta - - -Cannot write permissions of %x. -Ne mogu zapisati dopuštenja za %x. - -Operation not supported between different devices. -Zadatak nije podržan između različitih uređaja. - -Cannot delete file %x. -Ne mogu izbrisati datoteku %x. - -Cannot delete symbolic link %x. -Nije moguće brisanje simbolične poveznice %x. - -Cannot delete directory %x. -Ne mogu izbrisati mapu %x. - -Error Code %x -Kod greške %x. - -Cannot write modification time of %x. -Ne mogu zapisati vrijeme izmjene %x. - -Cannot create directory %x. -Ne mogu izraditi mapu %x. - -Cannot determine final path for %x. -Ne mogu odrediti završnu putanju za %x. - -Operation not supported by device. -Zadatak nije podržan od uređaja. - -Cannot resolve symbolic link %x. -Ne mogu odrediti simboličnu poveznicu %x. - -Unable to move %x to the recycle bin. -Nije moguće premjestiti %x u koš za smeće. - -Authentication completed. -Provjera autentičnosti dovršena. - -You may close this page now and continue with FreeFileSync. -Sada možete zatvoriti ovu stranicu i nastaviti sa FreeFileSync. - -Authentication failed. -Provjera autentičnosti nije uspjela. - -Cannot find %x. -Nije moguće pronaći %x. - -Please authorize access to user account %x. -Molimo odobrite pristup korisničkom računu %x. - -Cannot determine free disk space for %x. -Nije moguće izračunati slobodan prostor diska za %x. - -Unable to disconnect from %x. -Nije moguće prekinuti vezu s %x. - -Unable to access %x. -Nije moguće pristupiti %x. - -Failed to get information about server %x. -Nije moguće pristupiti informacijama servera %x. - -Cannot monitor directory %x. -Ne mogu nadzirati direktorij %x. - -Cannot find device %x. -Nije moguće pronaći uređaj %x. - -Cannot open directory %x. -Ne mogu otvoriti mapu %x. - -Unsupported item type. -Nepodržan tip datoteke. - -Incorrect command line: -Netočna naredbena linija: - -The server does not support authentication via %x. -Server ne podržava provjeru autentičnosti preko %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Vrijeme za operaciju je isteklo nakon %x sekundu. -Vrijeme za operaciju je isteklo nakon %x sekundi. -Vrijeme za operaciju je isteklo nakon %x sekundi. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Ne može se čekati na više od %x konekcije istovremeno. -Ne može se čekati na više od %x konekcija istovremeno. -Ne može se čekati na više od %x konekcija istovremeno. - - -Active connections: %x -Aktivne konekcije: %x - -Failed to open SFTP channel number %x. -Nije uspjelo povezivanje na SFTP kanal broj %x. - Drag && drop Povuci && ispusti @@ -752,6 +752,9 @@ Stvarno: %y bajta Command line: Naredbena linija: +&Hide console window +&Sakrij upravljački prozor + The command is triggered if: - files or subfolders change @@ -787,8 +790,8 @@ Naredba će biti pokrenuta ako se: Waiting until directory is available: Čekanje dok mapa bude dostupna: -&Restore -&Vrati +&Configure +&Postavke &Show error message &Pokaži poruke o greškama @@ -824,8 +827,8 @@ Naredba će biti pokrenuta ako se: Scanning... Tražim... -job name -Naziv zadatka +configuration file +datoteka postavki System: Sleep Sistem: Spavanje @@ -836,8 +839,8 @@ Naredba će biti pokrenuta ako se: Nothing to synchronize Ništa za sinkronizirati -Executing command %x -Izvršavanje naredbe %x +Executing command: +Naredba za izuzeće: You can switch to FreeFileSync's main window to resolve this issue. Možete prijeći na glavni prozor FreeFileSynca da bi rješili ovaj problem. @@ -1038,6 +1041,12 @@ Naredba će biti pokrenuta ako se: Match case Identičan naziv +Processed: +Odrađeno: + +Remaining: +Preostalo: + New Novo @@ -1274,14 +1283,17 @@ Naredba će biti pokrenuta ako se: &Don't show this dialog again &Nemoj više prikazivati ovaj dijaloški prozor -Items found: -Pronađene stavke: +Bytes: +Bajta: -Time remaining: -Preostalo vremena: +Items: +Stavki: -Time elapsed: -Proteklo vremena: +Synchronizing... +Sinkroniziranje... + +Minimize to notification area +Minimiziraj u područje obavjesti Bytes Bajta @@ -1289,12 +1301,6 @@ Naredba će biti pokrenuta ako se: Items Stavke -Synchronizing... -Sinkroniziranje... - -Minimize to notification area -Minimiziraj u područje obavjesti - When finished: Nakon završetka: @@ -1370,6 +1376,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. &Delete logs after x days: &Izbrisati zapisnike nakon x dana: +Notification sounds: +Zvukovi upozorenja: + +Synchronization finished: +Sinkronizacija dovršena: + Customize context menu: Prilagodite kontekstni izbornik: @@ -1521,36 +1533,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. &Execute &Izvrši - -1 directory -%x directories - - -%x direktorij -%x direktorija -%x direktorija - - - -1 file -%x files - - -%x datoteka -%x datoteke -%x datoteka - - - -Showing %y of 1 row -Showing %y of %x rows - - -Prikazano %y od %x reda -Prikazano %y od %x redova -Prikazano %y od %x redova - - Set direction: Odaberi smjer: @@ -1578,12 +1560,6 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. &Delete &Izbriši -Include all -Uključi sve - -Exclude all -Izdvoji sve - Show icons: Prikaži ikone: @@ -1620,6 +1596,21 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Do&n't save &Nemoj spremiti +%x cannot be renamed. +%x nije moguće preimenovati. + +New name: +Novi naziv: + +Rename Configuration +Postavke preimenovanja + +Configuration name must not be empty. +Naziv postavki ne može biti prazan. + +&Rename... +&Preimenovanje... + Hide configuration Sakrij postavke @@ -1680,6 +1671,36 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. All files are in sync Sve datoteke su u sinkronizaciji + +1 directory +%x directories + + +%x direktorij +%x direktorija +%x direktorija + + + +1 file +%x files + + +%x datoteka +%x datoteke +%x datoteka + + + +Showing %y of 1 row +Showing %y of %x rows + + +Prikazano %y od %x reda +Prikazano %y od %x redova +Prikazano %y od %x redova + + Cannot find %x Ne mogu pronaći %x @@ -1731,8 +1752,8 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Password: Lozinka: -Key password: -Aktivacijski ključ: +Key passphrase: +Lozinka: Please enter a file path. Molimo unesite putanju datoteke. @@ -1899,6 +1920,9 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Minimum version count must be smaller than maximum count. Broj minimalnih verzija treba biti manji od maksimalnog broja. +&Restore +&Vrati + Files Datoteke @@ -1965,6 +1989,9 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. The file is locked by another process: Datoteku koristi drugi proces: +Failed to determine file permission support for folder %x. +Neuspješno otkrivanje dopuštenja pristupa za mapu %x. + Cannot read security context of %x. Ne mogu čitati zaštićeni sadržaj %x. @@ -2018,12 +2045,12 @@ Ovo garantira stabilno stanje čak u slučaju ozbiljne greške. Cannot change process I/O priorities. Ne može se promjeniti proces I/O prioriteta. -Unable to shut down the system. -Nije moguće isključiti računalo. - Checking recycle bin failed for folder %x. Provjeravanje koša za smeće neuspješno za mapu %x. +Unable to shut down the system. +Nije moguće isključiti računalo. + Prepare installation Pripremam instalaciju diff --git a/FreeFileSync/Build/Resources/Languages/czech.lng b/FreeFileSync/Build/Resources/Languages/czech.lng index a9624a8b..006c8dc8 100755 --- a/FreeFileSync/Build/Resources/Languages/czech.lng +++ b/FreeFileSync/Build/Resources/Languages/czech.lng @@ -7,6 +7,157 @@ n==1 ? 0 : n>=2 && n<=4 ? 1 : 2 +Cannot read file %x. +Nelze číst soubor %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + ++Neočekávaná velikost dat. +Očekáváno: %x b +Aktuálně: %y b + + +Cannot write file %x. +Nelze zapsat soubor %x. + +Cannot write permissions of %x. +Nelze zapsat oprávnění pro %x. + +Operation not supported between different devices. +Operace není podporována mezi různými zařízeními. + +Cannot delete file %x. +Nelze smazat soubor %x. + +Cannot delete symbolic link %x. +Nelze smazat symbolický odkaz %x. + +Cannot delete directory %x. +Nelze smazat adresář %x. + +Cannot move file %x to %y. +Nelze přesunout soubor %x do %y. + +Cannot copy symbolic link %x to %y. +Nelze kopírovat symbolický odkaz %x do %y. + +Error Code %x +Chybový kód %x + +Cannot read directory %x. +Nelze číst adresář %x. + +Cannot write modification time of %x. +Nelze nastavit čas změny ve vlastnostech %x. + +Cannot read file attributes of %x. +Nelze číst vlastnosti souboru %x. + +Cannot create directory %x. +Nelze vytvořit adresář %x. + +Cannot determine final path for %x. +Nelze určit výslednou cestu pro %x. + +Operation not supported by device. +Operace není zařízením podporována. + +Cannot resolve symbolic link %x. +Nelze najít odkaz zástupce %x. + +Unable to move %x to the recycle bin. +Není možné přesunout %x do Koše. + +Authentication completed. +Přístup povolen. + +You may close this page now and continue with FreeFileSync. +Nyní můžete tuto stránku zavřít a pokračovat s FreeFileSync. + +Authentication failed. +Přístup odmítnut. + +Unable to connect to %x. +Nepodařilo se připojit k %x. + +Cannot find %x. +Nelze najít %x. + +The name %x is used by more than one item in the folder. +Název %x je použit více jak jednou položkou ve složce. + +Please authorize access to user account %x. +Prosím autorizujte přístup k uživatelskému účtu %x. + +Cannot open file %x. +Nelze otevřít soubor %x. + +The name %x is already used by another item. +Název %x je již používán jinou položkou. + +Cannot determine free disk space for %x. +Nelze zjistit volné místo na disku %x. + +Unable to disconnect from %x. +Nelze se odpojit od %x. + +Unable to access %x. +Nepodařil se přístup k %x. + +Failed to get information about server %x. +Nelze získat informace o serveru %x. + +Cannot monitor directory %x. +Nelze nastavit monitorování adresáře %x. + +Cannot find device %x. +Nelze nalézt zařízení %x. + +Cannot open directory %x. +Nelze otevřít adresář %x. + +Unsupported item type. +Nepodporovaný typ položky. + +Incorrect command line: +Neplatný příkaz: + +The server does not support authentication via %x. +Server nepodporuje ověření pomocí %x. + +Required: +Požadováno: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Vypršel čas 1 sekundy pro dokončení operace. +Vypršel čas %x sekund pro dokončení operace. +Vypršel čas %x sekund pro dokončení operace. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Nelze čekat na více jak 1 spojení najednou. +Nelze čekat na více jak %x spojení najednou. +Nelze čekat na více jak %x spojení najednou. + + +Active connections: %x +Aktivní spojení: %x + +Failed to open SFTP channel number %x. +Nelze otevřít SFTP kanál %x. + Both sides have changed since last synchronization. Došlo ke změně obou stran od poslední synchronizace. @@ -109,9 +260,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Instalace programu je poškozena. Prosím nainstalujte znovu FreeFileSync. -Cannot load file %x. -Nelze načíst soubor %x. - Cannot find the following folders: Nelze najít následující složky: @@ -140,6 +288,9 @@ %x položek nalezeno +Time elapsed: +Uplynulý čas: + File %x has an invalid date. Soubor %x má chybné datum. @@ -158,9 +309,6 @@ Items differ in attributes only Položky se liší pouze ve vlastnostech -The name %x is used by more than one item in the folder. -Název %x je použit více jak jednou položkou ve složce. - Resolving symbolic link %x Hledání odkazu symbolického zástupce %x @@ -221,6 +369,15 @@ Out of memory. Nedostatek pracovní paměti. +Show in Explorer +Zobrazit v Průzkumníkovi + +Open with default application +Otevřít výchozí aplikací + +Browse directory +Procházet adresář + Database file %x is incompatible. Chybný formát databáze %x. @@ -233,12 +390,6 @@ Database file is corrupted: Databáze je poškozená: -Cannot write file %x. -Nelze zapsat soubor %x. - -Cannot read file %x. -Nelze číst soubor %x. - The database files do not yet contain information about the last synchronization. Databázový soubor ještě neobsahuje informace o poslední synchronizaci. @@ -257,9 +408,6 @@ Cannot get process information. Nelze získat informace procesu. -Cannot read file attributes of %x. -Nelze číst vlastnosti souboru %x. - Waiting while directory is locked: Čekání na uzamčení adresáře: @@ -333,6 +481,27 @@ Update attributes on right Nastavit vlastnosti vpravo +Error parsing file %x, row %y, column %z. +Chyba zpracování souboru %x: na řádku %y ve sloupci %z. + +Services +Služby + +Show All +Zobrazit vše + +Hide Others +Skrýt ostatní + +Hide %x +Skrýt %x + +Quit %x +Ukončit %x + +Cannot set directory locks for the following folders: +Nelze uzamčít následující adresáře: + Errors: Chyb: @@ -357,27 +526,6 @@ Cleaning up log files: Vyčištění žurnálů: -Error parsing file %x, row %y, column %z. -Chyba zpracování souboru %x: na řádku %y ve sloupci %z. - -Services -Služby - -Show All -Zobrazit vše - -Hide Others -Skrýt ostatní - -Hide %x -Skrýt %x - -Quit %x -Ukončit %x - -Cannot set directory locks for the following folders: -Nelze uzamčít následující adresáře: - 1 thread %x threads @@ -388,27 +536,12 @@ %x procesů -Cannot read directory %x. -Nelze číst adresář %x. - %x/sec %x/s %x items %x položek -Show in Explorer -Zobrazit v Průzkumníkovi - -Open with default application -Otevřít výchozí aplikací - -Browse directory -Procházet adresář - -Unable to connect to %x. -Nepodařilo se připojit k %x. - Completed successfully Úspěšně dokončeno @@ -454,9 +587,6 @@ Cannot write file attributes of %x. Nelze zapsat vlastnosti souboru %x. -Cannot open file %x. -Nelze otevřít soubor %x. - %x and %y have different content. %x a %y mají odlišný obsah. @@ -487,29 +617,20 @@ Source item %x not found Zdrojová položka %x nenalezena. -Cannot move file %x to %y. -Nelze přesunout soubor %x do %y. - Parent folder %x is not existing. Nadřazená složka %x neexistuje. -The name %x is already used by another item. -Název %x je již používán jinou položkou. - Cannot copy file %x to %y. Nelze kopírovat soubor %x do %y. -Cannot copy symbolic link %x to %y. -Nelze kopírovat symbolický odkaz %x do %y. - Creating a Volume Shadow Copy for %x... Vytváření Stínové kopie pro %x... Cannot find folder %x. Nelze najít složku %x. -Target folder %x already existing. -Cílová složka %x již existuje. +Target folder %x is already existing, but was not available during folder comparison. +Cílová složka %x již existuje, ale při porovnávání nebyla k dispozici. Target folder input field must not be empty. Cílová složka nesmí být prázdná. @@ -532,16 +653,13 @@ Not enough free disk space available in: Nedostatek místa na disku: -Required: -Požadováno: - Available: K dispozici: Some files will be synchronized as part of multiple base folders. Některé soubory budou synchronizovány jako součást vícezdrojových složek. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. K předejití konfliktů je potřeba nastavit filtr tak, aby každý soubor měl pouze jednu základní nadřazenou složku. Versioning folder: @@ -568,124 +686,6 @@ Unable to create time stamp for versioning: Nelze vytvořit časové značky verzování: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -+Neočekávaná velikost dat. -Očekáváno: %x b -Aktuálně: %y b - - -Cannot write permissions of %x. -Nelze zapsat oprávnění pro %x. - -Operation not supported between different devices. -Operace není podporována mezi různými zařízeními. - -Cannot delete file %x. -Nelze smazat soubor %x. - -Cannot delete symbolic link %x. -Nelze smazat symbolický odkaz %x. - -Cannot delete directory %x. -Nelze smazat adresář %x. - -Error Code %x -Chybový kód %x - -Cannot write modification time of %x. -Nelze nastavit čas změny ve vlastnostech %x. - -Cannot create directory %x. -Nelze vytvořit adresář %x. - -Cannot determine final path for %x. -Nelze určit výslednou cestu pro %x. - -Operation not supported by device. -Operace není zařízením podporována. - -Cannot resolve symbolic link %x. -Nelze najít odkaz zástupce %x. - -Unable to move %x to the recycle bin. -Není možné přesunout %x do Koše. - -Authentication completed. -Přístup povolen. - -You may close this page now and continue with FreeFileSync. -Nyní můžete tuto stránku zavřít a pokračovat s FreeFileSync. - -Authentication failed. -Přístup odmítnut. - -Cannot find %x. -Nelze najít %x. - -Please authorize access to user account %x. -Prosím autorizujte přístup k uživatelskému účtu %x. - -Cannot determine free disk space for %x. -Nelze zjistit volné místo na disku %x. - -Unable to disconnect from %x. -Nelze se odpojit od %x. - -Unable to access %x. -Nepodařil se přístup k %x. - -Failed to get information about server %x. -Nelze získat informace o serveru %x. - -Cannot monitor directory %x. -Nelze nastavit monitorování adresáře %x. - -Cannot find device %x. -Nelze nalézt zařízení %x. - -Cannot open directory %x. -Nelze otevřít adresář %x. - -Unsupported item type. -Nepodporovaný typ položky. - -Incorrect command line: -Neplatný příkaz: - -The server does not support authentication via %x. -Server nepodporuje ověření pomocí %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Vypršel čas 1 sekundy pro dokončení operace. -Vypršel čas %x sekund pro dokončení operace. -Vypršel čas %x sekund pro dokončení operace. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Nelze čekat na více jak 1 spojení najednou. -Nelze čekat na více jak %x spojení najednou. -Nelze čekat na více jak %x spojení najednou. - - -Active connections: %x -Aktivní spojení: %x - -Failed to open SFTP channel number %x. -Nelze otevřít SFTP kanál %x. - Drag && drop Přetáhni sem && pusť @@ -752,6 +752,9 @@ Aktuálně: %y b Command line: Příkazová řádka: +&Hide console window +&Skrýt příkazové okno + The command is triggered if: - files or subfolders change @@ -787,8 +790,8 @@ Příkaz je spuštěn když: Waiting until directory is available: Čekání na dostupnost adresáře: -&Restore -&Obnovit +&Configure +&Nastavit &Show error message Zobrazit chybové &hlášení @@ -824,8 +827,8 @@ Příkaz je spuštěn když: Scanning... Zpracovávání... -job name -název úlohy +configuration file +soubor nastavení System: Sleep Režim spánku počítače @@ -836,8 +839,8 @@ Příkaz je spuštěn když: Nothing to synchronize Není co synchronizovat -Executing command %x -Spuštění příkazu %x +Executing command: +Spuštění příkazu: You can switch to FreeFileSync's main window to resolve this issue. K odstranění tohoto problému se přepněte do hlavního okna FreeFileSync. @@ -1038,6 +1041,12 @@ Příkaz je spuštěn když: Match case Rozlišovat malá a velká písmena +Processed: +Zpracováno: + +Remaining: +Zbývá: + New Nový @@ -1274,14 +1283,17 @@ Příkaz je spuštěn když: &Don't show this dialog again Tento dialog již &nezobrazovat -Items found: -Nalezeno položek: +Bytes: +Dat: -Time remaining: -Zbývající čas: +Items: +Položek: -Time elapsed: -Uplynulý čas: +Synchronizing... +Synchronizuji... + +Minimize to notification area +Minimalizovat do oznamovací oblasti Bytes Bajtů @@ -1289,12 +1301,6 @@ Příkaz je spuštěn když: Items Položek -Synchronizing... -Synchronizuji... - -Minimize to notification area -Minimalizovat do oznamovací oblasti - When finished: Po dokončení: @@ -1367,6 +1373,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: &Smazat žurnály po (dnech): +Notification sounds: +Zvuky upozornění: + +Synchronization finished: +Dokončení synchronizace: + Customize context menu: Přizpůsobit kontextovou nabídku: @@ -1518,36 +1530,6 @@ This guarantees a consistent state even in case of a serious error. &Execute &Spustit - -1 directory -%x directories - - -1 adresář -%x adresáře -%x adresářů - - - -1 file -%x files - - -1 soubor -%x soubory -%x souborů - - - -Showing %y of 1 row -Showing %y of %x rows - - -Zobrazení %y z 1 řádku -Zobrazení %y z %x řádků -Zobrazení %y z %x řádků - - Set direction: Nastavit adresář: @@ -1575,12 +1557,6 @@ This guarantees a consistent state even in case of a serious error. &Delete &Smazat -Include all -Zahrnout vše - -Exclude all -Vynechat vše - Show icons: Ikony: @@ -1617,6 +1593,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &Neukládat +%x cannot be renamed. +%x nelze prejmenovat. + +New name: +Nové jméno: + +Rename Configuration +Přejmenovat konfiguraci + +Configuration name must not be empty. +Název konfigurace nesmí být prázdný. + +&Rename... +&Přejmenovat... + Hide configuration Skrýt položky @@ -1677,6 +1668,36 @@ This guarantees a consistent state even in case of a serious error. All files are in sync Všechny soubory jsou synchronizovány + +1 directory +%x directories + + +1 adresář +%x adresáře +%x adresářů + + + +1 file +%x files + + +1 soubor +%x soubory +%x souborů + + + +Showing %y of 1 row +Showing %y of %x rows + + +Zobrazení %y z 1 řádku +Zobrazení %y z %x řádků +Zobrazení %y z %x řádků + + Cannot find %x Nelze najít %x @@ -1728,7 +1749,7 @@ This guarantees a consistent state even in case of a serious error. Password: Heslo: -Key password: +Key passphrase: Klíč: Please enter a file path. @@ -1896,6 +1917,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. Minimální verze musí být menší než maximum. +&Restore +&Obnovit + Files Soubory @@ -1962,6 +1986,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: Soubor je uzamčen jiným procesem: +Failed to determine file permission support for folder %x. +Nepodařilo se zjistit možnosti oprávnění pro složku %x. + Cannot read security context of %x. Nelze číst přístupová práva pro %x. @@ -2015,12 +2042,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. Nelze nastavit priority procesu. -Unable to shut down the system. -Nepodařilo se vypnout systém. - Checking recycle bin failed for folder %x. Selhala kontrola Koše pro složku %x. +Unable to shut down the system. +Nepodařilo se vypnout systém. + Prepare installation Příprava instalace diff --git a/FreeFileSync/Build/Resources/Languages/danish.lng b/FreeFileSync/Build/Resources/Languages/danish.lng index 00fadfec..df98938c 100755 --- a/FreeFileSync/Build/Resources/Languages/danish.lng +++ b/FreeFileSync/Build/Resources/Languages/danish.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +Kan ikke læse filen %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Uventet datastørrelse. +Forventet: %x byte +Aktuel: %y byte + + +Cannot write file %x. +Kan ikke oprette filen %x. + +Cannot write permissions of %x. +Kan ikke skrive tilladelserne til %x. + +Operation not supported between different devices. +Handlingen støttes ikke mellem forskellige enheder. + +Cannot delete file %x. +Kan ikke slette filen %x. + +Cannot delete symbolic link %x. +Kan ikke slette det symbolske link %x. + +Cannot delete directory %x. +Kan ikke slette mappen %x. + +Cannot move file %x to %y. +Kan ikke flytte filen %x til %y. + +Cannot copy symbolic link %x to %y. +Kan ikke kopiere symlink fra %x til %y. + +Error Code %x +Fejlkode %x + +Cannot read directory %x. +Kan ikke læse mappen %x. + +Cannot write modification time of %x. +Kan ikke opdatere tidsændring på %x. + +Cannot read file attributes of %x. +Kan ikke læse filattributterne på %x. + +Cannot create directory %x. +Kan ikke oprette mappen %x. + +Cannot determine final path for %x. +Kan ikke bestemme endelig sti for %x. + +Operation not supported by device. +Handlingen understøttes ikke af enheden. + +Cannot resolve symbolic link %x. +Kan ikke følge symlinket %x. + +Unable to move %x to the recycle bin. +Kunne ikke flytte %x til papirkurv. + +Authentication completed. +Godkendelse gennemført. + +You may close this page now and continue with FreeFileSync. +Du kan lukke siden og returnere til FreeFileSync. + +Authentication failed. +Godkendelse fejlede. + +Unable to connect to %x. +Kan ikke kontakte %x. + +Cannot find %x. +Kan ikke finde %x. + +The name %x is used by more than one item in the folder. +Navnet %x bruges af flere emner i mappen. + +Please authorize access to user account %x. +Godkend adgang til %x. + +Cannot open file %x. +Filen %x kan ikke åbnes. + +The name %x is already used by another item. +Navnet %x findes allerede. + +Cannot determine free disk space for %x. +Kan ikke definere ledig plads på %x. + +Unable to disconnect from %x. +Forbindelsen til %x kan ikke afbrydes. + +Unable to access %x. +Kan ikke tilgå %x. + +Failed to get information about server %x. +Kunne ikke hente oplysninger om serveren %x. + +Cannot monitor directory %x. +Kan ikke overvåge mappen %x. + +Cannot find device %x. +Kan ikke finde enheden %x. + +Cannot open directory %x. +Kan ikke åbne mappen %x. + +Unsupported item type. +Emnetype ikke understøttet. + +Incorrect command line: +Ugyldig kommando: + +The server does not support authentication via %x. +Serveren støtter ikke godkendelse via %x. + +Required: +Krævet: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Tiden udløb efter 1 sekund. +Tiden udløb efter %x sekunder. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Kan ikke vente på mere end 1 forbindelse af gangen. +Kan ikke vente på mere end %x forbindelser af gangen. + + +Active connections: %x +Aktive forbindelser: %x + +Failed to open SFTP channel number %x. +Fejl ved åbning af SFTP kanal nr. %x. + Both sides have changed since last synchronization. Begge sider ændret siden sidste synkronisering. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Ødelagte installationsfiler. Geninstaller FreeFileSync. -Cannot load file %x. -Kan ikke indlæse filen %x. - Cannot find the following folders: Kan ikke finde følgende mapper: @@ -139,6 +285,9 @@ %x emner fundet +Time elapsed: +Brugt tid: + File %x has an invalid date. Filen %x har en ugyldig dato. @@ -157,9 +306,6 @@ Items differ in attributes only Enhederne har kun attributter til forskel -The name %x is used by more than one item in the folder. -Navnet %x bruges af flere emner i mappen. - Resolving symbolic link %x Løser symbolsk link %x @@ -220,6 +366,15 @@ Out of memory. Ikke nok hukommelse. +Show in Explorer +Åben filplacering + +Open with default application +Åben med standardprogram + +Browse directory +Gennemse mappe + Database file %x is incompatible. Databasefilen %x er inkompatibel. @@ -232,12 +387,6 @@ Database file is corrupted: Databasefil i stykker: -Cannot write file %x. -Kan ikke oprette filen %x. - -Cannot read file %x. -Kan ikke læse filen %x. - The database files do not yet contain information about the last synchronization. Databasefilen indeholder endnu ikke oplysninger om sidste synkronisering. @@ -256,9 +405,6 @@ Cannot get process information. Kan ikke hente procesinformation. -Cannot read file attributes of %x. -Kan ikke læse filattributterne på %x. - Waiting while directory is locked: Venter mens mappe låses: @@ -385,27 +531,12 @@ %x tråde -Cannot read directory %x. -Kan ikke læse mappen %x. - %x/sec %x/sek %x items %x emner -Show in Explorer -Åben filplacering - -Open with default application -Åben med standardprogram - -Browse directory -Gennemse mappe - -Unable to connect to %x. -Kan ikke kontakte %x. - Completed successfully Gennemført @@ -451,9 +582,6 @@ Cannot write file attributes of %x. Kan ikke skrive filattributter til %x. -Cannot open file %x. -Filen %x kan ikke åbnes. - %x and %y have different content. %x og %y har forskelligt indhold. @@ -484,29 +612,20 @@ Source item %x not found Kildeemne %x ikke fundet -Cannot move file %x to %y. -Kan ikke flytte filen %x til %y. - Parent folder %x is not existing. Overordnet mappe %x findes ikke. -The name %x is already used by another item. -Navnet %x findes allerede. - Cannot copy file %x to %y. Kan ikke kopiere filen %x til %y. -Cannot copy symbolic link %x to %y. -Kan ikke kopiere symlink fra %x til %y. - Creating a Volume Shadow Copy for %x... Opretter VSS kopi for %x... Cannot find folder %x. Kan ikke finde mappen %x. -Target folder %x already existing. -Destinationsmappen %x findes allerede. +Target folder %x is already existing, but was not available during folder comparison. +Destinationsmappen %x findes allerede, men var utilgængelig under analysen. Target folder input field must not be empty. Destinationsmappen skal angives. @@ -529,17 +648,14 @@ Not enough free disk space available in: Ikke nok ledig diskplads på: -Required: -Krævet: - Available: Tilgængeligt: Some files will be synchronized as part of multiple base folders. Nogle filer synkroniseres som del af flere basismapper. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Undgå konflikter ved at bruge filtre, så hver opdateret fil kun relateres til en basismappe. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +For at undgå konflikter, bør ekskluderede filer kun findes i en kildemappe. Versioning folder: Versioneringsmappe: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Kan ikke oprette tidsstempel til versionering: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Uventet datastørrelse. -Forventet: %x byte -Aktuel: %y byte - - -Cannot write permissions of %x. -Kan ikke skrive tilladelserne til %x. - -Operation not supported between different devices. -Handlingen støttes ikke mellem forskellige enheder. - -Cannot delete file %x. -Kan ikke slette filen %x. - -Cannot delete symbolic link %x. -Kan ikke slette det symbolske link %x. - -Cannot delete directory %x. -Kan ikke slette mappen %x. - -Error Code %x -Fejlkode %x - -Cannot write modification time of %x. -Kan ikke opdatere tidsændring på %x. - -Cannot create directory %x. -Kan ikke oprette mappen %x. - -Cannot determine final path for %x. -Kan ikke bestemme endelig sti for %x. - -Operation not supported by device. -Handlingen understøttes ikke af enheden. - -Cannot resolve symbolic link %x. -Kan ikke følge symlinket %x. - -Unable to move %x to the recycle bin. -Kunne ikke flytte %x til papirkurv. - -Authentication completed. -Godkendelse gennemført. - -You may close this page now and continue with FreeFileSync. -Du kan lukke siden og returnere til FreeFileSync. - -Authentication failed. -Godkendelse fejlede. - -Cannot find %x. -Kan ikke finde %x. - -Please authorize access to user account %x. -Godkend adgang til %x. - -Cannot determine free disk space for %x. -Kan ikke definere ledig plads på %x. - -Unable to disconnect from %x. -Forbindelsen til %x kan ikke afbrydes. - -Unable to access %x. -Kan ikke tilgå %x. - -Failed to get information about server %x. -Kunne ikke hente oplysninger om serveren %x. - -Cannot monitor directory %x. -Kan ikke overvåge mappen %x. - -Cannot find device %x. -Kan ikke finde enheden %x. - -Cannot open directory %x. -Kan ikke åbne mappen %x. - -Unsupported item type. -Emnetype ikke understøttet. - -Incorrect command line: -Ugyldig kommando: - -The server does not support authentication via %x. -Serveren støtter ikke godkendelse via %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Tiden udløb efter 1 sekund. -Tiden udløb efter %x sekunder. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Kan ikke vente på mere end 1 forbindelse af gangen. -Kan ikke vente på mere end %x forbindelser af gangen. - - -Active connections: %x -Aktive forbindelser: %x - -Failed to open SFTP channel number %x. -Fejl ved åbning af SFTP kanal nr. %x. - Drag && drop Træk emner hertil @@ -747,6 +747,9 @@ Aktuel: %y byte Command line: Kommando: +&Hide console window +&Skjul vindue + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ Kommandoen udføres hvis: Waiting until directory is available: Venter til mappe er tilgængelig: -&Restore -&Vis vindue +&Configure +&Indstil &Show error message V&is fejlbesked @@ -818,8 +821,8 @@ Kommandoen udføres hvis: Scanning... Skanner... -job name -Jobnavn +configuration file +Indstillingsfil System: Sleep System: Slumre @@ -830,8 +833,8 @@ Kommandoen udføres hvis: Nothing to synchronize Alt er synkroniseret -Executing command %x -Kører kommandoen %x +Executing command: +Udfører kommando: You can switch to FreeFileSync's main window to resolve this issue. Skift til FreeFileSyncs hovedvindue for at løse problemet. @@ -1031,6 +1034,12 @@ Kommandoen udføres hvis: Match case Versalfølsom (a/A) +Processed: +Behandlet: + +Remaining: +Resterende: + New Ny @@ -1267,14 +1276,17 @@ Kommandoen udføres hvis: &Don't show this dialog again &Vis ikke igen -Items found: -Emner fundet: +Bytes: +Bytes: -Time remaining: -Resterende tid: +Items: +Emner: -Time elapsed: -Brugt tid: +Synchronizing... +Synkroniserer... + +Minimize to notification area +Minimér til uret Bytes Bytes @@ -1282,12 +1294,6 @@ Kommandoen udføres hvis: Items Emner -Synchronizing... -Synkroniserer... - -Minimize to notification area -Minimér til uret - When finished: Når gennemført: @@ -1363,6 +1369,12 @@ Sikrer processen ved alvorlige fejl. &Delete logs after x days: &Slet logs efter x dage: +Notification sounds: +Beskedlyde: + +Synchronization finished: +Synkronisering gennemført: + Customize context menu: Tilpas kontekstmenu: @@ -1567,12 +1579,6 @@ Sikrer processen ved alvorlige fejl. &Delete &Slet -Include all -Vælg alle - -Exclude all -Fravælg alle - Show icons: Vis ikoner: @@ -1609,6 +1615,21 @@ Sikrer processen ved alvorlige fejl. Do&n't save &Gem ikke +%x cannot be renamed. +%x kan ikke omdøbes. + +New name: +Nyt navn: + +Rename Configuration +Indstillinger + +Configuration name must not be empty. +Indstillingsnavn skal udfyldes. + +&Rename... +&Omdøb... + Hide configuration Skjul indstillinger @@ -1720,8 +1741,8 @@ Sikrer processen ved alvorlige fejl. Password: Kodeord: -Key password: -Nøglekodeord: +Key passphrase: +Nøglesætning: Please enter a file path. Angiv placering. @@ -1885,6 +1906,9 @@ Sikrer processen ved alvorlige fejl. Minimum version count must be smaller than maximum count. Mindste antal versioner skal være mindre end det maksimale. +&Restore +&Vis vindue + Files Filer @@ -1951,6 +1975,9 @@ Sikrer processen ved alvorlige fejl. The file is locked by another process: Filen er låst af en anden process: +Failed to determine file permission support for folder %x. +Filtilladelser for mappen %x kunne ikke bestemmes. + Cannot read security context of %x. Kan ikke læse sikkerhedsindstillinger på %x. @@ -2002,12 +2029,12 @@ Sikrer processen ved alvorlige fejl. Cannot change process I/O priorities. Kan ikke ændre I/O prioriteter. -Unable to shut down the system. -Kunne ikke lukke computeren. - Checking recycle bin failed for folder %x. Check papirkurv fejlede for mappen %x. +Unable to shut down the system. +Kunne ikke lukke computeren. + Prepare installation Forbereder installering diff --git a/FreeFileSync/Build/Resources/Languages/dutch.lng b/FreeFileSync/Build/Resources/Languages/dutch.lng index 5f8dd2d4..62a3ef67 100755 --- a/FreeFileSync/Build/Resources/Languages/dutch.lng +++ b/FreeFileSync/Build/Resources/Languages/dutch.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +Kan het bestand %x niet lezen. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Onverwachte grootte van de gegevensstroom. +Verwacht: %x bytes +Werkelijk: %y bytes + + +Cannot write file %x. +Kan bestand %x niet schrijven. + +Cannot write permissions of %x. +Kan de aangegeven machtigingen van %x niet schrijven. + +Operation not supported between different devices. +Bewerking wordt niet ondersteund tussen verschillende apparaten. + +Cannot delete file %x. +Kan bestand %x niet verwijderen. + +Cannot delete symbolic link %x. +Kan de symbolische koppeling %x niet verwijderen. + +Cannot delete directory %x. +De map %x kan niet verwijderd worden. + +Cannot move file %x to %y. +Het bestand %x kan niet naar %y verplaatst worden. + +Cannot copy symbolic link %x to %y. +Kan de symbolische koppeling %x niet kopiëren naar %y. + +Error Code %x +Foutcode %x + +Cannot read directory %x. +Kan de map %x niet lezen. + +Cannot write modification time of %x. +De modificatie-tijd van %x kan niet geschreven worden. + +Cannot read file attributes of %x. +Kan de bestandskenmerken van %x niet lezen. + +Cannot create directory %x. +Kan de map %x niet maken. + +Cannot determine final path for %x. +Kan het uiteindelijke pad voor %x niet bepalen. + +Operation not supported by device. +Bewerking wordt niet ondersteund door het apparaat. + +Cannot resolve symbolic link %x. +Kan de symbolische koppeling %x niet oplossen. + +Unable to move %x to the recycle bin. +Niet in staat om %x naar de prullenbak te verplaatsen. + +Authentication completed. +Authenticatie voltooid. + +You may close this page now and continue with FreeFileSync. +U kunt deze pagina nu sluiten en doorgaan met FreeFileSync. + +Authentication failed. +Verificatie mislukt. + +Unable to connect to %x. +Kan geen verbinding maken met %x. + +Cannot find %x. +Kan %x niet vinden. + +The name %x is used by more than one item in the folder. +De naam %x wordt gebruikt door meer dan één item in de map. + +Please authorize access to user account %x. +Gelieve toestemming te geven om toegang tot het gebruikersaccount %x. + +Cannot open file %x. +Het bestand %x kan niet geopend worden. + +The name %x is already used by another item. +De naam %x wordt al door een ander item gebruikt. + +Cannot determine free disk space for %x. +Kan de vrije schijfruimte voor %x niet bepalen. + +Unable to disconnect from %x. +Kan verbinding van %x niet verbreken. + +Unable to access %x. +Geen toegang tot %x. + +Failed to get information about server %x. +Fout bij het ophalen van informatie over server %x. + +Cannot monitor directory %x. +Kan map %x niet bewaken. + +Cannot find device %x. +Kan apparaat %x niet vinden. + +Cannot open directory %x. +Kan de map %x niet openen. + +Unsupported item type. +Niet-ondersteund item type. + +Incorrect command line: +Onjuiste opdrachtregel: + +The server does not support authentication via %x. +De server ondersteunt geen verificatie via %x. + +Required: +Vereist: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Bewerking na 1 seconde verlopen. +Bewerking na %x seconden verlopen. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Kan niet meer dan op 1 verbinding tegelijk wachten. +Kan niet meer dan op %x verbindingen tegelijk wachten. + + +Active connections: %x +Actieve verbindingen: %x + +Failed to open SFTP channel number %x. +Fout bij het openen van SFTP kanaalnummer %x. + Both sides have changed since last synchronization. Beide zijden zijn gewijzigd sinds de laatste synchronisatie. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Installatiebestanden zijn beschadigd. Installeer FreeFileSync opnieuw. -Cannot load file %x. -Kan bestand %x niet inlezen. - Cannot find the following folders: De volgende mappen konden niet worden gevonden: @@ -139,6 +285,9 @@ %x items gevonden +Time elapsed: +Verstreken tijd: + File %x has an invalid date. Het bestand %x heeft een ongeldige datum. @@ -157,9 +306,6 @@ Items differ in attributes only De items verschillen alleen in de kenmerken -The name %x is used by more than one item in the folder. -De naam %x wordt gebruikt door meer dan één item in de map. - Resolving symbolic link %x Symbolische link %x oplossen @@ -220,6 +366,15 @@ Out of memory. Onvoldoende werkgeheugen. +Show in Explorer +In Explorer weergeven + +Open with default application +Openen met standaardtoepassing + +Browse directory +Blader in map + Database file %x is incompatible. Databasebestand %x is niet compatibel. @@ -232,12 +387,6 @@ Database file is corrupted: Databasebestand is beschadigd: -Cannot write file %x. -Kan bestand %x niet schrijven. - -Cannot read file %x. -Kan het bestand %x niet lezen. - The database files do not yet contain information about the last synchronization. De databasebestanden bevatten nog geen informatie over de laatste synchronisatie. @@ -256,9 +405,6 @@ Cannot get process information. Kan geen procesinformatie krijgen. -Cannot read file attributes of %x. -Kan de bestandskenmerken van %x niet lezen. - Waiting while directory is locked: Wachten terwijl de map is vergrendeld: @@ -385,27 +531,12 @@ %x threads -Cannot read directory %x. -Kan de map %x niet lezen. - %x/sec %x/sec %x items %x items -Show in Explorer -In Explorer weergeven - -Open with default application -Openen met standaardtoepassing - -Browse directory -Blader in map - -Unable to connect to %x. -Kan geen verbinding maken met %x. - Completed successfully Succesvol voltooid @@ -451,9 +582,6 @@ Cannot write file attributes of %x. De bestandskenmerken voor %x kunnen niet geschreven worden. -Cannot open file %x. -Het bestand %x kan niet geopend worden. - %x and %y have different content. %x en %y hebben verschillende inhoud. @@ -484,29 +612,20 @@ Source item %x not found Bronitem %x niet gevonden -Cannot move file %x to %y. -Het bestand %x kan niet naar %y verplaatst worden. - Parent folder %x is not existing. Bovenliggende map %x bestaat niet. -The name %x is already used by another item. -De naam %x wordt al door een ander item gebruikt. - Cannot copy file %x to %y. Kan bestand %x niet kopiëren naar %y. -Cannot copy symbolic link %x to %y. -Kan de symbolische koppeling %x niet kopiëren naar %y. - Creating a Volume Shadow Copy for %x... Maken van een volume schaduwkopie voor %x... Cannot find folder %x. Kan de map %x niet vinden. -Target folder %x already existing. -Doelmap %x bestaat reeds. +Target folder %x is already existing, but was not available during folder comparison. +Doelmap %x bestaat al, maar was niet beschikbaar tijdens het vergelijken van de mappen. Target folder input field must not be empty. Het invoerveld van de doelmap moet niet leeg zijn. @@ -529,17 +648,14 @@ Not enough free disk space available in: Er is onvoldoende vrije schijfruimte beschikbaar in: -Required: -Vereist: - Available: Beschikbaar: Some files will be synchronized as part of multiple base folders. Sommige bestanden worden gesynchroniseerd als onderdeel van meerdere basis mappen. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Om conflicten te voorkomen, filters uitsluitingen zodanig instellen dat elke bijgewerkte bestand wordt beschouwd als slechts één basismap. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Om conflicten te voorkomen, stelt u de uitsluitingsfilters zo in dat elk bijgewerkt bestand slechts door één basismap wordt opgenomen. Versioning folder: Map versiebeheer: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Kan geen tijdstempel maken voor versiebeheer: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Onverwachte grootte van de gegevensstroom. -Verwacht: %x bytes -Werkelijk: %y bytes - - -Cannot write permissions of %x. -Kan de aangegeven machtigingen van %x niet schrijven. - -Operation not supported between different devices. -Bewerking wordt niet ondersteund tussen verschillende apparaten. - -Cannot delete file %x. -Kan bestand %x niet verwijderen. - -Cannot delete symbolic link %x. -Kan de symbolische koppeling %x niet verwijderen. - -Cannot delete directory %x. -De map %x kan niet verwijderd worden. - -Error Code %x -Foutcode %x - -Cannot write modification time of %x. -De modificatie-tijd van %x kan niet geschreven worden. - -Cannot create directory %x. -Kan de map %x niet maken. - -Cannot determine final path for %x. -Kan het uiteindelijke pad voor %x niet bepalen. - -Operation not supported by device. -Bewerking wordt niet ondersteund door het apparaat. - -Cannot resolve symbolic link %x. -Kan de symbolische koppeling %x niet oplossen. - -Unable to move %x to the recycle bin. -Niet in staat om %x naar de prullenbak te verplaatsen. - -Authentication completed. -Authenticatie voltooid. - -You may close this page now and continue with FreeFileSync. -U kunt deze pagina nu sluiten en doorgaan met FreeFileSync. - -Authentication failed. -Verificatie mislukt. - -Cannot find %x. -Kan %x niet vinden. - -Please authorize access to user account %x. -Gelieve toestemming te geven om toegang tot het gebruikersaccount %x. - -Cannot determine free disk space for %x. -Kan de vrije schijfruimte voor %x niet bepalen. - -Unable to disconnect from %x. -Kan verbinding van %x niet verbreken. - -Unable to access %x. -Geen toegang tot %x. - -Failed to get information about server %x. -Fout bij het ophalen van informatie over server %x. - -Cannot monitor directory %x. -Kan map %x niet bewaken. - -Cannot find device %x. -Kan apparaat %x niet vinden. - -Cannot open directory %x. -Kan de map %x niet openen. - -Unsupported item type. -Niet-ondersteund item type. - -Incorrect command line: -Onjuiste opdrachtregel: - -The server does not support authentication via %x. -De server ondersteunt geen verificatie via %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Bewerking na 1 seconde verlopen. -Bewerking na %x seconden verlopen. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Kan niet meer dan op 1 verbinding tegelijk wachten. -Kan niet meer dan op %x verbindingen tegelijk wachten. - - -Active connections: %x -Actieve verbindingen: %x - -Failed to open SFTP channel number %x. -Fout bij het openen van SFTP kanaalnummer %x. - Drag && drop Slepen && neerzetten @@ -747,6 +747,9 @@ Werkelijk: %y bytes Command line: Opdrachtregel: +&Hide console window +&Verberg bedieningspaneel + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ De opdracht wordt geactiveerd als: Waiting until directory is available: Wachten tot de map beschikbaar is: -&Restore -&Herstellen +&Configure +&Configureer &Show error message &Toon foutmelding @@ -818,8 +821,8 @@ De opdracht wordt geactiveerd als: Scanning... Scannen... -job name -taaknaam +configuration file +configuratiebestand System: Sleep Systeem: Slaapstand @@ -830,8 +833,8 @@ De opdracht wordt geactiveerd als: Nothing to synchronize Niets om te synchroniseren -Executing command %x -Opdracht %x uitvoeren +Executing command: +Opdracht uitvoeren: You can switch to FreeFileSync's main window to resolve this issue. U kunt overschakelen naar het hoofdvenster van FreeFileSync om dit probleem op te lossen. @@ -1031,6 +1034,12 @@ De opdracht wordt geactiveerd als: Match case Hoofdlettergevoelig +Processed: +Verwerkt: + +Remaining: +Resterend: + New Nieuw @@ -1267,14 +1276,17 @@ De opdracht wordt geactiveerd als: &Don't show this dialog again &Dit dialoogvenster niet opnieuw weergeven -Items found: -Gevonden objecten: +Bytes: +Bytes: -Time remaining: -Resterende tijd: +Items: +Objecten: -Time elapsed: -Verstreken tijd: +Synchronizing... +Synchroniseren... + +Minimize to notification area +Minimaliseren naar systeemvak Bytes Bytes @@ -1282,12 +1294,6 @@ De opdracht wordt geactiveerd als: Items Objecten -Synchronizing... -Synchroniseren... - -Minimize to notification area -Minimaliseren naar systeemvak - When finished: Indien gereed: @@ -1363,6 +1369,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. &Delete logs after x days: &Verwijder logboeken na x dagen: +Notification sounds: +Meldingsgeluiden: + +Synchronization finished: +De synchronisatie is voltooid: + Customize context menu: Contextmenu aanpassen: @@ -1466,7 +1478,7 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. &Opties Main Bar -Hoofd balk +Hoofdbalk Folder Pairs Map-paren @@ -1567,12 +1579,6 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. &Delete &Verwijderen -Include all -Omvat alles - -Exclude all -Alles uitgesloten - Show icons: Pictogrammen weergeven: @@ -1609,6 +1615,21 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Do&n't save &Niet opslaan +%x cannot be renamed. +%x kan niet worden hernoemd. + +New name: +Nieuwe naam: + +Rename Configuration +Hernoem configuratie + +Configuration name must not be empty. +De configuratienaam mag niet leeg zijn. + +&Rename... +&Hernoem.... + Hide configuration Verberg configuratie @@ -1720,8 +1741,8 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Password: Wachtwoord: -Key password: -Sleutel wachtwoord: +Key passphrase: +Wachtwoordzin: Please enter a file path. Voer een bestandspad in. @@ -1885,6 +1906,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Minimum version count must be smaller than maximum count. Het minimum aantal versies moet kleiner zijn dan het maximale aantal. +&Restore +&Herstellen + Files Bestanden @@ -1951,6 +1975,9 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. The file is locked by another process: Het bestand is vergrendeld door een ander proces: +Failed to determine file permission support for folder %x. +Kan ondersteuning voor bestandsrechten voor map %x niet bepalen. + Cannot read security context of %x. Kan de beveiligingscontext van %x niet lezen. @@ -2002,12 +2029,12 @@ Dit garandeert een consistente status zelfs in het geval van een ernstige fout. Cannot change process I/O priorities. De input/output prioriteiten kunnen niet gewijzigd worden. -Unable to shut down the system. -Kan het systeem niet afsluiten. - Checking recycle bin failed for folder %x. Controle van de prullenbak voor map %x is mislukt. +Unable to shut down the system. +Kan het systeem niet afsluiten. + Prepare installation Installatie voorbereiden diff --git a/FreeFileSync/Build/Resources/Languages/english_uk.lng b/FreeFileSync/Build/Resources/Languages/english_uk.lng index f8814e1e..29715212 100755 --- a/FreeFileSync/Build/Resources/Languages/english_uk.lng +++ b/FreeFileSync/Build/Resources/Languages/english_uk.lng @@ -7,6 +7,158 @@ n == 1 ? 0 : 1 +Failed to determine file permission support for folder %x. + + +Cannot read file %x. +Cannot read file %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Cannot write file %x. +Cannot write file %x. + +Cannot write permissions of %x. +Cannot write permissions of %x. + +Operation not supported between different devices. +Operation not supported between different devices. + +Cannot delete file %x. +Cannot delete file %x. + +Cannot delete symbolic link %x. +Cannot delete symbolic link %x. + +Cannot delete directory %x. +Cannot delete directory %x. + +Cannot move file %x to %y. +Cannot move file %x to %y. + +Cannot copy symbolic link %x to %y. +Cannot copy symbolic link %x to %y. + +Error Code %x +Error Code %x + +Cannot read directory %x. +Cannot read directory %x. + +Cannot write modification time of %x. +Cannot write modification time of %x. + +Cannot read file attributes of %x. +Cannot read file attributes of %x. + +Cannot create directory %x. +Cannot create directory %x. + +Cannot determine final path for %x. +Cannot determine final path for %x. + +Operation not supported by device. +Operation not supported by device. + +Cannot resolve symbolic link %x. +Cannot resolve symbolic link %x. + +Unable to move %x to the recycle bin. +Unable to move %x to the recycle bin. + +Authentication completed. +Authentication completed. + +You may close this page now and continue with FreeFileSync. +You may close this page now and continue with FreeFileSync. + +Authentication failed. +Authentication failed. + +Unable to connect to %x. +Unable to connect to %x. + +Cannot find %x. +Cannot find %x. + +The name %x is used by more than one item in the folder. +The name %x is used by more than one item in the folder. + +Please authorize access to user account %x. +Please authorise access to user account %x. + +Cannot open file %x. +Cannot open file %x. + +The name %x is already used by another item. +The name %x is already used by another item. + +Cannot determine free disk space for %x. +Cannot determine free disk space for %x. + +Unable to disconnect from %x. +Unable to disconnect from %x. + +Unable to access %x. +Unable to access %x. + +Failed to get information about server %x. +Failed to get information about server %x. + +Cannot monitor directory %x. +Cannot monitor directory %x. + +Cannot find device %x. +Cannot find device %x. + +Cannot open directory %x. +Cannot open directory %x. + +Unsupported item type. +Unsupported item type. + +Incorrect command line: +Incorrect command line: + +The server does not support authentication via %x. +The server does not support authentication via %x. + +Required: +Required: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Active connections: %x +Active connections: %x + +Failed to open SFTP channel number %x. +Failed to open SFTP channel number %x. + Both sides have changed since last synchronization. Both sides have changed since last synchronisation. @@ -109,9 +261,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Installation files are corrupted. Please reinstall FreeFileSync. -Cannot load file %x. -Cannot load file %x. - Cannot find the following folders: Cannot find the following folders: @@ -139,6 +288,9 @@ %x items found +Time elapsed: +Time elapsed: + File %x has an invalid date. File %x has an invalid date. @@ -157,9 +309,6 @@ Items differ in attributes only Items differ in attributes only -The name %x is used by more than one item in the folder. -The name %x is used by more than one item in the folder. - Resolving symbolic link %x Resolving symbolic link %x @@ -220,6 +369,15 @@ Out of memory. Out of memory. +Show in Explorer +Show in Explorer + +Open with default application +Open with default application + +Browse directory +Browse directory + Database file %x is incompatible. Database file %x is incompatible. @@ -232,12 +390,6 @@ Database file is corrupted: Database file is corrupted: -Cannot write file %x. -Cannot write file %x. - -Cannot read file %x. -Cannot read file %x. - The database files do not yet contain information about the last synchronization. The database files do not yet contain information about the last synchronisation. @@ -256,9 +408,6 @@ Cannot get process information. Cannot get process information. -Cannot read file attributes of %x. -Cannot read file attributes of %x. - Waiting while directory is locked: Waiting while directory is locked: @@ -385,27 +534,12 @@ %x threads -Cannot read directory %x. -Cannot read directory %x. - %x/sec %x/sec %x items %x items -Show in Explorer -Show in Explorer - -Open with default application -Open with default application - -Browse directory -Browse directory - -Unable to connect to %x. -Unable to connect to %x. - Completed successfully Completed successfully @@ -451,9 +585,6 @@ Cannot write file attributes of %x. Cannot write file attributes of %x. -Cannot open file %x. -Cannot open file %x. - %x and %y have different content. %x and %y have different content. @@ -484,29 +615,20 @@ Source item %x not found Source item %x not found -Cannot move file %x to %y. -Cannot move file %x to %y. - Parent folder %x is not existing. Parent folder %x is not existing. -The name %x is already used by another item. -The name %x is already used by another item. - Cannot copy file %x to %y. Cannot copy file %x to %y. -Cannot copy symbolic link %x to %y. -Cannot copy symbolic link %x to %y. - Creating a Volume Shadow Copy for %x... Creating a Volume Shadow Copy for %x... Cannot find folder %x. Cannot find folder %x. -Target folder %x already existing. -Target folder %x already existing. +Target folder %x is already existing, but was not available during folder comparison. +Target folder %x is already existing, but was not available during folder comparison. Target folder input field must not be empty. Target folder input field must not be empty. @@ -529,17 +651,14 @@ Not enough free disk space available in: Not enough free disk space available in: -Required: -Required: - Available: Available: Some files will be synchronized as part of multiple base folders. Some files will be synchronised as part of multiple base folders. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. Versioning folder: Versioning folder: @@ -565,122 +684,6 @@ Unable to create time stamp for versioning: Unable to create time stamp for versioning: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Cannot write permissions of %x. -Cannot write permissions of %x. - -Operation not supported between different devices. -Operation not supported between different devices. - -Cannot delete file %x. -Cannot delete file %x. - -Cannot delete symbolic link %x. -Cannot delete symbolic link %x. - -Cannot delete directory %x. -Cannot delete directory %x. - -Error Code %x -Error Code %x - -Cannot write modification time of %x. -Cannot write modification time of %x. - -Cannot create directory %x. -Cannot create directory %x. - -Cannot determine final path for %x. -Cannot determine final path for %x. - -Operation not supported by device. -Operation not supported by device. - -Cannot resolve symbolic link %x. -Cannot resolve symbolic link %x. - -Unable to move %x to the recycle bin. -Unable to move %x to the recycle bin. - -Authentication completed. -Authentication completed. - -You may close this page now and continue with FreeFileSync. -You may close this page now and continue with FreeFileSync. - -Authentication failed. -Authentication failed. - -Cannot find %x. -Cannot find %x. - -Please authorize access to user account %x. -Please authorise access to user account %x. - -Cannot determine free disk space for %x. -Cannot determine free disk space for %x. - -Unable to disconnect from %x. -Unable to disconnect from %x. - -Unable to access %x. -Unable to access %x. - -Failed to get information about server %x. -Failed to get information about server %x. - -Cannot monitor directory %x. -Cannot monitor directory %x. - -Cannot find device %x. -Cannot find device %x. - -Cannot open directory %x. -Cannot open directory %x. - -Unsupported item type. -Unsupported item type. - -Incorrect command line: -Incorrect command line: - -The server does not support authentication via %x. -The server does not support authentication via %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Active connections: %x -Active connections: %x - -Failed to open SFTP channel number %x. -Failed to open SFTP channel number %x. - Drag && drop Drag && drop @@ -747,6 +750,9 @@ Actual: %y bytes Command line: Command line: +&Hide console window +&Hide console window + The command is triggered if: - files or subfolders change @@ -782,8 +788,8 @@ The command is triggered if: Waiting until directory is available: Waiting until directory is available: -&Restore -&Restore +&Configure +&Configure &Show error message &Show error message @@ -818,8 +824,8 @@ The command is triggered if: Scanning... Scanning... -job name -job name +configuration file +configuration file System: Sleep System: Sleep @@ -830,8 +836,8 @@ The command is triggered if: Nothing to synchronize Nothing to synchronise -Executing command %x -Executing command %x +Executing command: +Executing command: You can switch to FreeFileSync's main window to resolve this issue. You can switch to FreeFileSync's main window to resolve this issue. @@ -1031,6 +1037,12 @@ The command is triggered if: Match case Match case +Processed: +Processed: + +Remaining: +Remaining: + New New @@ -1267,14 +1279,17 @@ The command is triggered if: &Don't show this dialog again &Don't show this dialogue again -Items found: -Elements found: +Bytes: +Bytes: -Time remaining: -Time remaining: +Items: +Items: -Time elapsed: -Time elapsed: +Synchronizing... +Synchronising... + +Minimize to notification area +Minimise to notification area Bytes Bytes @@ -1282,12 +1297,6 @@ The command is triggered if: Items Items -Synchronizing... -Synchronising... - -Minimize to notification area -Minimise to notification area - When finished: When finished: @@ -1363,6 +1372,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: &Delete logs after x days: +Notification sounds: +Notification sounds: + +Synchronization finished: +Synchronisation finished: + Customize context menu: Customise context menu: @@ -1567,12 +1582,6 @@ This guarantees a consistent state even in case of a serious error. &Delete &Delete -Include all -Include all - -Exclude all -Exclude all - Show icons: Show icons: @@ -1609,6 +1618,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save Do&n't save +%x cannot be renamed. +%x cannot be renamed. + +New name: +New name: + +Rename Configuration +Rename Configuration + +Configuration name must not be empty. +Configuration name must not be empty. + +&Rename... +&Rename... + Hide configuration Hide configuration @@ -1720,8 +1744,8 @@ This guarantees a consistent state even in case of a serious error. Password: Password: -Key password: -Key password: +Key passphrase: +Key passphrase: Please enter a file path. Please enter a file path. @@ -1885,6 +1909,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. Minimum version count must be smaller than maximum count. +&Restore +&Restore + Files Files @@ -2002,12 +2029,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. Cannot change process I/O priorities. -Unable to shut down the system. -Unable to shut down the system. - Checking recycle bin failed for folder %x. Checking recycle bin failed for folder %x. +Unable to shut down the system. +Unable to shut down the system. + Prepare installation Prepare installation diff --git a/FreeFileSync/Build/Resources/Languages/french.lng b/FreeFileSync/Build/Resources/Languages/french.lng index cd449f40..aee43f7c 100755 --- a/FreeFileSync/Build/Resources/Languages/french.lng +++ b/FreeFileSync/Build/Resources/Languages/french.lng @@ -7,18 +7,6 @@ n <= 1 ? 0 : 1 -Checking file permissions failed for folder %x. - - -Executing command: - - -&Configure - - -&Hide console window - - Cannot read file %x. Impossible de lire le fichier %x. @@ -489,6 +477,27 @@ Trouvé : %y octets Update attributes on right Mise à jour des attributs à droite +Error parsing file %x, row %y, column %z. +Erreur lors de l'analyse du fichier %x, ligne %y, colonne %z. + +Services +Services + +Show All +Tout afficher + +Hide Others +Masquer les autres + +Hide %x +Masquer %x + +Quit %x +Quitter %x + +Cannot set directory locks for the following folders: +Impossible de verrouiller les répertoires des dossiers suivants : + Errors: Erreurs : @@ -513,27 +522,6 @@ Trouvé : %y octets Cleaning up log files: Nettoyage des journaux : -Error parsing file %x, row %y, column %z. -Erreur lors de l'analyse du fichier %x, ligne %y, colonne %z. - -Services -Services - -Show All -Tout afficher - -Hide Others -Masquer les autres - -Hide %x -Masquer %x - -Quit %x -Quitter %x - -Cannot set directory locks for the following folders: -Impossible de verrouiller les répertoires des dossiers suivants : - 1 thread %x threads @@ -636,8 +624,8 @@ Trouvé : %y octets Cannot find folder %x. Dossier %x introuvable. -Target folder %x already existing. -Le dossier destination %x existe déjà. +Target folder %x is already existing, but was not available during folder comparison. +Le dossier cible %x existe déjà, mais n'est pas disponible pendant la comparaison des dossiers. Target folder input field must not be empty. Le champ dossier de destination ne doit pas être vide. @@ -666,8 +654,8 @@ Trouvé : %y octets Some files will be synchronized as part of multiple base folders. Certains fichiers seront synchronisés comme éléments de plusieurs dossiers de base. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Pour éviter les conflits, configurez les filtres d'exclusion afin que chaque fichier mis à jour ne soit traité que par un seul dossier de base. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Pour éviter les conflits, veuillez configurer les filtres d'exclusion afin que chaque fichier mis à jour soit inclus par un seul dossier de base. Versioning folder: Dossier de gestion des versions : @@ -759,6 +747,9 @@ Trouvé : %y octets Command line: Ligne de commande : +&Hide console window +&Masquer la fenêtre de console + The command is triggered if: - files or subfolders change @@ -794,6 +785,9 @@ La commande est déclenchée si : Waiting until directory is available: En attente de la disponibilité du répertoire : +&Configure +&Configurer + &Show error message &Afficher les messages d'erreur @@ -827,8 +821,8 @@ La commande est déclenchée si : Scanning... Lecture en cours ... -job name -nom du job +configuration file +Fichier de configuration System: Sleep Système : Mise en veille @@ -839,6 +833,9 @@ La commande est déclenchée si : Nothing to synchronize Rien à synchroniser +Executing command: +Exécution de la commande : + You can switch to FreeFileSync's main window to resolve this issue. Vous pouvez basculer vers la fenêtre principale de FreeFileSync pour résoudre ce problème. @@ -1037,6 +1034,12 @@ La commande est déclenchée si : Match case Respect de la casse +Processed: +Traité : + +Remaining: +Restant : + New Nouveau @@ -1273,17 +1276,11 @@ La commande est déclenchée si : &Don't show this dialog again &Ne plus afficher cette boîte de dialogue -Items found: -Élements trouvés : - -Time remaining: -Temps restant : +Bytes: +Octets : -Bytes -Octets - -Items -Eléments +Items: +Elément : Synchronizing... Synchronisation en cours ... @@ -1291,6 +1288,12 @@ La commande est déclenchée si : Minimize to notification area Réduction à la zone de notification +Bytes +Octets + +Items +Eléments + When finished: A la fin : @@ -1366,6 +1369,12 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. &Delete logs after x days: &Supprimer les journaux après x jours : +Notification sounds: +Son de la notification : + +Synchronization finished: +Synchronisation terminée : + Customize context menu: Personnaliser le menu contextuel : @@ -1516,33 +1525,6 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. &Execute &Exécuter - -1 directory -%x directories - - -%x répertoire -%x répertoires - - - -1 file -%x files - - -%x fichier -%x fichiers - - - -Showing %y of 1 row -Showing %y of %x rows - - -Affiche %y sur %x ligne -Affiche %y sur %x lignes - - Set direction: Choix de la direction : @@ -1606,6 +1588,21 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Do&n't save &Ne pas Sauvegarder +%x cannot be renamed. +%x ne peut être renommé. + +New name: +Nouveau Nom : + +Rename Configuration +Renommer la configuration + +Configuration name must not be empty. +Le nom de configuration ne doit pas être vide. + +&Rename... +&Renommer... + Hide configuration Masquer la configuration @@ -1666,6 +1663,33 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. All files are in sync Tous les fichiers sont synchronisés + +1 directory +%x directories + + +%x répertoire +%x répertoires + + + +1 file +%x files + + +%x fichier +%x fichiers + + + +Showing %y of 1 row +Showing %y of %x rows + + +Affiche %y sur %x ligne +Affiche %y sur %x lignes + + Cannot find %x Impossible de trouver %x @@ -1717,8 +1741,8 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. Password: Mot de passe : -Key password: -Clé du mot de passe : +Key passphrase: +Phrase secrète : Please enter a file path. Veuillez entrer un chemin d'accès. @@ -1951,6 +1975,9 @@ Cela garantit la cohérence du système de fichiers en cas d'erreur grave. The file is locked by another process: Le fichier est verrouillé par un autre process : +Failed to determine file permission support for folder %x. +Impossible de déterminer les autorisations de fichier du dossier %x. + Cannot read security context of %x. Impossible de lire les paramètres de sécurité de %x. diff --git a/FreeFileSync/Build/Resources/Languages/german.lng b/FreeFileSync/Build/Resources/Languages/german.lng index 6bc094dd..45c61939 100755 --- a/FreeFileSync/Build/Resources/Languages/german.lng +++ b/FreeFileSync/Build/Resources/Languages/german.lng @@ -654,8 +654,8 @@ Tatsächlich: %y bytes Some files will be synchronized as part of multiple base folders. Einige Dateien werden als Teil mehrerer Basisordner synchronisiert werden. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Um Konflikte zu vermeiden sollten Ausschlussfilter erstellt werden, so dass jede aktualisierte Datei nur von einem Basisordner berücksichtigt wird. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Um Konflikte zu vermeiden sollten Ausschlussfilter erstellt werden, so dass jede aktualisierte Datei nur einem Basisordner zugeordnet wird. Versioning folder: Versionierungsordner: @@ -821,8 +821,8 @@ Die Befehlszeile wird ausgelöst, wenn: Scanning... Suche Dateien... -job name -Auftragsname +configuration file +Konfigurationsdatei System: Sleep System: Energie sparen @@ -1034,6 +1034,12 @@ Die Befehlszeile wird ausgelöst, wenn: Match case Groß-/Kleinschreibung +Processed: +Verarbeitet: + +Remaining: +Verbleibend: + New Neu @@ -1270,17 +1276,11 @@ Die Befehlszeile wird ausgelöst, wenn: &Don't show this dialog again &Diesen Dialog nicht mehr anzeigen -Items found: -Gefundene Elemente: +Bytes: +Bytes: -Time remaining: -Verbleibende Zeit: - -Bytes -Bytes - -Items -Elemente +Items: +Elemente: Synchronizing... Synchronisiere... @@ -1288,6 +1288,12 @@ Die Befehlszeile wird ausgelöst, wenn: Minimize to notification area In das Benachrichtigungsfeld minimieren +Bytes +Bytes + +Items +Elemente + When finished: Wenn fertig: @@ -1735,8 +1741,8 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert. Password: Passwort: -Key password: -Schlüsselpasswort: +Key passphrase: +Passphrase für Schlüssel: Please enter a file path. Bitte geben Sie einen Dateipfad ein. @@ -1969,8 +1975,8 @@ Dadurch wird ein konsistenter Datenstand auch bei schweren Fehlern garantiert. The file is locked by another process: Die Datei wird von einem anderen Prozess gesperrt: -Checking file permissions failed for folder %x. -Die Prüfung der Dateiberechtigungen für Ordner %x ist fehlgeschlagen. +Failed to determine file permission support for folder %x. +Die Prüfung auf Unterstützung von Dateiberechtigungen für Ordner %x ist fehlgeschlagen. Cannot read security context of %x. Der Sicherheitskontext von %x kann nicht gelesen werden. diff --git a/FreeFileSync/Build/Resources/Languages/greek.lng b/FreeFileSync/Build/Resources/Languages/greek.lng index 1fcaedac..85330175 100755 --- a/FreeFileSync/Build/Resources/Languages/greek.lng +++ b/FreeFileSync/Build/Resources/Languages/greek.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +Δεν μπορεί να γίνει ανάγνωση του αρχείου %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Μη αναμενόμενο μέγεθος της ροής δεδομένων. +Αναμενόμενο: %x bytes +Βρέθηκε: %y bytes + + +Cannot write file %x. +Δεν μπορεί να γίνει εγγραφή του αρχείου %x. + +Cannot write permissions of %x. +Δεν μπορεί να γίνει εγγραφή των δικαιωμάτων πρόσβασης του %x. + +Operation not supported between different devices. +Η λειτουργία δεν υποστηρίζεται μεταξύ διαφορετικών χώρων αποθήκευσης. + +Cannot delete file %x. +Δεν μπορεί να διαγραφεί το αρχείο %x. + +Cannot delete symbolic link %x. +Δεν μπορεί να διαγραφεί ο συμβολικός σύνδεσμος %x. + +Cannot delete directory %x. +Δεν μπορεί να διαγραφεί ο υποκατάλογος %x. + +Cannot move file %x to %y. +Δεν μπορεί το αρχείο %x να μεταφερθεί στο %y. + +Cannot copy symbolic link %x to %y. +Αδυναμία αντιγραφής του συμβολικού συνδέσμου %x στο %y. + +Error Code %x +Κωδικός Σφάλματος %x + +Cannot read directory %x. +Δεν μπορεί να γίνει ανάγνωση του καταλόγου %x. + +Cannot write modification time of %x. +Δεν μπορεί να γίνει εγγραφή της ώρας τροποποίησης του %x. + +Cannot read file attributes of %x. +Δεν μπορεί να γίνει ανάγνωση των χαρακτηριστικών του αρχείου %x. + +Cannot create directory %x. +Δεν μπορεί να δημιουργηθεί ο υποκατάλογος %x. + +Cannot determine final path for %x. +Δεν μπορεί να προσδιοριστεί η τελική διαδρομή για το %x. + +Operation not supported by device. +Η λειτουργία δεν υποστηρίζεται από το χώρο αποθήκευσης. + +Cannot resolve symbolic link %x. +Ο συμβολικός σύνδεσμος %x δεν μπορεί να επιλυθεί. + +Unable to move %x to the recycle bin. +Δεν ήταν δυνατή η μεταφορά του %x στον κάδο ανακύκλωσης. + +Authentication completed. +Ολοκληρώθηκε η επαλήθευση ταυτότητας. + +You may close this page now and continue with FreeFileSync. +Τώρα μπορείτε να κλείσετε αυτή τη σελίδα και να συνεχίσετε το FreeFileSync. + +Authentication failed. +Η επαλήθευση ταυτότητας απέτυχε. + +Unable to connect to %x. +Δεν μπορεί να πραγματοποιηθεί σύνδεση με το %x. + +Cannot find %x. +Το %x δεν μπορεί να βρεθεί. + +The name %x is used by more than one item in the folder. +Το όνομα %x χρησιμοποιείται για περισσότερα από ένα αρχεία στον φάκελο. + +Please authorize access to user account %x. +Παρακαλούμε εξουσιοδοτείστε την πρόσβαση στο λογαριασμό χρήστη %x. + +Cannot open file %x. +Δεν είναι δυνατό το άνοιγμα του αρχείου %x. + +The name %x is already used by another item. +Το όνομα %x χρησιμοποιείται ήδη από άλλο στοιχείο. + +Cannot determine free disk space for %x. +Δεν μπορεί να υπολογιστεί ο ελεύθερος χώρος του δίσκου %x. + +Unable to disconnect from %x. +Αδυναία αποσύνδεσης από το %x. + +Unable to access %x. +Δεν είναι δυνατή η πρόσβαση στο %x. + +Failed to get information about server %x. +Αποτυχία λήψης πληροφοριών από τον διακομιστή %x. + +Cannot monitor directory %x. +Δεν είναι δυνατή η παρακολύθηση του υποκαταλόγου %x. + +Cannot find device %x. +Ο χώρος αποθήκευσης %x δεν μπορεί να βρεθεί. + +Cannot open directory %x. +Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x. + +Unsupported item type. +Μη υποστηριζόμενος τύπος στοιχείου. + +Incorrect command line: +Εσφαλμένη γραμμή εντολών: + +The server does not support authentication via %x. +Ο εξυπηρετητής δεν υποστηρίζει επαλήθευση ταυτότητας μέσω %x. + +Required: +Απαιτείται: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Το χρονικό όριο της λειτουργίας έληξε μετά από 1 δευτερόλεπτο. +Το χρονικό όριο της λειτουργίας έληξε μετά από %x δευτερόλεπτα. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Δεν είναι δυνατή η αναμονή περισσότερων από 1 σύνδεσης τη φορά. +Δεν είναι δυνατή η αναμονή περισσότερων από %x συνδέσεων τη φορά. + + +Active connections: %x +Ενεργές συνδέσεις: %x + +Failed to open SFTP channel number %x. +Αποτυχία ανοίγματος του SFTP καναλιού με αριθμό %x. + Both sides have changed since last synchronization. Και οι δυο πλευρές έχουν αλλάξει από τον τελευταίο συγχρονισμό. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Τα αρχεία εγκατάστασης είναι κατεστραμμένα. Παρακαλούμε επανεγκαταστείστε το FreeFileSync. -Cannot load file %x. -Το αρχείο %x δεν ήταν δυνατόν να φορτωθεί. - Cannot find the following folders: Οι ακόλουθοι φάκελοι δεν ήταν δυνατό να βρεθούν: @@ -128,7 +274,7 @@ Ανίχνευση: Comparison finished: -Η σύγκριση ολοκληρώθηκε: +Ολοκλήρωση σύγκρισης: 1 item found @@ -139,6 +285,9 @@ βρέθηκαν %x στοιχεία +Time elapsed: +Πέρασε χρόνος: + File %x has an invalid date. Το αρχείο %x δεν έχει έγκυρη ημερομηνία. @@ -157,9 +306,6 @@ Items differ in attributes only Τα στοιχεία διαφέρουν μόνο ως προς τα χαρακτηριστικά τους -The name %x is used by more than one item in the folder. -Το όνομα %x χρησιμοποιείται για περισσότερα από ένα αρχεία στον φάκελο. - Resolving symbolic link %x Επίλυση του συμβολικού συνδέσμου %x @@ -220,6 +366,15 @@ Out of memory. Ανεπαρκής μνήμη. +Show in Explorer +Εμφάνιση στην Εξερεύνηση + +Open with default application +Άνοιγμα με την προεπιλεγμένη εφαρμογή + +Browse directory +Αναζήτηση υποκαταλόγου + Database file %x is incompatible. Το αρχείο βάσης δεδομένων %x δεν είναι συμβατό. @@ -232,12 +387,6 @@ Database file is corrupted: Το αρχείο βάσης δεδομένων είναι κατεστραμμένο: -Cannot write file %x. -Δεν μπορεί να γίνει εγγραφή του αρχείου %x. - -Cannot read file %x. -Δεν μπορεί να γίνει ανάγνωση του αρχείου %x. - The database files do not yet contain information about the last synchronization. Τα αρχεία βάσης δεδομένων δεν περιέχουν ακόμα πληροφορίες για τον τελευταίο συγχρονισμό. @@ -256,9 +405,6 @@ Cannot get process information. Δεν μπορούν να ληφθούν πληροφορίες για τις τρέχουσες διαδικασίες. -Cannot read file attributes of %x. -Δεν μπορεί να γίνει ανάγνωση των χαρακτηριστικών του αρχείου %x. - Waiting while directory is locked: Αναμονή μέχρι να κλειδωθεί ο υποκατάλογος: @@ -385,27 +531,12 @@ %x νήματα -Cannot read directory %x. -Δεν μπορεί να γίνει ανάγνωση του καταλόγου %x. - %x/sec %x/δευτερόλεπτο %x items %x στοιχεία -Show in Explorer -Εμφάνιση στην Εξερεύνηση - -Open with default application -Άνοιγμα με την προεπιλεγμένη εφαρμογή - -Browse directory -Αναζήτηση υποκαταλόγου - -Unable to connect to %x. -Δεν μπορεί να πραγματοποιηθεί σύνδεση με το %x. - Completed successfully Ολοκληρώθηκε επιτυχώς @@ -451,9 +582,6 @@ Cannot write file attributes of %x. Δεν μπορεί να γίνει εγγραφή των χαρακτηριστικών αρχείου του %x. -Cannot open file %x. -Δεν είναι δυνατό το άνοιγμα του αρχείου %x. - %x and %y have different content. Τα %x και %y έχουν διαφορετικό περιεχόμενο. @@ -484,29 +612,20 @@ Source item %x not found Το στοιχείο προέλευσης %x δεν βρέθηκε -Cannot move file %x to %y. -Δεν μπορεί το αρχείο %x να μεταφερθεί στο %y. - Parent folder %x is not existing. Ο γονικός φάκελος %x δεν υπάρχει. -The name %x is already used by another item. -Το όνομα %x χρησιμοποιείται ήδη από άλλο στοιχείο. - Cannot copy file %x to %y. Δεν μπορεί να αντιγραφεί το αρχείο %x στο %y. -Cannot copy symbolic link %x to %y. -Αδυναμία αντιγραφής του συμβολικού συνδέσμου %x στο %y. - Creating a Volume Shadow Copy for %x... Δημιουργία Σκιώδους Αντίγραφου Τόμου για το %x... Cannot find folder %x. Ο φάκελος %x δεν μπορεί να βρεθεί. -Target folder %x already existing. -Ο φάκελος-στόχος %x υπάρχει ήδη. +Target folder %x is already existing, but was not available during folder comparison. +Ο φάκελος-στόχος %x υπάρχει ήδη, αλλά δεν ήταν διαθέσιμος κατά τη σύγκριση φακέλων. Target folder input field must not be empty. Το πεδίο εισαγωγής του φακέλου-στόχου πρέπει να μην είναι κενό. @@ -529,17 +648,14 @@ Not enough free disk space available in: Δεν υπάρχει αρκετός διαθέσιμος χώρος στο δίσκο: -Required: -Απαιτείται: - Available: Διαθέσιμος: Some files will be synchronized as part of multiple base folders. Μερικά αρχεία θα συγχρονιστούν ως μέρη πολλαπλών βασικών φακέλων. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Για να αποφύγετε διενέξεις, δημιουργείστε φίλτρα εξαίρεσης, ώστε κάθε ενημερωμένο αρχείο να εξετάζεται μόνο από έναν βασικό φάκελο. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Για να αποφευχθούν οι διενέξεις, χρειάζεται να δημιουργηθούν φίλτρα, έτσι ώστε κάθε αρχείο να συγχρονίζεται μόνο από έναν βασικό φάκελο. Versioning folder: Διατήρηση παλιών εκδόσεων του φακέλου: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Δεν ήταν δυνατή η δημιουργία χρονικής σήμανσης για τη διατήρηση παλιών εκδόσεων: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Μη αναμενόμενο μέγεθος της ροής δεδομένων. -Αναμενόμενο: %x bytes -Βρέθηκε: %y bytes - - -Cannot write permissions of %x. -Δεν μπορεί να γίνει εγγραφή των δικαιωμάτων πρόσβασης του %x. - -Operation not supported between different devices. -Η λειτουργία δεν υποστηρίζεται μεταξύ διαφορετικών χώρων αποθήκευσης. - -Cannot delete file %x. -Δεν μπορεί να διαγραφεί το αρχείο %x. - -Cannot delete symbolic link %x. -Δεν μπορεί να διαγραφεί ο συμβολικός σύνδεσμος %x. - -Cannot delete directory %x. -Δεν μπορεί να διαγραφεί ο υποκατάλογος %x. - -Error Code %x -Κωδικός Σφάλματος %x - -Cannot write modification time of %x. -Δεν μπορεί να γίνει εγγραφή της ώρας τροποποίησης του %x. - -Cannot create directory %x. -Δεν μπορεί να δημιουργηθεί ο υποκατάλογος %x. - -Cannot determine final path for %x. -Δεν μπορεί να προσδιοριστεί η τελική διαδρομή για το %x. - -Operation not supported by device. -Η λειτουργία δεν υποστηρίζεται από το χώρο αποθήκευσης. - -Cannot resolve symbolic link %x. -Ο συμβολικός σύνδεσμος %x δεν μπορεί να επιλυθεί. - -Unable to move %x to the recycle bin. -Δεν ήταν δυνατή η μεταφορά του %x στον κάδο ανακύκλωσης. - -Authentication completed. -Ολοκληρώθηκε η επαλήθευση ταυτότητας. - -You may close this page now and continue with FreeFileSync. -Τώρα μπορείτε να κλείσετε αυτή τη σελίδα και να συνεχίσετε το FreeFileSync. - -Authentication failed. -Η επαλήθευση ταυτότητας απέτυχε. - -Cannot find %x. -Το %x δεν μπορεί να βρεθεί. - -Please authorize access to user account %x. -Παρακαλούμε εξουσιοδοτείστε την πρόσβαση στο λογαριασμό χρήστη %x. - -Cannot determine free disk space for %x. -Δεν μπορεί να υπολογιστεί ο ελεύθερος χώρος του δίσκου %x. - -Unable to disconnect from %x. -Αδυναία αποσύνδεσης από το %x. - -Unable to access %x. -Δεν είναι δυνατή η πρόσβαση στο %x. - -Failed to get information about server %x. -Αποτυχία λήψης πληροφοριών από τον διακομιστή %x. - -Cannot monitor directory %x. -Δεν είναι δυνατή η παρακολύθηση του υποκαταλόγου %x. - -Cannot find device %x. -Ο χώρος αποθήκευσης %x δεν μπορεί να βρεθεί. - -Cannot open directory %x. -Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x. - -Unsupported item type. -Μη υποστηριζόμενος τύπος στοιχείου. - -Incorrect command line: -Εσφαλμένη γραμμή εντολών: - -The server does not support authentication via %x. -Ο εξυπηρετητής δεν υποστηρίζει επαλήθευση ταυτότητας μέσω %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Το χρονικό όριο της λειτουργίας έληξε μετά από 1 δευτερόλεπτο. -Το χρονικό όριο της λειτουργίας έληξε μετά από %x δευτερόλεπτα. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Δεν είναι δυνατή η αναμονή περισσότερων από 1 σύνδεσης τη φορά. -Δεν είναι δυνατή η αναμονή περισσότερων από %x συνδέσεων τη φορά. - - -Active connections: %x -Ενεργές συνδέσεις: %x - -Failed to open SFTP channel number %x. -Αποτυχία ανοίγματος του SFTP καναλιού με αριθμό %x. - Drag && drop Μεταφορά && Απόθεση @@ -747,6 +747,9 @@ Actual: %y bytes Command line: Γραμμή εντολών: +&Hide console window +&Απόκρυψη της κονσόλας + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ The command is triggered if: Waiting until directory is available: Αναμονή μέχρι ο φάκελος να γίνει διαθέσιμος: -&Restore -&Επαναφορά +&Configure +&Ρυθμίσεις &Show error message &Εμφάνιση μηνύματος σφαλμάτων @@ -818,8 +821,8 @@ The command is triggered if: Scanning... Ανίχνευση... -job name -όνομα ενέργειας +configuration file +αρχείο παραμέτρων System: Sleep Σύστημα: Αναστολή λειτουργίας @@ -830,8 +833,8 @@ The command is triggered if: Nothing to synchronize Δεν υπάρχει τίποτα προς συγχρονισμό -Executing command %x -Εκτέλεση εντολής %x +Executing command: +Εκτέλεση εντολής: You can switch to FreeFileSync's main window to resolve this issue. Μπορείτε να επιστρέψετε στο κύριο παράθυρο του FreeFileSync για να επιλύσετε αυτό το θέμα. @@ -1031,6 +1034,12 @@ The command is triggered if: Match case Ταίριασμα κεφαλαίων/πεζών +Processed: +Ολοκληρώθηκαν: + +Remaining: +Απομένουν: + New Δημιουργία @@ -1267,14 +1276,17 @@ The command is triggered if: &Don't show this dialog again &Να μην εμφανιστεί ξανά αυτό το μήνυμα -Items found: -Βρέθηκαν στοιχεία: +Bytes: +Bytes: -Time remaining: -Απομένει χρόνος: +Items: +Στοιχεία: -Time elapsed: -Πέρασε χρόνος: +Synchronizing... +Γίνεται συγχρονισμός... + +Minimize to notification area +Ελαχιστοποίηση στην περιοχή ειδοποιήσεων Bytes Bytes @@ -1282,12 +1294,6 @@ The command is triggered if: Items Στοιχεία -Synchronizing... -Γίνεται συγχρονισμός... - -Minimize to notification area -Ελαχιστοποίηση στην περιοχή ειδοποιήσεων - When finished: Μετά την ολοκλήρωση: @@ -1363,6 +1369,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: &Διαγραφή των αρχείων καταγραφής μετά από x ημέρες: +Notification sounds: +Ήχοι ειδοποίησης: + +Synchronization finished: +Ολοκλήρωση συγχρονισμού: + Customize context menu: Προσαρμογή μενού περιβάλλοντος: @@ -1567,12 +1579,6 @@ This guarantees a consistent state even in case of a serious error. &Delete &Διαγραφή -Include all -Συμπερίληψη όλων - -Exclude all -Εξαίρεση όλων - Show icons: Εμφάνιση εικονιδίων: @@ -1609,6 +1615,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save Να &μην αποθηκευθούν +%x cannot be renamed. +Το %x δεν μπορεί να μετονομαστεί. + +New name: +Νέο όνομα: + +Rename Configuration +Μετονομασία αρχείου παραμέτρων + +Configuration name must not be empty. +Το όνομα του αρχείου παραμέτρων δεν μπορεί να είναι κενό. + +&Rename... +&Μετονομασία... + Hide configuration Απόκρυψη παραμέτρων συγχρονισμού @@ -1720,8 +1741,8 @@ This guarantees a consistent state even in case of a serious error. Password: Συνθηματικό: -Key password: -Συνθηματικό κλειδιού: +Key passphrase: +Φάση πρόσβασης κλειδιού: Please enter a file path. Παρακαλούμε εισάγετε μια διαδρομή αρχείου. @@ -1885,6 +1906,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. Ο ελάχιστος αριθμός παλιών εκδόσεων πρέπει να είναι μικρότερος από τον μέγιστο αριθμό. +&Restore +&Επαναφορά + Files Αρχεία @@ -1951,6 +1975,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: Το αρχείο είναι κλειδωμένο από μια άλλη διαδικασία: +Failed to determine file permission support for folder %x. +Αποτυχία προσδιορισμού εάν ο φάκελος %x υποστηρίζει δικαιώματα πρόσβασης. + Cannot read security context of %x. Δεν μπορεί να αναγνωσθεί το περιβάλλον ασφαλείας του %x. @@ -2002,12 +2029,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. Δεν μπορούν να αλλάξουν οι προτεραιότητες I/O της διεργασίας. -Unable to shut down the system. -Αδυναμία τερματισμού λειτουργίας του συστήματος. - Checking recycle bin failed for folder %x. Ο έλεγχος του κάδου ανακύκλωσης απέτυχε για τον υποκατάλογο %x. +Unable to shut down the system. +Αδυναμία τερματισμού λειτουργίας του συστήματος. + Prepare installation Προετοιμασία εγκατάστασης diff --git a/FreeFileSync/Build/Resources/Languages/hebrew.lng b/FreeFileSync/Build/Resources/Languages/hebrew.lng index aa68375b..0d5d3eb1 100755 --- a/FreeFileSync/Build/Resources/Languages/hebrew.lng +++ b/FreeFileSync/Build/Resources/Languages/hebrew.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +לא יכול לקרוא קובץ %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +גודל בלתי צפוי של זרם נתונים. +צפוי: %x בתים +בפועל: %y בתים + + +Cannot write file %x. +לא יכול לכתוב קובץ %x. + +Cannot write permissions of %x. +לא יכול לכתוב הרשאות של %x. + +Operation not supported between different devices. +הפעולה אינה נתמכת בין התקנים שונים. + +Cannot delete file %x. +לא יכול למחוק קובץ %x. + +Cannot delete symbolic link %x. +לא ניתן למחוק קישור סימבולי %x. + +Cannot delete directory %x. +לא יכול למחוק מחיצה %x. + +Cannot move file %x to %y. +לא יכול להעביר קובץ %x אל %y. + +Cannot copy symbolic link %x to %y. +לא יכול להעתיק קישור סימבולי %x אל %y. + +Error Code %x +קוד שגיאה %x + +Cannot read directory %x. +לא ניתן לקרוא מחיצה %x. + +Cannot write modification time of %x. +לא יכול לרשום זמן שינוי של %x. + +Cannot read file attributes of %x. +לא יכול לקרוא תכונות של קובץ %x. + +Cannot create directory %x. +לא יכול ליצור מחיצה %x. + +Cannot determine final path for %x. +לא יכול לקבוע את המסלול הסופי ל %x. + +Operation not supported by device. +הפעולה אינה נתמכת על ידי ההתקן. + +Cannot resolve symbolic link %x. +לא יכול לפענח את הקישור הסימבולי %x. + +Unable to move %x to the recycle bin. +לא יכול להעביר את %x לסל המחזור. + +Authentication completed. +האימות הושלם. + +You may close this page now and continue with FreeFileSync. +אתה יכול לסגור דף זה עכשיו ולהמשיך עם FreeFileSync. + +Authentication failed. +האימות נכשל. + +Unable to connect to %x. +לא יכול להתחבר אל %x. + +Cannot find %x. +לא מוצא %x. + +The name %x is used by more than one item in the folder. +בשם %x נעשה שימוש יותר מפעם אחת בתיקייה. + +Please authorize access to user account %x. +בבקשה הרשה גישה לחשבון משתמש %x. + +Cannot open file %x. +לא יכול לפתוח קובץ %x. + +The name %x is already used by another item. +השם %x כבר בשימוש על ידי פריט אחר. + +Cannot determine free disk space for %x. +לא ניתן לקבוע שטח דיסק פנוי עבור %x. + +Unable to disconnect from %x. +לא ניתן להתנתק מ %x. + +Unable to access %x. +לא ניתן לגשת אל %x. + +Failed to get information about server %x. +נכשלה קבלת מידע על שרת %x. + +Cannot monitor directory %x. +לא יכול לנטר מחיצה %x. + +Cannot find device %x. +לא מוצא התקן %x. + +Cannot open directory %x. +לא יכול לפתוח מחיצה %x. + +Unsupported item type. +סוג פריט לא נתמך. + +Incorrect command line: +שורת פקודה לא תקינה: + +The server does not support authentication via %x. +השרת אינו תומך באימות באמצעות %x. + +Required: +נדרש: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +זמן הפעולה פקע לאחר שניה 1. +זמן הםעולה פקע לאחר %x שניות. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +לא ניתן להמתין ליותר מחיבור 1 בכל פעם. +לא ניתן להמתין ליותר מ %x חיבורים בכל פעם. + + +Active connections: %x +חיבורים פעילים: %x + +Failed to open SFTP channel number %x. +נכשלה פתיחת ערוץ SFTP מספר %x. + Both sides have changed since last synchronization. שני הצדדים שונו מאז הסנכרון האחרון. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. קבצי ההתקנה פגומים. בבקשה התקן מחדש את FreeFileSync. -Cannot load file %x. -לא יכול לטעון קובץ %x. - Cannot find the following folders: לא יכול למצוא את התיקיות הבאות: @@ -139,6 +285,9 @@ %x פריטים נמצאו +Time elapsed: +זמן שעבר: + File %x has an invalid date. קובץ %x מכיל תאריך שגוי. @@ -157,9 +306,6 @@ Items differ in attributes only פריטים שונים בתכונות בלבד -The name %x is used by more than one item in the folder. -בשם %x נעשה שימוש יותר מפעם אחת בתיקייה. - Resolving symbolic link %x פותר קישור סימבולי %x @@ -220,6 +366,15 @@ Out of memory. תם הזכרון. +Show in Explorer +הראה בסייר הקבצים + +Open with default application +פתח באמצאות האפליקציה המתאימה + +Browse directory +עיין במחיצה + Database file %x is incompatible. קובץ מסד נתונים %x אינו במבנה מתאים. @@ -232,12 +387,6 @@ Database file is corrupted: קובץ בסיס נתונים פגום: -Cannot write file %x. -לא יכול לכתוב קובץ %x. - -Cannot read file %x. -לא יכול לקרוא קובץ %x. - The database files do not yet contain information about the last synchronization. קבצי בסיס הנתונים אינם כוללים עדיין מידע על סינכרון אחרון. @@ -256,9 +405,6 @@ Cannot get process information. לא יכול לקבל את נתוני התהליך. -Cannot read file attributes of %x. -לא יכול לקרוא תכונות של קובץ %x. - Waiting while directory is locked: ממתין בזמן שהמחיצה נעולה: @@ -331,6 +477,27 @@ Update attributes on right עדכן תכונות בצד שמאל +Error parsing file %x, row %y, column %z. +שגיאה בפענוח קובץ %x, שורה %y, טור %z. + +Services +שרותים + +Show All +הראה הכל + +Hide Others +מסתיר אחרים + +Hide %x +מסתיר %x + +Quit %x +יוצא %x + +Cannot set directory locks for the following folders: +אין אפשרות להגדיר נעילות מחיצה עבור התיקיות הבאות: + Errors: שגיאות: @@ -355,27 +522,6 @@ Cleaning up log files: מנקה קבצי יומן: -Error parsing file %x, row %y, column %z. -שגיאה בפענוח קובץ %x, שורה %y, טור %z. - -Services -שרותים - -Show All -הראה הכל - -Hide Others -מסתיר אחרים - -Hide %x -מסתיר %x - -Quit %x -יוצא %x - -Cannot set directory locks for the following folders: -אין אפשרות להגדיר נעילות מחיצה עבור התיקיות הבאות: - 1 thread %x threads @@ -385,27 +531,12 @@ %x תהליכים -Cannot read directory %x. -לא ניתן לקרוא מחיצה %x. - %x/sec %x /שניות %x items %x פריטים -Show in Explorer -הראה בסייר הקבצים - -Open with default application -פתח באמצאות האפליקציה המתאימה - -Browse directory -עיין במחיצה - -Unable to connect to %x. -לא יכול להתחבר אל %x. - Completed successfully הסתיים בהצלחה @@ -451,9 +582,6 @@ Cannot write file attributes of %x. לא יכול לכתוב תכונות קובץ של %x. -Cannot open file %x. -לא יכול לפתוח קובץ %x. - %x and %y have different content. %x ו- %y הם בעלי צוכן שונה. @@ -484,29 +612,20 @@ Source item %x not found פריט מקור %x לא נמצא -Cannot move file %x to %y. -לא יכול להעביר קובץ %x אל %y. - Parent folder %x is not existing. תיקיית אב %x לא קיימת. -The name %x is already used by another item. -השם %x כבר בשימוש על ידי פריט אחר. - Cannot copy file %x to %y. לא יכול להעתיק קובץ %x אל %y. -Cannot copy symbolic link %x to %y. -לא יכול להעתיק קישור סימבולי %x אל %y. - Creating a Volume Shadow Copy for %x... מייצר Volume Shadow Copy עבור %x... Cannot find folder %x. לא מוצא תיקייה %x. -Target folder %x already existing. -תיקיית מטרה %x כבר קיימת. +Target folder %x is already existing, but was not available during folder comparison. +תיקיית יעד %x קיימת, אך לא הייתה זמינהבזמן השוואת התיקיות. Target folder input field must not be empty. קלט תיקיית מטרה אינה יכול להיות ריק. @@ -529,17 +648,14 @@ Not enough free disk space available in: אין מספיק מקום דיסק פנוי ב: -Required: -נדרש: - Available: זמין: Some files will be synchronized as part of multiple base folders. קבצים מסויימים יסונכרנו כחלק מתיקיות בסיס מרובות. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -כדי למנוע התנגשויות, הגדר מסננים לאי הכללת קבצים כך שכל קובץ מעודכן ייחשב על ידי תיקיית בסיס אחת. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +כדי למנוע התנגשויות, הגדר מסנני אי הכללה כך שכל עידכון קובץ יכלל על ידי תיקיית בסיס אחת. Versioning folder: תיקיית גרסאות: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: לא ניתן ליצור תג זמן לגרסאות: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -גודל בלתי צפוי של זרם נתונים. -צפוי: %x בתים -בפועל: %y בתים - - -Cannot write permissions of %x. -לא יכול לכתוב הרשאות של %x. - -Operation not supported between different devices. -הפעולה אינה נתמכת בין התקנים שונים. - -Cannot delete file %x. -לא יכול למחוק קובץ %x. - -Cannot delete symbolic link %x. -לא ניתן למחוק קישור סימבולי %x. - -Cannot delete directory %x. -לא יכול למחוק מחיצה %x. - -Error Code %x -קוד שגיאה %x - -Cannot write modification time of %x. -לא יכול לרשום זמן שינוי של %x. - -Cannot create directory %x. -לא יכול ליצור מחיצה %x. - -Cannot determine final path for %x. -לא יכול לקבוע את המסלול הסופי ל %x. - -Operation not supported by device. -הפעולה אינה נתמכת על ידי ההתקן. - -Cannot resolve symbolic link %x. -לא יכול לפענח את הקישור הסימבולי %x. - -Unable to move %x to the recycle bin. -לא יכול להעביר את %x לסל המחזור. - -Authentication completed. -האימות הושלם. - -You may close this page now and continue with FreeFileSync. -אתה יכול לסגור דף זה עכשיו ולהמשיך עם FreeFileSync. - -Authentication failed. -האימות נכשל. - -Cannot find %x. -לא מוצא %x. - -Please authorize access to user account %x. -בבקשה הרשה גישה לחשבון משתמש %x. - -Cannot determine free disk space for %x. -לא ניתן לקבוע שטח דיסק פנוי עבור %x. - -Unable to disconnect from %x. -לא ניתן להתנתק מ %x. - -Unable to access %x. -לא ניתן לגשת אל %x. - -Failed to get information about server %x. -נכשלה קבלת מידע על שרת %x. - -Cannot monitor directory %x. -לא יכול לנטר מחיצה %x. - -Cannot find device %x. -לא מוצא התקן %x. - -Cannot open directory %x. -לא יכול לפתוח מחיצה %x. - -Unsupported item type. -סוג פריט לא נתמך. - -Incorrect command line: -שורת פקודה לא תקינה: - -The server does not support authentication via %x. -השרת אינו תומך באימות באמצעות %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -זמן הפעולה פקע לאחר שניה 1. -זמן הםעולה פקע לאחר %x שניות. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -לא ניתן להמתין ליותר מחיבור 1 בכל פעם. -לא ניתן להמתין ליותר מ %x חיבורים בכל פעם. - - -Active connections: %x -חיבורים פעילים: %x - -Failed to open SFTP channel number %x. -נכשלה פתיחת ערוץ SFTP מספר %x. - Drag && drop גרור ושחרר @@ -747,6 +747,9 @@ Actual: %y bytes Command line: שורת פקודה: +&Hide console window +&הסתר חלון מסוף + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ The command is triggered if: Waiting until directory is available: מחכה עד שהמחיצה זמינה: -&Restore -&טען מחדש +&Configure +&הגדר &Show error message &הצג הודעת שגיאה @@ -818,8 +821,8 @@ The command is triggered if: Scanning... סורק... -job name -שם משימה +configuration file +קובץ תצורה System: Sleep מערכת: שינה @@ -830,8 +833,8 @@ The command is triggered if: Nothing to synchronize אין מה לסנכרן -Executing command %x -מבצע פקודה %x +Executing command: +מבצע פקודה: You can switch to FreeFileSync's main window to resolve this issue. ניתן לעבור לחלון הראשי של FreeFileSync כדי לפתור את הסוגיה הזו. @@ -1031,6 +1034,12 @@ The command is triggered if: Match case התאם רישיות +Processed: +עבר עיבוד: + +Remaining: +משנה שם: + New חדש @@ -1267,14 +1276,17 @@ The command is triggered if: &Don't show this dialog again &אל תראה דושיח זה שנית -Items found: -אלמנטים נמצאו: +Bytes: +בתים: -Time remaining: -זמן שנשאר: +Items: +פריטים: -Time elapsed: -זמן שעבר: +Synchronizing... +מסנכרן... + +Minimize to notification area +הקטן לאיזור ההתרעות Bytes בתים @@ -1282,12 +1294,6 @@ The command is triggered if: Items פריטים -Synchronizing... -מסנכרן... - -Minimize to notification area -הקטן לאיזור ההתרעות - When finished: לאחר הסיום: @@ -1363,6 +1369,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: &מחק יומנים לאחר x ימים: +Notification sounds: +צלילי הודעה: + +Synchronization finished: +סינכרון הסתים: + Customize context menu: התאמה אישית של תפריט הקשר: @@ -1513,33 +1525,6 @@ This guarantees a consistent state even in case of a serious error. &Execute &בצע - -1 directory -%x directories - - -1 מחיצה -%x מחיצות - - - -1 file -%x files - - -1 קובץ -%x קבצים - - - -Showing %y of 1 row -Showing %y of %x rows - - -מראה %y מתוך שורה 1 -מראה %y מתוך %x שורות - - Set direction: בחר כוון: @@ -1567,12 +1552,6 @@ This guarantees a consistent state even in case of a serious error. &Delete &מחק -Include all -הכלל הכל - -Exclude all -הוצא מן הכלל הכל - Show icons: הצג סמלים: @@ -1609,6 +1588,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save אל &תשמור +%x cannot be renamed. +%x לא ניתן לשנות את שמו. + +New name: +שם חדש: + +Rename Configuration +שנה שם תצורה + +Configuration name must not be empty. +אסור ששם התצורה יהיה ריק. + +&Rename... +&שנה שם... + Hide configuration הסתר תצורה @@ -1669,6 +1663,33 @@ This guarantees a consistent state even in case of a serious error. All files are in sync כל הקבצים מסונכרנים + +1 directory +%x directories + + +1 מחיצה +%x מחיצות + + + +1 file +%x files + + +1 קובץ +%x קבצים + + + +Showing %y of 1 row +Showing %y of %x rows + + +מראה %y מתוך שורה 1 +מראה %y מתוך %x שורות + + Cannot find %x לא מוצא %x @@ -1720,7 +1741,7 @@ This guarantees a consistent state even in case of a serious error. Password: סיסמה: -Key password: +Key passphrase: סיסמת מפתח: Please enter a file path. @@ -1885,6 +1906,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. מונה גירסה מינימלי חייב להיות קטן ממונה גירסה מקסימלי. +&Restore +&טען מחדש + Files קבצים @@ -1951,6 +1975,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: הקובץ נעול ע"י תהליך: +Failed to determine file permission support for folder %x. +נכשל בקביעת תמיכה להרשאות קובץ עבור תיקיה %x. + Cannot read security context of %x. לא יכול לקרוא הקשר בטיחות של %x. @@ -2002,12 +2029,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. לא יכול לשנות קדימויות של תהליך קלט פלט. -Unable to shut down the system. -לא מסוגל לכבות את המערכת. - Checking recycle bin failed for folder %x. בודק כשלון בתא מחזור עבור תיקייה %x. +Unable to shut down the system. +לא מסוגל לכבות את המערכת. + Prepare installation מכין התקנה diff --git a/FreeFileSync/Build/Resources/Languages/hindi.lng b/FreeFileSync/Build/Resources/Languages/hindi.lng index 9094d3e6..c210fdf6 100755 --- a/FreeFileSync/Build/Resources/Languages/hindi.lng +++ b/FreeFileSync/Build/Resources/Languages/hindi.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +फ़ाइल %x पढ़ने में असमर्थ। + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +डेटा स्ट्रीम का आकार अनपेक्षित। +अपेक्षित: %x बाइट्स +वास्तविक: %y बाइट्स + + +Cannot write file %x. +फ़ाइल %x लिखने में असमर्थ। + +Cannot write permissions of %x. +%x की अनुमतियां लिख नहीं सकते। + +Operation not supported between different devices. +विभिन्न उपकरणों के बीच कार्यवाई असमर्थित। + +Cannot delete file %x. +फ़ाइल %x हटा नहीं सकते। + +Cannot delete symbolic link %x. +प्रतीकात्मक कड़ी %x हटाया नहीं जा सकता। + +Cannot delete directory %x. +निर्देशिका %x हटा नहीं सकते। + +Cannot move file %x to %y. +फ़ाइल %x से %y ले जा नाहीं सकते। + +Cannot copy symbolic link %x to %y. +सिंबॉलिक लिंक %x से %y प्रतिलिपित नहीं कर सकते। + +Error Code %x +त्रुटि कोड %x + +Cannot read directory %x. +निर्देशिका %x को पढ़ा नहीं जा सकता। + +Cannot write modification time of %x. +%x का संशोधन समय लिख नहीं सकते। + +Cannot read file attributes of %x. +%x के फ़ाइल गुण पढ़ने में असमर्थ। + +Cannot create directory %x. +%x निर्देशिका बना नहीं सकते। + +Cannot determine final path for %x. +%x का अंतिम पथ निर्धारित नहीं कर सकते। + +Operation not supported by device. +कार्यवाई उपकरण द्वारा असमर्थित। + +Cannot resolve symbolic link %x. +सिंबॉलिक लिंक %x को हल नहीं कर सकते। + +Unable to move %x to the recycle bin. +%x को रीसायकल बिन ले जाने में असमर्थ। + +Authentication completed. +प्रमाणन पूर्ण। + +You may close this page now and continue with FreeFileSync. +आप अब इस पृष्ठ को बंद कर FreeFileSync जारी रख सकते हैं। + +Authentication failed. +प्रमाणन विफल। + +Unable to connect to %x. +%x से कनेक्ट करने में असमर्थ। + +Cannot find %x. +%x नहीं मिला। + +The name %x is used by more than one item in the folder. +%x नाम का उपयोग फ़ोल्डर में एक से अधिक आइटम द्वारा किया गया है। + +Please authorize access to user account %x. +कृपया उपयोगकर्ता खाता %x से पहुँच अधिकृत करें। + +Cannot open file %x. +%x फ़ाइल को खोलने में असमर्थ। + +The name %x is already used by another item. +%x इस नाम का उपयोग पहले से ही किसी अन्य आइटम द्वारा किया गया है। + +Cannot determine free disk space for %x. +%x के लिए खाली डिस्क जगह निर्धारित नहीं कर सकते। + +Unable to disconnect from %x. +%x से सम्पर्क काटने में असमर्थ। + +Unable to access %x. +%x तक पहुँचने में असमर्थ। + +Failed to get information about server %x. +सर्वर %x की जानकारी प्राप्त करने में विफल। + +Cannot monitor directory %x. +निर्देशिका %x की निगरानी कर नहीं सकते। + +Cannot find device %x. +उपकरण %x नहीं मिला। + +Cannot open directory %x. +निर्देशिका %x खोल नहीं सकते। + +Unsupported item type. +असमर्थित आइटम प्रकार। + +Incorrect command line: +अनुचित आदेश-पंक्ति: + +The server does not support authentication via %x. +सर्वर पर %x द्वारा प्रमाणन समर्थित नहीं है। + +Required: +आवश्यक: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +1 सेकंड के बाद कार्यवाई का काल समाप्त हुआ। +%x सेकंड्स के बाद कार्यवाई का काल समाप्त हुआ। + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +एक समय में 1 कनेक्शन से अधिक पर प्रतीक्षा नहीं कर सकते। +एक समय में %x कनेक्शन्स से अधिक पर प्रतीक्षा नहीं कर सकते। + + +Active connections: %x +सक्रिय कनेक्शन्स: %x + +Failed to open SFTP channel number %x. +SFTP चैनल संख्या %x को खोलने में विफल। + Both sides have changed since last synchronization. पिछ्ले सिंक्रनाइज़ेशन के बाद से दोनो तरफ बदलाव है। @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. स्थापना फ़ाइलें दूषित हैं। FreeFileSync पुनर्स्थापित करें। -Cannot load file %x. -फ़ाइल %x लोड करने में असमर्थ। - Cannot find the following folders: निम्न फ़ोलडर्स नहीं मिले: @@ -139,6 +285,9 @@ %x आइटम्स मिले +Time elapsed: +बीता समय: + File %x has an invalid date. %x फ़ाइल का दिनांक अवैध है। @@ -146,7 +295,7 @@ दिनांक: Files have the same date but a different size. -फाइल्स का दिनांक समान है पर आकार भिन्न है। +फाइल्स का दिनांक समान है परंतु आकार भिन्न है। Size: आकार: @@ -157,9 +306,6 @@ Items differ in attributes only आइटम्स के केवल गुण ही भिन्न हैं। -The name %x is used by more than one item in the folder. -%x नाम का उपयोग फ़ोल्डर में एक से अधिक आइटम द्वारा किया गया है। - Resolving symbolic link %x %x प्रतीकात्मक कड़ी को हल किया जा रहा है @@ -220,6 +366,15 @@ Out of memory. स्मृति से बाहर। +Show in Explorer +एक्सप्लोरर में दिखाएं + +Open with default application +डिफ़ॉल्ट अ‍ॅप्लिकेशन के साथ खोलें + +Browse directory +निर्देशिका ब्राउज़ करें + Database file %x is incompatible. डेटाबेस फ़ाइल %x विसंगत है। @@ -232,12 +387,6 @@ Database file is corrupted: डेटाबेस फ़ाइल दूषित है: -Cannot write file %x. -फ़ाइल %x लिखने में असमर्थ। - -Cannot read file %x. -फ़ाइल %x पढ़ने में असमर्थ। - The database files do not yet contain information about the last synchronization. डेटाबेस फ़ाइल्स में अभी तक पिछले सिंक्रनाइज़ेशन की जानकारी नहीं है। @@ -256,9 +405,6 @@ Cannot get process information. प्रक्रिया जानकारी प्राप्त करने में असमर्थ। -Cannot read file attributes of %x. -%x के फ़ाइल गुण पढ़ने में असमर्थ। - Waiting while directory is locked: प्रतीक्षारत जब कि निर्देशिका अवरोधित है: @@ -385,27 +531,12 @@ %x थ्रेड्स -Cannot read directory %x. -निर्देशिका %x को पढ़ा नहीं जा सकता। - %x/sec %x/सेकंड %x items %x आइटम्स -Show in Explorer -एक्सप्लोरर में दिखाएं - -Open with default application -डिफ़ॉल्ट अ‍ॅप्लिकेशन के साथ खोलें - -Browse directory -निर्देशिका ब्राउज़ करें - -Unable to connect to %x. -%x से कनेक्ट करने में असमर्थ। - Completed successfully सफलतापूर्वक पूर्ण हुआ @@ -451,9 +582,6 @@ Cannot write file attributes of %x. %x के फ़ाइल गुण लिख नहीं सकते। -Cannot open file %x. -%x फ़ाइल को खोलने में असमर्थ। - %x and %y have different content. %x और %y की सामग्री भिन्न है। @@ -484,29 +612,20 @@ Source item %x not found स्रोत आइटम %x नहीं मिला -Cannot move file %x to %y. -फ़ाइल %x से %y ले जा नाहीं सकते। - Parent folder %x is not existing. अभिभावक निर्देशिका %x विद्यमान नहीं है। -The name %x is already used by another item. -%x इस नाम का उपयोग पहले से ही किसी अन्य आइटम द्वारा किया गया है। - Cannot copy file %x to %y. फ़ाइल %x से %y प्रतिलिपित नहीं कर सकते। -Cannot copy symbolic link %x to %y. -सिंबॉलिक लिंक %x से %y प्रतिलिपित नहीं कर सकते। - Creating a Volume Shadow Copy for %x... %x के लिए वॉल्यूम शॅडो प्रतिलिपि बनाई जा रही है... Cannot find folder %x. निर्देशिका %x नहीं मिला। -Target folder %x already existing. -गंतव्य निर्देशिका %x पहले से ही विद्यमान है। +Target folder %x is already existing, but was not available during folder comparison. +गंतव्य निर्देशिका %x पहले से विद्यमान है, परंतु वह निर्देशिका तुलना के समय उपलब्ध नहीं थी। Target folder input field must not be empty. गंतव्य निर्देशिका प्रविष्टि खाली नहीं हो सकती। @@ -529,17 +648,14 @@ Not enough free disk space available in: यहाँ पर्याप्त खाली डिस्क जगह उपलब्ध नहीं: -Required: -आवश्यक: - Available: उपलब्ध: Some files will be synchronized as part of multiple base folders. कुछ फ़ाइल्स को एकाधिक आधार निर्देशिकाओं के भाग के रूप में सिंक्रनाइज़ किया जाएगा। -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -विरोधों से बचने के लिए अपवर्जित फ़िल्टर्स सेट करें ताकि प्रत्येक अद्यतित फ़ाइल केवल एक ही आधार निर्देशिका से मानी जाएगी। +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +विरोध टालने के लिए वर्जित फ़िल्टर स्थापित करें ताकि प्रत्येक अद्यतित फ़ाइल केवल एक आधार निर्देशिका द्वारा सम्मिलित हो। Versioning folder: संस्करण निर्देशिका: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: संस्करण के लिए समय मोहर बनाने में असमर्थ: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -डेटा स्ट्रीम का आकार अनपेक्षित। -अपेक्षित: %x बाइट्स -वास्तविक: %y बाइट्स - - -Cannot write permissions of %x. -%x की अनुमतियां लिख नहीं सकते। - -Operation not supported between different devices. -विभिन्न उपकरणों के बीच कार्यवाई असमर्थित। - -Cannot delete file %x. -फ़ाइल %x हटा नहीं सकते। - -Cannot delete symbolic link %x. -प्रतीकात्मक कड़ी %x हटाया नहीं जा सकता। - -Cannot delete directory %x. -निर्देशिका %x हटा नहीं सकते। - -Error Code %x -त्रुटि कोड %x - -Cannot write modification time of %x. -%x का संशोधन समय लिख नहीं सकते। - -Cannot create directory %x. -%x निर्देशिका बना नहीं सकते। - -Cannot determine final path for %x. -%x का अंतिम पथ निर्धारित नहीं कर सकते। - -Operation not supported by device. -कार्यवाई उपकरण द्वारा असमर्थित। - -Cannot resolve symbolic link %x. -सिंबॉलिक लिंक %x को हल नहीं कर सकते। - -Unable to move %x to the recycle bin. -%x को रीसायकल बिन ले जाने में असमर्थ। - -Authentication completed. -प्रमाणन पूर्ण। - -You may close this page now and continue with FreeFileSync. -आप अब इस पृष्ठ को बंद कर FreeFileSync जारी रख सकते हैं। - -Authentication failed. -प्रमाणन विफल। - -Cannot find %x. -%x नहीं मिला। - -Please authorize access to user account %x. -कृपया उपयोगकर्ता खाता %x से पहुँच अधिकृत करें। - -Cannot determine free disk space for %x. -%x के लिए खाली डिस्क जगह निर्धारित नहीं कर सकते। - -Unable to disconnect from %x. -%x से सम्पर्क काटने में असमर्थ। - -Unable to access %x. -%x तक पहुँचने में असमर्थ। - -Failed to get information about server %x. -सर्वर %x की जानकारी प्राप्त करने में विफल। - -Cannot monitor directory %x. -निर्देशिका %x की निगरानी कर नहीं सकते। - -Cannot find device %x. -उपकरण %x नहीं मिला। - -Cannot open directory %x. -निर्देशिका %x खोल नहीं सकते। - -Unsupported item type. -असमर्थित आइटम प्रकार। - -Incorrect command line: -अनुचित आदेश-पंक्ति: - -The server does not support authentication via %x. -सर्वर पर %x द्वारा प्रमाणन समर्थित नहीं है। - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -1 सेकंड के बाद कार्यवाई का काल समाप्त हुआ। -%x सेकंड्स के बाद कार्यवाई का काल समाप्त हुआ। - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -एक समय में 1 कनेक्शन से अधिक पर प्रतीक्षा नहीं कर सकते। -एक समय में %x कनेक्शन्स से अधिक पर प्रतीक्षा नहीं कर सकते। - - -Active connections: %x -सक्रिय कनेक्शन्स: %x - -Failed to open SFTP channel number %x. -SFTP चैनल संख्या %x को खोलने में विफल। - Drag && drop ड्रॅग एण्ड ड्रॉप @@ -747,6 +747,9 @@ Actual: %y bytes Command line: आदेश-पंक्ति: +&Hide console window +कंसोल विंडो छिपाएँ (&H) + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ The command is triggered if: Waiting until directory is available: प्रतीक्षारत जब कि निर्देशिका उपलब्ध हो: -&Restore -पुनर्स्थापित करें (&R) +&Configure +कॉन्फ़िगर (&C) &Show error message त्रुटि संदेश दिखाएं (&S) @@ -818,8 +821,8 @@ The command is triggered if: Scanning... स्कैनिंग... -job name -कार्य नाम +configuration file +कॉन्फ़िगरेशन फ़ाइल System: Sleep सिस्टम: स्लीप @@ -830,8 +833,8 @@ The command is triggered if: Nothing to synchronize सिंक्रनाइज़ करने के लिए कुछ नहीं -Executing command %x -कार्यान्वित आदेश %x +Executing command: +निष्पादित आदेश: You can switch to FreeFileSync's main window to resolve this issue. इस समस्या को हल करने के लिए आप FreeFileSync के मुख्य विंडो में जा सकते हैं। @@ -1031,6 +1034,12 @@ The command is triggered if: Match case केस मिलाएं +Processed: +संसाधित: + +Remaining: +शेष: + New नया @@ -1267,14 +1276,17 @@ The command is triggered if: &Don't show this dialog again यह संवाद बॉक्स दोबारा न दिखाएं (&D) -Items found: -आइटम बरामद: +Bytes: +बाइट्स: -Time remaining: -शेष समय: +Items: +आइटम्स: -Time elapsed: -बीता समय: +Synchronizing... +सिंक्रनाइज़ हो रहा है... + +Minimize to notification area +सूचना क्षेत्र में मिनिमाइज़ करें Bytes बाइट्स @@ -1282,12 +1294,6 @@ The command is triggered if: Items आइटम्स -Synchronizing... -सिंक्रनाइज़ हो रहा है... - -Minimize to notification area -सूचना क्षेत्र में मिनिमाइज़ करें - When finished: समाप्त होने पर: @@ -1363,6 +1369,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: x दिनों के बाद लॉग हटाएं (&D): +Notification sounds: +अधिसूचना ध्वनि: + +Synchronization finished: +सिंक्रनाइज़ेशन समाप्त: + Customize context menu: प्रासंगिक मेनू अनुकूलित करें: @@ -1567,12 +1579,6 @@ This guarantees a consistent state even in case of a serious error. &Delete हटाएं (&D) -Include all -सभी समावेश करें - -Exclude all -सभी अपवर्जित करें - Show icons: चिन्ह दिखाएं: @@ -1609,6 +1615,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save नहीं सहेजें (&n) +%x cannot be renamed. +%x का नाम नहीं बदला जा सकता है। + +New name: +नया नाम: + +Rename Configuration +कॉन्फ़िगरेशन का नाम बदलें + +Configuration name must not be empty. +कॉन्फ़िगरेशन का नाम रिक्त नहीं होना चाहिए। + +&Rename... +नाम बदलें (&R)... + Hide configuration कॉन्फ़िगरेशन छुपाएं @@ -1720,8 +1741,8 @@ This guarantees a consistent state even in case of a serious error. Password: पासवर्ड: -Key password: -कुंजी पासवर्ड: +Key passphrase: +कुंजी पासफ्रेज़: Please enter a file path. कृपया कोई फ़ाइल पथ प्रविष्ट करें। @@ -1885,6 +1906,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. न्यूनतम संस्करण गणना अधिकतम गणना से छोटी होनी चाहिए। +&Restore +पुनर्स्थापित करें (&R) + Files फ़ाइल्स @@ -1951,6 +1975,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: फ़ाइल किसी अन्य प्रक्रिया द्वारा अवरोधित है: +Failed to determine file permission support for folder %x. +%x फ़ोल्डर के लिए फ़ाइल अनुमति समर्थन निर्धारित करने में विफल। + Cannot read security context of %x. %x का सुरक्षा संदर्भ पढ़ नहीं सकते। @@ -2002,12 +2029,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. प्रक्रिया I/O प्राथमिकताओं को बदल नहीं सकते। -Unable to shut down the system. -सिस्टम को बंद करने में असमर्थ। - Checking recycle bin failed for folder %x. निर्देशिका %x के लिए रीसायकल बिन की जाँच विफल। +Unable to shut down the system. +सिस्टम को बंद करने में असमर्थ। + Prepare installation स्थापना तैयारी diff --git a/FreeFileSync/Build/Resources/Languages/hungarian.lng b/FreeFileSync/Build/Resources/Languages/hungarian.lng index 5abd63c6..e7223bbc 100755 --- a/FreeFileSync/Build/Resources/Languages/hungarian.lng +++ b/FreeFileSync/Build/Resources/Languages/hungarian.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +%x állomány nem olvasható. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Az adatfolyam mérete eltér a várttól +Várt: %x bájt +Tényleges: %y bájt + + +Cannot write file %x. +%x állomány írása sikertelen. + +Cannot write permissions of %x. +%x jogosultságait nem lehet felírni. + +Operation not supported between different devices. +A művelet nem támogatott különböző eszközök között. + +Cannot delete file %x. +%x állomány nem törölhető. + +Cannot delete symbolic link %x. +%x szimbolikus hivatkozás nem törölhető. + +Cannot delete directory %x. +%x könyvtár nem törölhető. + +Cannot move file %x to %y. +%x állomány nem mozgatható %y-ba. + +Cannot copy symbolic link %x to %y. +%x szimbolikus hivatkozás nem másolható %y-ba. + +Error Code %x +Hibakód %x + +Cannot read directory %x. +%x könyvtár nem olvasható. + +Cannot write modification time of %x. +%x módosításának időpontja nem rögzíthető. + +Cannot read file attributes of %x. +%x állomány attribútumai nem olvashatók. + +Cannot create directory %x. +%x könyvtár nem hozható létre. + +Cannot determine final path for %x. +%x számára a végső útvonal nem határozható meg. + +Operation not supported by device. +Az eszköz nem támogatja a műveletet. + +Cannot resolve symbolic link %x. +%x szimbolikus hivatkozás nem oldható fel. + +Unable to move %x to the recycle bin. +%x nem helyezhető Lomtárba. + +Authentication completed. +Hitelesítés befejezve. + +You may close this page now and continue with FreeFileSync. +Most bezárhatja ezt az oldalt és folytathatja a FreeFileSync-et. + +Authentication failed. +Hitelesítés sikertelen. + +Unable to connect to %x. +Nem képes %x-hez kapcsolódni. + +Cannot find %x. +%x nem található. + +The name %x is used by more than one item in the folder. +A(z) %x nevet nem csak egy elem viseli a könyvtárban. + +Please authorize access to user account %x. +Engedélyezze a hozzáférést a(z) %x felhasználói azonosítóhoz. + +Cannot open file %x. +%x állomány nem nyitható meg. + +The name %x is already used by another item. +%x nevet már más elem használja. + +Cannot determine free disk space for %x. +%x-nek nem határozható meg szabad tárterület. + +Unable to disconnect from %x. +Nem sikerült leválasztani %x-től. + +Unable to access %x. +%x nem elérhető. + +Failed to get information about server %x. +%x szerverről nem sikerült információt kapni. + +Cannot monitor directory %x. +%x könyvtárat nem sikerült monitorozni. + +Cannot find device %x. +%x eszköz nem található. + +Cannot open directory %x. +%x könyvtár nem nyitható meg. + +Unsupported item type. +Nem támogatott elemtípus. + +Incorrect command line: +Hibás parancssor: + +The server does not support authentication via %x. +A szerver nem támogatja a(z) %x általi autentikációt. + +Required: +Szükséges: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +A művelet 1 másodperc után időtúllépés miatt leállt. +A művelet %x másodperc után időtúllépés miatt leállt. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Nem tud 1-nél több kapcsolatra várni egyidejűleg. +Nem tud több mint %x kapcsolatra várni egyidejűleg. + + +Active connections: %x +Aktív kapcsolatok száma: %x + +Failed to open SFTP channel number %x. +Hiba a(z) %x számú SFTP csatorna megnyitása során. + Both sides have changed since last synchronization. Mindkét oldal megváltozott az utolsó szinkronizálás óta. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. A telepítő állományok sérültek. Installálja újra a FreeFileSync-et. -Cannot load file %x. -%x állomány betöltése nem sikerült. - Cannot find the following folders: A következő könyvtárak nem találhatóak: @@ -139,6 +285,9 @@ %x tételt találtam +Time elapsed: +Eltelt idő: + File %x has an invalid date. %x állomány dátuma érvénytelen. @@ -157,9 +306,6 @@ Items differ in attributes only Az elemek csak attribútumaikban különböznek -The name %x is used by more than one item in the folder. -A(z) %x nevet nem csak egy elem viseli a könyvtárban. - Resolving symbolic link %x %x szimbolikus hivatkozás feloldása @@ -220,6 +366,15 @@ Out of memory. Memória túlcsordulás. +Show in Explorer +Mutassa az Intézőben + +Open with default application +Nyissa meg az alapértelmezett alkalmazással + +Browse directory +Tallózza a könyvtárat + Database file %x is incompatible. %x adatbázis-állomány nem kompatibilis. @@ -232,12 +387,6 @@ Database file is corrupted: A következő adatbázis állomány sérült: -Cannot write file %x. -%x állomány írása sikertelen. - -Cannot read file %x. -%x állomány nem olvasható. - The database files do not yet contain information about the last synchronization. Az adatbázis állományok nem tartalmaznak információt a legutóbbi szinkronizálásról. @@ -256,9 +405,6 @@ Cannot get process information. Nem sikerült lekérdezni a processz-információkat. -Cannot read file attributes of %x. -%x állomány attribútumai nem olvashatók. - Waiting while directory is locked: Várakozás amíg a könyvtár zárolt: @@ -331,6 +477,27 @@ Update attributes on right Attribútumok frissítése a jobb oldalon +Error parsing file %x, row %y, column %z. +Hiba történt a feldolgozás közben: %x állomány, %y sor, %z oszlop. + +Services +Szervizek + +Show All +Összest Mutassa + +Hide Others +Rejtse a többit + +Hide %x +Rejt %x + +Quit %x +Leállít %x + +Cannot set directory locks for the following folders: +Nem lehet beállítani a könyvtárak lockolását a következő könyvtárakhoz: + Errors: Hiba: @@ -355,27 +522,6 @@ Cleaning up log files: A log állományok törlése: -Error parsing file %x, row %y, column %z. -Hiba történt a feldolgozás közben: %x állomány, %y sor, %z oszlop. - -Services -Szervizek - -Show All -Összest Mutassa - -Hide Others -Rejtse a többit - -Hide %x -Rejt %x - -Quit %x -Leállít %x - -Cannot set directory locks for the following folders: -Nem lehet beállítani a könyvtárak lockolását a következő könyvtárakhoz: - 1 thread %x threads @@ -385,27 +531,12 @@ %x szál -Cannot read directory %x. -%x könyvtár nem olvasható. - %x/sec %x/sec %x items %x elem -Show in Explorer -Mutassa az Intézőben - -Open with default application -Nyissa meg az alapértelmezett alkalmazással - -Browse directory -Tallózza a könyvtárat - -Unable to connect to %x. -Nem képes %x-hez kapcsolódni. - Completed successfully Sikeresen végrehajtva @@ -451,9 +582,6 @@ Cannot write file attributes of %x. %x állomány attribútumainak írása nem sikerült. -Cannot open file %x. -%x állomány nem nyitható meg. - %x and %y have different content. %x és %y tartalma különböző. @@ -484,29 +612,20 @@ Source item %x not found %x forrás állományt nem találom -Cannot move file %x to %y. -%x állomány nem mozgatható %y-ba. - Parent folder %x is not existing. %x szülő könyvtár nem létezik. -The name %x is already used by another item. -%x nevet már más elem használja. - Cannot copy file %x to %y. %x állomány nem másolható %y-ba. -Cannot copy symbolic link %x to %y. -%x szimbolikus hivatkozás nem másolható %y-ba. - Creating a Volume Shadow Copy for %x... %x számára árnyékmásolat-kötetet készítése... Cannot find folder %x. %x könyvtárat nem találom. -Target folder %x already existing. -%x célkönyvtár már létezik. +Target folder %x is already existing, but was not available during folder comparison. +%x célkönyvtár már létezik, de nem volt hozzáférhető a könyvtár-összehasonlítás során. Target folder input field must not be empty. A célkönyvtár beviteli mezője nem lehet üres. @@ -529,17 +648,14 @@ Not enough free disk space available in: Nincs elég szabad lemezterület: -Required: -Szükséges: - Available: Hozzáférhető: Some files will be synchronized as part of multiple base folders. Egyes állományokat több alapkönyvár részeként is szinkronizálni fog. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Az ütközések elkerülése érdekében állítsa be úgy a kizáró szűrőket, hogy minden egyes felülírt állomány csak egy alapkönyvárban szerepeljen. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Az ütközések elkerülése érdekében állítsa be úgy a kizáró szűrőket, hogy minden felülírt állomány csak egy eredeti könyvtárban forduljon elő. Versioning folder: Verzióképző könyvtár: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Nem képes időbélyegzés létrehozására a verzióképzéshez: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Az adatfolyam mérete eltér a várttól -Várt: %x bájt -Tényleges: %y bájt - - -Cannot write permissions of %x. -%x jogosultságait nem lehet felírni. - -Operation not supported between different devices. -A művelet nem támogatott különböző eszközök között. - -Cannot delete file %x. -%x állomány nem törölhető. - -Cannot delete symbolic link %x. -%x szimbolikus hivatkozás nem törölhető. - -Cannot delete directory %x. -%x könyvtár nem törölhető. - -Error Code %x -Hibakód %x - -Cannot write modification time of %x. -%x módosításának időpontja nem rögzíthető. - -Cannot create directory %x. -%x könyvtár nem hozható létre. - -Cannot determine final path for %x. -%x számára a végső útvonal nem határozható meg. - -Operation not supported by device. -Az eszköz nem támogatja a műveletet. - -Cannot resolve symbolic link %x. -%x szimbolikus hivatkozás nem oldható fel. - -Unable to move %x to the recycle bin. -%x nem helyezhető Lomtárba. - -Authentication completed. -Hitelesítés befejezve. - -You may close this page now and continue with FreeFileSync. -Most bezárhatja ezt az oldalt és folytathatja a FreeFileSync-et. - -Authentication failed. -Hitelesítés sikertelen. - -Cannot find %x. -%x nem található. - -Please authorize access to user account %x. -Engedélyezze a hozzáférést a(z) %x felhasználói azonosítóhoz. - -Cannot determine free disk space for %x. -%x-nek nem határozható meg szabad tárterület. - -Unable to disconnect from %x. -Nem sikerült leválasztani %x-től. - -Unable to access %x. -%x nem elérhető. - -Failed to get information about server %x. -%x szerverről nem sikerült információt kapni. - -Cannot monitor directory %x. -%x könyvtárat nem sikerült monitorozni. - -Cannot find device %x. -%x eszköz nem található. - -Cannot open directory %x. -%x könyvtár nem nyitható meg. - -Unsupported item type. -Nem támogatott elemtípus. - -Incorrect command line: -Hibás parancssor: - -The server does not support authentication via %x. -A szerver nem támogatja a(z) %x általi autentikációt. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -A művelet 1 másodperc után időtúllépés miatt leállt. -A művelet %x másodperc után időtúllépés miatt leállt. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Nem tud 1-nél több kapcsolatra várni egyidejűleg. -Nem tud több mint %x kapcsolatra várni egyidejűleg. - - -Active connections: %x -Aktív kapcsolatok száma: %x - -Failed to open SFTP channel number %x. -Hiba a(z) %x számú SFTP csatorna megnyitása során. - Drag && drop Húzd && Ejtsd @@ -747,6 +747,9 @@ Tényleges: %y bájt Command line: Parancssor: +&Hide console window +&Rejtse a konzol ablakot + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ A parancs végrehajtódik, ha: Waiting until directory is available: Várakozás, amíg a könyvtár elérhető lesz: -&Restore -&Visszaállít +&Configure +&Konfigurál &Show error message &Mutassa a hibaüzenetet @@ -818,8 +821,8 @@ A parancs végrehajtódik, ha: Scanning... Vizsgálat folyamatban... -job name -feladat neve +configuration file +Konfigurációs állomány System: Sleep Rendszer: alvási állapotban @@ -830,8 +833,8 @@ A parancs végrehajtódik, ha: Nothing to synchronize Nincs mit szinkronizálni -Executing command %x -%x parancs végrehajtása +Executing command: +Végrehajtott parancs: You can switch to FreeFileSync's main window to resolve this issue. E jelenség megoldásához kapcsoljon át a FreeFileSync fő ablakába. @@ -1031,6 +1034,12 @@ A parancs végrehajtódik, ha: Match case Kis-/nagybetű megkülönböztetése +Processed: +Feldolgozott: + +Remaining: +Hátralevő: + New Új @@ -1116,7 +1125,7 @@ A parancs végrehajtódik, ha: Teljesítmény növelése: Parallel file operations: -Párhuzamos fájl-műveletek: +Párhuzamos állomány-műveletek: How to get best performance? Hogyan lehet elérni a legjobb teljesítményt? @@ -1267,14 +1276,17 @@ A parancs végrehajtódik, ha: &Don't show this dialog again &Ne mutassa ismételten ezt a párbeszédablakot -Items found: -Talált elemek száma: +Bytes: +Bájt: -Time remaining: -Hátralévő idő: +Items: +Tétel: -Time elapsed: -Eltelt idő: +Synchronizing... +Szinkronizálás folyamatban... + +Minimize to notification area +Minimalizálja a figyelmeztetési területre Bytes Bájt @@ -1282,12 +1294,6 @@ A parancs végrehajtódik, ha: Items Elem -Synchronizing... -Szinkronizálás folyamatban... - -Minimize to notification area -Minimalizálja a figyelmeztetési területre - When finished: Ha befejezte: @@ -1363,6 +1369,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. &Delete logs after x days: &Törölje a logokat x nap után: +Notification sounds: +Figyelmeztető hangjelzések: + +Synchronization finished: +Szinkronizálás befejeződött: + Customize context menu: Környezeti menü testreszabása: @@ -1513,33 +1525,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. &Execute Vé&grehajt - -1 directory -%x directories - - -1 könyvtárat -%x könyvtárat - - - -1 file -%x files - - -1 állományt -%x állományt - - - -Showing %y of 1 row -Showing %y of %x rows - - -%y sort mutat az 1-ből -%y sort mutat az %x közül - - Set direction: Állítsa be az irányt: @@ -1567,12 +1552,6 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. &Delete &Törölje -Include all -Csatolja az összest - -Exclude all -Zárja ki az összest - Show icons: Mutassa az ikonokat: @@ -1609,6 +1588,21 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Do&n't save &ne mentse +%x cannot be renamed. +%x nem átnevezhető. + +New name: +Új név: + +Rename Configuration +Konfiguráció Átnevezése + +Configuration name must not be empty. +A konfiguráció neve nem lehet üres. + +&Rename... +Á&tnevezés... + Hide configuration Rejtse el a beállítást @@ -1669,6 +1663,33 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. All files are in sync Az összes állomány szinkronizált + +1 directory +%x directories + + +1 könyvtárat +%x könyvtárat + + + +1 file +%x files + + +1 állományt +%x állományt + + + +Showing %y of 1 row +Showing %y of %x rows + + +%y sort mutat az 1-ből +%y sort mutat az %x közül + + Cannot find %x Nem található: %x @@ -1720,7 +1741,7 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Password: Jelszó: -Key password: +Key passphrase: Kulcs jelszó: Please enter a file path. @@ -1885,6 +1906,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Minimum version count must be smaller than maximum count. A minimum verziószám kisebb kell legyen a maximális verziószámnál. +&Restore +&Visszaállít + Files Állományok @@ -1951,6 +1975,9 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. The file is locked by another process: Az állományt egy másik folyamat zárolta: +Failed to determine file permission support for folder %x. +%x könyvtár állomány jogosultságkezelés-támogatását nem sikerült megállapítani. + Cannot read security context of %x. %x biztonsági környezete nem olvasható. @@ -2002,12 +2029,12 @@ Ez garantálja a konzisztens állapotot egy komoly hiba esetén is. Cannot change process I/O priorities. Nem sikerült a folyamatok I/O prioritását megváltoztatni. -Unable to shut down the system. -Nem képes leállítani a rendszert. - Checking recycle bin failed for folder %x. %x könyvtár vonatkozásában a lomtár ellenőrzése meghiúsult. +Unable to shut down the system. +Nem képes leállítani a rendszert. + Prepare installation Telepítés előkészítése diff --git a/FreeFileSync/Build/Resources/Languages/italian.lng b/FreeFileSync/Build/Resources/Languages/italian.lng index 397a24e4..444a4486 100755 --- a/FreeFileSync/Build/Resources/Languages/italian.lng +++ b/FreeFileSync/Build/Resources/Languages/italian.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +Impossibile leggere il file %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Dimensioni impreviste del flusso di dati. +Previsto: %x byte +Attuale: %y byte + + +Cannot write file %x. +Impossibile scrivere il file %x. + +Cannot write permissions of %x. +Impossibile scrivere i permessi di %x. + +Operation not supported between different devices. +Operazione non supportata tra diversi dispositivi. + +Cannot delete file %x. +Impossibile eliminare il file %x. + +Cannot delete symbolic link %x. +Impossibile eliminare collegamento %x. + +Cannot delete directory %x. +Impossibile eliminare la directory %x. + +Cannot move file %x to %y. +Impossibile spostare il file %x in %y. + +Cannot copy symbolic link %x to %y. +Impossibile copiare collegamento %x per %y. + +Error Code %x +Codice di errore %x + +Cannot read directory %x. +Impossibile leggere la directory %x. + +Cannot write modification time of %x. +Impossibile scrivere data e ora di modifica di %x. + +Cannot read file attributes of %x. +Impossibile leggere gli attributi del file %x. + +Cannot create directory %x. +Impossibile creare la cartella %x. + +Cannot determine final path for %x. +Impossibile determinare il percorso finale per %x. + +Operation not supported by device. +Operazione non supportata dal dispositivo. + +Cannot resolve symbolic link %x. +Impossibile risolvere collegamento %x. + +Unable to move %x to the recycle bin. +Impossibile spostare %x nel cestino. + +Authentication completed. +Autenticazione completata. + +You may close this page now and continue with FreeFileSync. +Puoi chiudere questa pagina ora e continuare con FreeFileSync. + +Authentication failed. +Autenticazione fallita. + +Unable to connect to %x. +Impossibile connettersi a %x. + +Cannot find %x. +Impossibile trovare %x. + +The name %x is used by more than one item in the folder. +Il nome %x è utilizzato da più di un elemento nella cartella. + +Please authorize access to user account %x. +Autorizza l'accesso all'account utente %x. + +Cannot open file %x. +Impossibile aprire il file %x. + +The name %x is already used by another item. +Il nome %x è già utilizzato da un altro elemento. + +Cannot determine free disk space for %x. +Impossibile determinare lo spazio libero su disco per %x. + +Unable to disconnect from %x. +Impossibile disconnettersi da %x. + +Unable to access %x. +Impossibile accedere %x. + +Failed to get information about server %x. +Impossibile ottenere informazioni sul server %x. + +Cannot monitor directory %x. +Impossibile monitorare la directory %x. + +Cannot find device %x. +Impossibile trovare dispositivo %x. + +Cannot open directory %x. +Impossibile aprire la cartella %x. + +Unsupported item type. +Tipo di articolo non supportato. + +Incorrect command line: +Linea di comando non corretta: + +The server does not support authentication via %x. +Il server non supporta l'autenticazione tramite %x. + +Required: +Richiesto: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Funzionamento dopo 1 secondo. +Funzionamento dopo %x secondi. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Aspettare per non più di 1 connessione alla volta. +Aspettare per non più di %x connessioni alla volta. + + +Active connections: %x +Connessioni attive: %x + +Failed to open SFTP channel number %x. +Impossibile aprire canale SFTP numero %x. + Both sides have changed since last synchronization. Entrambi i lati sono cambiati dall'ultima sincronizzazione. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. I file di installazione sono danneggiati. Si prega di reinstallare FreeFileSync. -Cannot load file %x. -Impossibile caricare il file %x. - Cannot find the following folders: Impossibile trovare le seguenti cartelle: @@ -139,6 +285,9 @@ %x elementi trovati +Time elapsed: +Tempo trascorso: + File %x has an invalid date. Il file %x ha una data non valida. @@ -157,9 +306,6 @@ Items differ in attributes only Gli oggetti differiscono solo negli attributi -The name %x is used by more than one item in the folder. -Il nome %x è utilizzato da più di un elemento nella cartella. - Resolving symbolic link %x Risoluzione collegamento %x @@ -220,6 +366,15 @@ Out of memory. Memoria insufficiente. +Show in Explorer +Mostra in Esplora Risorse + +Open with default application +Apri con applicazione predefinita + +Browse directory +Sfoglia cartelle + Database file %x is incompatible. Il file del database %x non è compatibile. @@ -232,12 +387,6 @@ Database file is corrupted: Il file del database è danneggiato: -Cannot write file %x. -Impossibile scrivere il file %x. - -Cannot read file %x. -Impossibile leggere il file %x. - The database files do not yet contain information about the last synchronization. I file del database non contengono ancora informazioni sull'ultima sincronizzazione. @@ -256,9 +405,6 @@ Cannot get process information. Impossibile ottenere informazioni sul processo. -Cannot read file attributes of %x. -Impossibile leggere gli attributi del file %x. - Waiting while directory is locked: In attesa mentre la cartella è bloccata: @@ -385,27 +531,12 @@ %x thread -Cannot read directory %x. -Impossibile leggere la directory %x. - %x/sec %x/ sec %x items %x articoli -Show in Explorer -Mostra in Esplora Risorse - -Open with default application -Apri con applicazione predefinita - -Browse directory -Sfoglia cartelle - -Unable to connect to %x. -Impossibile connettersi a %x. - Completed successfully Completato con successo @@ -451,9 +582,6 @@ Cannot write file attributes of %x. Impossibile scrivere gli attributi del file %x. -Cannot open file %x. -Impossibile aprire il file %x. - %x and %y have different content. %x e %y hanno un contenuto diverso. @@ -484,29 +612,20 @@ Source item %x not found Elemento di origine %x non trovato -Cannot move file %x to %y. -Impossibile spostare il file %x in %y. - Parent folder %x is not existing. La cartella principale %x non esiste. -The name %x is already used by another item. -Il nome %x è già utilizzato da un altro elemento. - Cannot copy file %x to %y. Impossibile copiare il file %x in %y. -Cannot copy symbolic link %x to %y. -Impossibile copiare collegamento %x per %y. - Creating a Volume Shadow Copy for %x... Creazione di un Volume Shadow Copy per %x... Cannot find folder %x. Impossibile trovare la cartella %x. -Target folder %x already existing. -La cartella di destinazione %x è già esistente. +Target folder %x is already existing, but was not available during folder comparison. + Target folder input field must not be empty. Il campo per la cartella di destinazione non può essere vuoto. @@ -529,17 +648,14 @@ Not enough free disk space available in: Spazio libero su disco insufficiente in: -Required: -Richiesto: - Available: Disponibile: Some files will be synchronized as part of multiple base folders. Alcuni file saranno sincronizzati come parte di più cartelle base. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Per evitare conflitti, il set up esclude i filtri in modo che ciascun file aggiornato è considerato da una sola cartella base. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. + Versioning folder: Cartella versione: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Impossibile creare l'impronta per il controllo delle versioni: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Dimensioni impreviste del flusso di dati. -Previsto: %x byte -Attuale: %y byte - - -Cannot write permissions of %x. -Impossibile scrivere i permessi di %x. - -Operation not supported between different devices. -Operazione non supportata tra diversi dispositivi. - -Cannot delete file %x. -Impossibile eliminare il file %x. - -Cannot delete symbolic link %x. -Impossibile eliminare collegamento %x. - -Cannot delete directory %x. -Impossibile eliminare la directory %x. - -Error Code %x -Codice di errore %x - -Cannot write modification time of %x. -Impossibile scrivere data e ora di modifica di %x. - -Cannot create directory %x. -Impossibile creare la cartella %x. - -Cannot determine final path for %x. -Impossibile determinare il percorso finale per %x. - -Operation not supported by device. -Operazione non supportata dal dispositivo. - -Cannot resolve symbolic link %x. -Impossibile risolvere collegamento %x. - -Unable to move %x to the recycle bin. -Impossibile spostare %x nel cestino. - -Authentication completed. -Autenticazione completata. - -You may close this page now and continue with FreeFileSync. -Puoi chiudere questa pagina ora e continuare con FreeFileSync. - -Authentication failed. -Autenticazione fallita. - -Cannot find %x. -Impossibile trovare %x. - -Please authorize access to user account %x. -Autorizza l'accesso all'account utente %x. - -Cannot determine free disk space for %x. -Impossibile determinare lo spazio libero su disco per %x. - -Unable to disconnect from %x. -Impossibile disconnettersi da %x. - -Unable to access %x. -Impossibile accedere %x. - -Failed to get information about server %x. -Impossibile ottenere informazioni sul server %x. - -Cannot monitor directory %x. -Impossibile monitorare la directory %x. - -Cannot find device %x. -Impossibile trovare dispositivo %x. - -Cannot open directory %x. -Impossibile aprire la cartella %x. - -Unsupported item type. -Tipo di articolo non supportato. - -Incorrect command line: -Linea di comando non corretta: - -The server does not support authentication via %x. -Il server non supporta l'autenticazione tramite %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Funzionamento dopo 1 secondo. -Funzionamento dopo %x secondi. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Aspettare per non più di 1 connessione alla volta. -Aspettare per non più di %x connessioni alla volta. - - -Active connections: %x -Connessioni attive: %x - -Failed to open SFTP channel number %x. -Impossibile aprire canale SFTP numero %x. - Drag && drop Trascina e rilascia @@ -747,6 +747,9 @@ Attuale: %y byte Command line: Riga di comando: +&Hide console window + + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ Il comando è attivato se: Waiting until directory is available: In attesa che la directory sia disponibile: -&Restore -&Ripristina +&Configure + &Show error message &Mostra messaggio di errore @@ -818,8 +821,8 @@ Il comando è attivato se: Scanning... Scansione... -job name -nome del lavoro +configuration file + System: Sleep Sistema: In Sonno @@ -830,8 +833,8 @@ Il comando è attivato se: Nothing to synchronize Non c'è nulla da sincronizzare -Executing command %x -Esecuzione del comando %x +Executing command: + You can switch to FreeFileSync's main window to resolve this issue. È possibile passare alla finestra principale di FreeFileSync per risolvere questo problema. @@ -1031,6 +1034,12 @@ Il comando è attivato se: Match case Corrispondenza +Processed: + + +Remaining: + + New Nuovo @@ -1267,14 +1276,17 @@ Il comando è attivato se: &Don't show this dialog again &Non mostrare più questo avviso -Items found: -Oggetti trovati: +Bytes: + -Time remaining: -Tempo rimanente: +Items: + -Time elapsed: -Tempo trascorso: +Synchronizing... +Sincronizzazione... + +Minimize to notification area +Ridurre al minimo l'area di notifica Bytes Byte @@ -1282,12 +1294,6 @@ Il comando è attivato se: Items Elementi -Synchronizing... -Sincronizzazione... - -Minimize to notification area -Ridurre al minimo l'area di notifica - When finished: Al termine: @@ -1363,6 +1369,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave. &Delete logs after x days: &Elimina i log dopo x giorni: +Notification sounds: + + +Synchronization finished: + + Customize context menu: Personalizzare menu contestuale: @@ -1567,12 +1579,6 @@ Questo garantisce uno stato consistente anche in caso di errore grave. &Delete &Cancellare -Include all -Includi tutto - -Exclude all -Escludi tutto - Show icons: Mostra icone: @@ -1609,6 +1615,21 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Do&n't save No&n salvare +%x cannot be renamed. + + +New name: + + +Rename Configuration + + +Configuration name must not be empty. + + +&Rename... + + Hide configuration Nascondi configurazione @@ -1720,8 +1741,8 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Password: Password: -Key password: -Chiave password: +Key passphrase: + Please enter a file path. Si prega di inserire un percorso di file. @@ -1885,6 +1906,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Minimum version count must be smaller than maximum count. Il numero minimo della versione deve essere inferiore al conteggio massimo. +&Restore +&Ripristina + Files File @@ -1951,6 +1975,9 @@ Questo garantisce uno stato consistente anche in caso di errore grave. The file is locked by another process: Il file è bloccato da un altro processo: +Failed to determine file permission support for folder %x. + + Cannot read security context of %x. Impossibile leggere il contesto di protezione di %x. @@ -2002,12 +2029,12 @@ Questo garantisce uno stato consistente anche in caso di errore grave. Cannot change process I/O priorities. Impossibile modificare le priorità I/O del processo. -Unable to shut down the system. -Impossibile chiudere il sistema. - Checking recycle bin failed for folder %x. Controllo cestino non riuscito per la cartella %x. +Unable to shut down the system. +Impossibile chiudere il sistema. + Prepare installation Preparare l'installazione diff --git a/FreeFileSync/Build/Resources/Languages/japanese.lng b/FreeFileSync/Build/Resources/Languages/japanese.lng index 44a92865..64c078f5 100755 --- a/FreeFileSync/Build/Resources/Languages/japanese.lng +++ b/FreeFileSync/Build/Resources/Languages/japanese.lng @@ -7,6 +7,153 @@ 0 +Cannot read file %x. +ファイル %x を読み込めません. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +予期しないデータストリームのサイズ. +予測された値: %x バイト +実際の値: %y バイト + + +Cannot write file %x. +ファイル %x に書き込めません. + +Cannot write permissions of %x. +%x のパーミッションを書き込めません. + +Operation not supported between different devices. +異なるデバイス間での操作には対応していません. + +Cannot delete file %x. +ファイル %x を削除出来ません. + +Cannot delete symbolic link %x. +シンボリック リンク %x を削除できません. + +Cannot delete directory %x. +ディレクトリ %x を削除できません. + +Cannot move file %x to %y. +ファイル %x を %y に移動できません. + +Cannot copy symbolic link %x to %y. +シンボリックリンク %x を %y にコピーできません. + +Error Code %x +エラーコード %x. + +Cannot read directory %x. +ディレクトリ %x を読み取れません. + +Cannot write modification time of %x. +%x の更新時刻を書き込めませんでした. + +Cannot read file attributes of %x. +%x のファイル属性を読み込めません. + +Cannot create directory %x. +ディレクトリ %x を作成できません. + +Cannot determine final path for %x. +%x の最終的なパスを決定できません. + +Operation not supported by device. +デバイスで対応していない操作です. + +Cannot resolve symbolic link %x. +シンボリックリンク %x を解決できません. + +Unable to move %x to the recycle bin. +%x をゴミ箱に移動できません. + +Authentication completed. +認証が完了しました. + +You may close this page now and continue with FreeFileSync. +このページを閉じて FreeFileSync. を続行することができます. + +Authentication failed. +認証に失敗しました. + +Unable to connect to %x. +%x に接続できません. + +Cannot find %x. +%x がみつかりません. + +The name %x is used by more than one item in the folder. +名前 %x は、フォルダ内複数の項目で使用されています. + +Please authorize access to user account %x. +アカウント %x へのアクセスを承認してください. + +Cannot open file %x. +ファイル %x を開けません. + +The name %x is already used by another item. +%x という名前は既に別項目で利用されています. + +Cannot determine free disk space for %x. +%x の空きディスク領域を検出できません. + +Unable to disconnect from %x. +%x からの接続を切断できません. + +Unable to access %x. +%x にアクセスできません. + +Failed to get information about server %x. +%x サーバからの情報取得に失敗しました. + +Cannot monitor directory %x. +ディレクトリ %x を監視できません. + +Cannot find device %x. +デバイス %x がみつかりません. + +Cannot open directory %x. +ディレクトリ %x を開けません. + +Unsupported item type. +対応していない項目形式. + +Incorrect command line: +不正なコマンドライン: + +The server does not support authentication via %x. +このサーバは %x による認証に対応していません. + +Required: +必須: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +%x 秒経過で操作をタイムアウト. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +一度に %x 以上の接続を行うことはできません. + + +Active connections: %x +アクティブな接続: %x + +Failed to open SFTP channel number %x. +SFTP チャンネル %x を開けません. + Both sides have changed since last synchronization. 前回最後の同期処理以降、両側とも変更があります. @@ -109,9 +256,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. インストール ファイルが破損しています、FreeFileSync を再インストールしてください. -Cannot load file %x. -ファイル %x を読み込めません. - Cannot find the following folders: 次のフォルダがみつかりません: @@ -138,6 +282,9 @@ %x 項目を検出 +Time elapsed: +経過時間: + File %x has an invalid date. ファイル %x の日付は無効なものです. @@ -156,9 +303,6 @@ Items differ in attributes only 属性のみ異なる項目 -The name %x is used by more than one item in the folder. -名前 %x は、フォルダ内複数の項目で使用されています. - Resolving symbolic link %x シンボリックリンク %x を解決中 @@ -219,6 +363,15 @@ Out of memory. メモリが足りません. +Show in Explorer +エクスプローラで表示 + +Open with default application +既定アプリケーションで開く + +Browse directory +ディレクトリを参照 + Database file %x is incompatible. データベース %x とは互換性がありません. @@ -231,12 +384,6 @@ Database file is corrupted: データベースが破損しています: -Cannot write file %x. -ファイル %x に書き込めません. - -Cannot read file %x. -ファイル %x を読み込めません. - The database files do not yet contain information about the last synchronization. このデータベース ファイルには前回の同期に関する情報がまだ含まれていません. @@ -255,9 +402,6 @@ Cannot get process information. プロセス情報を取得できません. -Cannot read file attributes of %x. -%x のファイル属性を読み込めません. - Waiting while directory is locked: ディレクトリのロックを待機中: @@ -382,27 +526,12 @@ %x スレッド -Cannot read directory %x. -ディレクトリ %x を読み取れません. - %x/sec %x/秒 %x items %x 項目 -Show in Explorer -エクスプローラで表示 - -Open with default application -既定アプリケーションで開く - -Browse directory -ディレクトリを参照 - -Unable to connect to %x. -%x に接続できません. - Completed successfully 正常に完了しました @@ -448,9 +577,6 @@ Cannot write file attributes of %x. %x のファイル属性を書き込めません. -Cannot open file %x. -ファイル %x を開けません. - %x and %y have different content. %x と %y の内容は異なります. @@ -481,29 +607,20 @@ Source item %x not found ソース項目 %x が見つかりません -Cannot move file %x to %y. -ファイル %x を %y に移動できません. - Parent folder %x is not existing. 親フォルダ %x は存在しません. -The name %x is already used by another item. -%x という名前は既に別項目で利用されています. - Cannot copy file %x to %y. %x から %y にコピーできません. -Cannot copy symbolic link %x to %y. -シンボリックリンク %x を %y にコピーできません. - Creating a Volume Shadow Copy for %x... ボリュームシャドウコピーを作成中 %x... Cannot find folder %x. %x フォルダがみつかりません. -Target folder %x already existing. -対象フォルダ %x は既に存在します. +Target folder %x is already existing, but was not available during folder comparison. +対象フォルダ %x は既に存在しますが、フォルダ比較中は使用できませんでした. Target folder input field must not be empty. 対象フォルダ入力欄が空白になっています. @@ -526,17 +643,14 @@ Not enough free disk space available in: 利用可能なディスク空き容量が足りません: -Required: -必須: - Available: 利用可能: Some files will be synchronized as part of multiple base folders. いくつかのファイルは複数の基準フォルダの一部として同期されます. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -競合を避けたい場合は、各ファイルがひとつの基準フォルダで更新されるように除外フィルターをセットします. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +競合回避のために、更新された各ファイルがひとつの基本フォルダのみに含まれるように除外設定をします. Versioning folder: バージョン管理フォルダ: @@ -562,120 +676,6 @@ Unable to create time stamp for versioning: バージョン管理のタイムスタンプを作成できません: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -予期しないデータストリームのサイズ. -予測された値: %x バイト -実際の値: %y バイト - - -Cannot write permissions of %x. -%x のパーミッションを書き込めません. - -Operation not supported between different devices. -異なるデバイス間での操作には対応していません. - -Cannot delete file %x. -ファイル %x を削除出来ません. - -Cannot delete symbolic link %x. -シンボリック リンク %x を削除できません. - -Cannot delete directory %x. -ディレクトリ %x を削除できません. - -Error Code %x -エラーコード %x. - -Cannot write modification time of %x. -%x の更新時刻を書き込めませんでした. - -Cannot create directory %x. -ディレクトリ %x を作成できません. - -Cannot determine final path for %x. -%x の最終的なパスを決定できません. - -Operation not supported by device. -デバイスで対応していない操作です. - -Cannot resolve symbolic link %x. -シンボリックリンク %x を解決できません. - -Unable to move %x to the recycle bin. -%x をゴミ箱に移動できません. - -Authentication completed. -認証が完了しました. - -You may close this page now and continue with FreeFileSync. -このページを閉じて FreeFileSync. を続行することができます. - -Authentication failed. -認証に失敗しました. - -Cannot find %x. -%x がみつかりません. - -Please authorize access to user account %x. -アカウント %x へのアクセスを承認してください. - -Cannot determine free disk space for %x. -%x の空きディスク領域を検出できません. - -Unable to disconnect from %x. -%x からの接続を切断できません. - -Unable to access %x. -%x にアクセスできません. - -Failed to get information about server %x. -%x サーバからの情報取得に失敗しました. - -Cannot monitor directory %x. -ディレクトリ %x を監視できません. - -Cannot find device %x. -デバイス %x がみつかりません. - -Cannot open directory %x. -ディレクトリ %x を開けません. - -Unsupported item type. -対応していない項目形式. - -Incorrect command line: -不正なコマンドライン: - -The server does not support authentication via %x. -このサーバは %x による認証に対応していません. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -%x 秒経過で操作をタイムアウト. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -一度に %x 以上の接続を行うことはできません. - - -Active connections: %x -アクティブな接続: %x - -Failed to open SFTP channel number %x. -SFTP チャンネル %x を開けません. - Drag && drop ドラッグ && ドロップ @@ -742,6 +742,9 @@ Actual: %y bytes Command line: コマンドライン: +&Hide console window +コンソール画面を隠す(&H) + The command is triggered if: - files or subfolders change @@ -777,8 +780,8 @@ The command is triggered if: Waiting until directory is available: ディレクトリが利用可能になるまで待機: -&Restore -修復(&R) +&Configure +構成設定(&C) &Show error message エラーメッセージを表示(&S) @@ -812,8 +815,8 @@ The command is triggered if: Scanning... スキャン中... -job name -ジョブ名 +configuration file +構成設定ファイル System: Sleep システム: スリープ @@ -824,8 +827,8 @@ The command is triggered if: Nothing to synchronize 同期対象がありません -Executing command %x -コマンド %x を実行中 +Executing command: +実行中のコマンド: You can switch to FreeFileSync's main window to resolve this issue. FreeFileSync のメインウィンドウを切り替えることでこの問題を解決. @@ -1024,6 +1027,12 @@ The command is triggered if: Match case 文字種を区別 +Processed: +処理しています: + +Remaining: +残り: + New 新規 @@ -1260,14 +1269,17 @@ The command is triggered if: &Don't show this dialog again 次回以降から表示しない(&D) -Items found: -見つかった要素: +Bytes: +バイト: -Time remaining: -残り時間: +Items: +項目: -Time elapsed: -経過時間: +Synchronizing... +同期処理中... + +Minimize to notification area +通知領域に最小化 Bytes バイト @@ -1275,12 +1287,6 @@ The command is triggered if: Items 項目 -Synchronizing... -同期処理中... - -Minimize to notification area -通知領域に最小化 - When finished: 完了後: @@ -1356,6 +1362,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: x 日経過後にログを削除(&D): +Notification sounds: +通知音: + +Synchronization finished: +同期処理の完了: + Customize context menu: コンテキストメニューのカスタマイズ: @@ -1556,12 +1568,6 @@ This guarantees a consistent state even in case of a serious error. &Delete 削除(&D) -Include all -すべて含める - -Exclude all -すべて除外 - Show icons: アイコン表示: @@ -1598,6 +1604,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save 保存しない(&N) +%x cannot be renamed. +%x の名前は変更できません. + +New name: +新たな名前: + +Rename Configuration +構成設定のリネーム + +Configuration name must not be empty. +構成設定名に空白は使用できません. + +&Rename... +リネーム(&R)... + Hide configuration 構成を隠す @@ -1709,8 +1730,8 @@ This guarantees a consistent state even in case of a serious error. Password: パスワード: -Key password: -キーパスワード: +Key passphrase: +キーパスフレーズ: Please enter a file path. ファイルパスを入力. @@ -1871,6 +1892,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. 最小バージョン数は最大値より小さくする必要があります. +&Restore +修復(&R) + Files ファイル @@ -1937,6 +1961,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: 次のファイルは別のプロセスで使用中です: +Failed to determine file permission support for folder %x. +フォルダ %x のファイルアクセス許可の設定に失敗しました. + Cannot read security context of %x. %x のセキュリティコンテキストを読み込めません. @@ -1986,12 +2013,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. プロセスの I/O 優先度を変更できません. -Unable to shut down the system. -システムをシャットダウンできません. - Checking recycle bin failed for folder %x. フォルダ %x のゴミ箱のチェックに失敗. +Unable to shut down the system. +システムをシャットダウンできません. + Prepare installation インストールの準備 diff --git a/FreeFileSync/Build/Resources/Languages/korean.lng b/FreeFileSync/Build/Resources/Languages/korean.lng index d147b426..f8efe8d4 100755 --- a/FreeFileSync/Build/Resources/Languages/korean.lng +++ b/FreeFileSync/Build/Resources/Languages/korean.lng @@ -7,6 +7,153 @@ 0 +Cannot read file %x. +파일 %x을(를) 읽을 수 없습니다. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +예상치 못한 데이터 스트림 크기 +예상 크기: %x 바이트 +실제 크기: %y 바이트 + + +Cannot write file %x. +파일 %x을(를) 쓸 수 없습니다. + +Cannot write permissions of %x. +%x의 권한을 쓸 수 없습니다. + +Operation not supported between different devices. +다른 장치 간에는 지원되지 않는 작업입니다. + +Cannot delete file %x. +파일 %x을(를) 삭제할 수 없습니다. + +Cannot delete symbolic link %x. +심볼릭 링크 %x을(를) 삭제할 수 없습니다. + +Cannot delete directory %x. +디렉터리 %x을(를) 삭제할 수 없습니다. + +Cannot move file %x to %y. +파일 %x을(를) %y(으)로 이동할 수 없습니다. + +Cannot copy symbolic link %x to %y. +심볼릭 링크 %x을(를) %y(으)로 복사할 수 없습니다. + +Error Code %x +오류 코드 %x + +Cannot read directory %x. +디렉터리 %x을(를) 읽을 수 없습니다. + +Cannot write modification time of %x. +%x의 수정 시간을 쓸 수 없습니다. + +Cannot read file attributes of %x. +%x의 파일 속성을 읽을 수 없습니다. + +Cannot create directory %x. +디렉터리 %x을(를) 생성할 수 없습니다. + +Cannot determine final path for %x. +%x에 대한 최종 경로를 결정할 수 없습니다. + +Operation not supported by device. +장치에서는 지원되지 않는 작업입니다. + +Cannot resolve symbolic link %x. +심볼릭 링크 %x을(를) 해결할 수 없습니다. + +Unable to move %x to the recycle bin. +휴지통으로 %x을(를) 이동할 수 없습니다. + +Authentication completed. +인증 완료. + +You may close this page now and continue with FreeFileSync. +지금 이 페이지를 닫고 FreeFileSync를 계속 진행할 수 있습니다. + +Authentication failed. +인증 실패. + +Unable to connect to %x. +%x에 연결할 수 없습니다. + +Cannot find %x. +%x을(를) 찾을 수 없습니다. + +The name %x is used by more than one item in the folder. +이름 %x이(가) 같은 폴더 내 한 개 이상의 항목에서 사용되고 있습니다. + +Please authorize access to user account %x. +사용자 계정 %x에 대한 액세스 권한을 부여하십시오. + +Cannot open file %x. +파일 %x을(를) 열 수 없습니다. + +The name %x is already used by another item. +이름 %x은(는) 이미 다른 항목에서 사용되고 있습니다. + +Cannot determine free disk space for %x. +%x에 대한 사용 가능한 디스크 공간을 확인할 수 없습니다. + +Unable to disconnect from %x. +%x에서 연결 해제가 안 됩니다. + +Unable to access %x. +%x에 접근할 수 없습니다. + +Failed to get information about server %x. +서버 %x에 대한 정보를 가져 오는데 실패했습니다. + +Cannot monitor directory %x. +디렉터리 %x을(를) 모니터링 할 수 없습니다. + +Cannot find device %x. +장치 %x을(를) 찾을 수 없습니다. + +Cannot open directory %x. +디렉터리 %x을(를) 열 수 없습니다. + +Unsupported item type. +지원되지 않는 항목 형식. + +Incorrect command line: +부정확한 명령줄: + +The server does not support authentication via %x. +서버가 %x을(를) 통한 인증을 지원하지 않습니다. + +Required: +필요 공간(크기): + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +%x초 이후 작업시간 초과됨. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +한꺼번에 %x개 이상의 연결에 대기할 수 없습니다. + + +Active connections: %x +활성화된 연결: %x + +Failed to open SFTP channel number %x. +SFTP 채널번호 %x을(를) 열지 못 했습니다. + Both sides have changed since last synchronization. 마지막 동기화 작업 이후, 양측 모두 변경 되었습니다. @@ -109,9 +256,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. 설치 파일이 손상되었습니다. FreeFileSync를 다시 설치하십시오. -Cannot load file %x. -파일 %x을(를) 로드할 수 없습니다. - Cannot find the following folders: 다음 폴더를 찾을 수 없습니다: @@ -138,6 +282,9 @@ %x개 항목 발견 +Time elapsed: +경과 시간: + File %x has an invalid date. 파일 %x의 날짜가 유효하지 않습니다. @@ -156,9 +303,6 @@ Items differ in attributes only 항목들이 속성에서만 차이가 있습니다. -The name %x is used by more than one item in the folder. -이름 %x이(가) 같은 폴더 내 한 개 이상의 항목에서 사용되고 있습니다. - Resolving symbolic link %x 심볼릭 링크 %x 해결 @@ -219,6 +363,15 @@ Out of memory. 메모리 부족. +Show in Explorer +탐색기에 표시 + +Open with default application +기본값 응용 프로그램으로 열기 + +Browse directory +디렉터리 찾아보기 + Database file %x is incompatible. 데이터베이스 파일 %x 은(는) 호환 불가능합니다. @@ -231,12 +384,6 @@ Database file is corrupted: 데이터베이스 파일 손상: -Cannot write file %x. -파일 %x을(를) 쓸 수 없습니다. - -Cannot read file %x. -파일 %x을(를) 읽을 수 없습니다. - The database files do not yet contain information about the last synchronization. 데이터베이스 파일에 아직 마지막 동기화에 대한 정보가 없습니다. @@ -255,9 +402,6 @@ Cannot get process information. 프로세스 정보를 얻을 수 없습니다. -Cannot read file attributes of %x. -%x의 파일 속성을 읽을 수 없습니다. - Waiting while directory is locked: 디렉터리 잠금 대기 중: @@ -329,6 +473,27 @@ Update attributes on right 우측 속성 업데이트 +Error parsing file %x, row %y, column %z. +분석 오류 - 파일: %x; 행: %y; 열: %z. + +Services +서비스 + +Show All +모두 보이기 + +Hide Others +기타 다른 항목 숨기기 + +Hide %x +%x 숨기기 + +Quit %x +%x 끝내기 + +Cannot set directory locks for the following folders: +다음 폴더의 디렉터리 잠금을 설정할 수 없습니다: + Errors: 오류: @@ -353,27 +518,6 @@ Cleaning up log files: 로그 파일 정리 중: -Error parsing file %x, row %y, column %z. -분석 오류 - 파일: %x; 행: %y; 열: %z. - -Services -서비스 - -Show All -모두 보이기 - -Hide Others -기타 다른 항목 숨기기 - -Hide %x -%x 숨기기 - -Quit %x -%x 끝내기 - -Cannot set directory locks for the following folders: -다음 폴더의 디렉터리 잠금을 설정할 수 없습니다: - 1 thread %x threads @@ -382,27 +526,12 @@ %x 스레드 -Cannot read directory %x. -디렉터리 %x을(를) 읽을 수 없습니다. - %x/sec %x/초 %x items %x 항목 -Show in Explorer -탐색기에 표시 - -Open with default application -기본값 응용 프로그램으로 열기 - -Browse directory -디렉터리 찾아보기 - -Unable to connect to %x. -%x에 연결할 수 없습니다. - Completed successfully 성공적으로 완료됨 @@ -448,9 +577,6 @@ Cannot write file attributes of %x. %x의 파일 속성을 쓸 수 없습니다. -Cannot open file %x. -파일 %x을(를) 열 수 없습니다. - %x and %y have different content. %x와(과) %y의 콘텐츠가 다릅니다. @@ -481,29 +607,20 @@ Source item %x not found 원본 항목 %x을(를) 찾을 수 없음 -Cannot move file %x to %y. -파일 %x을(를) %y(으)로 이동할 수 없습니다. - Parent folder %x is not existing. 상위 폴더 %x이(가) 존재하지 않습니다. -The name %x is already used by another item. -이름 %x은(는) 이미 다른 항목에서 사용되고 있습니다. - Cannot copy file %x to %y. 파일 %x을(를) %y(으)로 복사할 수 없습니다. -Cannot copy symbolic link %x to %y. -심볼릭 링크 %x을(를) %y(으)로 복사할 수 없습니다. - Creating a Volume Shadow Copy for %x... %x을(를) 위한 Volume Shadow Copy 생성 중... Cannot find folder %x. %x 폴더를 찾을 수 없습니다. -Target folder %x already existing. -대상 폴더 %x이(가) 이미 존재함. +Target folder %x is already existing, but was not available during folder comparison. +대상 폴더 %x이(가) 이미 존재하지만, 폴더 비교시 사용할 수 없었습니다. Target folder input field must not be empty. 대상 폴더 입력 필드가 비어 있어서는 안 됩니다. @@ -526,17 +643,14 @@ Not enough free disk space available in: 사용 가능한 디스크 여유 공간이 부족합니다: -Required: -필요 공간(크기): - Available: 여유 공간(크기): Some files will be synchronized as part of multiple base folders. 일부 파일들은 여러 기본 폴더의 일부로써 동기화됩니다. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -충돌 방지를 위해 제외 필터를 설정하여 업데이트 된 각 파일이 하나의 기본 폴더만으로 간주되도록 하십시오. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +충돌을 피하려면 업데이트 된 각 파일이 하나의 기본 폴더에만 포함되도록 제외 필터를 설정하시기 바랍니다. Versioning folder: 버전 관리 폴더: @@ -562,120 +676,6 @@ Unable to create time stamp for versioning: 버전 관리를 위한 타임 스탬프 생성 불가: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -예상치 못한 데이터 스트림 크기 -예상 크기: %x 바이트 -실제 크기: %y 바이트 - - -Cannot write permissions of %x. -%x의 권한을 쓸 수 없습니다. - -Operation not supported between different devices. -다른 장치 간에는 지원되지 않는 작업입니다. - -Cannot delete file %x. -파일 %x을(를) 삭제할 수 없습니다. - -Cannot delete symbolic link %x. -심볼릭 링크 %x을(를) 삭제할 수 없습니다. - -Cannot delete directory %x. -디렉터리 %x을(를) 삭제할 수 없습니다. - -Error Code %x -오류 코드 %x - -Cannot write modification time of %x. -%x의 수정 시간을 쓸 수 없습니다. - -Cannot create directory %x. -디렉터리 %x을(를) 생성할 수 없습니다. - -Cannot determine final path for %x. -%x에 대한 최종 경로를 결정할 수 없습니다. - -Operation not supported by device. -장치에서는 지원되지 않는 작업입니다. - -Cannot resolve symbolic link %x. -심볼릭 링크 %x을(를) 해결할 수 없습니다. - -Unable to move %x to the recycle bin. -휴지통으로 %x을(를) 이동할 수 없습니다. - -Authentication completed. -인증 완료. - -You may close this page now and continue with FreeFileSync. -지금 이 페이지를 닫고 FreeFileSync를 계속 진행할 수 있습니다. - -Authentication failed. -인증 실패. - -Cannot find %x. -%x을(를) 찾을 수 없습니다. - -Please authorize access to user account %x. -사용자 계정 %x에 대한 액세스 권한을 부여하십시오. - -Cannot determine free disk space for %x. -%x에 대한 사용 가능한 디스크 공간을 확인할 수 없습니다. - -Unable to disconnect from %x. -%x에서 연결 해제가 안 됩니다. - -Unable to access %x. -%x에 접근할 수 없습니다. - -Failed to get information about server %x. -서버 %x에 대한 정보를 가져 오는데 실패했습니다. - -Cannot monitor directory %x. -디렉터리 %x을(를) 모니터링 할 수 없습니다. - -Cannot find device %x. -장치 %x을(를) 찾을 수 없습니다. - -Cannot open directory %x. -디렉터리 %x을(를) 열 수 없습니다. - -Unsupported item type. -지원되지 않는 항목 형식. - -Incorrect command line: -부정확한 명령줄: - -The server does not support authentication via %x. -서버가 %x을(를) 통한 인증을 지원하지 않습니다. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -%x초 이후 작업시간 초과됨. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -한꺼번에 %x개 이상의 연결에 대기할 수 없습니다. - - -Active connections: %x -활성화된 연결: %x - -Failed to open SFTP channel number %x. -SFTP 채널번호 %x을(를) 열지 못 했습니다. - Drag && drop 끌어서 놓기(&&) [드래그-앤-드랍] @@ -742,6 +742,9 @@ Actual: %y bytes Command line: 명령줄(커맨드라인): +&Hide console window +콘솔 창 숨기기(&H) + The command is triggered if: - files or subfolders change @@ -777,8 +780,8 @@ The command is triggered if: Waiting until directory is available: 디렉토리를 사용할 수 있을 때까지 대기 중: -&Restore -복원(&R) +&Configure +구성(&C) &Show error message 오류 메세지 표시(&S) @@ -812,8 +815,8 @@ The command is triggered if: Scanning... 스캔 중... -job name -작업 이름 +configuration file +구성 파일 System: Sleep 시스템: 절전 @@ -824,8 +827,8 @@ The command is triggered if: Nothing to synchronize 동기화 할 항목이 없습니다 -Executing command %x -%x 명령 실행 중 +Executing command: +명령 실행 중: You can switch to FreeFileSync's main window to resolve this issue. 이 문제는 FreeFileSync 기본 창으로 전환해서 해결 가능합니다. @@ -1024,6 +1027,12 @@ The command is triggered if: Match case 대문자/소문자 구분 +Processed: +처리됨: + +Remaining: +남음: + New 새로 만들기 @@ -1260,14 +1269,17 @@ The command is triggered if: &Don't show this dialog again 이 대화 상자를 다시 표시 안 함(&D) -Items found: -발견된 항목: +Bytes: +바이트: -Time remaining: -남은 시간: +Items: +항목: -Time elapsed: -경과 시간: +Synchronizing... +동기화 작업 중... + +Minimize to notification area +알림 영역으로 최소화 Bytes 바이트 @@ -1275,12 +1287,6 @@ The command is triggered if: Items 항목 -Synchronizing... -동기화 작업 중... - -Minimize to notification area -알림 영역으로 최소화 - When finished: 완료 시: @@ -1356,6 +1362,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: x일 후에 로그 삭제(&D): +Notification sounds: +알림 소리: + +Synchronization finished: +동기화 완료: + Customize context menu: 컨텍스트 메뉴 커스터마이즈 (사용자 정의): @@ -1505,30 +1517,6 @@ This guarantees a consistent state even in case of a serious error. &Execute 실행(&E) - -1 directory -%x directories - - -%x개 디렉터리 - - - -1 file -%x files - - -%x개 파일 - - - -Showing %y of 1 row -Showing %y of %x rows - - -%x 행의 %y 표시 - - Set direction: 방향 설정: @@ -1556,12 +1544,6 @@ This guarantees a consistent state even in case of a serious error. &Delete 삭제(&D) -Include all -모두 포함 - -Exclude all -모두 제외 - Show icons: 아이콘 표시: @@ -1598,6 +1580,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save 저장 안 함(&n) +%x cannot be renamed. +%x의 이름을 바꿀 수 없습니다. + +New name: +새 이름: + +Rename Configuration +구성 이름 바꾸기 + +Configuration name must not be empty. +구성 이름은 비워 둘 수 없습니다. + +&Rename... +이름 바꾸기(&R)... + Hide configuration 구성 숨기기 @@ -1658,6 +1655,30 @@ This guarantees a consistent state even in case of a serious error. All files are in sync 모든 파일이 동기화 되었음. + +1 directory +%x directories + + +%x개 디렉터리 + + + +1 file +%x files + + +%x개 파일 + + + +Showing %y of 1 row +Showing %y of %x rows + + +%x 행의 %y 표시 + + Cannot find %x %x을(를) 찾을 수 없습니다. @@ -1709,8 +1730,8 @@ This guarantees a consistent state even in case of a serious error. Password: 비밀번호: -Key password: -키 비밀번호: +Key passphrase: +키 암호: Please enter a file path. 파일 경로를 입력하세요. @@ -1871,6 +1892,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. 최소 버전 카운트는 최대 카운트보다 더 작아야 합니다. +&Restore +복원(&R) + Files 파일 @@ -1937,6 +1961,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: 파일이 다른 프로세스에 의해 잠겨 있습니다: +Failed to determine file permission support for folder %x. +%x 폴더에 대한 파일 권한 지원 정의에 실패하였습니다. + Cannot read security context of %x. %x의 보안 컨텍스트를 읽을 수 없습니다. @@ -1986,12 +2013,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. 프로세스 I/O 우선순위 변경을 할 수 없습니다. -Unable to shut down the system. -시스템을 종료할 수 없습니다. - Checking recycle bin failed for folder %x. 폴더 %x에 관한 휴지통 실패 확인 중. +Unable to shut down the system. +시스템을 종료할 수 없습니다. + Prepare installation 설치 준비 diff --git a/FreeFileSync/Build/Resources/Languages/lithuanian.lng b/FreeFileSync/Build/Resources/Languages/lithuanian.lng index dc48f448..c2e84a42 100755 --- a/FreeFileSync/Build/Resources/Languages/lithuanian.lng +++ b/FreeFileSync/Build/Resources/Languages/lithuanian.lng @@ -7,6 +7,157 @@ n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2 +Cannot read file %x. +Nepavyksta nuskaityti failo %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Nenumatytas duomenų srautas. +Numatytas: %x baitai +Esamas: %y baitai + + +Cannot write file %x. +Nepavyksta įrašyti failo %x. + +Cannot write permissions of %x. +Nepavyksta įrašyti leidimų %x. + +Operation not supported between different devices. +Veiksmas yra nesuderinamas tarp atskitų įrenginių. + +Cannot delete file %x. +Nepavyksta ištrinti failo %x. + +Cannot delete symbolic link %x. +Negalima ištrinti virtualios nuorodos %x. + +Cannot delete directory %x. +Nepavyksta ištrinti katalogo %x. + +Cannot move file %x to %y. +Nepavyksta perkelti failo %x į %y. + +Cannot copy symbolic link %x to %y. +Nepavyko nukopijuoti simbolinės nuorodos %x į %y. + +Error Code %x +Klaidos kodas %x + +Cannot read directory %x. +Negalima nuskaityti katalogo %x. + +Cannot write modification time of %x. +Nepavyksta šrašyti pakeitimo datos %x. + +Cannot read file attributes of %x. +Nepavyko perskaityti failo %x atributų. + +Cannot create directory %x. +Nepavyksta sukurti katalogo %x. + +Cannot determine final path for %x. +Galutinio %x kelio rasti nepavyko. + +Operation not supported by device. +Šis įrenginys nepalaiko šio veiksmo. + +Cannot resolve symbolic link %x. +Nepavyko rasti simbolinės nuorodos %x reikšmės. + +Unable to move %x to the recycle bin. +%x į šiukšliadėžę perkelti nepavyko. + +Authentication completed. +Autentifikavimas baigtas. + +You may close this page now and continue with FreeFileSync. +Jūs dabar galite uždaryti šį langą ir testi FreeFileSync. + +Authentication failed. +Nepavyko autentifikuoti. + +Unable to connect to %x. +Nepavyko prisijungti prie %x. + +Cannot find %x. +Negalima surasti %x. + +The name %x is used by more than one item in the folder. +Šis pavadinimas %x yra naudojamas daugiau nei vieną kartą. + +Please authorize access to user account %x. +Prašome suteikti prieigą šiam vartotojui %x. + +Cannot open file %x. +%x failo nepavyko atidaryti. + +The name %x is already used by another item. +Šis %x vardas jau yra naudoamas. + +Cannot determine free disk space for %x. +Negalima nustatyti laisvos disko dalies %x. + +Unable to disconnect from %x. +Nepavyko atsijungti nuo %x. + +Unable to access %x. +Nepavyko prisijungti %x. + +Failed to get information about server %x. +Nepavyko gauti informaciją apie serverį %x. + +Cannot monitor directory %x. +Nepavyko stebėti katalogo %x. + +Cannot find device %x. +Negalima surasti įrenginio %x. + +Cannot open directory %x. +Nepavyksta atversti direktorijos %x. + +Unsupported item type. +Nepalaikomas elemento tipas. + +Incorrect command line: +Netaisyklinga Komandinė eilutė: + +The server does not support authentication via %x. +Serveris nepalaiko %x autentifikavimo. + +Required: +Reikia: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Operacijai skirtas laikas baigsis po %x sekundės. +Operacijai skirtas laikas baigsis po %x sekundės. +Operacijai skirtas laikas baigsis po %x sekundžių. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Vienu metu negalima laukti daugiau nei %x prisijungimas. +Vienu metu negalima laukti daugiau nei %x prisijungimai. +Vienu metu negalima laukti daugiau nei %x prisijungimų. + + +Active connections: %x +Aktyvūs susijungimai: %x + +Failed to open SFTP channel number %x. +Nepavyko atidaryti SFTP kanalo %x. + Both sides have changed since last synchronization. Abi pusės buvo pakeistos nuo paskutinio suvienodinimo. @@ -109,9 +260,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Įdiegimo failai yra pažeisti. Prašome įdiegti iš naujo FreeFileSync. -Cannot load file %x. -Nepavyksta įkelti failo %x. - Cannot find the following folders: Nepavyksta rasti šių aplankų: @@ -140,6 +288,9 @@ %x elementų surasta +Time elapsed: +Praėjęs laikas: + File %x has an invalid date. Failas %x turi netinkamą datą. @@ -158,9 +309,6 @@ Items differ in attributes only Elementai skiriasi tik atributais -The name %x is used by more than one item in the folder. -Šis pavadinimas %x yra naudojamas daugiau nei vieną kartą. - Resolving symbolic link %x Ieškoma simbolinės nuorodos %x @@ -221,6 +369,15 @@ Out of memory. Trūksta atminties. +Show in Explorer +Rodyti naršyklėje + +Open with default application +Atversti su numatyta programa + +Browse directory +Naršyti katalogą + Database file %x is incompatible. Duomenų bazė %x yra netinkama. @@ -233,12 +390,6 @@ Database file is corrupted: Duomenų bazės failas yra sugadintas: -Cannot write file %x. -Nepavyksta įrašyti failo %x. - -Cannot read file %x. -Nepavyksta nuskaityti failo %x. - The database files do not yet contain information about the last synchronization. Duomenų bazės failas dar neturi informacijos apie paskutinį suvienodinimą. @@ -257,9 +408,6 @@ Cannot get process information. Nepavyksta gauti eigos informacijos. -Cannot read file attributes of %x. -Nepavyko perskaityti failo %x atributų. - Waiting while directory is locked: Laukiama kol katalogas yra užrakintas: @@ -333,6 +481,27 @@ Update attributes on right Atnaujinti atributus dešinėje +Error parsing file %x, row %y, column %z. +Klaida trinant failą %x, eilė %y, stulpelis %z. + +Services +Paslaugos + +Show All +Rodyti Visus + +Hide Others +Slėpti Kitus + +Hide %x +Slėpti %x + +Quit %x +Išeiti %x + +Cannot set directory locks for the following folders: +Negalima užrakinti šiuos aplankus kataloge: + Errors: Klaidos: @@ -357,27 +526,6 @@ Cleaning up log files: Žurnalinių failų valymas: -Error parsing file %x, row %y, column %z. -Klaida trinant failą %x, eilė %y, stulpelis %z. - -Services -Paslaugos - -Show All -Rodyti Visus - -Hide Others -Slėpti Kitus - -Hide %x -Slėpti %x - -Quit %x -Išeiti %x - -Cannot set directory locks for the following folders: -Negalima užrakinti šiuos aplankus kataloge: - 1 thread %x threads @@ -388,27 +536,12 @@ %x srautų -Cannot read directory %x. -Negalima nuskaityti katalogo %x. - %x/sec %x/sek %x items %x elementų -Show in Explorer -Rodyti naršyklėje - -Open with default application -Atversti su numatyta programa - -Browse directory -Naršyti katalogą - -Unable to connect to %x. -Nepavyko prisijungti prie %x. - Completed successfully Sėkmingai užbaigtas @@ -454,9 +587,6 @@ Cannot write file attributes of %x. Nepavyksta įrašyti atributų failui %x. -Cannot open file %x. -%x failo nepavyko atidaryti. - %x and %y have different content. %x ir %y turi skirtingą turinį. @@ -487,29 +617,20 @@ Source item %x not found Šaltinio elementas %x nerastas: -Cannot move file %x to %y. -Nepavyksta perkelti failo %x į %y. - Parent folder %x is not existing. Pirminis aplankas %x neegzistuoa. -The name %x is already used by another item. -Šis %x vardas jau yra naudoamas. - Cannot copy file %x to %y. Nepavyksta nukopijuoti failų %x į %y. -Cannot copy symbolic link %x to %y. -Nepavyko nukopijuoti simbolinės nuorodos %x į %y. - Creating a Volume Shadow Copy for %x... %x kuriamas Duomenų Šešėlinė Kopija... Cannot find folder %x. Negalima rasti aplanko %x. -Target folder %x already existing. -Tikslo aplankas %x jau yra. +Target folder %x is already existing, but was not available during folder comparison. +Jau egzistoja tikslinis aplankas %x, nors neegzistavo palyginimo metu. Target folder input field must not be empty. Tikslo aplanko įvesties laukas negali būti tuščias. @@ -532,17 +653,14 @@ Not enough free disk space available in: Nepakanka laisvos disko vietos: -Required: -Reikia: - Available: Pasiekiama: Some files will be synchronized as part of multiple base folders. Kai kurie failai bus suvienodinti, keliuse pagrindiniuose aplankuose. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Norint išvengti konflikto, reiktų sukurti išskyrimo filtrus, kad kiekvienas atnaujintas failas, būtų priskiriamas tik vienam pagrindiniam aplankui. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Norint išvengti konfliktų, nustatykite išskyrimo filtrus, taip, kad kiekvienas atnaujintas failas būtų tik viename pagrindiniame aplanke. Versioning folder: Versijų valdymo aplankas: @@ -568,124 +686,6 @@ Unable to create time stamp for versioning: Nepavyko sukurti versijos laiko žymą: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Nenumatytas duomenų srautas. -Numatytas: %x baitai -Esamas: %y baitai - - -Cannot write permissions of %x. -Nepavyksta įrašyti leidimų %x. - -Operation not supported between different devices. -Veiksmas yra nesuderinamas tarp atskitų įrenginių. - -Cannot delete file %x. -Nepavyksta ištrinti failo %x. - -Cannot delete symbolic link %x. -Negalima ištrinti virtualios nuorodos %x. - -Cannot delete directory %x. -Nepavyksta ištrinti katalogo %x. - -Error Code %x -Klaidos kodas %x - -Cannot write modification time of %x. -Nepavyksta šrašyti pakeitimo datos %x. - -Cannot create directory %x. -Nepavyksta sukurti katalogo %x. - -Cannot determine final path for %x. -Galutinio %x kelio rasti nepavyko. - -Operation not supported by device. -Šis įrenginys nepalaiko šio veiksmo. - -Cannot resolve symbolic link %x. -Nepavyko rasti simbolinės nuorodos %x reikšmės. - -Unable to move %x to the recycle bin. -%x į šiukšliadėžę perkelti nepavyko. - -Authentication completed. -Autentifikavimas baigtas. - -You may close this page now and continue with FreeFileSync. -Jūs dabar galite uždaryti šį langą ir testi FreeFileSync. - -Authentication failed. -Nepavyko autentifikuoti. - -Cannot find %x. -Negalima surasti %x. - -Please authorize access to user account %x. -Prašome suteikti prieigą šiam vartotojui %x. - -Cannot determine free disk space for %x. -Negalima nustatyti laisvos disko dalies %x. - -Unable to disconnect from %x. -Nepavyko atsijungti nuo %x. - -Unable to access %x. -Nepavyko prisijungti %x. - -Failed to get information about server %x. -Nepavyko gauti informaciją apie serverį %x. - -Cannot monitor directory %x. -Nepavyko stebėti katalogo %x. - -Cannot find device %x. -Negalima surasti įrenginio %x. - -Cannot open directory %x. -Nepavyksta atversti direktorijos %x. - -Unsupported item type. -Nepalaikomas elemento tipas. - -Incorrect command line: -Netaisyklinga Komandinė eilutė: - -The server does not support authentication via %x. -Serveris nepalaiko %x autentifikavimo. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Operacijai skirtas laikas baigsis po %x sekundės. -Operacijai skirtas laikas baigsis po %x sekundės. -Operacijai skirtas laikas baigsis po %x sekundžių. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Vienu metu negalima laukti daugiau nei %x prisijungimas. -Vienu metu negalima laukti daugiau nei %x prisijungimai. -Vienu metu negalima laukti daugiau nei %x prisijungimų. - - -Active connections: %x -Aktyvūs susijungimai: %x - -Failed to open SFTP channel number %x. -Nepavyko atidaryti SFTP kanalo %x. - Drag && drop Vilkti && Numesti @@ -752,6 +752,9 @@ Esamas: %y baitai Command line: Komandinė eilutė: +&Hide console window +&Paslėpti konsolės langą + The command is triggered if: - files or subfolders change @@ -787,8 +790,8 @@ Komanda inicijuojama jei: Waiting until directory is available: Laukiama kol katalogas bus prieinamas: -&Restore -&Atstatyti +&Configure +&Konfiguruoti &Show error message &Rodyti kaidą @@ -824,8 +827,8 @@ Komanda inicijuojama jei: Scanning... Tikrinama... -job name -Užduoties pavadinimas +configuration file +nustatymų failas System: Sleep Sistema: Miegoti @@ -836,8 +839,8 @@ Komanda inicijuojama jei: Nothing to synchronize Nėra ko suvienodinti -Executing command %x -Vykdyti komandą %x +Executing command: +Vykdoma komanda: You can switch to FreeFileSync's main window to resolve this issue. Sprendžiant šią problemą, galite persijungti i FreeFileSync pagrindinį langą. @@ -1038,6 +1041,12 @@ Komanda inicijuojama jei: Match case Atitikti atveją +Processed: +Atlikta: + +Remaining: +Likę: + New Naujas @@ -1274,14 +1283,17 @@ Komanda inicijuojama jei: &Don't show this dialog again &Nerodyti pakartotinai šio dialogo lango -Items found: -Rasta elementų: +Bytes: +Baitai: -Time remaining: -Likęs laikas: +Items: +Elementai: -Time elapsed: -Praėjęs laikas: +Synchronizing... +Suvienodinama... + +Minimize to notification area +Nuleisti į apačią dešinėje Bytes Baitai @@ -1289,12 +1301,6 @@ Komanda inicijuojama jei: Items Elementai -Synchronizing... -Suvienodinama... - -Minimize to notification area -Nuleisti į apačią dešinėje - When finished: Kai pabaigta: @@ -1370,6 +1376,12 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. &Delete logs after x days: &Ištrinti žurnalo įrašus po x dienų: +Notification sounds: +Pranešimo garsas: + +Synchronization finished: +Suvienodinimas pabaigtas: + Customize context menu: Pagrindinio meniu pasirinkimai: @@ -1521,36 +1533,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. &Execute &Vykdyti - -1 directory -%x directories - - -%x katalogas -%x katalogai -%x katalogų - - - -1 file -%x files - - -%x failas -%x failai -%x failų - - - -Showing %y of 1 row -Showing %y of %x rows - - -Rodoma %y iš %x eilutės -Rodoma %y iš %x eilučių -Rodoma %y iš %x eilučių - - Set direction: Nustatyti kryptį: @@ -1578,12 +1560,6 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. &Delete &Ištrinti -Include all -Įtraukti visus - -Exclude all -Neįtraukti visų - Show icons: Rodyti ženkliukus: @@ -1620,6 +1596,21 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Do&n't save &Nesaugoti +%x cannot be renamed. +%x negali būti pervardintas. + +New name: +Naujas pavadinimas: + +Rename Configuration +Pervardinti Pasirinkimą + +Configuration name must not be empty. +Pasirinkimo pavadinimas negali būti tuščias. + +&Rename... +&Pervardinti... + Hide configuration Paslėpti nustatymus @@ -1680,6 +1671,36 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. All files are in sync Visi failai suvienodinti + +1 directory +%x directories + + +%x katalogas +%x katalogai +%x katalogų + + + +1 file +%x files + + +%x failas +%x failai +%x failų + + + +Showing %y of 1 row +Showing %y of %x rows + + +Rodoma %y iš %x eilutės +Rodoma %y iš %x eilučių +Rodoma %y iš %x eilučių + + Cannot find %x Nepavyksta rasti %x @@ -1731,8 +1752,8 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Password: Slaptažodis: -Key password: -Rakto slaptažodis: +Key passphrase: +Rakto slaptafrazė: Please enter a file path. Prašome įvesti failo kelią. @@ -1899,6 +1920,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Minimum version count must be smaller than maximum count. Minimalus versijų skaičius turi būti mažesnis, nei maksimalus skaičius. +&Restore +&Atstatyti + Files Failai @@ -1965,6 +1989,9 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. The file is locked by another process: Failas yra užrakintas kito procceso: +Failed to determine file permission support for folder %x. +Nepavyko nustatyti aplanko %x, kuriame yra failas, leidimų palaikymą. + Cannot read security context of %x. Nepavyksta perskaityti %x saugumo konteksto. @@ -2018,12 +2045,12 @@ Tai garantuos pastovią buseną, netgi įvykus rimtai klaidai. Cannot change process I/O priorities. Nepavyksta pakeisti proceso I/O prioritetų. -Unable to shut down the system. -Nepavyko išjungti sistemos. - Checking recycle bin failed for folder %x. Tikrinama šiukšliadėžė. Failas %x nerastas. +Unable to shut down the system. +Nepavyko išjungti sistemos. + Prepare installation Ruošiamasi įdiegimui diff --git a/FreeFileSync/Build/Resources/Languages/norwegian.lng b/FreeFileSync/Build/Resources/Languages/norwegian.lng index 6a5146a9..6817a571 100755 --- a/FreeFileSync/Build/Resources/Languages/norwegian.lng +++ b/FreeFileSync/Build/Resources/Languages/norwegian.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +Kan ikke lese filen %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Uventet størrelse på datastrømmen. +Forventet: %x bytes +Faktisk: %y bytes + + +Cannot write file %x. +Kan ikke opprette filen %x. + +Cannot write permissions of %x. +Kan ikke skrive tillatelsene til %x. + +Operation not supported between different devices. +Operasjonen støttes ikke mellom ulike enheter. + +Cannot delete file %x. +Kan ikke slette filen %x. + +Cannot delete symbolic link %x. +Kan ikke slette symbolsk lenke %x. + +Cannot delete directory %x. +Kan ikke slette katalog %x. + +Cannot move file %x to %y. +Kan ikke flytte filen %x til %y. + +Cannot copy symbolic link %x to %y. +Kan ikke kopiere symbolsk forbindelse %x til %y. + +Error Code %x +Feilkode %x + +Cannot read directory %x. +Kan ikke lese katalogen %x. + +Cannot write modification time of %x. +Kan ikke oppdatere tidsendring på %x. + +Cannot read file attributes of %x. +Kan ikke lese filattributterne på %x. + +Cannot create directory %x. +Kan ikke lage katalog %x. + +Cannot determine final path for %x. +Kan ikke bestemme endelig sti for %x. + +Operation not supported by device. +Operasjonen støttes ikke av enheten. + +Cannot resolve symbolic link %x. +Kan ikke løse den symbolske forbindelsen %x. + +Unable to move %x to the recycle bin. +Kunne ikke flytte %x til papirkurven. + +Authentication completed. +Autentisering er ferdig. + +You may close this page now and continue with FreeFileSync. +Du kan lukke denne siden nå og fortsette med FreeFileSync. + +Authentication failed. +Autentisering mislyktes. + +Unable to connect to %x. +Kan ikke koble til %x. + +Cannot find %x. +Kan ikke finne %x. + +The name %x is used by more than one item in the folder. +Navnet %x brukes av mer enn ett element i mappen. + +Please authorize access to user account %x. +Vennligst godta tilgang til brukerkonto %x. + +Cannot open file %x. +Kan ikke åpne filen %x. + +The name %x is already used by another item. +Navnet %x brukes allerede av et annet element. + +Cannot determine free disk space for %x. +Kan ikke fastslå ledig diskplass for %x. + +Unable to disconnect from %x. +Kan ikke koble fra %x. + +Unable to access %x. +Får ikke tilgang til %x. + +Failed to get information about server %x. +Kunne ikke få informasjon om server %x. + +Cannot monitor directory %x. +Kan ikke overvåke katalog %x. + +Cannot find device %x. +Kan ikke finne enhet %x. + +Cannot open directory %x. +Kan ikke åpne katalog %x. + +Unsupported item type. +Ikke-støttet varetype. + +Incorrect command line: +Ugyldig kommando: + +The server does not support authentication via %x. +Tjeneren støtter ikke autentisering via %x. + +Required: +Krav: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Operasjonen timet ut etter 1 sekund. +Operasjonen timet ut etter %x sekunder. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Kan ikke vente på mer enn 1 tilkobling om gangen. +Kan ikke vente på mer enn %x tilkoblinger på en gang. + + +Active connections: %x +Aktive tilkoblinger: %x + +Failed to open SFTP channel number %x. +Kunne ikke åpne SFTP kanalnummer %x. + Both sides have changed since last synchronization. Begge sider er endret siden siste synkronisering. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Installasjonsfilene er ødelagte. Installer FreeFileSync på nytt. -Cannot load file %x. -Kan ikke lese filen %x. - Cannot find the following folders: Kan ikke finne følgende mapper: @@ -139,6 +285,9 @@ %x punkter funnet +Time elapsed: +Brukt tid: + File %x has an invalid date. Filen %x har en ugyldig dato. @@ -157,9 +306,6 @@ Items differ in attributes only Elementene har kun forskjellige attributter -The name %x is used by more than one item in the folder. -Navnet %x brukes av mer enn ett element i mappen. - Resolving symbolic link %x Løser symbolsk forbindelse %x @@ -220,6 +366,15 @@ Out of memory. Ikke nok minne. +Show in Explorer +Vis i Explorer + +Open with default application +Åpne med standardprogrammet + +Browse directory +Bla i katalogen + Database file %x is incompatible. Databasefilen %x er inkompatibel. @@ -232,12 +387,6 @@ Database file is corrupted: Databasefilen er skadet: -Cannot write file %x. -Kan ikke opprette filen %x. - -Cannot read file %x. -Kan ikke lese filen %x. - The database files do not yet contain information about the last synchronization. Databasefilene inneholder ennå ikke informasjon om siste synkronisering. @@ -256,9 +405,6 @@ Cannot get process information. Kan ikke hente bearbeidings-informasjon. -Cannot read file attributes of %x. -Kan ikke lese filattributterne på %x. - Waiting while directory is locked: Venter mens katalogen låses: @@ -331,6 +477,27 @@ Update attributes on right Oppdater attributter til høyre +Error parsing file %x, row %y, column %z. +Behandlingsfeil i filen %x, rad %y, kolonne %z. + +Services +Tjenester + +Show All +Vis alt + +Hide Others +Skjul andre + +Hide %x +Skjul %x + +Quit %x +Avslutt %x + +Cannot set directory locks for the following folders: +Kan ikke angi kataloglås for følgende mapper: + Errors: Feil: @@ -355,27 +522,6 @@ Cleaning up log files: Sletter loggfiler: -Error parsing file %x, row %y, column %z. -Behandlingsfeil i filen %x, rad %y, kolonne %z. - -Services -Tjenester - -Show All -Vis alt - -Hide Others -Skjul andre - -Hide %x -Skjul %x - -Quit %x -Avslutt %x - -Cannot set directory locks for the following folders: -Kan ikke angi kataloglås for følgende mapper: - 1 thread %x threads @@ -385,27 +531,12 @@ %x tråder -Cannot read directory %x. -Kan ikke lese katalogen %x. - %x/sec %x/sek %x items %x elementer -Show in Explorer -Vis i Explorer - -Open with default application -Åpne med standardprogrammet - -Browse directory -Bla i katalogen - -Unable to connect to %x. -Kan ikke koble til %x. - Completed successfully Fullførte feilfritt @@ -451,9 +582,6 @@ Cannot write file attributes of %x. Kan ikke skrive filattributter til %x. -Cannot open file %x. -Kan ikke åpne filen %x. - %x and %y have different content. %x og %y har forskjellig innhold. @@ -484,29 +612,20 @@ Source item %x not found Kildeelementet %x ikke funnet -Cannot move file %x to %y. -Kan ikke flytte filen %x til %y. - Parent folder %x is not existing. Overordnet mappe %x finnes ikke. -The name %x is already used by another item. -Navnet %x brukes allerede av et annet element. - Cannot copy file %x to %y. Kan ikke kopiere filen %x til %y. -Cannot copy symbolic link %x to %y. -Kan ikke kopiere symbolsk forbindelse %x til %y. - Creating a Volume Shadow Copy for %x... Oppretter en Volume Shadow-kopi for %x... Cannot find folder %x. Finner ikke mappen %x. -Target folder %x already existing. -Målmappen %x finnes allerede. +Target folder %x is already existing, but was not available during folder comparison. +Målmappe %x er allerede eksisterende, men var ikke tilgjengelig under mappesammenligning. Target folder input field must not be empty. Målmappens datafelt må ikke være tomt. @@ -529,17 +648,14 @@ Not enough free disk space available in: Ikke nok ledig diskplass på: -Required: -Krav: - Available: Tilgjengelig: Some files will be synchronized as part of multiple base folders. Noen filer vil bli synkronisert som en del av flere basemapper. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -For å unngå konflikter, sett opp utelukkelsesfiltre, slik at hver oppdaterte fil regnes av bare én basemappe. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +For å unngå konflikter, sett opp ekskluder filtre slik at hver oppdaterte fil bare er inkludert i en basemappe. Versioning folder: Versjonsmappe: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Kan ikke opprette tidsstempel til versjonen: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Uventet størrelse på datastrømmen. -Forventet: %x bytes -Faktisk: %y bytes - - -Cannot write permissions of %x. -Kan ikke skrive tillatelsene til %x. - -Operation not supported between different devices. -Operasjonen støttes ikke mellom ulike enheter. - -Cannot delete file %x. -Kan ikke slette filen %x. - -Cannot delete symbolic link %x. -Kan ikke slette symbolsk lenke %x. - -Cannot delete directory %x. -Kan ikke slette katalog %x. - -Error Code %x -Feilkode %x - -Cannot write modification time of %x. -Kan ikke oppdatere tidsendring på %x. - -Cannot create directory %x. -Kan ikke lage katalog %x. - -Cannot determine final path for %x. -Kan ikke bestemme endelig sti for %x. - -Operation not supported by device. -Operasjonen støttes ikke av enheten. - -Cannot resolve symbolic link %x. -Kan ikke løse den symbolske forbindelsen %x. - -Unable to move %x to the recycle bin. -Kunne ikke flytte %x til papirkurven. - -Authentication completed. -Autentisering er ferdig. - -You may close this page now and continue with FreeFileSync. -Du kan lukke denne siden nå og fortsette med FreeFileSync. - -Authentication failed. -Autentisering mislyktes. - -Cannot find %x. -Kan ikke finne %x. - -Please authorize access to user account %x. -Vennligst godta tilgang til brukerkonto %x. - -Cannot determine free disk space for %x. -Kan ikke fastslå ledig diskplass for %x. - -Unable to disconnect from %x. -Kan ikke koble fra %x. - -Unable to access %x. -Får ikke tilgang til %x. - -Failed to get information about server %x. -Kunne ikke få informasjon om server %x. - -Cannot monitor directory %x. -Kan ikke overvåke katalog %x. - -Cannot find device %x. -Kan ikke finne enhet %x. - -Cannot open directory %x. -Kan ikke åpne katalog %x. - -Unsupported item type. -Ikke-støttet varetype. - -Incorrect command line: -Ugyldig kommando: - -The server does not support authentication via %x. -Tjeneren støtter ikke autentisering via %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Operasjonen timet ut etter 1 sekund. -Operasjonen timet ut etter %x sekunder. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Kan ikke vente på mer enn 1 tilkobling om gangen. -Kan ikke vente på mer enn %x tilkoblinger på en gang. - - -Active connections: %x -Aktive tilkoblinger: %x - -Failed to open SFTP channel number %x. -Kunne ikke åpne SFTP kanalnummer %x. - Drag && drop Dra && slipp @@ -747,6 +747,9 @@ Faktisk: %y bytes Command line: Kommandolinje: +&Hide console window +&Skjul konsollvindu + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ Kommandoen utføres hvis: Waiting until directory is available: Venter til katalogen er tilgjengelig: -&Restore -&Gjenopprett +&Configure +&Konfigurer &Show error message &Vis feilmelding @@ -818,8 +821,8 @@ Kommandoen utføres hvis: Scanning... Skanner... -job name -jobbnavn +configuration file +konfigurasjonsfil System: Sleep System: Sov @@ -830,8 +833,8 @@ Kommandoen utføres hvis: Nothing to synchronize Alt er synkronisert -Executing command %x -Utfør kommandoen %x +Executing command: +Utfører kommando: You can switch to FreeFileSync's main window to resolve this issue. Du kan skifte til FreeFileSync's hovedvindu for at løse dette problemet. @@ -1031,6 +1034,12 @@ Kommandoen utføres hvis: Match case Treff-følsomhet (a/A) +Processed: +Bearbeidet: + +Remaining: +Gjenstående: + New Ny @@ -1267,14 +1276,17 @@ Kommandoen utføres hvis: &Don't show this dialog again &Ikke vis denne dialogen igjen -Items found: -Elementer funnet: +Bytes: +Bytes: -Time remaining: -Resterende tid: +Items: +Elementer: -Time elapsed: -Brukt tid: +Synchronizing... +Synkroniserer... + +Minimize to notification area +Minimér til status-feltet Bytes Bytes @@ -1282,12 +1294,6 @@ Kommandoen utføres hvis: Items Elementer -Synchronizing... -Synkroniserer... - -Minimize to notification area -Minimér til status-feltet - When finished: Når ferdig: @@ -1363,6 +1369,12 @@ Sikrer prosessen ved alvorlige feil. &Delete logs after x days: &Slett logger etter x dager: +Notification sounds: +Varslingslyder: + +Synchronization finished: +Synkroniseringen er ferdig: + Customize context menu: Tilpass kontekst-meny: @@ -1513,33 +1525,6 @@ Sikrer prosessen ved alvorlige feil. &Execute &Utfør - -1 directory -%x directories - - -1 katalog -%x kataloger - - - -1 file -%x files - - -1 fil -%x filer - - - -Showing %y of 1 row -Showing %y of %x rows - - -Viser %y av 1 rad -Viser %y av %x rader - - Set direction: Sett retning: @@ -1567,12 +1552,6 @@ Sikrer prosessen ved alvorlige feil. &Delete &Slett -Include all -Velg alle - -Exclude all -Ekskludér alle - Show icons: Vis ikoner: @@ -1609,6 +1588,21 @@ Sikrer prosessen ved alvorlige feil. Do&n't save &Ikke lagre +%x cannot be renamed. +%x kan ikke gi nytt navn. + +New name: +Nytt navn: + +Rename Configuration +Gi nytt navn til konfigurasjonen + +Configuration name must not be empty. +Konfigurasjonsnavnet må ikke være tomt. + +&Rename... +&Gi nytt navn... + Hide configuration Skjul konfigurasjoner @@ -1669,6 +1663,33 @@ Sikrer prosessen ved alvorlige feil. All files are in sync Alle filer er synkroniserte + +1 directory +%x directories + + +1 katalog +%x kataloger + + + +1 file +%x files + + +1 fil +%x filer + + + +Showing %y of 1 row +Showing %y of %x rows + + +Viser %y av 1 rad +Viser %y av %x rader + + Cannot find %x Kan ikke finne %x @@ -1720,8 +1741,8 @@ Sikrer prosessen ved alvorlige feil. Password: Passord: -Key password: -Nøkkelpassord: +Key passphrase: +Nøkkelord: Please enter a file path. Vennligst skriv inn en filbane. @@ -1885,6 +1906,9 @@ Sikrer prosessen ved alvorlige feil. Minimum version count must be smaller than maximum count. Minimumversjons-tellingen må være mindre enn maksimumstellingen. +&Restore +&Gjenopprett + Files Filer @@ -1951,6 +1975,9 @@ Sikrer prosessen ved alvorlige feil. The file is locked by another process: Filen er låst av en annen prosess: +Failed to determine file permission support for folder %x. +Kunne ikke bestemme støtte for filtillatelse for mappe %x. + Cannot read security context of %x. Kan ikke lese sikkerhetsinnstillinger på %x. @@ -2002,12 +2029,12 @@ Sikrer prosessen ved alvorlige feil. Cannot change process I/O priorities. Kan ikke endre I/O prioriteter. -Unable to shut down the system. -Kan ikke slå av systemet. - Checking recycle bin failed for folder %x. Det å sjekke papirkurven gikk galt for mappen %x. +Unable to shut down the system. +Kan ikke slå av systemet. + Prepare installation Forbered installering diff --git a/FreeFileSync/Build/Resources/Languages/polish.lng b/FreeFileSync/Build/Resources/Languages/polish.lng index 1159b893..eb79f424 100755 --- a/FreeFileSync/Build/Resources/Languages/polish.lng +++ b/FreeFileSync/Build/Resources/Languages/polish.lng @@ -7,6 +7,157 @@ n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2 +Cannot read file %x. +Nie można odczytać pliku %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Niespodziewany rozmiar strumienia danych. +Oczekiwany: %x bajtów +Przesłany: %y bajtów + + +Cannot write file %x. +Nie można zapisać pliku %x. + +Cannot write permissions of %x. +Nie można zapisać uprawnień %x. + +Operation not supported between different devices. +Operacja nie jest obsługiwana między różnymi urządzeniami. + +Cannot delete file %x. +Nie można usunąć pliku %x. + +Cannot delete symbolic link %x. +Nie można usunąć dowiązania symbolicznego %x. + +Cannot delete directory %x. +Nie można usunąć katalogu %x. + +Cannot move file %x to %y. +Nie można przenieść pliku %x do %y. + +Cannot copy symbolic link %x to %y. +Nie można skopiować linku symbolicznego %x do %y. + +Error Code %x +Kod błędu %x + +Cannot read directory %x. +Nie można odczytać katalogu %x. + +Cannot write modification time of %x. +Nie można zapisać czasu modyfikacji %x. + +Cannot read file attributes of %x. +Nie można odczytać atrybutów pliku %x. + +Cannot create directory %x. +Nie można utworzyć katalogu %x. + +Cannot determine final path for %x. +Nie można określić ostatecznej ścieżki dla %x. + +Operation not supported by device. +Operacja nie jest obsługiwana przez urządzenie. + +Cannot resolve symbolic link %x. +Nie można określić położenia dowiązania symbolicznego %x. + +Unable to move %x to the recycle bin. +Nie można przenieść %x do kosza. + +Authentication completed. +Uwierzytelnianie zakończone. + +You may close this page now and continue with FreeFileSync. +Możesz teraz zamknąć tę stronę i kontynuować FreeFileSync. + +Authentication failed. +Uwierzytelnianie nie powiodło się. + +Unable to connect to %x. +Błąd połączenia do %x. + +Cannot find %x. +Nie można odnaleźć %x. + +The name %x is used by more than one item in the folder. +Nazwa %x jest używana przez więcej niż jeden element w folderze. + +Please authorize access to user account %x. +Proszę autoryzować dostęp do konta użytkownika %x. + +Cannot open file %x. +Nie można otworzyć pliku %x. + +The name %x is already used by another item. +Nazwa %x jest już używana przez inny element. + +Cannot determine free disk space for %x. +Nie można określić wolnego miejsca na %x. + +Unable to disconnect from %x. +Nie można odłączyć od %x. + +Unable to access %x. +Brak dostępu do %x. + +Failed to get information about server %x. +Nie można uzyskać informacji o serwerze %x. + +Cannot monitor directory %x. +Nie można monitorować katalogu %x. + +Cannot find device %x. +Nie można odnaleźć urządzenia %x. + +Cannot open directory %x. +Nie można otworzyć katalogu %x. + +Unsupported item type. +Nieobsługiwany typ elementu. + +Incorrect command line: +Niepoprawne polecenie: + +The server does not support authentication via %x. +Serwer nie wspiera uwierzytelniania przez %x. + +Required: +Wymagane: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Przekroczono czas oczekiwania 1 sekundy dla zadania. +Przekroczono czas oczekiwania %x sekund dla zadania. +Przekroczono czas oczekiwania %x sekund dla zadania. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Nie można oczekiwać na więcej niż 1 zadanie na raz. +Nie można oczekiwać na więcej niż %x zadania na raz. +Nie można oczekiwać na więcej niż %x zadań na raz. + + +Active connections: %x +Aktywne połączenia: %x + +Failed to open SFTP channel number %x. +Nie można otworzyć kanału SFTP numer %x. + Both sides have changed since last synchronization. Obie strony uległy zmianie od ostatniej synchronizacji. @@ -109,9 +260,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Pliki instalacyjne są uszkodzone. Przeinstaluj program FreeFileSync. -Cannot load file %x. -Nie można wczytać pliku %x. - Cannot find the following folders: Nie można znaleźć następujących katalogów: @@ -140,6 +288,9 @@ Znaleziono %x elementów +Time elapsed: +Upłynęło: + File %x has an invalid date. Plik %x ma nieprawidłową datę. @@ -158,9 +309,6 @@ Items differ in attributes only Elementy różnią się wyłącznie atrybutami -The name %x is used by more than one item in the folder. -Nazwa %x jest używana przez więcej niż jeden element w folderze. - Resolving symbolic link %x Rozwiązywanie dowiązania symbolicznego %x @@ -221,6 +369,15 @@ Out of memory. Brak wolnej pamięci. +Show in Explorer +Wyświetl w Eksploratorze + +Open with default application +Otwórz za pomocą domyślnej aplikacji + +Browse directory +Przeglądaj katalog + Database file %x is incompatible. Plik bazy danych %x nie jest kompatybilny. @@ -233,12 +390,6 @@ Database file is corrupted: Plik bazy danych jest uszkodzony: -Cannot write file %x. -Nie można zapisać pliku %x. - -Cannot read file %x. -Nie można odczytać pliku %x. - The database files do not yet contain information about the last synchronization. Pliki bazy danych nie posiadają żadnych informacji o ostatniej synchronizacji. @@ -257,9 +408,6 @@ Cannot get process information. Nie można uzyskać informacji dla procesu. -Cannot read file attributes of %x. -Nie można odczytać atrybutów pliku %x. - Waiting while directory is locked: Oczekiwanie przez blokadę katalogu: @@ -333,6 +481,27 @@ Update attributes on right Aktualizuj atrybuty po prawej stronie +Error parsing file %x, row %y, column %z. +Błąd podczas parsowania pliku %x, rząd %y, kolumna %z. + +Services +Usługi + +Show All +Pokaż Wszystko + +Hide Others +Ukryj Inne + +Hide %x +Ukryj %x + +Quit %x +Zamknij %x + +Cannot set directory locks for the following folders: +Nie można zablokować katalogów dla poniższych folderów: + Errors: Błędy: @@ -357,27 +526,6 @@ Cleaning up log files: Czyszczenie plików logów: -Error parsing file %x, row %y, column %z. -Błąd podczas parsowania pliku %x, rząd %y, kolumna %z. - -Services -Usługi - -Show All -Pokaż Wszystko - -Hide Others -Ukryj Inne - -Hide %x -Ukryj %x - -Quit %x -Zamknij %x - -Cannot set directory locks for the following folders: -Nie można zablokować katalogów dla poniższych folderów: - 1 thread %x threads @@ -388,27 +536,12 @@ %x wątków -Cannot read directory %x. -Nie można odczytać katalogu %x. - %x/sec %x/sek %x items %x elementów -Show in Explorer -Wyświetl w Eksploratorze - -Open with default application -Otwórz za pomocą domyślnej aplikacji - -Browse directory -Przeglądaj katalog - -Unable to connect to %x. -Błąd połączenia do %x. - Completed successfully Zakończono bez błędów @@ -454,9 +587,6 @@ Cannot write file attributes of %x. Nie można zapisać atrybutów %x. -Cannot open file %x. -Nie można otworzyć pliku %x. - %x and %y have different content. %x i %y mają różną zawartość. @@ -487,29 +617,20 @@ Source item %x not found Nie znaleziono elementu źródłowego %x -Cannot move file %x to %y. -Nie można przenieść pliku %x do %y. - Parent folder %x is not existing. Nadrzędny folder %x nie istnieje. -The name %x is already used by another item. -Nazwa %x jest już używana przez inny element. - Cannot copy file %x to %y. Nie można skopiować pliku %x do %y. -Cannot copy symbolic link %x to %y. -Nie można skopiować linku symbolicznego %x do %y. - Creating a Volume Shadow Copy for %x... Tworzenie Volume Shadow Copy dla %x... Cannot find folder %x. Nie można znaleźć katalogu %x. -Target folder %x already existing. -Katalog docelowy %x już istnieje. +Target folder %x is already existing, but was not available during folder comparison. +Folder docelowy %x już istnieje, ale nie był dostępny podczas porównywania folderów. Target folder input field must not be empty. Pole katalogu docelowego nie może być puste. @@ -532,17 +653,14 @@ Not enough free disk space available in: Brak wystarczającej przestrzeni dyskowej na: -Required: -Wymagane: - Available: Dostępne: Some files will be synchronized as part of multiple base folders. Niektóre pliki będą zsynchronizowane jako część kilku katalogów źródłowych. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Aby uniknąć konfliktów ustaw filtry tak aby wykluczyć przynależność pliku do wielu katalogów źródłowych. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Aby uniknąć konfliktów, skonfiguruj filtry wykluczania tak, aby każdy zaktualizowany plik był zawarty tylko w jednym folderze bazowym. Versioning folder: Wersjonowanie katalogów: @@ -568,124 +686,6 @@ Unable to create time stamp for versioning: Nie można utworzyć znacznika czasu dla wersjonowania: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Niespodziewany rozmiar strumienia danych. -Oczekiwany: %x bajtów -Przesłany: %y bajtów - - -Cannot write permissions of %x. -Nie można zapisać uprawnień %x. - -Operation not supported between different devices. -Operacja nie jest obsługiwana między różnymi urządzeniami. - -Cannot delete file %x. -Nie można usunąć pliku %x. - -Cannot delete symbolic link %x. -Nie można usunąć dowiązania symbolicznego %x. - -Cannot delete directory %x. -Nie można usunąć katalogu %x. - -Error Code %x -Kod błędu %x - -Cannot write modification time of %x. -Nie można zapisać czasu modyfikacji %x. - -Cannot create directory %x. -Nie można utworzyć katalogu %x. - -Cannot determine final path for %x. -Nie można określić ostatecznej ścieżki dla %x. - -Operation not supported by device. -Operacja nie jest obsługiwana przez urządzenie. - -Cannot resolve symbolic link %x. -Nie można określić położenia dowiązania symbolicznego %x. - -Unable to move %x to the recycle bin. -Nie można przenieść %x do kosza. - -Authentication completed. -Uwierzytelnianie zakończone. - -You may close this page now and continue with FreeFileSync. -Możesz teraz zamknąć tę stronę i kontynuować FreeFileSync. - -Authentication failed. -Uwierzytelnianie nie powiodło się. - -Cannot find %x. -Nie można odnaleźć %x. - -Please authorize access to user account %x. -Proszę autoryzować dostęp do konta użytkownika %x. - -Cannot determine free disk space for %x. -Nie można określić wolnego miejsca na %x. - -Unable to disconnect from %x. -Nie można odłączyć od %x. - -Unable to access %x. -Brak dostępu do %x. - -Failed to get information about server %x. -Nie można uzyskać informacji o serwerze %x. - -Cannot monitor directory %x. -Nie można monitorować katalogu %x. - -Cannot find device %x. -Nie można odnaleźć urządzenia %x. - -Cannot open directory %x. -Nie można otworzyć katalogu %x. - -Unsupported item type. -Nieobsługiwany typ elementu. - -Incorrect command line: -Niepoprawne polecenie: - -The server does not support authentication via %x. -Serwer nie wspiera uwierzytelniania przez %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Przekroczono czas oczekiwania 1 sekundy dla zadania. -Przekroczono czas oczekiwania %x sekund dla zadania. -Przekroczono czas oczekiwania %x sekund dla zadania. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Nie można oczekiwać na więcej niż 1 zadanie na raz. -Nie można oczekiwać na więcej niż %x zadania na raz. -Nie można oczekiwać na więcej niż %x zadań na raz. - - -Active connections: %x -Aktywne połączenia: %x - -Failed to open SFTP channel number %x. -Nie można otworzyć kanału SFTP numer %x. - Drag && drop Drag && Drop @@ -752,6 +752,9 @@ Przesłany: %y bajtów Command line: Polecenie: +&Hide console window +&Ukryj okno konsoli + The command is triggered if: - files or subfolders change @@ -787,8 +790,8 @@ Komenda jest wykonywana gdy: Waiting until directory is available: Oczekiwanie, aż katalog będzie dostępny: -&Restore -&Przywróć +&Configure +&Konfiguruj &Show error message &Pokaż komunikat o błędzie @@ -824,8 +827,8 @@ Komenda jest wykonywana gdy: Scanning... Skanowanie... -job name -nazwa zadania +configuration file +plik konfiguracyjny System: Sleep System: Uśpienie @@ -836,8 +839,8 @@ Komenda jest wykonywana gdy: Nothing to synchronize Brak plików do synchronizacji -Executing command %x -Wykonywanie polecenia %x +Executing command: +Wykonanie polecenia: You can switch to FreeFileSync's main window to resolve this issue. Możesz przejść do głównego okna FreeFileSync abe rozwiązać ten problem. @@ -1038,6 +1041,12 @@ Komenda jest wykonywana gdy: Match case Uwzględnij wielkość liter +Processed: +Przetworzone: + +Remaining: +Pozostało: + New Nowy @@ -1274,14 +1283,17 @@ Komenda jest wykonywana gdy: &Don't show this dialog again &Nie pokazuj więcej tego okna -Items found: -Znalezione elementy: +Bytes: +Bajty: -Time remaining: -Do ukończenia: +Items: +Elementy: -Time elapsed: -Upłynęło: +Synchronizing... +Synchronizuję... + +Minimize to notification area +Minimalizuj do obszaru powiadomień Bytes Bajty @@ -1289,12 +1301,6 @@ Komenda jest wykonywana gdy: Items Elementy -Synchronizing... -Synchronizuję... - -Minimize to notification area -Minimalizuj do obszaru powiadomień - When finished: Gdy zakończono: @@ -1359,7 +1365,7 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp wymaga uprawnień administratora Transfer file and folder permissions. -kopiuj uprawnienia plików i katalogów. +Kopiuj uprawnienia plików i katalogów. Show all permanently hidden dialogs and warning messages again Przywróć wszystkie, stale ukryte dialogi i powiadomienia @@ -1370,6 +1376,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp &Delete logs after x days: &Skasuj logi po x dniach: +Notification sounds: +Dźwięki powiadomień: + +Synchronization finished: +Synchronizacja zakończona: + Customize context menu: Dostosuj menu kontekstowe: @@ -1521,36 +1533,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp &Execute &Wykonaj - -1 directory -%x directories - - -1 katalog -%x katalogi -%x katalogów - - - -1 file -%x files - - -1 plik -%x pliki -%x plików - - - -Showing %y of 1 row -Showing %y of %x rows - - -Widok %y z 1 wiersza -Widok %y z %x wierszy -Widok %y z %x wierszy - - Set direction: Kierunek synchronizacji: @@ -1578,12 +1560,6 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp &Delete &Usuń -Include all -Zaznacz wszystko - -Exclude all -Odznacz wszystko - Show icons: Pokaż ikony: @@ -1620,6 +1596,21 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Do&n't save &Nie zapisuj +%x cannot be renamed. +%x nie można zmienić nazwy. + +New name: +Nowa nazwa: + +Rename Configuration +Zmień nazwę Konfiguracji + +Configuration name must not be empty. +Nazwa konfiguracji nie może być pusta. + +&Rename... +&Zmień nazwę... + Hide configuration Ukryj konfiguracje @@ -1680,6 +1671,36 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp All files are in sync Pliki zsynchronizowane + +1 directory +%x directories + + +1 katalog +%x katalogi +%x katalogów + + + +1 file +%x files + + +1 plik +%x pliki +%x plików + + + +Showing %y of 1 row +Showing %y of %x rows + + +Widok %y z 1 wiersza +Widok %y z %x wierszy +Widok %y z %x wierszy + + Cannot find %x Nie można znaleźć %x @@ -1731,8 +1752,8 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Password: Hasło: -Key password: -Hasło klucza: +Key passphrase: +Hasło kluczowe: Please enter a file path. Wprowadź ścieżkę do pliku. @@ -1899,6 +1920,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Minimum version count must be smaller than maximum count. Minimalna liczba wersji musi być mniejsza od maksymalnej. +&Restore +&Przywróć + Files Pliki @@ -1965,6 +1989,9 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp The file is locked by another process: Plik jest zablokowany przez inny proces: +Failed to determine file permission support for folder %x. +Nie można określić uprawnień do plików dla folderu %x. + Cannot read security context of %x. Nie można odczytać ustawień bezpieczeństwa %x. @@ -2018,12 +2045,12 @@ program kopiuje zawartość do pliku tymczasowego (*.ffs_tmp), a następnie nadp Cannot change process I/O priorities. Nie można zmienić priorytetu I/O procesu. -Unable to shut down the system. -Nie można wyłączyć systemu. - Checking recycle bin failed for folder %x. Sprawdzanie kosza systemowego dla katalogu %x zakończone niepowodzeniem. +Unable to shut down the system. +Nie można wyłączyć systemu. + Prepare installation Przygotuj instalację diff --git a/FreeFileSync/Build/Resources/Languages/portuguese.lng b/FreeFileSync/Build/Resources/Languages/portuguese.lng index 06aab803..afd9ab8d 100755 --- a/FreeFileSync/Build/Resources/Languages/portuguese.lng +++ b/FreeFileSync/Build/Resources/Languages/portuguese.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +Não é possível ler o ficheiro %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Tamanho inesperado do fluxo de dados. +Esperado: %x bytes +Actual: %y bytes + + +Cannot write file %x. +Não é possível escrever o ficheiro %x. + +Cannot write permissions of %x. +Não é possível escrever as permissões de %x. + +Operation not supported between different devices. +Operação não suportada entre dispositivos diferentes. + +Cannot delete file %x. +Não é possível eliminar o ficheiro %x. + +Cannot delete symbolic link %x. +Não é possível remover o link simbólico %x. + +Cannot delete directory %x. +Não é possível eliminar o directório %x. + +Cannot move file %x to %y. +Não é possível mover o ficheiro %x para %y. + +Cannot copy symbolic link %x to %y. +Não é possível criar o link simbólico de %x para %y. + +Error Code %x +Código de Erro %x + +Cannot read directory %x. +Não é possível ler o directório %x. + +Cannot write modification time of %x. +Não é possível alterar a data de modificação a %x. + +Cannot read file attributes of %x. +Não é possível ler os atributos do ficheiro %x. + +Cannot create directory %x. +Não é possível criar o directório %x. + +Cannot determine final path for %x. +Não é possível determinar o caminho final de %x. + +Operation not supported by device. +Operação não suportada pelo dispositivo. + +Cannot resolve symbolic link %x. +Não é possível resolver o link simbólico %x. + +Unable to move %x to the recycle bin. +Não é possível mover %x para a reciclagem. + +Authentication completed. +Autenticação completada. + +You may close this page now and continue with FreeFileSync. +Você pode cerrar esta página agora e continuar com o FreeFileSync. + +Authentication failed. +Falha na autenticação. + +Unable to connect to %x. +Não é possível conectar-se em %x. + +Cannot find %x. +Não é possível encontrar %x. + +The name %x is used by more than one item in the folder. +O nome %x é usado por mais de um item na pasta. + +Please authorize access to user account %x. +Por favor, autorize o acesso à conta de usuário %x. + +Cannot open file %x. +Não é possível abrir o ficheiro %x. + +The name %x is already used by another item. +O nome %x já está em uso por outro item. + +Cannot determine free disk space for %x. +Não é possível determinar o espaço livre no disco %x. + +Unable to disconnect from %x. +Incapaz de se desconectar de %x. + +Unable to access %x. +Incapaz de aceder %x. + +Failed to get information about server %x. +Falha ao obter informações do servidor %x. + +Cannot monitor directory %x. +Não é possível monitorizar o directório %x. + +Cannot find device %x. +Não é possível encontrar o dispositivo %x. + +Cannot open directory %x. +Não é possível abrir o directório %x. + +Unsupported item type. +Tipo de item não suportado. + +Incorrect command line: +Linha de comandos incorrecta: + +The server does not support authentication via %x. +O servidor não suporta autenticação via %x. + +Required: +Requirido: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +O tempo limite da operação esgotou após 1 segundo. +O tempo limite da operação esgotou após %x segundos. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Não é possível aguardar em mais do que 1 conexão ao mesmo tempo. +Não é possível aguardar em mais do que %x conexões ao mesmo tempo. + + +Active connections: %x +Conexões activas: %x + +Failed to open SFTP channel number %x. +Falha ao abrir canal SFTP número %x. + Both sides have changed since last synchronization. Ambos os lados tiveram alterações desde a última sincronização. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Os ficheiros de instalação estão corrompidos. Por favor, reinstale o FreeFileSync. -Cannot load file %x. -Não é possível carregar o ficheiro %x. - Cannot find the following folders: Não é possível encontrar as seguintes pastas: @@ -139,6 +285,9 @@ %x itens encontrados +Time elapsed: +Tempo decorrido: + File %x has an invalid date. Ficheiro %x tem data inválida. @@ -157,9 +306,6 @@ Items differ in attributes only Itens diferem apenas nos atributos -The name %x is used by more than one item in the folder. -O nome %x é usado por mais de um item na pasta. - Resolving symbolic link %x Resolver link simbólico %x @@ -220,6 +366,15 @@ Out of memory. Sem memória disponível. +Show in Explorer +Mostrar no Explorer + +Open with default application +Abrir com a aplicação associada + +Browse directory +Procurar directório + Database file %x is incompatible. Base de dados %x não é compatível. @@ -232,12 +387,6 @@ Database file is corrupted: O ficheiro da base de dados está corrompido: -Cannot write file %x. -Não é possível escrever o ficheiro %x. - -Cannot read file %x. -Não é possível ler o ficheiro %x. - The database files do not yet contain information about the last synchronization. Os ficheiros da base de dados ainda não contém informações sobre a última sincronização. @@ -256,9 +405,6 @@ Cannot get process information. Não é possível obter informação sobre o processo. -Cannot read file attributes of %x. -Não é possível ler os atributos do ficheiro %x. - Waiting while directory is locked: À espera do bloqueio do directório: @@ -385,27 +531,12 @@ %x threads -Cannot read directory %x. -Não é possível ler o directório %x. - %x/sec %x/seg. %x items %x itens -Show in Explorer -Mostrar no Explorer - -Open with default application -Abrir com a aplicação associada - -Browse directory -Procurar directório - -Unable to connect to %x. -Não é possível conectar-se em %x. - Completed successfully Concluído com sucesso @@ -451,9 +582,6 @@ Cannot write file attributes of %x. Não é possível escrever os atributos de %x. -Cannot open file %x. -Não é possível abrir o ficheiro %x. - %x and %y have different content. %x e %y tem conteúdos distintos. @@ -484,29 +612,20 @@ Source item %x not found Item de origem %x não encontrado -Cannot move file %x to %y. -Não é possível mover o ficheiro %x para %y. - Parent folder %x is not existing. A pasta pai %x não existe. -The name %x is already used by another item. -O nome %x já está em uso por outro item. - Cannot copy file %x to %y. Não é possível copiar o ficheiro %x para %y. -Cannot copy symbolic link %x to %y. -Não é possível criar o link simbólico de %x para %y. - Creating a Volume Shadow Copy for %x... A criar Volume Shadow Copy para %x... Cannot find folder %x. Não é possível encontrar a pasta %x. -Target folder %x already existing. -Directório de destino %x já existe. +Target folder %x is already existing, but was not available during folder comparison. +A pasta %x já existe, mas não está disponível durante a comparação de pastas. Target folder input field must not be empty. Campo de directório de destino não deve estar vazio. @@ -529,17 +648,14 @@ Not enough free disk space available in: Não há espaço livre suficiente em: -Required: -Requirido: - Available: Disponível: Some files will be synchronized as part of multiple base folders. Alguns ficheiros serão sincronizados como parte de múltiplas pastas base. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -A fim de evitar conflitos, configure os filtros de exclusão para que cada ficheiro actualizado seja considerado por somente uma pasta base. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Para evitar conflitos, defina os filtros de exclusão para que cada ficheiro actualizado seja incluído por somente uma pasta base. Versioning folder: Pasta de versão: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Não é possível criar data/hora para controlo de versões: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Tamanho inesperado do fluxo de dados. -Esperado: %x bytes -Actual: %y bytes - - -Cannot write permissions of %x. -Não é possível escrever as permissões de %x. - -Operation not supported between different devices. -Operação não suportada entre dispositivos diferentes. - -Cannot delete file %x. -Não é possível eliminar o ficheiro %x. - -Cannot delete symbolic link %x. -Não é possível remover o link simbólico %x. - -Cannot delete directory %x. -Não é possível eliminar o directório %x. - -Error Code %x -Código de Erro %x - -Cannot write modification time of %x. -Não é possível alterar a data de modificação a %x. - -Cannot create directory %x. -Não é possível criar o directório %x. - -Cannot determine final path for %x. -Não é possível determinar o caminho final de %x. - -Operation not supported by device. -Operação não suportada pelo dispositivo. - -Cannot resolve symbolic link %x. -Não é possível resolver o link simbólico %x. - -Unable to move %x to the recycle bin. -Não é possível mover %x para a reciclagem. - -Authentication completed. -Autenticação completada. - -You may close this page now and continue with FreeFileSync. -Você pode cerrar esta página agora e continuar com o FreeFileSync. - -Authentication failed. -Falha na autenticação. - -Cannot find %x. -Não é possível encontrar %x. - -Please authorize access to user account %x. -Por favor, autorize o acesso à conta de usuário %x. - -Cannot determine free disk space for %x. -Não é possível determinar o espaço livre no disco %x. - -Unable to disconnect from %x. -Incapaz de se desconectar de %x. - -Unable to access %x. -Incapaz de aceder %x. - -Failed to get information about server %x. -Falha ao obter informações do servidor %x. - -Cannot monitor directory %x. -Não é possível monitorizar o directório %x. - -Cannot find device %x. -Não é possível encontrar o dispositivo %x. - -Cannot open directory %x. -Não é possível abrir o directório %x. - -Unsupported item type. -Tipo de item não suportado. - -Incorrect command line: -Linha de comandos incorrecta: - -The server does not support authentication via %x. -O servidor não suporta autenticação via %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -O tempo limite da operação esgotou após 1 segundo. -O tempo limite da operação esgotou após %x segundos. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Não é possível aguardar em mais do que 1 conexão ao mesmo tempo. -Não é possível aguardar em mais do que %x conexões ao mesmo tempo. - - -Active connections: %x -Conexões activas: %x - -Failed to open SFTP channel number %x. -Falha ao abrir canal SFTP número %x. - Drag && drop Arrastar && Largar @@ -747,6 +747,9 @@ Actual: %y bytes Command line: Linha de comandos: +&Hide console window +&Ocultar janela de console + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ O comando é executado se: Waiting until directory is available: A aguardar até o directório ficar disponível: -&Restore -&Restaurar +&Configure +&Configurar &Show error message Mo&strar mensagens de erro @@ -818,8 +821,8 @@ O comando é executado se: Scanning... A pesquisar... -job name -nome da tarefa +configuration file +arquivo de configurações System: Sleep Suspender @@ -830,8 +833,8 @@ O comando é executado se: Nothing to synchronize Nada a sincronizar -Executing command %x -A executar comando %x +Executing command: +A executar comando: You can switch to FreeFileSync's main window to resolve this issue. Pode mudar para a janela principal do FreeFileSync para resolver este problema. @@ -1031,6 +1034,12 @@ O comando é executado se: Match case Correspondência +Processed: +Processado: + +Remaining: +Restando: + New Novo @@ -1267,14 +1276,17 @@ O comando é executado se: &Don't show this dialog again &Não mostrar este diálogo novamente -Items found: -Elementos encontrados: +Bytes: +Bytes: -Time remaining: -Tempo restante: +Items: +Itens: -Time elapsed: -Tempo decorrido: +Synchronizing... +A sincronizar... + +Minimize to notification area +Minimizar para a área de notificação Bytes Bytes @@ -1282,12 +1294,6 @@ O comando é executado se: Items Itens -Synchronizing... -A sincronizar... - -Minimize to notification area -Minimizar para a área de notificação - When finished: Quando concluído: @@ -1363,6 +1369,12 @@ Isto garante um estado consistente mesmo em caso de falha grave. &Delete logs after x days: &Eliminar registos após X dias: +Notification sounds: +Sons de notificação: + +Synchronization finished: +Sincronização concluída: + Customize context menu: Personalizar menu de contexto: @@ -1567,12 +1579,6 @@ Isto garante um estado consistente mesmo em caso de falha grave. &Delete &Apagar -Include all -Incluir tudo - -Exclude all -Excluir tudo - Show icons: Mostrar ícones: @@ -1609,6 +1615,21 @@ Isto garante um estado consistente mesmo em caso de falha grave. Do&n't save Não g&uardar +%x cannot be renamed. +%x não pode ser renomeado. + +New name: +Novo nome: + +Rename Configuration +Renomear Configuração + +Configuration name must not be empty. +O nome da configuração não pode estar vazio. + +&Rename... +&Renomear... + Hide configuration Ocultar configuração @@ -1720,8 +1741,8 @@ Isto garante um estado consistente mesmo em caso de falha grave. Password: Palavra passe: -Key password: -Palavra passe da chave: +Key passphrase: +Frase de acesso da chave: Please enter a file path. Por favor, entre o caminho do ficheiro. @@ -1885,6 +1906,9 @@ Isto garante um estado consistente mesmo em caso de falha grave. Minimum version count must be smaller than maximum count. A contagem da versão mínima deve ser menor que a contagem máxima. +&Restore +&Restaurar + Files Ficheiros @@ -1951,6 +1975,9 @@ Isto garante um estado consistente mesmo em caso de falha grave. The file is locked by another process: O ficheiro está bloqueado por outro processo: +Failed to determine file permission support for folder %x. +Falha ao determinar suporte de permissão de ficheiro para a pasta %x. + Cannot read security context of %x. Não é possível ler o contexto de segurança %x. @@ -2002,12 +2029,12 @@ Isto garante um estado consistente mesmo em caso de falha grave. Cannot change process I/O priorities. Não é possível alterar as prioridades de E / S do processo. -Unable to shut down the system. -Incapaz de desligar o sistema. - Checking recycle bin failed for folder %x. Verificar a reciclagem falhou no directório %x. +Unable to shut down the system. +Incapaz de desligar o sistema. + Prepare installation A preparar a instalação diff --git a/FreeFileSync/Build/Resources/Languages/portuguese_br.lng b/FreeFileSync/Build/Resources/Languages/portuguese_br.lng index 51b1097e..d95d04d9 100755 --- a/FreeFileSync/Build/Resources/Languages/portuguese_br.lng +++ b/FreeFileSync/Build/Resources/Languages/portuguese_br.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +Não é possível ler o arquivo %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Tamanho inesperado do fluxo de dados. +Esperado: %x bytes +Atual: %y bytes + + +Cannot write file %x. +Não é possível escrever o arquivo %x. + +Cannot write permissions of %x. +Não é possível escrever as permissões de %x. + +Operation not supported between different devices. +Operação não suportada entre dispositivos diferentes. + +Cannot delete file %x. +Não é possível excluir o arquivo %x. + +Cannot delete symbolic link %x. +Não é possível excluir o link simbólico %x. + +Cannot delete directory %x. +Não é possível excluir o diretório %x. + +Cannot move file %x to %y. +Não é possível mover o arquivo %x para %y. + +Cannot copy symbolic link %x to %y. +Não é possível copiar o link simbólico %x para %y. + +Error Code %x +Código do Erro %x. + +Cannot read directory %x. +Não é possível ler o diretório %x. + +Cannot write modification time of %x. +Não é possível escrever a data de modificação de %x. + +Cannot read file attributes of %x. +Não é possível ler os atributos do arquivo %x. + +Cannot create directory %x. +Não é possível criar o diretório %x. + +Cannot determine final path for %x. +Não é possível determinar o caminho final para %x. + +Operation not supported by device. +Operação não suportada pelo dispositivo. + +Cannot resolve symbolic link %x. +Não é possível resolver o link simbólico %x. + +Unable to move %x to the recycle bin. +Não é possível mover %x para a Lixeira. + +Authentication completed. +Autenticação concluída. + +You may close this page now and continue with FreeFileSync. +Você pode fechar esta página agora e continuar com o FreeFileSync. + +Authentication failed. +Autenticação falhou. + +Unable to connect to %x. +Não foi possível conectar a %x. + +Cannot find %x. +Não é possível encontrar %x. + +The name %x is used by more than one item in the folder. +O nome %x é usado por mais de um item na pasta. + +Please authorize access to user account %x. +Por favor, autorize o acesso para a conta de usuário %x. + +Cannot open file %x. +Não é possível abrir o arquivo %x. + +The name %x is already used by another item. +O nome %x já é usado por outro item. + +Cannot determine free disk space for %x. +Não é possível determinar o espaço livre em disco para %x. + +Unable to disconnect from %x. +Não foi possível desconectar de %x. + +Unable to access %x. +Não foi possível acessar %x. + +Failed to get information about server %x. +Falha na obteção da informação sobre o servidor %x. + +Cannot monitor directory %x. +Não é possível monitorar o diretório %x. + +Cannot find device %x. +Não é possível encontrar o dispositivo %x. + +Cannot open directory %x. +Não é possível abrir o diretório %x. + +Unsupported item type. +Tipo de item não suportado. + +Incorrect command line: +Linha de comando incorreta: + +The server does not support authentication via %x. +O servidor não suporta autenticação via %x. + +Required: +Necessário: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +A operação expirou após 1 segundo. +A operação expirou após %x segundos. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Não é possível esperar mais do que 1 conexão por vez. +Não é possível esperar mais do que %x conexões por vez. + + +Active connections: %x +Conexões ativas: %x + +Failed to open SFTP channel number %x. +Falha ao abrir o canal SFTP número %x. + Both sides have changed since last synchronization. Ambos os lados foram alterados desde a última sincronização. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Os arquivos de instalação estão corrompidos. Por favor, reinstale o FreeFileSync. -Cannot load file %x. -Não é possível carregar o aquivo %x. - Cannot find the following folders: Não é possível localizar as seguintes pastas: @@ -128,7 +274,7 @@ Pesquisando: Comparison finished: -Comparação finalizada: +Comparação concluída: 1 item found @@ -139,6 +285,9 @@ %x itens encontrados +Time elapsed: +Tempo decorrido: + File %x has an invalid date. O arquivo %x tem uma data inválida. @@ -157,9 +306,6 @@ Items differ in attributes only Os itens diferem apenas nos atributos -The name %x is used by more than one item in the folder. -O nome %x é usado por mais de um item na pasta. - Resolving symbolic link %x Resolvendo link simbólico %x @@ -220,6 +366,15 @@ Out of memory. Memória insuficiente. +Show in Explorer +Mostrar no Explorer + +Open with default application +Abrir com aplicativo padrão + +Browse directory +Procurar diretório + Database file %x is incompatible. Arquivo de banco de dados %x incompatível. @@ -232,12 +387,6 @@ Database file is corrupted: O arquivo de banco de dados está corrompido: -Cannot write file %x. -Não é possível escrever o arquivo %x. - -Cannot read file %x. -Não é possível ler o arquivo %x. - The database files do not yet contain information about the last synchronization. Os arquivos de banco de dados ainda não contêm informação sobre a última sincronização. @@ -256,9 +405,6 @@ Cannot get process information. Não é possível obter as informações do processo. -Cannot read file attributes of %x. -Não é possível ler os atributos do arquivo %x. - Waiting while directory is locked: Aguardando enquanto o diretório é bloqueado: @@ -331,6 +477,27 @@ Update attributes on right Atualizar atributos à direita +Error parsing file %x, row %y, column %z. +Erro analisando o arquivo %x, linha %y, coluna %z. + +Services +Serviços + +Show All +Mostrar Todos + +Hide Others +Ocultar Outros + +Hide %x +Ocultar %x + +Quit %x +Sair %x + +Cannot set directory locks for the following folders: +Não é possível definir bloqueios de diretório para as seguintes pastas: + Errors: Erros: @@ -355,27 +522,6 @@ Cleaning up log files: Limpando arquivos de log: -Error parsing file %x, row %y, column %z. -Erro analisando o arquivo %x, linha %y, coluna %z. - -Services -Serviços - -Show All -Mostrar Todos - -Hide Others -Ocultar Outros - -Hide %x -Ocultar %x - -Quit %x -Sair %x - -Cannot set directory locks for the following folders: -Não é possível definir bloqueios de diretório para as seguintes pastas: - 1 thread %x threads @@ -385,27 +531,12 @@ %x threads -Cannot read directory %x. -Não é possível ler o diretório %x. - %x/sec %x/s %x items %x itens -Show in Explorer -Mostrar no Explorer - -Open with default application -Abrir com aplicativo padrão - -Browse directory -Procurar diretório - -Unable to connect to %x. -Não foi possível conectar a %x. - Completed successfully Concluído com sucesso @@ -451,9 +582,6 @@ Cannot write file attributes of %x. Não é possível escrever os atributos de arquivo de %x. -Cannot open file %x. -Não é possível abrir o arquivo %x. - %x and %y have different content. %x e %y têm conteúdos diferentes. @@ -484,29 +612,20 @@ Source item %x not found Item de origem %x não encontrado -Cannot move file %x to %y. -Não é possível mover o arquivo %x para %y. - Parent folder %x is not existing. Pasta pai %x não existe. -The name %x is already used by another item. -O nome %x já é usado por outro item. - Cannot copy file %x to %y. Não é possível copiar o arquivo %x para %y. -Cannot copy symbolic link %x to %y. -Não é possível copiar o link simbólico %x para %y. - Creating a Volume Shadow Copy for %x... Criando uma Cópia de Sombra de Volume para %x... Cannot find folder %x. Não é possível encontrar a pasta %x. -Target folder %x already existing. -Pasta de destino %x já existe. +Target folder %x is already existing, but was not available during folder comparison. +A pasta de destino %x já existe, mas não estava disponível durante a comparação de pastas. Target folder input field must not be empty. Campo de entrada da pasta de destino não pode ficar vazio. @@ -529,17 +648,14 @@ Not enough free disk space available in: Espaço em disco insuficiente em: -Required: -Necessário: - Available: Disponível: Some files will be synchronized as part of multiple base folders. Alguns arquivos serão sincronizados como parte de várias pastas base. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Para evitar conflitos, configure filtros de exclusão para que cada arquivo atualizado seja considerado por apenas uma pasta base. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Para evitar conflitos, configure filtros de exclusão para que cada arquivo atualizado seja incluído por apenas uma pasta base. Versioning folder: Pasta de controle de versão: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Não é possível criar a estampa de tempo para o controle de versões: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Tamanho inesperado do fluxo de dados. -Esperado: %x bytes -Atual: %y bytes - - -Cannot write permissions of %x. -Não é possível escrever as permissões de %x. - -Operation not supported between different devices. -Operação não suportada entre dispositivos diferentes. - -Cannot delete file %x. -Não é possível excluir o arquivo %x. - -Cannot delete symbolic link %x. -Não é possível excluir o link simbólico %x. - -Cannot delete directory %x. -Não é possível excluir o diretório %x. - -Error Code %x -Código do Erro %x. - -Cannot write modification time of %x. -Não é possível escrever a data de modificação de %x. - -Cannot create directory %x. -Não é possível criar o diretório %x. - -Cannot determine final path for %x. -Não é possível determinar o caminho final para %x. - -Operation not supported by device. -Operação não suportada pelo dispositivo. - -Cannot resolve symbolic link %x. -Não é possível resolver o link simbólico %x. - -Unable to move %x to the recycle bin. -Não é possível mover %x para a Lixeira. - -Authentication completed. -Autenticação concluída. - -You may close this page now and continue with FreeFileSync. -Você pode fechar esta página agora e continuar com o FreeFileSync. - -Authentication failed. -Autenticação falhou. - -Cannot find %x. -Não é possível encontrar %x. - -Please authorize access to user account %x. -Por favor, autorize o acesso para a conta de usuário %x. - -Cannot determine free disk space for %x. -Não é possível determinar o espaço livre em disco para %x. - -Unable to disconnect from %x. -Não foi possível desconectar de %x. - -Unable to access %x. -Não foi possível acessar %x. - -Failed to get information about server %x. -Falha na obteção da informação sobre o servidor %x. - -Cannot monitor directory %x. -Não é possível monitorar o diretório %x. - -Cannot find device %x. -Não é possível encontrar o dispositivo %x. - -Cannot open directory %x. -Não é possível abrir o diretório %x. - -Unsupported item type. -Tipo de item não suportado. - -Incorrect command line: -Linha de comando incorreta: - -The server does not support authentication via %x. -O servidor não suporta autenticação via %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -A operação expirou após 1 segundo. -A operação expirou após %x segundos. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Não é possível esperar mais do que 1 conexão por vez. -Não é possível esperar mais do que %x conexões por vez. - - -Active connections: %x -Conexões ativas: %x - -Failed to open SFTP channel number %x. -Falha ao abrir o canal SFTP número %x. - Drag && drop Arrastar && Soltar @@ -747,6 +747,9 @@ Atual: %y bytes Command line: Linha de comando: +&Hide console window +&Ocultar janela de console + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ O comando é disparado se: Waiting until directory is available: Aguardando até o diretório ficar disponível: -&Restore -&Restaurar +&Configure +&Configurar &Show error message &Mostrar mensagem de erro @@ -818,8 +821,8 @@ O comando é disparado se: Scanning... Examinando... -job name -nome da tarefa +configuration file +arquivo de configuração System: Sleep Sistema: Suspender @@ -830,8 +833,8 @@ O comando é disparado se: Nothing to synchronize Nada para sincronizar -Executing command %x -Executando comando %x +Executing command: +Executando comando: You can switch to FreeFileSync's main window to resolve this issue. Você pode alternar para a janela principal do FreeFileSync para resolver este problema. @@ -1031,6 +1034,12 @@ O comando é disparado se: Match case Diferenciar maiúsculas e minúsculas +Processed: +Processado: + +Remaining: +Restante: + New Novo @@ -1238,7 +1247,7 @@ O comando é disparado se: &SSH-agent User name: -Nome do usuário: +Nome de usuário: Private key file: Arquivo de chave particular: @@ -1267,14 +1276,17 @@ O comando é disparado se: &Don't show this dialog again &Não mostrar esta caixa de diálogo novamente -Items found: -Itens encontrados: +Bytes: +Bytes: -Time remaining: -Tempo restante: +Items: +Itens: -Time elapsed: -Tempo decorrido: +Synchronizing... +Sincronizando... + +Minimize to notification area +Minimizar para a área de notificação Bytes Bytes @@ -1282,12 +1294,6 @@ O comando é disparado se: Items Itens -Synchronizing... -Sincronizando... - -Minimize to notification area -Minimizar para a área de notificação - When finished: Quando concluído: @@ -1363,6 +1369,12 @@ Isto garante um estado consistente mesmo em caso de erro grave. &Delete logs after x days: &Excluir logs após x days: +Notification sounds: +Sons de notificação: + +Synchronization finished: +Sincronização concluída: + Customize context menu: Personalizar menu de contexto: @@ -1513,33 +1525,6 @@ Isto garante um estado consistente mesmo em caso de erro grave. &Execute &Executar - -1 directory -%x directories - - -1 diretório -%x diretórios - - - -1 file -%x files - - -1 arquivo -%x arquivos - - - -Showing %y of 1 row -Showing %y of %x rows - - -Mostrando %y de 1 coluna -Mostrando %y de %x colunas - - Set direction: Configurar direção: @@ -1567,12 +1552,6 @@ Isto garante um estado consistente mesmo em caso de erro grave. &Delete &Apagar -Include all -Incluir todos - -Exclude all -Excluir todos - Show icons: Mostrar ícones: @@ -1609,6 +1588,21 @@ Isto garante um estado consistente mesmo em caso de erro grave. Do&n't save &Não salvar +%x cannot be renamed. +%x não pode ser renomeado. + +New name: +Novo nome: + +Rename Configuration +Renomear Configuração + +Configuration name must not be empty. +Nome da configuração não pode ser vazio. + +&Rename... +&Renomear... + Hide configuration Ocultar configuração @@ -1669,6 +1663,33 @@ Isto garante um estado consistente mesmo em caso de erro grave. All files are in sync Todos os arquivos estão sincronizados + +1 directory +%x directories + + +1 diretório +%x diretórios + + + +1 file +%x files + + +1 arquivo +%x arquivos + + + +Showing %y of 1 row +Showing %y of %x rows + + +Mostrando %y de 1 coluna +Mostrando %y de %x colunas + + Cannot find %x Não é possível localizar %x @@ -1720,8 +1741,8 @@ Isto garante um estado consistente mesmo em caso de erro grave. Password: Senha: -Key password: -Senha da chave: +Key passphrase: +Frase-senha da chave: Please enter a file path. Por favor, insira um caminho de arquivo. @@ -1885,6 +1906,9 @@ Isto garante um estado consistente mesmo em caso de erro grave. Minimum version count must be smaller than maximum count. A contagem mínima de versões deve ser menor do que a contagem máxima. +&Restore +&Restaurar + Files Arquivos @@ -1951,6 +1975,9 @@ Isto garante um estado consistente mesmo em caso de erro grave. The file is locked by another process: O arquivo está bloqueado por outro processo: +Failed to determine file permission support for folder %x. +Falha ao determinar o suporte de permissão de arquivo para a pasta %x. + Cannot read security context of %x. Não é possível ler o contexto de segurança de %x. @@ -2002,12 +2029,12 @@ Isto garante um estado consistente mesmo em caso de erro grave. Cannot change process I/O priorities. Não é possível alterar a prioridade de E/S do processo. -Unable to shut down the system. -Não foi possível desligar o sistema. - Checking recycle bin failed for folder %x. Verificando falha na Lixeira para pasta %x. +Unable to shut down the system. +Não foi possível desligar o sistema. + Prepare installation Preparando a instalação diff --git a/FreeFileSync/Build/Resources/Languages/romanian.lng b/FreeFileSync/Build/Resources/Languages/romanian.lng index db5f3093..fe270fee 100755 --- a/FreeFileSync/Build/Resources/Languages/romanian.lng +++ b/FreeFileSync/Build/Resources/Languages/romanian.lng @@ -7,6 +7,157 @@ n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2 +Cannot read file %x. +Nu pot citi fila %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Mărime neașteptată a fluxului de date. +Așteptată: %x baiți +Actuală: %y baiți + + +Cannot write file %x. +Nu pot scrie fila %x. + +Cannot write permissions of %x. +Nu pot scrie permisiunile lui %x. + +Operation not supported between different devices. +Operația nu-i suportată între dispozitive de stocare diferite. + +Cannot delete file %x. +Nu pot șterge fila %x. + +Cannot delete symbolic link %x. +Nu pot șterge legătura simbolică %x. + +Cannot delete directory %x. +Nu pot șterge dosarul %x. + +Cannot move file %x to %y. +Nu pot muta fila %x în %y. + +Cannot copy symbolic link %x to %y. +Nu pot copia legătura simbolică %x în %y. + +Error Code %x +Cod de Eroare %x. + +Cannot read directory %x. +Nu pot citi dosarul %x. + +Cannot write modification time of %x. +Nu pot scrie modificarea timpului pentru %x. + +Cannot read file attributes of %x. +Nu pot citi atributele filei %x. + +Cannot create directory %x. +Nu pot crea dosarul %x. + +Cannot determine final path for %x. +Nu pot determina calea finală pentru %x. + +Operation not supported by device. +Operația nu-i suportată de dispozitivul de stocare. + +Cannot resolve symbolic link %x. +Nu pot rezolva legătura simbolică %x. + +Unable to move %x to the recycle bin. +Nu pot muta %x în Reciclator. + +Authentication completed. +Autentificare realizată. + +You may close this page now and continue with FreeFileSync. +Poți închide pagina asta acum și continua cu FreeFileSync. + +Authentication failed. +Autentificare eșuată. + +Unable to connect to %x. +Nu mă pot conecta la %x. + +Cannot find %x. +Nu pot găsi %x. + +The name %x is used by more than one item in the folder. +Numele %x e folosit de mai multe elemente din dosar. + +Please authorize access to user account %x. +Autorizează accesul la contul de utilizator %x. + +Cannot open file %x. +Nu pot deschide fila %x. + +The name %x is already used by another item. +Numele %x este deja utilizat de alt element. + +Cannot determine free disk space for %x. +Nu pot determina spațiul liber de stocare pentru %x. + +Unable to disconnect from %x. +Nu pot face deconectarea de la %x. + +Unable to access %x. +Nu pot accesa %x. + +Failed to get information about server %x. +N-am putut obține informații despre serverul %x. + +Cannot monitor directory %x. +Nu pot monitoriza dosarul %x. + +Cannot find device %x. +Nu pot găsi dispozitivul %x. + +Cannot open directory %x. +Nu pot deschide dosarul %x. + +Unsupported item type. +Tip de element nesuportat. + +Incorrect command line: +Linie de comandă incorectă: + +The server does not support authentication via %x. +Serverul nu suportă autentificarea prin %x. + +Required: +Necesar: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Operație expirată după 1 secundă. +Operație expirată după %x secunde. +Operație expirată după %x de secunde. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Nu pot aștepta după mai mult de 1 conexiune simultan. +Nu pot aștepta după mai mult de %x conexiuni simultan. +Nu pot aștepta după mai mult de %x de conexiuni simultan. + + +Active connections: %x +Conexiuni Active: %x + +Failed to open SFTP channel number %x. +N-am putut deschide canalul SFTP cu numărul %x. + Both sides have changed since last synchronization. Ambele părți s-au modificat de la ultima sincronizare. @@ -109,9 +260,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Filele de instalare sînt stricate (corupte). Reinstalează FreeFileSync. -Cannot load file %x. -Nu pot deschide fila %x. - Cannot find the following folders: Nu pot găsi dosarele următoare: @@ -140,6 +288,9 @@ %x de elemente găsite +Time elapsed: +Timp Scurs: + File %x has an invalid date. Fila %x are o dată nevalidă. @@ -158,9 +309,6 @@ Items differ in attributes only Elementele diferă doar prin atributele lor -The name %x is used by more than one item in the folder. -Numele %x e folosit de mai multe elemente din dosar. - Resolving symbolic link %x Rezolv legătura simbolică %x @@ -221,6 +369,15 @@ Out of memory. Memorie epuizată. +Show in Explorer +Arată în Exploratorul de File + +Open with default application +Deschide cu Aplicația Implicită + +Browse directory +Explorează Dosarul + Database file %x is incompatible. Fila cu baza de date %x este incompatibilă. @@ -233,12 +390,6 @@ Database file is corrupted: Fila bazei de date este stricată (coruptă): -Cannot write file %x. -Nu pot scrie fila %x. - -Cannot read file %x. -Nu pot citi fila %x. - The database files do not yet contain information about the last synchronization. Filele cu baze de date nu conțin încă informații despre ultima sincornizare. @@ -257,9 +408,6 @@ Cannot get process information. Nu pot obține informații despre proces. -Cannot read file attributes of %x. -Nu pot citi atributele filei %x. - Waiting while directory is locked: Aștept ca dosarul să fie zăvorît [locked]: @@ -333,6 +481,27 @@ Update attributes on right Actualizează atributele în partea dreaptă +Error parsing file %x, row %y, column %z. +Eroare la parsarea filei %x, rîndul %y, coloana %z. + +Services +Servicii + +Show All +Arată Tot + +Hide Others +Ascunde Restul + +Hide %x +Ascunde %x + +Quit %x +Închide %x + +Cannot set directory locks for the following folders: +Nu pot seta zăvorîrea [lock] pentru dosarele următoare: + Errors: Erori: @@ -357,27 +526,6 @@ Cleaning up log files: Curăț filele de jurnalizare: -Error parsing file %x, row %y, column %z. -Eroare la parsarea filei %x, rîndul %y, coloana %z. - -Services -Servicii - -Show All -Arată Tot - -Hide Others -Ascunde Restul - -Hide %x -Ascunde %x - -Quit %x -Închide %x - -Cannot set directory locks for the following folders: -Nu pot seta zăvorîrea [lock] pentru dosarele următoare: - 1 thread %x threads @@ -388,27 +536,12 @@ %x de fire -Cannot read directory %x. -Nu pot citi dosarul %x. - %x/sec %x/sec %x items %x elemente -Show in Explorer -Arată în Exploratorul de File - -Open with default application -Deschide cu Aplicația Implicită - -Browse directory -Explorează Dosarul - -Unable to connect to %x. -Nu mă pot conecta la %x. - Completed successfully Realizată cu succes @@ -454,9 +587,6 @@ Cannot write file attributes of %x. Nu pot scrie atributele de filă ale lui %x. -Cannot open file %x. -Nu pot deschide fila %x. - %x and %y have different content. %x și %y au conținut diferit. @@ -487,29 +617,20 @@ Source item %x not found Elementul sursă %x n-a fost găsit -Cannot move file %x to %y. -Nu pot muta fila %x în %y. - Parent folder %x is not existing. Dosarul părinte %x nu există. -The name %x is already used by another item. -Numele %x este deja utilizat de alt element. - Cannot copy file %x to %y. Nu pot copia fila %x în %y. -Cannot copy symbolic link %x to %y. -Nu pot copia legătura simbolică %x în %y. - Creating a Volume Shadow Copy for %x... Creez o Conservare a Volumului [Volume Shadow Copy] pentru %x... Cannot find folder %x. Nu pot găsi dosarul %x. -Target folder %x already existing. -Dosarul țintă %x există deja. +Target folder %x is already existing, but was not available during folder comparison. +Dosarul țintă %x există deja, dar n-a fost disponibil în timpul comparării dosarelor. Target folder input field must not be empty. Cîmpul de introducere a dosarului țintă nu trebuie să fie gol. @@ -532,17 +653,14 @@ Not enough free disk space available in: Spațiu de stocare insuficient pe: -Required: -Necesar: - Available: Disponibil: Some files will be synchronized as part of multiple base folders. Anumite file vor fi sincronizate ca parte din dosare de bază multiple. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Pentru a evita conflictele, setează filtrele de excludere astfel ca fiecare filă actualizată e considerată ca aparținînd unui singur dosar de bază. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Pentru a evita conflictele, setează filtrele de excludere astfel ca fiecare filă actualizată să fie inclusă doar într-un singur dosar de bază. Versioning folder: Dosar de Versionare: @@ -568,124 +686,6 @@ Unable to create time stamp for versioning: Nu pot crea marcajul de timp pentru versionare: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Mărime neașteptată a fluxului de date. -Așteptată: %x baiți -Actuală: %y baiți - - -Cannot write permissions of %x. -Nu pot scrie permisiunile lui %x. - -Operation not supported between different devices. -Operația nu-i suportată între dispozitive de stocare diferite. - -Cannot delete file %x. -Nu pot șterge fila %x. - -Cannot delete symbolic link %x. -Nu pot șterge legătura simbolică %x. - -Cannot delete directory %x. -Nu pot șterge dosarul %x. - -Error Code %x -Cod de Eroare %x. - -Cannot write modification time of %x. -Nu pot scrie modificarea timpului pentru %x. - -Cannot create directory %x. -Nu pot crea dosarul %x. - -Cannot determine final path for %x. -Nu pot determina calea finală pentru %x. - -Operation not supported by device. -Operația nu-i suportată de dispozitivul de stocare. - -Cannot resolve symbolic link %x. -Nu pot rezolva legătura simbolică %x. - -Unable to move %x to the recycle bin. -Nu pot muta %x în Reciclator. - -Authentication completed. -Autentificare realizată. - -You may close this page now and continue with FreeFileSync. -Poți închide pagina asta acum și continua cu FreeFileSync. - -Authentication failed. -Autentificare eșuată. - -Cannot find %x. -Nu pot găsi %x. - -Please authorize access to user account %x. -Autorizează accesul la contul de utilizator %x. - -Cannot determine free disk space for %x. -Nu pot determina spațiul liber de stocare pentru %x. - -Unable to disconnect from %x. -Nu pot face deconectarea de la %x. - -Unable to access %x. -Nu pot accesa %x. - -Failed to get information about server %x. -N-am putut obține informații despre serverul %x. - -Cannot monitor directory %x. -Nu pot monitoriza dosarul %x. - -Cannot find device %x. -Nu pot găsi dispozitivul %x. - -Cannot open directory %x. -Nu pot deschide dosarul %x. - -Unsupported item type. -Tip de element nesuportat. - -Incorrect command line: -Linie de comandă incorectă: - -The server does not support authentication via %x. -Serverul nu suportă autentificarea prin %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Operație expirată după 1 secundă. -Operație expirată după %x secunde. -Operație expirată după %x de secunde. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Nu pot aștepta după mai mult de 1 conexiune simultan. -Nu pot aștepta după mai mult de %x conexiuni simultan. -Nu pot aștepta după mai mult de %x de conexiuni simultan. - - -Active connections: %x -Conexiuni Active: %x - -Failed to open SFTP channel number %x. -N-am putut deschide canalul SFTP cu numărul %x. - Drag && drop Trage și pune un dosar mai jos sau explorează către el @@ -752,6 +752,9 @@ Actuală: %y baiți Command line: Linie de comandă: +&Hide console window +Ascun&de fereastra consolei + The command is triggered if: - files or subfolders change @@ -787,8 +790,8 @@ Comanda este declanșată dacă: Waiting until directory is available: Aștept pînă cînd dosarul va fi disponibil: -&Restore -&Restaurează +&Configure +&Configurează &Show error message A&rată mesajele de eroare @@ -824,8 +827,8 @@ Comanda este declanșată dacă: Scanning... Scanez... -job name -numele sarcinii +configuration file +filă de configurare System: Sleep Sistem: Pune în Repaus [Sleep] @@ -836,8 +839,8 @@ Comanda este declanșată dacă: Nothing to synchronize Nu e nimic de sincronizat -Executing command %x -Execut comanda %x +Executing command: +Execut comanda: You can switch to FreeFileSync's main window to resolve this issue. Poți comuta la fereastra principală FreeFileSync pentru a rezolva această problemă. @@ -1038,6 +1041,12 @@ Comanda este declanșată dacă: Match case Potrivește cu caseta literelor (MAJ/min) +Processed: +Procesat: + +Remaining: +Rămas: + New Nouă @@ -1274,14 +1283,17 @@ Comanda este declanșată dacă: &Don't show this dialog again Nu arăta acest &dialog din nou -Items found: -Elemente Găsite: +Bytes: +Baiți: -Time remaining: -Timp Rămas: +Items: +Elemente: -Time elapsed: -Timp Scurs: +Synchronizing... +Sincronizare Aflată în Curs... + +Minimize to notification area +Minimizează în aria de notificare (sertar) Bytes Baiți @@ -1289,12 +1301,6 @@ Comanda este declanșată dacă: Items Elemente -Synchronizing... -Sincronizare Aflată în Curs... - -Minimize to notification area -Minimizează în aria de notificare (sertar) - When finished: La terminare: @@ -1370,6 +1376,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției &Delete logs after x days: Șter&ge jurnalul după x zile: +Notification sounds: +Sunete de notificare: + +Synchronization finished: +Sincronizare terminată: + Customize context menu: Personalizează meniul contextual: @@ -1521,36 +1533,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției &Execute &Execută - -1 directory -%x directories - - -1 dosar -%x dosare -%x de dosare - - - -1 file -%x files - - -1 filă -%x file -%x de file - - - -Showing %y of 1 row -Showing %y of %x rows - - -Afișate: %y din 1 rînd -Afișate: %y din %x rînduri -Afișate: %y din %x de rînduri - - Set direction: Setează Acțiunea ca în Icoana Alăturată: @@ -1578,12 +1560,6 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției &Delete Șter&ge -Include all -Include Tot - -Exclude all -Exclude Tot - Show icons: Arată Icoane: @@ -1620,6 +1596,21 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Do&n't save &Nu salva +%x cannot be renamed. +%x nu poate fi renumit. + +New name: +Nume nou: + +Rename Configuration +Renumește Configurația + +Configuration name must not be empty. +Numele configurației nu poate lipsi. + +&Rename... +&Renumește... + Hide configuration Ascunde Configurația @@ -1680,6 +1671,36 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției All files are in sync Toate filele sînt sincronizate + +1 directory +%x directories + + +1 dosar +%x dosare +%x de dosare + + + +1 file +%x files + + +1 filă +%x file +%x de file + + + +Showing %y of 1 row +Showing %y of %x rows + + +Afișate: %y din 1 rînd +Afișate: %y din %x rînduri +Afișate: %y din %x de rînduri + + Cannot find %x Nu pot găsi %x @@ -1731,8 +1752,8 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Password: Parolă: -Key password: -Parola Cheie: +Key passphrase: +Parola cheii: Please enter a file path. Introdu calea filei. @@ -1899,6 +1920,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Minimum version count must be smaller than maximum count. Numărul minim al versiunii trebuie să fie mai mic decît numărul maxim. +&Restore +&Restaurează + Files File @@ -1965,6 +1989,9 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției The file is locked by another process: Fila este zăvorîtă [locked] de alt proces: +Failed to determine file permission support for folder %x. +Eșec al determinării existenței suportului pentru permisiuni la dosarul %x. + Cannot read security context of %x. Nu pot citi contextul de securitate pentru %x. @@ -2018,12 +2045,12 @@ Aceasta garantează consecvența stării filelor chiar și în cazul apariției Cannot change process I/O priorities. Nu pot schimba prioritățile I/O ale procesului. -Unable to shut down the system. -Nu pot închide sistemul. - Checking recycle bin failed for folder %x. Verificarea disponibilității Reciclatorului a eșuat pentru dosarul %x. +Unable to shut down the system. +Nu pot închide sistemul. + Prepare installation Pregătirea Instalării diff --git a/FreeFileSync/Build/Resources/Languages/russian.lng b/FreeFileSync/Build/Resources/Languages/russian.lng index 7bc51a60..1330bb21 100755 --- a/FreeFileSync/Build/Resources/Languages/russian.lng +++ b/FreeFileSync/Build/Resources/Languages/russian.lng @@ -7,6 +7,157 @@ n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<11 || n%100>14) ? 1 : 2 +Cannot read file %x. +Невозможно прочитать файл %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Неожиданный размер потока данных. +Ожидаемый: %x байт +Фактический: %y байт + + +Cannot write file %x. +Невозможно записать файл %x. + +Cannot write permissions of %x. +Невозможно записать права доступа %x. + +Operation not supported between different devices. +Операция не поддерживается между различными устройствами. + +Cannot delete file %x. +Невозможно удалить файл %x. + +Cannot delete symbolic link %x. +Невозможно удалить символьную ссылку %x. + +Cannot delete directory %x. +Невозможно удалить папку %x. + +Cannot move file %x to %y. +Невозможно перенести файл %x в %y. + +Cannot copy symbolic link %x to %y. +Невозможно скопировать символьную ссылку %x в %y. + +Error Code %x +Код ошибки %x + +Cannot read directory %x. +Невозможно прочитать папку %x. + +Cannot write modification time of %x. +Невозможно записать время изменения файла %x. + +Cannot read file attributes of %x. +Невозможно прочитать атрибуты файла %x. + +Cannot create directory %x. +Невозможно создать папку %x. + +Cannot determine final path for %x. +Невозможно определить конечный путь для %x. + +Operation not supported by device. +Операция не поддерживается устройством. + +Cannot resolve symbolic link %x. +Невозможно разрешить символьную ссылку %x. + +Unable to move %x to the recycle bin. +Невозможно переместить %x в "Корзину". + +Authentication completed. +Аутентификация завершена. + +You may close this page now and continue with FreeFileSync. +Вы можете закрыть эту страницу сейчас и продолжить с FreeFileSync. + +Authentication failed. +Ошибка аутентификации. + +Unable to connect to %x. +Невозможно соединиться с %x. + +Cannot find %x. +Невозможно найти %x. + +The name %x is used by more than one item in the folder. +Имя %x используется более чем одним элементом в папке. + +Please authorize access to user account %x. +Пожалуйста, авторизуйте доступ к учетной записи пользователя %x. + +Cannot open file %x. +Невозможно открыть файл %x. + +The name %x is already used by another item. +Имя %x уже используется другим элементом. + +Cannot determine free disk space for %x. +Невозможно определить свободное место на диске для %x. + +Unable to disconnect from %x. +Невозможно отключиться от %x. + +Unable to access %x. +Невозможно получить доступ к %x. + +Failed to get information about server %x. +Не удалось получить информацию о сервере %x. + +Cannot monitor directory %x. +Невозможно отследить папку %x. + +Cannot find device %x. +Невозможно найти устройство %x. + +Cannot open directory %x. +Невозможно открыть папку %x. + +Unsupported item type. +Неподдерживаемый тип элемента. + +Incorrect command line: +Неверная командная строка: + +The server does not support authentication via %x. +Сервер не поддерживает аутентификацию с помощью %x. + +Required: +Требуется: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Время ожидания соединения истекает через %x сукунду. +Время ожидания соединения истекает через %x сукунды. +Время ожидания соединения истекает через %x сукунд. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Невозможно обработать более %x соединения за раз. +Невозможно обработать более %x соединений за раз. +Невозможно обработать более %x соединений за раз. + + +Active connections: %x +Активные соединения: %x + +Failed to open SFTP channel number %x. +Не удалось открыть SFTP канал номер %x. + Both sides have changed since last synchronization. Со времени последней синхронизации с обеих сторон произошли изменения. @@ -109,9 +260,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Установочные файлы повреждены. Переустановите FreeFileSync. -Cannot load file %x. -Невозможно загрузить файл %x. - Cannot find the following folders: Невозможно найти следующие папки: @@ -140,6 +288,9 @@ %x элементов найдено +Time elapsed: +Времени прошло: + File %x has an invalid date. Файл %x имеет недействительную дату. @@ -158,9 +309,6 @@ Items differ in attributes only Элементы различаются только атрибутами -The name %x is used by more than one item in the folder. -Имя %x используется более чем одним элементом в папке. - Resolving symbolic link %x Разрешение символьной ссылки %x @@ -221,6 +369,15 @@ Out of memory. Недостаточно памяти. +Show in Explorer +Показать в Проводнике + +Open with default application +Открыть с помощью приложения по умолчанию + +Browse directory +Обзор папок + Database file %x is incompatible. Файл базы данных %x несовместим. @@ -233,12 +390,6 @@ Database file is corrupted: Файл базы данных поврежден: -Cannot write file %x. -Невозможно записать файл %x. - -Cannot read file %x. -Невозможно прочитать файл %x. - The database files do not yet contain information about the last synchronization. Файлы базы данных еще не содержат информацию о последней синхронизации. @@ -257,9 +408,6 @@ Cannot get process information. Невозможно получить информацию о процессе. -Cannot read file attributes of %x. -Невозможно прочитать атрибуты файла %x. - Waiting while directory is locked: Ожидание снятия блокировки с папки: @@ -388,27 +536,12 @@ %x потоков -Cannot read directory %x. -Невозможно прочитать папку %x. - %x/sec %x/с %x items %x элемент(ов) -Show in Explorer -Показать в Проводнике - -Open with default application -Открыть с помощью приложения по умолчанию - -Browse directory -Обзор папок - -Unable to connect to %x. -Невозможно соединиться с %x. - Completed successfully Выполнено успешно @@ -454,9 +587,6 @@ Cannot write file attributes of %x. Невозможно записать атрибуты файла %x. -Cannot open file %x. -Невозможно открыть файл %x. - %x and %y have different content. %x и %y имеют разное содержание. @@ -487,29 +617,20 @@ Source item %x not found Исходный элемент %x не найден -Cannot move file %x to %y. -Невозможно перенести файл %x в %y. - Parent folder %x is not existing. Родительская папка %x не существует. -The name %x is already used by another item. -Имя %x уже используется другим элементом. - Cannot copy file %x to %y. Невозможно скопировать файл %x в %y. -Cannot copy symbolic link %x to %y. -Невозможно скопировать символьную ссылку %x в %y. - Creating a Volume Shadow Copy for %x... Создание Тома Теневого Копирования для %x... Cannot find folder %x. Невозможно найти папку %x. -Target folder %x already existing. -Целевая папка %x уже существует. +Target folder %x is already existing, but was not available during folder comparison. +Целевая папка %x уже существует, но не была доступна во время сравнения папок. Target folder input field must not be empty. Поле ввода целевой папки не должно быть пустым. @@ -532,17 +653,14 @@ Not enough free disk space available in: Не достаточно свободного места в: -Required: -Требуется: - Available: Доступно: Some files will be synchronized as part of multiple base folders. Некоторые файлы будут синхронизированы как часть нескольких базовых папок. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Чтобы избежать конфликтов, настройте фильтры исключения так, чтобы каждый обновленный файл учитывался только одной базовой папкой. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Чтобы избежать конфликтов, настройте фильтры исключения, чтобы каждый обновленный файл включался только в одну базовую папку. Versioning folder: Папка для архивирования файлов: @@ -568,124 +686,6 @@ Unable to create time stamp for versioning: Невозможно создать метку времени для архивирования файлов: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Неожиданный размер потока данных. -Ожидаемый: %x байт -Фактический: %y байт - - -Cannot write permissions of %x. -Невозможно записать права доступа %x. - -Operation not supported between different devices. -Операция не поддерживается между различными устройствами. - -Cannot delete file %x. -Невозможно удалить файл %x. - -Cannot delete symbolic link %x. -Невозможно удалить символьную ссылку %x. - -Cannot delete directory %x. -Невозможно удалить папку %x. - -Error Code %x -Код ошибки %x - -Cannot write modification time of %x. -Невозможно записать время изменения файла %x. - -Cannot create directory %x. -Невозможно создать папку %x. - -Cannot determine final path for %x. -Невозможно определить конечный путь для %x. - -Operation not supported by device. -Операция не поддерживается устройством. - -Cannot resolve symbolic link %x. -Невозможно разрешить символьную ссылку %x. - -Unable to move %x to the recycle bin. -Невозможно переместить %x в "Корзину". - -Authentication completed. -Аутентификация завершена. - -You may close this page now and continue with FreeFileSync. -Вы можете закрыть эту страницу сейчас и продолжить с FreeFileSync. - -Authentication failed. -Ошибка аутентификации. - -Cannot find %x. -Невозможно найти %x. - -Please authorize access to user account %x. -Пожалуйста, авторизуйте доступ к учетной записи пользователя %x. - -Cannot determine free disk space for %x. -Невозможно определить свободное место на диске для %x. - -Unable to disconnect from %x. -Невозможно отключиться от %x. - -Unable to access %x. -Невозможно получить доступ к %x. - -Failed to get information about server %x. -Не удалось получить информацию о сервере %x. - -Cannot monitor directory %x. -Невозможно отследить папку %x. - -Cannot find device %x. -Невозможно найти устройство %x. - -Cannot open directory %x. -Невозможно открыть папку %x. - -Unsupported item type. -Неподдерживаемый тип элемента. - -Incorrect command line: -Неверная командная строка: - -The server does not support authentication via %x. -Сервер не поддерживает аутентификацию с помощью %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Время ожидания соединения истекает через %x сукунду. -Время ожидания соединения истекает через %x сукунды. -Время ожидания соединения истекает через %x сукунд. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Невозможно обработать более %x соединения за раз. -Невозможно обработать более %x соединений за раз. -Невозможно обработать более %x соединений за раз. - - -Active connections: %x -Активные соединения: %x - -Failed to open SFTP channel number %x. -Не удалось открыть SFTP канал номер %x. - Drag && drop Drag && drop @@ -752,6 +752,9 @@ Actual: %y bytes Command line: Командная строка: +&Hide console window +&Скрыть окно консоли + The command is triggered if: - files or subfolders change @@ -787,8 +790,8 @@ The command is triggered if: Waiting until directory is available: Ожидание доступа к папке: -&Restore -&Восстановить +&Configure +&Настроить &Show error message &Показать сообщение об ошибке @@ -824,8 +827,8 @@ The command is triggered if: Scanning... Сканирование... -job name -название +configuration file +конфигурационный файл System: Sleep Система: Спящий режим @@ -836,8 +839,8 @@ The command is triggered if: Nothing to synchronize Ничего нет для синхронизации -Executing command %x -Выполнение команды %x +Executing command: +Выполнение команды: You can switch to FreeFileSync's main window to resolve this issue. Вы можете переключиться на главное окно FreeFileSync для решения этой проблемы. @@ -1038,6 +1041,12 @@ The command is triggered if: Match case Учитывать регистр +Processed: +Обработано: + +Remaining: +Осталось: + New Новая @@ -1274,14 +1283,17 @@ The command is triggered if: &Don't show this dialog again Больше &не показывать это окно -Items found: -Элементов найдено: +Bytes: +Байт: -Time remaining: -Времени осталось: +Items: +Элементов: -Time elapsed: -Времени прошло: +Synchronizing... +Синхронизация... + +Minimize to notification area +Свернуть в область уведомлений Bytes Байт @@ -1289,12 +1301,6 @@ The command is triggered if: Items Элементов -Synchronizing... -Синхронизация... - -Minimize to notification area -Свернуть в область уведомлений - When finished: По завершении: @@ -1370,6 +1376,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: &Удаление журналов через x дней: +Notification sounds: +Звуки уведомлений: + +Synchronization finished: +Синхронизация окончена: + Customize context menu: Кастомизация контекстного меню: @@ -1578,12 +1590,6 @@ This guarantees a consistent state even in case of a serious error. &Delete &Удалить... -Include all -Включить все - -Exclude all -Исключить все - Show icons: Отображать иконки: @@ -1620,6 +1626,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &Не сохранять +%x cannot be renamed. +%x не может быть переименована. + +New name: +Новое имя: + +Rename Configuration +Переименовать конфигурацию + +Configuration name must not be empty. +Имя конфигурации не должно быть пустым. + +&Rename... +&Переименовать... + Hide configuration Удалить конфигурацию из списка @@ -1731,8 +1752,8 @@ This guarantees a consistent state even in case of a serious error. Password: Пароль: -Key password: -Пароль: +Key passphrase: +Ключ парольной фразы: Please enter a file path. Пожалуйста, укажите путь к файлу. @@ -1899,6 +1920,9 @@ This guarantees a consistent state even in case of a serious error. Minimum version count must be smaller than maximum count. Минимальное количество версий должно быть меньше максимального количества версий. +&Restore +&Восстановить + Files Файлы @@ -1965,6 +1989,9 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: Файл заблокирован другим процессом: +Failed to determine file permission support for folder %x. +Не удалось определить поддержку разрешения файла для папки %x. + Cannot read security context of %x. Невозможно прочитать контекст безопасности %x. @@ -2018,12 +2045,12 @@ This guarantees a consistent state even in case of a serious error. Cannot change process I/O priorities. Невозможно изменить приоритет процесса. -Unable to shut down the system. -Невозможно завершить работу системы. - Checking recycle bin failed for folder %x. Проверка "Корзины" не удалась для папки %x. +Unable to shut down the system. +Невозможно завершить работу системы. + Prepare installation Подготовка установки diff --git a/FreeFileSync/Build/Resources/Languages/slovak.lng b/FreeFileSync/Build/Resources/Languages/slovak.lng index 1255109c..0d896e51 100755 --- a/FreeFileSync/Build/Resources/Languages/slovak.lng +++ b/FreeFileSync/Build/Resources/Languages/slovak.lng @@ -481,6 +481,27 @@ Aktuálne: %y b Update attributes on right Aktualizovať atribúty napravo +Error parsing file %x, row %y, column %z. +Chyba spracovania súboru %x: na riadku %y v stĺpci %z. + +Services +Služby + +Show All +Zobraziť Všetko + +Hide Others +Skryť Ostatné + +Hide %x +Skryť %x + +Quit %x +Ukončiť %x + +Cannot set directory locks for the following folders: +Nie je možné nastaviť uzamknutie adresárov pre nasledujúce priečinky: + Errors: Chyby: @@ -505,27 +526,6 @@ Aktuálne: %y b Cleaning up log files: Odstránenie log súborov: -Error parsing file %x, row %y, column %z. -Chyba spracovania súboru %x: na riadku %y v stĺpci %z. - -Services -Služby - -Show All -Zobraziť Všetko - -Hide Others -Skryť Ostatné - -Hide %x -Skryť %x - -Quit %x -Ukončiť %x - -Cannot set directory locks for the following folders: -Nie je možné nastaviť uzamknutie adresárov pre nasledujúce priečinky: - 1 thread %x threads @@ -629,8 +629,8 @@ Aktuálne: %y b Cannot find folder %x. Nie je možné nájsť priečinok %x. -Target folder %x already existing. -Cieľový priečinok %x už existuje. +Target folder %x is already existing, but was not available during folder comparison. +Cielová zložka %x už existuje, ale nebola dostupná počas porovnávania súborov. Target folder input field must not be empty. Cieľový priečinok nesmie byť prázdny. @@ -659,8 +659,8 @@ Aktuálne: %y b Some files will be synchronized as part of multiple base folders. Niektoré súbory budú synchronizované ako súčasť viacerých základných priečinkov. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Aby nedošlo ku konfliktom, je potrebné nastaviť filter tak, aby každý aktualiz. súbor mal iba jeden základný priečinok. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Pre zabránenie konfliktu, nastavte filter vylúčenia tak, aby bol každý súbor zahrnutý iba v jednom základnom priečinku. Versioning folder: Priečinok verzovania: @@ -827,8 +827,8 @@ Príkaz bude spustení ak: Scanning... Vyhľadávanie... -job name -názov úlohy +configuration file +konfiguračný súbor System: Sleep Systém: Uspať @@ -1041,6 +1041,12 @@ Príkaz bude spustení ak: Match case Rozlišovať malé a veľké písmená +Processed: +Spracované: + +Remaining: +Zostáva: + New Nový @@ -1277,17 +1283,11 @@ Príkaz bude spustení ak: &Don't show this dialog again Tento dialog už &nezobrazovať -Items found: -Nájdených položiek: - -Time remaining: -Zostávajúci čas: +Bytes: +Bajtov: -Bytes -Bytov - -Items -Položky +Items: +Položky: Synchronizing... Synchronizujem... @@ -1295,6 +1295,12 @@ Príkaz bude spustení ak: Minimize to notification area Minimalizovať do oznamovacej oblasti +Bytes +Bytov + +Items +Položky + When finished: Po dokončení: @@ -1367,6 +1373,12 @@ This guarantees a consistent state even in case of a serious error. &Delete logs after x days: &Zmazať log po x dňoch: +Notification sounds: +Zvuk oznámenia: + +Synchronization finished: +Synchronizácia dokončená: + Customize context menu: Prispôsobiť kontextovú ponuku: @@ -1518,36 +1530,6 @@ This guarantees a consistent state even in case of a serious error. &Execute &Spustiť - -1 directory -%x directories - - -1 adresár -%x adresáre -%x adresárov - - - -1 file -%x files - - -1 súbor -%x súbory -%x súborov - - - -Showing %y of 1 row -Showing %y of %x rows - - -Zobrazenie %y z 1 riadku -Zobrazenie %y z %x riadky -Zobrazenie %y z %x riadkov - - Set direction: Zadať smer: @@ -1611,6 +1593,21 @@ This guarantees a consistent state even in case of a serious error. Do&n't save &Neukladať +%x cannot be renamed. +%x nemôže byť premenované. + +New name: +Nový názov: + +Rename Configuration +Premenovať Konfiguráciu + +Configuration name must not be empty. +Názov konfigurácie nemôže zostať prázdny. + +&Rename... +&Premenovať... + Hide configuration Skryť konfiguráciu @@ -1671,6 +1668,36 @@ This guarantees a consistent state even in case of a serious error. All files are in sync Všetky súbory sú synchronizované + +1 directory +%x directories + + +1 adresár +%x adresáre +%x adresárov + + + +1 file +%x files + + +1 súbor +%x súbory +%x súborov + + + +Showing %y of 1 row +Showing %y of %x rows + + +Zobrazenie %y z 1 riadku +Zobrazenie %y z %x riadky +Zobrazenie %y z %x riadkov + + Cannot find %x Nie je možné nájsť %x @@ -1722,8 +1749,8 @@ This guarantees a consistent state even in case of a serious error. Password: Heslo: -Key password: -Heslo kľúča: +Key passphrase: +Prístupová fráza: Please enter a file path. Prosím zadajte cestu k súboru. @@ -1959,8 +1986,8 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: Súbor je uzamknutý iným procesom: -Checking file permissions failed for folder %x. -Kontrola prístupových oprávnení sa nepodarila pre priečinok %x. +Failed to determine file permission support for folder %x. +Nepodarilo sa načítať oprávnenia pre zložku %x. Cannot read security context of %x. Nie je možné načítať prístupové práva pre %x. diff --git a/FreeFileSync/Build/Resources/Languages/slovenian.lng b/FreeFileSync/Build/Resources/Languages/slovenian.lng index 25bd57e6..6deee301 100755 --- a/FreeFileSync/Build/Resources/Languages/slovenian.lng +++ b/FreeFileSync/Build/Resources/Languages/slovenian.lng @@ -7,6 +7,159 @@ n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3 +Cannot read file %x. +Ne morem prebrati datoteke %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Nepričakovana velikost toka podatkov. +Pričakovano: %x bajtov +Dejansko: %y bajtov + + +Cannot write file %x. +Ne morem zapisati datoteke %x. + +Cannot write permissions of %x. +Ne morem zapisati dovoljenj za %x. + +Operation not supported between different devices. +Operacija med različnimi napravami ni podprta. + +Cannot delete file %x. +Ne morem izbrisati datoteke %x. + +Cannot delete symbolic link %x. +Ne morem izbrisati simbolične povezave %x. + +Cannot delete directory %x. +Ne morem izbrisati imenika %x. + +Cannot move file %x to %y. +Ne morem premakniti datoteko %x v %y. + +Cannot copy symbolic link %x to %y. +Ne morem kopirati simbolične povezave %x v %y. + +Error Code %x +Napačna koda %x. + +Cannot read directory %x. +Ne morem prebrati direktorija %x. + +Cannot write modification time of %x. +Ne morem zapisati časa spremembe od %x. + +Cannot read file attributes of %x. +Ne morem brati datotečnih atributov od %x. + +Cannot create directory %x. +Ne morem ustvariti imenika %x. + +Cannot determine final path for %x. +Ne morem določiti končne poti za %x. + +Operation not supported by device. +Operacija z napravo ni podprta. + +Cannot resolve symbolic link %x. +Ne morem razrešiti simbolične povezave %x. + +Unable to move %x to the recycle bin. +Ne morem premakniti %x v koš. + +Authentication completed. +Preverjanje pristnosti končano. + +You may close this page now and continue with FreeFileSync. +To stran lahko zdaj zaprete in nadaljujete z FreeFileSync. + +Authentication failed. +Preverjanje pristnosti ni uspelo. + +Unable to connect to %x. +Ne morem povezati na %x. + +Cannot find %x. +Ne najdem %x. + +The name %x is used by more than one item in the folder. +Ime %x uporablja več kot ena postavka v mapi. + +Please authorize access to user account %x. +Odobrite dostop do uporabniškega računa %x. + +Cannot open file %x. +Ne morem odpreti datoteke %x. + +The name %x is already used by another item. +Ime %x že uporablja druga postavka. + +Cannot determine free disk space for %x. +Ne morem določiti prostega prostora na disku za %x. + +Unable to disconnect from %x. +Povezave z %x ni mogoče prekiniti. + +Unable to access %x. +Ne morem dostopati do %x. + +Failed to get information about server %x. +Ne morem pridobiti informacije o strežniku %x. + +Cannot monitor directory %x. +Ne morem nadzirati imenika %x. + +Cannot find device %x. +Ne najdem naprave %x. + +Cannot open directory %x. +Ne morem odpreti imenika %x. + +Unsupported item type. +Nepodprta vrsta postavke. + +Incorrect command line: +Napačna ukazna vrstica: + +The server does not support authentication via %x. +Strežnik ne podpira preverjanja pristnosti preko %x. + +Required: +Zahtevano: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Operacija je potekla po %x sekundi. +Operacija je potekla po %x sekundah. +Operacija je potekla po %x sekundah. +Operacija je potekla po %x sekundah. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Ne morem čakati na več kot %x povezavo naenkrat. +Ne morem čakati na več kot %x povezavi naenkrat. +Ne morem čakati na več kot %x povezave naenkrat. +Ne morem čakati na več kot %x povezav naenkrat. + + +Active connections: %x +Aktivne povezave: %x + +Failed to open SFTP channel number %x. +Ne morem odpreti SFTP kanala številka %x. + Both sides have changed since last synchronization. Obe strani sta spremenjeni po zadnji sinhronizaciji. @@ -109,9 +262,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Namestitvena datoteka je poškodovana. Prosim ponovno naložite FreeFileSync. -Cannot load file %x. -Ne morem naložiti datoteko %x. - Cannot find the following folders: Ne najdem naslednjih map: @@ -141,6 +291,9 @@ %x najdenih postavk +Time elapsed: +Pretečeni čas: + File %x has an invalid date. Datoteka %x ima neveljaven datum. @@ -159,9 +312,6 @@ Items differ in attributes only Postavke se razlikujejo samo po atributih -The name %x is used by more than one item in the folder. -Ime %x uporablja več kot ena postavka v mapi. - Resolving symbolic link %x Razrešujem simbolično povezavo %x @@ -222,6 +372,15 @@ Out of memory. Ni dovolj pomnilnika. +Show in Explorer +Prikaži v Raziskovalcu + +Open with default application +Odpri s privzeto aplikacijo + +Browse directory +Brskaj po imeniku + Database file %x is incompatible. Datoteka podatkovne baze %x je nekompatibilna. @@ -234,12 +393,6 @@ Database file is corrupted: Datoteka v bazi podatkov je poškodovana: -Cannot write file %x. -Ne morem zapisati datoteke %x. - -Cannot read file %x. -Ne morem prebrati datoteke %x. - The database files do not yet contain information about the last synchronization. Datoteke v bazi podatkov še ne vsebujejo informacije o zadnji sinhronizaciji. @@ -258,9 +411,6 @@ Cannot get process information. Ne morem pridobiti informacij o procesu. -Cannot read file attributes of %x. -Ne morem brati datotečnih atributov od %x. - Waiting while directory is locked: Čakam dokler je imenik zaklenjen: @@ -391,27 +541,12 @@ %x niti -Cannot read directory %x. -Ne morem prebrati direktorija %x. - %x/sec %x/sek %x items %x postavk -Show in Explorer -Prikaži v Raziskovalcu - -Open with default application -Odpri s privzeto aplikacijo - -Browse directory -Brskaj po imeniku - -Unable to connect to %x. -Ne morem povezati na %x. - Completed successfully Uspešno končano @@ -457,9 +592,6 @@ Cannot write file attributes of %x. Ne morem zapisati datotečnih atributov od %x. -Cannot open file %x. -Ne morem odpreti datoteke %x. - %x and %y have different content. %x in %y imata različno vsebino. @@ -490,29 +622,20 @@ Source item %x not found Izvorna postavka %x ni bila najdena -Cannot move file %x to %y. -Ne morem premakniti datoteko %x v %y. - Parent folder %x is not existing. Nadrejena mapa %x ne obstaja. -The name %x is already used by another item. -Ime %x že uporablja druga postavka. - Cannot copy file %x to %y. Ne morem kopirati datoteke %x v %y. -Cannot copy symbolic link %x to %y. -Ne morem kopirati simbolične povezave %x v %y. - Creating a Volume Shadow Copy for %x... Ustvarjam Volume Shadow Copy za %x... Cannot find folder %x. Ne najdem mape %x. -Target folder %x already existing. -Ciljna mapa %x že obstaja. +Target folder %x is already existing, but was not available during folder comparison. +Ciljna mapa %x že obstaja, toda med primerjanjem map ni bila na voljo. Target folder input field must not be empty. Vnosno polje ciljnë mape ne sme biti prazno. @@ -535,17 +658,14 @@ Not enough free disk space available in: Na voljo ni dovolj prostega prostora na disku v: -Required: -Zahtevano: - Available: Na voljo: Some files will be synchronized as part of multiple base folders. Nekatere datoteke bodo sinhronizirane kot del večih osnovnih map. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Da bi se izognili sporom, nastavite izključno filtre tako, da je vsaka posodobljena datoteka upoštevana samo v eni osnovni mapi. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +V izogib konfliktom, nastavite izključitev filtrov, tako da je vsaka posodobljena datoteka povezana samo z eno osnovno mapo. Versioning folder: Označitev mape: @@ -571,126 +691,6 @@ Unable to create time stamp for versioning: Časovnega žiga za oznčitev ni bilo mogoče ustvariti: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Nepričakovana velikost toka podatkov. -Pričakovano: %x bajtov -Dejansko: %y bajtov - - -Cannot write permissions of %x. -Ne morem zapisati dovoljenj za %x. - -Operation not supported between different devices. -Operacija med različnimi napravami ni podprta. - -Cannot delete file %x. -Ne morem izbrisati datoteke %x. - -Cannot delete symbolic link %x. -Ne morem izbrisati simbolične povezave %x. - -Cannot delete directory %x. -Ne morem izbrisati imenika %x. - -Error Code %x -Napačna koda %x. - -Cannot write modification time of %x. -Ne morem zapisati časa spremembe od %x. - -Cannot create directory %x. -Ne morem ustvariti imenika %x. - -Cannot determine final path for %x. -Ne morem določiti končne poti za %x. - -Operation not supported by device. -Operacija z napravo ni podprta. - -Cannot resolve symbolic link %x. -Ne morem razrešiti simbolične povezave %x. - -Unable to move %x to the recycle bin. -Ne morem premakniti %x v koš. - -Authentication completed. -Preverjanje pristnosti končano. - -You may close this page now and continue with FreeFileSync. -To stran lahko zdaj zaprete in nadaljujete z FreeFileSync. - -Authentication failed. -Preverjanje pristnosti ni uspelo. - -Cannot find %x. -Ne najdem %x. - -Please authorize access to user account %x. -Odobrite dostop do uporabniškega računa %x. - -Cannot determine free disk space for %x. -Ne morem določiti prostega prostora na disku za %x. - -Unable to disconnect from %x. -Povezave z %x ni mogoče prekiniti. - -Unable to access %x. -Ne morem dostopati do %x. - -Failed to get information about server %x. -Ne morem pridobiti informacije o strežniku %x. - -Cannot monitor directory %x. -Ne morem nadzirati imenika %x. - -Cannot find device %x. -Ne najdem naprave %x. - -Cannot open directory %x. -Ne morem odpreti imenika %x. - -Unsupported item type. -Nepodprta vrsta postavke. - -Incorrect command line: -Napačna ukazna vrstica: - -The server does not support authentication via %x. -Strežnik ne podpira preverjanja pristnosti preko %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Operacija je potekla po %x sekundi. -Operacija je potekla po %x sekundah. -Operacija je potekla po %x sekundah. -Operacija je potekla po %x sekundah. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Ne morem čakati na več kot %x povezavo naenkrat. -Ne morem čakati na več kot %x povezavi naenkrat. -Ne morem čakati na več kot %x povezave naenkrat. -Ne morem čakati na več kot %x povezav naenkrat. - - -Active connections: %x -Aktivne povezave: %x - -Failed to open SFTP channel number %x. -Ne morem odpreti SFTP kanala številka %x. - Drag && drop Povleci && spusti @@ -757,6 +757,9 @@ Dejansko: %y bajtov Command line: Ukazna vrstica: +&Hide console window +&Skrij okno konzole + The command is triggered if: - files or subfolders change @@ -792,8 +795,8 @@ Ukaz se sproži če: Waiting until directory is available: Čakanje, da je imenik na voljo: -&Restore -&Obnovi +&Configure +&Konfiguriraj &Show error message &Prikaži sporočilo o napaki @@ -830,8 +833,8 @@ Ukaz se sproži če: Scanning... Skeniram... -job name -naziv opravila +configuration file +konfiguracijska datoteka System: Sleep Sistem: Spanje @@ -842,8 +845,8 @@ Ukaz se sproži če: Nothing to synchronize Nič za sinhroniziranje -Executing command %x -Izvedba ukaza %x +Executing command: +Izvedi ukaz: You can switch to FreeFileSync's main window to resolve this issue. Če želite odpraviti to težavo, lahko preklopite na glavno okno FreeFileSync. @@ -1045,6 +1048,12 @@ Ukaz se sproži če: Match case Ujemanje primera +Processed: +Obdelano: + +Remaining: +Preostalo: + New Nova @@ -1281,14 +1290,17 @@ Ukaz se sproži če: &Don't show this dialog again &Tega pogovornega okna ne prikazuj znova -Items found: -Najdenih postavk: +Bytes: +Bajti: -Time remaining: -Preostali čas: +Items: +Postavke: -Time elapsed: -Pretečeni čas: +Synchronizing... +Sinhroniziram... + +Minimize to notification area +Pomanjšaj v območje obvestil Bytes Bitov @@ -1296,12 +1308,6 @@ Ukaz se sproži če: Items Postavk -Synchronizing... -Sinhroniziram... - -Minimize to notification area -Pomanjšaj v območje obvestil - When finished: Po zaključku: @@ -1377,6 +1383,12 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. &Delete logs after x days: &Izbriši dnevnike po x dneh: +Notification sounds: +Zvok obvestila: + +Synchronization finished: +Sinhronizacija je zaključena: + Customize context menu: Prilagodi kontekstni meni: @@ -1589,12 +1601,6 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. &Delete &Izbriši -Include all -Vključi vse - -Exclude all -Izključi vse - Show icons: Prikaži ikone: @@ -1631,6 +1637,21 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Do&n't save Ne shra&ni +%x cannot be renamed. +%x ni mogoče preimenovati. + +New name: +Novo ime: + +Rename Configuration +Preimenovanje konfiguracije + +Configuration name must not be empty. +Ime konfiguracije ne sme biti prazno. + +&Rename... +&Preimenovanje... + Hide configuration Skrij konfiguracijo @@ -1742,8 +1763,8 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Password: Geslo: -Key password: -Aktivacijski ključ: +Key passphrase: +Geslo za ključ: Please enter a file path. Vnesite pot do datoteke. @@ -1913,6 +1934,9 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Minimum version count must be smaller than maximum count. Najmanjše število različic mora biti manjše od največjega števila. +&Restore +&Obnovi + Files Datoteke @@ -1979,6 +2003,9 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. The file is locked by another process: Datoteko je zaklenil drug proces: +Failed to determine file permission support for folder %x. +Preverjanje podpore za dovoljenje datoteke za mapo %x ni uspelo. + Cannot read security context of %x. Ne morem prebrati varnostni kontekst od %x. @@ -2034,12 +2061,12 @@ To zagotavlja dosledno stanje tudi v primeru resne napake. Cannot change process I/O priorities. Ne morem spremeniti prioritet procesa I/O. -Unable to shut down the system. -Sistema ni mogoče zapustiti. - Checking recycle bin failed for folder %x. Preverjanje koša za mapo %x ni uspelo. +Unable to shut down the system. +Sistema ni mogoče zapustiti. + Prepare installation Pripravljam namestitev diff --git a/FreeFileSync/Build/Resources/Languages/spanish.lng b/FreeFileSync/Build/Resources/Languages/spanish.lng index cf756088..29d5ee3b 100755 --- a/FreeFileSync/Build/Resources/Languages/spanish.lng +++ b/FreeFileSync/Build/Resources/Languages/spanish.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +No se puede leer el archivo %x. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Tamaño no esperado del flujo de datos. +Esperados: %x bytes +Reales: %y bytes + + +Cannot write file %x. +No se puede escribir el archivo %x. + +Cannot write permissions of %x. +No se pueden escribir los permisos de %x. + +Operation not supported between different devices. +No se admite esta operación entre dispositivos diferentes. + +Cannot delete file %x. +No se puede eliminar el archivo %x. + +Cannot delete symbolic link %x. +No se puede eliminar el vínculo simbólico %x. + +Cannot delete directory %x. +No se puede eliminar el directorio %x. + +Cannot move file %x to %y. +No se puede mover el archivo %x a %y. + +Cannot copy symbolic link %x to %y. +No se puede copiar el vínculo simbólico %x a %y. + +Error Code %x +Código de error %x + +Cannot read directory %x. +No se puede leer el directorio %x. + +Cannot write modification time of %x. +No se puede escribir el tiempo de modificación de %x. + +Cannot read file attributes of %x. +No se puede leer archivo de atributos de %x. + +Cannot create directory %x. +No se puede crear el directorio %x. + +Cannot determine final path for %x. +No se puede determinar la ruta final de %x. + +Operation not supported by device. +El dispositivo no admite esta operación. + +Cannot resolve symbolic link %x. +No se puede resolver el vínculo simbólico %x. + +Unable to move %x to the recycle bin. +No es posible mover %x a la papelera de reciclaje. + +Authentication completed. +Autenticación completada. + +You may close this page now and continue with FreeFileSync. +Puede cerrar esta página y continuar con FreeFileSync. + +Authentication failed. +Fallo de autenticación. + +Unable to connect to %x. +No se puede conectar a %x. + +Cannot find %x. +No se encuentra %x. + +The name %x is used by more than one item in the folder. +El nombre %x es utilizado por más de un elemento en la carpeta. + +Please authorize access to user account %x. +Autorice el acceso a la cuenta de usuario %x. + +Cannot open file %x. +No se puede abrir el archivo %x. + +The name %x is already used by another item. +El nombre %x es utilizado por otro elemento. + +Cannot determine free disk space for %x. +No se puede determinar el espacio libre en disco para %x. + +Unable to disconnect from %x. +No se puede desconectar de %x. + +Unable to access %x. +No se puede acceder a %x. + +Failed to get information about server %x. +Fallo al obtener información del servidor %x. + +Cannot monitor directory %x. +No se puede monitorizar el directorio %x. + +Cannot find device %x. +No se encuentra el dispositivo %x. + +Cannot open directory %x. +No se puede abrir el directorio %x. + +Unsupported item type. +Tipo de elemento no admitido. + +Incorrect command line: +Línea de comandos incorrecta: + +The server does not support authentication via %x. +El servidor no admite autenticación via %x. + +Required: +Requerido: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +La operación superó el tiempo de espera tras 1 segundo. +La operación superó el tiempo de espera tras %x segundos. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +No se puede esperar más de 1 conexión a la vez. +No se pueden esperar más de %x conexiones a la vez. + + +Active connections: %x +Conexiones activas: %x + +Failed to open SFTP channel number %x. +Fallo de apertura del canal SFTP número %x. + Both sides have changed since last synchronization. Ambos lados han cambiado desde la última sincronización. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Los archivos de instalación están dañados. Reinstale FreeFileSync. -Cannot load file %x. -No se puede cargar el archivo %x. - Cannot find the following folders: No se pudieron encontrar las siguiente carpetas: @@ -139,6 +285,9 @@ %x elementos encontrados +Time elapsed: +Tiempo transcurrido: + File %x has an invalid date. El archivo %x tiene una fecha inválida. @@ -157,9 +306,6 @@ Items differ in attributes only Los elementos sólo se diferencian en los atributos -The name %x is used by more than one item in the folder. -El nombre %x es utilizado por más de un elemento en la carpeta. - Resolving symbolic link %x Resolviendo vínculo simbólico %x @@ -220,6 +366,15 @@ Out of memory. Sin memoria. +Show in Explorer +Mostrar en el Explorador + +Open with default application +Abrir con la aplicación predeterminada + +Browse directory +Examinar directorio + Database file %x is incompatible. El archivo de base de datos %x es incompatible. @@ -232,12 +387,6 @@ Database file is corrupted: El archivo de base de datos está dañado: -Cannot write file %x. -No se puede escribir el archivo %x. - -Cannot read file %x. -No se puede leer el archivo %x. - The database files do not yet contain information about the last synchronization. Los archivos de datos aún no contienen información acerca de una sincronización anterior. @@ -256,9 +405,6 @@ Cannot get process information. No se puede obtener información del proceso. -Cannot read file attributes of %x. -No se puede leer archivo de atributos de %x. - Waiting while directory is locked: Esperando mientras el directorio está bloqueado: @@ -385,27 +531,12 @@ %x subprocesos -Cannot read directory %x. -No se puede leer el directorio %x. - %x/sec %x/seg %x items %x elementos -Show in Explorer -Mostrar en el Explorador - -Open with default application -Abrir con la aplicación predeterminada - -Browse directory -Examinar directorio - -Unable to connect to %x. -No se puede conectar a %x. - Completed successfully Completado con éxito @@ -451,9 +582,6 @@ Cannot write file attributes of %x. No se pueden escribir los atributos de archivo de %x. -Cannot open file %x. -No se puede abrir el archivo %x. - %x and %y have different content. %x y %y tienen contenidos diferentes. @@ -484,29 +612,20 @@ Source item %x not found No se encontró el archivo de origen %x -Cannot move file %x to %y. -No se puede mover el archivo %x a %y. - Parent folder %x is not existing. La carpeta principal %x no existe. -The name %x is already used by another item. -El nombre %x es utilizado por otro elemento. - Cannot copy file %x to %y. No se puede copiar el archivo %x a %y. -Cannot copy symbolic link %x to %y. -No se puede copiar el vínculo simbólico %x a %y. - Creating a Volume Shadow Copy for %x... Creando una Instantánea de volumen para %x... Cannot find folder %x. No se puede encontrar la carpeta %x. -Target folder %x already existing. -La carpeta de destino %x ya existe. +Target folder %x is already existing, but was not available during folder comparison. +La carpeta de destino %x ya existe, pero no estaba disponible durante la comparación de carpetas. Target folder input field must not be empty. El campo de entrada de la carpeta de destino no debe estar vacío. @@ -529,17 +648,14 @@ Not enough free disk space available in: Espacio en disco insuficiente en: -Required: -Requerido: - Available: Disponible: Some files will be synchronized as part of multiple base folders. Se van a sincronizar algunos archivos como partes de varias carpetas base. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Para evitar conflictos, defina filtros de exclusión de forma que cada archivo actualizado sea procesado desde una única carpeta base. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Para evitar conflictos, defina filtros de exclusión de forma que cada archivo actualizado aparezca solo en una única carpeta base. Versioning folder: Carpeta de versionado: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: No es posible crear la fecha y hora para el versionado: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Tamaño no esperado del flujo de datos. -Esperados: %x bytes -Reales: %y bytes - - -Cannot write permissions of %x. -No se pueden escribir los permisos de %x. - -Operation not supported between different devices. -No se admite esta operación entre dispositivos diferentes. - -Cannot delete file %x. -No se puede eliminar el archivo %x. - -Cannot delete symbolic link %x. -No se puede eliminar el vínculo simbólico %x. - -Cannot delete directory %x. -No se puede eliminar el directorio %x. - -Error Code %x -Código de error %x - -Cannot write modification time of %x. -No se puede escribir el tiempo de modificación de %x. - -Cannot create directory %x. -No se puede crear el directorio %x. - -Cannot determine final path for %x. -No se puede determinar la ruta final de %x. - -Operation not supported by device. -El dispositivo no admite esta operación. - -Cannot resolve symbolic link %x. -No se puede resolver el vínculo simbólico %x. - -Unable to move %x to the recycle bin. -No es posible mover %x a la papelera de reciclaje. - -Authentication completed. -Autenticación completada. - -You may close this page now and continue with FreeFileSync. -Puede cerrar esta página y continuar con FreeFileSync. - -Authentication failed. -Fallo de autenticación. - -Cannot find %x. -No se encuentra %x. - -Please authorize access to user account %x. -Autorice el acceso a la cuenta de usuario %x. - -Cannot determine free disk space for %x. -No se puede determinar el espacio libre en disco para %x. - -Unable to disconnect from %x. -No se puede desconectar de %x. - -Unable to access %x. -No se puede acceder a %x. - -Failed to get information about server %x. -Fallo al obtener información del servidor %x. - -Cannot monitor directory %x. -No se puede monitorizar el directorio %x. - -Cannot find device %x. -No se encuentra el dispositivo %x. - -Cannot open directory %x. -No se puede abrir el directorio %x. - -Unsupported item type. -Tipo de elemento no admitido. - -Incorrect command line: -Línea de comandos incorrecta: - -The server does not support authentication via %x. -El servidor no admite autenticación via %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -La operación superó el tiempo de espera tras 1 segundo. -La operación superó el tiempo de espera tras %x segundos. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -No se puede esperar más de 1 conexión a la vez. -No se pueden esperar más de %x conexiones a la vez. - - -Active connections: %x -Conexiones activas: %x - -Failed to open SFTP channel number %x. -Fallo de apertura del canal SFTP número %x. - Drag && drop Arrastrar y soltar @@ -747,6 +747,9 @@ Reales: %y bytes Command line: Línea de comandos: +&Hide console window +&Ocultar la consola de comandos + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ El comando es disparado si: Waiting until directory is available: Esperando que el directorio esté disponible: -&Restore -&Restaurar +&Configure +&Configura &Show error message Mo&strar mensaje de error @@ -818,8 +821,8 @@ El comando es disparado si: Scanning... Escaneando... -job name -nombre de tarea +configuration file +archivo de configuración System: Sleep Sistema: suspender @@ -830,8 +833,8 @@ El comando es disparado si: Nothing to synchronize Nada que sincronizar -Executing command %x -Ejecución del comando %x +Executing command: +Ejecución del comando: You can switch to FreeFileSync's main window to resolve this issue. Puede cambiar a la ventana principal de FreeFileSync para resolver este problema. @@ -1031,6 +1034,12 @@ El comando es disparado si: Match case Coincidir mayúsculas y minúsculas +Processed: +Procesado(s): + +Remaining: +Restantes: + New Nuevo @@ -1199,7 +1208,7 @@ El comando es disparado si: Tipo de conexión: Connected user accounts: -Cuentas de usuario conectadas: +Cuentas de usuarion conectadas: &Add connection &Agregar conexión @@ -1267,14 +1276,17 @@ El comando es disparado si: &Don't show this dialog again &No volver a mostrar este diálogo -Items found: -Elementos encontrados: +Bytes: +Bytes: -Time remaining: -Tiempo restante: +Items: +Elementos: -Time elapsed: -Tiempo transcurrido: +Synchronizing... +Sincronizando... + +Minimize to notification area +Minimizar en el área de notificación Bytes Bytes @@ -1282,12 +1294,6 @@ El comando es disparado si: Items Elementos -Synchronizing... -Sincronizando... - -Minimize to notification area -Minimizar en el área de notificación - When finished: Tras finalizar: @@ -1363,6 +1369,12 @@ Esto garantiza un estado coherente incluso en caso de error grave. &Delete logs after x days: &Eliminar los registros tras x días: +Notification sounds: +Notificaciones sonoras: + +Synchronization finished: +Synchronización finalizada: + Customize context menu: Personalizar menú contextual: @@ -1567,12 +1579,6 @@ Esto garantiza un estado coherente incluso en caso de error grave. &Delete &Eliminar -Include all -Incluir todo - -Exclude all -Excluir todo - Show icons: Mostrar iconos: @@ -1609,6 +1615,21 @@ Esto garantiza un estado coherente incluso en caso de error grave. Do&n't save &No guardar +%x cannot be renamed. +%x no se puede renombrar. + +New name: +Nuevo nombre: + +Rename Configuration +Renombrar la configuración + +Configuration name must not be empty. +El nombre de configuración no debe estar vacío. + +&Rename... +&Renombrar... + Hide configuration Ocultar configuración @@ -1720,8 +1741,8 @@ Esto garantiza un estado coherente incluso en caso de error grave. Password: Contraseña: -Key password: -Contraseña de clave: +Key passphrase: +Frase de contraseña: Please enter a file path. Indique la ruta de un archivo. @@ -1885,6 +1906,9 @@ Esto garantiza un estado coherente incluso en caso de error grave. Minimum version count must be smaller than maximum count. El contador mínimo de versión debe ser inferior al contador máximo. +&Restore +&Restaurar + Files Archivos @@ -1951,6 +1975,9 @@ Esto garantiza un estado coherente incluso en caso de error grave. The file is locked by another process: El archivo está bloqueado por otro proceso: +Failed to determine file permission support for folder %x. +No se puede determinar el soporte para permisos de archivos en la carpeta %x. + Cannot read security context of %x. No se puede leer el contexto de seguridad de %x. @@ -2002,12 +2029,12 @@ Esto garantiza un estado coherente incluso en caso de error grave. Cannot change process I/O priorities. No se pudieron cambiar las prioridades de E/S del proceso. -Unable to shut down the system. -No es posible apagar el sistema. - Checking recycle bin failed for folder %x. Fallo al comprobar la papelera de reciclaje para la carpeta %x. +Unable to shut down the system. +No es posible apagar el sistema. + Prepare installation Preparar la instalación diff --git a/FreeFileSync/Build/Resources/Languages/swedish.lng b/FreeFileSync/Build/Resources/Languages/swedish.lng index 88752d22..cb1b2211 100755 --- a/FreeFileSync/Build/Resources/Languages/swedish.lng +++ b/FreeFileSync/Build/Resources/Languages/swedish.lng @@ -7,6 +7,155 @@ n == 1 ? 0 : 1 +Cannot read file %x. +Filen %x kan inte läsas in. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Oväntad storlek på dataström. +Förväntad: %x byte +Aktuell: %y byte + + +Cannot write file %x. +Filen %x kan inte skrivas. + +Cannot write permissions of %x. +Kan inte skriva behörigheter för %x. + +Operation not supported between different devices. +Åtgärden stöds inte mellan olika enheter. + +Cannot delete file %x. +Filen %x kan inte tas bort. + +Cannot delete symbolic link %x. +Kan inte ta bort den symboliska länken %x. + +Cannot delete directory %x. +Kan inte ta bort mappen %x. + +Cannot move file %x to %y. +Kan inte flytta filen %x till %y. + +Cannot copy symbolic link %x to %y. +Kan inte kopiera den symboliska länken %x till %y. + +Error Code %x +Felkod %x + +Cannot read directory %x. +Kan inte läsa mappen %x. + +Cannot write modification time of %x. +Kan inte ändra tidsangivelsen för %x. + +Cannot read file attributes of %x. +Kan inte läsa filattribut för %x. + +Cannot create directory %x. +Kan inte skapa mappen %x. + +Cannot determine final path for %x. +Kan inte utläsa slutlig sökväg för %x. + +Operation not supported by device. +Åtgärden stöds inte av enheten. + +Cannot resolve symbolic link %x. +Den symboliska länken %x kan inte matchas. + +Unable to move %x to the recycle bin. +Kan inte att flytta %x till papperskorgen. + +Authentication completed. +Autentisering slutförd. + +You may close this page now and continue with FreeFileSync. +Du kan nu stänga denna sida och fortsätta med FreeFileSync. + +Authentication failed. +Autentisering misslyckades. + +Unable to connect to %x. +Kan inte ansluta till %x. + +Cannot find %x. +Kan inte hitta %x. + +The name %x is used by more than one item in the folder. +Namnet %x, används av mer än ett objekt, i mappen. + +Please authorize access to user account %x. +Autentisera åtkomst till användarkonto %x. + +Cannot open file %x. +Kan inte öppna %x. + +The name %x is already used by another item. +Namnet %x, används redan av ett annat objekt. + +Cannot determine free disk space for %x. +Kan inte avgöra ledigt utrymme på %x. + +Unable to disconnect from %x. +Kan inte koppla ifrån %x. + +Unable to access %x. +Kan inte komma åt %x. + +Failed to get information about server %x. +Kunde inte hämta information om server %x. + +Cannot monitor directory %x. +Mappen %x kan inte övervakas. + +Cannot find device %x. +Kan inte hitta enheten %x. + +Cannot open directory %x. +Kan inte öppna %x. + +Unsupported item type. +Objekttypen stöds inte. + +Incorrect command line: +Felaktig kommandorad: + +The server does not support authentication via %x. +Servern stödjer inte autentisering via %x. + +Required: +Utrymmeskrav: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +Åtgärdens tidsgräns överskreds efter 1 sekund. +Åtgärdens tidsgräns överskreds efter %x sekunder. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Kan inte vänta på fler än 1 anslutning åt gången. +Kan inte vänta på fler än %x anslutningar åt gången. + + +Active connections: %x +Aktiva anslutningar: %x + +Failed to open SFTP channel number %x. +Kunde inte öppna SFTP-kanal nummer %x. + Both sides have changed since last synchronization. Bägge sidor har ändrats sedan senaste synkroniseringen. @@ -109,9 +258,6 @@ Installation files are corrupted. Please reinstall FreeFileSync. Installationsfilerna är skadade. Installera om FreeFileSync. -Cannot load file %x. -Kan inte läsa in %x. - Cannot find the following folders: Kan inte hitta följande mappar: @@ -139,6 +285,9 @@ %x objekt hittade +Time elapsed: +Förfluten tid: + File %x has an invalid date. Filen %x har ett ogiltigt datum. @@ -157,9 +306,6 @@ Items differ in attributes only Endast attribut skiljer objekten åt -The name %x is used by more than one item in the folder. -Namnet %x, används av mer än ett objekt, i mappen. - Resolving symbolic link %x Översätter den symboliska länken %x @@ -220,6 +366,15 @@ Out of memory. Minnesbrist. +Show in Explorer +Visa i Utforskaren + +Open with default application +Öppna med standardprogram + +Browse directory +Sök upp mapp + Database file %x is incompatible. Databasfilen %x är inkompatibel. @@ -232,12 +387,6 @@ Database file is corrupted: Databasfilen är skadad: -Cannot write file %x. -Filen %x kan inte skrivas. - -Cannot read file %x. -Filen %x kan inte läsas in. - The database files do not yet contain information about the last synchronization. Datapasfilen innehåller ännu ingen information om senaste synkronisering. @@ -256,9 +405,6 @@ Cannot get process information. Processinformation kan inte inhämtas. -Cannot read file attributes of %x. -Kan inte läsa filattribut för %x. - Waiting while directory is locked: Väntar medan mappen låses: @@ -385,27 +531,12 @@ %x trådar -Cannot read directory %x. -Kan inte läsa mappen %x. - %x/sec %x/sek %x items %x objekt -Show in Explorer -Visa i Utforskaren - -Open with default application -Öppna med standardprogram - -Browse directory -Sök upp mapp - -Unable to connect to %x. -Kan inte ansluta till %x. - Completed successfully Korrekt slutförd @@ -451,9 +582,6 @@ Cannot write file attributes of %x. Kan inte skriva filattribut för %x. -Cannot open file %x. -Kan inte öppna %x. - %x and %y have different content. %x och %y har olika innehåll. @@ -484,29 +612,20 @@ Source item %x not found Källobjektet %x hittades inte -Cannot move file %x to %y. -Kan inte flytta filen %x till %y. - Parent folder %x is not existing. Överordnad mapp %x, finns inte. -The name %x is already used by another item. -Namnet %x, används redan av ett annat objekt. - Cannot copy file %x to %y. Kan inte kopiera %x till %y. -Cannot copy symbolic link %x to %y. -Kan inte kopiera den symboliska länken %x till %y. - Creating a Volume Shadow Copy for %x... Skapar en 'Volume Shadow Copy' för %x... Cannot find folder %x. Kan inte hitta mappen %x. -Target folder %x already existing. -Målmappen %x finns redan. +Target folder %x is already existing, but was not available during folder comparison. +Målmappen %x finns redan, men var inte tillgänglig vid mappjämförelsen. Target folder input field must not be empty. Indatafältet för målmapp får inte vara tomt. @@ -529,17 +648,14 @@ Not enough free disk space available in: Ej tillräckligt ledigt diskutrymme på: -Required: -Utrymmeskrav: - Available: Tillgängligt: Some files will be synchronized as part of multiple base folders. Vissa filer kommer att synkroniseras som en del av flera basmappar. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -För att undvika konflikter kan du använda ett undantagsfilter, så att varje uppdaterad fil behandlas i endast en basmapp. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Konfigurera undantagsfilter så att varje uppdaterad fil inkluderas av endast en basmapp, för att undvika konflikter. Versioning folder: Versionshanteringsmapp: @@ -565,122 +681,6 @@ Unable to create time stamp for versioning: Kunde inte skapa tidsstämpel för versionshantering: - -Unexpected size of data stream. -Expected: %x bytes -Actual: %y bytes - - -Oväntad storlek på dataström. -Förväntad: %x byte -Aktuell: %y byte - - -Cannot write permissions of %x. -Kan inte skriva behörigheter för %x. - -Operation not supported between different devices. -Åtgärden stöds inte mellan olika enheter. - -Cannot delete file %x. -Filen %x kan inte tas bort. - -Cannot delete symbolic link %x. -Kan inte ta bort den symboliska länken %x. - -Cannot delete directory %x. -Kan inte ta bort mappen %x. - -Error Code %x -Felkod %x - -Cannot write modification time of %x. -Kan inte ändra tidsangivelsen för %x. - -Cannot create directory %x. -Kan inte skapa mappen %x. - -Cannot determine final path for %x. -Kan inte utläsa slutlig sökväg för %x. - -Operation not supported by device. -Åtgärden stöds inte av enheten. - -Cannot resolve symbolic link %x. -Den symboliska länken %x kan inte matchas. - -Unable to move %x to the recycle bin. -Kan inte att flytta %x till papperskorgen. - -Authentication completed. -Autentisering slutförd. - -You may close this page now and continue with FreeFileSync. -Du kan nu stänga denna sida och fortsätta med FreeFileSync. - -Authentication failed. -Autentisering misslyckades. - -Cannot find %x. -Kan inte hitta %x. - -Please authorize access to user account %x. -Autentisera åtkomst till användarkonto %x. - -Cannot determine free disk space for %x. -Kan inte avgöra ledigt utrymme på %x. - -Unable to disconnect from %x. -Kan inte koppla ifrån %x. - -Unable to access %x. -Kan inte komma åt %x. - -Failed to get information about server %x. -Kunde inte hämta information om server %x. - -Cannot monitor directory %x. -Mappen %x kan inte övervakas. - -Cannot find device %x. -Kan inte hitta enheten %x. - -Cannot open directory %x. -Kan inte öppna %x. - -Unsupported item type. -Objekttypen stöds inte. - -Incorrect command line: -Felaktig kommandorad: - -The server does not support authentication via %x. -Servern stödjer inte autentisering via %x. - - -Operation timed out after 1 second. -Operation timed out after %x seconds. - - -Åtgärdens tidsgräns överskreds efter 1 sekund. -Åtgärdens tidsgräns överskreds efter %x sekunder. - - - -Cannot wait on more than 1 connection at a time. -Cannot wait on more than %x connections at a time. - - -Kan inte vänta på fler än 1 anslutning åt gången. -Kan inte vänta på fler än %x anslutningar åt gången. - - -Active connections: %x -Aktiva anslutningar: %x - -Failed to open SFTP channel number %x. -Kunde inte öppna SFTP-kanal nummer %x. - Drag && drop Dra && släpp @@ -747,6 +747,9 @@ Aktuell: %y byte Command line: Kommandorad: +&Hide console window +&Dölj konsollfönster + The command is triggered if: - files or subfolders change @@ -782,8 +785,8 @@ Kommandot triggas om: Waiting until directory is available: Väntar på att mappen skall bli tillgänglig: -&Restore -&Återställ +&Configure +&Konfigurera &Show error message &Visa felmeddelande @@ -818,8 +821,8 @@ Kommandot triggas om: Scanning... Skannar... -job name -åtgärdsnamn +configuration file +konfigurationsfil System: Sleep System: Viloläge @@ -830,8 +833,8 @@ Kommandot triggas om: Nothing to synchronize Det finns inget att synkronisera -Executing command %x -Kör kommandot %x +Executing command: +Kör kommando: You can switch to FreeFileSync's main window to resolve this issue. Du kan växla till FreeFileSyncs programfönster för att lösa problemet. @@ -1031,6 +1034,12 @@ Kommandot triggas om: Match case Matcha gemener/VERSALER +Processed: +Bearbetat: + +Remaining: +Återstår: + New Nytt @@ -1267,14 +1276,17 @@ Kommandot triggas om: &Don't show this dialog again &Visa inte den här dialogen igen -Items found: -Funna poster: +Bytes: +Byte: -Time remaining: -Återstående tid: +Items: +Objekt: -Time elapsed: -Förfluten tid: +Synchronizing... +Synkroniserar... + +Minimize to notification area +Minimera till meddelandefältet Bytes Byte @@ -1282,12 +1294,6 @@ Kommandot triggas om: Items Objekt -Synchronizing... -Synkroniserar... - -Minimize to notification area -Minimera till meddelandefältet - When finished: Vid slutfört: @@ -1363,6 +1369,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. &Delete logs after x days: &Ta bort loggar efter x dagar: +Notification sounds: +Aviseringsljud: + +Synchronization finished: +Synkronisering slutförd: + Customize context menu: Anpassad kontextmeny: @@ -1567,12 +1579,6 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. &Delete &Ta bort -Include all -Inkludera alla - -Exclude all -Undanta alla - Show icons: Visa ikoner: @@ -1609,6 +1615,21 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Do&n't save Spara &inte +%x cannot be renamed. +%x kan inte namnändras. + +New name: +Nytt namn: + +Rename Configuration +Byt namn på konfigurationen + +Configuration name must not be empty. +Konfigurationsnamnet kan inte lämnas tomt. + +&Rename... +&Byt namn... + Hide configuration Dölj konfigurationen @@ -1720,8 +1741,8 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Password: Lösenord: -Key password: -Nyckellösenord: +Key passphrase: +Nyckellösenfras: Please enter a file path. Ange en filsökväg. @@ -1885,6 +1906,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Minimum version count must be smaller than maximum count. Minsta antal versioner måste vara mindre än maximalt antal. +&Restore +&Återställ + Files Filer @@ -1951,6 +1975,9 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. The file is locked by another process: Filen är låst av en annan process: +Failed to determine file permission support for folder %x. +Kunde inte avgöra filbehörighetsstöd för mappen %x. + Cannot read security context of %x. Kan inte läsa säkerhetskontext för %x. @@ -2002,12 +2029,12 @@ Detta garanterar ett konsekvent tillstånd även vid allvarliga fel. Cannot change process I/O priorities. Kan inte ändra I/O-prioritet. -Unable to shut down the system. -Kan inte stänga av systemet. - Checking recycle bin failed for folder %x. Kontroll av papperskorgen misslyckades för %x. +Unable to shut down the system. +Kan inte stänga av systemet. + Prepare installation Förbered installation diff --git a/FreeFileSync/Build/Resources/Languages/turkish.lng b/FreeFileSync/Build/Resources/Languages/turkish.lng new file mode 100755 index 00000000..9c0171e3 --- /dev/null +++ b/FreeFileSync/Build/Resources/Languages/turkish.lng @@ -0,0 +1,2118 @@ +
+ Türkçe + Kaya Zeren + tr_TR + flag_turkey.png + 2 + n == 1 ? 0 : 1 +
+ +Cannot read file %x. +%x dosyası okunamadı. + + +Unexpected size of data stream. +Expected: %x bytes +Actual: %y bytes + + +Veri akışının boyutu beklenenden farklı. +Beklenen: %x bayt +Gerçekleşen: %y bayt + + +Cannot write file %x. +%x dosyası yazılamadı. + +Cannot write permissions of %x. +%x izinleri yazılamadı. + +Operation not supported between different devices. +Bu işlem farklı aygıtlar arasında yapılamaz. + +Cannot delete file %x. +%x dosyası silinemedi. + +Cannot delete symbolic link %x. +%x sembolik bağlantısı silinemedi. + +Cannot delete directory %x. +%x klasörü silinemedi. + +Cannot move file %x to %y. +%x dosyası %y üzerine taşınamadı. + +Cannot copy symbolic link %x to %y. +%x sembolik bağlantısı %y üzerine kopyalanamadı. + +Error Code %x +Hata Kodu %x + +Cannot read directory %x. +%x klasörü okunamadı. + +Cannot write modification time of %x. +%x dosyasının değişiklik tarihi yazılamadı. + +Cannot read file attributes of %x. +%x dosyasının öznitelikleri okunamadı. + +Cannot create directory %x. +%x klasörü oluşturulamadı. + +Cannot determine final path for %x. +%x dosyasının son yolu belirlenemedi. + +Operation not supported by device. +Bu işlem bu aygıt üzerinde yapılamaz. + +Cannot resolve symbolic link %x. +%x sembolik bağlantısı çözümlenemedi. + +Unable to move %x to the recycle bin. +%x geri dönüşüm kutusuna atılamadı. + +Authentication completed. +Kimlik doğrulandı. + +You may close this page now and continue with FreeFileSync. +Bu pencereyi kapatıp FreeFileSync kullanmaya devam edebilirsiniz. + +Authentication failed. +Kimlik doğrulanamadı. + +Unable to connect to %x. +%x üzerine bağlanılamadı. + +Cannot find %x. +%x bulunamadı. + +The name %x is used by more than one item in the folder. +%x adı klasördeki birden fazla öge için kullanılmış. + +Please authorize access to user account %x. +Lütfen %x kullanıcı hesabına erişim izni verin. + +Cannot open file %x. +%x dosyası açılamadı. + +The name %x is already used by another item. +%x adı başka bir öge tarafından kullanılıyor. + +Cannot determine free disk space for %x. +%x için boş disk alanı belirlenemedi. + +Unable to disconnect from %x. +%x bağlantısı kesilemedi. + +Unable to access %x. +%x bağlantısı kurulamadı. + +Failed to get information about server %x. +%x sunucusu hakkında bilgi alınamadı. + +Cannot monitor directory %x. +%x klasörü izlenemiyor. + +Cannot find device %x. +%x aygıtı bulunamadı. + +Cannot open directory %x. +%x klasörü açılamadı. + +Unsupported item type. +Dosya türü desteklenmiyor. + +Incorrect command line: +Satırdaki komut geçersiz: + +The server does not support authentication via %x. +Sunucu %x üzerinden kimlik doğrulamasını desteklemiyor. + +Required: +Zorunlu: + + +Operation timed out after 1 second. +Operation timed out after %x seconds. + + +İşlem 1 saniye sonunda zaman aşımına uğradı. +İşlem %x saniye sonunda zaman aşımına uğradı. + + + +Cannot wait on more than 1 connection at a time. +Cannot wait on more than %x connections at a time. + + +Aynı anda 1 taneden fazla bağlantı beklenemez. +Aynı anda %x taneden fazla bağlantı beklenemez. + + +Active connections: %x +Etkin bağlantı sayısı: %x + +Failed to open SFTP channel number %x. +%x SFTP kanal numarası açılamadı. + +Both sides have changed since last synchronization. +Son eşitlemeden bu yana iki tarafında içeriği değişmiş. + +Cannot determine sync-direction: +Eşitleme yönü belirlenemedi: + +No change since last synchronization. +Son eşitlemeden bu yana bir değişiklik olmamış. + +The database entry is not in sync considering current settings. +Geçerli kayıtlar ile veritabanı kaydı aynı değil. + +Setting default synchronization directions: Old files will be overwritten with newer files. +Varsayılan eşitleme yönleri ayarlanıyor: Yeni dosyalar eski dosyaların üzerine yazılacak. + +Creating file %x +%x dosyası oluşturuluyor + +Creating folder %x +%x klasörü oluşturuluyor + +Creating symbolic link %x +%x sembolik bağlantısı oluşturuluyor + +Moving file %x to the recycle bin +%x dosyası Geri Dönüşüm Kutusuna atılıyor + +Moving folder %x to the recycle bin +%x klasörü Geri Dönüşüm Kutusuna atılıyor + +Moving symbolic link %x to the recycle bin +%x simgesel bağlantısı Geri Dönüşüm Kutusuna atılıyor + +Deleting file %x +%x dosyası siliniyor + +Deleting folder %x +%x klasörü siliniyor + +Deleting symbolic link %x +%x sembolik bağlantısı siliniyor + +Checking recycle bin availability for folder %x... +%x klasörü için Geri Dönüşüm Kutusu kullanılabilir mi diye bakılıyor... + +The recycle bin is not supported by the following folders. Deleted or overwritten files will not be able to be restored: +Geri Dönüşüm Kutusu şu klasörler tarafından desteklenmiyor. Silinmiş ya da üzerine yazılmış klasörler geri yüklenemez: + +An exception occurred +Olağan dışı bir durumla karşılaşıldı + +A left and a right directory path are expected after %x. +%x ardından sol ve sağ klasör belirtilmelidir. + +Syntax error +Yazım hatası + +Cannot find file %x. +%x dosyası bulunamadı. + +Error +Sorun + +File %x does not contain a valid configuration. +%x dosyası geçerli yapılandırma bilgilerini içermiyor. + +The config file must not contain settings at directory pair level when directories are set via command line. +Klasörler komut satırından seçildiği zaman, yapılandırma dosyasında klasör çifti düzeyinde ayarlar bulunmamalıdır. + +Directories cannot be set for more than one configuration file. +Klasörler birden fazla yapılandırma dosyasında kullanılamaz. + +Command line +Komut Satırı + +Syntax: +Yazım: + +config files: +yapılandırma dosyaları: + +directory +klasör + +global config file: +genel yapılandırma dosyası: + +Any number of FreeFileSync "ffs_gui" and/or "ffs_batch" configuration files. +FreeFileSync "ffs_gui" ya da "ffs_batch" yapılandırma dosyalarının sayısı. + +Any number of alternative directory pairs for at most one config file. +En fazla bir yapılandırma dosyası için herhangi bir sayıda alternatif klasör çifti. + +Open the selected configuration for editing only, without executing it. +Seçilmiş yapılandırmayı yürütmeden yalnız düzenlemek için açar. + +Path to an alternate GlobalSettings.xml file. +Alternatif GlobalSettings.xml dosyasının yolu. + +Installation files are corrupted. Please reinstall FreeFileSync. +Kurulum dosyaları bozulmuş. Lütfen FreeFileSync uygulamasını yeniden kurun. + +Cannot find the following folders: +Aşağıdaki klasörler bulunamadı: + +The following folders do not yet exist: +Şu klasörler bulunamadı: + +The folders are created automatically when needed. +Klasörler gerektiğinde otomatik olarak oluşturulur. + +The following folder paths differ in case. Please use a single form in order to avoid duplicate accesses. +Şu klasör yolu büyük küçük harf olarak farklı. Lütfen çift erişimleri engellemek için tek bir biçim kullanın. + +Scanning: +Taranıyor: + +Comparison finished: +Karşılaştırma tamamlandı: + + +1 item found +%x items found + + +1 öge bulundu +%x öge bulundu + + +Time elapsed: +Geçen süre: + +File %x has an invalid date. +%x dosyasının tarihi geçersiz. + +Date: +Tarih: + +Files have the same date but a different size. +Dosyaların tarihleri aynı ancak boyutları farklı. + +Size: +Boyut: + +Content comparison was skipped for excluded files. +Katılmayan dosyalar için içerik karşılaştırması atlandı. + +Items differ in attributes only +Yalnız öznitelikleri farklı olan ögeler + +Resolving symbolic link %x +%x sembolik bağlantısı çözümleniyor + +Comparing content of files %x +%x dosyalarının içeriği karşılaştırılıyor + +Generating file list... +Dosya listesi oluşturuluyor... + +Fail-safe file copy +Dosyalar sorunsuz kopyalansın + +Enabled +Etkin + +Disabled +Devre Dışı + +Copy locked files +Kilitli dosyalar da kopyalansın + +Copy file access permissions +Dosya Erişim İzinleri de Kopyalansın + +File time tolerance +Yok sayılacak dosya zamanı farkı + +Run with background priority +Artalan önceliği ile çalışsın + +Lock directories during sync +Klasörler eşitleme sırasında kilitlensin + +Verify copied files +Kopyalanmış dosyalar doğrulansın + +Using non-default global settings: +Varsayılan olmayan genel ayarlar kullanılıyor: + +A folder input field is empty. +Bir klasör giriş alanı boş. + +The corresponding folder will be considered as empty. +Karşıdaki klasör boş olarak kabul edilecek. + +Exclude: +Katılmayacak Ögeler: + +One base folder of a folder pair is contained in the other one. +Klasör çiftindeki temel bir klasör diğerinin içinde bulunuyor. + +The folder should be excluded from synchronization via filter. +Süzgeç kullanılarak klasör eşitlemeye katılmamalı. + +Calculating sync directions... +Eşitleme yönleri hesaplanıyor... + +Out of memory. +Bellek yetersiz. + +Show in Explorer +Tarayıcıda Görüntüle + +Open with default application +Varsayılan Uygulama ile Aç + +Browse directory +Klasöre Gözat + +Database file %x is incompatible. +%x veritabanı dosyası uyumsuz. + +Initial synchronization: +Başlangıç eşitlemesi: + +Database file %x does not yet exist. +%x veritabanı dosyası henüz yok. + +Database file is corrupted: +Veritabanı dosyası bozulmuş: + +The database files do not yet contain information about the last synchronization. +Veritabanı dosyalarında henüz son eşitleme bilgileri yok. + +Loading file %x... +%x dosyaları yükleniyor... + +Saving file %x... +%x dosyası kaydediliyor... + +Searching for folder %x... +%x klasörü aranıyor... + +Timeout while searching for folder %x. +%x klasöründeki arama işlemi zaman aşımına uğradı. + +Cannot get process information. +İşlem bilgisi alınamadı. + +Waiting while directory is locked: +Klasör kilitli olduğundan bekleniyor: + +Lock owner: +Kilitleyen: + +Detecting abandoned lock... +Kaldırılmış kilit algılanıyor... + + +1 sec +%x sec + + +1 saniye +%x saniye + + +Item exists on left side only +Yalnız solda bulunan ögeler + +Item exists on right side only +Yalnız sağda bulunan ögeler + +Left side is newer +Soldaki daha yeni ögeler + +Right side is newer +Sağdaki daha yeni ögeler + +Items have different content +İçeriği farklı ögeler + +Both sides are equal +İki taraf eşit + +Conflict/item cannot be categorized +Uyuşmayan/sınıflanamayan ögeler + +Copy new item to left +Yeni öge sola kopyalansın + +Copy new item to right +Yeni öge sağa kopyalansın + +Delete left item +Soldaki öge silinsin + +Delete right item +Sağdaki öge silinsin + +Move file on left +Soldaki dosya taşınsın + +Move file on right +Sağdaki dosya taşınsın + +Update left item +Soldaki öge güncellensin + +Update right item +Sağdaki öge güncellensin + +Do nothing +Hiçbir işlem yapılmasın + +Update attributes on left +Soldaki öznitelikler güncellensin + +Update attributes on right +Sağdaki öznitelikler güncellensin + +Error parsing file %x, row %y, column %z. +%x dosyası işlenirken sorun çıktı, satır %y, sütun %z. + +Services +Hizmetler + +Show All +Tümünü Görüntüle + +Hide Others +Diğerlerini Gizle + +Hide %x +%x Ögesini Gizle + +Quit %x +%x Uygulamasından Çık + +Cannot set directory locks for the following folders: +Şu klasörler kilitlenemedi: + +Errors: +Hatalar: + +Warnings: +Uyarılar: + +Items processed: +İşlenen öge: + +Items remaining: +Kalan öge: + +Total time: +Toplam süre: + +Warning +Uyarı + +Stopped +Durduruldu + +Cleaning up log files: +Günlük dosyaları temizleniyor: + + +1 thread +%x threads + + +1 iş parçacığı +%x iş parçacığı + + +%x/sec +%x/saniye + +%x items +%x öge + +Completed successfully +Tamamlandı + +Completed with warnings +Uyarılar ile tamamlandı + +Completed with errors +Sorunlar ile tamamlandı + +Cannot access the Volume Shadow Copy Service. +Birim Gölge Hizmetine erişilemiyor. + +Please run the 64-bit version of FreeFileSync to create shadow copies on this system. +Lütfen bu sistemde gölge kopyalar oluşturmak için FreeFileSync uygulamasının 64 bit sürümünü kullanın. + +Volume name %x is not part of file path %y. +%x birim adı %y dosya yolunun bir parçası değil. + +File time and size +Tarih ve Saate Göre + +File content +İçeriğe Göre + +File size +Boyuta Göre + +Two way +Çift Yönlü + +Mirror +Yansıtma + +Update +Güncelleme + +Custom +Özel + +Multiple... +Çoklu... + +Cannot write file attributes of %x. +%x dosya öznitelikleri yazılamadı. + +%x and %y have different content. +%x ve %y farklı içeriklere sahip. + +Data verification error: +Veri doğrulama sorunu: + +Moving file %x to %y +%x dosyası %y içine taşınıyor + +Moving folder %x to %y +%x klasörü %y içine taşınıyor + +Moving symbolic link %x to %y +%x sembolik bağlantısı %y içine taşınıyor + +Updating file %x +%x dosyası güncelleniyor + +Updating symbolic link %x +%x sembolik bağlantısı güncelleniyor + +Verifying file %x +%x dosyası doğrulanıyor + +Updating attributes of %x +%x öznitelikleri güncelleniyor + +Source item %x not found +%x kaynak ögesi bulunamadı + +Parent folder %x is not existing. +%x üst klasörü bulunamadı. + +Cannot copy file %x to %y. +%x dosyası %y üzerine kopyalanamadı. + +Creating a Volume Shadow Copy for %x... +%x için Birim Gölge Hizmeti oluşturuluyor... + +Cannot find folder %x. +%x klasörü bulunamadı. + +Target folder %x is already existing, but was not available during folder comparison. +%x hedef klasörü zaten var ancak klasör karşılaştırması sırasında erişilemedi. + +Target folder input field must not be empty. +Hedef klasör giriş alanı boş olmamalı. + +Source folder %x not found. +%x kaynak klasörü bulunamadı. + +Please enter a target folder for versioning. +Sürüm izlemesinde kullanılacak bir hedef klasör yazın. + +The following items have unresolved conflicts and will not be synchronized: +Uyuşmazlığı çözümlenmemiş şu ögeler eşitlenmeyecek: + +Folder pair: +Klasör çifti: + +The following folders are significantly different. Please check that the correct folders are selected for synchronization. +Şu klasörler birbirinden çok farklı. Lütfen eşitleme için doğru klasörleri seçtiğinizden emin olun. + +Not enough free disk space available in: +Şurada yeterli boş disk alanı yok: + +Available: +Kullanılabilir: + +Some files will be synchronized as part of multiple base folders. +Bazı dosyalar çoklu temel klasörlerin bir parçası olarak eşitlenecek. + +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. +Katılmayacaklar süzgeçleri ile çakışmalar engellenebilir. Güncellenen dosyalar yalnız bir tek temel klasörden alınır. + +Versioning folder: +Sürüm klasörü: + +Base folder: +Temel klasör: + +The versioning folder is contained in a base folder. +Sürümlendirme klasörü bir temel klasör içinde bulunuyor. + +Synchronizing folder pair: +Eşitlenen klasör çifti: + +Generating database... +Veritabanı oluşturuluyor... + +Searching for old file versions: +Önceki dosya sürümleri aranıyor: + +Removing old file versions: +Önceki dosya sürümleri siliniyor: + +Unable to create time stamp for versioning: +Sürümlendirme için zaman damgası oluşturulamadı: + +Drag && drop +Dosyaları sürükleyip buraya bırakın + +Select a folder +Bir klasör seçin + +&New +&Yeni + +&Open... +&Aç... + +Save &as... +F&arklı Kaydet... + +E&xit +Çı&k + +&File +&Dosya + +&View help +&Yardım Konuları + +&About +H&akkında + +&Help +&Yardım + +Usage: +Kullanım: + +1. Select folders to watch. +1. İzlenecek klasörleri seçin. + +2. Enter a command line. +2. Bir satır komutu yazın. + +3. Press 'Start'. +3. 'Başlat' düğmesine tıklayın. + +To get started just import a "ffs_batch" file. +"ffs_batch" dosyasını yükleyerek başlayabilirsiniz. + +Folders to watch: +İzlenecek Klasörler: + +Add folder +Klasör Ekle + +Remove folder +Klasörü Sil + +Browse +Gözat + +Idle time (in seconds): +Boşta Bekleme Süresi (saniye): + +Idle time between last detected change and execution of command +Son algılanan değişiklik ile komutun yürütülmesi arasında beklenecek süre + +Command line: +Satır Komutu: + +&Hide console window +&Konsol penceresini gizle + + +The command is triggered if: +- files or subfolders change +- new folders arrive (e.g. USB stick insert) + + +Komut şu durumlarda yürütülür: +- dosya ya alt klasörler değiştiğinde +- yeni klasörler algılandığında (örneğin bir USB bellek takıldığında) + + +Start +Başlat + +About +Hakkında + +Build: %x +Yapım: %x + +All files +Tüm Dosyalar + +Automated Synchronization +Otomatik Eşitleme + +The %x protocol does not support directory monitoring: +%x iletişim kuralı klasör izlemesini desteklemiyor: + +Directory monitoring active +Klasör izlemesi yapılıyor + +Waiting until directory is available: +Klasörün kullanılabilir olması bekleniyor: + +&Configure +&Yapılandır + +&Show error message +&Hata iletisini görüntüle + +&Quit +Çı&k + +&Retry +&Yeniden Dene + + +1 byte +%x bytes + + +1 bayt +%x bayt + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + +Loading... +Yükleniyor... + +Scanning... +Taranıyor... + +configuration file +yapılandırma dosyası + +System: Sleep +Sistem: Uyku + +System: Shut down +Sistem: Kapat + +Nothing to synchronize +Eşitlenecek bir şey yok + +Executing command: +Komut yürütülüyor: + +You can switch to FreeFileSync's main window to resolve this issue. +Bu sorunu çözmek için FreeFileSync ana penceresine geçebilirsiniz. + +&Don't show this warning again +Bu &uyarı bir daha görüntülenmesin + +&Ignore +&Yok Say + +&Switch +&Değiştir + +Switching to FreeFileSync's main window +FreeFileSync ana penceresine geçiliyor + +Automatic retry +Otomatik yeniden denensin + +Ignore &all +Tümünü Yok S&ay + +Retrying operation... +İşlem yeniden deneniyor... + +Serious Error +Ciddi Sorun + +Last session +Önceki oturum + +Today +Bugün + + +1 day +%x days + + +1 gün +%x gün + + +Name +Ad + +Last sync +Son eşitleme + +Log +Günlük + +Folder +Klasör + +Symlink +Smblkbağlantı + +Full path +Tam Yol + +Relative path +Bağıl yol + +Item name +Öge adı + +Size +Boyut + +Date +Tarih + +Extension +Uzantı + +Category +Öge Türü + +Action +İşlem + +Local comparison settings +Yerel karşılaştırma ayarları + +Local synchronization settings +Yerel eşitleme ayarları + +Local filter +Yerel Süzgeç + +Active +Etkin + +None +Yok + +Remove local settings +Yerel Ayarları Sil + +Clear local filter +Yerel Süzgeci Temizle + +Copy +Kopyala + +Paste +Yapıştır + +The selected folder %x cannot be used with FreeFileSync. +Seçilmiş %x klasörü FreeFileSync ile birlikte kullanılamaz. + +Please select a folder on a local file system, network or an MTP device. +Lütfen yerel dosya sistemi, ağ ya da MTP aygıtı üzerinde bulunan bir klasör seçin. + +Defined by context of use +Kullanım bağlamına göre tanımlı + +Requires FreeFileSync Donation Edition +Bu özellik FreeFileSync Bağış Sürümünde bulunur + +&Save +&Kaydet + +Save as &batch job... +&Toplu İş Olarak Kaydet... + +Show &log +Gün&lüğü Görüntüle + +Start &comparison +&Karşılaştırmayı Başlat + +C&omparison settings +K&arşılaştırma Ayarları + +&Filter settings +&Süzme Ayarları + +S&ynchronization settings +Eşi&tleme Ayarları + +Start &synchronization +&Eşitlemeyi Başlat + +&Actions +İş&lemler + +&Preferences +&Ayarlar + +&Language +&Dil + +&Find... +A&rama... + +&Export file list... +&Dosya Listesini Ver... + +&Reset layout +Görünümü &Sıfırla + +&Tools +&Araçlar + +&Check for updates now +&Güncellemeleri Denetle + +Check &automatically once a week +&Haftada Bir Denetlensin + +Cancel +İptal + +Compare +Karşılaştır + +Synchronize +Eşitle + +Add folder pair +Klasör Çifti Ekle + +Remove folder pair +Klasör Çiftini Sil + +Access online storage +Çevrimiçi Depolama Erişimi + +Close search bar +Arama Çubuğunu Kapat + +Find: +Aranacak ifade: + +Match case +Büyük küçük harf uyumu göz önüne alınsın + +Processed: +İşlenen: + +Remaining: +Kalan: + +New +Yeni + +Open... +Aç... + +Save +Kaydet + +Save as... +Farklı Kaydet... + +View type: +Görünüm Kipi: + +Select view: +Eşit Dosya Görünümü: + +Save as default +Varsayılan Olarak Kaydet + +Statistics: +İstatistikler: + +Number of files and folders that will be deleted +Silinecek dosya ve klasör sayısı + +Number of files that will be updated +Güncellenecek dosya sayısı + +Number of files and folders that will be created +Eklenecek dosya ve klasör sayısı + +Total bytes to copy +Toplam kopyalanacak bayt + +Arrange folder pair +Klasör çiftini belirleyin + +Main settings: +Temel ayarlar: + +Use local settings: +Yerel Ayarlar Kullanılsın: + +Select a variant: +İşlem Türünü Seçin: + +Include &symbolic links: +&Sembolik bağlantılar katılsın: + +&Follow +İ&zlensin + +&Direct +&Yönlendirilsin + +More information +Ayrıntılı bilgiler + +&Ignore time shift [hh:mm] +&Yok sayılacak zaman farkı [ss:dd] + +List of file time offsets to ignore +Zaman farkı yok sayılacak dosyaların listesi + +Example: +Örnek: + +Handle daylight saving time +Yaz saati hakkında bilgiler + +Ignore errors +Sorunlar yok sayılsın + +Retry count: +Deneme Sayısı: + +Delay (in seconds): +Bekleme (saniye): + +Performance improvements: +Başarım İyileştirmeleri: + +Parallel file operations: +Eş Zamanlı İşlenecek Dosya Sayısı: + +How to get best performance? +En iyi başarım nasıl sağlanır? + +Local settings: +Yerel ayarlar: + +Include: +Katılacak Ögeler: + +Show examples +Örneklere Bakın + +Select filter rules to exclude certain files from synchronization. Enter file paths relative to their corresponding folder pair. +Eşitlenmeyecek dosyaların süzülme kurallarını belirleyin. Dosya yollarını bulundukları klasör çiftine göre yazın. + +File size: +Dosya Boyutu: + +Minimum: +En Küçük: + +Maximum: +En Büyük: + +Time span: +Zaman Aralığı: + +C&lear +&Temizle + +Detect moved files +Taşınmış dosyalar algılansın + + +- Not supported by all file systems +- Requires and creates database files +- Detection not available for first sync + + +- Tüm dosya sistemleri tarafından desteklenmez +- Veritabanı dosyalarının kullanılması gerekir +- Algılama, ilk eşitleme sırasında kullanılamaz + + +Delete files: +Dosya Silme İşlemi: + +&Recycle bin +Ge&ri Dönüşüm Kutusuna Atılsın + +&Permanent +&Kalıcı Olarak Silinsin + +&Versioning +Eski &Sürüm Olarak Saklansın + +Move files to a user-defined folder +Dosyalar kullanıcının belirteceği şu klasöre taşınsın + +Naming convention: +Adlandırma Kuralı: + +Limit file versions: +Dosya Sürümü Sayısı Sınırlaması: + +Last x days: +Son x Gün: + +&Override default log path: +Varsayılan yerine kullanılacak günlük y&olu: + +Run a command: +Bir komut yürüt: + +OK +Tamam + +Connection type: +Bağlantı Türü: + +Connected user accounts: +Bağlantılı kullanıcı hesapları: + +&Add connection +&Bağlantı ekle + +&Disconnect +Bağlantıyı &Kes + +Selected user account: +Seçilmiş kullanıcı hesabı: + +Server name or IP address: +Sunucu Adı / IP Adresi: + +Port: +Kapı: + +Encryption: +Şifreleme: + +&Disabled +&Devre Dışı + +&Explicit SSL/TLS +&Açık SSL/TLS + +Authentication: +Kimlik Doğrulaması: + +&Password +&Parola + +&Key file +Anahtar &Dosyası + +&SSH agent +&SSH İstemcisi + +User name: +Kullanıcı Adı: + +Private key file: +Özel Anahtar Dosyası: + +&Show password +Parola &Görüntülensin + +Directory on server: +Sunucudaki Klasör: + +Access timeout (in seconds): +Erişim zaman aşımı (saniye): + +SFTP channels per connection: +Bir Bağlantı için SFTP Kanalı Sayısı: + +Detect server limit +Sunucu Sınırını Bul + +Select Folder +Klasör Seçin + +Variant: +İşlem Türü: + +&Don't show this dialog again +Bu pencere bir daha &görüntülenmesin + +Bytes: +Bayt: + +Items: +Ögeler: + +Synchronizing... +Eşitleniyor... + +Minimize to notification area +Bildirim alanına küçült + +Bytes +Bayt + +Items +Öge + +When finished: +Tamamlandığında: + +Auto-close +Otomatik kapat + +Close +Kapat + +&Pause +&Duraklat + +Stop +Durdur + +Create a batch file for unattended synchronization. To start, double-click this file or schedule in a task planner: %x +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 + +Progress dialog: +İlerleme penceresi: + +Run minimized +Küçültülmüş Çalıştırılsın + +Show pop-up on errors or warnings +Sorun ya da uyarılar açılır pencerede görüntülenir + +&Cancel +İ&ptal edilsin + +Stop synchronization at first error +Çıkan ilk sorunda eşitleme durdurulsun + +How can I schedule a batch job? +Toplu İşlem Zamanlaması Hakkında Bilgiler + +&Keep relative paths +Bağıl yollar &korunsun + +&Overwrite existing files +&Varolan dosyaların üzerine yazılsın + +The following settings are used for all synchronization jobs. +Aşağıdaki ayarlar tüm eşitleme işlemleri için geçerlidir. + + +Copy to a temporary file (*.ffs_tmp) before overwriting target. +This guarantees a consistent state even in case of a serious error. + + +Dosyalar önce geçici dosyaya kopyalanıp (*.ffs_tmp) sonra yeniden adlandırılır. +Bu yöntem, ciddi bir sorun çıkması durumunda bile işlemin tutarlı olarak yapılmasını sağlar. + + +recommended +önerilen + +Copy shared or locked files using the Volume Shadow Copy Service. +Paylaşılan ya da kilitlenmiş dosyalar Birim Gölge Hizmetini kullanılarak kopyalanır. + +requires administrator rights +yönetici izinleri gerekir + +Transfer file and folder permissions. +Dosya ve klasör izinleri de aktarılır. + +Show all permanently hidden dialogs and warning messages again +Kalıcı olarak gizlenmiş tüm ileti ve uyarılar yeniden görüntülenir + +Default log path: +Varsayılan günlük dosyası yolu: + +&Delete logs after x days: +&Günlük kayıtlarının silineceği gün sayısı: + +Notification sounds: +Bildirim sesleri: + +Synchronization finished: +Eşitleme tamamlandı: + +Customize context menu: +Sağ Tık Menüsü Uyarlamaları: + +Description +Açıklama + +&Default +&Varsayılan + +Feedback and suggestions are welcome: +Geri bildirim ve önerilerinizi bekliyoruz: + +Home page +Ana Sayfa + +FreeFileSync Forum +FreeFileSync Forumu + +Email +E-posta + +If you like FreeFileSync: +FreeFileSync hoşunuza gittiyse: + +Support with a donation +Bağış yaparak destek olun + +The auto updater was disabled by the administrator. +Otomatik güncelleme yönetici tarafından devre dışı bırakılmış. + +Donation details +Bağış Bilgileri + +Source code written in C++ using: +Kaynak kodu C++ kullanılarak yazılmıştır: + +Published under the GNU General Public License: +GNU Genel Kamu Lisansı koşulları altında yayınlanmıştır: + +Many thanks for localization: +Çeviriler için çok teşekkürler: + +Activate the FreeFileSync Donation Edition by one of the following methods: +FreeFileSync Bağış Sürümü şu yöntemlerden biri ile etkinleştirilebilir: + +1. Activate via internet now: +1. İnternet üzerinden etkinleştirme: + +Activate online +Çevrimiçi Etkinleştir + +2. Retrieve an offline activation key from the following URL: +Şu adresten bir çevrimdışı etkinleştirme anahtarı alarak: + +&Copy to clipboard +&Panoya Kopyala + +Enter activation key: +Etkinleştirme Anahtarını Yazın: + +Activate offline +Çevrimdışı Etkinleştir + +Highlight configurations that have not been run for more than the following number of days: +Şu kadar gündür çalıştırılmayan yapılandırmalar vurgulansın: + +Synchronization Settings +Eşitleme Ayarları + +Access Online Storage +Çevrimiçi Depolama Erişimi + +Save as a Batch Job +Toplu İş Olarak Kaydet + +Delete Items +Ögeleri Sil + +Copy Items +Ögeleri Kopyala + +Options +Ayarlar + +Select Time Span +Zaman Aralığı + +Highlight Configurations +Yapılandırmalar Vurgulansın + +Info +Bilgi + +No log entries +Herhangi bir günlük kaydı yok + +Select all +Tümünü Seç + +&Options +&Ayarlar + +Main Bar +Ana Çubuk + +Folder Pairs +Klasör Çiftleri + +Find +Arama + +View Settings +Görünüm Ayarları + +Configuration +İşlemler + +Overview +Genel + +Swap sides +Sağ ve Sol Tarafları Değiştir + +Show "%x" +"%x" paneli görüntülensin + +&Show details +&Ayrıntılara Bakın + +FreeFileSync %x is available! +FreeFileSync %x sürümü yayınlanmış! + +Local path not available for %x. +%x için yerel yol bulunamadı. + +Confirm +Onaylayın + + +Do you really want to execute the command %y for one item? +Do you really want to execute the command %y for %x items? + + +Bir öge için %y komutunu çalıştırmak istediğinize emin misiniz? +%x öge için %y komutunu çalıştırmak istediğinize emin misiniz? + + +&Execute +Çalış&tır + +Set direction: +Yönü Seç: + +multiple selection +çoklu seçim + +&Include via filter: +&Katılacak ögelere ekle: + +&Exclude via filter: +Katıl&mayacak ögelere ekle: + +Include temporarily +Geçici Olarak Kat + +Exclude temporarily +Geçici Olarak Katma + +&Synchronize selection +&Seçimi Eşitle + +&Copy to... +&Farklı Konuma Kopyala... + +&Delete +&Sil + +Show icons: +Simgeler Görüntülensin: + +Small +Küçük + +Medium +Orta + +Large +Büyük + +Select time span... +Zaman aralığını seçin... + +Donation Edition +Bağış Sürümü + +Folder Comparison and Synchronization +Klasör Karşılaştırma ve Eşitleme + +Configuration saved +Yapılandırma kaydedildi + +FreeFileSync batch +FreeFileSync toplu işi + +Do you want to save changes to %x? +Değişiklikleri %x dosyasına kaydetmek istiyor musunuz? + +Never save &changes +Değişiklikler asla &kaydedilmesin + +Do&n't save +Kaydedilmesi&n + +%x cannot be renamed. +%x yeniden adlandırılamadı. + +New name: +Yeni ad: + +Rename Configuration +Yapılandırmayı Yeniden Adlandır + +Configuration name must not be empty. +Yapılandırma adı boş olamaz. + +&Rename... +&Yeniden Adlandır... + +Hide configuration +Yapılandırma gizlensin + +Highlight... +Vurgula... + +Clear filter +Süzgeci Temizle + +Show files that exist on left side only +Yalnız sol tarafta bulunan dosyaları görüntüler ya da gizler + +Show files that exist on right side only +Yalnız sağ tarafta bulunan dosyaları görüntüler ya da gizler + +Show files that are newer on left +Solda daha yeni olan dosyaları görüntüler ya da gizler + +Show files that are newer on right +Sağda daha yeni olan dosyaları görüntüler ya da gizler + +Show files that are equal +Eşit dosyaları görüntüler ya da gizler + +Show files that are different +Farklı olan dosyaları görüntüler ya da gizler + +Show conflicts +Uyuşmazlıkları görüntüler ya da gizler + +Show files that will be created on the left side +Sol tarafa eklenecek dosyaları görüntüler ya da gizler + +Show files that will be created on the right side +Sağ tarafa eklenecek dosyaları görüntüler ya da gizler + +Show files that will be deleted on the left side +Sol tarafta silinecek dosyaları görüntüler ya da gizler + +Show files that will be deleted on the right side +Sağ tarafta silinecek dosyaları görüntüler ya da gizler + +Show files that will be updated on the left side +Sol tarafta güncellenecek dosyaları görüntüler ya da gizler + +Show files that will be updated on the right side +Sağ tarafta güncellenecek dosyaları görüntüler ya da gizler + +Show files that won't be copied +Kopyalanmayacak dosyaları görüntüler ya da gizler + +Show filtered or temporarily excluded files +Süzülmüş ya da geçici olarak katılmayan dosyaları görüntüler ya da gizler + +Filter +Süzme + +All files are in sync +Tüm dosyalar eşit + + +1 directory +%x directories + + +1 klasör +%x klasör + + + +1 file +%x files + + +1 dosya +%x dosya + + + +Showing %y of 1 row +Showing %y of %x rows + + +%y / 1 satır görüntüleniyor +%y / %x satır görüntüleniyor + + +Cannot find %x +%x bulunamadı + +Move up +Yukarı taşı + +Move down +Aşağı taşı + +Comma-separated values +Virgül ile ayrılmış değerler + +File list exported +Dosya listesi verildi + +Searching for program updates... +Yazılım güncellemesine bakılıyor... + +Paused +Duraklatıldı + +Stop requested... +Durdurulması istendi... + +Initializing... +Başlatılıyor... + +Comparing content... +İçerik karşılaştırılıyor... + +&Continue +&Devam + +Progress +İlerleme + +Thank you, %x, for your donation and support! +Sevgili %x, bağışın ve desteğin için teşekkürler! + +Connections +Bağlantılar + +Recommended range: +Önerilen Aralık: + +Do you really want to disconnect from user account %x? +%x kullanıcı hesabının bağlantısını kesmek istediğinize emin misiniz? + +Password: +Parola: + +Key passphrase: +Anahtar parolası: + +Please enter a file path. +Lütfen bir dosya yolu yazın. + + +Copy the following item to another folder? +Copy the following %x items to another folder? + + +Öge başka bir klasöre kopyalansın mı? +%x öge başka bir klasöre kopyalansın mı? + + +Please enter a target folder. +Lütfen bir hedef klasör yazın. + + +Do you really want to move the following item to the recycle bin? +Do you really want to move the following %x items to the recycle bin? + + +Aşağıdaki ögeyi Geri Dönüşüm Kutusuna atmak istediğinize emin misiniz? +Aşağıdaki %x ögeyi Geri Dönüşüm Kutusuna atmak istediğinize emin misiniz? + + +Move +Atılsın + + +Do you really want to delete the following item? +Do you really want to delete the following %x items? + + +Aşağıdaki ögeyi silmek istediğinize emin misiniz? +Aşağıdaki %x ögeyi silmek istediğinize emin misiniz? + + +Start to synchronize the selection? +Seçimin eşitlenmesi başlatılsın mı? + +Start synchronization now? +Eşitleme başlatılsın mı? + +Copy DACL, SACL, Owner, Group +DACL, SACL, Sahip, Grup kopyalansın + +Integrate external applications into context menu. The following macros are available: +Sağ tık menüsüne dış uygulamalar eklenebilir. Şu kodlar kullanılabilir: + +Full file or folder path +Tam dosya ya da klasör yolu + +Parent folder path +Üst klasör yolu + +Temporary local copy for SFTP and MTP storage +SFTP ve MTP depolama için geçici yerel kopya + +Parameters for opposite side +Diğer tarafın parametreleri + +Show hidden dialogs again +Gizlenmiş Pencereleri Yeniden Görüntüle + +All dialogs shown +Tüm İletiler Görüntüleniyor + +Downloading update... +Güncelleme indiriliyor... + +Identify equal files by comparing modification time and size. +Dosyaların eşit olup olmadığı, son değişiklik zamanı ve boyuta göre belirlenir. + +Identify equal files by comparing the file content. +Dosyaların eşit olup olmadığı, içeriklerine göre belirlenir. + +Identify equal files by comparing their file size. +Dosyaların eşit olup olmadığı boyutlarına göre belirlenir. + +Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. +İki taraftaki değişiklikler de belirlenir ve kopyalanır. Silinme, taşınma ve çakışmalar, veritabanı kullanılarak otomatik olarak belirlenir. + +Create a mirror backup of the left folder by adapting the right folder to match. +Sağ klasör, sola uyacak şekilde değiştirilerek, sol klasörün yansı yedeği oluşturulur. + +Copy new and updated files to the right folder. +Sol taraftaki yeni ya da güncellenmiş dosyalar sağ tarafa kopyalanır. + +Configure your own synchronization rules. +Eşitleme kuralları kullanıcının isteğine göre yapılandırılır. + +Comparison +Karşılaştırma + +Synchronization +Eşitleme + +This week +Bu hafta + +This month +Bu ay + +This year +Bu yıl + +Byte +Bayt + +KB +KB + +MB +MB + +Retain deleted and overwritten files in the recycle bin +Silinmiş ve üzerine yazılmış dosyalar geri dönüşüm kutusunda tutulsun + +Delete and overwrite files permanently +Dosyalar silinsin ve kalıcı olarak üzerine yazılsın + +Replace +Ad Değiştirme + +Move files and replace if existing +Dosyalar taşınır ve varsa üzerine yazılır + +Time stamp +Zaman Damgalama + +Move files into a time-stamped subfolder +Dosyalar zaman damgalı bir alt klasöre taşınır + +File +Dosya + +Append a time stamp to each file name +Dosya adlarına zaman damgası eklenir + +On completion: +Tamamlandığında: + +On errors: +Sorun Çıktığında: + +On success: +Başarılı Olduğunda: + +Main config +Temel Yapılandırma + +empty +boş + +Leave as unresolved conflict +Uyuşmazlık çözümlenmeden bırakılsın + +YYYY-MM-DD hhmmss +YYYY-AA-GG SSddss + +Minimum version count must be smaller than maximum count. +En az sürüm sayısı en çok sürüm sayısı değerinden küçük olmalıdır. + +&Restore +Gö&rüntülensin + +Files +Dosyalar + +Percentage +Yüzde + +Failed to retrieve update information. +Güncelleme bilgileri alınamadı. + +Automatic updates: +Otomatik güncellemeler: + +Check for Program Updates +Güncelleme Denetimi + +Auto-update now or download manually from the FreeFileSync home page? +Şimdi otomatik olarak güncelle ya da FreeFileSync ana sayfasından indir + +&Auto-update +&Otomatik Güncelle + +&Home page +&Ana Sayfadan İndir + +Download now? +İndirmek ister misiniz? + +&Download +İn&dirin + +FreeFileSync is up to date. +FreeFileSync güncel. + +Cannot find current FreeFileSync version number online. A newer version is likely available. Check manually now? +Geçerli FreeFileSync sürümü çevrimiçi olarak öğrenilemedi. Yeni bir sürüm yayınlanmış gibi görünüyor. El ile denetlemek ister misiniz? + +&Check +&Denetle + +Consistency check failed for %x. +%x tutarlılık sınamasından geçemedi. + +Installation was registered on a different operating system. +Kurulum başka bir işletim sistemi üzerinde kayıt edilmiş. + +Failed to activate FreeFileSync Donation Edition. +FreeFileSync Bağış Sürümü etkinleştirilemedi. + +Incorrect activation key. +Etkinleştirme anahtarı hatalı. + +Unable to register to receive system messages. +Sistem iletilerini alabilmek için gerekli kayıt eklenemedi. + +The %x installation option is only available in the FreeFileSync Donation Edition. +%x kurulumu yalnız FreeFileSync Bağış Sürümü ile yapılabilir. + +Cannot find system function %x. +%x sistem işlevi bulunamadı. + +Unable to register device notifications for %x. +%x aygıtının bildirimleri için gerekli kayıt eklenemedi. + +The file is locked by another process: +Dosya başka bir işlem tarafından kilitlenmiş: + +Failed to determine file permission support for folder %x. +%x klasörünün dosya izinleri desteği belirlenemedi. + +Cannot read security context of %x. +%x için güvenlik bağlamı okunamadı. + +Cannot write security context of %x. +%x için güvenlik bağlamı yazılamadı. + +Cannot read permissions of %x. +%x izinleri okunamadı. + +Cannot copy permissions from %x to %y. +İzinler %x üzerinden %y üzerine kopyalanamadı. + +%x is not a regular directory name. +%x geçerli bir klasör adı değil. + +Cannot copy attributes from %x to %y. +Öznitelikler %x üzerinden %y üzerine kopyalanamadı. + +%x TB +%x TB + +%x PB +%x PB + + +1 min +%x min + + +1 dakika +%x dakika + + + +1 hour +%x hours + + +1 saat +%x saat + + +Cannot set privilege %x. +%x izni verilemedi. + +Unable to suspend system sleep mode. +Sistem uyku kipine geçirilemedi. + +Cannot change process I/O priorities. +Giriş/Çıkış işlemi öncelikleri değiştirilemedi. + +Checking recycle bin failed for folder %x. +%x klasörü için Geri Dönüşüm Kutusu denetlenemedi. + +Unable to shut down the system. +Bilgisayar kapatılamıyor. + +Prepare installation +Kuruluma hazırlanıyor + +Choose which components you want to install. +Kurmak istediğiniz bileşenleri seçin. + +Select installation type: +Kurulum türünü seçin: + +Local +Yerel + +Portable +Taşınabilir + +Save settings in %x +Ayarlar %x üzerine kaydedilsin + +Register FreeFileSync file extensions +FreeFileSync Dosya Uzantıları İlişkilendirilsin + +Create Explorer context menu entries +Windows Gezgini Sağ Tık Menü Kayıtları Eklensin + +Save settings in installation directory +Ayarlar Kurulum Klasörüne Kaydedilsin + +Do not write to Registry +Kayıt Defterine Yazılmasın + +Just copy the files +Yalnız Dosyalar Kopyalansın + +Choose a directory for installation: +Kurulum Klasörünü Seçin: + +Create shortcuts: +Oluşturulacak Kısayollar: + +Desktop +Masaüstü + +Start Menu +Başlat Menüsü + +Send To +Gönder + +Registering FreeFileSync file extensions +FreeFileSync dosya uzantıları kayıt defterine ekleniyor + +Unregistering FreeFileSync file extensions +FreeFileSync dosya uzantıları kayıt defterinden siliniyor + +FreeFileSync Configuration +FreeFileSync Yapılandırması + +FreeFileSync Batch File +FreeFileSync Toplu İşlem Dosyası + +FreeFileSync Synchronization Database +FreeFileSync Eşitleme Veritabanı + +RealTimeSync Configuration +RealTimeSync Yapılandırması + +Edit with FreeFileSync +FreeFileSync ile Düzenlensin + +Instead of an ad, here's an animal. +Burada bir reklam yerine bir hayvan var. + +The FreeFileSync portable version cannot install into a subfolder of %x. +FreeFileSync taşınabilir sürümü bir %x alt klasörüne yüklenemez. + +Please choose the local installation type or select a different folder for installation. +Kurulum için farklı bir klasör ya da yerel kurulum türünü seçin. + +Get the Donation Edition with bonus features and help keep FreeFileSync ad-free. +Hediye özellikleri edinmek ve FreeFileSync yazılımını reklamsız kullanmak için Bağış Sürümünü alın. + diff --git a/FreeFileSync/Build/Resources/Languages/ukrainian.lng b/FreeFileSync/Build/Resources/Languages/ukrainian.lng index 9e3da1ea..5e0c211e 100755 --- a/FreeFileSync/Build/Resources/Languages/ukrainian.lng +++ b/FreeFileSync/Build/Resources/Languages/ukrainian.lng @@ -659,8 +659,8 @@ Actual: %y bytes Some files will be synchronized as part of multiple base folders. Деякі файли були синхронізовані як частина декількох основних папок. -To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder. -Для уникнення конфліктів, встановлюйте фільтри для виключення так щоб кожен оновлений файл розглядався тільки однією основною папкою. +To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder. + Versioning folder: Папка з версіями: @@ -827,8 +827,8 @@ The command is triggered if: Scanning... Сканування... -job name -назва завдання +configuration file + System: Sleep Система: Сон @@ -1041,6 +1041,12 @@ The command is triggered if: Match case Враховувати регістр +Processed: + + +Remaining: + + New Нова @@ -1277,17 +1283,11 @@ The command is triggered if: &Don't show this dialog again Більше &не показувати цей діалог -Items found: -Елементів знайдено: +Bytes: + -Time remaining: -Залишилось часу: - -Bytes -Байт - -Items -Елементи +Items: + Synchronizing... Синхронізація... @@ -1295,6 +1295,12 @@ The command is triggered if: Minimize to notification area Згорнути в область повідомлень +Bytes +Байт + +Items +Елементи + When finished: Після завершення: @@ -1746,8 +1752,8 @@ This guarantees a consistent state even in case of a serious error. Password: Пароль: -Key password: -Пароль ключа: +Key passphrase: + Please enter a file path. Будь-ласка, введіть шлях до файлу. @@ -1983,8 +1989,8 @@ This guarantees a consistent state even in case of a serious error. The file is locked by another process: Файл заблоковано іншим процесом: -Checking file permissions failed for folder %x. -Не вдалося перевірити права доступу до файлів для папки %x. +Failed to determine file permission support for folder %x. + Cannot read security context of %x. Не вдається прочитати контекст безпеки %x. diff --git a/FreeFileSync/Build/Resources/styles.gtk_rc b/FreeFileSync/Build/Resources/styles.gtk_rc deleted file mode 100755 index b13985a0..00000000 --- a/FreeFileSync/Build/Resources/styles.gtk_rc +++ /dev/null @@ -1,7 +0,0 @@ -style "no-inner-border" -{ - GtkButton::inner-border = {0, 0, 0, 0} /*remove excessive borders on Gnome*/ - /*GtkButton::focus-padding = 0 => keep default: minor difference + looks better on KDE */ -} - -class "GtkButton" style "no-inner-border" diff --git a/FreeFileSync/Source/Makefile b/FreeFileSync/Source/Makefile old mode 100644 new mode 100755 index 3a7da2e8..856117c1 --- a/FreeFileSync/Source/Makefile +++ b/FreeFileSync/Source/Makefile @@ -17,7 +17,6 @@ CXXFLAGS += `pkg-config --cflags libssh2` LINKFLAGS += `pkg-config --libs libssh2` CXXFLAGS += `pkg-config --cflags gtk+-2.0` -LINKFLAGS += `pkg-config --libs gtk+-2.0` #treat as system headers so that warnings are hidden: CXXFLAGS += -isystem/usr/include/gtk-2.0 @@ -28,13 +27,6 @@ CXXFLAGS += `pkg-config --cflags libselinux` -DHAVE_SELINUX LINKFLAGS += `pkg-config --libs libselinux` endif -#support for Ubuntu Unity (optional) -UNITY_EXISTING=$(shell pkg-config --exists unity && echo YES) -ifeq ($(UNITY_EXISTING),YES) -CXXFLAGS += `pkg-config --cflags unity` -DHAVE_UBUNTU_UNITY -LINKFLAGS += `pkg-config --libs unity` -endif - CPP_FILES= CPP_FILES+=base/algorithm.cpp CPP_FILES+=base/application.cpp @@ -45,10 +37,10 @@ CPP_FILES+=base/db_file.cpp CPP_FILES+=base/dir_lock.cpp CPP_FILES+=base/ffs_paths.cpp CPP_FILES+=base/file_hierarchy.cpp -CPP_FILES+=base/generate_logfile.cpp CPP_FILES+=base/icon_buffer.cpp CPP_FILES+=base/icon_loader.cpp CPP_FILES+=base/localization.cpp +CPP_FILES+=base/log_file.cpp CPP_FILES+=base/parallel_scan.cpp CPP_FILES+=base/path_filter.cpp CPP_FILES+=base/perf_check.cpp @@ -65,7 +57,6 @@ CPP_FILES+=afs/init_curl_libssh2.cpp CPP_FILES+=afs/native.cpp CPP_FILES+=afs/sftp.cpp CPP_FILES+=afs/libssh2/init_libssh2.cpp -CPP_FILES+=afs/libssh2/init_open_ssl.cpp CPP_FILES+=ui/batch_config.cpp CPP_FILES+=ui/abstract_folder_picker.cpp CPP_FILES+=ui/batch_status_handler.cpp diff --git a/FreeFileSync/Source/RealTimeSync/Makefile b/FreeFileSync/Source/RealTimeSync/Makefile index 8ac2b0b9..ef318cfc 100755 --- a/FreeFileSync/Source/RealTimeSync/Makefile +++ b/FreeFileSync/Source/RealTimeSync/Makefile @@ -8,7 +8,6 @@ LINKFLAGS = -s -no-pie `wx-config --libs std, aui --debug=no` -pthread #Gtk - support "no button border" CXXFLAGS += `pkg-config --cflags gtk+-2.0` -LINKFLAGS += `pkg-config --libs gtk+-2.0` #treat as system headers so that warnings are hidden: CXXFLAGS += -isystem/usr/include/gtk-2.0 diff --git a/FreeFileSync/Source/RealTimeSync/application.cpp b/FreeFileSync/Source/RealTimeSync/application.cpp index 443da37d..307f7d34 100644 --- a/FreeFileSync/Source/RealTimeSync/application.cpp +++ b/FreeFileSync/Source/RealTimeSync/application.cpp @@ -41,7 +41,33 @@ bool Application::OnInit() { //do not call wxApp::OnInit() to avoid using wxWidgets command line parser - ::gtk_rc_parse((fff::getResourceDirPf() + "styles.gtk_rc").c_str()); //remove inner border from bitmap buttons + //GTK should already have been initialized by wxWidgets (see \src\gtk\app.cpp:wxApp::Initialize) +#if GTK_MAJOR_VERSION == 2 + ::gtk_rc_parse((fff::getResourceDirPf() + "Gtk2Styles.rc").c_str()); + +#elif GTK_MAJOR_VERSION == 3 + try + { + GtkCssProvider* provider = ::gtk_css_provider_new (); + ZEN_ON_SCOPE_EXIT(::g_object_unref(provider)); + + GError* error = nullptr; + ZEN_ON_SCOPE_EXIT(if (error) ::g_error_free(error);); + + ::gtk_css_provider_load_from_path(provider, //GtkCssProvider* css_provider, + (fff::getResourceDirPf() + "Gtk3Styles.css").c_str(), //const gchar* path, + &error); //GError** error + if (error) + throw SysError(formatSystemError(L"gtk_css_provider_load_from_data", replaceCpy(_("Error Code %x"), L"%x", numberTo(error->code)), utfTo(error->message))); + + ::gtk_style_context_add_provider_for_screen(::gdk_screen_get_default(), //GdkScreen* screen, + GTK_STYLE_PROVIDER(provider), //GtkStyleProvider* provider, + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); //guint priority + } + catch (const SysError& e) { std::cerr << utfTo(e.toString()) << "\n"; } +#else +#error unknown GTK version! +#endif //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 @@ -57,8 +83,8 @@ bool Application::OnInit() } catch (const FileError& e) { - //following dialog does NOT trigger "exit on frame delete" while we are in OnInit(): http://docs.wxwidgets.org/trunk/overview_app.html#overview_app_shutdown - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + //following dialog does NOT trigger "exit on frame delete" while we are in OnInit(): https://docs.wxwidgets.org/trunk/overview_app.html#overview_app_shutdown + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); //continue! } @@ -100,7 +126,7 @@ void Application::onEnterEventLoop(wxEvent& event) filePath += Zstr(".ffs_batch"); else { - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(replaceCpy(_("Cannot find file %x."), L"%x", fmtPath(filePath)))); + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setMainInstructions(replaceCpy(_("Cannot find file %x."), L"%x", fmtPath(filePath)))); return; } } diff --git a/FreeFileSync/Source/RealTimeSync/config.cpp b/FreeFileSync/Source/RealTimeSync/config.cpp index bc28e767..0549111d 100644 --- a/FreeFileSync/Source/RealTimeSync/config.cpp +++ b/FreeFileSync/Source/RealTimeSync/config.cpp @@ -38,10 +38,10 @@ namespace { enum class RtsXmlType { - REAL, - BATCH, - GLOBAL, - OTHER + real, + batch, + global, + other }; RtsXmlType getXmlTypeNoThrow(const XmlDoc& doc) //throw() { @@ -51,14 +51,14 @@ RtsXmlType getXmlTypeNoThrow(const XmlDoc& doc) //throw() if (doc.root().getAttribute("XmlType", type)) { if (type == "REAL") - return RtsXmlType::REAL; + return RtsXmlType::real; else if (type == "BATCH") - return RtsXmlType::BATCH; + return RtsXmlType::batch; else if (type == "GLOBAL") - return RtsXmlType::GLOBAL; + return RtsXmlType::global; } } - return RtsXmlType::OTHER; + return RtsXmlType::other; } @@ -90,7 +90,7 @@ void rts::readConfig(const Zstring& filePath, XmlRealConfig& cfg, std::wstring& { XmlDoc doc = loadXml(filePath); //throw FileError - if (getXmlTypeNoThrow(doc) != RtsXmlType::REAL) //noexcept + if (getXmlTypeNoThrow(doc) != RtsXmlType::real) //noexcept throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filePath))); int formatVer = 0; @@ -133,7 +133,7 @@ void rts::readRealOrBatchConfig(const Zstring& filePath, XmlRealConfig& cfg, std const RtsXmlType xmlType = ::getXmlTypeNoThrow(doc); //convert batch config to RealTimeSync config - if (xmlType == RtsXmlType::BATCH) + if (xmlType == RtsXmlType::batch) { XmlIn in(doc); @@ -180,7 +180,7 @@ wxLanguage rts::getProgramLanguage() //throw FileError throw; } - if (getXmlTypeNoThrow(doc) != RtsXmlType::GLOBAL) //noexcept + if (getXmlTypeNoThrow(doc) != RtsXmlType::global) //noexcept throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filePath))); XmlIn in(doc); diff --git a/FreeFileSync/Source/RealTimeSync/main_dlg.cpp b/FreeFileSync/Source/RealTimeSync/main_dlg.cpp index 5d16e778..3aab7438 100644 --- a/FreeFileSync/Source/RealTimeSync/main_dlg.cpp +++ b/FreeFileSync/Source/RealTimeSync/main_dlg.cpp @@ -118,13 +118,13 @@ MainDialog::MainDialog(const Zstring& cfgFileName) : readRealOrBatchConfig(currentConfigFile, newConfig, warningMsg); //throw FileError if (!warningMsg.empty()) - showNotificationDialog(this, DialogInfoType::WARNING, PopupDialogCfg().setDetailInstructions(warningMsg)); + showNotificationDialog(this, DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(warningMsg)); loadCfgSuccess = warningMsg.empty(); } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } const bool startWatchingImmediately = loadCfgSuccess && !cfgFileName.empty(); @@ -164,7 +164,7 @@ MainDialog::~MainDialog() } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } } @@ -196,7 +196,7 @@ void MainDialog::OnMenuAbout(wxCommandEvent& event) L" x64"; #endif - showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg(). + showNotificationDialog(this, DialogInfoType::info, PopupDialogCfg(). setTitle(_("About")). setMainInstructions(L"RealTimeSync" L"\n\n" + replaceCpy(_("Build: %x"), L"%x", build))); } @@ -264,7 +264,7 @@ void MainDialog::OnConfigSave(wxCommandEvent& event) } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } } @@ -280,11 +280,11 @@ void MainDialog::loadConfig(const Zstring& filepath) readRealOrBatchConfig(filepath, newConfig, warningMsg); //throw FileError if (!warningMsg.empty()) - showNotificationDialog(this, DialogInfoType::WARNING, PopupDialogCfg().setDetailInstructions(warningMsg)); + showNotificationDialog(this, DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(warningMsg)); } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); return; } diff --git a/FreeFileSync/Source/RealTimeSync/tray_menu.cpp b/FreeFileSync/Source/RealTimeSync/tray_menu.cpp index 8fba1101..28266879 100644 --- a/FreeFileSync/Source/RealTimeSync/tray_menu.cpp +++ b/FreeFileSync/Source/RealTimeSync/tray_menu.cpp @@ -251,7 +251,7 @@ rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxStri if (dirNamesNonFmt.empty()) { - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(_("A folder input field is empty."))); + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setMainInstructions(_("A folder input field is empty."))); return AbortReason::REQUEST_GUI; } @@ -259,7 +259,7 @@ rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxStri if (cmdLine.empty()) { - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(_("Incorrect command line:") + L" \"\"")); + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setMainInstructions(_("Incorrect command line:") + L" \"\"")); return AbortReason::REQUEST_GUI; } @@ -279,7 +279,7 @@ rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxStri catch (const FileError& e) { //blocks! however, we *expect* this to be a persistent error condition... - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } }; @@ -306,13 +306,13 @@ rts::AbortReason rts::runFolderMonitor(const XmlRealConfig& config, const wxStri trayIcon.doUiRefreshNow(); //throw AbortMonitoring if (trayIcon.getShowErrorRequested()) - switch (showConfirmationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg(). + switch (showConfirmationDialog(nullptr, DialogInfoType::error, PopupDialogCfg(). setDetailInstructions(msg), _("&Retry"))) { - case ConfirmationButton::ACCEPT: //retry + case ConfirmationButton::accept: //retry return; - case ConfirmationButton::CANCEL: + case ConfirmationButton::cancel: throw AbortMonitoring(AbortReason::REQUEST_GUI); } std::this_thread::sleep_for(UI_UPDATE_INTERVAL); diff --git a/FreeFileSync/Source/afs/abstract.cpp b/FreeFileSync/Source/afs/abstract.cpp index d0621dcd..7a537b7d 100644 --- a/FreeFileSync/Source/afs/abstract.cpp +++ b/FreeFileSync/Source/afs/abstract.cpp @@ -199,16 +199,15 @@ AFS::FileCopyResult AFS::copyFileTransactional(const AbstractPath& apSource, con //- generate (hopefully) unique file name to avoid clashing with some remnant ffs_tmp file //- do not loop: avoid pathological cases, e.g. https://freefilesync.org/forum/viewtopic.php?t=1592 - const Zstring& shortGuid = printNumber(Zstr("%04x"), static_cast(getCrc16(generateGUID()))); - const Zstring& tmpExt = Zstr('.') + shortGuid + TEMP_FILE_ENDING; - Zstring tmpName = beforeLast(fileName, Zstr('.'), IF_MISSING_RETURN_ALL); //don't make the temp name longer than the original when hitting file system name length limitations: "lpMaximumComponentLength is commonly 255 characters" while (tmpName.size() > 200) //BUT don't trim short names! we want early failure on filename-related issues tmpName = getUnicodeSubstring(tmpName, 0 /*uniPosFirst*/, unicodeLength(tmpName) / 2 /*uniPosLast*/); //consider UTF encoding when cutting in the middle! (e.g. for macOS) - const AbstractPath apTargetTmp = AFS::appendRelPath(*parentPath, tmpName + tmpExt); + const Zstring& shortGuid = printNumber(Zstr("%04x"), static_cast(getCrc16(generateGUID()))); + + const AbstractPath apTargetTmp = AFS::appendRelPath(*parentPath, tmpName + Zstr('~') + shortGuid + TEMP_FILE_ENDING); //------------------------------------------------------------------------------------------- const AFS::FileCopyResult result = copyFilePlain(apTargetTmp); //throw FileError, ErrorFileLocked @@ -229,7 +228,7 @@ AFS::FileCopyResult AFS::copyFileTransactional(const AbstractPath& apSource, con NOT PRESERVE the creation time of the .ffs_tmp file, but SILENTLY "reuses" whatever creation time the old "file.txt" had! This "feature" is called "File System Tunneling": https://devblogs.microsoft.com/oldnewthing/?p=34923 - http://support.microsoft.com/kb/172190/en-us + https://support.microsoft.com/kb/172190/en-us */ return result; } diff --git a/FreeFileSync/Source/afs/ftp.cpp b/FreeFileSync/Source/afs/ftp.cpp index 29ee5711..4901168d 100644 --- a/FreeFileSync/Source/afs/ftp.cpp +++ b/FreeFileSync/Source/afs/ftp.cpp @@ -14,7 +14,7 @@ #include "ftp_common.h" #include "abstract_impl.h" #include "../base/resolve_path.h" - #include + #include using namespace zen; using namespace fff; @@ -475,8 +475,6 @@ public: options.emplace_back(CURLOPT_SHARE, curlShare); #endif - warn_static("add option for cert checking") - //TODO: FTP option to require certificate checking? #if 0 options.emplace_back(CURLOPT_CAINFO, "cacert.pem"); //hopefully latest version from https://curl.haxx.se/docs/caextract.html diff --git a/FreeFileSync/Source/afs/gdrive.cpp b/FreeFileSync/Source/afs/gdrive.cpp index 34166745..b55350bf 100644 --- a/FreeFileSync/Source/afs/gdrive.cpp +++ b/FreeFileSync/Source/afs/gdrive.cpp @@ -2063,7 +2063,7 @@ public: //generate (hopefully) unique file name to avoid clashing with unrelated tmp file (concurrent FFS shutdown!) const Zstring shortGuid = printNumber(Zstr("%04x"), static_cast(getCrc16(generateGUID()))); - const Zstring dbFilePathTmp = dbFilePath + Zstr('.') + shortGuid + Zstr(".tmp"); + const Zstring dbFilePathTmp = dbFilePath + Zstr('.') + shortGuid + AFS::TEMP_FILE_ENDING; ZEN_ON_SCOPE_FAIL(try { removeFilePlain(dbFilePathTmp); } catch (FileError&) {}); diff --git a/FreeFileSync/Source/afs/init_curl_libssh2.cpp b/FreeFileSync/Source/afs/init_curl_libssh2.cpp index dd0ecad5..dd956343 100644 --- a/FreeFileSync/Source/afs/init_curl_libssh2.cpp +++ b/FreeFileSync/Source/afs/init_curl_libssh2.cpp @@ -8,7 +8,7 @@ #include #include #include -#include "libssh2/init_open_ssl.h" +#include #include "libssh2/init_libssh2.h" #include "libcurl/curl_wrap.h" //DON'T include directly! diff --git a/FreeFileSync/Source/afs/libssh2/init_libssh2.cpp b/FreeFileSync/Source/afs/libssh2/init_libssh2.cpp index f64306bd..4db53458 100644 --- a/FreeFileSync/Source/afs/libssh2/init_libssh2.cpp +++ b/FreeFileSync/Source/afs/libssh2/init_libssh2.cpp @@ -7,16 +7,12 @@ #include "init_libssh2.h" #include #include -#include #ifndef LIBSSH2_OPENSSL #error check code when/if-ever the OpenSSL libssh2 backend is changed #endif -#if OPENSSL_VERSION_NUMBER < 0x10100000L - #error OpenSSL version too old -#endif #if defined LIBSSH2_WIN32 && !defined HAVE_EVP_AES_128_CTR #error OpenSSL already supports EVP_aes_128_ctr(), etc. => no need for the libssh2 fallbacks! diff --git a/FreeFileSync/Source/afs/libssh2/init_open_ssl.cpp b/FreeFileSync/Source/afs/libssh2/init_open_ssl.cpp deleted file mode 100644 index 4f1725e1..00000000 --- a/FreeFileSync/Source/afs/libssh2/init_open_ssl.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// ***************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * -// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * -// ***************************************************************************** - -#include "init_open_ssl.h" -#include -#include - - -#ifndef OPENSSL_THREADS - #error FFS, we are royally screwed! -#endif - -#if OPENSSL_VERSION_NUMBER < 0x10100000L - #error OpenSSL version too old -#endif - - -void zen::openSslInit() -{ - //official Wiki: https://wiki.openssl.org/index.php/Library_Initialization - //see apps_shutdown(): https://github.com/openssl/openssl/blob/master/apps/openssl.c - //see Curl_ossl_cleanup(): https://github.com/curl/curl/blob/master/lib/vtls/openssl.c - - //excplicitly init OpenSSL on main thread: they seem to initialize atomically! But it still might help to avoid issues: - [[maybe_unused]] const int rv = ::OPENSSL_init_ssl(OPENSSL_INIT_SSL_DEFAULT, nullptr); - assert(rv == 1); //https://www.openssl.org/docs/man1.1.0/ssl/OPENSSL_init_ssl.html -} - - -void zen::openSslTearDown() {} //OpenSSL 1.1.0+ deprecates all clean up functions - - -struct OpenSslThreadCleanUp -{ - ~OpenSslThreadCleanUp() - { - //OpenSSL 1.1.0+ deprecates all clean up functions - //=> so much the theory, in practice it leaks, of course: https://github.com/openssl/openssl/issues/6283 - OPENSSL_thread_stop(); - } -}; -thread_local OpenSslThreadCleanUp tearDownOpenSslThreadData; diff --git a/FreeFileSync/Source/afs/libssh2/init_open_ssl.h b/FreeFileSync/Source/afs/libssh2/init_open_ssl.h deleted file mode 100644 index e3889a87..00000000 --- a/FreeFileSync/Source/afs/libssh2/init_open_ssl.h +++ /dev/null @@ -1,16 +0,0 @@ -// ***************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * -// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * -// ***************************************************************************** - -#ifndef INIT_OPEN_SSL_H_2845370834275264456 -#define INIT_OPEN_SSL_H_2845370834275264456 - -namespace zen -{ -void openSslInit(); -void openSslTearDown(); -} - -#endif //INIT_OPEN_SSL_H_2845370834275264456 diff --git a/FreeFileSync/Source/afs/native.cpp b/FreeFileSync/Source/afs/native.cpp index 4e883279..266c88d2 100644 --- a/FreeFileSync/Source/afs/native.cpp +++ b/FreeFileSync/Source/afs/native.cpp @@ -127,7 +127,7 @@ std::vector getDirContentFlat(const Zstring& dirPath) //throw FileErr Linux all Windows (NTFS, FAT) all - some file systems return precomposed others decomposed UTF8: http://developer.apple.com/library/mac/#qa/qa1173/_index.html + some file systems return precomposed others decomposed UTF8: https://developer.apple.com/library/mac/#qa/qa1173/_index.html - OS X edit controls and text fields may return precomposed UTF as directly received by keyboard or decomposed UTF that was copy & pasted in! - Posix APIs require decomposed form: https://freefilesync.org/forum/viewtopic.php?t=2480 diff --git a/FreeFileSync/Source/afs/sftp.cpp b/FreeFileSync/Source/afs/sftp.cpp index 110ecfc3..d1276d11 100644 --- a/FreeFileSync/Source/afs/sftp.cpp +++ b/FreeFileSync/Source/afs/sftp.cpp @@ -249,7 +249,7 @@ std::wstring formatSftpErrorRaw(unsigned long ec) ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_INVALID_FILENAME); ZEN_CHECK_CASE_FOR_CONSTANT(LIBSSH2_FX_LINK_LOOP); - //SFTP error codes missing from libssh2: http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.1 + //SFTP error codes missing from libssh2: https://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.1 case 22: return L"SSH_FX_CANNOT_DELETE"; case 23: diff --git a/FreeFileSync/Source/base/algorithm.cpp b/FreeFileSync/Source/base/algorithm.cpp index d250347c..820b1bdd 100644 --- a/FreeFileSync/Source/base/algorithm.cpp +++ b/FreeFileSync/Source/base/algorithm.cpp @@ -1717,7 +1717,7 @@ void TempFileBuffer::createTempFiles(const std::set& workLoad, P const Zstring fileName = AFS::getItemName(descr.path); auto it = findLast(fileName.begin(), fileName.end(), Zstr('.')); //gracefully handle case of missing "." - const Zstring tempFileName = Zstring(fileName.begin(), it) + Zstr('-') + descrHash + Zstring(it, fileName.end()); + const Zstring tempFileName = Zstring(fileName.begin(), it) + Zstr('~') + descrHash + Zstring(it, fileName.end()); const Zstring tempFilePath = appendSeparator(tempFolderPath_) + tempFileName; const AFS::StreamAttributes sourceAttr{ descr.attr.modTime, descr.attr.fileSize, descr.attr.fileId }; diff --git a/FreeFileSync/Source/base/application.cpp b/FreeFileSync/Source/base/application.cpp index 498839f0..8007ee5e 100644 --- a/FreeFileSync/Source/base/application.cpp +++ b/FreeFileSync/Source/base/application.cpp @@ -21,8 +21,8 @@ #include "synchronization.h" #include "help_provider.h" #include "fatal_error.h" +#include "log_file.h" #include "resolve_path.h" -#include "generate_logfile.h" #include "../ui/batch_status_handler.h" #include "../ui/main_dlg.h" #include "../afs/concrete.h" @@ -58,8 +58,33 @@ 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 excessive inner border from bitmap buttons + //GTK should already have been initialized by wxWidgets (see \src\gtk\app.cpp:wxApp::Initialize) +#if GTK_MAJOR_VERSION == 2 + ::gtk_rc_parse((getResourceDirPf() + "Gtk2Styles.rc").c_str()); + +#elif GTK_MAJOR_VERSION == 3 + try + { + GtkCssProvider* provider = ::gtk_css_provider_new (); + ZEN_ON_SCOPE_EXIT(::g_object_unref(provider)); + + GError* error = nullptr; + ZEN_ON_SCOPE_EXIT(if (error) ::g_error_free(error);); + + ::gtk_css_provider_load_from_path(provider, //GtkCssProvider* css_provider, + (getResourceDirPf() + "Gtk3Styles.css").c_str(), //const gchar* path, + &error); //GError** error + if (error) + throw SysError(formatSystemError(L"gtk_css_provider_load_from_data", replaceCpy(_("Error Code %x"), L"%x", numberTo(error->code)), utfTo(error->message))); + + ::gtk_style_context_add_provider_for_screen(::gdk_screen_get_default(), //GdkScreen* screen, + GTK_STYLE_PROVIDER(provider), //GtkStyleProvider* provider, + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); //guint priority + } + catch (const SysError& e) { std::cerr << utfTo(e.toString()) << "\n"; } +#else +#error unknown GTK version! +#endif //Windows User Experience Interaction Guidelines: tool tips should have 5s timeout, info tips no timeout => compromise: @@ -267,16 +292,16 @@ void Application::launch(const std::vector& commandArgs) { switch (getXmlType(filePath)) //throw FileError { - case XmlType::GUI: - configFiles.emplace_back(filePath, XmlType::GUI); + case XmlType::gui: + configFiles.emplace_back(filePath, XmlType::gui); break; - case XmlType::BATCH: - configFiles.emplace_back(filePath, XmlType::BATCH); + case XmlType::batch: + configFiles.emplace_back(filePath, XmlType::batch); break; - case XmlType::GLOBAL: + case XmlType::global: globalConfigFile = filePath; break; - case XmlType::OTHER: + case XmlType::other: return notifyFatalError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filePath)), _("Error")); } } @@ -345,7 +370,7 @@ void Application::launch(const std::vector& commandArgs) const Zstring filepath = configFiles[0].first; //batch mode - if (configFiles[0].second == XmlType::BATCH && !openForEdit) + if (configFiles[0].second == XmlType::batch && !openForEdit) { XmlBatchConfig batchCfg; try @@ -374,7 +399,7 @@ void Application::launch(const std::vector& commandArgs) readAnyConfig({ filepath }, guiCfg, warningMsg); //throw FileError if (!warningMsg.empty()) - showNotificationDialog(nullptr, DialogInfoType::WARNING, PopupDialogCfg().setDetailInstructions(warningMsg)); + showNotificationDialog(nullptr, DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(warningMsg)); //what about simulating changed config on parsing errors? } catch (const FileError& e) @@ -406,7 +431,7 @@ void Application::launch(const std::vector& commandArgs) readAnyConfig(filePaths, guiCfg, warningMsg); //throw FileError if (!warningMsg.empty()) - showNotificationDialog(nullptr, DialogInfoType::WARNING, PopupDialogCfg().setDetailInstructions(warningMsg)); + showNotificationDialog(nullptr, DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(warningMsg)); //what about simulating changed config on parsing errors? } catch (const FileError& e) @@ -432,7 +457,7 @@ void runGuiMode(const Zstring& globalConfigFilePath, void showSyntaxHelp() { - showNotificationDialog(nullptr, DialogInfoType::INFO, PopupDialogCfg(). + showNotificationDialog(nullptr, DialogInfoType::info, PopupDialogCfg(). setTitle(_("Command line")). setDetailInstructions(_("Syntax:") + L"\n\n" + L"./FreeFileSync" + L"\n" + @@ -458,12 +483,12 @@ void showSyntaxHelp() void runBatchMode(const Zstring& globalConfigFilePath, const XmlBatchConfig& batchCfg, const Zstring& cfgFilePath, FfsReturnCode& returnCode) { - const bool showPopupAllowed = !batchCfg.mainCfg.ignoreErrors && batchCfg.batchExCfg.batchErrorHandling == BatchErrorHandling::SHOW_POPUP; + const bool showPopupAllowed = !batchCfg.mainCfg.ignoreErrors && batchCfg.batchExCfg.batchErrorHandling == BatchErrorHandling::showPopup; auto notifyError = [&](const std::wstring& msg, FfsReturnCode rc) { if (showPopupAllowed) - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(msg)); + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(msg)); else //"exit" or "ignore" logFatalError(utfTo(msg)); @@ -496,7 +521,7 @@ void runBatchMode(const Zstring& globalConfigFilePath, const XmlBatchConfig& bat } catch (const FileError& e) { - notifyError(e.toString(), FFS_RC_FINISHED_WITH_WARNINGS); + notifyError(e.toString(), FFS_RC_WARNING); //continue! } @@ -567,7 +592,7 @@ void runBatchMode(const Zstring& globalConfigFilePath, const XmlBatchConfig& bat for (ConfigFileItem& cfi : globalCfg.gui.mainDlg.cfgFileHistory) if (equalNativePath(cfi.cfgFilePath, cfgFilePath)) { - if (r.finalStatus != SyncResult::ABORTED) + if (r.finalStatus != SyncResult::aborted) cfi.lastSyncTime = std::chrono::system_clock::to_time_t(syncStartTime); assert(!AFS::isNullPath(r.logFilePath)); if (!AFS::isNullPath(r.logFilePath)) @@ -585,7 +610,7 @@ void runBatchMode(const Zstring& globalConfigFilePath, const XmlBatchConfig& bat } catch (const FileError& e) { - notifyError(e.toString(), FFS_RC_FINISHED_WITH_WARNINGS); + notifyError(e.toString(), FFS_RC_WARNING); } using FinalRequest = BatchStatusHandler::FinalRequest; @@ -602,7 +627,7 @@ void runBatchMode(const Zstring& globalConfigFilePath, const XmlBatchConfig& bat shutdownSystem(); //throw FileError terminateProcess(0 /*exitCode*/); //no point in continuing and saving cfg again in onQueryEndSession() while the OS will kill us anytime! } - catch (const FileError& e) { notifyError(e.toString(), FFS_RC_FINISHED_WITH_WARNINGS); } + catch (const FileError& e) { notifyError(e.toString(), FFS_RC_WARNING); } break; } } diff --git a/FreeFileSync/Source/base/comparison.cpp b/FreeFileSync/Source/base/comparison.cpp index f898cdce..c0c6c4b7 100644 --- a/FreeFileSync/Source/base/comparison.cpp +++ b/FreeFileSync/Source/base/comparison.cpp @@ -191,10 +191,10 @@ ComparisonBuffer::ComparisonBuffer(const std::set& foldersToRead, { switch (callback.reportError(msg, retryNumber)) { - case ProcessCallback::IGNORE_ERROR: + case ProcessCallback::ignoreError: return AFS::TraverserCallback::ON_ERROR_CONTINUE; - case ProcessCallback::RETRY: + case ProcessCallback::retry: return AFS::TraverserCallback::ON_ERROR_RETRY; } assert(false); diff --git a/FreeFileSync/Source/base/config.cpp b/FreeFileSync/Source/base/config.cpp index 4a465329..edc7b05f 100644 --- a/FreeFileSync/Source/base/config.cpp +++ b/FreeFileSync/Source/base/config.cpp @@ -35,14 +35,14 @@ XmlType getXmlTypeNoThrow(const XmlDoc& doc) //throw() if (doc.root().getAttribute("XmlType", type)) { if (type == "GUI") - return XmlType::GUI; + return XmlType::gui; else if (type == "BATCH") - return XmlType::BATCH; + return XmlType::batch; else if (type == "GLOBAL") - return XmlType::GLOBAL; + return XmlType::global; } } - return XmlType::OTHER; + return XmlType::other; } @@ -58,16 +58,16 @@ void setXmlType(XmlDoc& doc, XmlType type) //throw() { switch (type) { - case XmlType::GUI: + case XmlType::gui: doc.root().setAttribute("XmlType", "GUI"); break; - case XmlType::BATCH: + case XmlType::batch: doc.root().setAttribute("XmlType", "BATCH"); break; - case XmlType::GLOBAL: + case XmlType::global: doc.root().setAttribute("XmlType", "GLOBAL"); break; - case XmlType::OTHER: + case XmlType::other: assert(false); break; } @@ -222,10 +222,10 @@ void writeText(const BatchErrorHandling& value, std::string& output) { switch (value) { - case BatchErrorHandling::SHOW_POPUP: + case BatchErrorHandling::showPopup: output = "Show"; break; - case BatchErrorHandling::CANCEL: + case BatchErrorHandling::cancel: output = "Cancel"; break; } @@ -236,9 +236,9 @@ bool readText(const std::string& input, BatchErrorHandling& value) { const std::string tmp = trimCpy(input); if (tmp == "Show") - value = BatchErrorHandling::SHOW_POPUP; + value = BatchErrorHandling::showPopup; else if (tmp == "Cancel") - value = BatchErrorHandling::CANCEL; + value = BatchErrorHandling::cancel; else return false; return true; @@ -283,13 +283,13 @@ void writeText(const PostSyncAction& value, std::string& output) { switch (value) { - case PostSyncAction::NONE: + case PostSyncAction::none: output = "None"; break; - case PostSyncAction::SLEEP: + case PostSyncAction::sleep: output = "Sleep"; break; - case PostSyncAction::SHUTDOWN: + case PostSyncAction::shutdown: output = "Shutdown"; break; } @@ -300,11 +300,11 @@ bool readText(const std::string& input, PostSyncAction& value) { const std::string tmp = trimCpy(input); if (tmp == "None") - value = PostSyncAction::NONE; + value = PostSyncAction::none; else if (tmp == "Sleep") - value = PostSyncAction::SLEEP; + value = PostSyncAction::sleep; else if (tmp == "Shutdown") - value = PostSyncAction::SHUTDOWN; + value = PostSyncAction::shutdown; else return false; return true; @@ -847,16 +847,16 @@ void writeText(const SyncResult& value, std::string& output) { switch (value) { - case SyncResult::FINISHED_WITH_SUCCESS: + case SyncResult::finishedSuccess: output = "Success"; break; - case SyncResult::FINISHED_WITH_WARNINGS: + case SyncResult::finishedWarning: output = "Warning"; break; - case SyncResult::FINISHED_WITH_ERROR: + case SyncResult::finishedError: output = "Error"; break; - case SyncResult::ABORTED: + case SyncResult::aborted: output = "Stopped"; break; } @@ -867,13 +867,13 @@ bool readText(const std::string& input, SyncResult& value) { const std::string tmp = trimCpy(input); if (tmp == "Success") - value = SyncResult::FINISHED_WITH_SUCCESS; + value = SyncResult::finishedSuccess; else if (tmp == "Warning") - value = SyncResult::FINISHED_WITH_WARNINGS; + value = SyncResult::finishedWarning; else if (tmp == "Error") - value = SyncResult::FINISHED_WITH_ERROR; + value = SyncResult::finishedError; else if (tmp == "Stopped") - value = SyncResult::ABORTED; + value = SyncResult::aborted; else return false; return true; @@ -1320,7 +1320,7 @@ void readConfig(const XmlIn& in, BatchExclusiveConfig& cfg, int formatVer) { std::string str; if (inBatchCfg["HandleError"](str)) - cfg.batchErrorHandling = str == "Stop" ? BatchErrorHandling::CANCEL : BatchErrorHandling::SHOW_POPUP; + cfg.batchErrorHandling = str == "Stop" ? BatchErrorHandling::cancel : BatchErrorHandling::showPopup; } else inBatchCfg["ErrorDialog"](cfg.batchErrorHandling); @@ -1336,13 +1336,13 @@ void readConfig(const XmlIn& in, BatchExclusiveConfig& cfg, int formatVer) { tmp = trimCpy(tmp); if (tmp == "Summary") - cfg.postSyncAction = PostSyncAction::NONE; + cfg.postSyncAction = PostSyncAction::none; else if (tmp == "Exit") cfg.autoCloseSummary = true; else if (tmp == "Sleep") - cfg.postSyncAction = PostSyncAction::SLEEP; + cfg.postSyncAction = PostSyncAction::sleep; else if (tmp == "Shutdown") - cfg.postSyncAction = PostSyncAction::SHUTDOWN; + cfg.postSyncAction = PostSyncAction::shutdown; } } else @@ -1380,7 +1380,7 @@ void readConfig(const XmlIn& in, XmlBatchConfig& cfg, int formatVer) str == "systemctl suspend" || str == "osascript -e 'tell application \"System Events\" to sleep'") { - cfg.batchExCfg.postSyncAction = PostSyncAction::SLEEP; + cfg.batchExCfg.postSyncAction = PostSyncAction::sleep; cfg.mainCfg.postSyncCommand.clear(); } else if (str == "shutdown /s /t 60" || @@ -1388,7 +1388,7 @@ void readConfig(const XmlIn& in, XmlBatchConfig& cfg, int formatVer) str == "systemctl poweroff" || str == "osascript -e 'tell application \"System Events\" to shut down'") { - cfg.batchExCfg.postSyncAction = PostSyncAction::SHUTDOWN; + cfg.batchExCfg.postSyncAction = PostSyncAction::shutdown; cfg.mainCfg.postSyncCommand.clear(); } else if (cfg.batchExCfg.runMinimized) @@ -1533,7 +1533,7 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& cfg, int formatVer) inGui["ConfigHistory"](cfgHist); for (const Zstring& cfgPath : cfgHist) - cfg.gui.mainDlg.cfgFileHistory.emplace_back(cfgPath, 0, getNullPath(), SyncResult::FINISHED_WITH_SUCCESS); + cfg.gui.mainDlg.cfgFileHistory.emplace_back(cfgPath, 0, getNullPath(), SyncResult::finishedSuccess); } //TODO: remove after migration! 2018-07-27 else if (formatVer < 10) @@ -1544,7 +1544,7 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& cfg, int formatVer) inConfig["Configurations"](cfgFileHistory); for (const ConfigFileItemV9& item : cfgFileHistory) - cfg.gui.mainDlg.cfgFileHistory.emplace_back(item.filePath, item.lastSyncTime, getNullPath(), SyncResult::FINISHED_WITH_SUCCESS); + cfg.gui.mainDlg.cfgFileHistory.emplace_back(item.filePath, item.lastSyncTime, getNullPath(), SyncResult::finishedSuccess); } else { @@ -1789,19 +1789,19 @@ void readConfig(const Zstring& filePath, XmlType type, ConfigType& cfg, int curr void fff::readConfig(const Zstring& filePath, XmlGuiConfig& cfg, std::wstring& warningMsg) { - ::readConfig(filePath, XmlType::GUI, cfg, XML_FORMAT_SYNC_CFG, warningMsg); //throw FileError + ::readConfig(filePath, XmlType::gui, cfg, XML_FORMAT_SYNC_CFG, warningMsg); //throw FileError } void fff::readConfig(const Zstring& filePath, XmlBatchConfig& cfg, std::wstring& warningMsg) { - ::readConfig(filePath, XmlType::BATCH, cfg, XML_FORMAT_SYNC_CFG, warningMsg); //throw FileError + ::readConfig(filePath, XmlType::batch, cfg, XML_FORMAT_SYNC_CFG, warningMsg); //throw FileError } void fff::readConfig(const Zstring& filePath, XmlGlobalSettings& cfg, std::wstring& warningMsg) { - ::readConfig(filePath, XmlType::GLOBAL, cfg, XML_FORMAT_GLOBAL_CFG, warningMsg); //throw FileError + ::readConfig(filePath, XmlType::global, cfg, XML_FORMAT_GLOBAL_CFG, warningMsg); //throw FileError } @@ -1851,7 +1851,7 @@ void fff::readAnyConfig(const std::vector& filePaths, XmlGuiConfig& cfg switch (getXmlTypeNoThrow(doc)) { - case XmlType::GUI: + case XmlType::gui: { XmlGuiConfig guiCfg = parseConfig(doc, filePath, XML_FORMAT_SYNC_CFG, warningMsg); //nothrow if (firstItem) @@ -1860,7 +1860,7 @@ void fff::readAnyConfig(const std::vector& filePaths, XmlGuiConfig& cfg } break; - case XmlType::BATCH: + case XmlType::batch: { XmlBatchConfig batchCfg = parseConfig(doc, filePath, XML_FORMAT_SYNC_CFG, warningMsg); //nothrow if (firstItem) @@ -1869,8 +1869,8 @@ void fff::readAnyConfig(const std::vector& filePaths, XmlGuiConfig& cfg } break; - case XmlType::GLOBAL: - case XmlType::OTHER: + case XmlType::global: + case XmlType::other: throw FileError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(filePath))); } } @@ -2196,19 +2196,19 @@ void writeConfig(const ConfigType& cfg, XmlType type, int xmlFormatVer, const Zs void fff::writeConfig(const XmlGuiConfig& cfg, const Zstring& filePath) { - ::writeConfig(cfg, XmlType::GUI, XML_FORMAT_SYNC_CFG, filePath); //throw FileError + ::writeConfig(cfg, XmlType::gui, XML_FORMAT_SYNC_CFG, filePath); //throw FileError } void fff::writeConfig(const XmlBatchConfig& cfg, const Zstring& filePath) { - ::writeConfig(cfg, XmlType::BATCH, XML_FORMAT_SYNC_CFG, filePath); //throw FileError + ::writeConfig(cfg, XmlType::batch, XML_FORMAT_SYNC_CFG, filePath); //throw FileError } void fff::writeConfig(const XmlGlobalSettings& cfg, const Zstring& filePath) { - ::writeConfig(cfg, XmlType::GLOBAL, XML_FORMAT_GLOBAL_CFG, filePath); //throw FileError + ::writeConfig(cfg, XmlType::global, XML_FORMAT_GLOBAL_CFG, filePath); //throw FileError } diff --git a/FreeFileSync/Source/base/config.h b/FreeFileSync/Source/base/config.h index ab9cbf97..89edfeb9 100644 --- a/FreeFileSync/Source/base/config.h +++ b/FreeFileSync/Source/base/config.h @@ -19,26 +19,26 @@ namespace fff { enum class XmlType { - GUI, - BATCH, - GLOBAL, - OTHER + gui, + batch, + global, + other }; XmlType getXmlType(const Zstring& filePath); //throw FileError enum class BatchErrorHandling { - SHOW_POPUP, - CANCEL + showPopup, + cancel }; enum class PostSyncAction { - NONE, - SLEEP, - SHUTDOWN + none, + sleep, + shutdown }; struct ExternalApp @@ -66,10 +66,10 @@ inline bool operator!=(const XmlGuiConfig& lhs, const XmlGuiConfig& rhs) { retur struct BatchExclusiveConfig { - BatchErrorHandling batchErrorHandling = BatchErrorHandling::SHOW_POPUP; + BatchErrorHandling batchErrorHandling = BatchErrorHandling::showPopup; bool runMinimized = false; bool autoCloseSummary = false; - PostSyncAction postSyncAction = PostSyncAction::NONE; + PostSyncAction postSyncAction = PostSyncAction::none; }; diff --git a/FreeFileSync/Source/base/db_file.cpp b/FreeFileSync/Source/base/db_file.cpp index e9fd9e03..578b53f8 100644 --- a/FreeFileSync/Source/base/db_file.cpp +++ b/FreeFileSync/Source/base/db_file.cpp @@ -8,6 +8,7 @@ #include #include #include +#include "../afs/concrete.h" using namespace zen; @@ -37,23 +38,14 @@ using DbStreams = std::map; //list of streams ordered by ------------------------------------------------------------------------------*/ template inline -AbstractPath getDatabaseFilePath(const BaseFolderPair& baseFolder, bool tempfile = false) +AbstractPath getDatabaseFilePath(const BaseFolderPair& baseFolder) { //Linux and Windows builds are binary incompatible: different file id?, problem with case sensitivity? //precomposed/decomposed UTF? are UTC file times really compatible? what about endianess!? //however 32 and 64-bit FreeFileSync are designed to produce binary-identical db files! - //Give db files different names. + //=> give db files different names: const Zstring dbName = Zstr(".sync"); //files beginning with dots are hidden e.g. in Nautilus - Zstring dbFileName; - if (tempfile) //generate (hopefully) unique file name to avoid clashing with some remnant ffs_tmp file - { - const Zstring shortGuid = printNumber(Zstr("%04x"), static_cast(getCrc16(generateGUID()))); - dbFileName = dbName + Zstr('.') + shortGuid + AFS::TEMP_FILE_ENDING; - } - else - dbFileName = dbName + SYNC_DB_FILE_ENDING; - - return AFS::appendRelPath(baseFolder.getAbstractPath(), dbFileName); + return AFS::appendRelPath(baseFolder.getAbstractPath(), dbName + SYNC_DB_FILE_ENDING); } //####################################################################################################################################### @@ -746,36 +738,31 @@ private: std::pair getCommonSession(const DbStreams& streamsLeft, const DbStreams& streamsRight, //throw FileError, FileErrorDatabaseNotExisting - const std::wstring& displayFilePathL, //used for diagnostics only - const std::wstring& displayFilePathR) + DbStreams::const_iterator> findCommonSession(const DbStreams& streamsLeft, const DbStreams& streamsRight, //throw FileError + const std::wstring& displayFilePathL, //used for diagnostics only + const std::wstring& displayFilePathR) { - auto itCommonL = streamsLeft .cend(); - auto itCommonR = streamsRight.cend(); + auto itCommonL = streamsLeft .end(); + auto itCommonR = streamsRight.end(); for (auto itL = streamsLeft.begin(); itL != streamsLeft.end(); ++itL) { auto itR = streamsRight.find(itL->first); if (itR != streamsRight.end()) - /* handle case when db file is loaded together with a former copy of itself: + /* handle case when db file is loaded together with a (former) copy of itself: - some streams may have been updated in the meantime => must not discard either db file! - since db file was copied, multiple streams may have matching sessionID - => IGNORE all of them: one of them may be used later against other sync targets! - */ + => IGNORE all of them: one of them may be used later against other sync targets! */ if (itL->second.isLeadStream != itR->second.isLeadStream) { - if (itCommonL != streamsLeft.end()) + if (itCommonL != streamsLeft.end()) //should not be possible! throw FileError(_("Database file is corrupted:") + L"\n" + fmtPath(displayFilePathL) + L"\n" + fmtPath(displayFilePathR), - L"Multiple common sessions found."); //should not be possible (anymore) + L"Multiple common sessions found."); itCommonL = itL; itCommonR = itR; } } - if (itCommonL == streamsLeft.end()) - throw FileErrorDatabaseNotExisting(_("Initial synchronization:") + L" \n" + - _("The database files do not yet contain information about the last synchronization.")); - return { itCommonL, itCommonR }; } } @@ -805,16 +792,18 @@ std::shared_ptr fff::loadLastSynchronousState(const BaseFolderPair const DbStreams streamsLeft = ::loadStreams(dbPathLeft, notifyLoadL); //throw FileError, FileErrorDatabaseNotExisting, X const DbStreams streamsRight = ::loadStreams(dbPathRight, notifyLoadR); // - //find associated session: there can be at most one session within intersection of left and right ids - std::pair session = getCommonSession(streamsLeft, streamsRight, //throw FileError, FileErrorDatabaseNotExisting - AFS::getDisplayPath(dbPathLeft), - AFS::getDisplayPath(dbPathRight)); + //find associated session: there can be at most one session within intersection of left and right IDs + const auto [itStreamL, itStreamR] = findCommonSession(streamsLeft, streamsRight, //throw FileError + AFS::getDisplayPath(dbPathLeft), + AFS::getDisplayPath(dbPathRight)); + if (itStreamL == streamsLeft.end()) + throw FileErrorDatabaseNotExisting(_("Initial synchronization:") + L" \n" + + _("The database files do not yet contain information about the last synchronization.")); - const bool leadStreamLeft = session.first->second.isLeadStream; - assert(session.first->second.isLeadStream != session.second->second.isLeadStream); - const ByteArray& streamL = session.first ->second.rawStream; - const ByteArray& streamR = session.second->second.rawStream; + const bool leadStreamLeft = itStreamL->second.isLeadStream; + assert(itStreamL->second.isLeadStream != itStreamR->second.isLeadStream); + const ByteArray& streamL = itStreamL ->second.rawStream; + const ByteArray& streamR = itStreamR->second.rawStream; return StreamParser::execute(leadStreamLeft, streamL, streamR, //throw FileError AFS::getDisplayPath(dbPathLeft), @@ -822,51 +811,45 @@ std::shared_ptr fff::loadLastSynchronousState(const BaseFolderPair } -void fff::saveLastSynchronousState(const BaseFolderPair& baseFolder, const std::function& notifyStatus /*throw X*/) //throw FileError, X +void fff::saveLastSynchronousState(const BaseFolderPair& baseFolder, bool transactionalCopy, + const std::function& notifyStatus /*throw X*/) //throw FileError, X { //transactional behaviour! write to tmp files first - const AbstractPath dbPathLeft = getDatabaseFilePath< LEFT_SIDE>(baseFolder); - const AbstractPath dbPathRight = getDatabaseFilePath(baseFolder); + const AbstractPath dbPathL = getDatabaseFilePath< LEFT_SIDE>(baseFolder); + const AbstractPath dbPathR = getDatabaseFilePath(baseFolder); - const AbstractPath dbPathLeftTmp = getDatabaseFilePath< LEFT_SIDE>(baseFolder, true /*tempfile*/); - const AbstractPath dbPathRightTmp = getDatabaseFilePath(baseFolder, true /*tempfile*/); + StreamStatusNotifier notifyLoadL(replaceCpy(_("Loading file %x..."), L"%x", fmtPath(AFS::getDisplayPath(dbPathL))), notifyStatus); + StreamStatusNotifier notifyLoadR(replaceCpy(_("Loading file %x..."), L"%x", fmtPath(AFS::getDisplayPath(dbPathR))), notifyStatus); - StreamStatusNotifier notifyLoadL(replaceCpy(_("Loading file %x..."), L"%x", fmtPath(AFS::getDisplayPath(dbPathLeft) )), notifyStatus); - StreamStatusNotifier notifyLoadR(replaceCpy(_("Loading file %x..."), L"%x", fmtPath(AFS::getDisplayPath(dbPathRight))), notifyStatus); - - StreamStatusNotifier notifySaveL(replaceCpy(_("Saving file %x..."), L"%x", fmtPath(AFS::getDisplayPath(dbPathLeft) )), notifyStatus); - StreamStatusNotifier notifySaveR(replaceCpy(_("Saving file %x..."), L"%x", fmtPath(AFS::getDisplayPath(dbPathRight))), notifyStatus); + StreamStatusNotifier notifySaveL(replaceCpy(_("Saving file %x..."), L"%x", fmtPath(AFS::getDisplayPath(dbPathL))), notifyStatus); + StreamStatusNotifier notifySaveR(replaceCpy(_("Saving file %x..."), L"%x", fmtPath(AFS::getDisplayPath(dbPathR))), notifyStatus); //(try to) load old database files... - DbStreams streamsLeft; //list of session ID + DirInfo-stream - DbStreams streamsRight; + DbStreams streamsL; //list of session ID + DirInfo-stream + DbStreams streamsR; - try { streamsLeft = ::loadStreams(dbPathLeft, notifyLoadL); } //throw FileError, FileErrorDatabaseNotExisting, X + try { streamsL = ::loadStreams(dbPathL, notifyLoadL); } //throw FileError, FileErrorDatabaseNotExisting, X catch (FileError&) {} - try { streamsRight = ::loadStreams(dbPathRight, notifyLoadR); } //throw FileError, FileErrorDatabaseNotExisting, X + try { streamsR = ::loadStreams(dbPathR, notifyLoadR); } //throw FileError, FileErrorDatabaseNotExisting, X catch (FileError&) {} //if error occurs: just overwrite old file! User is already informed about issues right after comparing! auto lastSyncState = std::make_shared(InSyncFolder::DIR_STATUS_IN_SYNC); - auto itStreamOldL = streamsLeft .cend(); - auto itStreamOldR = streamsRight.cend(); - try - { - //find associated session: there can be at most one session within intersection of left and right ids - std::tie(itStreamOldL, itStreamOldR) = getCommonSession(streamsLeft, streamsRight, //throw FileError, FileErrorDatabaseNotExisting - AFS::getDisplayPath(dbPathLeft), - AFS::getDisplayPath(dbPathRight)); - - const bool leadStreamLeft = itStreamOldL->second.isLeadStream; - - //load last synchrounous state - lastSyncState = StreamParser::execute(leadStreamLeft, - itStreamOldL->second.rawStream, //throw FileError - itStreamOldR->second.rawStream, - AFS::getDisplayPath(dbPathLeft), - AFS::getDisplayPath(dbPathRight)); - } - catch (FileError&) {} //if error occurs: just overwrite old file! User is already informed about issues right after comparing! + + //find associated session: there can be at most one session within intersection of left and right IDs + const auto [itStreamOldL, itStreamOldR] = findCommonSession(streamsL, streamsR, //throw FileError + AFS::getDisplayPath(dbPathL), + AFS::getDisplayPath(dbPathR)); + if (itStreamOldL != streamsL.end()) + try //load last synchrounous state + { + lastSyncState = StreamParser::execute(itStreamOldL->second.isLeadStream /*leadStreamLeft*/, + itStreamOldL->second.rawStream, //throw FileError + itStreamOldR->second.rawStream, + AFS::getDisplayPath(dbPathL), + AFS::getDisplayPath(dbPathR)); + } + catch (FileError&) {} //if error occurs: just overwrite old file! User is already informed about errors right after comparing! //update last synchrounous state LastSynchronousStateUpdater::execute(baseFolder, *lastSyncState); @@ -878,41 +861,112 @@ void fff::saveLastSynchronousState(const BaseFolderPair& baseFolder, const std:: sessionDataR.isLeadStream = false; StreamGenerator::execute(*lastSyncState, //throw FileError - AFS::getDisplayPath(dbPathLeft), - AFS::getDisplayPath(dbPathRight), + AFS::getDisplayPath(dbPathL), + AFS::getDisplayPath(dbPathR), sessionDataL.rawStream, sessionDataR.rawStream); //check if there is some work to do at all - if (itStreamOldL != streamsLeft .end() && itStreamOldL->second == sessionDataL && - itStreamOldR != streamsRight.end() && itStreamOldR->second == sessionDataR) + if (itStreamOldL != streamsL.end() && itStreamOldL->second == sessionDataL && + itStreamOldR != streamsR.end() && itStreamOldR->second == sessionDataR) return; //some users monitor the *.ffs_db file with RTS => don't touch the file if it isnt't strictly needed //erase old session data - if (itStreamOldL != streamsLeft.end()) - streamsLeft.erase(itStreamOldL); - if (itStreamOldR != streamsRight.end()) - streamsRight.erase(itStreamOldR); + if (itStreamOldL != streamsL.end()) + streamsL.erase(itStreamOldL); + if (itStreamOldR != streamsR.end()) + streamsR.erase(itStreamOldR); //create new session data const std::string sessionID = zen::generateGUID(); - streamsLeft [sessionID] = std::move(sessionDataL); - streamsRight[sessionID] = std::move(sessionDataR); + streamsL[sessionID] = std::move(sessionDataL); + streamsR[sessionID] = std::move(sessionDataR); + + warn_static("finish: support massParallelExecute!?") + if (transactionalCopy && + (!AFS::hasNativeTransactionalCopy(dbPathL) || + !AFS::hasNativeTransactionalCopy(dbPathR))) + { + //write (temp-) files as a transaction + const Zstring shortGuid = printNumber(Zstr("%04x"), static_cast(getCrc16(generateGUID()))); + + const AbstractPath dbPathTmpL = AFS::appendRelPath(*AFS::getParentPath(dbPathL), AFS::getItemName(dbPathL) + Zstr('.') + shortGuid + AFS::TEMP_FILE_ENDING); + const AbstractPath dbPathRTmp = AFS::appendRelPath(*AFS::getParentPath(dbPathR), AFS::getItemName(dbPathR) + Zstr('.') + shortGuid + AFS::TEMP_FILE_ENDING); + + saveStreams(streamsL, dbPathTmpL, notifySaveL); //throw FileError, X + auto guardTmpL = makeGuard([&] { try { AFS::removeFilePlain(dbPathTmpL); } catch (FileError&) {} }); + saveStreams(streamsR, dbPathRTmp, notifySaveR); //throw FileError, X + auto guardTmpR = makeGuard([&] { try { AFS::removeFilePlain(dbPathRTmp); } catch (FileError&) {} }); + + //operation finished: rename temp files -> this should work (almost) transactionally: + //if there were no write access, creation of temp files would have failed + AFS::removeFileIfExists(dbPathL); //throw FileError + AFS::moveAndRenameItem(dbPathTmpL, dbPathL); //throw FileError, (ErrorMoveUnsupported) + guardTmpL.dismiss(); + + AFS::removeFileIfExists(dbPathR); //throw FileError + AFS::moveAndRenameItem(dbPathRTmp, dbPathR); //throw FileError, (ErrorMoveUnsupported) + guardTmpR.dismiss(); + } + else //some MTP devices don't even allow renaming files: https://freefilesync.org/forum/viewtopic.php?t=6531 + { + warn_static("caveat: throw X leaves db file as deleted!") + AFS::removeFileIfExists(dbPathL); //throw FileError + saveStreams(streamsL, dbPathL, notifySaveL); //throw FileError, X + + AFS::removeFileIfExists(dbPathR); //throw FileError + saveStreams(streamsR, dbPathR, notifySaveR); //throw FileError, X + } + +#if 0 + warn_static("remove after test") //write (temp-) files as a transaction - saveStreams(streamsLeft, dbPathLeftTmp, notifySaveL); //throw FileError, X - auto guardTmpL = makeGuard([&] { try { AFS::removeFilePlain(dbPathLeftTmp); } catch (FileError&) {} }); - saveStreams(streamsRight, dbPathRightTmp, notifySaveR); // - auto guardTmpR = makeGuard([&] { try { AFS::removeFilePlain(dbPathRightTmp); } catch (FileError&) {} }); - - //operation finished: rename temp files -> this should work (almost) transactionally: - //if there were no write access, creation of temp files would have failed - AFS::removeFileIfExists(dbPathLeft); //throw FileError - AFS::moveAndRenameItem(dbPathLeftTmp, dbPathLeft); //throw FileError, (ErrorMoveUnsupported) - guardTmpL.dismiss(); - - AFS::removeFileIfExists(dbPathRight); // - AFS::moveAndRenameItem(dbPathRightTmp, dbPathRight); // - guardTmpR.dismiss(); + const Zstring shortGuid = printNumber(Zstr("%04x"), static_cast(getCrc16(generateGUID()))); + + AbstractPath dbPathTmpL = getNullPath(); + AbstractPath dbPathTmpR = getNullPath(); + ZEN_ON_SCOPE_EXIT( + try { if (!AFS::isNullPath(dbPathTmpL)) AFS::removeFilePlain(dbPathTmpL); } + catch (FileError&) {} + + try { if (!AFS::isNullPath(dbPathTmpR)) AFS::removeFilePlain(dbPathTmpR); } + catch (FileError&) {} + ); + + if (transactionalCopy && !AFS::hasNativeTransactionalCopy(dbPathL)) + { + AbstractPath dbPathTmpL2 = AFS::appendRelPath(*AFS::getParentPath(dbPathL), AFS::getItemName(dbPathL) + Zstr('.') + shortGuid + AFS::TEMP_FILE_ENDING); + saveStreams(streamsL, dbPathTmpL2, notifySaveL); //throw FileError, X + dbPathTmpL = dbPathTmpL2; + } + + if (transactionalCopy && !AFS::hasNativeTransactionalCopy(dbPathR)) + { + AbstractPath dbPathTmpR2 = AFS::appendRelPath(*AFS::getParentPath(dbPathR), AFS::getItemName(dbPathR) + Zstr('.') + shortGuid + AFS::TEMP_FILE_ENDING); + saveStreams(streamsR, dbPathTmpR2, notifySaveR); //throw FileError, X + dbPathTmpR = dbPathTmpR2; + } + + AFS::removeFileIfExists(dbPathL); //throw FileError + if (!AFS::isNullPath(dbPathTmpL)) + { + //operation finished: rename temp files -> this should work (almost) transactionally: + //if there were no write access, creation of temp files would have failed + AFS::moveAndRenameItem(dbPathTmpL, dbPathL); //throw FileError, (ErrorMoveUnsupported) + dbPathTmpL = getNullPath(); + } + else //some MTP devices don't even allow renaming files: https://freefilesync.org/forum/viewtopic.php?t=6531 + saveStreams(streamsL, dbPathL, notifySaveL); //throw FileError, X + + AFS::removeFileIfExists(dbPathR); //throw FileError + if (!AFS::isNullPath(dbPathTmpR)) + { + AFS::moveAndRenameItem(dbPathTmpR, dbPathR); //throw FileError, (ErrorMoveUnsupported) + dbPathTmpR = getNullPath(); + } + else + saveStreams(streamsR, dbPathR, notifySaveR); //throw FileError, X +#endif } diff --git a/FreeFileSync/Source/base/db_file.h b/FreeFileSync/Source/base/db_file.h index e3e4b4d3..ca747dd9 100644 --- a/FreeFileSync/Source/base/db_file.h +++ b/FreeFileSync/Source/base/db_file.h @@ -97,7 +97,7 @@ DEFINE_NEW_FILE_ERROR(FileErrorDatabaseNotExisting); std::shared_ptr loadLastSynchronousState(const BaseFolderPair& baseDirObj, //throw FileError, FileErrorDatabaseNotExisting -> return value always bound! const std::function& notifyStatus); -void saveLastSynchronousState(const BaseFolderPair& baseDirObj, //throw FileError, X +void saveLastSynchronousState(const BaseFolderPair& baseDirObj, bool transactionalCopy, //throw FileError, X const std::function& notifyStatus /*throw X*/); } diff --git a/FreeFileSync/Source/base/generate_logfile.cpp b/FreeFileSync/Source/base/generate_logfile.cpp deleted file mode 100644 index 33fc7739..00000000 --- a/FreeFileSync/Source/base/generate_logfile.cpp +++ /dev/null @@ -1,314 +0,0 @@ -// ***************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * -// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * -// ***************************************************************************** - -#include "generate_logfile.h" -#include -#include -#include "ffs_paths.h" -#include "../afs/concrete.h" - -using namespace zen; -using namespace fff; -using AFS = AbstractFileSystem; - - -namespace -{ -std::wstring generateLogHeader(const ProcessSummary& s, const ErrorLog& log, const std::wstring& finalStatusMsg) -{ - //assemble summary box - std::vector summary; - - const std::wstring tabSpace(4, L' '); //4, the one true space count for tabs - - const TimeComp tc = getLocalTime(std::chrono::system_clock::to_time_t(s.startTime)); //returns empty string on failure - - std::wstring headerLine = formatTime(FORMAT_DATE, tc) + L" [" + formatTime(FORMAT_TIME, tc) + L"]"; - if (!s.jobName.empty()) - headerLine += L" | " + s.jobName; - - summary.push_back(headerLine); - summary.push_back(L""); - summary.push_back(tabSpace + finalStatusMsg); - - - const int errorCount = log.getItemCount(MSG_TYPE_ERROR | MSG_TYPE_FATAL_ERROR); - const int warningCount = log.getItemCount(MSG_TYPE_WARNING); - - if (errorCount > 0) summary.push_back(tabSpace + _("Errors:") + L" " + formatNumber(errorCount)); - if (warningCount > 0) summary.push_back(tabSpace + _("Warnings:") + L" " + formatNumber(warningCount)); - - - std::wstring itemsProc = tabSpace + _("Items processed:") + L" " + formatNumber(s.statsProcessed.items); //show always, even if 0! - itemsProc += L" (" + formatFilesizeShort(s.statsProcessed.bytes) + L")"; - summary.push_back(itemsProc); - - if ((s.statsTotal.items < 0 && s.statsTotal.bytes < 0) || //no total items/bytes: e.g. for pure folder comparison - s.statsProcessed == s.statsTotal) //...if everything was processed successfully - ; - else - summary.push_back(tabSpace + _("Items remaining:") + - L" " + formatNumber (s.statsTotal.items - s.statsProcessed.items) + - L" (" + formatFilesizeShort(s.statsTotal.bytes - s.statsProcessed.bytes) + L")"); - - const int64_t totalTimeSec = std::chrono::duration_cast(s.totalTime).count(); - summary.push_back(tabSpace + _("Total time:") + L" " + copyStringTo(wxTimeSpan::Seconds(totalTimeSec).Format())); - - //calculate max width, this considers UTF-16, not Unicode code points...but maybe good idea? those 2-byte-UTF16 chars are usually wider than fixed-width chars anyway! - size_t sepLineLen = 0; - for (const std::wstring& str : summary) sepLineLen = std::max(sepLineLen, str.size()); - - std::wstring output(sepLineLen + 1, L'_'); - output += L'\n'; - - for (const std::wstring& str : summary) { output += L'|'; output += str; output += L'\n'; } - - output += L'|'; - output.append(sepLineLen, L'_'); - output += L'\n'; - - return output; -} - - -void streamToLogFile(const ProcessSummary& summary, //throw FileError - const ErrorLog& log, - const std::wstring& finalStatusLabel, - AFS::OutputStream& streamOut) -{ - auto fmtForTxtFile = [needLbReplace = !equalString(LINE_BREAK, '\n')](const std::wstring& str) - { - std::string utfStr = utfTo(str); - if (needLbReplace) - replace(utfStr, '\n', LINE_BREAK); - return utfStr; - }; - - std::string buffer = fmtForTxtFile(generateLogHeader(summary, log, finalStatusLabel)); //don't replace line break any earlier - - streamOut.write(&buffer[0], buffer.size()); //throw FileError, X - buffer.clear(); //flush out header if entry.empty() - - buffer += LINE_BREAK; - - for (const LogEntry& entry : log) - { - buffer += fmtForTxtFile(formatMessage(entry)); - buffer += LINE_BREAK; - - //write log items in blocks instead of creating one big string: memory allocation might fail; think 1 million entries! - streamOut.write(&buffer[0], buffer.size()); //throw FileError, X - buffer.clear(); - } -} - - -const int TIME_STAMP_LENGTH = 21; -const Zchar STATUS_BEGIN_TOKEN[] = Zstr(" ["); -const Zchar STATUS_END_TOKEN = Zstr(']'); - -//"Backup FreeFileSync 2013-09-15 015052.123.log" -> -//"Backup FreeFileSync 2013-09-15 015052.123 [Error].log" -AbstractPath saveNewLogFile(const ProcessSummary& summary, //throw FileError - const ErrorLog& log, - const AbstractPath& logFolderPath, - const std::function& notifyStatus /*throw X*/) -{ - //create logfile folder if required - AFS::createFolderIfMissingRecursion(logFolderPath); //throw FileError - - //const std::string colon = "\xcb\xb8"; //="modifier letter raised colon" => regular colon is forbidden in file names on Windows and OS X - //=> too many issues, most notably cmd.exe is not Unicode-aware: https://freefilesync.org/forum/viewtopic.php?t=1679 - - //assemble logfile name - const TimeComp tc = getLocalTime(std::chrono::system_clock::to_time_t(summary.startTime)); - if (tc == TimeComp()) - throw FileError(L"Failed to determine current time: " + numberTo(summary.startTime.time_since_epoch().count())); - - const auto timeMs = std::chrono::duration_cast(summary.startTime.time_since_epoch()).count() % 1000; - assert(std::chrono::duration_cast(summary.startTime.time_since_epoch()).count() == std::chrono::system_clock::to_time_t(summary.startTime)); - - Zstring logFileName; - - if (!summary.jobName.empty()) - logFileName += utfTo(summary.jobName) + Zstr(' '); - - logFileName += formatTime(Zstr("%Y-%m-%d %H%M%S"), tc) + - Zstr(".") + printNumber(Zstr("%03d"), static_cast(timeMs)); //[ms] should yield a fairly unique name - static_assert(TIME_STAMP_LENGTH == 21); - - const std::wstring failStatus = [&] - { - switch (summary.finalStatus) - { - case SyncResult::FINISHED_WITH_SUCCESS: - break; - case SyncResult::FINISHED_WITH_WARNINGS: - return _("Warning"); - case SyncResult::FINISHED_WITH_ERROR: - return _("Error"); - case SyncResult::ABORTED: - return _("Stopped"); - } - return std::wstring(); - }(); - - if (!failStatus.empty()) - logFileName += STATUS_BEGIN_TOKEN + utfTo(failStatus) + STATUS_END_TOKEN; - logFileName += Zstr(".log"); - - const AbstractPath logFilePath = AFS::appendRelPath(logFolderPath, logFileName); - - auto notifyUnbufferedIO = [notifyStatus, - bytesWritten_ = int64_t(0), - msg_ = replaceCpy(_("Saving file %x..."), L"%x", fmtPath(AFS::getDisplayPath(logFilePath)))] - (int64_t bytesDelta) mutable - { - if (notifyStatus) - notifyStatus(msg_ + L" (" + formatFilesizeShort(bytesWritten_ += bytesDelta) + L")"); //throw X - }; - - const std::wstring& finalStatusLabel = getFinalStatusLabel(summary.finalStatus); - - std::unique_ptr logFileStream = AFS::getOutputStream(logFilePath, std::nullopt /*streamSize*/, std::nullopt /*modTime*/, notifyUnbufferedIO); //throw FileError - streamToLogFile(summary, log, finalStatusLabel, *logFileStream); //throw FileError, X - logFileStream->finalize(); //throw FileError, X - - return logFilePath; -} - - -struct LogFileInfo -{ - AbstractPath filePath; - time_t timeStamp; - std::wstring jobName; //may be empty -}; -std::vector getLogFiles(const AbstractPath& logFolderPath) //throw FileError -{ - std::vector logfiles; - - AFS::traverseFolderFlat(logFolderPath, [&](const AFS::FileInfo& fi) //throw FileError - { - //"Backup FreeFileSync 2013-09-15 015052.123.log" - //"2013-09-15 015052.123 [Error].log" - static_assert(TIME_STAMP_LENGTH == 21); - - if (endsWith(fi.itemName, Zstr(".log"))) //case-sensitive: e.g. ".LOG" is not from FFS, right? - { - auto tsBegin = fi.itemName.begin(); - auto tsEnd = fi.itemName.end() - 4; - - if (tsBegin != tsEnd && tsEnd[-1] == STATUS_END_TOKEN) - tsEnd = searchLast(tsBegin, tsEnd, - std::begin(STATUS_BEGIN_TOKEN), std::end(STATUS_BEGIN_TOKEN) - 1); - - if (tsEnd - tsBegin >= TIME_STAMP_LENGTH && - tsEnd[-4] == Zstr('.') && - isdigit(tsEnd[-3]) && - isdigit(tsEnd[-2]) && - isdigit(tsEnd[-1])) - { - tsBegin = tsEnd - TIME_STAMP_LENGTH; - const TimeComp tc = parseTime(Zstr("%Y-%m-%d %H%M%S"), StringRef(tsBegin, tsBegin + 17)); //returns TimeComp() on error - const time_t t = localToTimeT(tc); //returns -1 on error - if (t != -1) - { - Zstring jobName(fi.itemName.begin(), tsBegin); - if (!jobName.empty()) - { - assert(jobName.size() >= 2 && jobName.end()[-1] == Zstr(' ')); - jobName.pop_back(); - } - - logfiles.push_back({ AFS::appendRelPath(logFolderPath, fi.itemName), t, utfTo(jobName) }); - } - } - } - }, - nullptr /*onFolder*/, //traverse only one level deep - nullptr /*onSymlink*/); - - return logfiles; -} - - -void limitLogfileCount(const AbstractPath& logFolderPath, //throw FileError - int logfilesMaxAgeDays, //<= 0 := no limit - const std::set& logFilePathsToKeep, - const std::function& notifyStatus) -{ - if (logfilesMaxAgeDays > 0) - { - if (notifyStatus) notifyStatus(_("Cleaning up log files:") + L" " + fmtPath(AFS::getDisplayPath(logFolderPath))); - - std::vector logFiles = getLogFiles(logFolderPath); //throw FileError - - const time_t lastMidnightTime = [] - { - TimeComp tc = getLocalTime(); //returns TimeComp() on error - tc.second = 0; - tc.minute = 0; - tc.hour = 0; - return localToTimeT(tc); //returns -1 on error => swallow => no versions trimmed by versionMaxAgeDays - }(); - const time_t cutOffTime = lastMidnightTime - static_cast(logfilesMaxAgeDays) * 24 * 3600; - - std::exception_ptr firstError; - - for (const LogFileInfo& lfi : logFiles) - if (lfi.timeStamp < cutOffTime && - logFilePathsToKeep.find(lfi.filePath) == logFilePathsToKeep.end()) //don't trim latest log files corresponding to last used config files! - //nitpicker's corner: what about path differences due to case? e.g. user-overriden log file path changed in case - { - if (notifyStatus) notifyStatus(_("Cleaning up log files:") + L" " + fmtPath(AFS::getDisplayPath(lfi.filePath))); - try - { - AFS::removeFilePlain(lfi.filePath); //throw FileError - } - catch (const FileError&) { if (!firstError) firstError = std::current_exception(); }; - } - - if (firstError) //late failure! - std::rethrow_exception(firstError); - } -} -} - - -Zstring fff::getDefaultLogFolderPath() { return getConfigDirPathPf() + Zstr("Logs") ; } - - -AbstractPath fff::saveLogFile(const ProcessSummary& summary, //throw FileError - const ErrorLog& log, - const Zstring& altLogFolderPathPhrase, //optional - int logfilesMaxAgeDays, - const std::set& logFilePathsToKeep, - const std::function& notifyStatus /*throw X*/) -{ - AbstractPath logFolderPath = createAbstractPath(altLogFolderPathPhrase); - if (AFS::isNullPath(logFolderPath)) - logFolderPath = createAbstractPath(getDefaultLogFolderPath()); - - AbstractPath logFilePath = getNullPath(); - std::exception_ptr firstError; - try - { - logFilePath = saveNewLogFile(summary, log, logFolderPath, notifyStatus); //throw FileError, X - } - catch (const FileError&) { if (!firstError) firstError = std::current_exception(); }; - - try - { - limitLogfileCount(logFolderPath, logfilesMaxAgeDays, logFilePathsToKeep, notifyStatus); //throw FileError, X - } - catch (const FileError&) { if (!firstError) firstError = std::current_exception(); }; - - if (firstError) //late failure! - std::rethrow_exception(firstError); - - return logFilePath; -} diff --git a/FreeFileSync/Source/base/generate_logfile.h b/FreeFileSync/Source/base/generate_logfile.h deleted file mode 100644 index 52cc7780..00000000 --- a/FreeFileSync/Source/base/generate_logfile.h +++ /dev/null @@ -1,30 +0,0 @@ -// ***************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * -// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * -// ***************************************************************************** - -#ifndef GENERATE_LOGFILE_H_931726432167489732164 -#define GENERATE_LOGFILE_H_931726432167489732164 - -#include -#include -#include "return_codes.h" -#include "status_handler.h" -#include "../afs/abstract.h" - - -namespace fff -{ -Zstring getDefaultLogFolderPath(); - - -AbstractPath saveLogFile(const ProcessSummary& summary, //throw FileError - const zen::ErrorLog& log, - const Zstring& altLogFolderPathPhrase, //optional - int logfilesMaxAgeDays, - const std::set& logFilePathsToKeep, - const std::function& notifyStatus /*throw X*/); -} - -#endif //GENERATE_LOGFILE_H_931726432167489732164 diff --git a/FreeFileSync/Source/base/icon_buffer.cpp b/FreeFileSync/Source/base/icon_buffer.cpp index 1fc89766..b5973c34 100644 --- a/FreeFileSync/Source/base/icon_buffer.cpp +++ b/FreeFileSync/Source/base/icon_buffer.cpp @@ -307,7 +307,7 @@ IconBuffer::IconBuffer(IconSize sz) : pimpl_(std::make_unique()), iconSize IconBuffer::~IconBuffer() { - setWorkload({}); //make sure interruption point is always reached! //needed??? + setWorkload({}); //make sure interruption point is always reached! needed??? pimpl_->worker.interrupt(); pimpl_->worker.join(); } diff --git a/FreeFileSync/Source/base/icon_loader.cpp b/FreeFileSync/Source/base/icon_loader.cpp index f7792118..b58d5a6d 100644 --- a/FreeFileSync/Source/base/icon_loader.cpp +++ b/FreeFileSync/Source/base/icon_loader.cpp @@ -9,6 +9,7 @@ #include #include + #include using namespace zen; @@ -17,24 +18,33 @@ using namespace fff; namespace { -ImageHolder copyToImageHolder(const GdkPixbuf* pixbuf) +static_assert(GTK_MAJOR_VERSION == 2, "FreeFileSync does NOT (currently) support GTK3! The GTK calls below will lead to crashes due to not being thread-safe on GTK3."); +//gdk_threads_enter(); + ZEN_ON_SCOPE_EXIT(::gdk_threads_leave); is NOT enough; e.g. GTK3 + openSuse still crashes with: +// Gtk:ERROR:gtkicontheme.c:4026:proxy_pixbuf_destroy: assertion failed: (icon_info->proxy_pixbuf != NULL) +//GTK icon theme internals: https://github.com/GNOME/gtk/blob/master/gtk/gtkicontheme.c +//Alternative: https://developer.gnome.org/gtk3/stable/GtkIconTheme.html#gtk-icon-info-load-icon-async +//GTK2 OTOH crashes only extremely rarely, still this must be fixed +warn_static("TODO: GTK / GDK not thread-safe! in particular gtk_icon_info_load_icon() is not!!!") + + +ImageHolder copyToImageHolder(const GdkPixbuf* pixBuf) { //see: https://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html - if (pixbuf && - ::gdk_pixbuf_get_colorspace(pixbuf) == GDK_COLORSPACE_RGB && - ::gdk_pixbuf_get_bits_per_sample(pixbuf) == 8) + if (pixBuf && + ::gdk_pixbuf_get_colorspace(pixBuf) == GDK_COLORSPACE_RGB && + ::gdk_pixbuf_get_bits_per_sample(pixBuf) == 8) { - const int channels = ::gdk_pixbuf_get_n_channels(pixbuf); + const int channels = ::gdk_pixbuf_get_n_channels(pixBuf); if (channels == 3 || channels == 4) { - const int stride = ::gdk_pixbuf_get_rowstride(pixbuf); - const unsigned char* rgbaSrc = ::gdk_pixbuf_get_pixels(pixbuf); + const int stride = ::gdk_pixbuf_get_rowstride(pixBuf); + const unsigned char* rgbaSrc = ::gdk_pixbuf_get_pixels(pixBuf); if (channels == 3) { - assert(!::gdk_pixbuf_get_has_alpha(pixbuf)); + assert(!::gdk_pixbuf_get_has_alpha(pixBuf)); - ImageHolder out(::gdk_pixbuf_get_width(pixbuf), ::gdk_pixbuf_get_height(pixbuf), false /*withAlpha*/); + ImageHolder out(::gdk_pixbuf_get_width(pixBuf), ::gdk_pixbuf_get_height(pixBuf), false /*withAlpha*/); unsigned char* rgbTrg = out.getRgb(); for (int y = 0; y < out.getHeight(); ++y) @@ -51,9 +61,9 @@ ImageHolder copyToImageHolder(const GdkPixbuf* pixbuf) } else if (channels == 4) { - assert(::gdk_pixbuf_get_has_alpha(pixbuf)); + assert(::gdk_pixbuf_get_has_alpha(pixBuf)); - ImageHolder out(::gdk_pixbuf_get_width(pixbuf), ::gdk_pixbuf_get_height(pixbuf), true /*withAlpha*/); + ImageHolder out(::gdk_pixbuf_get_width(pixBuf), ::gdk_pixbuf_get_height(pixBuf), true /*withAlpha*/); unsigned char* rgbTrg = out.getRgb(); unsigned char* alphaTrg = out.getAlpha(); @@ -82,11 +92,36 @@ ImageHolder imageHolderFromGicon(GIcon* gicon, int pixelSize) if (GtkIconTheme* defaultTheme = ::gtk_icon_theme_get_default()) //not owned! if (GtkIconInfo* iconInfo = ::gtk_icon_theme_lookup_by_gicon(defaultTheme, gicon, pixelSize, GTK_ICON_LOOKUP_USE_BUILTIN)) //this may fail if icon is not installed on system { +#if GTK_MAJOR_VERSION == 2 ZEN_ON_SCOPE_EXIT(::gtk_icon_info_free(iconInfo)); - if (GdkPixbuf* pixBuf = ::gtk_icon_info_load_icon(iconInfo, nullptr)) +#elif GTK_MAJOR_VERSION == 3 + ZEN_ON_SCOPE_EXIT(::g_object_unref(iconInfo)); +#else +#error unknown GTK version! +#endif + if (GdkPixbuf* pixBuf = ::gtk_icon_info_load_icon(iconInfo, nullptr /*error*/)) { - ZEN_ON_SCOPE_EXIT(::g_object_unref(pixBuf)); //supersedes "::gdk_pixbuf_unref"! - return copyToImageHolder(pixBuf); + ZEN_ON_SCOPE_EXIT(::g_object_unref(pixBuf)); + + //we might have to shrink the image (e.g. GTK3, openSUSE): "an icon theme may have icons that differ slightly from their nominal sizes" + const int width = ::gdk_pixbuf_get_width (pixBuf); + const int height = ::gdk_pixbuf_get_height(pixBuf); + + const int maxExtent = std::max(width, height); + if (pixelSize < maxExtent) + { + GdkPixbuf* pixBufShrinked = ::gdk_pixbuf_scale_simple(pixBuf, //const GdkPixbuf* src, + width * pixelSize / maxExtent, //int dest_width, + height * pixelSize / maxExtent, //int dest_height, + GDK_INTERP_BILINEAR); //GdkInterpType interp_type + if (!pixBufShrinked) + return ImageHolder(); + ZEN_ON_SCOPE_EXIT(::g_object_unref(pixBufShrinked)); + + return copyToImageHolder(pixBufShrinked); + } + else + return copyToImageHolder(pixBuf); } } return ImageHolder(); @@ -141,17 +176,21 @@ ImageHolder fff::genericDirIcon(int pixelSize) ImageHolder fff::getFileIcon(const Zstring& filePath, int pixelSize) { - //2. retrieve file icons - GFile* file = ::g_file_new_for_path(filePath.c_str()); //documented to "never fail" - ZEN_ON_SCOPE_EXIT(::g_object_unref(file)); - - if (GFileInfo* fileInfo = ::g_file_query_info(file, G_FILE_ATTRIBUTE_STANDARD_ICON, G_FILE_QUERY_INFO_NONE, nullptr, nullptr)) + try { - ZEN_ON_SCOPE_EXIT(::g_object_unref(fileInfo)); - if (GIcon* gicon = ::g_file_info_get_icon(fileInfo)) //not owned! - return imageHolderFromGicon(gicon, pixelSize); + GFile* file = ::g_file_new_for_path(filePath.c_str()); //documented to "never fail" + ZEN_ON_SCOPE_EXIT(::g_object_unref(file)); + + if (GFileInfo* fileInfo = ::g_file_query_info(file, G_FILE_ATTRIBUTE_STANDARD_ICON, G_FILE_QUERY_INFO_NONE, nullptr, nullptr)) + { + ZEN_ON_SCOPE_EXIT(::g_object_unref(fileInfo)); + if (GIcon* gicon = ::g_file_info_get_icon(fileInfo)) //not owned! + return imageHolderFromGicon(gicon, pixelSize); + } + //need fallback: icon lookup may fail because some icons are currently not present on system + } - //need fallback: icon lookup may fail because some icons are currently not present on system + catch (SysError&) { assert(false); } return ImageHolder(); } @@ -159,31 +198,36 @@ ImageHolder fff::getFileIcon(const Zstring& filePath, int pixelSize) ImageHolder fff::getThumbnailImage(const Zstring& filePath, int pixelSize) //return null icon on failure { - struct ::stat fileInfo = {}; - if (::stat(filePath.c_str(), &fileInfo) == 0) - if (!S_ISFIFO(fileInfo.st_mode)) //skip named pipes: else gdk_pixbuf_get_file_info() would hang forever! - { - gint width = 0; - gint height = 0; - if (/*GdkPixbufFormat* fmt =*/ ::gdk_pixbuf_get_file_info(filePath.c_str(), &width, &height)) - if (width > 0 && height > 0 && pixelSize > 0) - { - int trgWidth = width; - int trgHeight = height; - - const int maxExtent = std::max(width, height); //don't stretch small images, shrink large ones only! - if (pixelSize < maxExtent) + try + { + struct ::stat fileInfo = {}; + if (::stat(filePath.c_str(), &fileInfo) == 0) + if (!S_ISFIFO(fileInfo.st_mode)) //skip named pipes: else gdk_pixbuf_get_file_info() would hang forever! + { + gint width = 0; + gint height = 0; + if (/*GdkPixbufFormat* fmt =*/ ::gdk_pixbuf_get_file_info(filePath.c_str(), &width, &height)) + if (width > 0 && height > 0 && pixelSize > 0) { - trgWidth = width * pixelSize / maxExtent; - trgHeight = height * pixelSize / maxExtent; + int trgWidth = width; + int trgHeight = height; + + const int maxExtent = std::max(width, height); //don't stretch small images, shrink large ones only! + if (pixelSize < maxExtent) + { + trgWidth = width * pixelSize / maxExtent; + trgHeight = height * pixelSize / maxExtent; + } + if (GdkPixbuf* pixBuf = ::gdk_pixbuf_new_from_file_at_size(filePath.c_str(), trgWidth, trgHeight, nullptr)) + { + ZEN_ON_SCOPE_EXIT(::g_object_unref(pixBuf)); + return copyToImageHolder(pixBuf); + } } - if (GdkPixbuf* pixBuf = ::gdk_pixbuf_new_from_file_at_size(filePath.c_str(), trgWidth, trgHeight, nullptr)) - { - ZEN_ON_SCOPE_EXIT(::g_object_unref(pixBuf)); - return copyToImageHolder(pixBuf); - } - } - } + } + + } + catch (SysError&) { assert(false); } return ImageHolder(); } diff --git a/FreeFileSync/Source/base/localization.cpp b/FreeFileSync/Source/base/localization.cpp index 8dcfc0ee..06083e31 100644 --- a/FreeFileSync/Source/base/localization.cpp +++ b/FreeFileSync/Source/base/localization.cpp @@ -420,7 +420,10 @@ public: const bool sysLangIsRTL = sysLngInfo ? sysLngInfo->LayoutDirection == wxLayout_RightToLeft : false; const bool selectedLangIsRTL = selLngInfo ? selLngInfo->LayoutDirection == wxLayout_RightToLeft : false; - 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! + //wxWidgets shows a modal dialog on error during wxLocale::Init -> at least we can shut it up! + wxLog* oldLogTarget = wxLog::SetActiveTarget(new wxLogStderr); //transfer and receive ownership! + ZEN_ON_SCOPE_EXIT(delete wxLog::SetActiveTarget(oldLogTarget)); + if (sysLangIsRTL == selectedLangIsRTL) locale_->Init(wxLANGUAGE_DEFAULT); //use sys-lang to preserve sub-language specific rules (e.g. german swiss number punctuation) else diff --git a/FreeFileSync/Source/base/log_file.cpp b/FreeFileSync/Source/base/log_file.cpp new file mode 100644 index 00000000..5538880f --- /dev/null +++ b/FreeFileSync/Source/base/log_file.cpp @@ -0,0 +1,314 @@ +// ***************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * +// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * +// ***************************************************************************** + +#include "log_file.h" +#include +#include +#include "ffs_paths.h" +#include "../afs/concrete.h" + +using namespace zen; +using namespace fff; +using AFS = AbstractFileSystem; + + +namespace +{ +std::wstring generateLogHeader(const ProcessSummary& s, const ErrorLog& log, const std::wstring& finalStatusMsg) +{ + //assemble summary box + std::vector summary; + + const std::wstring tabSpace(4, L' '); //4, the one true space count for tabs + + const TimeComp tc = getLocalTime(std::chrono::system_clock::to_time_t(s.startTime)); //returns empty string on failure + + std::wstring headerLine = formatTime(FORMAT_DATE, tc) + L" [" + formatTime(FORMAT_TIME, tc) + L"]"; + if (!s.jobName.empty()) + headerLine += L" | " + s.jobName; + + summary.push_back(headerLine); + summary.push_back(L""); + summary.push_back(tabSpace + finalStatusMsg); + + + const int errorCount = log.getItemCount(MSG_TYPE_ERROR | MSG_TYPE_FATAL_ERROR); + const int warningCount = log.getItemCount(MSG_TYPE_WARNING); + + if (errorCount > 0) summary.push_back(tabSpace + _("Errors:") + L" " + formatNumber(errorCount)); + if (warningCount > 0) summary.push_back(tabSpace + _("Warnings:") + L" " + formatNumber(warningCount)); + + + std::wstring itemsProc = tabSpace + _("Items processed:") + L" " + formatNumber(s.statsProcessed.items); //show always, even if 0! + itemsProc += L" (" + formatFilesizeShort(s.statsProcessed.bytes) + L")"; + summary.push_back(itemsProc); + + if ((s.statsTotal.items < 0 && s.statsTotal.bytes < 0) || //no total items/bytes: e.g. for pure folder comparison + s.statsProcessed == s.statsTotal) //...if everything was processed successfully + ; + else + summary.push_back(tabSpace + _("Items remaining:") + + L" " + formatNumber (s.statsTotal.items - s.statsProcessed.items) + + L" (" + formatFilesizeShort(s.statsTotal.bytes - s.statsProcessed.bytes) + L")"); + + const int64_t totalTimeSec = std::chrono::duration_cast(s.totalTime).count(); + summary.push_back(tabSpace + _("Total time:") + L" " + copyStringTo(wxTimeSpan::Seconds(totalTimeSec).Format())); + + //calculate max width, this considers UTF-16, not Unicode code points...but maybe good idea? those 2-byte-UTF16 chars are usually wider than fixed-width chars anyway! + size_t sepLineLen = 0; + for (const std::wstring& str : summary) sepLineLen = std::max(sepLineLen, str.size()); + + std::wstring output(sepLineLen + 1, L'_'); + output += L'\n'; + + for (const std::wstring& str : summary) { output += L'|'; output += str; output += L'\n'; } + + output += L'|'; + output.append(sepLineLen, L'_'); + output += L'\n'; + + return output; +} + + +void streamToLogFile(const ProcessSummary& summary, //throw FileError + const ErrorLog& log, + const std::wstring& finalStatusLabel, + AFS::OutputStream& streamOut) +{ + auto fmtForTxtFile = [needLbReplace = !equalString(LINE_BREAK, '\n')](const std::wstring& str) + { + std::string utfStr = utfTo(str); + if (needLbReplace) + replace(utfStr, '\n', LINE_BREAK); + return utfStr; + }; + + std::string buffer = fmtForTxtFile(generateLogHeader(summary, log, finalStatusLabel)); //don't replace line break any earlier + + streamOut.write(&buffer[0], buffer.size()); //throw FileError, X + buffer.clear(); //flush out header if entry.empty() + + buffer += LINE_BREAK; + + for (const LogEntry& entry : log) + { + buffer += fmtForTxtFile(formatMessage(entry)); + buffer += LINE_BREAK; + + //write log items in blocks instead of creating one big string: memory allocation might fail; think 1 million entries! + streamOut.write(&buffer[0], buffer.size()); //throw FileError, X + buffer.clear(); + } +} + + +const int TIME_STAMP_LENGTH = 21; +const Zchar STATUS_BEGIN_TOKEN[] = Zstr(" ["); +const Zchar STATUS_END_TOKEN = Zstr(']'); + +//"Backup FreeFileSync 2013-09-15 015052.123.log" -> +//"Backup FreeFileSync 2013-09-15 015052.123 [Error].log" +AbstractPath saveNewLogFile(const ProcessSummary& summary, //throw FileError + const ErrorLog& log, + const AbstractPath& logFolderPath, + const std::function& notifyStatus /*throw X*/) +{ + //create logfile folder if required + AFS::createFolderIfMissingRecursion(logFolderPath); //throw FileError + + //const std::string colon = "\xcb\xb8"; //="modifier letter raised colon" => regular colon is forbidden in file names on Windows and OS X + //=> too many issues, most notably cmd.exe is not Unicode-aware: https://freefilesync.org/forum/viewtopic.php?t=1679 + + //assemble logfile name + const TimeComp tc = getLocalTime(std::chrono::system_clock::to_time_t(summary.startTime)); + if (tc == TimeComp()) + throw FileError(L"Failed to determine current time: " + numberTo(summary.startTime.time_since_epoch().count())); + + const auto timeMs = std::chrono::duration_cast(summary.startTime.time_since_epoch()).count() % 1000; + assert(std::chrono::duration_cast(summary.startTime.time_since_epoch()).count() == std::chrono::system_clock::to_time_t(summary.startTime)); + + Zstring logFileName; + + if (!summary.jobName.empty()) + logFileName += utfTo(summary.jobName) + Zstr(' '); + + logFileName += formatTime(Zstr("%Y-%m-%d %H%M%S"), tc) + + Zstr(".") + printNumber(Zstr("%03d"), static_cast(timeMs)); //[ms] should yield a fairly unique name + static_assert(TIME_STAMP_LENGTH == 21); + + const std::wstring failStatus = [&] + { + switch (summary.finalStatus) + { + case SyncResult::finishedSuccess: + break; + case SyncResult::finishedWarning: + return _("Warning"); + case SyncResult::finishedError: + return _("Error"); + case SyncResult::aborted: + return _("Stopped"); + } + return std::wstring(); + }(); + + if (!failStatus.empty()) + logFileName += STATUS_BEGIN_TOKEN + utfTo(failStatus) + STATUS_END_TOKEN; + logFileName += Zstr(".log"); + + const AbstractPath logFilePath = AFS::appendRelPath(logFolderPath, logFileName); + + auto notifyUnbufferedIO = [notifyStatus, + bytesWritten_ = int64_t(0), + msg_ = replaceCpy(_("Saving file %x..."), L"%x", fmtPath(AFS::getDisplayPath(logFilePath)))] + (int64_t bytesDelta) mutable + { + if (notifyStatus) + notifyStatus(msg_ + L" (" + formatFilesizeShort(bytesWritten_ += bytesDelta) + L")"); //throw X + }; + + const std::wstring& finalStatusLabel = getFinalStatusLabel(summary.finalStatus); + + std::unique_ptr logFileStream = AFS::getOutputStream(logFilePath, std::nullopt /*streamSize*/, std::nullopt /*modTime*/, notifyUnbufferedIO); //throw FileError + streamToLogFile(summary, log, finalStatusLabel, *logFileStream); //throw FileError, X + logFileStream->finalize(); //throw FileError, X + + return logFilePath; +} + + +struct LogFileInfo +{ + AbstractPath filePath; + time_t timeStamp; + std::wstring jobName; //may be empty +}; +std::vector getLogFiles(const AbstractPath& logFolderPath) //throw FileError +{ + std::vector logfiles; + + AFS::traverseFolderFlat(logFolderPath, [&](const AFS::FileInfo& fi) //throw FileError + { + //"Backup FreeFileSync 2013-09-15 015052.123.log" + //"2013-09-15 015052.123 [Error].log" + static_assert(TIME_STAMP_LENGTH == 21); + + if (endsWith(fi.itemName, Zstr(".log"))) //case-sensitive: e.g. ".LOG" is not from FFS, right? + { + auto tsBegin = fi.itemName.begin(); + auto tsEnd = fi.itemName.end() - 4; + + if (tsBegin != tsEnd && tsEnd[-1] == STATUS_END_TOKEN) + tsEnd = searchLast(tsBegin, tsEnd, + std::begin(STATUS_BEGIN_TOKEN), std::end(STATUS_BEGIN_TOKEN) - 1); + + if (tsEnd - tsBegin >= TIME_STAMP_LENGTH && + tsEnd[-4] == Zstr('.') && + isdigit(tsEnd[-3]) && + isdigit(tsEnd[-2]) && + isdigit(tsEnd[-1])) + { + tsBegin = tsEnd - TIME_STAMP_LENGTH; + const TimeComp tc = parseTime(Zstr("%Y-%m-%d %H%M%S"), StringRef(tsBegin, tsBegin + 17)); //returns TimeComp() on error + const time_t t = localToTimeT(tc); //returns -1 on error + if (t != -1) + { + Zstring jobName(fi.itemName.begin(), tsBegin); + if (!jobName.empty()) + { + assert(jobName.size() >= 2 && jobName.end()[-1] == Zstr(' ')); + jobName.pop_back(); + } + + logfiles.push_back({ AFS::appendRelPath(logFolderPath, fi.itemName), t, utfTo(jobName) }); + } + } + } + }, + nullptr /*onFolder*/, //traverse only one level deep + nullptr /*onSymlink*/); + + return logfiles; +} + + +void limitLogfileCount(const AbstractPath& logFolderPath, //throw FileError + int logfilesMaxAgeDays, //<= 0 := no limit + const std::set& logFilePathsToKeep, + const std::function& notifyStatus) +{ + if (logfilesMaxAgeDays > 0) + { + if (notifyStatus) notifyStatus(_("Cleaning up log files:") + L" " + fmtPath(AFS::getDisplayPath(logFolderPath))); + + std::vector logFiles = getLogFiles(logFolderPath); //throw FileError + + const time_t lastMidnightTime = [] + { + TimeComp tc = getLocalTime(); //returns TimeComp() on error + tc.second = 0; + tc.minute = 0; + tc.hour = 0; + return localToTimeT(tc); //returns -1 on error => swallow => no versions trimmed by versionMaxAgeDays + }(); + const time_t cutOffTime = lastMidnightTime - static_cast(logfilesMaxAgeDays) * 24 * 3600; + + std::exception_ptr firstError; + + for (const LogFileInfo& lfi : logFiles) + if (lfi.timeStamp < cutOffTime && + logFilePathsToKeep.find(lfi.filePath) == logFilePathsToKeep.end()) //don't trim latest log files corresponding to last used config files! + //nitpicker's corner: what about path differences due to case? e.g. user-overriden log file path changed in case + { + if (notifyStatus) notifyStatus(_("Cleaning up log files:") + L" " + fmtPath(AFS::getDisplayPath(lfi.filePath))); + try + { + AFS::removeFilePlain(lfi.filePath); //throw FileError + } + catch (const FileError&) { if (!firstError) firstError = std::current_exception(); }; + } + + if (firstError) //late failure! + std::rethrow_exception(firstError); + } +} +} + + +Zstring fff::getDefaultLogFolderPath() { return getConfigDirPathPf() + Zstr("Logs") ; } + + +AbstractPath fff::saveLogFile(const ProcessSummary& summary, //throw FileError + const ErrorLog& log, + const Zstring& altLogFolderPathPhrase, //optional + int logfilesMaxAgeDays, + const std::set& logFilePathsToKeep, + const std::function& notifyStatus /*throw X*/) +{ + AbstractPath logFolderPath = createAbstractPath(altLogFolderPathPhrase); + if (AFS::isNullPath(logFolderPath)) + logFolderPath = createAbstractPath(getDefaultLogFolderPath()); + + AbstractPath logFilePath = getNullPath(); + std::exception_ptr firstError; + try + { + logFilePath = saveNewLogFile(summary, log, logFolderPath, notifyStatus); //throw FileError, X + } + catch (const FileError&) { if (!firstError) firstError = std::current_exception(); }; + + try + { + limitLogfileCount(logFolderPath, logfilesMaxAgeDays, logFilePathsToKeep, notifyStatus); //throw FileError, X + } + catch (const FileError&) { if (!firstError) firstError = std::current_exception(); }; + + if (firstError) //late failure! + std::rethrow_exception(firstError); + + return logFilePath; +} diff --git a/FreeFileSync/Source/base/log_file.h b/FreeFileSync/Source/base/log_file.h new file mode 100644 index 00000000..52cc7780 --- /dev/null +++ b/FreeFileSync/Source/base/log_file.h @@ -0,0 +1,30 @@ +// ***************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 * +// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved * +// ***************************************************************************** + +#ifndef GENERATE_LOGFILE_H_931726432167489732164 +#define GENERATE_LOGFILE_H_931726432167489732164 + +#include +#include +#include "return_codes.h" +#include "status_handler.h" +#include "../afs/abstract.h" + + +namespace fff +{ +Zstring getDefaultLogFolderPath(); + + +AbstractPath saveLogFile(const ProcessSummary& summary, //throw FileError + const zen::ErrorLog& log, + const Zstring& altLogFolderPathPhrase, //optional + int logfilesMaxAgeDays, + const std::set& logFilePathsToKeep, + const std::function& notifyStatus /*throw X*/); +} + +#endif //GENERATE_LOGFILE_H_931726432167489732164 diff --git a/FreeFileSync/Source/base/parse_plural.h b/FreeFileSync/Source/base/parse_plural.h index 7d4971b0..770e4947 100644 --- a/FreeFileSync/Source/base/parse_plural.h +++ b/FreeFileSync/Source/base/parse_plural.h @@ -66,7 +66,7 @@ private: //--------------------------- implementation --------------------------- -//http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html +//https://www.gnu.org/software/hello/manual/gettext/Plural-forms.html //http://translate.sourceforge.net/wiki/l10n/pluralforms /* Grammar for Plural forms parser diff --git a/FreeFileSync/Source/base/process_callback.h b/FreeFileSync/Source/base/process_callback.h index bceec7b6..a89f9945 100644 --- a/FreeFileSync/Source/base/process_callback.h +++ b/FreeFileSync/Source/base/process_callback.h @@ -75,8 +75,8 @@ struct ProcessCallback //error handling: enum Response { - IGNORE_ERROR, - RETRY + ignoreError, + retry }; virtual Response reportError (const std::wstring& msg, size_t retryNumber) = 0; //throw X; recoverable error situation virtual void reportFatalError(const std::wstring& msg) = 0; //throw X; non-recoverable error situation diff --git a/FreeFileSync/Source/base/return_codes.h b/FreeFileSync/Source/base/return_codes.h index 9bbd2b11..a275a1a8 100644 --- a/FreeFileSync/Source/base/return_codes.h +++ b/FreeFileSync/Source/base/return_codes.h @@ -15,8 +15,8 @@ namespace fff enum FfsReturnCode //as returned after process exit { FFS_RC_SUCCESS = 0, - FFS_RC_FINISHED_WITH_WARNINGS, - FFS_RC_FINISHED_WITH_ERRORS, + FFS_RC_WARNING, + FFS_RC_ERROR, FFS_RC_ABORTED, FFS_RC_EXCEPTION, }; @@ -32,10 +32,10 @@ void raiseReturnCode(FfsReturnCode& rc, FfsReturnCode rcProposed) enum class SyncResult { - FINISHED_WITH_SUCCESS, - FINISHED_WITH_WARNINGS, - FINISHED_WITH_ERROR, - ABORTED, + finishedSuccess, + finishedWarning, + finishedError, + aborted, }; @@ -44,13 +44,13 @@ FfsReturnCode mapToReturnCode(SyncResult syncStatus) { switch (syncStatus) { - case SyncResult::FINISHED_WITH_SUCCESS: + case SyncResult::finishedSuccess: return FFS_RC_SUCCESS; - case SyncResult::FINISHED_WITH_WARNINGS: - return FFS_RC_FINISHED_WITH_WARNINGS; - case SyncResult::FINISHED_WITH_ERROR: - return FFS_RC_FINISHED_WITH_ERRORS; - case SyncResult::ABORTED: + case SyncResult::finishedWarning: + return FFS_RC_WARNING; + case SyncResult::finishedError: + return FFS_RC_ERROR; + case SyncResult::aborted: return FFS_RC_ABORTED; } assert(false); @@ -63,13 +63,13 @@ std::wstring getFinalStatusLabel(SyncResult finalStatus) { switch (finalStatus) { - case SyncResult::FINISHED_WITH_SUCCESS: + case SyncResult::finishedSuccess: return _("Completed successfully"); - case SyncResult::FINISHED_WITH_WARNINGS: + case SyncResult::finishedWarning: return _("Completed with warnings"); - case SyncResult::FINISHED_WITH_ERROR: + case SyncResult::finishedError: return _("Completed with errors"); - case SyncResult::ABORTED: + case SyncResult::aborted: return _("Stopped"); } assert(false); diff --git a/FreeFileSync/Source/base/status_handler.h b/FreeFileSync/Source/base/status_handler.h index b9857248..561e0cc7 100644 --- a/FreeFileSync/Source/base/status_handler.h +++ b/FreeFileSync/Source/base/status_handler.h @@ -72,7 +72,7 @@ struct Statistics struct ProcessSummary { std::chrono::system_clock::time_point startTime; - SyncResult finalStatus = SyncResult::ABORTED; + SyncResult finalStatus = SyncResult::aborted; std::wstring jobName; //may be empty ProgressStats statsProcessed; ProgressStats statsTotal; @@ -84,6 +84,11 @@ struct ProcessSummary class StatusHandler : public ProcessCallback, public AbortCallback, public Statistics { public: + StatusHandler() + { + updateData(statsTotal_, -1, -1); + } + //implement parts of ProcessCallback void initNewPhase(int itemsTotal, int64_t bytesTotal, Phase phase) override //(throw X) { diff --git a/FreeFileSync/Source/base/status_handler_impl.h b/FreeFileSync/Source/base/status_handler_impl.h index 3135753c..c3b32ca6 100644 --- a/FreeFileSync/Source/base/status_handler_impl.h +++ b/FreeFileSync/Source/base/status_handler_impl.h @@ -362,9 +362,9 @@ std::wstring tryReportingError(Function cmd /*throw FileError*/, Callback& cb /* assert(!e.toString().empty()); switch (cb.reportError(e.toString(), retryNumber)) //throw X { - case ProcessCallback::IGNORE_ERROR: + case ProcessCallback::ignoreError: return e.toString(); - case ProcessCallback::RETRY: + case ProcessCallback::retry: break; //continue with loop } } diff --git a/FreeFileSync/Source/base/synchronization.cpp b/FreeFileSync/Source/base/synchronization.cpp index fc13c8ca..bd407296 100644 --- a/FreeFileSync/Source/base/synchronization.cpp +++ b/FreeFileSync/Source/base/synchronization.cpp @@ -2454,7 +2454,7 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime if (!dependentFolders.empty()) { std::wstring msg = _("Some files will be synchronized as part of multiple base folders.") + L"\n" + - _("To avoid conflicts, set up exclude filters so that each updated file is considered by only one base folder.") + L"\n"; + _("To avoid conflicts, set up exclude filters so that each updated file is included by only one base folder.") + L"\n"; for (const AbstractPath& baseFolderPath : dependentFolders) msg += L"\n" + AFS::getDisplayPath(baseFolderPath); @@ -2553,7 +2553,7 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime try { if (folderPairCfg.saveSyncDB) - saveLastSynchronousState(baseFolder, //throw FileError + saveLastSynchronousState(baseFolder, failSafeFileCopy, //throw FileError [&](const std::wstring& statusMsg) { try { callback.reportStatus(statusMsg); /*throw X*/} catch (...) {}}); } catch (FileError&) {} @@ -2650,7 +2650,7 @@ void fff::synchronize(const std::chrono::system_clock::time_point& syncStartTime tryReportingError([&] { - saveLastSynchronousState(baseFolder, //throw FileError, X + saveLastSynchronousState(baseFolder, failSafeFileCopy, //throw FileError, X [&](const std::wstring& statusMsg) { callback.reportStatus(statusMsg); /*throw X*/}); }, callback); //throw X diff --git a/FreeFileSync/Source/base/versioning.cpp b/FreeFileSync/Source/base/versioning.cpp index dca988f1..1a2bf050 100644 --- a/FreeFileSync/Source/base/versioning.cpp +++ b/FreeFileSync/Source/base/versioning.cpp @@ -443,10 +443,10 @@ void fff::applyVersioningLimit(const std::set& folderLimi { switch (callback.reportError(msg, retryNumber)) //throw X { - case ProcessCallback::IGNORE_ERROR: + case ProcessCallback::ignoreError: return AFS::TraverserCallback::ON_ERROR_CONTINUE; - case ProcessCallback::RETRY: + case ProcessCallback::retry: return AFS::TraverserCallback::ON_ERROR_RETRY; } assert(false); diff --git a/FreeFileSync/Source/ui/abstract_folder_picker.cpp b/FreeFileSync/Source/ui/abstract_folder_picker.cpp index 5b336a02..fffb5e73 100644 --- a/FreeFileSync/Source/ui/abstract_folder_picker.cpp +++ b/FreeFileSync/Source/ui/abstract_folder_picker.cpp @@ -122,7 +122,7 @@ AbstractFolderPickerDlg::AbstractFolderPickerDlg(wxWindow* parent, AbstractPath& { findAndNavigateToExistingPath(*AFS::getParentPath(folderPath)); //let's run async while the error message is shown :) - showNotificationDialog(parent /*"this" not yet shown!*/, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(parent /*"this" not yet shown!*/, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } //---------------------------------------------------------------------- @@ -234,7 +234,7 @@ void AbstractFolderPickerDlg::populateNodeThen(const wxTreeItemId& itemId, const itemData2->errorMsg = result.errorMsg; if (popupErrors) - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(result.errorMsg)); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(result.errorMsg)); } itemData2->loadStatus = NodeLoadStatus::loaded; //set status *before* running callbacks diff --git a/FreeFileSync/Source/ui/batch_config.cpp b/FreeFileSync/Source/ui/batch_config.cpp index e0b248de..8240eed9 100644 --- a/FreeFileSync/Source/ui/batch_config.cpp +++ b/FreeFileSync/Source/ui/batch_config.cpp @@ -70,15 +70,15 @@ BatchDialog::BatchDialog(wxWindow* parent, BatchDialogConfig& dlgCfg) : { setStandardButtonLayout(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonSaveAs).setCancel(m_buttonCancel)); - m_staticTextHeader->SetLabel(replaceCpy(m_staticTextHeader->GetLabel(), L"%x", L"FreeFileSync.exe <" + _("job name") + L">.ffs_batch")); + m_staticTextHeader->SetLabel(replaceCpy(m_staticTextHeader->GetLabel(), L"%x", L"FreeFileSync.exe <" + _("configuration file") + L">.ffs_batch")); m_staticTextHeader->Wrap(fastFromDIP(520)); m_bitmapBatchJob->SetBitmap(getResourceImage(L"file_batch")); enumPostSyncAction_. - add(PostSyncAction::NONE, L""). - add(PostSyncAction::SLEEP, _("System: Sleep")). - add(PostSyncAction::SHUTDOWN, _("System: Shut down")); + add(PostSyncAction::none, L""). + add(PostSyncAction::sleep, _("System: Sleep")). + add(PostSyncAction::shutdown, _("System: Shut down")); setConfig(dlgCfg); @@ -117,10 +117,10 @@ void BatchDialog::setConfig(const BatchDialogConfig& dlgCfg) switch (dlgCfg.batchExCfg.batchErrorHandling) { - case BatchErrorHandling::SHOW_POPUP: + case BatchErrorHandling::showPopup: m_radioBtnErrorDialogShow->SetValue(true); break; - case BatchErrorHandling::CANCEL: + case BatchErrorHandling::cancel: m_radioBtnErrorDialogCancel->SetValue(true); break; } @@ -139,7 +139,7 @@ BatchDialogConfig BatchDialog::getConfig() const dlgCfg.ignoreErrors = m_checkBoxIgnoreErrors->GetValue(); - dlgCfg.batchExCfg.batchErrorHandling = m_radioBtnErrorDialogCancel->GetValue() ? BatchErrorHandling::CANCEL : BatchErrorHandling::SHOW_POPUP; + dlgCfg.batchExCfg.batchErrorHandling = m_radioBtnErrorDialogCancel->GetValue() ? BatchErrorHandling::cancel : BatchErrorHandling::showPopup; dlgCfg.batchExCfg.runMinimized = m_checkBoxRunMinimized->GetValue(); dlgCfg.batchExCfg.autoCloseSummary = m_checkBoxAutoClose ->GetValue(); dlgCfg.batchExCfg.postSyncAction = getEnumVal(enumPostSyncAction_, *m_choicePostSyncAction); diff --git a/FreeFileSync/Source/ui/batch_status_handler.cpp b/FreeFileSync/Source/ui/batch_status_handler.cpp index ddec33ec..cf2b249f 100644 --- a/FreeFileSync/Source/ui/batch_status_handler.cpp +++ b/FreeFileSync/Source/ui/batch_status_handler.cpp @@ -10,7 +10,7 @@ #include #include #include "../base/resolve_path.h" -#include "../base/generate_logfile.h" +#include "../base/log_file.h" #include "../afs/concrete.h" using namespace zen; @@ -32,20 +32,20 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress, batchErrorHandling_(batchErrorHandling), automaticRetryCount_(automaticRetryCount), automaticRetryDelay_(automaticRetryDelay), - progressDlg_(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, nullptr /*parentWindow*/, showProgress, autoCloseDialog, + progressDlg_(SyncProgressDialog::create([this] { userRequestAbort(); }, *this, nullptr /*parentWindow*/, showProgress, autoCloseDialog, startTime, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, [&] { switch (postSyncAction) { - case PostSyncAction::NONE: - return PostSyncAction2::NONE; - case PostSyncAction::SLEEP: - return PostSyncAction2::SLEEP; - case PostSyncAction::SHUTDOWN: - return PostSyncAction2::SHUTDOWN; + case PostSyncAction::none: + return PostSyncAction2::none; + case PostSyncAction::sleep: + return PostSyncAction2::sleep; + case PostSyncAction::shutdown: + return PostSyncAction2::shutdown; } assert(false); - return PostSyncAction2::NONE; + return PostSyncAction2::none; }())), jobName_(jobName), startTime_(startTime), @@ -68,7 +68,7 @@ BatchStatusHandler::Result BatchStatusHandler::reportFinalStatus(const Zstring& { const auto totalTime = std::chrono::duration_cast(std::chrono::system_clock::now() - startTime_); - if (progressDlg_) progressDlg_->timerSetStatus(false /*active*/); //keep correct summary window stats considering count down timer, system sleep + progressDlg_->timerSetStatus(false /*active*/); //keep correct summary window stats considering count down timer, system sleep //determine post-sync status irrespective of further errors during tear-down const SyncResult finalStatus = [&] @@ -76,19 +76,19 @@ BatchStatusHandler::Result BatchStatusHandler::reportFinalStatus(const Zstring& if (getAbortStatus()) { errorLog_.logMsg(_("Stopped"), MSG_TYPE_ERROR); //= user cancel; *not* a MSG_TYPE_FATAL_ERROR! - return SyncResult::ABORTED; + return SyncResult::aborted; } else if (errorLog_.getItemCount(MSG_TYPE_ERROR | MSG_TYPE_FATAL_ERROR) > 0) - return SyncResult::FINISHED_WITH_ERROR; + return SyncResult::finishedError; else if (errorLog_.getItemCount(MSG_TYPE_WARNING) > 0) - return SyncResult::FINISHED_WITH_WARNINGS; + return SyncResult::finishedWarning; if (getStatsTotal(currentPhase()) == ProgressStats()) errorLog_.logMsg(_("Nothing to synchronize"), MSG_TYPE_INFO); - return SyncResult::FINISHED_WITH_SUCCESS; + return SyncResult::finishedSuccess; }(); - assert(finalStatus == SyncResult::ABORTED || currentPhase() == PHASE_SYNCHRONIZING); + assert(finalStatus == SyncResult::aborted || currentPhase() == PHASE_SYNCHRONIZING); const ProcessSummary summary { @@ -109,13 +109,13 @@ BatchStatusHandler::Result BatchStatusHandler::reportFinalStatus(const Zstring& case PostSyncCondition::COMPLETION: return postSyncCommand_; case PostSyncCondition::ERRORS: - if (finalStatus == SyncResult::ABORTED || - finalStatus == SyncResult::FINISHED_WITH_ERROR) + if (finalStatus == SyncResult::aborted || + finalStatus == SyncResult::finishedError) return postSyncCommand_; break; case PostSyncCondition::SUCCESS: - if (finalStatus == SyncResult::FINISHED_WITH_WARNINGS || - finalStatus == SyncResult::FINISHED_WITH_SUCCESS) + if (finalStatus == SyncResult::finishedWarning || + finalStatus == SyncResult::finishedSuccess) return postSyncCommand_; break; } @@ -150,103 +150,83 @@ BatchStatusHandler::Result BatchStatusHandler::reportFinalStatus(const Zstring& } catch (const FileError& e) { errorLog_.logMsg(e.toString(), MSG_TYPE_ERROR); } - if (progressDlg_) - { - //post sync action - bool autoClose = false; - FinalRequest finalRequest = FinalRequest::none; + //post sync action + bool autoClose = false; + FinalRequest finalRequest = FinalRequest::none; - if (getAbortStatus() && *getAbortStatus() == AbortTrigger::USER) - ; //user cancelled => don't run post sync command! - else + if (getAbortStatus() && *getAbortStatus() == AbortTrigger::USER) + ; //user cancelled => don't run post sync command! + else + { + auto mayRunAfterCountDown = [&](const std::wstring& operationName) { - auto mayRunAfterCountDown = [&](const std::wstring& operationName) + auto notifyStatusThrowOnCancel = [&](const std::wstring& msg) { - auto notifyStatusThrowOnCancel = [&](const std::wstring& msg) + try { reportStatus(msg); /*throw AbortProcess*/ } + catch (...) { - try { reportStatus(msg); /*throw AbortProcess*/ } - catch (...) - { - if (getAbortStatus() && *getAbortStatus() == AbortTrigger::USER) - throw; - } - }; - - if (progressDlg_->getWindowIfVisible()) - try - { - delayAndCountDown(operationName, std::chrono::seconds(5), notifyStatusThrowOnCancel); //throw AbortProcess - } - catch (...) { return false; } - - return true; + if (getAbortStatus() && *getAbortStatus() == AbortTrigger::USER) + throw; + } }; - switch (progressDlg_->getOptionPostSyncAction()) - { - case PostSyncAction2::NONE: - autoClose = progressDlg_->getOptionAutoCloseDialog(); - break; - case PostSyncAction2::EXIT: - assert(false); - break; - case PostSyncAction2::SLEEP: - if (mayRunAfterCountDown(_("System: Sleep"))) - try - { - suspendSystem(); //throw FileError - autoClose = progressDlg_->getOptionAutoCloseDialog(); - } - catch (const FileError& e) { errorLog_.logMsg(e.toString(), MSG_TYPE_ERROR); } - break; - case PostSyncAction2::SHUTDOWN: - if (mayRunAfterCountDown(_("System: Shut down"))) - { - autoClose = true; - finalRequest = FinalRequest::shutdown; //system shutdown must be handled by calling context! - } - break; - } - } - if (switchToGuiRequested_) //-> avoid recursive yield() calls, thous switch not before ending batch mode - { - autoClose = true; - finalRequest = FinalRequest::switchGui; - } + if (progressDlg_->getWindowIfVisible()) + try + { + delayAndCountDown(operationName, std::chrono::seconds(5), notifyStatusThrowOnCancel); //throw AbortProcess + } + catch (...) { return false; } - auto errorLogFinal = std::make_shared(std::move(errorLog_)); + return true; + }; - //close progress dialog - if (autoClose) //warning: wxWindow::Show() is called within showSummary()! - progressDlg_->closeDirectly(true /*restoreParentFrame: n/a here*/); //progressDlg_ is main window => program will quit shortly after - else - //notify about (logical) application main window => program won't quit, but stay on this dialog - //setMainWindow(progressDlg_->getAsWindow()); -> not required anymore since we block waiting until dialog is closed below - progressDlg_->showSummary(finalStatus, errorLogFinal); - - //wait until progress dialog notified shutdown via onProgressDialogTerminate() - //-> required since it has our "this" pointer captured in lambda "notifyWindowTerminate"! - //-> nicely manages dialog lifetime - for (;;) + switch (progressDlg_->getOptionPostSyncAction()) { - wxTheApp->Yield(); //*first* refresh GUI (removing flicker) before sleeping! - if (!progressDlg_) break; - std::this_thread::sleep_for(UI_UPDATE_INTERVAL); + case PostSyncAction2::none: + autoClose = progressDlg_->getOptionAutoCloseDialog(); + break; + case PostSyncAction2::exit: + assert(false); + break; + case PostSyncAction2::sleep: + if (mayRunAfterCountDown(_("System: Sleep"))) + try + { + suspendSystem(); //throw FileError + autoClose = progressDlg_->getOptionAutoCloseDialog(); + } + catch (const FileError& e) { errorLog_.logMsg(e.toString(), MSG_TYPE_ERROR); } + break; + case PostSyncAction2::shutdown: + if (mayRunAfterCountDown(_("System: Shut down"))) + { + autoClose = true; + finalRequest = FinalRequest::shutdown; //system shutdown must be handled by calling context! + } + break; } - - return { finalStatus, finalRequest, logFilePath }; } - else - return { finalStatus, FinalRequest::none, logFilePath }; + if (switchToGuiRequested_) //-> avoid recursive yield() calls, thous switch not before ending batch mode + { + autoClose = true; + finalRequest = FinalRequest::switchGui; + } + + auto errorLogFinal = std::make_shared(std::move(errorLog_)); + progressDlg_->destroy(autoClose, + true /*restoreParentFrame: n/a here*/, + finalStatus, errorLogFinal); + progressDlg_ = nullptr; + return { finalStatus, finalRequest, logFilePath }; } void BatchStatusHandler::initNewPhase(int itemsTotal, int64_t bytesTotal, ProcessCallback::Phase phaseID) { StatusHandler::initNewPhase(itemsTotal, bytesTotal, phaseID); - if (progressDlg_) progressDlg_->initNewPhase(); //call after "StatusHandler::initNewPhase" + progressDlg_->initNewPhase(); //call after "StatusHandler::initNewPhase" forceUiRefresh(); //throw AbortProcess; OS X needs a full yield to update GUI and get rid of "dummy" texts } @@ -257,7 +237,7 @@ void BatchStatusHandler::updateDataProcessed(int itemsDelta, int64_t bytesDelta) StatusHandler::updateDataProcessed(itemsDelta, bytesDelta); //note: this method should NOT throw in order to properly allow undoing setting of statistics! - if (progressDlg_) progressDlg_->notifyProgressChange(); //noexcept + progressDlg_->notifyProgressChange(); //noexcept //for "curveDataBytes_->addRecord()" } @@ -270,7 +250,6 @@ void BatchStatusHandler::logInfo(const std::wstring& msg) void BatchStatusHandler::reportWarning(const std::wstring& msg, bool& warningActive) { - if (!progressDlg_) abortProcessNow(); //throw AbortProcess PauseTimers dummy(*progressDlg_); errorLog_.logMsg(msg, MSG_TYPE_WARNING); @@ -281,34 +260,33 @@ void BatchStatusHandler::reportWarning(const std::wstring& msg, bool& warningAct if (!progressDlg_->getOptionIgnoreErrors()) switch (batchErrorHandling_) { - case BatchErrorHandling::SHOW_POPUP: + case BatchErrorHandling::showPopup: { forceUiRefreshNoThrow(); //noexcept! => don't throw here when error occurs during clean up! - if (!progressDlg_) abortProcessNow(); //throw AbortProcess bool dontWarnAgain = false; - switch (showQuestionDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::WARNING, + switch (showQuestionDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(msg + L"\n\n" + _("You can switch to FreeFileSync's main window to resolve this issue.")). - setCheckBox(dontWarnAgain, _("&Don't show this warning again"), QuestionButton2::NO), + setCheckBox(dontWarnAgain, _("&Don't show this warning again"), QuestionButton2::no), _("&Ignore"), _("&Switch"))) { - case QuestionButton2::YES: //ignore + case QuestionButton2::yes: //ignore warningActive = !dontWarnAgain; break; - case QuestionButton2::NO: //switch + case QuestionButton2::no: //switch errorLog_.logMsg(_("Switching to FreeFileSync's main window"), MSG_TYPE_INFO); switchToGuiRequested_ = true; //treat as a special kind of cancel userAbortProcessNow(); //throw AbortProcess - case QuestionButton2::CANCEL: + case QuestionButton2::cancel: userAbortProcessNow(); //throw AbortProcess break; } } break; //keep it! last switch might not find match - case BatchErrorHandling::CANCEL: + case BatchErrorHandling::cancel: abortProcessNow(); //throw AbortProcess (not user-initiated!) break; } @@ -317,7 +295,6 @@ void BatchStatusHandler::reportWarning(const std::wstring& msg, bool& warningAct ProcessCallback::Response BatchStatusHandler::reportError(const std::wstring& msg, size_t retryNumber) { - if (!progressDlg_) abortProcessNow(); //throw AbortProcess PauseTimers dummy(*progressDlg_); //auto-retry @@ -326,7 +303,7 @@ ProcessCallback::Response BatchStatusHandler::reportError(const std::wstring& ms errorLog_.logMsg(msg + L"\n-> " + _("Automatic retry"), MSG_TYPE_INFO); delayAndCountDown(_("Automatic retry") + (automaticRetryCount_ <= 1 ? L"" : L" " + numberTo(retryNumber + 1) + L"/" + numberTo(automaticRetryCount_)), automaticRetryDelay_, [&](const std::wstring& statusMsg) { this->reportStatus(_("Error") + L": " + statusMsg); }); //throw AbortProcess - return ProcessCallback::RETRY; + return ProcessCallback::retry; } //always, except for "retry": @@ -336,50 +313,48 @@ ProcessCallback::Response BatchStatusHandler::reportError(const std::wstring& ms { switch (batchErrorHandling_) { - case BatchErrorHandling::SHOW_POPUP: + case BatchErrorHandling::showPopup: { forceUiRefreshNoThrow(); //noexcept! => don't throw here when error occurs during clean up! - if (!progressDlg_) abortProcessNow(); //throw AbortProcess - switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::ERROR2, + switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::error, PopupDialogCfg().setDetailInstructions(msg), _("&Ignore"), _("Ignore &all"), _("&Retry"))) { - case ConfirmationButton3::ACCEPT: //ignore - return ProcessCallback::IGNORE_ERROR; + case ConfirmationButton3::accept: //ignore + return ProcessCallback::ignoreError; - case ConfirmationButton3::ACCEPT_ALL: //ignore all + case ConfirmationButton3::acceptAll: //ignore all progressDlg_->setOptionIgnoreErrors(true); - return ProcessCallback::IGNORE_ERROR; + return ProcessCallback::ignoreError; - case ConfirmationButton3::DECLINE: //retry + case ConfirmationButton3::decline: //retry guardWriteLog.dismiss(); errorLog_.logMsg(msg + L"\n-> " + _("Retrying operation..."), MSG_TYPE_INFO); - return ProcessCallback::RETRY; + return ProcessCallback::retry; - case ConfirmationButton3::CANCEL: + case ConfirmationButton3::cancel: userAbortProcessNow(); //throw AbortProcess break; } } break; //used if last switch didn't find a match - case BatchErrorHandling::CANCEL: + case BatchErrorHandling::cancel: abortProcessNow(); //throw AbortProcess (not user-initiated!) break; } } else - return ProcessCallback::IGNORE_ERROR; + return ProcessCallback::ignoreError; assert(false); - return ProcessCallback::IGNORE_ERROR; //dummy value + return ProcessCallback::ignoreError; //dummy value } void BatchStatusHandler::reportFatalError(const std::wstring& msg) { - if (!progressDlg_) abortProcessNow(); //throw AbortProcess PauseTimers dummy(*progressDlg_); errorLog_.logMsg(msg, MSG_TYPE_FATAL_ERROR); @@ -387,31 +362,30 @@ void BatchStatusHandler::reportFatalError(const std::wstring& msg) if (!progressDlg_->getOptionIgnoreErrors()) switch (batchErrorHandling_) { - case BatchErrorHandling::SHOW_POPUP: + case BatchErrorHandling::showPopup: { forceUiRefreshNoThrow(); //noexcept! => don't throw here when error occurs during clean up! - if (!progressDlg_) abortProcessNow(); //throw AbortProcess - switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::ERROR2, + switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::error, PopupDialogCfg().setTitle(_("Serious Error")). setDetailInstructions(msg), _("&Ignore"), _("Ignore &all"))) { - case ConfirmationButton2::ACCEPT: + case ConfirmationButton2::accept: break; - case ConfirmationButton2::ACCEPT_ALL: + case ConfirmationButton2::acceptAll: progressDlg_->setOptionIgnoreErrors(true); break; - case ConfirmationButton2::CANCEL: + case ConfirmationButton2::cancel: userAbortProcessNow(); //throw AbortProcess break; } } break; - case BatchErrorHandling::CANCEL: + case BatchErrorHandling::cancel: abortProcessNow(); //throw AbortProcess (not user-initiated!) break; } @@ -420,12 +394,5 @@ void BatchStatusHandler::reportFatalError(const std::wstring& msg) void BatchStatusHandler::forceUiRefreshNoThrow() { - if (progressDlg_) - progressDlg_->updateGui(); -} - - -void BatchStatusHandler::onProgressDialogTerminate() -{ - progressDlg_ = nullptr; + progressDlg_->updateGui(); } diff --git a/FreeFileSync/Source/ui/batch_status_handler.h b/FreeFileSync/Source/ui/batch_status_handler.h index b8b8e25d..d3bee240 100644 --- a/FreeFileSync/Source/ui/batch_status_handler.h +++ b/FreeFileSync/Source/ui/batch_status_handler.h @@ -58,21 +58,14 @@ public: Result reportFinalStatus(const Zstring& altLogFolderPathPhrase, int logfilesMaxAgeDays, const std::set& logFilePathsToKeep); //noexcept!! private: - void onProgressDialogTerminate(); - bool switchToGuiRequested_ = false; - const BatchErrorHandling batchErrorHandling_; zen::ErrorLog errorLog_; //list of non-resolved errors and warnings - const size_t automaticRetryCount_; const std::chrono::seconds automaticRetryDelay_; - - SyncProgressDialog* progressDlg_; //managed to have shorter lifetime than this handler! - + SyncProgressDialog* progressDlg_; //managed to have the same lifetime as this handler! const std::wstring jobName_; const std::chrono::system_clock::time_point startTime_; - const Zstring postSyncCommand_; const PostSyncCondition postSyncCondition_; }; diff --git a/FreeFileSync/Source/ui/cfg_grid.cpp b/FreeFileSync/Source/ui/cfg_grid.cpp index 5f368aca..dfceed07 100644 --- a/FreeFileSync/Source/ui/cfg_grid.cpp +++ b/FreeFileSync/Source/ui/cfg_grid.cpp @@ -129,7 +129,7 @@ void ConfigView::setLastRunStats(const std::vector& filePaths, const La assert(it != cfgList_.end()); if (it != cfgList_.end()) { - if (lastRun.result != SyncResult::ABORTED) + if (lastRun.result != SyncResult::aborted) it->second.cfgItem.lastSyncTime = lastRun.lastRunTime; if (!AFS::isNullPath(lastRun.logFilePath)) @@ -367,12 +367,12 @@ private: { switch (item->cfgItem.logResult) { - case SyncResult::FINISHED_WITH_SUCCESS: + case SyncResult::finishedSuccess: return getResourceImage(L"msg_finished_sicon"); - case SyncResult::FINISHED_WITH_WARNINGS: + case SyncResult::finishedWarning: return getResourceImage(L"msg_warning_sicon"); - case SyncResult::FINISHED_WITH_ERROR: - case SyncResult::ABORTED: + case SyncResult::finishedError: + case SyncResult::aborted: return getResourceImage(L"msg_error_sicon"); } assert(false); @@ -529,7 +529,7 @@ private: assert(false); assert(!AFS::isNullPath(item->cfgItem.logFilePath)); //see getRowMouseHover() } - catch (const FileError& e) { showNotificationDialog(&grid_, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); } + catch (const FileError& e) { showNotificationDialog(&grid_, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } return; } event.Skip(); diff --git a/FreeFileSync/Source/ui/cfg_grid.h b/FreeFileSync/Source/ui/cfg_grid.h index e23ef887..628c5400 100644 --- a/FreeFileSync/Source/ui/cfg_grid.h +++ b/FreeFileSync/Source/ui/cfg_grid.h @@ -31,7 +31,7 @@ struct ConfigFileItem Zstring cfgFilePath; time_t lastSyncTime = 0; //last COMPLETED sync (aborted syncs don't count) AbstractPath logFilePath = getNullPath(); //ANY last sync attempt (including aborted syncs) - SyncResult logResult = SyncResult::ABORTED; // + SyncResult logResult = SyncResult::aborted; // }; @@ -97,7 +97,7 @@ public: struct LastRunStats { time_t lastRunTime = 0; - SyncResult result = SyncResult::ABORTED; + SyncResult result = SyncResult::aborted; AbstractPath logFilePath; //optional }; void setLastRunStats(const std::vector& filePaths, const LastRunStats& lastRun); diff --git a/FreeFileSync/Source/ui/command_box.cpp b/FreeFileSync/Source/ui/command_box.cpp index 2ef53a51..6e769bb7 100644 --- a/FreeFileSync/Source/ui/command_box.cpp +++ b/FreeFileSync/Source/ui/command_box.cpp @@ -19,10 +19,10 @@ using namespace fff; namespace { inline -std::wstring getSeparationLine() { return std::wstring(50, EM_DASH); } //no space between dashes! +wxString getSeparationLine() { return std::wstring(50, EM_DASH); } //no space between dashes! -std::vector> getDefaultCommands() //(description/command) pairs +std::vector> getDefaultCommands() //(description/command) pairs { return { @@ -31,7 +31,7 @@ std::vector> getDefaultCommands() //(descriptio } -const wxEventType wxEVT_VALIDATE_USER_SELECTION = wxNewEventType(); +const wxEventType EVENT_VALIDATE_USER_SELECTION = wxNewEventType(); } @@ -57,7 +57,7 @@ CommandBox::CommandBox(wxWindow* parent, Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(CommandBox::OnSelection ), nullptr, this); Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (CommandBox::OnMouseWheel), nullptr, this); - Connect(wxEVT_VALIDATE_USER_SELECTION, wxCommandEventHandler(CommandBox::OnValidateSelection), nullptr, this); + Connect(EVENT_VALIDATE_USER_SELECTION, wxCommandEventHandler(CommandBox::OnValidateSelection), nullptr, this); } @@ -92,16 +92,16 @@ Zstring CommandBox::getValue() const void CommandBox::setValue(const Zstring& value) { - setValueAndUpdateList(trimCpy(utfTo(value))); + setValueAndUpdateList(trimCpy(utfTo(value))); } //set value and update list are technically entangled: see potential bug description below -void CommandBox::setValueAndUpdateList(const std::wstring& value) +void CommandBox::setValueAndUpdateList(const wxString& value) { //it may be a little lame to update the list on each mouse-button click, but it should be working and we dont't have to manipulate wxComboBox internals - std::deque items; + std::vector items; //1. built in commands for (const auto& [description, cmd] : defaultCommands_) @@ -115,23 +115,23 @@ void CommandBox::setValueAndUpdateList(const std::wstring& value) items.push_back(getSeparationLine()); for (const Zstring& hist : histSorted) - items.push_back(utfTo(hist)); + items.push_back(utfTo(hist)); //attention: if the target value is not part of the dropdown list, SetValue() will look for a string that *starts with* this value: //e.g. if the dropdown list contains "222" SetValue("22") will erroneously set and select "222" instead, while "111" would be set correctly! // -> by design on Windows! if (std::find(items.begin(), items.end(), value) == items.end()) { - if (!value.empty()) - items.push_front(getSeparationLine()); - items.push_front(value); + if (!items.empty() && !value.empty()) + items.insert(items.begin(), { value, getSeparationLine() }); + else + items.insert(items.begin(), { value }); } //this->Clear(); -> NO! emits yet another wxEVT_COMMAND_TEXT_UPDATED!!! wxItemContainer::Clear(); //suffices to clear the selection items only! + this->Append(items); - for (const std::wstring& item : items) - this->Append(item); //this->SetSelection(wxNOT_FOUND); //don't select anything ChangeValue(value); //preserve main text! } @@ -139,9 +139,9 @@ void CommandBox::setValueAndUpdateList(const std::wstring& value) void CommandBox::OnSelection(wxCommandEvent& event) { - wxCommandEvent dummy2(wxEVT_VALIDATE_USER_SELECTION); //we cannot replace built-in commands at this position in call stack, so defer to a later time! + wxCommandEvent dummy(EVENT_VALIDATE_USER_SELECTION); //we cannot replace built-in commands at this position in call stack, so defer to a later time! if (auto handler = GetEventHandler()) - handler->AddPendingEvent(dummy2); + handler->AddPendingEvent(dummy); event.Skip(); } @@ -149,14 +149,14 @@ void CommandBox::OnSelection(wxCommandEvent& event) void CommandBox::OnValidateSelection(wxCommandEvent& event) { - const auto value = copyStringTo(GetValue()); + const wxString value = GetValue(); if (value == getSeparationLine()) - return setValueAndUpdateList(std::wstring()); + return setValueAndUpdateList(wxString()); for (const auto& [description, cmd] : defaultCommands_) if (description == value) - return setValueAndUpdateList(utfTo(cmd)); //replace GUI name by actual command string + return setValueAndUpdateList(utfTo(cmd)); //replace GUI name by actual command string } diff --git a/FreeFileSync/Source/ui/command_box.h b/FreeFileSync/Source/ui/command_box.h index ddc6f7d0..5cc152fb 100644 --- a/FreeFileSync/Source/ui/command_box.h +++ b/FreeFileSync/Source/ui/command_box.h @@ -48,12 +48,12 @@ private: void OnValidateSelection(wxCommandEvent& event); void OnUpdateList(wxEvent& event); - void setValueAndUpdateList(const std::wstring& value); + void setValueAndUpdateList(const wxString& value); std::vector history_; size_t historyMax_ = 0; - const std::vector> defaultCommands_; + const std::vector> defaultCommands_; }; } diff --git a/FreeFileSync/Source/ui/file_grid.cpp b/FreeFileSync/Source/ui/file_grid.cpp index a4b15a58..c115d1a0 100644 --- a/FreeFileSync/Source/ui/file_grid.cpp +++ b/FreeFileSync/Source/ui/file_grid.cpp @@ -128,23 +128,23 @@ class GridDataRight; struct IconManager { IconManager(GridDataLeft& provLeft, GridDataRight& provRight, IconBuffer::IconSize sz) : - iconBuffer(sz), - dirIcon (IconBuffer::genericDirIcon (sz)), - linkOverlayIcon(IconBuffer::linkOverlayIcon(sz)), - iconUpdater(std::make_unique(provLeft, provRight, iconBuffer)) {} + iconBuffer_(sz), + dirIcon_ (IconBuffer::genericDirIcon (sz)), + linkOverlayIcon_(IconBuffer::linkOverlayIcon(sz)), + iconUpdater_(std::make_unique(provLeft, provRight, iconBuffer_)) {} void startIconUpdater(); - IconBuffer& refIconBuffer() { return iconBuffer; } + IconBuffer& refIconBuffer() { return iconBuffer_; } - const wxBitmap& getGenericDirIcon () const { return dirIcon; } - const wxBitmap& getLinkOverlayIcon() const { return linkOverlayIcon; } + const wxBitmap& getGenericDirIcon () const { return dirIcon_; } + const wxBitmap& getLinkOverlayIcon() const { return linkOverlayIcon_; } private: - IconBuffer iconBuffer; - const wxBitmap dirIcon; - const wxBitmap linkOverlayIcon; + IconBuffer iconBuffer_; + const wxBitmap dirIcon_; + const wxBitmap linkOverlayIcon_; - std::unique_ptr iconUpdater; //bind ownership to GridDataRim<>! + std::unique_ptr iconUpdater_; //bind ownership to GridDataRim<>! }; //######################################################################################################## @@ -1658,7 +1658,7 @@ private: //resolve circular linker dependencies inline -void IconManager::startIconUpdater() { if (iconUpdater) iconUpdater->start(); } +void IconManager::startIconUpdater() { if (iconUpdater_) iconUpdater_->start(); } } diff --git a/FreeFileSync/Source/ui/folder_history_box.cpp b/FreeFileSync/Source/ui/folder_history_box.cpp index 932e6730..2b824b1f 100644 --- a/FreeFileSync/Source/ui/folder_history_box.cpp +++ b/FreeFileSync/Source/ui/folder_history_box.cpp @@ -64,7 +64,9 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& folderPathPhrase) { //allow user changing to volume name and back, if possible std::vector aliases = getFolderPathAliases(utfTo(folderPathPhrase)); //may block when resolving [] - std::transform(aliases.begin(), aliases.end(), std::back_inserter(dirList), [](const Zstring& str) { return utfTo(str); }); + + for (const Zstring& str : aliases) + dirList.push_back(utfTo(str)); } if (sharedHistory_.get()) { @@ -74,7 +76,8 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& folderPathPhrase) if (!dirList.empty() && !tmp.empty()) dirList.push_back(FolderHistory::separationLine()); - std::transform(tmp.begin(), tmp.end(), std::back_inserter(dirList), [](const Zstring& str) { return utfTo(str); }); + for (const Zstring& str : tmp) + dirList.push_back(utfTo(str)); } //########################################################################################### @@ -87,11 +90,10 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& folderPathPhrase) //this->Clear(); -> NO! emits yet another wxEVT_COMMAND_TEXT_UPDATED!!! wxItemContainer::Clear(); //suffices to clear the selection items only! + this->Append(dirList); - for (const wxString& dir : dirList) - this->Append(dir); //this->SetSelection(wxNOT_FOUND); //don't select anything - ChangeValue(folderPathPhrase); //preserve main text! + ChangeValue(folderPathPhrase); //preserve main text! } diff --git a/FreeFileSync/Source/ui/folder_selector.h b/FreeFileSync/Source/ui/folder_selector.h index 2e4c4073..975ef75a 100644 --- a/FreeFileSync/Source/ui/folder_selector.h +++ b/FreeFileSync/Source/ui/folder_selector.h @@ -20,7 +20,7 @@ namespace fff //handle drag and drop, tooltip, label and manual input, coordinating a wxWindow, wxButton, and wxComboBox/wxTextCtrl /* Reasons NOT to use wxDirPickerCtrl, but wxButton instead: - - Crash on GTK 2: http://favapps.wordpress.com/2012/06/11/freefilesync-crash-in-linux-when-syncing-solved/ + - Crash on GTK 2: https://favapps.wordpress.com/2012/06/11/freefilesync-crash-in-linux-when-syncing-solved/ - still uses outdated ::SHBrowseForFolder() (even on Windows 7) - selection dialog remembers size, but NOT position => if user enlarges window, the next time he opens the dialog it may leap out of visible screen - hard-codes "Browse" button label diff --git a/FreeFileSync/Source/ui/gui_generated.cpp b/FreeFileSync/Source/ui/gui_generated.cpp index e4243dee..d8e104bc 100644 --- a/FreeFileSync/Source/ui/gui_generated.cpp +++ b/FreeFileSync/Source/ui/gui_generated.cpp @@ -620,124 +620,122 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const bSizer42 = new wxBoxSizer( wxHORIZONTAL ); m_bitmapLogStatus = new wxStaticBitmap( m_panelLog, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - bSizer42->Add( m_bitmapLogStatus, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 10 ); + bSizer42->Add( m_bitmapLogStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); m_staticTextLogStatus = new wxStaticText( m_panelLog, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextLogStatus->Wrap( -1 ); m_staticTextLogStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer42->Add( m_staticTextLogStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer42->Add( m_staticTextLogStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - m_panelItemsProcessed = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer165; - bSizer165 = new wxBoxSizer( wxVERTICAL ); - - - bSizer165->Add( 0, 5, 0, 0, 5 ); + bSizer42->Add( 10, 0, 0, 0, 5 ); - wxStaticText* m_staticText962; - m_staticText962 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText962->Wrap( -1 ); - bSizer165->Add( m_staticText962, 0, wxRIGHT|wxLEFT, 5 ); + ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer169; - bSizer169 = new wxBoxSizer( wxHORIZONTAL ); + m_staticTextProcessed = new wxStaticText( m_panelLog, wxID_ANY, _("Processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextProcessed->Wrap( -1 ); + ffgSizer11->Add( m_staticTextProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); - m_staticTextItemsProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextItemsProcessed->Wrap( -1 ); - m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextRemaining = new wxStaticText( m_panelLog, wxID_ANY, _("Remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRemaining->Wrap( -1 ); + ffgSizer11->Add( m_staticTextRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer169->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 ); - m_staticTextBytesProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextBytesProcessed->Wrap( -1 ); - bSizer169->Add( m_staticTextBytesProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + bSizer42->Add( ffgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); + m_panelItemStats = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelItemStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - bSizer165->Add( bSizer169, 0, wxRIGHT|wxLEFT, 5 ); + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxVERTICAL ); + ffgSizer111 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer111->SetFlexibleDirection( wxBOTH ); + ffgSizer111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - bSizer165->Add( 0, 5, 0, 0, 5 ); + wxBoxSizer* bSizer293; + bSizer293 = new wxBoxSizer( wxHORIZONTAL ); + m_bitmapItemStat = new wxStaticBitmap( m_panelItemStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer293->Add( m_bitmapItemStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_panelItemsProcessed->SetSizer( bSizer165 ); - m_panelItemsProcessed->Layout(); - bSizer165->Fit( m_panelItemsProcessed ); - bSizer42->Add( m_panelItemsProcessed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 ); - m_panelItemsRemaining = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + bSizer293->Add( 0, 0, 1, 0, 5 ); - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); + m_staticTextItemsProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_staticTextItemsProcessed->Wrap( -1 ); + m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + bSizer293->Add( m_staticTextItemsProcessed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer166->Add( 0, 5, 0, 0, 5 ); - wxStaticText* m_staticText971; - m_staticText971 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText971->Wrap( -1 ); - bSizer166->Add( m_staticText971, 0, wxRIGHT|wxLEFT, 5 ); + ffgSizer111->Add( bSizer293, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - wxBoxSizer* bSizer170; - bSizer170 = new wxBoxSizer( wxHORIZONTAL ); + m_staticTextBytesProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesProcessed->Wrap( -1 ); + ffgSizer111->Add( m_staticTextBytesProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); - m_staticTextItemsRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_staticTextItemsRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_staticTextItemsRemaining->Wrap( -1 ); m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer170->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 ); + ffgSizer111->Add( m_staticTextItemsRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextBytesRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextBytesRemaining->Wrap( -1 ); - bSizer170->Add( m_staticTextBytesRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + ffgSizer111->Add( m_staticTextBytesRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer166->Add( bSizer170, 0, wxRIGHT|wxLEFT, 5 ); + bSizer291->Add( ffgSizer111, 0, wxALL, 5 ); - bSizer166->Add( 0, 5, 0, 0, 5 ); + m_panelItemStats->SetSizer( bSizer291 ); + m_panelItemStats->Layout(); + bSizer291->Fit( m_panelItemStats ); + bSizer42->Add( m_panelItemStats, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + m_panelTimeStats = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelTimeStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - m_panelItemsRemaining->SetSizer( bSizer166 ); - m_panelItemsRemaining->Layout(); - bSizer166->Fit( m_panelItemsRemaining ); - bSizer42->Add( m_panelItemsRemaining, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 ); + wxBoxSizer* bSizer292; + bSizer292 = new wxBoxSizer( wxVERTICAL ); - wxPanel* m_panelTimeElapsed; - m_panelTimeElapsed = new wxPanel( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + ffgSizer112 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer112->SetFlexibleDirection( wxBOTH ); + ffgSizer112->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer168; - bSizer168 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer294; + bSizer294 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapTimeStat = new wxStaticBitmap( m_panelTimeStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer294->Add( m_bitmapTimeStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer168->Add( 0, 5, 0, 0, 5 ); + bSizer294->Add( 0, 0, 1, 0, 5 ); + + m_staticTextTimeElapsed = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - wxStaticText* m_staticText9611; - m_staticText9611 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Total time:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText9611->Wrap( -1 ); - bSizer168->Add( m_staticText9611, 0, wxRIGHT|wxLEFT, 5 ); + bSizer294->Add( m_staticTextTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextTotalTime = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTotalTime->Wrap( -1 ); - m_staticTextTotalTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer168->Add( m_staticTextTotalTime, 0, wxRIGHT|wxLEFT, 5 ); + ffgSizer112->Add( bSizer294, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - bSizer168->Add( 0, 5, 0, 0, 5 ); + bSizer292->Add( ffgSizer112, 0, wxALL, 5 ); - m_panelTimeElapsed->SetSizer( bSizer168 ); - m_panelTimeElapsed->Layout(); - bSizer168->Fit( m_panelTimeElapsed ); - bSizer42->Add( m_panelTimeElapsed, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 ); + m_panelTimeStats->SetSizer( bSizer292 ); + m_panelTimeStats->Layout(); + bSizer292->Fit( m_panelTimeStats ); + bSizer42->Add( m_panelTimeStats, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - bSizerLog->Add( bSizer42, 0, wxALL, 5 ); + bSizerLog->Add( bSizer42, 0, wxLEFT, 5 ); m_staticline70 = new wxStaticLine( m_panelLog, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizerLog->Add( m_staticline70, 0, wxEXPAND, 5 ); @@ -1801,14 +1799,14 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w m_staticText79->Wrap( -1 ); bSizer165->Add( m_staticText79, 0, wxBOTTOM, 5 ); - m_spinCtrlTimespan = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer165->Add( m_spinCtrlTimespan, 0, wxEXPAND, 5 ); - wxArrayString m_choiceUnitTimespanChoices; m_choiceUnitTimespan = new wxChoice( m_panelFilterSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 ); m_choiceUnitTimespan->SetSelection( 0 ); bSizer165->Add( m_choiceUnitTimespan, 0, wxEXPAND, 5 ); + m_spinCtrlTimespan = new wxSpinCtrl( m_panelFilterSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer165->Add( m_spinCtrlTimespan, 0, wxEXPAND, 5 ); + bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); @@ -1834,7 +1832,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w m_panelFilterSettingsTab->SetSizer( bSizer278 ); m_panelFilterSettingsTab->Layout(); bSizer278->Fit( m_panelFilterSettingsTab ); - m_notebook->AddPage( m_panelFilterSettingsTab, _("dummy"), false ); + m_notebook->AddPage( m_panelFilterSettingsTab, _("dummy"), true ); m_panelSyncSettingsTab = new wxPanel( m_notebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); m_panelSyncSettingsTab->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); @@ -2349,7 +2347,7 @@ ConfigDlgGenerated::ConfigDlgGenerated( wxWindow* parent, wxWindowID id, const w m_panelSyncSettingsTab->SetSizer( bSizer276 ); m_panelSyncSettingsTab->Layout(); bSizer276->Fit( m_panelSyncSettingsTab ); - m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), true ); + m_notebook->AddPage( m_panelSyncSettingsTab, _("dummy"), false ); bSizer190->Add( m_notebook, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); @@ -3226,94 +3224,130 @@ CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWi { this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - wxBoxSizer* bSizer40; - bSizer40 = new wxBoxSizer( wxHORIZONTAL ); + wxBoxSizer* bSizer1811; + bSizer1811 = new wxBoxSizer( wxVERTICAL ); - m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer187; - bSizer187 = new wxBoxSizer( wxVERTICAL ); + bSizer1811->Add( 0, 0, 1, 0, 5 ); + + m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatus->Wrap( -1 ); + bSizer1811->Add( m_staticTextStatus, 0, wxTOP|wxRIGHT|wxLEFT, 10 ); + + wxBoxSizer* bSizer199; + bSizer199 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer199->Add( 10, 0, 0, 0, 5 ); + + ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticTextProcessed = new wxStaticText( this, wxID_ANY, _("Processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextProcessed->Wrap( -1 ); + ffgSizer11->Add( m_staticTextProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); + m_staticTextRemaining = new wxStaticText( this, wxID_ANY, _("Remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRemaining->Wrap( -1 ); + ffgSizer11->Add( m_staticTextRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer187->Add( 0, 5, 0, 0, 5 ); - wxFlexGridSizer* fgSizer7; - fgSizer7 = new wxFlexGridSizer( 0, 2, 5, 5 ); - fgSizer7->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer7->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + bSizer199->Add( ffgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 10 ); - m_staticTextItemsFoundLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items found:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextItemsFoundLabel->Wrap( -1 ); - fgSizer7->Add( m_staticTextItemsFoundLabel, 0, wxALIGN_BOTTOM, 5 ); + m_panelItemStats = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelItemStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - m_staticTextItemsFound = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextItemsFound->Wrap( -1 ); - m_staticTextItemsFound->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxVERTICAL ); + + ffgSizer111 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer111->SetFlexibleDirection( wxBOTH ); + ffgSizer111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - fgSizer7->Add( m_staticTextItemsFound, 0, wxALIGN_BOTTOM, 5 ); + wxBoxSizer* bSizer293; + bSizer293 = new wxBoxSizer( wxHORIZONTAL ); - m_staticTextItemsRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextItemsRemainingLabel->Wrap( -1 ); - fgSizer7->Add( m_staticTextItemsRemainingLabel, 0, wxALIGN_BOTTOM, 5 ); + m_bitmapItemStat = new wxStaticBitmap( m_panelItemStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer293->Add( m_bitmapItemStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizerItemsRemaining = new wxBoxSizer( wxHORIZONTAL ); - m_staticTextItemsRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer293->Add( 0, 0, 1, 0, 5 ); + + m_staticTextItemsProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_staticTextItemsProcessed->Wrap( -1 ); + m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + + bSizer293->Add( m_staticTextItemsProcessed, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + ffgSizer111->Add( bSizer293, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticTextBytesProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesProcessed->Wrap( -1 ); + ffgSizer111->Add( m_staticTextBytesProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); + + m_staticTextItemsRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_staticTextItemsRemaining->Wrap( -1 ); m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizerItemsRemaining->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 ); + ffgSizer111->Add( m_staticTextItemsRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextBytesRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextBytesRemaining->Wrap( -1 ); - bSizerItemsRemaining->Add( m_staticTextBytesRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + ffgSizer111->Add( m_staticTextBytesRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - fgSizer7->Add( bSizerItemsRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer291->Add( ffgSizer111, 0, wxALL, 5 ); - m_staticTextTimeRemainingLabel = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeRemainingLabel->Wrap( -1 ); - fgSizer7->Add( m_staticTextTimeRemainingLabel, 0, wxALIGN_BOTTOM, 5 ); - m_staticTextTimeRemaining = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeRemaining->Wrap( -1 ); - m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_panelItemStats->SetSizer( bSizer291 ); + m_panelItemStats->Layout(); + bSizer291->Fit( m_panelItemStats ); + bSizer199->Add( m_panelItemStats, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); + + m_panelTimeStats = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelTimeStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer292; + bSizer292 = new wxBoxSizer( wxVERTICAL ); + + ffgSizer112 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer112->SetFlexibleDirection( wxBOTH ); + ffgSizer112->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - fgSizer7->Add( m_staticTextTimeRemaining, 0, wxALIGN_BOTTOM, 5 ); + wxBoxSizer* bSizer294; + bSizer294 = new wxBoxSizer( wxHORIZONTAL ); - wxStaticText* m_staticText37; - m_staticText37 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText37->Wrap( -1 ); - fgSizer7->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 ); + m_bitmapTimeStat = new wxStaticBitmap( m_panelTimeStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer294->Add( m_bitmapTimeStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_staticTextTimeElapsed = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + + bSizer294->Add( 0, 0, 1, 0, 5 ); + + m_staticTextTimeElapsed = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextTimeElapsed->Wrap( -1 ); m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - fgSizer7->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 ); - + bSizer294->Add( m_staticTextTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer187->Add( fgSizer7, 0, wxRIGHT|wxLEFT, 5 ); + ffgSizer112->Add( bSizer294, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - bSizer187->Add( 0, 5, 0, 0, 5 ); + m_staticTextTimeRemaining = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeRemaining->Wrap( -1 ); + m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + ffgSizer112->Add( m_staticTextTimeRemaining, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); - m_panelStatistics->SetSizer( bSizer187 ); - m_panelStatistics->Layout(); - bSizer187->Fit( m_panelStatistics ); - bSizer40->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - wxBoxSizer* bSizer181; - bSizer181 = new wxBoxSizer( wxVERTICAL ); + bSizer292->Add( ffgSizer112, 0, wxALL, 5 ); - m_staticTextStatus = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatus->Wrap( -1 ); - bSizer181->Add( m_staticTextStatus, 0, 0, 5 ); - wxBoxSizer* bSizer199; - bSizer199 = new wxBoxSizer( wxHORIZONTAL ); + m_panelTimeStats->SetSizer( bSizer292 ); + m_panelTimeStats->Layout(); + bSizer292->Fit( m_panelTimeStats ); + bSizer199->Add( m_panelTimeStats, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); bSizerErrorsRetry = new wxBoxSizer( wxHORIZONTAL ); @@ -3326,10 +3360,10 @@ CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWi 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 ); + bSizerErrorsRetry->Add( m_staticTextRetryCount, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer199->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizer199->Add( bSizerErrorsRetry, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); bSizerErrorsIgnore = new wxBoxSizer( wxHORIZONTAL ); @@ -3338,47 +3372,48 @@ CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWi 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 ); + bSizerErrorsIgnore->Add( m_staticText146, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - bSizer199->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + bSizer199->Add( bSizerErrorsIgnore, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); bSizerProgressGraph = new wxBoxSizer( wxHORIZONTAL ); - m_panelProgressGraph = new zen::Graph2D( this, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_panelProgressGraph->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - bSizerProgressGraph->Add( m_panelProgressGraph, 1, wxEXPAND, 5 ); - - wxBoxSizer* bSizer247; - bSizer247 = new wxBoxSizer( wxVERTICAL ); + ffgSizer113 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer113->SetFlexibleDirection( wxBOTH ); + ffgSizer113->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); wxStaticText* m_staticText99; - m_staticText99 = new wxStaticText( this, wxID_ANY, _("Bytes"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText99 = new wxStaticText( this, wxID_ANY, _("Bytes:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText99->Wrap( -1 ); - bSizer247->Add( m_staticText99, 0, wxALL, 5 ); + ffgSizer113->Add( m_staticText99, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); wxStaticText* m_staticText100; - m_staticText100 = new wxStaticText( this, wxID_ANY, _("Items"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText100 = new wxStaticText( this, wxID_ANY, _("Items:"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText100->Wrap( -1 ); - bSizer247->Add( m_staticText100, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + ffgSizer113->Add( m_staticText100, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerProgressGraph->Add( ffgSizer113, 0, wxALL, 5 ); + m_panelProgressGraph = new zen::Graph2D( this, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_panelProgressGraph->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - bSizerProgressGraph->Add( bSizer247, 0, 0, 5 ); + bSizerProgressGraph->Add( m_panelProgressGraph, 1, wxEXPAND, 5 ); - bSizer199->Add( bSizerProgressGraph, 1, wxALIGN_CENTER_VERTICAL, 5 ); + bSizer199->Add( bSizerProgressGraph, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 10 ); - bSizer181->Add( bSizer199, 0, wxTOP|wxEXPAND, 5 ); + bSizer1811->Add( bSizer199, 0, wxEXPAND, 5 ); - bSizer40->Add( bSizer181, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + bSizer1811->Add( 0, 0, 1, 0, 5 ); - this->SetSizer( bSizer40 ); + this->SetSizer( bSizer1811 ); this->Layout(); - bSizer40->Fit( this ); + bSizer1811->Fit( this ); } CompareProgressDlgGenerated::~CompareProgressDlgGenerated() @@ -3473,7 +3508,10 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind bSizer175->Add( m_staticText99, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer233->Add( bSizer175, 0, 0, 5 ); + bSizer233->Add( bSizer175, 0, wxALL, 5 ); + + + bSizer233->Add( 0, 0, 1, 0, 5 ); wxBoxSizer* bSizer174; bSizer174 = new wxBoxSizer( wxHORIZONTAL ); @@ -3487,156 +3525,133 @@ SyncProgressPanelGenerated::SyncProgressPanelGenerated( wxWindow* parent, wxWind bSizer174->Add( m_staticText100, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer233->Add( bSizer174, 0, wxTOP, 5 ); - - - bSizer232->Add( bSizer233, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 10 ); - - m_panelItemsProcessed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelItemsProcessed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer165; - bSizer165 = new wxBoxSizer( wxVERTICAL ); + bSizer233->Add( bSizer174, 0, wxALL, 5 ); - bSizer165->Add( 0, 5, 0, 0, 5 ); + bSizer232->Add( bSizer233, 1, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - wxStaticText* m_staticText96; - m_staticText96 = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText96->Wrap( -1 ); - bSizer165->Add( m_staticText96, 0, wxRIGHT|wxLEFT, 5 ); + ffgSizer11 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer11->SetFlexibleDirection( wxBOTH ); + ffgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer169; - bSizer169 = new wxBoxSizer( wxHORIZONTAL ); + m_staticTextProcessed = new wxStaticText( m_panelProgress, wxID_ANY, _("Processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextProcessed->Wrap( -1 ); + ffgSizer11->Add( m_staticTextProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT, 5 ); - m_staticTextItemsProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); - m_staticTextItemsProcessed->Wrap( -1 ); - m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + m_staticTextRemaining = new wxStaticText( m_panelProgress, wxID_ANY, _("Remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRemaining->Wrap( -1 ); + ffgSizer11->Add( m_staticTextRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer169->Add( m_staticTextItemsProcessed, 0, wxALIGN_BOTTOM, 5 ); - m_staticTextBytesProcessed = new wxStaticText( m_panelItemsProcessed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextBytesProcessed->Wrap( -1 ); - bSizer169->Add( m_staticTextBytesProcessed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + bSizer232->Add( ffgSizer11, 0, wxTOP|wxBOTTOM|wxALIGN_CENTER_VERTICAL, 10 ); + m_panelItemStats = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelItemStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - bSizer165->Add( bSizer169, 0, wxRIGHT|wxLEFT, 5 ); + wxBoxSizer* bSizer291; + bSizer291 = new wxBoxSizer( wxVERTICAL ); + ffgSizer111 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer111->SetFlexibleDirection( wxBOTH ); + ffgSizer111->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - bSizer165->Add( 0, 5, 0, 0, 5 ); + wxBoxSizer* bSizer293; + bSizer293 = new wxBoxSizer( wxHORIZONTAL ); + m_bitmapItemStat = new wxStaticBitmap( m_panelItemStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer293->Add( m_bitmapItemStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - m_panelItemsProcessed->SetSizer( bSizer165 ); - m_panelItemsProcessed->Layout(); - bSizer165->Fit( m_panelItemsProcessed ); - bSizer232->Add( m_panelItemsProcessed, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 10 ); - m_panelItemsRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelItemsRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + bSizer293->Add( 0, 0, 1, 0, 5 ); - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); + m_staticTextItemsProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_staticTextItemsProcessed->Wrap( -1 ); + m_staticTextItemsProcessed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + bSizer293->Add( m_staticTextItemsProcessed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - bSizer166->Add( 0, 5, 0, 0, 5 ); - wxStaticText* m_staticText97; - m_staticText97 = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText97->Wrap( -1 ); - bSizer166->Add( m_staticText97, 0, wxRIGHT|wxLEFT, 5 ); + ffgSizer111->Add( bSizer293, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - wxBoxSizer* bSizer170; - bSizer170 = new wxBoxSizer( wxHORIZONTAL ); + m_staticTextBytesProcessed = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesProcessed->Wrap( -1 ); + ffgSizer111->Add( m_staticTextBytesProcessed, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); - m_staticTextItemsRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); + m_staticTextItemsRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_staticTextItemsRemaining->Wrap( -1 ); m_staticTextItemsRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer170->Add( m_staticTextItemsRemaining, 0, wxALIGN_BOTTOM, 5 ); + ffgSizer111->Add( m_staticTextItemsRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_staticTextBytesRemaining = new wxStaticText( m_panelItemsRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextBytesRemaining = new wxStaticText( m_panelItemStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextBytesRemaining->Wrap( -1 ); - bSizer170->Add( m_staticTextBytesRemaining, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + ffgSizer111->Add( m_staticTextBytesRemaining, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - bSizer166->Add( bSizer170, 0, wxRIGHT|wxLEFT, 5 ); + bSizer291->Add( ffgSizer111, 0, wxALL, 5 ); - bSizer166->Add( 0, 5, 0, 0, 5 ); + m_panelItemStats->SetSizer( bSizer291 ); + m_panelItemStats->Layout(); + bSizer291->Fit( m_panelItemStats ); + bSizer232->Add( m_panelItemStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 10 ); + m_panelTimeStats = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + m_panelTimeStats->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - m_panelItemsRemaining->SetSizer( bSizer166 ); - m_panelItemsRemaining->Layout(); - bSizer166->Fit( m_panelItemsRemaining ); - bSizer232->Add( m_panelItemsRemaining, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 10 ); + wxBoxSizer* bSizer292; + bSizer292 = new wxBoxSizer( wxVERTICAL ); - m_panelTimeRemaining = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelTimeRemaining->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + ffgSizer112 = new wxFlexGridSizer( 2, 0, 5, 5 ); + ffgSizer112->SetFlexibleDirection( wxBOTH ); + ffgSizer112->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - wxBoxSizer* bSizer167; - bSizer167 = new wxBoxSizer( wxVERTICAL ); + wxBoxSizer* bSizer294; + bSizer294 = new wxBoxSizer( wxHORIZONTAL ); + m_bitmapTimeStat = new wxStaticBitmap( m_panelTimeStats, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer294->Add( m_bitmapTimeStat, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - bSizer167->Add( 0, 5, 0, 0, 5 ); - wxStaticText* m_staticText98; - m_staticText98 = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText98->Wrap( -1 ); - bSizer167->Add( m_staticText98, 0, wxRIGHT|wxLEFT, 5 ); - - m_staticTextTimeRemaining = new wxStaticText( m_panelTimeRemaining, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeRemaining->Wrap( -1 ); - m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - - bSizer167->Add( m_staticTextTimeRemaining, 0, wxRIGHT|wxLEFT, 5 ); - - - bSizer167->Add( 0, 5, 0, 0, 5 ); + bSizer294->Add( 0, 0, 1, 0, 5 ); + m_staticTextTimeElapsed = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - m_panelTimeRemaining->SetSizer( bSizer167 ); - m_panelTimeRemaining->Layout(); - bSizer167->Fit( m_panelTimeRemaining ); - bSizer232->Add( m_panelTimeRemaining, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 10 ); + bSizer294->Add( m_staticTextTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - wxPanel* m_panelTimeElapsed; - m_panelTimeElapsed = new wxPanel( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - m_panelTimeElapsed->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - wxBoxSizer* bSizer168; - bSizer168 = new wxBoxSizer( wxVERTICAL ); + ffgSizer112->Add( bSizer294, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + m_staticTextTimeRemaining = new wxStaticText( m_panelTimeStats, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeRemaining->Wrap( -1 ); + m_staticTextTimeRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); - bSizer168->Add( 0, 5, 0, 0, 5 ); + ffgSizer112->Add( m_staticTextTimeRemaining, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); - wxStaticText* m_staticText961; - m_staticText961 = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText961->Wrap( -1 ); - bSizer168->Add( m_staticText961, 0, wxRIGHT|wxLEFT, 5 ); - m_staticTextTimeElapsed = new wxStaticText( m_panelTimeElapsed, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + bSizer292->Add( ffgSizer112, 0, wxALL, 5 ); - bSizer168->Add( m_staticTextTimeElapsed, 0, wxRIGHT|wxLEFT, 5 ); + m_panelTimeStats->SetSizer( bSizer292 ); + m_panelTimeStats->Layout(); + bSizer292->Fit( m_panelTimeStats ); + bSizer232->Add( m_panelTimeStats, 0, wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 10 ); - bSizer168->Add( 0, 5, 0, 0, 5 ); + bSizer232->Add( 0, 0, 1, 0, 5 ); - m_panelTimeElapsed->SetSizer( bSizer168 ); - m_panelTimeElapsed->Layout(); - bSizer168->Fit( m_panelTimeElapsed ); - bSizer232->Add( m_panelTimeElapsed, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 10 ); + bSizerDynSpace = new wxBoxSizer( wxVERTICAL ); - bSizer232->Add( 10, 0, 0, 0, 5 ); + bSizerDynSpace->Add( 0, 0, 0, 0, 5 ); - bSizer232->Add( 0, 0, 1, 0, 5 ); + bSizer232->Add( bSizerDynSpace, 0, 0, 5 ); - bSizer161->Add( bSizer232, 0, wxTOP|wxBOTTOM|wxEXPAND, 10 ); + bSizer161->Add( bSizer232, 0, wxEXPAND, 5 ); m_panelGraphItems = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( -1, -1 ), 0 ); m_panelGraphItems->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); @@ -4903,9 +4918,9 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer172->Add( m_hyperlink101, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("NSIS"), wxT("http://nsis.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("NSIS"), wxT("https://nsis.sourceforge.io"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - m_hyperlink18->SetToolTip( _("http://nsis.sourceforge.net") ); + m_hyperlink18->SetToolTip( _("https://nsis.sourceforge.io") ); bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); diff --git a/FreeFileSync/Source/ui/gui_generated.h b/FreeFileSync/Source/ui/gui_generated.h index 3d9eef07..616cf0bb 100644 --- a/FreeFileSync/Source/ui/gui_generated.h +++ b/FreeFileSync/Source/ui/gui_generated.h @@ -153,6 +153,9 @@ protected: wxPanel* m_panelLog; wxBoxSizer* bSizerLog; wxBoxSizer* bSizer42; + wxFlexGridSizer* ffgSizer11; + wxFlexGridSizer* ffgSizer111; + wxFlexGridSizer* ffgSizer112; wxStaticLine* m_staticline70; wxPanel* m_panelConfig; wxBoxSizer* bSizerConfig; @@ -261,13 +264,17 @@ public: wxBitmapButton* m_bpButtonSelectAltFolderRight; wxStaticBitmap* m_bitmapLogStatus; wxStaticText* m_staticTextLogStatus; - wxPanel* m_panelItemsProcessed; + wxStaticText* m_staticTextProcessed; + wxStaticText* m_staticTextRemaining; + wxPanel* m_panelItemStats; + wxStaticBitmap* m_bitmapItemStat; wxStaticText* m_staticTextItemsProcessed; wxStaticText* m_staticTextBytesProcessed; - wxPanel* m_panelItemsRemaining; wxStaticText* m_staticTextItemsRemaining; wxStaticText* m_staticTextBytesRemaining; - wxStaticText* m_staticTextTotalTime; + wxPanel* m_panelTimeStats; + wxStaticBitmap* m_bitmapTimeStat; + wxStaticText* m_staticTextTimeElapsed; wxBoxSizer* bSizerStatistics; wxBoxSizer* bSizerData; @@ -390,8 +397,8 @@ protected: wxStaticLine* m_staticline23; wxStaticBitmap* m_bitmapFilterDate; wxStaticText* m_staticText79; - wxSpinCtrl* m_spinCtrlTimespan; wxChoice* m_choiceUnitTimespan; + wxSpinCtrl* m_spinCtrlTimespan; wxStaticLine* m_staticline231; wxButton* m_buttonClear; wxPanel* m_panelSyncSettingsTab; @@ -737,24 +744,30 @@ class CompareProgressDlgGenerated : public wxPanel private: protected: - wxPanel* m_panelStatistics; - wxStaticText* m_staticTextItemsFoundLabel; - wxStaticText* m_staticTextItemsFound; - wxStaticText* m_staticTextItemsRemainingLabel; - wxBoxSizer* bSizerItemsRemaining; - wxStaticText* m_staticTextItemsRemaining; - wxStaticText* m_staticTextBytesRemaining; - wxStaticText* m_staticTextTimeRemainingLabel; - wxStaticText* m_staticTextTimeRemaining; - wxStaticText* m_staticTextTimeElapsed; wxStaticText* m_staticTextStatus; + wxFlexGridSizer* ffgSizer11; + wxFlexGridSizer* ffgSizer111; + wxFlexGridSizer* ffgSizer112; wxStaticText* m_staticText1461; wxStaticText* m_staticTextRetryCount; wxStaticText* m_staticText146; wxBoxSizer* bSizerProgressGraph; + wxFlexGridSizer* ffgSizer113; zen::Graph2D* m_panelProgressGraph; public: + wxStaticText* m_staticTextProcessed; + wxStaticText* m_staticTextRemaining; + wxPanel* m_panelItemStats; + wxStaticBitmap* m_bitmapItemStat; + wxStaticText* m_staticTextItemsProcessed; + wxStaticText* m_staticTextBytesProcessed; + wxStaticText* m_staticTextItemsRemaining; + wxStaticText* m_staticTextBytesRemaining; + wxPanel* m_panelTimeStats; + wxStaticBitmap* m_bitmapTimeStat; + wxStaticText* m_staticTextTimeElapsed; + wxStaticText* m_staticTextTimeRemaining; wxBoxSizer* bSizerErrorsRetry; wxStaticBitmap* m_bitmapRetryErrors; wxBoxSizer* bSizerErrorsIgnore; @@ -775,6 +788,9 @@ private: protected: wxPanel* m_panel53; wxBoxSizer* bSizer42; + wxFlexGridSizer* ffgSizer11; + wxFlexGridSizer* ffgSizer111; + wxFlexGridSizer* ffgSizer112; wxStaticText* m_staticText1461; wxStaticText* m_staticText146; wxStaticText* m_staticText137; @@ -790,15 +806,19 @@ public: zen::Graph2D* m_panelGraphBytes; wxStaticBitmap* m_bitmapGraphKeyBytes; wxStaticBitmap* m_bitmapGraphKeyItems; - wxPanel* m_panelItemsProcessed; + wxStaticText* m_staticTextProcessed; + wxStaticText* m_staticTextRemaining; + wxPanel* m_panelItemStats; + wxStaticBitmap* m_bitmapItemStat; wxStaticText* m_staticTextItemsProcessed; wxStaticText* m_staticTextBytesProcessed; - wxPanel* m_panelItemsRemaining; wxStaticText* m_staticTextItemsRemaining; wxStaticText* m_staticTextBytesRemaining; - wxPanel* m_panelTimeRemaining; - wxStaticText* m_staticTextTimeRemaining; + wxPanel* m_panelTimeStats; + wxStaticBitmap* m_bitmapTimeStat; wxStaticText* m_staticTextTimeElapsed; + wxStaticText* m_staticTextTimeRemaining; + wxBoxSizer* bSizerDynSpace; zen::Graph2D* m_panelGraphItems; wxBoxSizer* bSizerProgressFooter; wxBoxSizer* bSizerErrorsRetry; diff --git a/FreeFileSync/Source/ui/gui_status_handler.cpp b/FreeFileSync/Source/ui/gui_status_handler.cpp index 64d6daff..be2dea7a 100644 --- a/FreeFileSync/Source/ui/gui_status_handler.cpp +++ b/FreeFileSync/Source/ui/gui_status_handler.cpp @@ -11,7 +11,7 @@ #include #include #include "main_dlg.h" -#include "../base/generate_logfile.h" +#include "../base/log_file.h" #include "../base/resolve_path.h" #include "../afs/concrete.h" @@ -133,14 +133,14 @@ StatusHandlerTemporaryPanel::Result StatusHandlerTemporaryPanel::reportFinalStat if (getAbortStatus()) { errorLog_.logMsg(_("Stopped"), MSG_TYPE_ERROR); //= user cancel; *not* a MSG_TYPE_FATAL_ERROR! - return SyncResult::ABORTED; + return SyncResult::aborted; } else if (errorLog_.getItemCount(MSG_TYPE_ERROR | MSG_TYPE_FATAL_ERROR) > 0) - return SyncResult::FINISHED_WITH_ERROR; + return SyncResult::finishedError; else if (errorLog_.getItemCount(MSG_TYPE_WARNING) > 0) - return SyncResult::FINISHED_WITH_WARNINGS; + return SyncResult::finishedWarning; else - return SyncResult::FINISHED_WITH_SUCCESS; + return SyncResult::finishedSuccess; }(); const ProcessSummary summary @@ -188,15 +188,15 @@ void StatusHandlerTemporaryPanel::reportWarning(const std::wstring& msg, bool& w forceUiRefreshNoThrow(); //noexcept! => don't throw here when error occurs during clean up! bool dontWarnAgain = false; - switch (showConfirmationDialog(&mainDlg_, DialogInfoType::WARNING, + switch (showConfirmationDialog(&mainDlg_, DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(msg). setCheckBox(dontWarnAgain, _("&Don't show this warning again")), _("&Ignore"))) { - case ConfirmationButton::ACCEPT: + case ConfirmationButton::accept: warningActive = !dontWarnAgain; break; - case ConfirmationButton::CANCEL: + case ConfirmationButton::cancel: userAbortProcessNow(); //throw AbortProcess break; } @@ -215,7 +215,7 @@ ProcessCallback::Response StatusHandlerTemporaryPanel::reportError(const std::ws errorLog_.logMsg(msg + L"\n-> " + _("Automatic retry"), MSG_TYPE_INFO); delayAndCountDown(_("Automatic retry") + (automaticRetryCount_ <= 1 ? L"" : L" " + numberTo(retryNumber + 1) + L"/" + numberTo(automaticRetryCount_)), automaticRetryDelay_, [&](const std::wstring& statusMsg) { this->reportStatus(_("Error") + L": " + statusMsg); }); //throw AbortProcess - return ProcessCallback::RETRY; + return ProcessCallback::retry; } //always, except for "retry": @@ -225,32 +225,32 @@ ProcessCallback::Response StatusHandlerTemporaryPanel::reportError(const std::ws { forceUiRefreshNoThrow(); //noexcept! => don't throw here when error occurs during clean up! - switch (showConfirmationDialog(&mainDlg_, DialogInfoType::ERROR2, + switch (showConfirmationDialog(&mainDlg_, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(msg), _("&Ignore"), _("Ignore &all"), _("&Retry"))) { - case ConfirmationButton3::ACCEPT: //ignore - return ProcessCallback::IGNORE_ERROR; + case ConfirmationButton3::accept: //ignore + return ProcessCallback::ignoreError; - case ConfirmationButton3::ACCEPT_ALL: //ignore all + case ConfirmationButton3::acceptAll: //ignore all mainDlg_.compareStatus_->setOptionIgnoreErrors(true); - return ProcessCallback::IGNORE_ERROR; + return ProcessCallback::ignoreError; - case ConfirmationButton3::DECLINE: //retry + case ConfirmationButton3::decline: //retry guardWriteLog.dismiss(); errorLog_.logMsg(msg + L"\n-> " + _("Retrying operation..."), MSG_TYPE_INFO); //explain why there are duplicate "doing operation X" info messages in the log! - return ProcessCallback::RETRY; + return ProcessCallback::retry; - case ConfirmationButton3::CANCEL: + case ConfirmationButton3::cancel: userAbortProcessNow(); //throw AbortProcess break; } } else - return ProcessCallback::IGNORE_ERROR; + return ProcessCallback::ignoreError; assert(false); - return ProcessCallback::IGNORE_ERROR; //dummy return value + return ProcessCallback::ignoreError; //dummy return value } @@ -264,19 +264,19 @@ void StatusHandlerTemporaryPanel::reportFatalError(const std::wstring& msg) { forceUiRefreshNoThrow(); //noexcept! => don't throw here when error occurs during clean up! - switch (showConfirmationDialog(&mainDlg_, DialogInfoType::ERROR2, + switch (showConfirmationDialog(&mainDlg_, DialogInfoType::error, PopupDialogCfg().setTitle(_("Serious Error")). setDetailInstructions(msg), _("&Ignore"), _("Ignore &all"))) { - case ConfirmationButton2::ACCEPT: //ignore + case ConfirmationButton2::accept: //ignore break; - case ConfirmationButton2::ACCEPT_ALL: //ignore all + case ConfirmationButton2::acceptAll: //ignore all mainDlg_.compareStatus_->setOptionIgnoreErrors(true); break; - case ConfirmationButton2::CANCEL: + case ConfirmationButton2::cancel: userAbortProcessNow(); //throw AbortProcess break; } @@ -320,8 +320,8 @@ StatusHandlerFloatingDialog::StatusHandlerFloatingDialog(wxFrame* parentDlg, const Zstring& postSyncCommand, PostSyncCondition postSyncCondition, bool& autoCloseDialog) : - progressDlg_(createProgressDialog(*this, [this] { this->onProgressDialogTerminate(); }, *this, parentDlg, true /*showProgress*/, autoCloseDialog, -startTime, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, PostSyncAction2::NONE)), + progressDlg_(SyncProgressDialog::create([this] { userRequestAbort(); }, *this, parentDlg, true /*showProgress*/, autoCloseDialog, +startTime, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, PostSyncAction2::none)), automaticRetryCount_(automaticRetryCount), automaticRetryDelay_(automaticRetryDelay), jobName_(jobName), @@ -342,7 +342,7 @@ StatusHandlerFloatingDialog::Result StatusHandlerFloatingDialog::reportFinalStat { const auto totalTime = std::chrono::duration_cast(std::chrono::system_clock::now() - startTime_); - if (progressDlg_) progressDlg_->timerSetStatus(false /*active*/); //keep correct summary window stats considering count down timer, system sleep + progressDlg_->timerSetStatus(false /*active*/); //keep correct summary window stats considering count down timer, system sleep //determine post-sync status irrespective of further errors during tear-down const SyncResult finalStatus = [&] @@ -350,19 +350,19 @@ StatusHandlerFloatingDialog::Result StatusHandlerFloatingDialog::reportFinalStat if (getAbortStatus()) { errorLog_.logMsg(_("Stopped"), MSG_TYPE_ERROR); //= user cancel; *not* a MSG_TYPE_FATAL_ERROR! - return SyncResult::ABORTED; + return SyncResult::aborted; } else if (errorLog_.getItemCount(MSG_TYPE_ERROR | MSG_TYPE_FATAL_ERROR) > 0) - return SyncResult::FINISHED_WITH_ERROR; + return SyncResult::finishedError; else if (errorLog_.getItemCount(MSG_TYPE_WARNING) > 0) - return SyncResult::FINISHED_WITH_WARNINGS; + return SyncResult::finishedWarning; if (getStatsTotal(currentPhase()) == ProgressStats()) errorLog_.logMsg(_("Nothing to synchronize"), MSG_TYPE_INFO); - return SyncResult::FINISHED_WITH_SUCCESS; + return SyncResult::finishedSuccess; }(); - assert(finalStatus == SyncResult::ABORTED || currentPhase() == PHASE_SYNCHRONIZING); + assert(finalStatus == SyncResult::aborted || currentPhase() == PHASE_SYNCHRONIZING); const ProcessSummary summary { @@ -383,13 +383,13 @@ StatusHandlerFloatingDialog::Result StatusHandlerFloatingDialog::reportFinalStat case PostSyncCondition::COMPLETION: return postSyncCommand_; case PostSyncCondition::ERRORS: - if (finalStatus == SyncResult::ABORTED || - finalStatus == SyncResult::FINISHED_WITH_ERROR) + if (finalStatus == SyncResult::aborted || + finalStatus == SyncResult::finishedError) return postSyncCommand_; break; case PostSyncCondition::SUCCESS: - if (finalStatus == SyncResult::FINISHED_WITH_WARNINGS || - finalStatus == SyncResult::FINISHED_WITH_SUCCESS) + if (finalStatus == SyncResult::finishedWarning || + finalStatus == SyncResult::finishedSuccess) return postSyncCommand_; break; } @@ -422,86 +422,71 @@ StatusHandlerFloatingDialog::Result StatusHandlerFloatingDialog::reportFinalStat } catch (const FileError& e) { errorLog_.logMsg(e.toString(), MSG_TYPE_ERROR); } - if (progressDlg_) + auto mayRunAfterCountDown = [&](const std::wstring& operationName) { - auto mayRunAfterCountDown = [&](const std::wstring& operationName) + auto notifyStatusThrowOnCancel = [&](const std::wstring& msg) { - auto notifyStatusThrowOnCancel = [&](const std::wstring& msg) + try { reportStatus(msg); /*throw AbortProcess*/ } + catch (...) { - try { reportStatus(msg); /*throw AbortProcess*/ } - catch (...) - { - if (getAbortStatus() && *getAbortStatus() == AbortTrigger::USER) - throw; - } - }; - - if (progressDlg_->getWindowIfVisible()) - try - { - delayAndCountDown(operationName, std::chrono::seconds(5), notifyStatusThrowOnCancel); //throw AbortProcess - } - catch (...) { return false; } - - return true; + if (getAbortStatus() && *getAbortStatus() == AbortTrigger::USER) + throw; + } }; - //post sync action - bool autoClose = false; - FinalRequest finalRequest = FinalRequest::none; - - if (getAbortStatus() && *getAbortStatus() == AbortTrigger::USER) - ; //user cancelled => don't run post sync command! - else - switch (progressDlg_->getOptionPostSyncAction()) + if (progressDlg_->getWindowIfVisible()) + try { - case PostSyncAction2::NONE: - autoClose = progressDlg_->getOptionAutoCloseDialog(); - break; - case PostSyncAction2::EXIT: - autoClose = true; - finalRequest = FinalRequest::exit; //program exit must be handled by calling context! - break; - case PostSyncAction2::SLEEP: - if (mayRunAfterCountDown(_("System: Sleep"))) - try - { - suspendSystem(); //throw FileError - autoClose = progressDlg_->getOptionAutoCloseDialog(); - } - catch (const FileError& e) { errorLog_.logMsg(e.toString(), MSG_TYPE_ERROR); } - break; - case PostSyncAction2::SHUTDOWN: - if (mayRunAfterCountDown(_("System: Shut down"))) - { - autoClose = true; - finalRequest = FinalRequest::shutdown; //system shutdown must be handled by calling context! - } - break; + delayAndCountDown(operationName, std::chrono::seconds(5), notifyStatusThrowOnCancel); //throw AbortProcess } + catch (...) { return false; } - auto errorLogFinal = std::make_shared(std::move(errorLog_)); + return true; + }; - //close progress dialog - if (autoClose) - progressDlg_->closeDirectly(finalRequest == FinalRequest::none /*restoreParentFrame*/); - else - progressDlg_->showSummary(finalStatus, errorLogFinal); + //post sync action + bool autoClose = false; + FinalRequest finalRequest = FinalRequest::none; - //wait until progress dialog notified shutdown via onProgressDialogTerminate() - //-> required since it has our "this" pointer captured in lambda "notifyWindowTerminate"! - //-> nicely manages dialog lifetime - for (;;) + if (getAbortStatus() && *getAbortStatus() == AbortTrigger::USER) + ; //user cancelled => don't run post sync command! + else + switch (progressDlg_->getOptionPostSyncAction()) { - wxTheApp->Yield(); //*first* refresh GUI (removing flicker) before sleeping! - if (!progressDlg_) break; - std::this_thread::sleep_for(UI_UPDATE_INTERVAL); + case PostSyncAction2::none: + autoClose = progressDlg_->getOptionAutoCloseDialog(); + break; + case PostSyncAction2::exit: + autoClose = true; + finalRequest = FinalRequest::exit; //program exit must be handled by calling context! + break; + case PostSyncAction2::sleep: + if (mayRunAfterCountDown(_("System: Sleep"))) + try + { + suspendSystem(); //throw FileError + autoClose = progressDlg_->getOptionAutoCloseDialog(); + } + catch (const FileError& e) { errorLog_.logMsg(e.toString(), MSG_TYPE_ERROR); } + break; + case PostSyncAction2::shutdown: + if (mayRunAfterCountDown(_("System: Shut down"))) + { + autoClose = true; + finalRequest = FinalRequest::shutdown; //system shutdown must be handled by calling context! + } + break; } - return { summary, errorLogFinal, finalRequest, logFilePath }; - } - else - return { summary, std::make_shared(std::move(errorLog_)), FinalRequest::none, logFilePath }; + auto errorLogFinal = std::make_shared(std::move(errorLog_)); + + autoCloseDialogOut_ = //output parameter owned by SyncProgressDialog (evaluate *after* user closed the results dialog) + progressDlg_->destroy(autoClose, + finalRequest == FinalRequest::none /*restoreParentFrame*/, + finalStatus, errorLogFinal).autoCloseDialog; + progressDlg_ = nullptr; + + return { summary, errorLogFinal, finalRequest, logFilePath }; } @@ -509,7 +494,7 @@ void StatusHandlerFloatingDialog::initNewPhase(int itemsTotal, int64_t bytesTota { assert(phaseID == PHASE_SYNCHRONIZING); StatusHandler::initNewPhase(itemsTotal, bytesTotal, phaseID); - if (progressDlg_) progressDlg_->initNewPhase(); //call after "StatusHandler::initNewPhase" + progressDlg_->initNewPhase(); //call after "StatusHandler::initNewPhase" forceUiRefresh(); //throw AbortProcess; OS X needs a full yield to update GUI and get rid of "dummy" texts } @@ -523,7 +508,6 @@ void StatusHandlerFloatingDialog::logInfo(const std::wstring& msg) void StatusHandlerFloatingDialog::reportWarning(const std::wstring& msg, bool& warningActive) { - if (!progressDlg_) abortProcessNow(); //throw AbortProcess PauseTimers dummy(*progressDlg_); errorLog_.logMsg(msg, MSG_TYPE_WARNING); @@ -535,17 +519,16 @@ void StatusHandlerFloatingDialog::reportWarning(const std::wstring& msg, bool& w { forceUiRefreshNoThrow(); //noexcept! => don't throw here when error occurs during clean up! - if (!progressDlg_) abortProcessNow(); //throw AbortProcess bool dontWarnAgain = false; - switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::WARNING, + switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(msg). setCheckBox(dontWarnAgain, _("&Don't show this warning again")), _("&Ignore"))) { - case ConfirmationButton::ACCEPT: + case ConfirmationButton::accept: warningActive = !dontWarnAgain; break; - case ConfirmationButton::CANCEL: + case ConfirmationButton::cancel: userAbortProcessNow(); //throw AbortProcess break; } @@ -556,7 +539,6 @@ void StatusHandlerFloatingDialog::reportWarning(const std::wstring& msg, bool& w ProcessCallback::Response StatusHandlerFloatingDialog::reportError(const std::wstring& msg, size_t retryNumber) { - if (!progressDlg_) abortProcessNow(); //throw AbortProcess PauseTimers dummy(*progressDlg_); //auto-retry @@ -565,7 +547,7 @@ ProcessCallback::Response StatusHandlerFloatingDialog::reportError(const std::ws errorLog_.logMsg(msg + L"\n-> " + _("Automatic retry"), MSG_TYPE_INFO); delayAndCountDown(_("Automatic retry") + (automaticRetryCount_ <= 1 ? L"" : L" " + numberTo(retryNumber + 1) + L"/" + numberTo(automaticRetryCount_)), automaticRetryDelay_, [&](const std::wstring& statusMsg) { this->reportStatus(_("Error") + L": " + statusMsg); }); //throw AbortProcess - return ProcessCallback::RETRY; + return ProcessCallback::retry; } //always, except for "retry": @@ -575,39 +557,37 @@ ProcessCallback::Response StatusHandlerFloatingDialog::reportError(const std::ws { forceUiRefreshNoThrow(); //noexcept! => don't throw here when error occurs during clean up! - if (!progressDlg_) abortProcessNow(); //throw AbortProcess - switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::ERROR2, + switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::error, PopupDialogCfg().setDetailInstructions(msg), _("&Ignore"), _("Ignore &all"), _("&Retry"))) { - case ConfirmationButton3::ACCEPT: //ignore - return ProcessCallback::IGNORE_ERROR; + case ConfirmationButton3::accept: //ignore + return ProcessCallback::ignoreError; - case ConfirmationButton3::ACCEPT_ALL: //ignore all + case ConfirmationButton3::acceptAll: //ignore all progressDlg_->setOptionIgnoreErrors(true); - return ProcessCallback::IGNORE_ERROR; + return ProcessCallback::ignoreError; - case ConfirmationButton3::DECLINE: //retry + case ConfirmationButton3::decline: //retry guardWriteLog.dismiss(); errorLog_.logMsg(msg + L"\n-> " + _("Retrying operation..."), MSG_TYPE_INFO); //explain why there are duplicate "doing operation X" info messages in the log! - return ProcessCallback::RETRY; + return ProcessCallback::retry; - case ConfirmationButton3::CANCEL: + case ConfirmationButton3::cancel: userAbortProcessNow(); //throw AbortProcess break; } } else - return ProcessCallback::IGNORE_ERROR; + return ProcessCallback::ignoreError; assert(false); - return ProcessCallback::IGNORE_ERROR; //dummy value + return ProcessCallback::ignoreError; //dummy value } void StatusHandlerFloatingDialog::reportFatalError(const std::wstring& msg) { - if (!progressDlg_) abortProcessNow(); //throw AbortProcess PauseTimers dummy(*progressDlg_); errorLog_.logMsg(msg, MSG_TYPE_FATAL_ERROR); @@ -616,20 +596,19 @@ void StatusHandlerFloatingDialog::reportFatalError(const std::wstring& msg) { forceUiRefreshNoThrow(); //noexcept! => don't throw here when error occurs during clean up! - if (!progressDlg_) abortProcessNow(); //throw AbortProcess - switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::ERROR2, + switch (showConfirmationDialog(progressDlg_->getWindowIfVisible(), DialogInfoType::error, PopupDialogCfg().setTitle(_("Serious Error")). setDetailInstructions(msg), _("&Ignore"), _("Ignore &all"))) { - case ConfirmationButton2::ACCEPT: + case ConfirmationButton2::accept: break; - case ConfirmationButton2::ACCEPT_ALL: + case ConfirmationButton2::acceptAll: progressDlg_->setOptionIgnoreErrors(true); break; - case ConfirmationButton2::CANCEL: + case ConfirmationButton2::cancel: userAbortProcessNow(); //throw AbortProcess break; } @@ -642,23 +621,12 @@ void StatusHandlerFloatingDialog::updateDataProcessed(int itemsDelta, int64_t by StatusHandler::updateDataProcessed(itemsDelta, bytesDelta); //note: this method should NOT throw in order to properly allow undoing setting of statistics! - if (progressDlg_) progressDlg_->notifyProgressChange(); //noexcept + progressDlg_->notifyProgressChange(); //noexcept //for "curveDataBytes_->addRecord()" } void StatusHandlerFloatingDialog::forceUiRefreshNoThrow() { - if (progressDlg_) - progressDlg_->updateGui(); -} - - -void StatusHandlerFloatingDialog::onProgressDialogTerminate() -{ - //output parameters owned by SyncProgressDialog - if (progressDlg_) - autoCloseDialogOut_ = progressDlg_->getOptionAutoCloseDialog(); - - progressDlg_ = nullptr; + progressDlg_->updateGui(); } diff --git a/FreeFileSync/Source/ui/gui_status_handler.h b/FreeFileSync/Source/ui/gui_status_handler.h index 0bd6dac4..dffd1783 100644 --- a/FreeFileSync/Source/ui/gui_status_handler.h +++ b/FreeFileSync/Source/ui/gui_status_handler.h @@ -93,9 +93,7 @@ public: Result reportFinalStatus(const Zstring& altLogFolderPathPhrase, int logfilesMaxAgeDays, const std::set& logFilePathsToKeep); //noexcept!! private: - void onProgressDialogTerminate(); - - SyncProgressDialog* progressDlg_; //managed to have shorter lifetime than this handler! + SyncProgressDialog* progressDlg_; //managed to have the same lifetime as this handler! zen::ErrorLog errorLog_; const size_t automaticRetryCount_; const std::chrono::seconds automaticRetryDelay_; diff --git a/FreeFileSync/Source/ui/log_panel.cpp b/FreeFileSync/Source/ui/log_panel.cpp index 34b0aa64..c0504291 100644 --- a/FreeFileSync/Source/ui/log_panel.cpp +++ b/FreeFileSync/Source/ui/log_panel.cpp @@ -561,6 +561,6 @@ void LogPanel::copySelectionToClipboard() } catch (const std::bad_alloc& e) { - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(_("Out of memory.") + L" " + utfTo(e.what()))); + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setMainInstructions(_("Out of memory.") + L" " + utfTo(e.what()))); } } diff --git a/FreeFileSync/Source/ui/main_dlg.cpp b/FreeFileSync/Source/ui/main_dlg.cpp index 5583cc79..d4f3aa5c 100644 --- a/FreeFileSync/Source/ui/main_dlg.cpp +++ b/FreeFileSync/Source/ui/main_dlg.cpp @@ -277,7 +277,7 @@ XmlGlobalSettings tryLoadGlobalConfig(const Zstring& globalConfigFilePath) //blo } catch (const FileError& e) { - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); //no parent window: main dialog not yet created! + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); //no parent window: main dialog not yet created! } } return globalCfg; @@ -335,12 +335,12 @@ void MainDialog::create(const Zstring& globalConfigFilePath) readAnyConfig(cfgFilePaths, guiCfg, warningMsg); //throw FileError if (!warningMsg.empty()) - showNotificationDialog(nullptr, DialogInfoType::WARNING, PopupDialogCfg().setDetailInstructions(warningMsg)); + showNotificationDialog(nullptr, DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(warningMsg)); //what about showing as changed config on parsing errors???? } catch (const FileError& e) { - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } //------------------------------------------------------------------------------------------ @@ -364,7 +364,7 @@ void MainDialog::create(const Zstring& globalConfigFilePath, } catch (const FileError& e) { - showNotificationDialog(nullptr, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(nullptr, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); //continue! } @@ -419,8 +419,13 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, initViewFilterButtons(); + const wxBitmap& bmpFile = IconBuffer::genericFileIcon(IconBuffer::SIZE_SMALL); + const wxBitmap& bmpDir = IconBuffer::genericDirIcon (IconBuffer::SIZE_SMALL); + //init log panel setRelativeFontSize(*m_staticTextLogStatus, 1.5); + m_bitmapItemStat->SetBitmap(bmpFile); + m_bitmapTimeStat->SetBitmap(getResourceImage(L"cmp_file_time_sicon")); logPanel_ = new LogPanel(m_panelLog); //pass ownership bSizerLog->Add(logPanel_, 1, wxEXPAND); @@ -580,15 +585,11 @@ MainDialog::MainDialog(const Zstring& globalConfigFilePath, m_bpButtonSyncContext->SetToolTip(m_bpButtonSyncConfig->GetToolTipText()); - { - const wxBitmap& bmpFile = IconBuffer::genericFileIcon(IconBuffer::SIZE_SMALL); - const wxBitmap& bmpDir = IconBuffer::genericDirIcon (IconBuffer::SIZE_SMALL); + m_bitmapSmallDirectoryLeft ->SetBitmap(bmpDir); + m_bitmapSmallFileLeft ->SetBitmap(bmpFile); + m_bitmapSmallDirectoryRight->SetBitmap(bmpDir); + m_bitmapSmallFileRight ->SetBitmap(bmpFile); - m_bitmapSmallDirectoryLeft ->SetBitmap(bmpDir); - m_bitmapSmallFileLeft ->SetBitmap(bmpFile); - m_bitmapSmallDirectoryRight->SetBitmap(bmpDir); - m_bitmapSmallFileRight ->SetBitmap(bmpFile); - } m_menuItemNew ->SetBitmap(getResourceImage(L"file_new_sicon")); m_menuItemLoad ->SetBitmap(getResourceImage(L"file_load_sicon")); @@ -820,7 +821,7 @@ MainDialog::~MainDialog() //don't annoy users on read-only drives: it's enough to show a single error message when saving global config if (firstError) - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(firstError->toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(firstError->toString())); auiMgr_.UnInit(); @@ -875,37 +876,39 @@ void MainDialog::setGlobalCfgOnInit(const XmlGlobalSettings& globalSettings) { globalCfg_ = globalSettings; - //caveat set/get language asymmmetry! setLanguage(globalSettings.programLanguage); //throw FileError + //caveat: set/get language asymmmetry! setLanguage(globalSettings.programLanguage); //throw FileError //we need to set langugabe before creating this class! wxSize newSize(fastFromDIP(900), fastFromDIP(600)); //default window size std::optional newPos; //set dialog size and position: - // - width/height are invalid if the window is minimized (eg x,y == -32000; height = 28, width = 160) + // - width/height are invalid if the window is minimized (eg x,y = -32000; width = 160, height = 28) // - multi-monitor setups: dialog may be placed on second monitor which is currently turned off if (globalSettings.gui.mainDlg.dlgSize.GetWidth () > 0 && globalSettings.gui.mainDlg.dlgSize.GetHeight() > 0) { - newSize = globalSettings.gui.mainDlg.dlgSize; - //calculate how much of the dialog will be visible on screen - const int dlgArea = newSize.GetWidth() * newSize.GetHeight(); + const int dlgArea = globalSettings.gui.mainDlg.dlgSize.GetWidth() * + globalSettings.gui.mainDlg.dlgSize.GetHeight(); int dlgAreaMaxVisible = 0; const int monitorCount = wxDisplay::GetCount(); for (int i = 0; i < monitorCount; ++i) { - wxRect intersection = wxDisplay(i).GetClientArea().Intersect(wxRect(globalSettings.gui.mainDlg.dlgPos, newSize)); + wxRect intersection = wxDisplay(i).GetClientArea().Intersect(wxRect(globalSettings.gui.mainDlg.dlgPos, globalSettings.gui.mainDlg.dlgSize)); dlgAreaMaxVisible = std::max(dlgAreaMaxVisible, intersection.GetWidth() * intersection.GetHeight()); } - if (dlgAreaMaxVisible > 0.1 * dlgArea //at least 10% of the dialog should be visible! + if (dlgAreaMaxVisible > 0.1 * dlgArea //at least 10% of the dialog should be visible! ) - newPos = globalSettings.gui.mainDlg.dlgPos; + { + newSize = globalSettings.gui.mainDlg.dlgSize; + newPos = globalSettings.gui.mainDlg.dlgPos; + } } //old comment: "wxGTK's wxWindow::SetSize seems unreliable and behaves like a wxWindow::SetClientSize - // => use wxWindow::SetClientSize instead (for the record: no such issue on Windows/OS X) + // => use wxWindow::SetClientSize instead (for the record: no such issue on Windows/macOS) //2018-10-15: Weird new problem on CentOS/Ubuntu: SetClientSize() + SetPosition() fail to set correct dialog *position*, but SetSize() + SetPosition() do! // => old issues with SetSize() seem to be gone... => revert to SetSize() if (newPos) @@ -963,20 +966,28 @@ void MainDialog::setGlobalCfgOnInit(const XmlGlobalSettings& globalSettings) m_checkBoxMatchCase->SetValue(globalCfg_.gui.mainDlg.textSearchRespectCase); //wxAuiManager erroneously loads panel captions, we don't want that - std::vector>captionNameMap; - const wxAuiPaneInfoArray& paneArray = auiMgr_.GetAllPanes(); + std::vector> paneCaptions; + wxAuiPaneInfoArray& paneArray = auiMgr_.GetAllPanes(); for (size_t i = 0; i < paneArray.size(); ++i) - captionNameMap.emplace_back(paneArray[i].caption, paneArray[i].name); + paneCaptions.emplace_back(&paneArray[i], paneArray[i].caption); + + //compare progress dialog minimum sizes are layout-dependent + can't be changed by user => don't load stale values from config + wxAuiPaneInfo& progPane = auiMgr_.GetPane(compareStatus_->getAsWindow()); + const wxSize progPaneMinSizeOrig = progPane.min_size; + const wxSize progPaneBestSizeOrig = progPane.best_size; auiMgr_.LoadPerspective(globalSettings.gui.mainDlg.guiPerspectiveLast); //restore original captions - for (const auto& [caption, name] : captionNameMap) - auiMgr_.GetPane(name).Caption(caption); + for (const auto& [paneInfo, caption] : paneCaptions) + paneInfo->Caption(caption); + + progPane.min_size = progPaneMinSizeOrig; + progPane.best_size = progPaneBestSizeOrig; //-------------------------------------------------------------------------------- //if MainDialog::onQueryEndSession() is called while comparison is active, this panel is saved and restored as "visible" - auiMgr_.GetPane(compareStatus_->getAsWindow()).Hide(); + progPane.Hide(); auiMgr_.GetPane(m_panelSearch).Hide(); //no need to show it on startup auiMgr_.GetPane(m_panelLog ).Hide(); // @@ -1197,7 +1208,7 @@ void MainDialog::copySelectionToClipboard(const std::vector& gridRe } catch (const std::bad_alloc& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setMainInstructions(_("Out of memory.") + L" " + utfTo(e.what()))); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setMainInstructions(_("Out of memory.") + L" " + utfTo(e.what()))); } } @@ -1464,7 +1475,7 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool { openWithDefaultApplication(utfTo(AFS::getDisplayPath(folderPath))); //throw FileError } - catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); } + catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } }; if (selectionLeft.empty() && selectionRight.empty()) @@ -1490,7 +1501,7 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool if (globalCfg_.confirmDlgs.confirmCommandMassInvoke) { bool dontAskAgain = false; - switch (showConfirmationDialog(this, DialogInfoType::WARNING, PopupDialogCfg(). + switch (showConfirmationDialog(this, DialogInfoType::warning, PopupDialogCfg(). setTitle(_("Confirm")). setMainInstructions(replaceCpy(_P("Do you really want to execute the command %y for one item?", "Do you really want to execute the command %y for %x items?", invokeCount), @@ -1498,10 +1509,10 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool setCheckBox(dontAskAgain, _("&Don't show this warning again")), _("&Execute"))) { - case ConfirmationButton::ACCEPT: + case ConfirmationButton::accept: globalCfg_.confirmDlgs.confirmCommandMassInvoke = !dontAskAgain; break; - case ConfirmationButton::CANCEL: + case ConfirmationButton::cancel: return; } } @@ -1545,7 +1556,7 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool setLastOperationLog(r.summary, r.errorLog); - if (r.summary.finalStatus == SyncResult::ABORTED) + if (r.summary.finalStatus == SyncResult::aborted) return; //updateGui(); -> not needed @@ -1559,53 +1570,10 @@ void MainDialog::openExternalApplication(const Zstring& commandLinePhrase, bool invokeCommandLine< LEFT_SIDE>(cmdExpanded, selectionLeft, tempFileBuf_); //throw FileError invokeCommandLine(cmdExpanded, selectionRight, tempFileBuf_); // } - catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); } + catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } } -void MainDialog::setStatusBarFileStats(size_t fileCountLeft, - size_t folderCountLeft, - uint64_t bytesLeft, - size_t fileCountRight, - size_t folderCountRight, - uint64_t bytesRight) -{ - - //select state - bSizerFileStatus->Show(true); - m_staticTextFullStatus->Hide(); - - //update status information - bSizerStatusLeftDirectories->Show(folderCountLeft > 0); - bSizerStatusLeftFiles ->Show(fileCountLeft > 0); - - setText(*m_staticTextStatusLeftDirs, _P("1 directory", "%x directories", folderCountLeft)); - setText(*m_staticTextStatusLeftFiles, _P("1 file", "%x files", fileCountLeft)); - setText(*m_staticTextStatusLeftBytes, L"(" + formatFilesizeShort(bytesLeft) + L")"); - //------------------------------------------------------------------------------ - bSizerStatusRightDirectories->Show(folderCountRight > 0); - bSizerStatusRightFiles ->Show(fileCountRight > 0); - - setText(*m_staticTextStatusRightDirs, _P("1 directory", "%x directories", folderCountRight)); - setText(*m_staticTextStatusRightFiles, _P("1 file", "%x files", fileCountRight)); - setText(*m_staticTextStatusRightBytes, L"(" + formatFilesizeShort(bytesRight) + L")"); - //------------------------------------------------------------------------------ - wxString statusCenterNew; - if (filegrid::getDataView(*m_gridMainC).rowsTotal() > 0) - { - statusCenterNew = _P("Showing %y of 1 row", "Showing %y of %x rows", filegrid::getDataView(*m_gridMainC).rowsTotal()); - replace(statusCenterNew, L"%y", formatNumber(filegrid::getDataView(*m_gridMainC).rowsOnView())); //%x is already used as plural form placeholder! - } - - //fill middle text (considering flashStatusInformation()) - if (oldStatusMsgs_.empty()) - setText(*m_staticTextStatusCenter, statusCenterNew); - else - oldStatusMsgs_.front() = statusCenterNew; - - m_panelStatusBar->Layout(); -} - void MainDialog::flashStatusInformation(const wxString& text) { @@ -2619,14 +2587,6 @@ void MainDialog::onGridLabelContextRim(Grid& grid, ColumnTypeRim type, bool left } -void MainDialog::resetLayout() -{ - m_splitterMain->setSashOffset(0); - auiMgr_.LoadPerspective(defaultPerspective_); - updateGuiForFolderPair(); -} - - void MainDialog::onOpenMenuTools(wxMenuEvent& event) { //each layout menu item is either shown and owned by m_menuTools OR detached from m_menuTools and owned by detachedMenuItems_: @@ -2652,11 +2612,20 @@ void MainDialog::onOpenMenuTools(wxMenuEvent& event) } +void MainDialog::resetLayout() +{ + + m_splitterMain->setSashOffset(0); + auiMgr_.LoadPerspective(defaultPerspective_); + updateGuiForFolderPair(); +} + + void MainDialog::OnContextSetLayout(wxMouseEvent& event) { ContextMenu menu; - menu.addItem(replaceCpy(_("&Reset layout"), L"&", L""), [&] { resetLayout(); }); //reuse translation from gui builder + menu.addItem(replaceCpy(_("&Reset layout"), L"&", L""), [&] { resetLayout(); }); //reuse translation from GUI builder //---------------------------------------------------------------------------------------- bool addedSeparator = false; @@ -2848,22 +2817,22 @@ void MainDialog::OnConfigSave(wxCommandEvent& event) { switch (getXmlType(activeCfgFilePath)) //throw FileError { - case XmlType::GUI: + case XmlType::gui: trySaveConfig(&activeCfgFilePath); break; - case XmlType::BATCH: + case XmlType::batch: trySaveBatchConfig(&activeCfgFilePath); break; - case XmlType::GLOBAL: - case XmlType::OTHER: - showNotificationDialog(this, DialogInfoType::ERROR2, + case XmlType::global: + case XmlType::other: + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(activeCfgFilePath)))); break; } } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } } @@ -2920,7 +2889,7 @@ bool MainDialog::trySaveConfig(const Zstring* guiCfgPath) //return true if saved } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); return false; } } @@ -2940,7 +2909,7 @@ bool MainDialog::trySaveBatchConfig(const Zstring* batchCfgPath) if (batchCfgPath) referenceBatchFile = *batchCfgPath; else if (!activeCfgFilePath.empty()) - if (getXmlType(activeCfgFilePath) == XmlType::BATCH) //throw FileError + if (getXmlType(activeCfgFilePath) == XmlType::batch) //throw FileError referenceBatchFile = activeCfgFilePath; if (!referenceBatchFile.empty()) @@ -2955,7 +2924,7 @@ bool MainDialog::trySaveBatchConfig(const Zstring* batchCfgPath) } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); return false; } @@ -3004,7 +2973,7 @@ bool MainDialog::trySaveBatchConfig(const Zstring* batchCfgPath) } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); return false; } } @@ -3024,41 +2993,41 @@ bool MainDialog::saveOldConfig() //return false on user abort //only if check is active and non-default config file loaded { bool neverSaveChanges = false; - switch (showQuestionDialog(this, DialogInfoType::INFO, PopupDialogCfg(). + switch (showQuestionDialog(this, DialogInfoType::info, PopupDialogCfg(). setTitle(utfTo(activeCfgFilePath)). setMainInstructions(replaceCpy(_("Do you want to save changes to %x?"), L"%x", fmtPath(afterLast(activeCfgFilePath, FILE_NAME_SEPARATOR, IF_MISSING_RETURN_ALL)))). - setCheckBox(neverSaveChanges, _("Never save &changes"), QuestionButton2::YES), + setCheckBox(neverSaveChanges, _("Never save &changes"), QuestionButton2::yes), _("&Save"), _("Do&n't save"))) { - case QuestionButton2::YES: //save + case QuestionButton2::yes: //save try { switch (getXmlType(activeCfgFilePath)) //throw FileError { - case XmlType::GUI: + case XmlType::gui: return trySaveConfig(&activeCfgFilePath); - case XmlType::BATCH: + case XmlType::batch: return trySaveBatchConfig(&activeCfgFilePath); - case XmlType::GLOBAL: - case XmlType::OTHER: - showNotificationDialog(this, DialogInfoType::ERROR2, + case XmlType::global: + case XmlType::other: + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtPath(activeCfgFilePath)))); return false; } } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); return false; } break; - case QuestionButton2::NO: //don't save + case QuestionButton2::no: //don't save globalCfg_.confirmDlgs.popupOnConfigChange = !neverSaveChanges; break; - case QuestionButton2::CANCEL: + case QuestionButton2::cancel: return false; } } @@ -3153,7 +3122,7 @@ bool MainDialog::loadConfiguration(const std::vector& filePaths) if (!warningMsg.empty()) { - showNotificationDialog(this, DialogInfoType::WARNING, PopupDialogCfg().setDetailInstructions(warningMsg)); + showNotificationDialog(this, DialogInfoType::warning, PopupDialogCfg().setDetailInstructions(warningMsg)); setConfig(newGuiCfg, filePaths); setLastUsedConfig(XmlGuiConfig(), filePaths); //simulate changed config due to parsing errors return true; @@ -3161,7 +3130,7 @@ bool MainDialog::loadConfiguration(const std::vector& filePaths) } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); return false; } @@ -3217,7 +3186,7 @@ void MainDialog::renameSelectedCfgHistoryItem() return; if (cfg->isLastRunCfg) - return showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions( + return showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions( replaceCpy(_("%x cannot be renamed."), L"%x", fmtPath(cfg->name)))); const Zstring cfgPathOld = cfg->cfgItem.cfgFilePath; @@ -3258,7 +3227,7 @@ void MainDialog::renameSelectedCfgHistoryItem() moveAndRenameItem(cfgPathOld, cfgPathNew, false /*replaceExisting*/); //throw FileError, (ErrorMoveUnsupported), ErrorTargetExisting } - catch (const FileError& e) { return showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); } + catch (const FileError& e) { return showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } cfggrid::getDataView(*m_gridCfgHistory).removeItems({ cfgPathOld }); m_gridCfgHistory->Refresh(); //grid size changed => clears selection! @@ -3427,6 +3396,7 @@ void MainDialog::setLastUsedConfig(const XmlGuiConfig& guiConfig, const std::vec void MainDialog::setConfig(const XmlGuiConfig& newGuiCfg, const std::vector& referenceFiles) { + currentCfg_ = newGuiCfg; //evaluate new settings... @@ -3842,7 +3812,7 @@ void MainDialog::OnCompare(wxCommandEvent& event) setLastOperationLog(r.summary, r.errorLog); - if (r.summary.finalStatus == SyncResult::ABORTED) + if (r.summary.finalStatus == SyncResult::aborted) return updateGui(); //refresh grid in ANY case! (also on abort) @@ -3858,8 +3828,13 @@ void MainDialog::OnCompare(wxCommandEvent& event) //play (optional) sound notification if (!globalCfg_.soundFileCompareFinished.empty() && fileAvailable(globalCfg_.soundFileCompareFinished)) + { + //wxWidgets shows modal error dialog by default => NO! + wxLog* oldLogTarget = wxLog::SetActiveTarget(new wxLogStderr); //transfer and receive ownership! + ZEN_ON_SCOPE_EXIT(delete wxLog::SetActiveTarget(oldLogTarget)); + wxSound::Play(utfTo(globalCfg_.soundFileCompareFinished), wxSOUND_ASYNC); - //warning: this may fail and show a wxWidgets error message! => must not play when running FFS without user interaction! + } if (!IsActive()) RequestUserAttention(); @@ -3878,7 +3853,7 @@ void MainDialog::OnCompare(wxCommandEvent& event) flashStatusInformation(_("All files are in sync")); //update last sync date for selected cfg files https://freefilesync.org/forum/viewtopic.php?t=4991 - if (r.summary.finalStatus == SyncResult::FINISHED_WITH_SUCCESS) + if (r.summary.finalStatus == SyncResult::finishedSuccess) updateConfigLastRunStats(std::chrono::system_clock::to_time_t(startTime), r.summary.finalStatus, getNullPath() /*logFilePath*/); } } @@ -3886,6 +3861,7 @@ void MainDialog::OnCompare(wxCommandEvent& event) void MainDialog::updateGui() { + updateGridViewData(); //update gridDataView and write status information updateStatistics(); @@ -4099,7 +4075,7 @@ void MainDialog::OnStartSync(wxCommandEvent& event) shutdownSystem(); //throw FileError terminateProcess(0 /*exitCode*/); //no point in continuing and saving cfg again in ~MainDialog()/onQueryEndSession() while the OS will kill us anytime! } - catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); } + catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } //[!] ignores current error handling setting, BUT this is not a sync error! break; } @@ -4279,13 +4255,13 @@ void MainDialog::setLastOperationLog(const ProcessSummary& summary, const std::s { switch (summary.finalStatus) { - case SyncResult::FINISHED_WITH_SUCCESS: + case SyncResult::finishedSuccess: return getResourceImage(L"status_finished_success"); - case SyncResult::FINISHED_WITH_WARNINGS: + case SyncResult::finishedWarning: return getResourceImage(L"status_finished_warnings"); - case SyncResult::FINISHED_WITH_ERROR: + case SyncResult::finishedError: return getResourceImage(L"status_finished_errors"); - case SyncResult::ABORTED: + case SyncResult::aborted: return getResourceImage(L"status_aborted"); } assert(false); @@ -4296,12 +4272,12 @@ void MainDialog::setLastOperationLog(const ProcessSummary& summary, const std::s { switch (summary.finalStatus) { - case SyncResult::FINISHED_WITH_SUCCESS: + case SyncResult::finishedSuccess: break; - case SyncResult::FINISHED_WITH_WARNINGS: + case SyncResult::finishedWarning: return getResourceImage(L"msg_warning_sicon"); - case SyncResult::FINISHED_WITH_ERROR: - case SyncResult::ABORTED: + case SyncResult::finishedError: + case SyncResult::aborted: return getResourceImage(L"msg_error_sicon"); } return wxNullBitmap; @@ -4314,19 +4290,23 @@ void MainDialog::setLastOperationLog(const ProcessSummary& summary, const std::s m_staticTextItemsProcessed->SetLabel(formatNumber(summary.statsProcessed.items)); m_staticTextBytesProcessed->SetLabel(L"(" + formatFilesizeShort(summary.statsProcessed.bytes) + L")"); - if ((summary.statsTotal.items < 0 && summary.statsTotal.bytes < 0) || //no total items/bytes: e.g. for pure folder comparison - summary.statsProcessed == summary.statsTotal) //...if everything was processed successfully - m_panelItemsRemaining->Hide(); - else + const bool hideRemainingStats = (summary.statsTotal.items < 0 && summary.statsTotal.bytes < 0) || //no total items/bytes: e.g. for pure folder comparison + summary.statsProcessed == summary.statsTotal; //...if everything was processed successfully + + m_staticTextProcessed ->Show(!hideRemainingStats); + m_staticTextRemaining ->Show(!hideRemainingStats); + m_staticTextItemsRemaining->Show(!hideRemainingStats); + m_staticTextBytesRemaining->Show(!hideRemainingStats); + + if (!hideRemainingStats) { - m_panelItemsRemaining->Show(); m_staticTextItemsRemaining->SetLabel( formatNumber(summary.statsTotal.items - summary.statsProcessed.items)); m_staticTextBytesRemaining->SetLabel(L"(" + formatFilesizeShort(summary.statsTotal.bytes - summary.statsProcessed.bytes) + L")"); } const int64_t totalTimeSec = std::chrono::duration_cast(summary.totalTime).count(); - m_staticTextTotalTime->SetLabel(wxTimeSpan::Seconds(totalTimeSec).Format(L"%H:%M:%S")); + m_staticTextTimeElapsed->SetLabel(wxTimeSpan::Seconds(totalTimeSec).Format(L"%H:%M:%S")); //totalTimeSec < 3600 ? wxTimeSpan::Seconds(totalTimeSec).Format(L"%M:%S") -> let's use full precision for max. clarity: https://freefilesync.org/forum/viewtopic.php?t=6308 logPanel_->setLog(errorLog); @@ -4513,7 +4493,7 @@ void MainDialog::OnSwapSides(wxCommandEvent& event) } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } updateGui(); @@ -4674,6 +4654,49 @@ void MainDialog::updateGridViewData() } +void MainDialog::setStatusBarFileStats(size_t fileCountLeft, + size_t folderCountLeft, + uint64_t bytesLeft, + size_t fileCountRight, + size_t folderCountRight, + uint64_t bytesRight) +{ + //select state + bSizerFileStatus->Show(true); + m_staticTextFullStatus->Hide(); + + //update status information + bSizerStatusLeftDirectories->Show(folderCountLeft > 0); + bSizerStatusLeftFiles ->Show(fileCountLeft > 0); + + setText(*m_staticTextStatusLeftDirs, _P("1 directory", "%x directories", folderCountLeft)); + setText(*m_staticTextStatusLeftFiles, _P("1 file", "%x files", fileCountLeft)); + setText(*m_staticTextStatusLeftBytes, L"(" + formatFilesizeShort(bytesLeft) + L")"); + //------------------------------------------------------------------------------ + bSizerStatusRightDirectories->Show(folderCountRight > 0); + bSizerStatusRightFiles ->Show(fileCountRight > 0); + + setText(*m_staticTextStatusRightDirs, _P("1 directory", "%x directories", folderCountRight)); + setText(*m_staticTextStatusRightFiles, _P("1 file", "%x files", fileCountRight)); + setText(*m_staticTextStatusRightBytes, L"(" + formatFilesizeShort(bytesRight) + L")"); + //------------------------------------------------------------------------------ + wxString statusCenterNew; + if (filegrid::getDataView(*m_gridMainC).rowsTotal() > 0) + { + statusCenterNew = _P("Showing %y of 1 row", "Showing %y of %x rows", filegrid::getDataView(*m_gridMainC).rowsTotal()); + replace(statusCenterNew, L"%y", formatNumber(filegrid::getDataView(*m_gridMainC).rowsOnView())); //%x is already used as plural form placeholder! + } + + //fill middle text (considering flashStatusInformation()) + if (oldStatusMsgs_.empty()) + setText(*m_staticTextStatusCenter, statusCenterNew); + else + oldStatusMsgs_.front() = statusCenterNew; + + m_panelStatusBar->Layout(); +} + + void MainDialog::applyFilterConfig() { applyFiltering(folderCmp_, getConfig().mainCfg); @@ -4691,7 +4714,7 @@ void MainDialog::applySyncDirections() } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } updateGui(); } @@ -4793,7 +4816,7 @@ void MainDialog::startFindNext(bool searchAscending) //F3 or ENTER in m_textCtrl else { showFindPanel(); - showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg(). + showNotificationDialog(this, DialogInfoType::info, PopupDialogCfg(). setTitle(_("Find")). setMainInstructions(replaceCpy(_("Cannot find %x"), L"%x", fmtPath(searchString)))); } @@ -4959,7 +4982,6 @@ void MainDialog::onAddFolderPairKeyEvent(wxKeyEvent& event) void MainDialog::updateGuiForFolderPair() { - recalcMaxFolderPairsVisible(); //adapt delete top folder pair button @@ -5129,7 +5151,6 @@ void MainDialog::removeAddFolderPair(size_t pos) void MainDialog::setAddFolderPairs(const std::vector& newPairs) { - additionalFolderPairs_.clear(); bSizerAddFolderPairs->Clear(true); @@ -5163,7 +5184,7 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) const Zstring filePath = utfTo(filePicker.GetPath()); - //http://en.wikipedia.org/wiki/Comma-separated_values + //https://en.wikipedia.org/wiki/Comma-separated_values const lconv* localInfo = ::localeconv(); //always bound according to doc const bool haveCommaAsDecimalSep = std::string(localInfo->decimal_point) == ","; @@ -5272,7 +5293,7 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } } } diff --git a/FreeFileSync/Source/ui/progress_indicator.cpp b/FreeFileSync/Source/ui/progress_indicator.cpp index 8e07f890..f3339193 100644 --- a/FreeFileSync/Source/ui/progress_indicator.cpp +++ b/FreeFileSync/Source/ui/progress_indicator.cpp @@ -26,6 +26,7 @@ #include "gui_generated.h" #include "../base/ffs_paths.h" #include "../base/perf_check.h" +#include "../base/icon_buffer.h" #include "tray_icon.h" #include "taskbar.h" #include "log_panel.h" @@ -180,12 +181,13 @@ CompareProgressDialog::Impl::Impl(wxFrame& parentWindow) : CompareProgressDlgGenerated(&parentWindow), parentWindow_(parentWindow) { + m_bitmapItemStat->SetBitmap(IconBuffer::genericFileIcon(IconBuffer::SIZE_SMALL)); + m_bitmapTimeStat->SetBitmap(getResourceImage(L"cmp_file_time_sicon")); + 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(); + //make sure that standard height matches PHASE_COMPARING_CONTENT statistics layout (== largest) //init graph m_panelProgressGraph->setAttributes(Graph2D::MainAttributes().setMinY(0).setMaxY(2). @@ -200,7 +202,8 @@ CompareProgressDialog::Impl::Impl(wxFrame& parentWindow) : m_panelProgressGraph->addCurve(std::make_shared(), Graph2D::CurveAttributes().setLineWidth(1).setColor(Graph2D::getBorderColor())); Layout(); - m_panelStatistics->Layout(); + m_panelItemStats->Layout(); + m_panelTimeStats->Layout(); GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!! @@ -218,22 +221,8 @@ void CompareProgressDialog::Impl::init(const Statistics& syncStat, bool ignoreEr } catch (const TaskbarNotAvailable&) {} - //initialize progress indicator - bSizerProgressGraph->Show(false); - - perf_ = PerfCheck(WINDOW_REMAINING_TIME, WINDOW_BYTES_PER_SEC); stopWatch_.restart(); //measure total time - //initially hide status that's relevant for comparing bytewise only - m_staticTextItemsFoundLabel->Show(); - m_staticTextItemsFound ->Show(); - - m_staticTextItemsRemainingLabel->Hide(); - bSizerItemsRemaining ->Show(false); - - m_staticTextTimeRemainingLabel->Hide(); - m_staticTextTimeRemaining ->Hide(); - setText(*m_staticTextRetryCount, std::wstring(L"(") + formatNumber(automaticRetryCount) + MULT_SIGN + L")"); bSizerErrorsRetry->Show(automaticRetryCount > 0); @@ -241,10 +230,8 @@ void CompareProgressDialog::Impl::init(const Statistics& syncStat, bool ignoreEr ignoreErrors_ = ignoreErrors; updateStaticGui(); - updateProgressGui(); - Layout(); - m_panelStatistics->Layout(); + initNewPhase(); } @@ -263,31 +250,23 @@ void CompareProgressDialog::Impl::initNewPhase() timeLastSpeedEstimate_ = std::chrono::seconds(-100); //make sure estimate is updated upon next check phaseStart_ = stopWatch_.elapsed(); - switch (syncStat_->currentPhase()) - { - case ProcessCallback::PHASE_NONE: - assert(false); - case ProcessCallback::PHASE_SCANNING: - break; - - case ProcessCallback::PHASE_COMPARING_CONTENT: - case ProcessCallback::PHASE_SYNCHRONIZING: - bSizerProgressGraph->Show(true); + const int itemsTotal = syncStat_->getStatsTotal(syncStat_->currentPhase()).items; + const int64_t bytesTotal = syncStat_->getStatsTotal(syncStat_->currentPhase()).bytes; - //show status for comparing bytewise - m_staticTextItemsFoundLabel->Hide(); - m_staticTextItemsFound ->Hide(); + const bool haveTotalStats = itemsTotal >= 0 || bytesTotal >= 0; - m_staticTextItemsRemainingLabel->Show(); - bSizerItemsRemaining ->Show(true); + if (taskbar_.get()) taskbar_->setStatus(haveTotalStats ? Taskbar::STATUS_NORMAL : Taskbar::STATUS_INDETERMINATE); - m_staticTextTimeRemainingLabel->Show(); - m_staticTextTimeRemaining ->Show(); + m_staticTextProcessed ->Show(haveTotalStats); + m_staticTextRemaining ->Show(haveTotalStats); + m_staticTextItemsRemaining->Show(haveTotalStats); + m_staticTextBytesRemaining->Show(haveTotalStats); + m_staticTextTimeRemaining ->Show(haveTotalStats); + bSizerProgressGraph ->Show(haveTotalStats); - Layout(); - m_panelStatistics->Layout(); - break; - } + Layout(); + m_panelItemStats->Layout(); + m_panelTimeStats->Layout(); updateProgressGui(); } @@ -320,86 +299,89 @@ void CompareProgressDialog::Impl::updateProgressGui() const int itemsTotal = syncStat_->getStatsTotal (syncStat_->currentPhase()).items; const int64_t bytesTotal = syncStat_->getStatsTotal (syncStat_->currentPhase()).bytes; + const bool haveTotalStats = itemsTotal >= 0 || bytesTotal >= 0; + //status texts setText(*m_staticTextStatus, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts! - //write status information to taskbar, parent title etc. - switch (syncStat_->currentPhase()) + if (!haveTotalStats) { - case ProcessCallback::PHASE_NONE: - case ProcessCallback::PHASE_SCANNING: - { - const wxString& scannedObjects = formatNumber(itemsCurrent); - - //dialog caption, taskbar - setTitle(scannedObjects + L" | " + getDialogPhaseText(*syncStat_, false /*paused*/)); - if (taskbar_.get()) //support Windows 7 taskbar - taskbar_->setStatus(Taskbar::STATUS_INDETERMINATE); + //dialog caption, taskbar + setTitle(formatNumber(itemsCurrent) + L" | " + getDialogPhaseText(*syncStat_, false /*paused*/)); - //nr of scanned objects - setText(*m_staticTextItemsFound, scannedObjects, &layoutChanged); - } - break; - - case ProcessCallback::PHASE_SYNCHRONIZING: - case ProcessCallback::PHASE_COMPARING_CONTENT: - { - //add both bytes + item count, to handle "deletion-only" cases - const double fractionTotal = bytesTotal + itemsTotal == 0 ? 0 : 1.0 * (bytesCurrent + itemsCurrent) / (bytesTotal + itemsTotal); - const double fractionBytes = bytesTotal == 0 ? 0 : 1.0 * bytesCurrent / bytesTotal; - const double fractionItems = itemsTotal == 0 ? 0 : 1.0 * itemsCurrent / itemsTotal; - - //dialog caption, taskbar - setTitle(formatFraction(fractionTotal) + L" | " + getDialogPhaseText(*syncStat_, false /*paused*/)); - if (taskbar_.get()) - { - taskbar_->setProgress(fractionTotal); - taskbar_->setStatus(Taskbar::STATUS_NORMAL); - } - - //progress indicator, shown for binary comparison only - curveDataBytes_->setFraction(fractionBytes); - curveDataItems_->setFraction(fractionItems); - - //remaining item and byte count - setText(*m_staticTextItemsRemaining, formatNumber(itemsTotal - itemsCurrent), &layoutChanged); - setText(*m_staticTextBytesRemaining, L"(" + formatFilesizeShort(bytesTotal - bytesCurrent) + L")", &layoutChanged); + //progress indicators + //taskbar_ already set to STATUS_INDETERMINATE within initNewPhase() + } + else + { + //add both bytes + item count, to handle "deletion-only" cases + const double fractionTotal = bytesTotal + itemsTotal == 0 ? 0 : 1.0 * (bytesCurrent + itemsCurrent) / (bytesTotal + itemsTotal); + const double fractionBytes = bytesTotal == 0 ? 0 : 1.0 * bytesCurrent / bytesTotal; + const double fractionItems = itemsTotal == 0 ? 0 : 1.0 * itemsCurrent / itemsTotal; - //remaining time and speed: only visible during binary comparison - if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= SPEED_ESTIMATE_UPDATE_INTERVAL) - { - timeLastSpeedEstimate_ = timeElapsed; + //dialog caption, taskbar + setTitle(formatFraction(fractionTotal) + L" | " + getDialogPhaseText(*syncStat_, false /*paused*/)); - if (numeric::dist(phaseStart_, timeElapsed) >= SPEED_ESTIMATE_SAMPLE_INTERVAL) //discard stats for first second: probably messy - perf_.addSample(timeElapsed, itemsCurrent, bytesCurrent); + //progress indicators + if (taskbar_.get()) taskbar_->setProgress(fractionTotal); - //current speed -> Win 7 copy uses 1 sec update interval instead - std::optional bps = perf_.getBytesPerSecond(); - std::optional ips = perf_.getItemsPerSecond(); - m_panelProgressGraph->setAttributes(m_panelProgressGraph->getAttributes().setCornerText(bps ? *bps : L"", Graph2D::CORNER_TOP_LEFT)); - m_panelProgressGraph->setAttributes(m_panelProgressGraph->getAttributes().setCornerText(ips ? *ips : L"", Graph2D::CORNER_BOTTOM_LEFT)); + curveDataBytes_->setFraction(fractionBytes); + curveDataItems_->setFraction(fractionItems); + } - //remaining time: display with relative error of 10% - based on samples taken every 0.5 sec only - //-> call more often than once per second to correctly show last few seconds countdown, but don't call too often to avoid occasional jitter - std::optional remTimeSec = perf_.getRemainingTimeSec(bytesTotal - bytesCurrent); - setText(*m_staticTextTimeRemaining, remTimeSec ? formatRemainingTime(*remTimeSec) : L"-", &layoutChanged); - } + //item and data stats + if (!haveTotalStats) + { + setText(*m_staticTextItemsProcessed, formatNumber(itemsCurrent), &layoutChanged); + setText(*m_staticTextBytesProcessed, L"", &layoutChanged); + } + else + { + setText(*m_staticTextItemsProcessed, formatNumber(itemsCurrent), &layoutChanged); + setText(*m_staticTextBytesProcessed, L"(" + formatFilesizeShort(bytesCurrent) + L")", &layoutChanged); - m_panelProgressGraph->Refresh(); - } - break; + setText(*m_staticTextItemsRemaining, formatNumber(itemsTotal - itemsCurrent), &layoutChanged); + setText(*m_staticTextBytesRemaining, L"(" + formatFilesizeShort(bytesTotal - bytesCurrent) + L")", &layoutChanged); } + //current time elapsed const int64_t timeElapSec = std::chrono::duration_cast(timeElapsed).count(); setText(*m_staticTextTimeElapsed, timeElapSec < 3600 ? wxTimeSpan::Seconds(timeElapSec).Format( L"%M:%S") : wxTimeSpan::Seconds(timeElapSec).Format(L"%H:%M:%S"), &layoutChanged); + if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= SPEED_ESTIMATE_UPDATE_INTERVAL) + { + if (haveTotalStats) //remaining time and speed: only visible during binary comparison + { + timeLastSpeedEstimate_ = timeElapsed; + + 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 + std::optional bps = perf_.getBytesPerSecond(); + std::optional ips = perf_.getItemsPerSecond(); + m_panelProgressGraph->setAttributes(m_panelProgressGraph->getAttributes().setCornerText(bps ? *bps : L"", Graph2D::CORNER_TOP_LEFT)); + m_panelProgressGraph->setAttributes(m_panelProgressGraph->getAttributes().setCornerText(ips ? *ips : L"", Graph2D::CORNER_BOTTOM_LEFT)); + + //remaining time: display with relative error of 10% - based on samples taken every 0.5 sec only + //-> call more often than once per second to correctly show last few seconds countdown, but don't call too often to avoid occasional jitter + std::optional remTimeSec = perf_.getRemainingTimeSec(bytesTotal - bytesCurrent); + setText(*m_staticTextTimeRemaining, remTimeSec ? formatRemainingTime(*remTimeSec) : std::wstring(1, EM_DASH), &layoutChanged); + } + } + + if (haveTotalStats) + m_panelProgressGraph->Refresh(); + + //adapt layout after content changes above if (layoutChanged) { Layout(); - m_panelStatistics->Layout(); + m_panelItemStats->Layout(); + m_panelTimeStats->Layout(); } //do the ui update @@ -656,8 +638,7 @@ class SyncProgressDialogImpl : public TopLevelDialog, public SyncProgressDialog public: SyncProgressDialogImpl(long style, //wxFrame/wxDialog style const std::function& getTaskbarFrame, - AbortCallback& abortCb, - const std::function& notifyWindowTerminate, + const std::function& userRequestAbort, const Statistics& syncStat, wxFrame* parentFrame, bool showProgress, @@ -668,11 +649,8 @@ public: bool ignoreErrors, size_t automaticRetryCount, PostSyncAction2 postSyncAction); - ~SyncProgressDialogImpl() override; - //call this in StatusUpdater derived class destructor at the LATEST(!) to prevent access to currentStatusUpdater - void showSummary(SyncResult finalStatus, const std::shared_ptr& log /*bound!*/) override; - void closeDirectly(bool restoreParentFrame) override; + Result destroy(bool autoClose, bool restoreParentFrame, SyncResult finalStatus, const std::shared_ptr& log /*bound!*/) override; wxWindow* getWindowIfVisible() override { return this->IsShown() ? this : nullptr; } //workaround OS X bug: if "this" is used as parent window for a modal dialog then this dialog will erroneously un-hide its parent! @@ -710,6 +688,8 @@ private: void OnMinimizeToTray(wxCommandEvent& event) { minimizeToTray(); } //void OnToggleIgnoreErrors(wxCommandEvent& event) { updateStaticGui(); } + void showSummary(SyncResult finalStatus, const std::shared_ptr& log /*bound!*/); + void minimizeToTray(); void resumeFromSystray(); @@ -727,14 +707,12 @@ private: wxFrame* parentFrame_; //optional - std::function notifyWindowTerminate_; //call once in OnClose(), NOT in destructor which is called far too late somewhere in wxWidgets main loop! + const std::function userRequestAbort_; //cancel button or dialog close //status variables - const Statistics* syncStat_; // - AbortCallback* abortCb_; //valid only while sync is running + const Statistics* syncStat_; //valid only while sync is running bool paused_ = false; - const std::shared_ptr lifeSign_ = std::make_shared(42); //only bound while instance exists, see pause handling in updateProgressGui() - //wxWindow::Delete(), equals "delete this" on OS X! + bool okayPressed_ = false; //remaining time PerfCheck perf_{ WINDOW_REMAINING_TIME, WINDOW_BYTES_PER_SEC }; @@ -762,8 +740,7 @@ private: template SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxFrame/wxDialog style const std::function& getTaskbarFrame, - AbortCallback& abortCb, - const std::function& notifyWindowTerminate, + const std::function& userRequestAbort, const Statistics& syncStat, wxFrame* parentFrame, bool showProgress, @@ -780,9 +757,8 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF jobName_ (jobName), soundFileSyncComplete_(soundFileSyncComplete), parentFrame_(parentFrame), - notifyWindowTerminate_(notifyWindowTerminate), - syncStat_ (&syncStat), - abortCb_ (&abortCb) + userRequestAbort_(userRequestAbort), + syncStat_(&syncStat) { static_assert(std::is_same_v || std::is_same_v); @@ -829,15 +805,17 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF } catch (const TaskbarNotAvailable&) {} - //hide "processed" statistics until end of process + //hide until end of process: pnl_.m_notebookResult ->Hide(); - pnl_.m_panelItemsProcessed->Hide(); pnl_.m_buttonClose ->Show(false); //set std order after button visibility was set setStandardButtonLayout(*pnl_.bSizerStdButtons, StdButtons().setAffirmative(pnl_.m_buttonPause).setCancel(pnl_.m_buttonStop)); pnl_.m_bpButtonMinimizeToTray->SetBitmapLabel(getResourceImage(L"minimize_to_tray")); + pnl_.m_bitmapItemStat->SetBitmap(IconBuffer::genericFileIcon(IconBuffer::SIZE_SMALL)); + pnl_.m_bitmapTimeStat->SetBitmap(getResourceImage(L"cmp_file_time_sicon")); + pnl_.m_bitmapIgnoreErrors->SetBitmap(getResourceImage(L"error_ignore_active")); pnl_.m_bitmapRetryErrors ->SetBitmap(getResourceImage(L"error_retry")); @@ -880,17 +858,20 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF pnl_.m_bitmapGraphKeyBytes->SetBitmap(generateSquareBitmap(getColorBytes(), getColorBytesRim())); pnl_.m_bitmapGraphKeyItems->SetBitmap(generateSquareBitmap(getColorItems(), getColorItemsRim())); + + pnl_.bSizerDynSpace->SetMinSize(yLabelWidth, -1); //ensure item/time stats are nicely centered + 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 ignoreErrors_ = ignoreErrors; - enumPostSyncAction_.add(PostSyncAction2::NONE, L""); + enumPostSyncAction_.add(PostSyncAction2::none, L""); if (parentFrame_) //enable EXIT option for gui mode sync - enumPostSyncAction_.add(PostSyncAction2::EXIT, replaceCpy(_("E&xit"), L"&", L"")); //reuse translation - enumPostSyncAction_.add(PostSyncAction2::SLEEP, _("System: Sleep")); - enumPostSyncAction_.add(PostSyncAction2::SHUTDOWN, _("System: Shut down")); + enumPostSyncAction_.add(PostSyncAction2::exit, replaceCpy(_("E&xit"), L"&", L"")); //reuse translation + enumPostSyncAction_.add(PostSyncAction2::sleep, _("System: Sleep")); + enumPostSyncAction_.add(PostSyncAction2::shutdown, _("System: Shut down")); setEnumVal(enumPostSyncAction_, *pnl_.m_choicePostSyncAction, postSyncAction); @@ -898,6 +879,8 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF updateStaticGui(); //null-status will be shown while waiting for dir locks + //make sure that standard height matches PHASE_COMPARING_CONTENT statistics layout (== largest) + this->GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() pnl_.Layout(); this->Center(); //call *after* dialog layout update and *before* wxWindow::Show()! @@ -915,26 +898,6 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(long style, //wxF } -template -SyncProgressDialogImpl::~SyncProgressDialogImpl() -{ - if (parentFrame_) - { - parentFrame_->Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SyncProgressDialogImpl::onParentKeyEvent), nullptr, this); - - parentFrame_->SetTitle(parentTitleBackup_); //restore title text - - //make sure main dialog is shown again if still "minimized to systray"! see SyncProgressDialog::closeDirectly() - parentFrame_->Show(); - //if (parentFrame_->IsIconized()) //caveat: if window is maximized calling Iconize(false) will erroneously un-maximize! - // parentFrame_->Iconize(false); - } - //else: don't call "TransformProcessType": consider "switch to main dialog" option during silent batch run - - //our client is NOT expecting a second call via notifyWindowTerminate_()! -} - - template void SyncProgressDialogImpl::onLocalKeyEvent(wxKeyEvent& event) { @@ -1067,11 +1030,12 @@ void SyncProgressDialogImpl::updateProgressGui(bool allowYield) const int itemsTotal = syncStat_->getStatsTotal (syncStat_->currentPhase()).items; const int64_t bytesTotal = syncStat_->getStatsTotal (syncStat_->currentPhase()).bytes; - //sync status text - setText(*pnl_.m_staticTextStatus, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts! + const bool haveTotalStats = itemsTotal >= 0 || bytesTotal >= 0; + //status texts + setText(*pnl_.m_staticTextStatus, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts! - if (itemsTotal < 0 && bytesTotal < 0) + if (!haveTotalStats) { //dialog caption, taskbar, systray tooltip setExternalStatus(getDialogPhaseText(*syncStat_, paused_), formatNumber(itemsCurrent)); //status text may be "paused"! @@ -1093,7 +1057,6 @@ void SyncProgressDialogImpl::updateProgressGui(bool allowYield) if (trayIcon_.get()) trayIcon_->setProgress(fractionTotal); if (taskbar_ .get()) taskbar_ ->setProgress(fractionTotal); - //---------------------------------------------------------------------------------------------------- const double timeTotalSecTentative = bytesCurrent == bytesTotal ? timeElapsedDouble : std::max(curveDataBytesTotal_->getValueX(), timeElapsedDouble); //constant line graph @@ -1110,20 +1073,32 @@ void SyncProgressDialogImpl::updateProgressGui(bool allowYield) curveDataBytes_->addRecord(timeElapsed, bytesCurrent); curveDataItems_->addRecord(timeElapsed, itemsCurrent); - - //remaining objects and data - if (itemsTotal < 0 && bytesTotal < 0) + //item and data stats + if (!haveTotalStats) { - setText(*pnl_.m_staticTextItemsRemaining, L"-", &layoutChanged); + setText(*pnl_.m_staticTextItemsProcessed, formatNumber(itemsCurrent), &layoutChanged); + setText(*pnl_.m_staticTextBytesProcessed, L"", &layoutChanged); + + setText(*pnl_.m_staticTextItemsRemaining, std::wstring(1, EM_DASH), &layoutChanged); setText(*pnl_.m_staticTextBytesRemaining, L"", &layoutChanged); } else { + setText(*pnl_.m_staticTextItemsProcessed, formatNumber(itemsCurrent), &layoutChanged); + setText(*pnl_.m_staticTextBytesProcessed, L"(" + formatFilesizeShort(bytesCurrent) + L")", &layoutChanged); + setText(*pnl_.m_staticTextItemsRemaining, formatNumber(itemsTotal - itemsCurrent), &layoutChanged); setText(*pnl_.m_staticTextBytesRemaining, L"(" + formatFilesizeShort(bytesTotal - bytesCurrent) + L")", &layoutChanged); //it's possible data remaining becomes shortly negative if last file synced has ADS data and the bytesTotal was not yet corrected! } + //current time elapsed + const int64_t timeElapSec = std::chrono::duration_cast(timeElapsed).count(); + + setText(*pnl_.m_staticTextTimeElapsed, timeElapSec < 3600 ? + wxTimeSpan::Seconds(timeElapSec).Format( L"%M:%S") : + wxTimeSpan::Seconds(timeElapSec).Format(L"%H:%M:%S"), &layoutChanged); + //remaining time and speed if (numeric::dist(timeLastSpeedEstimate_, timeElapsed) >= SPEED_ESTIMATE_UPDATE_INTERVAL) { @@ -1139,9 +1114,9 @@ void SyncProgressDialogImpl::updateProgressGui(bool allowYield) pnl_.m_panelGraphItems->setAttributes(pnl_.m_panelGraphItems->getAttributes().setCornerText(ips ? *ips : L"", Graph2D::CORNER_TOP_LEFT)); //remaining time - if (bytesTotal < 0) + if (!haveTotalStats) { - setText(*pnl_.m_staticTextTimeRemaining, L"-", &layoutChanged); + setText(*pnl_.m_staticTextTimeRemaining, std::wstring(1, EM_DASH), &layoutChanged); //ignore graphs: should already have been cleared in initNewPhase() } else @@ -1149,7 +1124,7 @@ void SyncProgressDialogImpl::updateProgressGui(bool allowYield) //remaining time: display with relative error of 10% - based on samples taken every 0.5 sec only //-> call more often than once per second to correctly show last few seconds countdown, but don't call too often to avoid occasional jitter std::optional remTimeSec = perf_.getRemainingTimeSec(bytesTotal - bytesCurrent); - setText(*pnl_.m_staticTextTimeRemaining, remTimeSec ? formatRemainingTime(*remTimeSec) : L"-", &layoutChanged); + setText(*pnl_.m_staticTextTimeRemaining, remTimeSec ? formatRemainingTime(*remTimeSec) : std::wstring(1, EM_DASH), &layoutChanged); //update estimated total time marker with precision of "10% remaining time" only to avoid needless jumping around: const double timeRemainingSec = remTimeSec ? *remTimeSec : 0; @@ -1165,48 +1140,31 @@ void SyncProgressDialogImpl::updateProgressGui(bool allowYield) } } - pnl_.m_panelGraphBytes->Refresh(); pnl_.m_panelGraphItems->Refresh(); - const int64_t timeElapSec = std::chrono::duration_cast(timeElapsed).count(); - - setText(*pnl_.m_staticTextTimeElapsed, timeElapSec < 3600 ? - wxTimeSpan::Seconds(timeElapSec).Format( L"%M:%S") : - wxTimeSpan::Seconds(timeElapSec).Format(L"%H:%M:%S"), &layoutChanged); - //adapt layout after content changes above if (layoutChanged) { pnl_.m_panelProgress->Layout(); //small statistics panels: - //pnl.m_panelItemsProcessed ->Layout(); -> hidden - pnl_.m_panelItemsRemaining->Layout(); - pnl_.m_panelTimeRemaining ->Layout(); - //pnl.m_panelTimeElapsed->Layout(); -> needed? + pnl_.m_panelItemStats->Layout(); + pnl_.m_panelTimeStats->Layout(); } if (allowYield) { - //support for pause button - if (paused_) + if (paused_) //support for pause button { - timerSetStatus(false /*active*/); + PauseTimers dummy(*this); - std::weak_ptr lifeSignWeak(lifeSign_); while (paused_) { - wxTheApp->Yield(); //receive UI message that end pause OR forceful termination! + wxTheApp->Yield(); //receive UI message that ends pause //*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 } - - timerSetStatus(true /*active*/); } else /* @@ -1254,25 +1212,20 @@ void SyncProgressDialogImpl::updateStaticGui() //depends on "syn }(); pnl_.m_bitmapStatus->SetBitmap(statusImage); - //show status on Windows 7 taskbar if (taskbar_.get()) { if (paused_) taskbar_->setStatus(Taskbar::STATUS_PAUSED); else - switch (syncStat_->currentPhase()) - { - case ProcessCallback::PHASE_NONE: - case ProcessCallback::PHASE_SCANNING: - taskbar_->setStatus(Taskbar::STATUS_INDETERMINATE); - break; - - case ProcessCallback::PHASE_COMPARING_CONTENT: - case ProcessCallback::PHASE_SYNCHRONIZING: - taskbar_->setStatus(Taskbar::STATUS_NORMAL); - break; - } + { + const int itemsTotal = syncStat_->getStatsTotal(syncStat_->currentPhase()).items; + const int64_t bytesTotal = syncStat_->getStatsTotal(syncStat_->currentPhase()).bytes; + + const bool haveTotalStats = itemsTotal >= 0 || bytesTotal >= 0; + + taskbar_->setStatus(haveTotalStats ? Taskbar::STATUS_NORMAL : Taskbar::STATUS_INDETERMINATE); + } } //pause button @@ -1286,32 +1239,10 @@ void SyncProgressDialogImpl::updateStaticGui() //depends on "syn } -template -void SyncProgressDialogImpl::closeDirectly(bool restoreParentFrame) //this should really be called "do not call back + schedule deletion" -{ - assert(syncStat_ && abortCb_); - - if (!restoreParentFrame) - parentFrame_ = nullptr; //avoid destructor calls like parentFrame_->Show(), ::TransformProcessType(&psn, kProcessTransformToForegroundApplication); - - paused_ = false; //you never know? - - //resumeFromSystray(); -> NO, instead ~SyncProgressDialogImpl() makes sure that main dialog is shown again! e.g. avoid calls to this/parentFrame_->Raise() - - //ATTENTION: dialog may live a little longer, so watch callbacks! - //e.g. wxGTK calls OnIconize after wxWindow::Close() (better not ask why) and before physical destruction! => indirectly calls updateStaticGui(), which reads syncStat_!!! - syncStat_ = nullptr; - abortCb_ = nullptr; - - this->Close(); //generate close event: do NOT destroy window unconditionally! -} - - -//essential to call this in StatusHandler derived class destructor template void SyncProgressDialogImpl::showSummary(SyncResult finalStatus, const std::shared_ptr& log /*bound!*/) { - assert(syncStat_ && abortCb_); + assert(syncStat_); //at the LATEST(!) to prevent access to currentStatusHandler //enable okay and close events; may be set in this method ONLY @@ -1341,25 +1272,20 @@ void SyncProgressDialogImpl::showSummary(SyncResult finalStatus, pnl_.m_panelGraphBytes->setAttributes(pnl_.m_panelGraphBytes->getAttributes().setCornerText(overallBytesPerSecond, Graph2D::CORNER_TOP_LEFT)); pnl_.m_panelGraphItems->setAttributes(pnl_.m_panelGraphItems->getAttributes().setCornerText(overallItemsPerSecond, Graph2D::CORNER_TOP_LEFT)); - - //show new info box "items processed" - pnl_.m_panelItemsProcessed->Show(); - pnl_.m_staticTextItemsProcessed->SetLabel( formatNumber(itemsProcessed)); - pnl_.m_staticTextBytesProcessed->SetLabel(L"(" + formatFilesizeShort(bytesProcessed) + L")"); - - - if ((itemsTotal < 0 && bytesTotal < 0) || //no total items/bytes: e.g. for pure folder comparison - (itemsProcessed == itemsTotal && // - bytesProcessed == bytesTotal)) //...if everything was processed successfully - pnl_.m_panelItemsRemaining->Hide(); - else + //...if everything was processed successfully + if (itemsTotal >= 0 && bytesTotal >= 0 && //itemsTotal < 0 && bytesTotal < 0 => e.g. cancel during folder comparison + itemsProcessed == itemsTotal && + bytesProcessed == bytesTotal) { - pnl_.m_staticTextItemsRemaining->SetLabel( formatNumber(itemsTotal - itemsProcessed)); - pnl_.m_staticTextBytesRemaining->SetLabel(L"(" + formatFilesizeShort(bytesTotal - bytesProcessed) + L")"); + pnl_.m_staticTextProcessed ->Hide(); + pnl_.m_staticTextRemaining ->Hide(); + pnl_.m_staticTextItemsRemaining->Hide(); + pnl_.m_staticTextBytesRemaining->Hide(); + pnl_.m_staticTextTimeRemaining ->Hide(); } - //hide remaining time - pnl_.m_panelTimeRemaining->Hide(); + //generally not interesting anymore (e.g. items > 0 dur to skipped errors) + pnl_.m_staticTextTimeRemaining->Hide(); const int64_t totalTimeSec = std::chrono::duration_cast(stopWatch_.elapsed()).count(); setText(*pnl_.m_staticTextTimeElapsed, wxTimeSpan::Seconds(totalTimeSec).Format(L"%H:%M:%S")); @@ -1370,20 +1296,19 @@ void SyncProgressDialogImpl::showSummary(SyncResult finalStatus, //------- change class state ------- syncStat_ = nullptr; - abortCb_ = nullptr; //---------------------------------- const wxBitmap statusImage = [&] { switch (finalStatus) { - case SyncResult::FINISHED_WITH_SUCCESS: + case SyncResult::finishedSuccess: return getResourceImage(L"status_finished_success"); - case SyncResult::FINISHED_WITH_WARNINGS: + case SyncResult::finishedWarning: return getResourceImage(L"status_finished_warnings"); - case SyncResult::FINISHED_WITH_ERROR: + case SyncResult::finishedError: return getResourceImage(L"status_finished_errors"); - case SyncResult::ABORTED: + case SyncResult::aborted: return getResourceImage(L"status_aborted"); } assert(false); @@ -1398,13 +1323,13 @@ void SyncProgressDialogImpl::showSummary(SyncResult finalStatus, if (taskbar_.get()) switch (finalStatus) { - case SyncResult::FINISHED_WITH_SUCCESS: - case SyncResult::FINISHED_WITH_WARNINGS: + case SyncResult::finishedSuccess: + case SyncResult::finishedWarning: taskbar_->setStatus(Taskbar::STATUS_NORMAL); break; - case SyncResult::FINISHED_WITH_ERROR: - case SyncResult::ABORTED: + case SyncResult::finishedError: + case SyncResult::aborted: taskbar_->setStatus(Taskbar::STATUS_ERROR); break; } @@ -1486,22 +1411,25 @@ void SyncProgressDialogImpl::showSummary(SyncResult finalStatus, pnl_.m_panelProgress->Layout(); //small statistics panels: - pnl_.m_panelItemsProcessed->Layout(); - pnl_.m_panelItemsRemaining->Layout(); - //pnl.m_panelTimeRemaining->Layout(); -> hidden - //pnl.m_panelTimeElapsed->Layout(); -> needed? + pnl_.m_panelItemStats->Layout(); + pnl_.m_panelTimeStats->Layout(); //play (optional) sound notification after sync has completed -> only play when waiting on results dialog, seems to be pointless otherwise! switch (finalStatus) { - case SyncResult::ABORTED: + case SyncResult::aborted: break; - case SyncResult::FINISHED_WITH_ERROR: - case SyncResult::FINISHED_WITH_WARNINGS: - case SyncResult::FINISHED_WITH_SUCCESS: + case SyncResult::finishedError: + case SyncResult::finishedWarning: + case SyncResult::finishedSuccess: if (!soundFileSyncComplete_.empty() && fileAvailable(soundFileSyncComplete_)) + { + //wxWidgets shows modal error dialog by default => NO! + wxLog* oldLogTarget = wxLog::SetActiveTarget(new wxLogStderr); //transfer and receive ownership! + ZEN_ON_SCOPE_EXIT(delete wxLog::SetActiveTarget(oldLogTarget)); + wxSound::Play(utfTo(soundFileSyncComplete_), wxSOUND_ASYNC); - //warning: this may fail and show a wxWidgets error message! => must not play when running FFS without user interaction! + } //if (::GetForegroundWindow() != GetHWND()) // RequestUserAttention(); -> probably too much since task bar is already colorized with Taskbar::STATUS_ERROR or STATUS_NORMAL @@ -1512,17 +1440,87 @@ void SyncProgressDialogImpl::showSummary(SyncResult finalStatus, } +template +auto SyncProgressDialogImpl::destroy(bool autoClose, bool restoreParentFrame, SyncResult finalStatus, const std::shared_ptr& log /*bound!*/) -> Result +{ + if (autoClose) + { + assert(syncStat_); + + //ATTENTION: dialog may live a little longer, so watch callbacks! + //e.g. wxGTK calls OnIconize after wxWindow::Close() (better not ask why) and before physical destruction! => indirectly calls updateStaticGui(), which reads syncStat_!!! + syncStat_ = nullptr; + } + else + { + showSummary(finalStatus, log); + + //wait until user closes the dialog by pressing "okay" + while (!okayPressed_) + { + wxTheApp->Yield(); //*first* refresh GUI (removing flicker) before sleeping! + std::this_thread::sleep_for(UI_UPDATE_INTERVAL); + } + restoreParentFrame = true; + } + //------------------------------------------------------------------------ + + if (parentFrame_) + { + parentFrame_->Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SyncProgressDialogImpl::onParentKeyEvent), nullptr, this); + + parentFrame_->SetTitle(parentTitleBackup_); //restore title text + + if (restoreParentFrame) + { + //make sure main dialog is shown again if still "minimized to systray"! + parentFrame_->Show(); + //if (parentFrame_->IsIconized()) //caveat: if window is maximized calling Iconize(false) will erroneously un-maximize! + // parentFrame_->Iconize(false); + } + } + //else: don't call "TransformProcessType": consider "switch to main dialog" option during silent batch run + + //------------------------------------------------------------------------ + const bool autoCloseDialog = getOptionAutoCloseDialog(); + + this->Destroy(); //wxWidgets macOS: simple "delete"!!!!!!! + + return { autoCloseDialog }; +} + + template void SyncProgressDialogImpl::OnOkay(wxCommandEvent& event) { - this->Close(); //generate close event: do NOT destroy window unconditionally! + okayPressed_ = true; +} + + +template +void SyncProgressDialogImpl::OnClose(wxCloseEvent& event) +{ + assert(event.CanVeto()); //this better be true: if "this" is parent of a modal error dialog, there is NO way (in hell) we allow destruction here!!! + //note: close cannot be prevented on Windows during system shutdown! => already handled via Application::onQueryEndSession() + event.Veto(); + + okayPressed_ = true; //"temporary" auto-close: preempt closing results dialog + + if (syncStat_) + { + //user closing dialog => cancel sync + auto-close dialog + userRequestAbort_(); + + paused_ = false; //[!] we could be pausing here! + updateStaticGui(); //update status + pause button + } } template void SyncProgressDialogImpl::OnCancel(wxCommandEvent& event) { - if (abortCb_) abortCb_->userRequestAbort(); + userRequestAbort_(); paused_ = false; updateStaticGui(); //update status + pause button @@ -1538,26 +1536,6 @@ void SyncProgressDialogImpl::OnPause(wxCommandEvent& event) } -template -void SyncProgressDialogImpl::OnClose(wxCloseEvent& event) -{ - //this event handler may be called *during* sync! - //=> try to stop sync gracefully and cross fingers: - if (abortCb_) abortCb_->userRequestAbort(); - - notifyWindowTerminate_(); //don't wait until delayed "Destroy()" finally calls destructor -> avoid calls to showSummary()/closeDirectly() - - paused_ = false; //[!] we could be pausing here! - - //now that we notified window termination prematurely, and since showSummary()/closeDirectly() won't be called, make sure we don't call back, too! - //e.g. a second notifyWindowTerminate_() in ~SyncProgressDialogImpl()!!! - syncStat_ = nullptr; - abortCb_ = nullptr; - - this->Destroy(); //wxWidgets OS X: simple "delete"!!!!!!! -} - - template void SyncProgressDialogImpl::OnIconize(wxIconizeEvent& event) { @@ -1635,32 +1613,29 @@ void SyncProgressDialogImpl::resumeFromSystray() //######################################################################################## -SyncProgressDialog* fff::createProgressDialog(AbortCallback& abortCb, - const std::function& notifyWindowTerminate, //note: user closing window cannot be prevented on OS X! (And neither on Windows during system shutdown!) - const Statistics& syncStat, - wxFrame* parentWindow, //may be nullptr - bool showProgress, - bool autoCloseDialog, - const std::chrono::system_clock::time_point& syncStartTime, - const wxString& jobName, - const Zstring& soundFileSyncComplete, - bool ignoreErrors, - size_t automaticRetryCount, - PostSyncAction2 postSyncAction) +SyncProgressDialog* SyncProgressDialog::create(const std::function& userRequestAbort, + const Statistics& syncStat, + wxFrame* parentWindow, //may be nullptr + bool showProgress, + bool autoCloseDialog, + const std::chrono::system_clock::time_point& syncStartTime, + const wxString& jobName, + const Zstring& soundFileSyncComplete, + bool ignoreErrors, + size_t automaticRetryCount, + PostSyncAction2 postSyncAction) { if (parentWindow) //sync from GUI { //due to usual "wxBugs", wxDialog on OS X does not float on its parent; wxFrame OTOH does => hack! //https://groups.google.com/forum/#!topic/wx-users/J5SjjLaBOQE - return new SyncProgressDialogImpl(wxDEFAULT_DIALOG_STYLE | wxMAXIMIZE_BOX | wxMINIMIZE_BOX | wxRESIZE_BORDER, - [&](wxDialog& progDlg) { return parentWindow; }, - abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, syncStartTime, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, postSyncAction); + return new SyncProgressDialogImpl(wxDEFAULT_DIALOG_STYLE | wxMAXIMIZE_BOX | wxMINIMIZE_BOX | wxRESIZE_BORDER, [&](wxDialog& progDlg) { return parentWindow; }, + userRequestAbort, syncStat, parentWindow, showProgress, autoCloseDialog, syncStartTime, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, postSyncAction); } else //FFS batch job { - auto dlg = new SyncProgressDialogImpl(wxDEFAULT_FRAME_STYLE, - [](wxFrame& progDlg) { return &progDlg; }, - abortCb, notifyWindowTerminate, syncStat, parentWindow, showProgress, autoCloseDialog, syncStartTime, jobName, soundFileSyncComplete, ignoreErrors, automaticRetryCount, postSyncAction); + auto dlg = new SyncProgressDialogImpl(wxDEFAULT_FRAME_STYLE, [](wxFrame& progDlg) { return &progDlg; }, + userRequestAbort, syncStat, parentWindow, showProgress, autoCloseDialog, syncStartTime, 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 e2db0533..90f5ddcf 100644 --- a/FreeFileSync/Source/ui/progress_indicator.h +++ b/FreeFileSync/Source/ui/progress_indicator.h @@ -49,19 +49,27 @@ private: enum class PostSyncAction2 { - NONE, - EXIT, - SLEEP, - SHUTDOWN + none, + exit, + sleep, + shutdown }; struct SyncProgressDialog { - //essential to call one of these two methods in StatusUpdater derived class' destructor at the LATEST(!) - //to prevent access to callback to updater (e.g. request abort) - virtual void showSummary(SyncResult finalStatus, const std::shared_ptr& log /*bound!*/) = 0; //sync finished, still dialog may live on - virtual void closeDirectly(bool restoreParentFrame) = 0; //don't wait for user - + static SyncProgressDialog* create(const std::function& userRequestAbort, + const Statistics& syncStat, + wxFrame* parentWindow, //may be nullptr + bool showProgress, + bool autoCloseDialog, + const std::chrono::system_clock::time_point& syncStartTime, + const wxString& jobName, + const Zstring& soundFileSyncComplete, + bool ignoreErrors, + size_t automaticRetryCount, + PostSyncAction2 postSyncAction); + struct Result { bool autoCloseDialog; }; + virtual Result destroy(bool autoClose, bool restoreParentFrame, SyncResult finalStatus, const std::shared_ptr& log /*bound!*/) = 0; //--------------------------------------------------------------------------- virtual wxWindow* getWindowIfVisible() = 0; //may be nullptr; don't abuse, use as parent for modal dialogs only! @@ -84,21 +92,6 @@ protected: }; -SyncProgressDialog* createProgressDialog(AbortCallback& abortCb, - const std::function& notifyWindowTerminate, //note: user closing window cannot be prevented on OS X! (And neither on Windows during system shutdown!) - const Statistics& syncStat, - wxFrame* parentWindow, //may be nullptr - bool showProgress, - bool autoCloseDialog, - const std::chrono::system_clock::time_point& syncStartTime, - 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() - - template class PauseTimers { diff --git a/FreeFileSync/Source/ui/small_dlgs.cpp b/FreeFileSync/Source/ui/small_dlgs.cpp index 2108ea58..97942754 100644 --- a/FreeFileSync/Source/ui/small_dlgs.cpp +++ b/FreeFileSync/Source/ui/small_dlgs.cpp @@ -35,7 +35,7 @@ #include "../base/help_provider.h" #include "../base/path_filter.h" #include "../base/status_handler.h" //updateUiIsAllowed() -#include "../base/generate_logfile.h" +#include "../base/log_file.h" #include "../base/icon_buffer.h" #include "../version/version.h" #include "../afs/concrete.h" @@ -283,7 +283,7 @@ CloudSetupDlg::CloudSetupDlg(wxWindow* parent, Zstring& folderPathPhrase, size_t } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } m_listBoxGdriveUsers->Append(googleUsers); @@ -388,7 +388,7 @@ void CloudSetupDlg::OnGdriveUserAdd(wxCommandEvent& event) [this](const std::variant& result) { if (const FileError* e = std::get_if(&result)) - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e->toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e->toString())); else { const wxString googleUser = utfTo(std::get(result)); @@ -413,10 +413,10 @@ void CloudSetupDlg::OnGdriveUserRemove(wxCommandEvent& event) try { const wxString googleUser = m_listBoxGdriveUsers->GetString(selIdx); - if (showConfirmationDialog(this, DialogInfoType::WARNING, PopupDialogCfg(). + if (showConfirmationDialog(this, DialogInfoType::warning, PopupDialogCfg(). setTitle(_("Confirm")). setMainInstructions(replaceCpy(_("Do you really want to disconnect from user account %x?"), L"%x", googleUser)), - _("&Disconnect")) != ConfirmationButton::ACCEPT) + _("&Disconnect")) != ConfirmationButton::accept) return; googleRemoveUser(utfTo(googleUser)); //throw FileError @@ -426,7 +426,7 @@ void CloudSetupDlg::OnGdriveUserRemove(wxCommandEvent& event) } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } } @@ -454,7 +454,7 @@ void CloudSetupDlg::OnDetectServerChannelLimit(wxCommandEvent& event) } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } } @@ -553,7 +553,7 @@ void CloudSetupDlg::updateGui() break; case SftpAuthType::KEY_FILE: m_radioBtnKeyfile->SetValue(true); - m_staticTextPassword->SetLabel(_("Key password:")); + m_staticTextPassword->SetLabel(_("Key passphrase:")); break; case SftpAuthType::AGENT: m_radioBtnAgent->SetValue(true); @@ -634,7 +634,7 @@ void CloudSetupDlg::OnBrowseCloudFolder(wxCommandEvent& event) } catch (const FileError& e) { - showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); + showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); return; } @@ -649,7 +649,7 @@ void CloudSetupDlg::OnOkay(wxCommandEvent& event) if (type_ == CloudType::sftp && sftpAuthType_ == SftpAuthType::KEY_FILE) if (trimCpy(m_textCtrlKeyfilePath->GetValue()).empty()) { - showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg().setMainInstructions(_("Please enter a file path."))); + showNotificationDialog(this, DialogInfoType::info, PopupDialogCfg().setMainInstructions(_("Please enter a file path."))); //don't show error icon to follow "Windows' encouraging tone" m_textCtrlKeyfilePath->SetFocus(); return; @@ -773,7 +773,7 @@ void CopyToDialog::OnOK(wxCommandEvent& event) //------- parameter validation (BEFORE writing output!) ------- if (trimCpy(targetFolder->getPath()).empty()) { - showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg().setMainInstructions(_("Please enter a target folder."))); + showNotificationDialog(this, DialogInfoType::info, PopupDialogCfg().setMainInstructions(_("Please enter a target folder."))); //don't show error icon to follow "Windows' encouraging tone" m_targetFolderPath->SetFocus(); return; @@ -1345,7 +1345,7 @@ void OptionsDlg::OnShowLogFolder(wxHyperlinkEvent& event) { openWithDefaultApplication(getDefaultLogFolderPath()); //throw FileError } - catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::ERROR2, PopupDialogCfg().setDetailInstructions(e.toString())); } + catch (const FileError& e) { showNotificationDialog(this, DialogInfoType::error, PopupDialogCfg().setDetailInstructions(e.toString())); } } diff --git a/FreeFileSync/Source/ui/sync_cfg.cpp b/FreeFileSync/Source/ui/sync_cfg.cpp index 2fc1e694..1530cfbd 100644 --- a/FreeFileSync/Source/ui/sync_cfg.cpp +++ b/FreeFileSync/Source/ui/sync_cfg.cpp @@ -22,8 +22,8 @@ #include "folder_selector.h" #include "../base/file_hierarchy.h" #include "../base/help_provider.h" +#include "../base/log_file.h" #include "../base/norm_filter.h" -#include "../base/generate_logfile.h" #include "../afs/concrete.h" @@ -334,7 +334,7 @@ commandHistItemsMax_(commandHistItemsMax) //add(UnitTime::THIS_WEEK, _("This week")). add(UnitTime::THIS_MONTH, _("This month")). add(UnitTime::THIS_YEAR, _("This year")). - add(UnitTime::LAST_X_DAYS, replaceCpy(_("Last x days:"), L":", L"")); //reuse translation + add(UnitTime::LAST_X_DAYS, _("Last x days:")); enumSizeDescr_. add(UnitSize::NONE, L"(" + _("None") + L")"). //meta options should be enclosed in parentheses @@ -1364,7 +1364,7 @@ bool ConfigDialog::unselectFolderPairConfig() if (AFS::isNullPath(createAbstractPath(syncCfg->versioningFolderPhrase))) { m_notebook->ChangeSelection(static_cast(SyncConfigPanel::SYNC)); - showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg().setMainInstructions(_("Please enter a target folder for versioning."))); + showNotificationDialog(this, DialogInfoType::info, PopupDialogCfg().setMainInstructions(_("Please enter a target folder for versioning."))); //don't show error icon to follow "Windows' encouraging tone" m_versioningFolderPath->SetFocus(); return false; @@ -1377,7 +1377,7 @@ bool ConfigDialog::unselectFolderPairConfig() syncCfg->versionCountMin >= syncCfg->versionCountMax) { m_notebook->ChangeSelection(static_cast(SyncConfigPanel::SYNC)); - showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg().setMainInstructions(_("Minimum version count must be smaller than maximum count."))); + showNotificationDialog(this, DialogInfoType::info, PopupDialogCfg().setMainInstructions(_("Minimum version count must be smaller than maximum count."))); m_spinCtrlVersionCountMin->SetFocus(); return false; } diff --git a/FreeFileSync/Source/ui/taskbar.cpp b/FreeFileSync/Source/ui/taskbar.cpp index f4e95212..519a1ce1 100644 --- a/FreeFileSync/Source/ui/taskbar.cpp +++ b/FreeFileSync/Source/ui/taskbar.cpp @@ -6,79 +6,18 @@ #include "taskbar.h" -#if defined HAVE_UBUNTU_UNITY - #include - -#endif using namespace zen; using namespace fff; -#if defined HAVE_UBUNTU_UNITY //Ubuntu unity -namespace -{ -const char FFS_DESKTOP_FILE[] = "freefilesync.desktop"; -} - -class Taskbar::Impl //throw (TaskbarNotAvailable) -{ -public: - Impl(const wxFrame& window) : - tbEntry_(unity_launcher_entry_get_for_desktop_id(FFS_DESKTOP_FILE)) - //tbEntry_(unity_launcher_entry_get_for_app_uri("application://freefilesync.desktop")) - { - if (!tbEntry_) - throw TaskbarNotAvailable(); - } - - ~Impl() { setStatus(STATUS_INDETERMINATE); } //it seems UnityLauncherEntry* does not need destruction - - void setStatus(Status status) - { - switch (status) - { - case Taskbar::STATUS_ERROR: - unity_launcher_entry_set_urgent(tbEntry_, true); - break; - - case Taskbar::STATUS_INDETERMINATE: - unity_launcher_entry_set_urgent(tbEntry_, false); - unity_launcher_entry_set_progress_visible(tbEntry_, false); - break; - - case Taskbar::STATUS_NORMAL: - unity_launcher_entry_set_urgent(tbEntry_, false); - unity_launcher_entry_set_progress_visible(tbEntry_, true); - break; - - case Taskbar::STATUS_PAUSED: - unity_launcher_entry_set_urgent(tbEntry_, false); - break; - } - } - - void setProgress(double fraction) - { - unity_launcher_entry_set_progress(tbEntry_, fraction); - } - -private: - Impl (const Impl&) = delete; - Impl& operator=(const Impl&) = delete; - - UnityLauncherEntry* const tbEntry_; -}; - -#else //no taskbar support -class Taskbar::Impl //throw TaskbarNotAvailable +class Taskbar::Impl { public: Impl(const wxFrame& window) { throw TaskbarNotAvailable(); } void setStatus(Status status) {} void setProgress(double fraction) {} }; -#endif //######################################################################################################## diff --git a/FreeFileSync/Source/ui/taskbar.h b/FreeFileSync/Source/ui/taskbar.h index a731b9db..a8aca46b 100644 --- a/FreeFileSync/Source/ui/taskbar.h +++ b/FreeFileSync/Source/ui/taskbar.h @@ -10,15 +10,6 @@ #include #include -/* -Windows 7; show progress in Windows superbar via ITaskbarList3 Interface: https://docs.microsoft.com/de-de/windows/desktop/api/shobjidl_core/nn-shobjidl_core-itaskbarlist3 - -Ubuntu: use Unity interface (optional) - -Define HAVE_UBUNTU_UNITY and set: - Compiler flag: `pkg-config --cflags unity` - Linker flag: `pkg-config --libs unity` -*/ namespace fff { diff --git a/FreeFileSync/Source/ui/tray_icon.h b/FreeFileSync/Source/ui/tray_icon.h index d0aeaf78..240b8c45 100644 --- a/FreeFileSync/Source/ui/tray_icon.h +++ b/FreeFileSync/Source/ui/tray_icon.h @@ -17,10 +17,11 @@ show tray icon with progress during lifetime of this instance ATTENTION: wxWidgets never assumes that an object indirectly destroys itself while processing an event! this includes wxEvtHandler-derived objects!!! - it seems ProcessEvent() works (on Windows), but AddPendingEvent() will crash since it uses "this" after the event processing! + it seems wxTaskBarIcon::ProcessEvent() works (on Windows), but AddPendingEvent() will crash since it uses "this" after the event processing! => don't derive from wxEvtHandler or any other wxWidgets object here!!!!!! -=> use simple std::function as callback instead => instance may now be safely deleted in callback! +=> use simple std::function as callback instead => FfsTrayIcon instance may now be safely deleted in callback + while ~wxTaskBarIcon is delayed via wxPendingDelete */ namespace fff { diff --git a/FreeFileSync/Source/ui/triple_splitter.cpp b/FreeFileSync/Source/ui/triple_splitter.cpp index 0797b807..6e193529 100644 --- a/FreeFileSync/Source/ui/triple_splitter.cpp +++ b/FreeFileSync/Source/ui/triple_splitter.cpp @@ -39,7 +39,7 @@ TripleSplitter::TripleSplitter(wxWindow* parent, { 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 + Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //https://wiki.wxwidgets.org/Flicker-Free_Drawing SetBackgroundStyle(wxBG_STYLE_PAINT); diff --git a/FreeFileSync/Source/ui/version_check.cpp b/FreeFileSync/Source/ui/version_check.cpp index 3434f83d..9d4ae8ef 100644 --- a/FreeFileSync/Source/ui/version_check.cpp +++ b/FreeFileSync/Source/ui/version_check.cpp @@ -168,17 +168,17 @@ void showUpdateAvailableDialog(wxWindow* parent, const std::string& onlineVersio updateDetailsMsg = e.toString() + L"\n\n\n" + updateDetailsMsg; } - switch (showConfirmationDialog(parent, DialogInfoType::INFO, PopupDialogCfg(). + switch (showConfirmationDialog(parent, DialogInfoType::info, PopupDialogCfg(). setIcon(getResourceImage(L"update_available")). setTitle(_("Check for Program Updates")). setMainInstructions(replaceCpy(_("FreeFileSync %x is available!"), L"%x", utfTo(onlineVersion)) + L" " + _("Download now?")). setDetailInstructions(updateDetailsMsg), _("&Download"))) { - case ConfirmationButton::ACCEPT: + case ConfirmationButton::accept: wxLaunchDefaultBrowser(L"https://freefilesync.org/get_latest.php"); break; - case ConfirmationButton::CANCEL: + case ConfirmationButton::cancel: break; } } @@ -238,7 +238,7 @@ void fff::checkForUpdateNow(wxWindow* parent, std::string& lastOnlineVersion) if (haveNewerVersionOnline(onlineVersion)) showUpdateAvailableDialog(parent, onlineVersion); else - showNotificationDialog(parent, DialogInfoType::INFO, PopupDialogCfg(). + showNotificationDialog(parent, DialogInfoType::info, PopupDialogCfg(). setIcon(getResourceImage(L"update_check")). setTitle(_("Check for Program Updates")). setMainInstructions(_("FreeFileSync is up to date."))); @@ -249,31 +249,31 @@ void fff::checkForUpdateNow(wxWindow* parent, std::string& lastOnlineVersion) { lastOnlineVersion = "Unknown"; - switch (showQuestionDialog(parent, DialogInfoType::ERROR2, PopupDialogCfg(). + switch (showQuestionDialog(parent, DialogInfoType::error, PopupDialogCfg(). setTitle(_("Check for Program Updates")). setMainInstructions(_("Cannot find current FreeFileSync version number online. A newer version is likely available. Check manually now?")). setDetailInstructions(e.toString()), _("&Check"), _("&Retry"))) { - case QuestionButton2::YES: + case QuestionButton2::yes: wxLaunchDefaultBrowser(L"https://freefilesync.org/get_latest.php"); break; - case QuestionButton2::NO: //retry + case QuestionButton2::no: //retry checkForUpdateNow(parent, lastOnlineVersion); //note: retry via recursion!!! break; - case QuestionButton2::CANCEL: + case QuestionButton2::cancel: break; } } else - switch (showConfirmationDialog(parent, DialogInfoType::ERROR2, PopupDialogCfg(). + switch (showConfirmationDialog(parent, DialogInfoType::error, PopupDialogCfg(). setTitle(_("Check for Program Updates")). setMainInstructions(replaceCpy(_("Unable to connect to %x."), L"%x", L"freefilesync.org")). setDetailInstructions(e.toString()), _("&Retry"))) { - case ConfirmationButton::ACCEPT: //retry + case ConfirmationButton::accept: //retry checkForUpdateNow(parent, lastOnlineVersion); //note: retry via recursion!!! break; - case ConfirmationButton::CANCEL: + case ConfirmationButton::cancel: break; } } @@ -337,19 +337,19 @@ void fff::automaticUpdateCheckEval(wxWindow* parent, time_t& lastUpdateCheck, st { lastOnlineVersion = "Unknown"; - switch (showQuestionDialog(parent, DialogInfoType::ERROR2, PopupDialogCfg(). + switch (showQuestionDialog(parent, DialogInfoType::error, PopupDialogCfg(). setTitle(_("Check for Program Updates")). setMainInstructions(_("Cannot find current FreeFileSync version number online. A newer version is likely available. Check manually now?")). setDetailInstructions(result.error->toString()), _("&Check"), _("&Retry"))) { - case QuestionButton2::YES: + case QuestionButton2::yes: wxLaunchDefaultBrowser(L"https://freefilesync.org/get_latest.php"); break; - case QuestionButton2::NO: //retry + case QuestionButton2::no: //retry automaticUpdateCheckEval(parent, lastUpdateCheck, lastOnlineVersion, asyncResult); //note: retry via recursion!!! break; - case QuestionButton2::CANCEL: + case QuestionButton2::cancel: break; } } diff --git a/FreeFileSync/Source/version/version.h b/FreeFileSync/Source/version/version.h index c00375d5..ad914ec1 100644 --- a/FreeFileSync/Source/version/version.h +++ b/FreeFileSync/Source/version/version.h @@ -3,7 +3,7 @@ namespace fff { -const char ffsVersion[] = "10.14"; //internal linkage! +const char ffsVersion[] = "10.15"; //internal linkage! const char FFS_VERSION_SEPARATOR = '.'; } diff --git a/wx+/graph.cpp b/wx+/graph.cpp index 41750a48..2440f77d 100644 --- a/wx+/graph.cpp +++ b/wx+/graph.cpp @@ -451,7 +451,7 @@ Graph2D::Graph2D(wxWindow* parent, { Connect(wxEVT_PAINT, wxPaintEventHandler(Graph2D::onPaintEvent), nullptr, this); Connect(wxEVT_SIZE, wxSizeEventHandler (Graph2D::onSizeEvent ), nullptr, this); - Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing + Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //https://wiki.wxwidgets.org/Flicker-Free_Drawing //SetDoubleBuffered(true); slow as hell! diff --git a/wx+/grid.cpp b/wx+/grid.cpp index 804c8fba..851146bc 100644 --- a/wx+/grid.cpp +++ b/wx+/grid.cpp @@ -272,7 +272,7 @@ public: { Connect(wxEVT_PAINT, wxPaintEventHandler(SubWindow::onPaintEvent), nullptr, this); Connect(wxEVT_SIZE, wxSizeEventHandler (SubWindow::onSizeEvent), nullptr, this); - Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //http://wiki.wxwidgets.org/Flicker-Free_Drawing + Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //https://wiki.wxwidgets.org/Flicker-Free_Drawing //SetDoubleBuffered(true); slow as hell! @@ -1326,7 +1326,7 @@ Grid::Grid(wxWindow* parent, 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 + Bind(wxEVT_ERASE_BACKGROUND, [](wxEraseEvent& event) {}); //https://wiki.wxwidgets.org/Flicker-Free_Drawing Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(Grid::onKeyDown), nullptr, this); Connect(wxEVT_KEY_UP, wxKeyEventHandler(Grid::onKeyUp ), nullptr, this); diff --git a/wx+/image_tools.h b/wx+/image_tools.h index b1df41e6..2a0dd0d4 100644 --- a/wx+/image_tools.h +++ b/wx+/image_tools.h @@ -213,7 +213,7 @@ wxColor gradient(const wxColor& from, const wxColor& to, double fraction) inline wxColor hsvColor(double h, double s, double v) //h within [0, 360), s, v within [0, 1] { - //http://de.wikipedia.org/wiki/HSV-Farbraum + //https://de.wikipedia.org/wiki/HSV-Farbraum //make input values fit into bounds if (h > 360) diff --git a/wx+/popup_dlg.cpp b/wx+/popup_dlg.cpp index 8ee44521..11c4511f 100644 --- a/wx+/popup_dlg.cpp +++ b/wx+/popup_dlg.cpp @@ -79,16 +79,16 @@ public: wxString titleTmp; switch (type) { - case DialogInfoType::INFO: + case DialogInfoType::info: //"Information" is meaningless as caption text! //confirmation doesn't use info icon //iconTmp = getResourceImage(L"msg_info"); break; - case DialogInfoType::WARNING: + case DialogInfoType::warning: iconTmp = getResourceImage(L"msg_warning"); titleTmp = _("Warning"); break; - case DialogInfoType::ERROR2: + case DialogInfoType::error: iconTmp = getResourceImage(L"msg_error"); titleTmp = _("Error"); break; @@ -204,28 +204,28 @@ public: } private: - void OnClose (wxCloseEvent& event) override { EndModal(static_cast(ConfirmationButton3::CANCEL)); } - void OnCancel(wxCommandEvent& event) override { EndModal(static_cast(ConfirmationButton3::CANCEL)); } + void OnClose (wxCloseEvent& event) override { EndModal(static_cast(ConfirmationButton3::cancel)); } + void OnCancel(wxCommandEvent& event) override { EndModal(static_cast(ConfirmationButton3::cancel)); } void OnButtonAccept(wxCommandEvent& event) override { if (checkBoxValue_) *checkBoxValue_ = m_checkBoxCustom->GetValue(); - EndModal(static_cast(ConfirmationButton3::ACCEPT)); + EndModal(static_cast(ConfirmationButton3::accept)); } void OnButtonAcceptAll(wxCommandEvent& event) override { if (checkBoxValue_) *checkBoxValue_ = m_checkBoxCustom->GetValue(); - EndModal(static_cast(ConfirmationButton3::ACCEPT_ALL)); + EndModal(static_cast(ConfirmationButton3::acceptAll)); } void OnButtonDecline(wxCommandEvent& event) override { if (checkBoxValue_) *checkBoxValue_ = m_checkBoxCustom->GetValue(); - EndModal(static_cast(ConfirmationButton3::DECLINE)); + EndModal(static_cast(ConfirmationButton3::decline)); } void OnKeyPressed(wxKeyEvent& event) @@ -241,7 +241,7 @@ private: } case WXK_ESCAPE: //handle case where cancel button is hidden! - EndModal(static_cast(ConfirmationButton3::CANCEL)); + EndModal(static_cast(ConfirmationButton3::cancel)); return; } event.Skip(); @@ -253,14 +253,14 @@ private: { switch (buttonToDisableWhenChecked_) { - case QuestionButton2::YES: + case QuestionButton2::yes: m_buttonAccept ->Enable(!m_checkBoxCustom->GetValue()); m_buttonAcceptAll->Enable(!m_checkBoxCustom->GetValue()); break; - case QuestionButton2::NO: + case QuestionButton2::no: m_buttonDecline->Enable(!m_checkBoxCustom->GetValue()); break; - case QuestionButton2::CANCEL: + case QuestionButton2::cancel: break; } } diff --git a/wx+/popup_dlg.h b/wx+/popup_dlg.h index 0acd2a95..1e0a1656 100644 --- a/wx+/popup_dlg.h +++ b/wx+/popup_dlg.h @@ -21,34 +21,34 @@ struct PopupDialogCfg; enum class DialogInfoType { - INFO, - WARNING, - ERROR2, //fuck the ERROR macro in WinGDI.h! + info, + warning, + error, }; enum class ConfirmationButton3 { - ACCEPT, - ACCEPT_ALL, - DECLINE, - CANCEL, + accept, + acceptAll, + decline, + cancel, }; enum class ConfirmationButton { - ACCEPT = static_cast(ConfirmationButton3::ACCEPT), //[!] Clang requires a "static_cast" - CANCEL = static_cast(ConfirmationButton3::CANCEL), // + accept = static_cast(ConfirmationButton3::accept), //[!] Clang requires a "static_cast" + cancel = static_cast(ConfirmationButton3::cancel), // }; enum class ConfirmationButton2 { - ACCEPT = static_cast(ConfirmationButton3::ACCEPT), - ACCEPT_ALL = static_cast(ConfirmationButton3::ACCEPT_ALL), - CANCEL = static_cast(ConfirmationButton3::CANCEL), + accept = static_cast(ConfirmationButton3::accept), + acceptAll = static_cast(ConfirmationButton3::acceptAll), + cancel = static_cast(ConfirmationButton3::cancel), }; enum class QuestionButton2 { - YES = static_cast(ConfirmationButton3::ACCEPT), - NO = static_cast(ConfirmationButton3::DECLINE), - CANCEL = static_cast(ConfirmationButton3::CANCEL), + yes = static_cast(ConfirmationButton3::accept), + no = static_cast(ConfirmationButton3::decline), + cancel = static_cast(ConfirmationButton3::cancel), }; void showNotificationDialog(wxWindow* parent, DialogInfoType type, const PopupDialogCfg& cfg); @@ -66,7 +66,7 @@ struct PopupDialogCfg PopupDialogCfg& setTitle (const wxString& label) { title = label; return *this; } PopupDialogCfg& setMainInstructions (const wxString& label) { textMain = label; return *this; } //set at least one of these! PopupDialogCfg& setDetailInstructions(const wxString& label) { textDetail = label; return *this; } // - PopupDialogCfg& setCheckBox(bool& value, const wxString& label, QuestionButton2 disableWhenChecked = QuestionButton2::CANCEL) + PopupDialogCfg& setCheckBox(bool& value, const wxString& label, QuestionButton2 disableWhenChecked = QuestionButton2::cancel) { checkBoxValue = &value; checkBoxLabel = label; @@ -83,7 +83,7 @@ private: wxString textDetail; bool* checkBoxValue = nullptr; //in/out wxString checkBoxLabel; - QuestionButton2 buttonToDisableWhenChecked = QuestionButton2::CANCEL; + QuestionButton2 buttonToDisableWhenChecked = QuestionButton2::cancel; }; } diff --git a/wx+/rtl.h b/wx+/rtl.h index 16fde699..0cae9bac 100644 --- a/wx+/rtl.h +++ b/wx+/rtl.h @@ -21,7 +21,7 @@ void drawBitmapRtlNoMirror(wxDC& dc, const wxBitmap& bmp, const wxRect& rect, in wxBitmap mirrorIfRtl(const wxBitmap& bmp); -//manual text flow correction: http://www.w3.org/International/articles/inline-bidi-markup/ +//manual text flow correction: https://www.w3.org/International/articles/inline-bidi-markup/ diff --git a/wx+/tooltip.cpp b/wx+/tooltip.cpp index 142c9b7f..42fb058a 100644 --- a/wx+/tooltip.cpp +++ b/wx+/tooltip.cpp @@ -13,6 +13,7 @@ #include #include "image_tools.h" #include "dc.h" + #include using namespace zen; @@ -48,8 +49,8 @@ public: } - wxStaticText* staticTextMain_; - wxStaticBitmap* bitmapLeft_; + wxStaticText* staticTextMain_ = nullptr; + wxStaticBitmap* bitmapLeft_ = nullptr; }; @@ -80,7 +81,7 @@ void Tooltip::show(const wxString& text, wxPoint mousePos, const wxBitmap* bmp) mousePos + wxPoint(fastFromDIP(TIP_WINDOW_OFFSET_DIP), 0); if (newPos != tipWindow_->GetScreenPosition()) - tipWindow_->SetSize(newPos.x, newPos.y, wxDefaultCoord, wxDefaultCoord); + tipWindow_->Move(newPos); //attention!!! possible endless loop: mouse pointer must NOT be within tipWindow! //else it will trigger a wxEVT_LEAVE_WINDOW on middle grid which will hide the window, causing the window to be shown again via this method, etc. @@ -93,8 +94,15 @@ void Tooltip::hide() { if (tipWindow_) { - //on wxGTK the tooltip is sometimes not shown again after it was hidden: e.g. drag-selection on middle grid +#if GTK_MAJOR_VERSION == 2 //the tooltip sometimes turns blank or is not shown again after it was hidden: e.g. drag-selection on middle grid tipWindow_->Destroy(); //apply brute force: tipWindow_ = nullptr; // + +#elif GTK_MAJOR_VERSION == 3 + tipWindow_->Hide(); +#else +#error unknown GTK version! +#endif + } } diff --git a/xBRZ/src/xbrz.cpp b/xBRZ/src/xbrz.cpp index 71c0ec8f..0bf9db17 100644 --- a/xBRZ/src/xbrz.cpp +++ b/xBRZ/src/xbrz.cpp @@ -27,7 +27,7 @@ using namespace xbrz; namespace { template inline -uint32_t gradientRGB(uint32_t pixFront, uint32_t pixBack) //blend front color with opacity M / N over opaque background: http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending +uint32_t gradientRGB(uint32_t pixFront, uint32_t pixBack) //blend front color with opacity M / N over opaque background: https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending { static_assert(0 < M && M < N && N <= 1000); @@ -151,7 +151,7 @@ double distRGB(uint32_t pix1, uint32_t pix2) inline double distYCbCr(uint32_t pix1, uint32_t pix2, double lumaWeight) { - //http://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.601_conversion + //https://en.wikipedia.org/wiki/YCbCr#ITU-R_BT.601_conversion //YCbCr conversion is a matrix multiplication => take advantage of linearity by subtracting first! const int r_diff = static_cast(getRed (pix1)) - getRed (pix2); //we may delay division by 255 to after matrix multiplication const int g_diff = static_cast(getGreen(pix1)) - getGreen(pix2); // diff --git a/zen/base64.h b/zen/base64.h index 54a0a98b..623f8f7f 100644 --- a/zen/base64.h +++ b/zen/base64.h @@ -13,7 +13,7 @@ namespace zen { -//http://en.wikipedia.org/wiki/Base64 +//https://en.wikipedia.org/wiki/Base64 /* Usage: const std::string input = "Sample text"; diff --git a/zen/basic_math.h b/zen/basic_math.h index 75f5d3b8..b9be28be 100644 --- a/zen/basic_math.h +++ b/zen/basic_math.h @@ -254,7 +254,7 @@ double median(RandomAccessIterator first, RandomAccessIterator last) //note: inv template inline double mad(RandomAccessIterator first, RandomAccessIterator last) //note: invalidates input range! { - //http://en.wikipedia.org/wiki/Median_absolute_deviation + //https://en.wikipedia.org/wiki/Median_absolute_deviation const size_t n = last - first; if (n == 0) return 0; @@ -277,7 +277,7 @@ double mad(RandomAccessIterator first, RandomAccessIterator last) //note: invali template inline double stdDeviation(InputIterator first, InputIterator last, double* arithMean) { - //implementation minimizing rounding errors, see: http://en.wikipedia.org/wiki/Standard_deviation + //implementation minimizing rounding errors, see: https://en.wikipedia.org/wiki/Standard_deviation //combined with technique avoiding overflow, see: http://www.netlib.org/blas/dnrm2.f -> only 10% performance degradation size_t n = 0; diff --git a/zen/dir_watcher.h b/zen/dir_watcher.h index f552e2b2..875a0098 100644 --- a/zen/dir_watcher.h +++ b/zen/dir_watcher.h @@ -17,8 +17,8 @@ namespace zen { //Windows: ReadDirectoryChangesW https://msdn.microsoft.com/en-us/library/aa365465 -//Linux: inotify http://linux.die.net/man/7/inotify -//OS X: kqueue http://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/kqueue.2.html +//Linux: inotify https://linux.die.net/man/7/inotify +//OS X: kqueue https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/kqueue.2.html //watch directory including subdirectories /* diff --git a/zen/guid.h b/zen/guid.h index c89e8082..657ed07a 100644 --- a/zen/guid.h +++ b/zen/guid.h @@ -8,7 +8,7 @@ #define GUID_H_80425780237502345 #include //open - #include //close + #include //close, getentropy #include //#include -> uuid_generate(), uuid_unparse(); avoid additional dependency for "sudo apt-get install uuid-dev" @@ -19,6 +19,11 @@ inline std::string generateGUID() //creates a 16-byte GUID { std::string guid(16, '\0'); + +#ifndef __GLIBC__ +#error Where is GLIB? +#endif + #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 25) //getentropy() requires glibc 2.25 (ldd --version) PS: CentOS 7 is on 2.17 if (::getentropy(&guid[0], guid.size()) != 0) //"The maximum permitted value for the length argument is 256" throw std::runtime_error(std::string(__FILE__) + "[" + numberTo(__LINE__) + "] Failed to generate GUID." + diff --git a/zen/http.cpp b/zen/http.cpp index 43c9dcbf..d4c30741 100644 --- a/zen/http.cpp +++ b/zen/http.cpp @@ -46,9 +46,9 @@ public: else //HTTP default port: 80, see %WINDIR%\system32\drivers\etc\services socket_ = std::make_unique(server, Zstr("http")); //throw SysError - //we don't support "chunked transfer encoding" => HTTP 1.0 + //we don't support "chunked and gzip transfer encoding" => HTTP 1.0 std::map headers; - headers["Host" ] = utfTo(server); //only required for HTTP/1.1 + headers["Host" ] = utfTo(server); //only required for HTTP/1.1 but a few servers expect it even for HTTP/1.0 headers["User-Agent"] = utfTo(userAgent); headers["Accept" ] = "*/*"; //won't hurt? @@ -234,7 +234,7 @@ std::unique_ptr sendHttpRequestImpl(const Zstring& url, { auto response = std::make_unique(urlRed, postParams, false /*disableGetCache*/, userAgent, caCertFilePath, notifyUnbufferedIO); //throw SysError - //http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection + //https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection const int statusCode = response->getStatusCode(); if (statusCode / 100 == 3) //e.g. 301, 302, 303, 307... we're not too greedy since we check location, too! { @@ -271,11 +271,10 @@ std::string urlencode(const std::string& str) out += c; else { - const std::pair hex = hexify(c); - + const auto [high, low] = hexify(c); out += '%'; - out += hex.first; - out += hex.second; + out += high; + out += low; } return out; } diff --git a/zen/json.h b/zen/json.h index 374a3f14..9b85ccb9 100644 --- a/zen/json.h +++ b/zen/json.h @@ -104,10 +104,10 @@ std::string jsonEscape(const std::string& str) else if (static_cast(c) < 32) { - const auto hexDigits = hexify(c); + const auto [high, low] = hexify(c); output += "\\u00"; - output += hexDigits.first; - output += hexDigits.second; + output += high; + output += low; } else output += c; diff --git a/zen/open_ssl.cpp b/zen/open_ssl.cpp index 0f07e5e3..f3fd7219 100644 --- a/zen/open_ssl.cpp +++ b/zen/open_ssl.cpp @@ -12,8 +12,44 @@ using namespace zen; +#ifndef OPENSSL_THREADS + #error FFS, we are royally screwed! +#endif + +#if OPENSSL_VERSION_NUMBER < 0x10100000L + #error OpenSSL version too old +#endif + + +void zen::openSslInit() +{ + //official Wiki: https://wiki.openssl.org/index.php/Library_Initialization + //see apps_shutdown(): https://github.com/openssl/openssl/blob/master/apps/openssl.c + //see Curl_ossl_cleanup(): https://github.com/curl/curl/blob/master/lib/vtls/openssl.c + + //excplicitly init OpenSSL on main thread: seems to initialize atomically! But it still might help to avoid issues: + [[maybe_unused]] const int rv = ::OPENSSL_init_ssl(OPENSSL_INIT_SSL_DEFAULT, nullptr); + assert(rv == 1); //https://www.openssl.org/docs/man1.1.0/ssl/OPENSSL_init_ssl.html +} + + +void zen::openSslTearDown() {} +//OpenSSL 1.1.0+ deprecates all clean up functions +//=> so much the theory, in practice it leaks, of course: https://github.com/openssl/openssl/issues/6283 +//=> OpenSslThreadCleanUp + namespace { +struct OpenSslThreadCleanUp +{ + ~OpenSslThreadCleanUp() + { + ::OPENSSL_thread_stop(); + } +}; +thread_local OpenSslThreadCleanUp tearDownOpenSslThreadData; + + /* Sign a file using SHA-256: openssl dgst -sha256 -sign private.pem -out file.sig file.txt @@ -468,7 +504,7 @@ public: throw SysError(formatLastOpenSSLError(L"BIO_up_ref")); ::SSL_set0_wbio(ssl_, bio); //pass ownership - assert(::SSL_get_mode(ssl_) == SSL_MODE_AUTO_RETRY); //verify OpenSSL default + assert(::SSL_get_mode(ssl_) == SSL_MODE_AUTO_RETRY); //verify OpenSSL default ::SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE); if (::SSL_set_tlsext_host_name(ssl_, server.c_str()) != 1) //enable SNI (Server Name Indication) diff --git a/zen/open_ssl.h b/zen/open_ssl.h index 5bf4e9ce..350e3776 100644 --- a/zen/open_ssl.h +++ b/zen/open_ssl.h @@ -11,8 +11,13 @@ #include -namespace zen //init OpenSSL before use! +namespace zen { +//init OpenSSL before use! +void openSslInit(); +void openSslTearDown(); + + enum class RsaStreamType { pkix, //base-64-encoded SubjectPublicKeyInfo structure ("BEGIN PUBLIC KEY") diff --git a/zen/process_priority.cpp b/zen/process_priority.cpp index e925f142..f80dd022 100644 --- a/zen/process_priority.cpp +++ b/zen/process_priority.cpp @@ -24,7 +24,7 @@ ScheduleForBackgroundProcessing::~ScheduleForBackgroundProcessing() {}; /* struct ScheduleForBackgroundProcessing { - - required functions ioprio_get/ioprio_set are not part of glibc: http://linux.die.net/man/2/ioprio_set + - required functions ioprio_get/ioprio_set are not part of glibc: https://linux.die.net/man/2/ioprio_set - and probably never will: http://sourceware.org/bugzilla/show_bug.cgi?id=4464 - /usr/include/linux/ioprio.h not available on Ubuntu, so we can't use it instead diff --git a/zen/shell_execute.h b/zen/shell_execute.h index 19945a0b..4875a039 100644 --- a/zen/shell_execute.h +++ b/zen/shell_execute.h @@ -41,7 +41,7 @@ void shellExecute(const Zstring& command, ExecutionType type, bool hideConsole) const int rv = ::system(command.c_str()); //do NOT use std::system as its documentation says nothing about "WEXITSTATUS(rv)", etc... if (rv == -1 || WEXITSTATUS(rv) == 127) throw FileError(_("Incorrect command line:") + L"\n" + utfTo(command)); - //http://linux.die.net/man/3/system "In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127)" + //https://linux.die.net/man/3/system "In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127)" //Bonus: For an incorrect command line /bin/sh also returns with 127! } else diff --git a/zen/stl_tools.h b/zen/stl_tools.h index f1ab7c16..15e7f7ca 100644 --- a/zen/stl_tools.h +++ b/zen/stl_tools.h @@ -283,7 +283,7 @@ void mergeTraversal(Iterator first1, Iterator last1, } -//FNV-1a: http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function +//FNV-1a: https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function template inline Num hashBytes(ByteIterator first, ByteIterator last) { diff --git a/zen/type_traits.h b/zen/type_traits.h index 8783cb6a..9823bb44 100644 --- a/zen/type_traits.h +++ b/zen/type_traits.h @@ -9,7 +9,7 @@ #include -//http://en.cppreference.com/w/cpp/header/type_traits +//https://en.cppreference.com/w/cpp/header/type_traits namespace zen { @@ -43,7 +43,7 @@ constexpr S arrayAccumulate(T (&arr)[N]) return sum; } -//Herb Sutter's signedness conversion helpers: http://herbsutter.com/2013/06/13/gotw-93-solution-auto-variables-part-2/ +//Herb Sutter's signedness conversion helpers: https://herbsutter.com/2013/06/13/gotw-93-solution-auto-variables-part-2/ template inline auto makeSigned (T t) { return static_cast>(t); } template inline auto makeUnsigned(T t) { return static_cast>(t); } diff --git a/zen/utf.h b/zen/utf.h index 37a866ab..75bf7424 100644 --- a/zen/utf.h +++ b/zen/utf.h @@ -58,7 +58,7 @@ static_assert(LEAD_SURROGATE + TRAIL_SURROGATE + TRAIL_SURROGATE_MAX + REPLACEME template inline void codePointToUtf16(CodePoint cp, Function writeOutput) //"writeOutput" is a unary function taking a Char16 { - //http://en.wikipedia.org/wiki/UTF-16 + //https://en.wikipedia.org/wiki/UTF-16 if (cp < LEAD_SURROGATE) writeOutput(static_cast(cp)); else if (cp <= TRAIL_SURROGATE_MAX) //invalid code point @@ -141,7 +141,7 @@ private: template inline void codePointToUtf8(CodePoint cp, Function writeOutput) //"writeOutput" is a unary function taking a Char8 { - //http://en.wikipedia.org/wiki/UTF-8 + //https://en.wikipedia.org/wiki/UTF-8 //assert(cp < LEAD_SURROGATE || TRAIL_SURROGATE_MAX < cp); //code points [0xd800, 0xdfff] are reserved for UTF-16 and *should* not be encoded in UTF-8 if (cp < 0x80) diff --git a/zen/zstring.cpp b/zen/zstring.cpp index 3b33a21b..ad736d04 100644 --- a/zen/zstring.cpp +++ b/zen/zstring.cpp @@ -8,7 +8,7 @@ #include #include "utf.h" - #include +#include #include "sys_error.h" using namespace zen; diff --git a/zenXml/zenxml/parser.h b/zenXml/zenxml/parser.h index 70bf6654..f7604ebf 100644 --- a/zenXml/zenxml/parser.h +++ b/zenXml/zenxml/parser.h @@ -82,7 +82,7 @@ std::string normalize(const std::string& str, Predicate pred) //pred: unary func { if (c == '&') // output += "&"; - else if (c == '<') //normalization mandatory: http://www.w3.org/TR/xml/#syntax + else if (c == '<') //normalization mandatory: https://www.w3.org/TR/xml/#syntax output += "<"; else if (c == '>') // output += ">"; @@ -95,9 +95,9 @@ std::string normalize(const std::string& str, Predicate pred) //pred: unary func else { output += "&#x"; - const auto hexDigits = hexify(c); - output += hexDigits.first; - output += hexDigits.second; + const auto [high, low] = hexify(c); + output += high; + output += low; output += ';'; } } @@ -176,7 +176,7 @@ std::string denormalize(const std::string& str) else output += c; //unexpected char! } - else if (c == '\r') //map all end-of-line characters to \n http://www.w3.org/TR/xml/#sec-line-ends + else if (c == '\r') //map all end-of-line characters to \n https://www.w3.org/TR/xml/#sec-line-ends { auto itNext = it + 1; if (itNext != str.end() && *itNext == '\n') diff --git a/zenXml/zenxml/xml.h b/zenXml/zenxml/xml.h index 15d635bd..80b60730 100644 --- a/zenXml/zenxml/xml.h +++ b/zenXml/zenxml/xml.h @@ -368,8 +368,10 @@ public: std::vector getErrorsAs() const { std::vector output; - const auto& elements = log_.ref().elementList(); - std::transform(elements.begin(), elements.end(), std::back_inserter(output), [](const std::string& str) { return utfTo(str); }); + + for (const std::string& str : log_.ref().elementList()) + output.push_back(utfTo(str)); + return output; } -- cgit