From a1c91f4695e208d5a8f80dc37b1818169b7829ff Mon Sep 17 00:00:00 2001 From: Daniel Wilhelm Date: Fri, 18 Apr 2014 17:24:59 +0200 Subject: 5.17 --- Application.cpp | 27 +- Application.h | 2 +- BUILD/Changelog.txt | 35 +- BUILD/FreeFileSync.chm | Bin 432113 -> 432105 bytes BUILD/Help/html/Expert settings.html | 4 +- BUILD/Languages/arabic.lng | 932 ++-- BUILD/Languages/chinese_simple.lng | 928 ++-- BUILD/Languages/chinese_traditional.lng | 924 ++-- BUILD/Languages/croatian.lng | 947 ++-- BUILD/Languages/czech.lng | 922 ++-- BUILD/Languages/danish.lng | 980 ++-- BUILD/Languages/dutch.lng | 940 ++-- BUILD/Languages/english_uk.lng | 892 ++- BUILD/Languages/finnish.lng | 926 ++-- BUILD/Languages/french.lng | 918 ++-- BUILD/Languages/german.lng | 895 ++- BUILD/Languages/greek.lng | 934 ++-- BUILD/Languages/hebrew.lng | 910 ++-- BUILD/Languages/hungarian.lng | 1252 +++-- BUILD/Languages/italian.lng | 925 ++-- BUILD/Languages/japanese.lng | 926 ++-- BUILD/Languages/korean.lng | 928 ++-- BUILD/Languages/lithuanian.lng | 935 ++-- BUILD/Languages/norwegian.lng | 1089 ++-- BUILD/Languages/polish.lng | 925 ++-- BUILD/Languages/portuguese.lng | 911 ++-- BUILD/Languages/portuguese_br.lng | 924 ++-- BUILD/Languages/romanian.lng | 926 ++-- BUILD/Languages/russian.lng | 930 ++-- BUILD/Languages/scottish_gaelic.lng | 912 ++-- BUILD/Languages/serbian.lng | 899 ++- BUILD/Languages/slovenian.lng | 933 ++-- BUILD/Languages/spanish.lng | 1001 ++-- BUILD/Languages/swedish.lng | 932 ++-- BUILD/Languages/turkish.lng | 951 ++-- BUILD/Languages/ukrainian.lng | 963 ++-- BUILD/Resources.zip | Bin 271094 -> 268137 bytes FreeFileSync.vcxproj | 10 +- Makefile | 14 +- RealtimeSync/RealtimeSync.vcxproj | 10 +- RealtimeSync/application.cpp | 18 +- RealtimeSync/gui_generated.cpp | 19 +- RealtimeSync/gui_generated.h | 3 +- RealtimeSync/main_dlg.cpp | 10 +- RealtimeSync/makefile | 14 +- RealtimeSync/resources.cpp | 6 +- RealtimeSync/tray_menu.cpp | 25 +- RealtimeSync/watcher.cpp | 2 +- RealtimeSync/xml_proc.cpp | 3 +- algorithm.cpp | 229 +- algorithm.h | 6 +- comparison.cpp | 301 +- comparison.h | 2 +- file_hierarchy.cpp | 22 +- file_hierarchy.h | 556 +- lib/ShadowCopy/Shadow_Server2003.vcxproj | 2 - lib/ShadowCopy/Shadow_Windows7.vcxproj | 2 - lib/ShadowCopy/Shadow_XP.vcxproj | 2 - lib/ShadowCopy/shadow.cpp | 22 +- lib/Thumbnail/Thumbnail.vcxproj | 10 +- lib/Thumbnail/thumbnail.cpp | 35 +- lib/binary.cpp | 2 +- lib/db_file.cpp | 260 +- lib/db_file.h | 59 +- lib/dir_exist_async.h | 2 +- lib/dir_lock.cpp | 92 +- lib/ffs_paths.cpp | 32 +- lib/hard_filter.cpp | 12 +- lib/help_provider.h | 8 +- lib/icon_buffer.cpp | 82 +- lib/localization.cpp | 84 +- lib/osx_file_icon.h | 10 +- lib/osx_file_icon.mm | 32 +- lib/parallel_scan.cpp | 34 +- lib/parallel_scan.h | 2 +- lib/parse_lng.h | 220 +- lib/parse_plural.h | 2 +- lib/process_xml.cpp | 18 +- lib/process_xml.h | 16 +- lib/resolve_path.cpp | 71 +- lib/resolve_path.h | 6 +- lib/resources.cpp | 8 +- lib/resources.h | 2 +- lib/shadow.cpp | 14 +- lib/shadow.h | 1 - lib/versioning.cpp | 104 +- lib/versioning.h | 8 +- lib/xml_base.cpp | 4 +- lib/xml_base.h | 4 +- structures.cpp | 8 +- synchronization.cpp | 958 ++-- synchronization.h | 8 +- ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj | 17 +- ui/IFileDialog_Vista/ifile_dialog.cpp | 12 +- ui/Taskbar_Seven/Taskbar_Seven.vcxproj | 24 +- ui/Taskbar_Seven/taskbar.cpp | 9 +- ui/batch_config.cpp | 7 +- ui/batch_status_handler.cpp | 22 +- ui/check_version.cpp | 39 +- ui/custom_grid.cpp | 168 +- ui/dir_name.cpp | 8 +- ui/exec_finished_box.cpp | 8 +- ui/folder_history_box.cpp | 6 +- ui/folder_history_box.h | 6 +- ui/folder_pair.h | 10 +- ui/grid_view.cpp | 28 +- ui/grid_view.h | 6 +- ui/gui_generated.cpp | 6899 ++++++++++++------------ ui/gui_generated.h | 1561 +++--- ui/gui_status_handler.cpp | 17 +- ui/main_dlg.cpp | 289 +- ui/main_dlg.h | 13 +- ui/msg_popup.cpp | 85 +- ui/osx_dock.h | 4 +- ui/osx_dock.mm | 6 +- ui/progress_indicator.cpp | 189 +- ui/search.cpp | 2 +- ui/small_dlgs.cpp | 57 +- ui/sorting.h | 40 +- ui/sync_cfg.cpp | 95 +- ui/taskbar.cpp | 12 +- ui/tray_icon.cpp | 4 +- ui/tree_view.cpp | 46 +- ui/tree_view.h | 16 +- version/version.h | 2 +- wx+/choice_enum.h | 7 +- wx+/grid.cpp | 11 +- wx+/grid.h | 4 +- wx+/shell_execute.h | 12 +- wx+/std_button_order.h | 140 + wx+/tooltip.cpp | 4 +- wx+/zlib_wrap.cpp | 4 +- zen/FindFilePlus/FindFilePlus.vcxproj | 2 - zen/IFileOperation/FileOperation_Vista.vcxproj | 14 +- zen/IFileOperation/file_op.cpp | 171 +- zen/assert_static.h | 2 +- zen/base64.h | 5 +- zen/basic_math.h | 4 +- zen/com_error.h | 85 +- zen/com_ptr.h | 2 +- zen/debug_log.h | 4 +- zen/dir_watcher.cpp | 98 +- zen/dll.h | 12 +- zen/dst_hack.cpp | 21 +- zen/error_log.h | 10 +- zen/file_error.h | 21 +- zen/file_handling.cpp | 472 +- zen/file_handling.h | 30 +- zen/file_id.cpp | 8 +- zen/file_id_def.h | 8 +- zen/file_io.cpp | 137 +- zen/file_io.h | 16 +- zen/file_traverser.cpp | 105 +- zen/file_traverser.h | 29 +- zen/format_unit.cpp | 18 +- zen/int64.h | 8 +- zen/last_error.h | 105 - zen/notify_removal.cpp | 43 +- zen/notify_removal.h | 1 - zen/osx_error.h | 27 - zen/osx_string.h | 2 +- zen/osx_throw_exception.h | 18 +- zen/perf.h | 6 +- zen/privilege.cpp | 17 +- zen/process_priority.cpp | 33 +- zen/recycler.cpp | 45 +- zen/recycler.h | 2 +- zen/scope_guard.h | 2 +- zen/serialize.h | 2 +- zen/stl_tools.h | 8 +- zen/string_tools.h | 60 +- zen/string_traits.h | 2 +- zen/symlink_target.h | 60 +- zen/sys_error.h | 124 + zen/tick_count.h | 40 +- zen/time.h | 8 +- zen/type_tools.h | 2 +- zen/type_traits.h | 7 +- zen/utf.h | 2 +- zen/zstring.cpp | 12 +- zen/zstring.h | 20 +- zenxml/bind.h | 41 +- zenxml/cvrt_struc.h | 9 +- zenxml/cvrt_text.h | 29 +- zenxml/dom.h | 27 +- zenxml/error.h | 4 +- zenxml/io.h | 13 +- zenxml/parser.h | 129 +- zenxml/summary.dox | 174 +- zenxml/unit_test.cpp | 2 +- zenxml/xml.h | 4 +- 191 files changed, 22442 insertions(+), 22673 deletions(-) create mode 100644 wx+/std_button_order.h delete mode 100644 zen/last_error.h delete mode 100644 zen/osx_error.h create mode 100644 zen/sys_error.h diff --git a/Application.cpp b/Application.cpp index f1be7262..7f89efcc 100644 --- a/Application.cpp +++ b/Application.cpp @@ -23,13 +23,13 @@ #include "lib/process_xml.h" #include "lib/error_log.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include -#elif defined FFS_LINUX +#elif defined ZEN_LINUX #include -#elif defined FFS_MAC +#elif defined ZEN_MAC #include #endif @@ -48,9 +48,9 @@ void onTerminationRequested() std::wstring msg = boost::this_thread::get_id() == mainThreadId ? L"Termination requested in main thread!\n\n" : L"Termination requested in worker thread!\n\n"; - msg += L"Please take a screenshot and file a bug report at: http://sourceforge.net/projects/freefilesync"; + msg += L"Please file a bug report at: http://sourceforge.net/projects/freefilesync"; - wxSafeShowMessage(_("An exception occurred!"), msg); + wxSafeShowMessage(_("An exception occurred"), msg); std::abort(); } #ifdef _MSC_VER @@ -61,7 +61,7 @@ void crtInvalidParameterHandler(const wchar_t* expression, const wchar_t* functi std::vector getCommandlineArgs(const wxApp& app) { std::vector args; -#ifdef FFS_WIN +#ifdef ZEN_WIN //we do the job ourselves! both wxWidgets and ::CommandLineToArgvW() parse "C:\" "D:\" as single line C:\" D:\" //-> "solution": we just don't support protected quotation mark! Zstring cmdLine = ::GetCommandLine(); //only way to get a unicode commandline @@ -120,7 +120,7 @@ bool Application::OnInit() { std::set_terminate(onTerminationRequested); //unlike wxWidgets uncaught exception handling, this works for all worker threads -#ifdef FFS_WIN +#ifdef ZEN_WIN #ifdef _MSC_VER _set_invalid_parameter_handler(crtInvalidParameterHandler); //see comment in #endif @@ -128,17 +128,17 @@ bool Application::OnInit() //SEM_FAILCRITICALERRORS at startup. This is to prevent error mode dialogs from hanging the application." ::SetErrorMode(SEM_FAILCRITICALERRORS); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX ::gtk_init(nullptr, nullptr); ::gtk_rc_parse((getResourceDir() + "styles.gtk_rc").c_str()); //remove inner border from bitmap buttons -#elif defined FFS_MAC +#elif defined ZEN_MAC ProcessSerialNumber psn = { 0, kCurrentProcess }; ::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //behave like an application bundle, even when the app is not packaged (yet) #endif #if wxCHECK_VERSION(2, 9, 1) -#ifdef FFS_WIN +#ifdef ZEN_WIN wxToolTip::SetMaxWidth(-1); //disable tooltip wrapping -> Windows only #endif wxToolTip::SetAutoPop(7000); //tooltip visibilty in ms, 5s is default for Windows: http://msdn.microsoft.com/en-us/library/windows/desktop/aa511495.aspx @@ -178,7 +178,7 @@ void Application::onEnterEventLoop(wxEvent& event) warn_static("finish") -#ifdef FFS_MAC +#ifdef ZEN_MAC /* Initialization call sequences on OS X ------------------------------------- @@ -230,7 +230,7 @@ int Application::OnRun() { //it's not always possible to display a message box, e.g. corrupted stack, however low-level file output works! logError(utfCvrtTo(msg)); - wxSafeShowMessage(_("An exception occurred!") + L" - FFS", msg); + wxSafeShowMessage(_("An exception occurred"), msg); }; try @@ -254,10 +254,9 @@ int Application::OnRun() void Application::onQueryEndSession(wxEvent& event) { - //alas wxWidgets screws up once again: http://trac.wxwidgets.org/ticket/3069 if (auto mainWin = dynamic_cast(GetTopWindow())) mainWin->onQueryEndSession(); - OnExit(); + OnExit(); //wxWidgets screws up again: http://trac.wxwidgets.org/ticket/3069 //wxEntryCleanup(); -> gives popup "dll init failed" on XP std::exit(returnCode); //Windows will terminate anyway: destruct global objects } diff --git a/Application.h b/Application.h index 11cdb494..d915934b 100644 --- a/Application.h +++ b/Application.h @@ -25,7 +25,7 @@ private: virtual int OnRun(); virtual bool OnExceptionInMainLoop() { throw; } //just re-throw and avoid display of additional messagebox: it will be caught in OnRun() -#ifdef FFS_MAC +#ifdef ZEN_MAC virtual void MacOpenFiles(const wxArrayString& filenames); virtual void MacNewFile(); #endif diff --git a/BUILD/Changelog.txt b/BUILD/Changelog.txt index 58bfe35b..3ea37562 100644 --- a/BUILD/Changelog.txt +++ b/BUILD/Changelog.txt @@ -1,6 +1,31 @@ -=========== -|Changelog| -=========== +FreeFileSync 5.17 +----------------- +Consider target file when updating followed file symlinks +Support moving files to recycle bin contained in followed directory symlinks +Move instead of copy updated files into versioning directory +Reduced memory peak when loading large database files after comparison +Check recycle bin existence only once per base folder and only if deletions occur (Windows) +Revised and enhanced error messages +Show moved files in same category as updated files +More pessimistic calculation of required disk space reducing false positives +Implemented platform-specific standard button ordering (Linux, OS X) +Set configuration panel primary orientation to vertical +Added new checks and error message strings for translation file parser +Revised middle grid inactive color and duplicate equality symbol +Skip XML comments while parsing config files +Redesigned confirmation popup dialogs +Standard button spacing conforms to operating system conventions +Shrinked memory consumption of file hierarchy data structures +Don't show file deletion dialog if selection is empty +Fixed incorrect progress statistics if a file or directory is deleted externally after comparison +Focus grid cursor row after switching sides with keyboard direction keys +Improved localization process: find translation deltas more easily, better error reporting +Reset initiated grid selection when changing grid cursor +Improved sync progress dialog layout +Suppress dubious wxWidgets error message "locale 'es_AR' can not be set". (OS X) +Don't show busy cursor on synchronization results dialog +Log error message upon retry as type info only + FreeFileSync 5.16 ----------------- @@ -19,7 +44,7 @@ Prevent wxWidgets corrupting stack when wxLocale is allocated statically (Linux) Use GetUserDefaultLangID to determine installer default language Avoid progress speed and remaining time jitter Check existence only once for duplicate base directories -Detect invalid file symlinks pointing to directories +Detect invalid file symlinks pointing to directories (Windows) Disable unsuitable buttons in pop up dialogs when checkbox is set Copy folder attributes if source is a junction already on Windows XP instead of Vista Mark failed UTF conversions with replacement character @@ -506,7 +531,7 @@ Render (all) invalid file dates correctly on GUI Correct layout selection for RTL and LTR languages Correct GUI status texts while waiting for directory lock Properly set default directory when loading configuration -New XML framework: zenXML +New XML framework: zen::Xml Added Hebrew language Added Danish language Updated translation files diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm index 226e4af3..61d9f176 100644 Binary files a/BUILD/FreeFileSync.chm and b/BUILD/FreeFileSync.chm differ diff --git a/BUILD/Help/html/Expert settings.html b/BUILD/Help/html/Expert settings.html index c288ec58..32064162 100644 --- a/BUILD/Help/html/Expert settings.html +++ b/BUILD/Help/html/Expert settings.html @@ -51,7 +51,7 @@ considered equal. This is required by FAT/FAT32 file systems which store file times with a 2 second precision only.
This setting can also be used to simulate a "compare by file size", ignoring last modification times: If tolerance is set to some high -value, e.g. 2.000.000.000, then changed files will be detected as a +value, e.g. 2000000000, then changed files will be detected as a conflict (same date, different file size) and the synchronization direction for conflicts can be set accordingly.


@@ -72,7 +72,7 @@ in a network out of the box.


VerifyCopiedFiles:
If -active FreeFileSync will binary-compare source and target files after +active, FreeFileSync will binary-compare source and target files after copying and report verification errors. Note that this may double file copy times and is no guarantee that data has not already been corrupted prior to copying and corruption is not hidden by diff --git a/BUILD/Languages/arabic.lng b/BUILD/Languages/arabic.lng index b4301431..8d84a0b1 100644 --- a/BUILD/Languages/arabic.lng +++ b/BUILD/Languages/arabic.lng @@ -1,141 +1,164 @@

- العربية + العربية MEinea ar - arabic.png - 6 - n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5 + flag_arabic.png + 6 + n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5
-Searching for folder %x... -البحث عن المجلد %x... +Both sides have changed since last synchronization. +كلا الجانبين قد تغير منذ المزامنة الأخيرة. -Items processed: -معالجة العناصر: +Cannot determine sync-direction: +لا يمكن تحديد اتجاه المزامنة: -Items remaining: -العناصر المتبقية: +No change since last synchronization. +لم يطرأ أي تغيير منذ المزامنة الأخيرة. -Total time: -مجموع الوقت: +The database entry is not in sync considering current settings. +مدخلات قواعد البيانات غير متزامنة حسب إعدادات المزامنة الحالية. -Cannot set directory lock for %x. -تعذر إنشاء قفل للمسار %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +تحديد الاتجاهات الافتراضية للمزامنة: ستتم الكتابة فوق الملفات القديمة بالملفات الأحدث. -Show in Explorer -إظهار في المستكشف +Checking recycle bin availability for folder %x... +التحقق من توافر سلة المحذوفات من أجل المجلد %x... -Open with default application -فتح باستخدام التطبيق الافتراضي +Moving file %x to recycle bin +نقل الملف %x إلى سلة المحذوفات -Browse directory -تصفح المسار +Moving folder %x to recycle bin +نقل المجلد %x إلى سلة المحذوفات -Abort requested: Waiting for current operation to finish... -طلب إحباط المهمة: في انتظار انتهاء المهمة الحالية... +Moving symbolic link %x to recycle bin +نقل الارتباط الرمزي %x إلى سلة المحذوفات -Failure to create timestamp for versioning: -فشل إنشاء طبعة زمنية من أجل عملية الوسم حسب الإصدار: +Deleting file %x +حذف الملف %x -RealtimeSync - Automated Synchronization -المزامنة اللحظية - المزمنة التلقائية +Deleting folder %x +حذف المجلد %x + +Deleting symbolic link %x +حذف الارتباط الرمزي %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +سلة المحذوفات غير متاحة لهذه المجلدات. سيتم بدلاً عن ذلك حذف الملفات بشكل نهائي + +An exception occurred +حدث استثناء + +Cannot find file %x. +لا يمكن العثور على الملف %x. Error خطأ -Selected variant: -المتغير المختار: +File %x does not contain a valid configuration. +لا يحتوي الملف %x تكويناً صحيحاً. -Select alternate comparison settings -تحديد إعدادات المقارنة البديلة +A folder input field is empty. +حقل إدخال خاص بمجلد فارغ. -Select alternate synchronization settings -تحديد إعدادات المزامنة البديلة +The corresponding folder will be considered as empty. +سيتم اعتبار المجلد الموافق كمجلد فارغ -Filter is active -عامل التصفية نشط +Cannot find the following folders: +تعذر العثور على المجلدات التالية: -No filter selected -لا يوجد عامل تصفية مختار +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +بإمكانك إهمال هذا الخطأ لاعتبار كل مجلد على أنه مجلد فارغ. سيتم إنشاء المجلدات تلقائياً خلال المزامنة -Remove alternate settings -إزالة الإعدادات البديلة +The following folders have dependent paths. Be careful when setting up synchronization rules: +للمجلدات التالية مسارات مستقلة عن بعضها. انتبه عند ضبط إعدادات المزامنة: -Clear filter settings -مسح إعدادات عامل التصفية +File %x has an invalid date. +يحتوي الملف %x تاريخ غير صالح. -Copy -نسخ +Date: +التاريخ: -Paste -لصق +Files %x have the same date but a different size. +الملفات %x لها نفس التاريخ ولكن حجم مختلف. -Save as batch job -حفظ كمهمة دفعية +Size: +الحجم: -Comparison settings -إعدادات المقارنة +Items differ in attributes only +العناصر مختلفة في السمات فقط -Synchronization settings -إعدادات المزامنة +Resolving symbolic link %x +جاري حل المسار الرمزي %x -About -حول +Comparing content of files %x +مقارنة محتويات الملفات %x -Confirm -تأكيد +Generating file list... +إنشاء قائمة الملفات... -Configure filter -ضبط عامل التصفية +Starting comparison +بدأ عملية المقارنة -Global settings -الإعدادات العامة +Calculating sync directions... +جاري حساب اتجاهات المزامنة... -Find -بحث +Out of memory. +نفدت الذاكرة. -Select time span -حدد المجال الزمني +Item exists on left side only +العنصر موجود على الجانب الأيمن فقط -Invalid command line: -سطر الأوامر غير صالح: +Item exists on right side only +العنصر موجود في الجانب الأيسر فقط -Info -معلومات +Left side is newer +الجانب الأيمن أحدث -Warning -تحذير +Right side is newer +الجانب الأيسر أحدث -Fatal Error -خطأ فادح +Items have different content +العناصر مختلفة بالمحتوى -Error Code %x: -خطأ رقم %x: +Both sides are equal +كلا الجانبين متماثلان -Cannot resolve symbolic link %x. -لا يمكن حل الارتباط الرمزي %x. +Conflict/item cannot be categorized +الاختلاف\العنصر لا يمكن تصنيفه - -1 Byte -%x Bytes - - -0 Bytes -1 Byte -2 Bytes -%x Bytes -%x Bytes -%x Bytes - +Copy new item to left +نسخ عنصر جديد إلى اليمين -%x MB -%x MB +Copy new item to right +نسخ عنصر جديد إلى اليسار -%x KB -%x KB +Delete left item +حذف العنصر الأيمن -%x GB -%x GB +Delete right item +حذف العنصر الأيسر + +Move file on left +نقل ملف على اليمين + +Move file on right +نقل ملف على اليسار + +Overwrite left item +الكتابة فوق العنصر الأيمن + +Overwrite right item +الكتابة فوق العنصر الأيسر + +Do nothing +لا تفعل شيئا + +Update attributes on left +تحديث السمات على اليمين + +Update attributes on right +تحديث السمات على اليسار Database file %x is incompatible. ملف قاعدة البيانات %x غير متوافق. @@ -149,9 +172,6 @@ Database file is corrupt: ملف قاعدة البيانات معطوب: -Out of memory! -نفدت الذاكرة - Cannot write file %x. لا يمكن كتابة الملف %x. @@ -161,8 +181,8 @@ Database files do not share a common session. ملفات قواعد البيانات لا تشترك في جلسة عمل مشتركة. -An exception occurred! -حدث استثناء +Searching for folder %x... +البحث عن المجلد %x... Cannot read file attributes of %x. لا يمكن قراءة سمات الملف %x. @@ -189,9 +209,43 @@ Creating file %x إنشاء الملف %x +Items processed: +معالجة العناصر: + +Items remaining: +العناصر المتبقية: + +Total time: +مجموع الوقت: + + +1 Byte +%x Bytes + + +0 Bytes +1 Byte +2 Bytes +%x Bytes +%x Bytes +%x Bytes + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. حدث خطأ أثناء تحليل الملف %x، الصف %y، و العمود %z. +Cannot set directory lock for %x. +تعذر إنشاء قفل للمسار %x. + Scanning: الفحص: @@ -214,12 +268,18 @@ /sec \ثانية -File %x does not contain a valid configuration. -لا يحتوي الملف %x تكويناً صحيحاً. - Configuration file %x loaded partially only. تم تحميل ملف التكوين %x بشكلٍ جزئي فقط. +Show in Explorer +إظهار في المستكشف + +Open with default application +فتح باستخدام التطبيق الافتراضي + +Browse directory +تصفح المسار + Cannot access Volume Shadow Copy Service. لا يمكن الوصول إلى خدمة "نسخ الظل لوحدة التخزين". @@ -229,18 +289,21 @@ Cannot load file %x. لا يمكن فتح الملف %x. -Path %x does not contain a volume name. -المسار %x لا يحتوي على اسم وحدة تخزين. +Cannot determine volume name for %x. +تعذر تحديد اسم الوسط %x + +Volume name %x not part of file name %y. +اسم وحدة التخزين %x ليس جزءاُ من اسم الملف %y. + +Abort requested: Waiting for current operation to finish... +طلب إحباط المهمة: في انتظار انتهاء المهمة الحالية... -Volume name %x not part of file name %y! -اسم وحدة التخزين %x ليس جزءاُ من اسم الملف %y ! +Failure to create timestamp for versioning: +فشل إنشاء طبعة زمنية من أجل عملية الوسم حسب الإصدار: Cannot read the following XML elements: لا يمكن قراءة عناصر XML التالية: -Cannot find file %x. -لا يمكن العثور على الملف %x. - &Open... &فتح... @@ -321,9 +384,18 @@ The command is triggered if: Cancel إلغاء الأمر +RealtimeSync - Automated Synchronization +المزامنة اللحظية - المزمنة التلقائية + +Warning +تحذير + Build: %x بناء: %x +About +حول + All files جميع الملفات @@ -333,29 +405,125 @@ The command is triggered if: &Exit &خروج -Monitoring active... -المراقبة نشطة... - Waiting for missing directories... في انتظار المسارات المفقود... -A folder input field is empty. -حقل إدخال خاص بمجلد فارغ. +Invalid command line: +سطر الأوامر غير صالح: + +File content +محتوى الملف + +File time and size +تاريخ الملف و حجمه + + Two way + بالاتجاهين + +Mirror +انعكاس + +Update +تحديث + +Custom +مخصص + +Multiple... +متعددة... + +Moving file %x to %y +نقل الملف %x إلى %y + +Moving folder %x to %y +نقل المجلد %x إلى %y + +Moving symbolic link %x to %y +نقل الارتباط الرمزي %x إلى %y + +Removing old versions... +إزالة الإصدارات القديمة... + +Creating symbolic link %x +إنشاء ارتباط رمزي %x + +Creating folder %x +إنشاء مجلد %x + +Overwriting file %x +الكتابة فوق الملف %x + +Overwriting symbolic link %x +الكتابة فوق الارتباط الرمزي %x + +Verifying file %x +التحقق من الملف %x + +Updating attributes of %x +تحديث سمات %x + +Cannot find %x. +تعذر العثور على %x. + +Target folder %x already existing. +المجلد الهدف %x موجود سابقاً. -Synchronization aborted! -تم إحباط المزامنة! +Target folder input field must not be empty. +يجب أن لا يكون حقل إدخال المجلد الهدف فارغاً. + +Folder input field for versioning must not be empty. +يجب أن لا يكون حقل إدخال المجلد من أجل الإصدارات فارغاً. + +Source folder %x not found. +لم يتم العثور على المجلد المصدر %x. + +The following items have unresolved conflicts and will not be synchronized: +العناصر التالية لم تحل اختلافاتها، و لن يتم مزامنتها: + +Significant difference detected: +تم الكشف عن فرق كبير: + +More than 50% of the total number of files will be copied or deleted. +أكثر من 50% من إجمالي عدد الملفات سيتم نسخها أو حذفها. + +Not enough free disk space available in: +المساحة الحرة المتوفرة على القرص غير كافية: + +Required: +مطلوب: + +Available: +متاح: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +سيتم تعديل مجلد الذي هو جزء من أزواج المجلدات المتعددة. الرجاء مراجعة إعدادات المزامنة. + +Synchronizing folder pair: +مزامنة زوج مجلدات: -Synchronization completed with errors! -انتهاء عملية المزامنة مع وجود أخطء! +Generating database... +إنشاء قاعدة بيانات... + +Creating Volume Shadow Copy for %x... +جاري إنشاء نسخة ظلية لـ %x... + +Data verification error: %x and %y have different content. +خطأ في التحقق من البيانات: يحتوي %x و %y بيانات مختلفة. + +Synchronization aborted +تم إحباط المزامنة + +Synchronization completed with errors +انتهاء عملية المزامنة مع وجود أخطء -Synchronization completed with warnings. -انتهاء عملية المزامنة مع وجود تحذيرات! +Synchronization completed with warnings +انتهاء عملية المزامنة مع وجود تحذيرات -Nothing to synchronize! -لا يوجد شيء للمزامنة! +Nothing to synchronize +لا يوجد شيء للمزامنة -Synchronization completed successfully. -تمت المزامنة بنجاح. +Synchronization completed successfully +تمت المزامنة بنجاح Saving log file %x... حفظ ملف السجل %x... @@ -363,8 +531,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. اضغط على "تبديل" لحل المشاكل في نافذة الحوار الرئيسي البرنامج. -Switching to FreeFileSync main dialog... -الانتقال إلى نافذة الحوار الرئيسية للبرنامج... +Switching to FreeFileSync main dialog +الانتقال إلى نافذة حوار FreeFileSync الأساسية A new version of FreeFileSync is available: يتوفر إصدار جديد من FreeFileSync: @@ -372,29 +540,29 @@ The command is triggered if: Download now? تنزيل الآن؟ -FreeFileSync is up to date! -البرنامج هو الأحدث حتى الآن! +New version found +تم العثور على نسخة أحدث -Information -معلومات +&Download +&تنزيل -Unable to connect to sourceforge.net! -تعذر الاتصال بـ sourceforge.net! +FreeFileSync is up to date. +البرنامج هو الأحدث حتى الآن. -Current FreeFileSync version number was not found online! Do you want to check manually? -لم يتم العثور على رقم الإصدار الحالي من البرنامج على الإنترنت! هل تريد التحقق يدوياً؟ +Information +معلومات -Do you want FreeFileSync to automatically check for updates every week? -هل تريد التحقق تلقائياً من وجود تحديثات بشكل إسبوعي؟ +Unable to connect to sourceforge.net. +تعذر الاتصال بـ sourceforge.net. -(Requires an Internet connection!) -(يتطلب الاتصال بالإنترنت!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +لم نستطع العثور على على رقم إصدار FreeFileSync على الشبكة. هل تريد التحقق يدوياً؟ - -<ارتباط-رمزي> +Symlink +ارتباط-رمزي - -<المجلد> +Folder +المجلد Full path المسار الكامل @@ -417,18 +585,12 @@ The command is triggered if: Extension اللاحقة -Size: -الحجم: - -Date: -التاريخ: +Category +الفئة Action التصرف -Category -الفئة - Drag && drop سحب و إفلات @@ -447,6 +609,33 @@ The command is triggered if: Hibernate السبات +Selected variant: +المتغير المختار: + +Select alternate comparison settings +تحديد إعدادات المقارنة البديلة + +Select alternate synchronization settings +تحديد إعدادات المزامنة البديلة + +Filter is active +عامل التصفية نشط + +No filter selected +لا يوجد عامل تصفية مختار + +Remove alternate settings +إزالة الإعدادات البديلة + +Clear filter settings +مسح إعدادات عامل التصفية + +Copy +نسخ + +Paste +لصق + &New &جديد @@ -465,14 +654,14 @@ The command is triggered if: &Language &اللغة -&Global settings... -&الإعدادات العامة... - &Export file list... &تصدير قائمة الملفات... -&Advanced -&متقدم +&Global settings... +&الإعدادات العامة... + +&Tools +&أدوات &Check now &تحقق الآن @@ -480,12 +669,18 @@ The command is triggered if: Check &automatically once a week تحقق &أوتوماتيكياً بشكل أسبوعي -Check for new version -التحقق من وجود نسخة جديدة +Check for new &version +التحقق من وجود &إصدار جديد Compare قارن +Comparison settings +إعدادات المقارنة + +Synchronization settings +إعدادات المزامنة + Synchronize مزامنة @@ -498,6 +693,9 @@ The command is triggered if: Swap sides مبادلة الجانبين +Save as batch job +حفظ كمهمة دفعية + Hide excluded items إخفاء العناصر المستبعدة @@ -540,53 +738,8 @@ The command is triggered if: &Pause &إيقاف مؤقت -Batch job -مهمة دفعية - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -إنشاء ملف دفعي لتحويل المزامنةإلى تلقائية. بالنقر المزدوج على الملف أو جدولته ضمن task planner الخاص بالنظام: FreeFileSync.exe .ffs_batch - -Help -تعليمات - -Error handling -معالجة الأخطاء - -Ignore -تجاهل - -Hide all error and warning messages -إخفاء جميع رسائل الأخطاء و التحذير - -Pop-up -إطار منبثق - -Show pop-up on errors or warnings -إظهار إطارات منبثقة عند حصول أخطاء أو تحذيرات - -Exit -خروج - -Abort synchronization on first error -إحباط المزامنة عند أول خطأ - -Show progress dialog -إظهار نافذة حوار تقدم العملية - -Save log -حفظ سجل - -Select folder to save log files -حدد مجلداً لحفظ ملفات السجل - -Limit -الحد الأقصى - -Limit maximum number of log files -تقييد الحد الأقصى لعدد ملفات السجل - -Select variant -تحديد المتغير +Select a variant +اختيار بديل Files are found equal if @@ -601,9 +754,6 @@ are the same متطابقين -File time and size -تاريخ الملف و حجمه - Files are found equal if - file content @@ -615,39 +765,42 @@ is the same متطابقين -File content -محتوى الملف - Symbolic Link handling التعامل مع الارتباط رمزي +Help +تعليمات + OK موافق -<- Two way -> -<- بالاتجاهين -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. تحديد التغيرات و مواكبتها على الجانبين. عمليات الحذف, النقل و المشاكل المكتشفة بواسطة قواعد البيانات -Mirror ->> -انعكاس ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. إنشاء نسخة منعكسة عن المجلد الأيمن. يتم تعديل المجلد الأيسر ليطابق المجلد الأيمن. -Update -> -تحديث -> - Copy new or updated files to right folder. نسخ الملفات الجديدة أو المحدثة إلى المجلد الأيمن. -Custom -مخصص - Configure your own synchronization rules. تحديد قواعد المزامنة الخاصة بك. +Error handling +معالجة الأخطاء + +Ignore +تجاهل + +Hide all error and warning messages +إخفاء جميع رسائل الأخطاء و التحذير + +Pop-up +إطار منبثق + +Show pop-up on errors or warnings +إظهار إطارات منبثقة عند حصول أخطاء أو تحذيرات + Deletion handling التعامل مع الحذف @@ -672,23 +825,32 @@ is the same Naming convention: اصطلاح التسمية: -Item exists on left side only -العنصر موجود على الجانب الأيمن فقط +Batch job +مهمة دفعية + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +إنشاء ملف دفعي لتحويل المزامنةإلى تلقائية. بالنقر المزدوج على الملف أو جدولته ضمن task planner الخاص بالنظام: FreeFileSync.exe .ffs_batch + +Exit +خروج + +Abort synchronization on first error +إحباط المزامنة عند أول خطأ -Item exists on right side only -العنصر موجود في الجانب الأيسر فقط +Show progress dialog +إظهار نافذة حوار تقدم العملية -Left side is newer -الجانب الأيمن أحدث +Save log +حفظ سجل -Right side is newer -الجانب الأيسر أحدث +Select folder to save log files +حدد مجلداً لحفظ ملفات السجل -Items have different content -العناصر مختلفة بالمحتوى +Limit +الحد الأقصى -Conflict/item cannot be categorized -الاختلاف\العنصر لا يمكن تصنيفه +Limit maximum number of log files +تقييد الحد الأقصى لعدد ملفات السجل Source code written in C++ using: الرماز المصدري مكتوب بلغة C++ باستخدام: @@ -708,9 +870,6 @@ is the same Homepage الصفحة الرئيسية -FreeFileSync at Sourceforge -البرنامج في Sourceforge - Email البريد الإلكتروني @@ -725,11 +884,11 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. سوف تتم متزامنة فقط الملفات التي تطابق كافة إعدادات عامل التصفية. -ملاحظة: يجب أن تكون أسماء الملفات منسوبة إلى بنية المسارات! +ملاحظة: يجب أن تكون أسماء الملفات منسوبة إلى بنية المسارات. Include @@ -753,6 +912,9 @@ Note: File names must be relative to base directories! &Clear &إزالة +Global settings +الإعدادات العامة + Fail-safe file copy نسخ ملفات آمن من الفشل @@ -783,9 +945,6 @@ Note: File names must be relative to base directories! &Default &الافتراضي -Start synchronization -بدء المزامنة - Variant المتغير @@ -804,8 +963,20 @@ Note: File names must be relative to base directories! &Find next &بحث عن التالي -Main bar -الشريط الرئيسي +Delete +حذف + +Configure filter +ضبط عامل التصفية + +Start synchronization +بدء المزامنة + +Find +بحث + +Select time span +حدد المجال الزمني Folder pairs أزواج المجلدات @@ -816,6 +987,9 @@ Note: File names must be relative to base directories! Configuration التكوين +Main bar +الشريط الرئيسي + Filter files تصفية الملفات @@ -882,11 +1056,8 @@ Note: File names must be relative to base directories! Exclude via filter: استبعاد باستخدام عامل التصفية: - -<تحديد متعدد> - -Delete -حذف +multiple selection +تحديد متعدد Include all شمول الكل @@ -915,14 +1086,14 @@ Note: File names must be relative to base directories! Show "%x" إظهار "%x" - -<مصدر الجلسة> +Last session +مصدر الجلسة Folder Comparison and Synchronization مقارنة و مزامنة المجلد -Configuration saved! -تم حفظ التكوين! +Configuration saved +تم حفظ التكوين FreeFileSync batch دفعة FreeFileSync @@ -936,9 +1107,6 @@ Note: File names must be relative to base directories! Never save changes لا تحفظ التغييرات أبداً -Configuration loaded! -تم فتح التكوين! - Show files that exist on left side only إظهار الملفات الموجودة في الجانب الأيمن فقط @@ -984,20 +1152,17 @@ Note: File names must be relative to base directories! Set as default تحديد كوضع افتراضي -Operation aborted! -تم إحباط العملية! +Operation aborted +تم إحباط العملية -All folders are in sync! -جميع المجلدات متزامنة! +All folders are in sync +جميع المجلدات متزامنة Comma separated list قائمة مفصولة بفواصل -Legend -مفتاح الرموز - -File list exported! -تم تصدير قائمة الملفات! +File list exported +تم تصدير قائمة الملفات Searching for program updates... جاري البحث عن تحديثات للبرنامج... @@ -1008,6 +1173,9 @@ Note: File names must be relative to base directories! &Ignore &تجاهل +Fatal Error +خطأ فادح + Don't show this warning again لا تظهر هذا التنبيه ثانية @@ -1029,6 +1197,9 @@ Note: File names must be relative to base directories! Comparing content... مقارنة المحتوى... +Info +معلومات + Paused تم الإيقاف مؤقتاً @@ -1139,18 +1310,18 @@ Note: File names must be relative to base directories! Leave as unresolved conflict ترك كاختلافات من دون حل -Time stamp -البصمة الزمنية - -Append a timestamp to each file name -إلحاق طابع زمني اسم كل ملف - Replace استبدال Move files and replace if existing نقل الملفات و استبدال الموجودة بها إن وجدت +Time stamp +البصمة الزمنية + +Append a timestamp to each file name +إلحاق طابع زمني اسم كل ملف + Folder مجلد @@ -1193,9 +1364,6 @@ Note: File names must be relative to base directories! Cannot write modification time of %x. لا يمكن كتابة وقت تعديل %x. -Cannot find system function %x. -لا يمكن العثور على وظيفة نظام %x. - Cannot read security context of %x. لا يمكن قراءة سياق الأمان %x. @@ -1211,8 +1379,11 @@ Note: File names must be relative to base directories! Cannot create directory %x. لا يمكن إنشاء المسار %x. -Cannot copy symbolic link %x to %y. -لا يمكن نسخ الارتباط الرمزي %x إلى %y. +Cannot create symbolic link %x. +تعذر إنشاء رابط رمزي %x + +Cannot find system function %x. +لا يمكن العثور على وظيفة نظام %x. Cannot copy file %x to %y. لا يمكن نسخ الملف %x إلى %y. @@ -1220,15 +1391,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: نوع العنصر %x غير مدعوم: +Cannot resolve symbolic link %x. +لا يمكن حل الارتباط الرمزي %x. + Cannot open directory %x. لا يمكن فتح المسار %x. Cannot enumerate directory %x. لا يمكن تعداد المسار %x. -Detected endless directory recursion. -تم الكشف عن العودية اللا نهاية لها للمسار. - %x TB %x TB @@ -1274,6 +1445,9 @@ Note: File names must be relative to base directories! %x يوم +Failed to register to receive system messages. +تعذر التسجيل لاستقبال رسائل النظام. + Cannot set privilege %x. لا يمكن تعيين امتيازات %x. @@ -1283,204 +1457,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. تعذر تغيير أولويات I/O للعملية -Unable to move %x to the Recycle Bin! -تعذر نقل %x إلى سلة المحذوفات - -Both sides have changed since last synchronization! -كلا الجانبين قد تغير منذ المزامنة الأخيرة - -Cannot determine sync-direction: -لا يمكن تحديد اتجاه المزامنة: - -No change since last synchronization! -لم يطرأ أي تغيير منذ المزامنة الأخيرة - -The corresponding database entries are not in sync considering current settings. -إدخالات قاعدة البيانات الموافقة ليست في تزامن بالنسبة للإعدادات الحالية. - -Setting default synchronization directions: Old files will be overwritten with newer files. -تحديد الاتجاهات الافتراضية للمزامنة: ستتم الكتابة فوق الملفات القديمة بالملفات الأحدث. - -Checking recycle bin availability for folder %x... -التحقق من توافر سلة المحذوفات من أجل المجلد %x... - -Moving file %x to recycle bin -نقل الملف %x إلى سلة المحذوفات - -Moving folder %x to recycle bin -نقل المجلد %x إلى سلة المحذوفات - -Moving symbolic link %x to recycle bin -نقل الارتباط الرمزي %x إلى سلة المحذوفات - -Deleting file %x -حذف الملف %x - -Deleting folder %x -حذف المجلد %x - -Deleting symbolic link %x -حذف الارتباط الرمزي %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -سلة المهملات غير متوفر للمسارات التالية! سيتم حذف الملفات بشكل دائم بدلاً من ذلك: - -The corresponding folder will be considered as empty. -سيتم اعتبار المجلد الموافق كمجلد فارغ - -Cannot find the following folders: -تعذر العثور على المجلدات التالية: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -بإمكانك إهمال هذا الخطأ لاعتبار كل مجلد على أنه مجلد فارغ. سيتم إنشاء المجلدات تلقائياً خلال المزامنة - -Directories are dependent! Be careful when setting up synchronization rules: -المسارات تلعية! كن حذراً عند إعداد قواعد المزامنة: - -Start comparison -ابدأ المقارنة - -Calculating sync directions... -جاري حساب اتجاهات المزامنة... - -Conflict detected: -تم الكشف عن تعارض: - -File %x has an invalid date! -يحتوي الملف %x تاريخ غير صالح - -Files %x have the same date but a different size! -الملفات %x لها نفس التاريخ ولكن حجم مختلف - -Items differ in attributes only -العناصر مختلفة في السمات فقط - -Symbolic links %x have the same date but a different target. -الارتباطات الرمزية %x لها نفس التاريخ لكن هدف مختلف. - -Comparing content of files %x -مقارنة محتويات الملفات %x - -Comparing files by content failed. -فشلت مقارنة الملفات حسب المحتوى. - -Generating file list... -إنشاء قائمة الملفات... - -Both sides are equal -كلا الجانبين متماثلان - -Copy new item to left -نسخ عنصر جديد إلى اليمين - -Copy new item to right -نسخ عنصر جديد إلى اليسار - -Delete left item -حذف العنصر الأيمن - -Delete right item -حذف العنصر الأيسر - -Move file on left -نقل ملف على اليمين - -Move file on right -نقل ملف على اليسار - -Overwrite left item -الكتابة فوق العنصر الأيمن - -Overwrite right item -الكتابة فوق العنصر الأيسر - -Do nothing -لا تفعل شيئا - -Update attributes on left -تحديث السمات على اليمين - -Update attributes on right -تحديث السمات على اليسار - -Multiple... -متعددة... - -Moving file %x to %y -نقل الملف %x إلى %y - -Moving folder %x to %y -نقل المجلد %x إلى %y - -Moving symbolic link %x to %y -نقل الارتباط الرمزي %x إلى %y - -Removing old versions... -إزالة الإصدارات القديمة... - -Creating symbolic link %x -إنشاء ارتباط رمزي %x - -Creating folder %x -إنشاء مجلد %x - -Overwriting file %x -الكتابة فوق الملف %x - -Overwriting symbolic link %x -الكتابة فوق الارتباط الرمزي %x - -Verifying file %x -التحقق من الملف %x - -Updating attributes of %x -تحديث سمات %x - -Cannot find %x. -تعذر العثور على %x. - -Target folder %x already existing. -المجلد الهدف %x موجود سابقاً. - -Target folder input field must not be empty. -يجب أن لا يكون حقل إدخال المجلد الهدف فارغاً. - -Folder input field for versioning must not be empty. -يجب أن لا يكون حقل إدخال المجلد من أجل الإصدارات فارغاً. +Unable to move %x to the Recycle Bin. +تعذر نقل %x إلى سلة المحذوفات. -Source folder %x not found. -لم يتم العثور على المجلد المصدر %x. - -The following items have unresolved conflicts and will not be synchronized: -العناصر التالية لم تحل اختلافاتها، و لن يتم مزامنتها: - -Significant difference detected: -تم الكشف عن فرق كبير: - -More than 50% of the total number of files will be copied or deleted! -أكثر من 50% من إجمالي عدد الملفات سيتم نسخها أو حذفها! - -Not enough free disk space available in: -المساحة الحرة المتوفرة على القرص غير كافية: - -Required: -مطلوب: - -Available: -متاح: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -سيتم تعديل مجلد الذي هو جزء من أزواج المجلدات المتعددة. الرجاء مراجعة إعدادات المزامنة. - -Synchronizing folder pair: -مزامنة زوج مجلدات: +Cannot determine final path for %x. +تعذر تحديد المسار النهائي لـ %x. -Generating database... -إنشاء قاعدة بيانات... - -Creating Volume Shadow Copy for %x... -جاري إنشاء نسخة ظلية لـ %x... - -Data verification error: Source and target file have different content! -خطأ تحقق بيانات: للملف المصدر والملف الهدف محتويات مختلفة! +Error Code %x: +خطأ رقم %x: diff --git a/BUILD/Languages/chinese_simple.lng b/BUILD/Languages/chinese_simple.lng index 0f87d315..754d0ca3 100644 --- a/BUILD/Languages/chinese_simple.lng +++ b/BUILD/Languages/chinese_simple.lng @@ -1,136 +1,164 @@
- 简体中文 + 简体中文 CyberCowBoy zh_CN - china.png - 1 - 0 + flag_china.png + 1 + 0
-Searching for folder %x... -正在搜索文件夹 %x... +Both sides have changed since last synchronization. +在最后的同步之后两边均已改变. -Items processed: -已处理的项目: +Cannot determine sync-direction: +不能检测同步方向: -Items remaining: -剩余的项目: +No change since last synchronization. +自从最后一次同步以来没有变动. -Total time: -总共时间: +The database entry is not in sync considering current settings. +考虑到当前设置,数据库入口不同步. -Cannot set directory lock for %x. -无法为 %x 设置目录锁定. +Setting default synchronization directions: Old files will be overwritten with newer files. +设置默认的同步方向:旧文件会被新文件覆盖. -Show in Explorer -在Explorer中显示 +Checking recycle bin availability for folder %x... +正在为文件夹 %x 检测回收站可用性... -Open with default application -用默认应用软件打开 +Moving file %x to recycle bin +正在移动文件 %x 到回收站 -Browse directory -浏览目录 +Moving folder %x to recycle bin +正在移动文件夹 %x 到回收站 -Abort requested: Waiting for current operation to finish... -请求中止: 正在等待当前操作完成... +Moving symbolic link %x to recycle bin +正在移动符号连接 %x 到回收站 -Failure to create timestamp for versioning: -未能为历史版本创建时间标记 +Deleting file %x +正删除文件 %x -RealtimeSync - Automated Synchronization -实时同步 - 自动同步 +Deleting folder %x +正删除文件夹 %x + +Deleting symbolic link %x +正在删除符号连接 %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +回收站对如下文件夹无效. 文件将被永久性删除: + +An exception occurred +发生异常 + +Cannot find file %x. +无法找到文件 %x . Error 错误 -Selected variant: -选定的变化: +File %x does not contain a valid configuration. +文件 %x 并未包含合法的配置. -Select alternate comparison settings -选择替换的比较设置 +A folder input field is empty. +有一个文件夹输入框为空. -Select alternate synchronization settings -选择替换同步设置 +The corresponding folder will be considered as empty. +相应的文件夹将被视为空. -Filter is active -过滤器已生效 +Cannot find the following folders: +无法找到如下文件夹: -No filter selected -没有选定过滤器 +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +你可忽略此错误而将每个文件夹视为空. 这些文件夹将会在同步过程中被自动创建. -Remove alternate settings -移除替换设置 +The following folders have dependent paths. Be careful when setting up synchronization rules: +如下的文件夹有路径依赖性. 请在设置同步规则时特别小心: -Clear filter settings -清除过滤器设置 +File %x has an invalid date. +文件 %x 的日期非法. -Copy -复制 +Date: +日期: -Paste -粘贴 +Files %x have the same date but a different size. +文件 %x 日期相同但大小不同. -Save as batch job -另存为批处理作业 +Size: +大小: -Comparison settings -比较设置 +Items differ in attributes only +项目仅是文件属性不同 -Synchronization settings -同步设置 +Resolving symbolic link %x +正在解决符号连接 %x -About -关于 +Comparing content of files %x +正在比较文件 %x 的内容 -Confirm -确认 +Generating file list... +生成文件列表... -Configure filter -配置过滤器 +Starting comparison +正在开始比较 -Global settings -全局设置 +Calculating sync directions... +正在计算同步方向... -Find -查找 +Out of memory. +内存不足. -Select time span -选择时间跨度 +Item exists on left side only +项目仅存在于左侧 -Invalid command line: -无效的命令行: +Item exists on right side only +项目仅存在于右侧 -Info -信息 +Left side is newer +左侧较新 -Warning -警告 +Right side is newer +右侧较新 -Fatal Error -致命错误 +Items have different content +项目有不同的内容 -Error Code %x: -错误代码 %x: +Both sides are equal +两侧相等 -Cannot resolve symbolic link %x. -无法解决符号连接 %x. +Conflict/item cannot be categorized +冲突/项目未能被分类 - -1 Byte -%x Bytes - - -%x 字节 - +Copy new item to left +复制新项目到左侧 -%x MB -%x MB +Copy new item to right +复制新项目到右侧 -%x KB -%x KB +Delete left item +删除左侧项目 -%x GB -%x GB +Delete right item +删除右侧项目 + +Move file on left +移动左侧的文件 + +Move file on right +移动右侧的文件 + +Overwrite left item +覆盖左侧的项目 + +Overwrite right item +覆盖右侧的项目 + +Do nothing +保持不动 + +Update attributes on left +更新左侧的文件属性 + +Update attributes on right +更新右侧的文件属性 Database file %x is incompatible. 数据库文件 %x 不兼容. @@ -144,9 +172,6 @@ Database file is corrupt: 数据库文件已损坏: -Out of memory! -内存不足! - Cannot write file %x. 无法写入文件 %x . @@ -156,8 +181,8 @@ Database files do not share a common session. 数据库文件并未共享一个公共会话. -An exception occurred! -发生异常! +Searching for folder %x... +正在搜索文件夹 %x... Cannot read file attributes of %x. 无法读取 %x 的文件属性. @@ -179,9 +204,38 @@ Creating file %x 正在创建文件 %x +Items processed: +已处理的项目: + +Items remaining: +剩余的项目: + +Total time: +总共时间: + + +1 Byte +%x Bytes + + +%x 字节 + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. 当分析文件 %x , 行 %y, 列 %z 时出错. +Cannot set directory lock for %x. +无法为 %x 设置目录锁定. + Scanning: 扫描中: @@ -199,12 +253,18 @@ /sec /秒 -File %x does not contain a valid configuration. -文件 %x 并未包含合法的配置. - Configuration file %x loaded partially only. 配置文件 %x 只是部分载入. +Show in Explorer +在Explorer中显示 + +Open with default application +用默认应用软件打开 + +Browse directory +浏览目录 + Cannot access Volume Shadow Copy Service. 无法访问卷影复制服务. @@ -214,18 +274,21 @@ Cannot load file %x. 不能载入文件 %x. -Path %x does not contain a volume name. -路径 %x 并未包含一个卷名. +Cannot determine volume name for %x. +无法为 %x 确定卷名. -Volume name %x not part of file name %y! -卷名 %x 并非文件名 %y 的一部分! +Volume name %x not part of file name %y. +卷名 %x 并非文件名 %y 的一部分. + +Abort requested: Waiting for current operation to finish... +请求中止: 正在等待当前操作完成... + +Failure to create timestamp for versioning: +未能为历史版本创建时间标记 Cannot read the following XML elements: 无法读取如下XML元素: -Cannot find file %x. -无法找到文件 %x . - &Open... 打开(&O)... @@ -306,9 +369,18 @@ The command is triggered if: Cancel 取消 +RealtimeSync - Automated Synchronization +实时同步 - 自动同步 + +Warning +警告 + Build: %x Build: %x +About +关于 + All files 所有文件 @@ -318,29 +390,125 @@ The command is triggered if: &Exit 退出(&E) -Monitoring active... -监视激活... - Waiting for missing directories... 正在等待丢失的目录... -A folder input field is empty. -有一个文件夹输入框为空. +Invalid command line: +无效的命令行: + +File content +文件内容 + +File time and size +文件时间和大小 + + Two way +双向 + +Mirror +镜像 + +Update +更新 + +Custom +自定义 + +Multiple... +并联... + +Moving file %x to %y +正在移动文件 %x 到 %y + +Moving folder %x to %y +正在移动文件夹 %x 到 %y + +Moving symbolic link %x to %y +正在移动符号连接 %x 到 %y + +Removing old versions... +移除旧版本 + +Creating symbolic link %x +正在创建符号连接 %x + +Creating folder %x +正创建文件夹 %x + +Overwriting file %x +正在覆盖文件 %x + +Overwriting symbolic link %x +正在覆盖符号连接 %x + +Verifying file %x +校验文件 %x + +Updating attributes of %x +更新 %x 的属性 + +Cannot find %x. +无法找到 %x. + +Target folder %x already existing. +目标文件夹 %x 已经存在. + +Target folder input field must not be empty. +目标文件夹输入框必须不为空. + +Folder input field for versioning must not be empty. +用于存放历史版本的文件夹输入框必须不为空. -Synchronization aborted! -同步已被中止! +Source folder %x not found. +无法找到源文件夹 %x. + +The following items have unresolved conflicts and will not be synchronized: +如下项目有无法解决的冲突并将不会被同步: + +Significant difference detected: +已侦测到显著不同: + +More than 50% of the total number of files will be copied or deleted. +超过总数 50% 以上的文件要被复制或删除. + +Not enough free disk space available in: +没有足够的可用磁盘空间用于: + +Required: +必需: + +Available: +可用: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +一个将被修改的文件夹是多个文件夹对的一部分. 请重新检视同步设置. + +Synchronizing folder pair: +正在同步成对的文件夹: + +Generating database... +正在生成数据库... + +Creating Volume Shadow Copy for %x... +正在为 %x 创建卷影响复制... -Synchronization completed with errors! -同步已完成但有错误. +Data verification error: %x and %y have different content. +数据校验错误: %x 和 %y 有不同的内容. -Synchronization completed with warnings. -同步已完成但有警告. +Synchronization aborted +同步已被中止 -Nothing to synchronize! -没有什么可同步! +Synchronization completed with errors +同步已完成但有错误 -Synchronization completed successfully. -同步成功完成. +Synchronization completed with warnings +同步已完成但有警告 + +Nothing to synchronize +没有什么可同步 + +Synchronization completed successfully +同步成功完成 Saving log file %x... 正在保存日志文件 %x... @@ -348,8 +516,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. 请按下"切换"来解决 FreeFileSync主对话框上的问题. -Switching to FreeFileSync main dialog... -正在切换到 FreeFileSync 主对话框... +Switching to FreeFileSync main dialog +正在切换到 FreeFileSync 主对话框 A new version of FreeFileSync is available: 已经有新版本的FreeFileSync可用: @@ -357,29 +525,29 @@ The command is triggered if: Download now? 立即下载? -FreeFileSync is up to date! -FreeFileSync 已是最新! +New version found +找到新版本 -Information -信息 +&Download +下载(&D) -Unable to connect to sourceforge.net! -无法链接到 Sourceforge.net! +FreeFileSync is up to date. +FreeFileSync 已是最新. -Current FreeFileSync version number was not found online! Do you want to check manually? -当前FreeFileSync版本号未能在线找到! 要手工检查更新吗? +Information +信息 -Do you want FreeFileSync to automatically check for updates every week? -要让 FreeFileSync 保持每周检查一次更新吗? +Unable to connect to sourceforge.net. +无法链接到 Sourceforge.net. -(Requires an Internet connection!) -(需要因特网连接!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +无法在线找到当前FreeFileSync版本号. 你要手动检查吗? - -<符号连接> +Symlink +符号连接 - -<文件夹> +Folder +文件夹 Full path 完整路径 @@ -402,18 +570,12 @@ The command is triggered if: Extension 扩展名 -Size: -大小: - -Date: -日期: +Category +分类 Action 动作 -Category -分类 - Drag && drop 拖放 @@ -432,6 +594,33 @@ The command is triggered if: Hibernate 休眠 +Selected variant: +选定的变化: + +Select alternate comparison settings +选择替换的比较设置 + +Select alternate synchronization settings +选择替换同步设置 + +Filter is active +过滤器已生效 + +No filter selected +没有选定过滤器 + +Remove alternate settings +移除替换设置 + +Clear filter settings +清除过滤器设置 + +Copy +复制 + +Paste +粘贴 + &New 新建(&N) @@ -450,14 +639,14 @@ The command is triggered if: &Language 切换语言(&L) -&Global settings... -全局设置(&G)... - &Export file list... 导出文件列表(&E)... -&Advanced -高级(&A) +&Global settings... +全局设置(&G)... + +&Tools +工具(&T) &Check now 现在检查(&C) @@ -465,12 +654,18 @@ The command is triggered if: Check &automatically once a week 每周自动检查一次(&A) -Check for new version -检查新版本 +Check for new &version +检查新版本(&V) Compare 比较 +Comparison settings +比较设置 + +Synchronization settings +同步设置 + Synchronize 同步 @@ -483,6 +678,9 @@ The command is triggered if: Swap sides 两侧互换 +Save as batch job +另存为批处理作业 + Hide excluded items 隐藏排除项目 @@ -525,53 +723,8 @@ The command is triggered if: &Pause 暂停(&P) -Batch job -批处理作业 - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -创建一个用于自动同步的批处理文件. 双击这个文件或者在你的系统的任务计划中定时执行: FreeFileSync.exe <作业名>.ffs_batch - -Help -帮助 - -Error handling -错误处理 - -Ignore -忽略 - -Hide all error and warning messages -隐藏所有错误与警告信息 - -Pop-up -弹出框 - -Show pop-up on errors or warnings -在错误或警告时显示弹出对话框 - -Exit -退出 - -Abort synchronization on first error -在第一个错误时中止同步 - -Show progress dialog -显示进度对话框 - -Save log -保存日志 - -Select folder to save log files -选择要保存日志文件的文件夹 - -Limit -限制 - -Limit maximum number of log files -限制日志文件的量大个数 - -Select variant -选择不同方式 +Select a variant +选择一个变化 Files are found equal if @@ -586,9 +739,6 @@ are the same 是相同的 -File time and size -文件时间和大小 - Files are found equal if - file content @@ -600,39 +750,42 @@ is the same 是相同的 -File content -文件内容 - Symbolic Link handling 符号连接处理方式 +Help +帮助 + OK 确定 -<- Two way -> -<-双向-> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. 识别和传播两侧的变化. 删除, 移动和冲突会使用一个数据库来自动检测. -Mirror ->> -镜像 ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. 镜像备份左边的文件夹.同步后右边的文件夹被修改为和左边文件夹精确匹配. -Update -> -更新 -> - Copy new or updated files to right folder. 复制新的或修改过的文件到右侧文件夹 -Custom -自定义 - Configure your own synchronization rules. 配置你自己的同步规则. +Error handling +错误处理 + +Ignore +忽略 + +Hide all error and warning messages +隐藏所有错误与警告信息 + +Pop-up +弹出框 + +Show pop-up on errors or warnings +在错误或警告时显示弹出对话框 + Deletion handling 删除处理 @@ -657,23 +810,32 @@ is the same Naming convention: 命名规则: -Item exists on left side only -项目仅存在于左侧 +Batch job +批处理作业 + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +创建一个用于自动同步的批处理文件. 双击这个文件或者在你的系统的任务计划中定时执行: FreeFileSync.exe <作业名>.ffs_batch + +Exit +退出 + +Abort synchronization on first error +在第一个错误时中止同步 -Item exists on right side only -项目仅存在于右侧 +Show progress dialog +显示进度对话框 -Left side is newer -左侧较新 +Save log +保存日志 -Right side is newer -右侧较新 +Select folder to save log files +选择要保存日志文件的文件夹 -Items have different content -项目有不同的内容 +Limit +限制 -Conflict/item cannot be categorized -冲突/项目未能被分类 +Limit maximum number of log files +限制日志文件的量大个数 Source code written in C++ using: 源代码用如下C++工具写成: @@ -693,9 +855,6 @@ is the same Homepage 主页 -FreeFileSync at Sourceforge -Sourceforge上的FreeFileSync - Email 邮箱 @@ -710,11 +869,11 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. 只有匹配所有过滤器的文件会被同步. -注:文件名必须是主目录的相对路径! +注:文件名必须是主目录的相对路径. Include @@ -738,6 +897,9 @@ Note: File names must be relative to base directories! &Clear 清除(&C) +Global settings +全局设置 + Fail-safe file copy 无风险的文件复制 @@ -768,9 +930,6 @@ Note: File names must be relative to base directories! &Default 默认(&D) -Start synchronization -开始同步 - Variant 变化 @@ -789,11 +948,20 @@ Note: File names must be relative to base directories! &Find next 查找下一个(&F) -Operation aborted! -操作已取消! +Delete +删除 -Main bar -主工具条 +Configure filter +配置过滤器 + +Start synchronization +开始同步 + +Find +查找 + +Select time span +选择时间跨度 Folder pairs 文件夹对 @@ -804,6 +972,9 @@ Note: File names must be relative to base directories! Configuration 配置 +Main bar +主工具条 + Filter files 过滤器文件 @@ -855,11 +1026,8 @@ Note: File names must be relative to base directories! Exclude via filter: 通过过滤器排除: - -<多选> - -Delete -删除 +multiple selection +多选 Include all 包括所有 @@ -888,14 +1056,14 @@ Note: File names must be relative to base directories! Show "%x" 显示 "%x" - -<最后会话> +Last session +最后会话 Folder Comparison and Synchronization 文件夹比较与同步 -Configuration saved! -配置已保存! +Configuration saved +配置已保存 FreeFileSync batch FreeFileSync批处理文件 @@ -909,9 +1077,6 @@ Note: File names must be relative to base directories! Never save changes 永不保存更改 -Configuration loaded! -配置已加载! - Show files that exist on left side only 显示仅存在左侧的文件 @@ -957,17 +1122,17 @@ Note: File names must be relative to base directories! Set as default 设置为默认值 -All folders are in sync! -所有文件夹都是同步的! +Operation aborted +操作已取消 + +All folders are in sync +所有文件夹都是同步的 Comma separated list 逗号分隔的列表 -Legend -图例 - -File list exported! -文件清单已经导出! +File list exported +文件清单已经导出 Searching for program updates... 正在搜索程序的更新... @@ -978,6 +1143,9 @@ Note: File names must be relative to base directories! &Ignore 忽略(&I) +Fatal Error +致命错误 + Don't show this warning again 不要再显示这个警告 @@ -999,6 +1167,9 @@ Note: File names must be relative to base directories! Comparing content... 正在比较文件内容... +Info +信息 + Paused 已暂停 @@ -1099,18 +1270,18 @@ Note: File names must be relative to base directories! Leave as unresolved conflict 遗留为未解决的冲突 -Time stamp -时间戳 - -Append a timestamp to each file name -附加时间戳到每一个文件名 - Replace 替换 Move files and replace if existing 移动文件, 若文件已存在则替换 +Time stamp +时间戳 + +Append a timestamp to each file name +附加时间戳到每一个文件名 + Folder 文件夹 @@ -1153,9 +1324,6 @@ Note: File names must be relative to base directories! Cannot write modification time of %x. 无法写入 %x 的最后修改时间. -Cannot find system function %x. -无法找到系统功能 %x. - Cannot read security context of %x. 无法读取 %x 的安全上下文. @@ -1171,8 +1339,11 @@ Note: File names must be relative to base directories! Cannot create directory %x. 无法创建目录 %x. -Cannot copy symbolic link %x to %y. -无法复制符号连接 %x 到 %y. +Cannot create symbolic link %x. +无法创建符号连接 %x. + +Cannot find system function %x. +无法找到系统功能 %x. Cannot copy file %x to %y. 无法复制文件 %x 到 %y. @@ -1180,15 +1351,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: %x 的类型不被支持: +Cannot resolve symbolic link %x. +无法解决符号连接 %x. + Cannot open directory %x. 无法打开目录 %x. Cannot enumerate directory %x. 无法列举目录 %x. -Detected endless directory recursion. -检测到无限的目录递归. - %x TB %x TB @@ -1219,6 +1390,9 @@ Note: File names must be relative to base directories! %x 天 +Failed to register to receive system messages. +接收系统信息的注册失败. + Cannot set privilege %x. 无法设置 %x 的特权. @@ -1228,210 +1402,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. 无法更改进程的I/O优先级. -Unable to move %x to the Recycle Bin! -无法移动 %x 到回收站! - -Both sides have changed since last synchronization! -在最后的同步之后两边均已改变! - -Cannot determine sync-direction: -不能检测同步方向: - -No change since last synchronization! -自从最后一次同步以来没有变动! - -The corresponding database entries are not in sync considering current settings. -根据当前设置相关的数据库入口并未同步. - -Setting default synchronization directions: Old files will be overwritten with newer files. -设置默认的同步方向:旧文件会被新文件覆盖. - -Checking recycle bin availability for folder %x... -正在为文件夹 %x 检测回收站可用性... - -Moving file %x to recycle bin -正在移动文件 %x 到回收站 - -Moving folder %x to recycle bin -正在移动文件夹 %x 到回收站 - -Moving symbolic link %x to recycle bin -正在移动符号连接 %x 到回收站 - -Deleting file %x -正删除文件 %x - -Deleting folder %x -正删除文件夹 %x - -Deleting symbolic link %x -正在删除符号连接 %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -如下路径的回收站不可用! 文件会被永久删除: - -The corresponding folder will be considered as empty. -相应的文件夹将被视为空. - -Cannot find the following folders: -无法找到如下文件夹: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -你可忽略此错误而将每个文件夹视为空. 这些文件夹将会在同步过程中被自动创建. - -Directories are dependent! Be careful when setting up synchronization rules: -目录有依赖性!在设立同步规则时请小心: - -Start comparison -开始比较 - -Calculating sync directions... -正在计算同步方向... - -Conflict detected: -检测到的冲突: +Unable to move %x to the Recycle Bin. +无法移动 %x 到回收站. -File %x has an invalid date! -文件 %x 的日期非法! +Cannot determine final path for %x. +无法确定 %x 的最终路径. -Files %x have the same date but a different size! -文件 %x 日期相同但大小不同! - -Items differ in attributes only -项目仅是文件属性不同 - -Symbolic links %x have the same date but a different target. -符号连接 %x 有相同的日期但目标不同. - -Comparing content of files %x -正在比较文件 %x 的内容 - -Comparing files by content failed. -按文件内容比较失败. - -Generating file list... -生成文件列表... - -Both sides are equal -两侧相等 - -Copy new item to left -复制新项目到左侧 - -Copy new item to right -复制新项目到右侧 - -Delete left item -删除左侧项目 - -Delete right item -删除右侧项目 - -Move file on left -移动左侧的文件 - -Move file on right -移动右侧的文件 - -Overwrite left item -覆盖左侧的项目 - -Overwrite right item -覆盖右侧的项目 - -Do nothing -保持不动 - -Update attributes on left -更新左侧的文件属性 - -Update attributes on right -更新右侧的文件属性 - -Multiple... -并联... - -Moving file %x to %y -正在移动文件 %x 到 %y - -Moving folder %x to %y -正在移动文件夹 %x 到 %y - -Moving symbolic link %x to %y -正在移动符号连接 %x 到 %y - -Removing old versions... -移除旧版本 - -Creating symbolic link %x -正在创建符号连接 %x - -Creating folder %x -正创建文件夹 %x - -Overwriting file %x -正在覆盖文件 %x - -Overwriting symbolic link %x -正在覆盖符号连接 %x - -Verifying file %x -校验文件 %x - -Updating attributes of %x -更新 %x 的属性 - -Cannot find %x. -无法找到 %x. - -Target folder %x already existing. -目标文件夹 %x 已经存在. - -Target folder input field must not be empty. -目标文件夹输入框必须不为空. - -Folder input field for versioning must not be empty. -用于存放历史版本的文件夹输入框必须不为空. - -Source folder %x not found. -无法找到源文件夹 %x. - -The following items have unresolved conflicts and will not be synchronized: -如下项目有无法解决的冲突并将不会被同步: - -Significant difference detected: -已侦测到显著不同: - -More than 50% of the total number of files will be copied or deleted! -超过总数 50% 以上的文件要被复制或删除! - -Not enough free disk space available in: -没有足够的可用磁盘空间用于: - -Required: -必需: - -Available: -可用: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -一个将被修改的文件夹是多个文件夹对的一部分. 请重新检视同步设置. - -Left -左侧 - -Right -右侧 - -Synchronizing folder pair: -正在同步成对的文件夹: - -Generating database... -正在生成数据库... - -Creating Volume Shadow Copy for %x... -正在为 %x 创建卷影响复制... - -Data verification error: Source and target file have different content! -数据校验错误:源文件和目标文件内容不同! +Error Code %x: +错误代码 %x: diff --git a/BUILD/Languages/chinese_traditional.lng b/BUILD/Languages/chinese_traditional.lng index 763359ae..f735db65 100644 --- a/BUILD/Languages/chinese_traditional.lng +++ b/BUILD/Languages/chinese_traditional.lng @@ -1,136 +1,164 @@
- 正體中文 - Carlos + 正體中文 + Carlos Chen Chinese (Traditional) - taiwan.png - 1 - 0 + flag_taiwan.png + 1 + 0
-Searching for folder %x... -正在搜尋資料夾 %x... +Both sides have changed since last synchronization. +自上次同步後,兩邊均已變更過。 -Items processed: -已處理項目: +Cannot determine sync-direction: +無法確定同步方向: -Items remaining: -剩餘項目: +No change since last synchronization. +自上次同步以來都沒有變更。 -Total time: -全部時間: +The database entry is not in sync considering current settings. +資料庫條目在同步時,不會考慮到目前的設定。 -Cannot set directory lock for %x. -無法對 %x 設定目錄鎖。 +Setting default synchronization directions: Old files will be overwritten with newer files. +設定預設同步方向:舊檔案會被較新的檔案覆蓋。 -Show in Explorer -在資源管理器中顯示 +Checking recycle bin availability for folder %x... +正在檢查資源回收筒的可用性資料夾 %x... -Open with default application -使用預設的應用程式開啟 +Moving file %x to recycle bin +正在移動檔案 %x 到資源回收筒 -Browse directory -瀏覽目錄 +Moving folder %x to recycle bin +正在移動資料夾 %x 到資源回收筒 -Abort requested: Waiting for current operation to finish... -中止請求:正在等待目前操作完成... +Moving symbolic link %x to recycle bin +正在移動符號連結 %x 到資源回收筒 -Failure to create timestamp for versioning: -無法新建時間戳記的版本控制: +Deleting file %x +正在刪除檔案 %x -RealtimeSync - Automated Synchronization -即時同步 - 自動同步 +Deleting folder %x +正在刪除資料夾 %x + +Deleting symbolic link %x +正在刪除符號連結 %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +資源回收筒不可用於以下資料夾!否則檔案將改為永久被刪除: + +An exception occurred +發生異常 + +Cannot find file %x. +找不到檔案 %x。 Error 錯誤 -Selected variant: -選取的變數: +File %x does not contain a valid configuration. +檔案 %x 不包含一個有效的配置。 -Select alternate comparison settings -選擇替代的比對設定 +A folder input field is empty. +資料夾輸入欄位是空的。 -Select alternate synchronization settings -選擇替代的同步設定 +The corresponding folder will be considered as empty. +對應的資料夾將視為空的。 -Filter is active -篩選器為啟動 +Cannot find the following folders: +找不到下列資料夾: -No filter selected -沒有選擇篩選器 +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +您可以忽略每個資料夾視為空的錯誤。資料夾會在同步過程中自動新建。 -Remove alternate settings -移除替代設定 +The following folders have dependent paths. Be careful when setting up synchronization rules: +下列資料夾有相依路徑。請小心設定同步規則: -Clear filter settings -清除篩選器設定 +File %x has an invalid date. +檔案 %x 的日期無效。 -Copy -複製 +Date: +資料: -Paste -貼上 +Files %x have the same date but a different size. +檔案 %x 日期相同但大小不同。 -Save as batch job -另存為批次處理作業 +Size: +大小: -Comparison settings -比對設定 +Items differ in attributes only +只有項目的屬性不同 -Synchronization settings -同步設定 +Resolving symbolic link %x +正在解析符號連結 %x -About -關於 +Comparing content of files %x +正在比對檔案内容 %x -Confirm -確認 +Generating file list... +正在產生檔案清單... -Configure filter -配置篩選 +Starting comparison +開始比對 -Global settings -整體設定 +Calculating sync directions... +正在計算同步方向... -Find -尋找 +Out of memory. +記憶體不足。 -Select time span -選擇時間間隔 +Item exists on left side only +只存在於左邊的項目 -Invalid command line: -無效的命令列: +Item exists on right side only +只存在於右邊的項目 -Info -訊息 +Left side is newer +左邊較新 -Warning -警告 +Right side is newer +右邊較新 -Fatal Error -嚴重錯誤 +Items have different content +項目具有不同內容 -Error Code %x: -錯誤代碼 %x: +Both sides are equal +兩邊都相同 -Cannot resolve symbolic link %x. -無法解析符號連結 %x。 +Conflict/item cannot be categorized +衝突/項目不能被分類 - -1 Byte -%x Bytes - - -%x 位元組 - +Copy new item to left +複製新的項目到左邊 -%x MB -%x MB +Copy new item to right +複製新的項目到右邊 -%x KB -%x KB +Delete left item +刪除左邊項目 -%x GB -%x GB +Delete right item +刪除右邊項目 + +Move file on left +移動左邊的檔案 + +Move file on right +移動右邊的檔案 + +Overwrite left item +覆蓋左邊項目 + +Overwrite right item +覆蓋右邊項目 + +Do nothing +維持原狀 + +Update attributes on left +更新左邊的屬性 + +Update attributes on right +更新右邊的屬性 Database file %x is incompatible. 資料庫檔案 %x 是不相容的。 @@ -144,9 +172,6 @@ Database file is corrupt: 資料庫檔案已損毀: -Out of memory! -記憶體不足! - Cannot write file %x. 無法寫入檔案 %x。 @@ -156,8 +181,8 @@ Database files do not share a common session. 資料庫檔案不會共享一個共同的連線。 -An exception occurred! -發生異常! +Searching for folder %x... +正在搜尋資料夾 %x... Cannot read file attributes of %x. 無法讀取 %x 的檔案屬性。 @@ -179,9 +204,38 @@ Creating file %x 正在新建檔案 %x +Items processed: +已處理項目: + +Items remaining: +剩餘項目: + +Total time: +全部時間: + + +1 Byte +%x Bytes + + +%x 位元組 + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. 解析 %x 檔案,第 %y 列,第 %z 行出現錯誤。 +Cannot set directory lock for %x. +無法對 %x 設定目錄鎖。 + Scanning: 正在掃瞄: @@ -199,12 +253,18 @@ /sec /秒 -File %x does not contain a valid configuration. -檔案 %x 不包含一個有效的配置。 - Configuration file %x loaded partially only. 只載入設定檔 %x 的一部份。 +Show in Explorer +在資源管理器中顯示 + +Open with default application +使用預設的應用程式開啟 + +Browse directory +瀏覽目錄 + Cannot access Volume Shadow Copy Service. 無法讀取卷影複製服務。 @@ -214,18 +274,21 @@ Cannot load file %x. 無法載入檔案 %x。 -Path %x does not contain a volume name. -路徑 %x 不包含卷名。 +Cannot determine volume name for %x. +無法確定卷名為 %x。 + +Volume name %x not part of file name %y. +卷名 %x 並非檔名 %y 的一部份。 -Volume name %x not part of file name %y! -卷名 %x 並非檔名 %y 的一部份! +Abort requested: Waiting for current operation to finish... +中止請求:正在等待目前操作完成... + +Failure to create timestamp for versioning: +無法新建時間戳記的版本控制: Cannot read the following XML elements: 無法讀取下列XML元素: -Cannot find file %x. -找不到檔案 %x。 - &Open... 開啟(&O)... @@ -306,9 +369,18 @@ The command is triggered if: Cancel 取消 +RealtimeSync - Automated Synchronization +即時同步 - 自動同步 + +Warning +警告 + Build: %x 建立:%x +About +關於 + All files 所有檔案 @@ -318,29 +390,125 @@ The command is triggered if: &Exit 結束(&E) -Monitoring active... -監測活動... - Waiting for missing directories... 等待缺少的目錄... -A folder input field is empty. -資料夾輸入欄位是空的。 +Invalid command line: +無效的命令列: + +File content +檔案内容 + +File time and size +檔案大小和日期 + + Two way + 雙向 + +Mirror +鏡像 + +Update +更新 + +Custom +自訂 -Synchronization aborted! -同步已中止! +Multiple... +多個... -Synchronization completed with errors! -同步完成但有錯誤! +Moving file %x to %y +正在移動檔案 %x 到 %y -Synchronization completed with warnings. -同步已完成,但出現警告。 +Moving folder %x to %y +正在移動資料夾 %x 到 %y -Nothing to synchronize! -沒有什麼東西可同步! +Moving symbolic link %x to %y +正在移動符號連結 %x 到 %y -Synchronization completed successfully. -同步已成功完成。 +Removing old versions... +正在刪除舊版本... + +Creating symbolic link %x +正在新建符號連結 %x + +Creating folder %x +正在新建資料夾 %x + +Overwriting file %x +正在覆蓋檔案 %x + +Overwriting symbolic link %x +正在覆蓋符號連結 %x + +Verifying file %x +正在驗證檔案 %x + +Updating attributes of %x +正在更新 %x 個屬性 + +Cannot find %x. +找不到 %x。 + +Target folder %x already existing. +目標資料夾 %x 已存在。 + +Target folder input field must not be empty. +目標資料夾輸入欄位不能為空。 + +Folder input field for versioning must not be empty. +版本控制資料夾輸入欄位不能為空。 + +Source folder %x not found. +來源資料夾 %x 找不到。 + +The following items have unresolved conflicts and will not be synchronized: +下列項目有未解決的衝突,將不會同步: + +Significant difference detected: +檢測到顯著的差異: + +More than 50% of the total number of files will be copied or deleted. +超過總數 50% 以上的檔案會被複製或刪除。 + +Not enough free disk space available in: +沒有足夠的可用空間: + +Required: +必要: + +Available: +可用: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +一個將被修改的資料夾,是多個配對資料夾的一部分。請檢查同步設定。 + +Synchronizing folder pair: +同步配對資料夾: + +Generating database... +正在產生資料庫... + +Creating Volume Shadow Copy for %x... +正在新建卷影複製為 %x... + +Data verification error: %x and %y have different content. +資料驗證錯誤:%x 和 %y 內容不同! + +Synchronization aborted +同步已中止 + +Synchronization completed with errors +同步完成但有錯誤 + +Synchronization completed with warnings +同步已完成,但出現警告 + +Nothing to synchronize +沒有什麼東西可同步 + +Synchronization completed successfully +同步已成功完成 Saving log file %x... 正在儲存日誌檔 %x... @@ -348,8 +516,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. 在FreeFileSync主對話框,按下 "切換" 來解決問題。 -Switching to FreeFileSync main dialog... -切換到FreeFileSync主對話框... +Switching to FreeFileSync main dialog +切換到FreeFileSync主對話框 A new version of FreeFileSync is available: FreeFileSync有新版本可用: @@ -357,29 +525,29 @@ The command is triggered if: Download now? 要立即下載嗎? -FreeFileSync is up to date! -FreeFileSync已經是最新版本! +New version found +找到新版本 -Information -訊息 +&Download +下載(&D) -Unable to connect to sourceforge.net! -無法連接到sourceforge.net! +FreeFileSync is up to date. +FreeFileSync已經是最新版本。 -Current FreeFileSync version number was not found online! Do you want to check manually? -目前連線找不到FreeFileSync版號!是否要手動檢查? +Information +訊息 -Do you want FreeFileSync to automatically check for updates every week? -要每週自動檢查更新FreeFileSync嗎? +Unable to connect to sourceforge.net. +無法連接到sourceforge.net。 -(Requires an Internet connection!) -(需要連接到網際網路!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +找不到目前線上FreeFileSync版號!是否要手動檢查? - -<符號連結> +Symlink +符號連結 - -<資料夾> +Folder +資料夾 Full path 完整路徑 @@ -402,18 +570,12 @@ The command is triggered if: Extension 擴展 -Size: -大小: - -Date: -資料: +Category +分類 Action 動作 -Category -分類 - Drag && drop 拖放 @@ -432,6 +594,33 @@ The command is triggered if: Hibernate 休眠 +Selected variant: +選取的變數: + +Select alternate comparison settings +選擇替代的比對設定 + +Select alternate synchronization settings +選擇替代的同步設定 + +Filter is active +篩選器為啟動 + +No filter selected +沒有選擇篩選器 + +Remove alternate settings +移除替代設定 + +Clear filter settings +清除篩選器設定 + +Copy +複製 + +Paste +貼上 + &New 新增(&N) @@ -450,14 +639,14 @@ The command is triggered if: &Language 語言(&L) -&Global settings... -整體設定(&G)... - &Export file list... 匯出檔案清單(&E)... -&Advanced -進階(&A) +&Global settings... +整體設定(&G)... + +&Tools +工具(&T) &Check now 現在檢查(&C) @@ -465,12 +654,18 @@ The command is triggered if: Check &automatically once a week 一週自動檢查一次(&a) -Check for new version -檢查新版本 +Check for new &version +檢查新版本(&v) Compare 比對 +Comparison settings +比對設定 + +Synchronization settings +同步設定 + Synchronize 同步 @@ -483,6 +678,9 @@ The command is triggered if: Swap sides 兩邊交換 +Save as batch job +另存為批次處理作業 + Hide excluded items 隱藏排除項目 @@ -525,53 +723,8 @@ The command is triggered if: &Pause 暫停(&P) -Batch job -批次處理作業 - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -新建一個批次檔來自動執行同步。按兩下此檔案或安排在您的系統任務計畫表:FreeFileSync.exe <工作名稱>.ffs_batch - -Help -說明 - -Error handling -錯誤處理 - -Ignore -忽略 - -Hide all error and warning messages -隱藏所有錯誤和警告訊息 - -Pop-up -彈出視窗 - -Show pop-up on errors or warnings -在彈出視窗上顯示錯誤或警告訊息 - -Exit -結束 - -Abort synchronization on first error -在第一個錯誤出現即中止同步 - -Show progress dialog -顯示進度對話框 - -Save log -儲存日誌 - -Select folder to save log files -選擇要儲存日誌檔的資料夾 - -Limit -限制 - -Limit maximum number of log files -限制日誌檔的最大數量 - -Select variant -選擇變數 +Select a variant +選擇一個變數 Files are found equal if @@ -581,9 +734,6 @@ are the same 如果檔案大小和最後修改時間和日期相同則判斷兩者相同 -File time and size -檔案大小和日期 - Files are found equal if - file content @@ -591,39 +741,42 @@ is the same 如果檔案内容相同則判斷兩者相同 -File content -檔案内容 - Symbolic Link handling 符號連結處理 +Help +說明 + OK 確定 -<- Two way -> -<- 雙向 -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. 識別和傳播兩邊的變更。自動檢測刪除、移動和衝突使用的資料庫。 -Mirror ->> -鏡像 ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. 鏡像備份的左邊的資料夾。同步後,右邊的資料夾進行修改以完全相配左邊的資料夾。 -Update -> -更新 -> - Copy new or updated files to right folder. 將新的或更新過的檔案複製到右邊的資料夾中。 -Custom -自訂 - Configure your own synchronization rules. 配置你自己的同步規則。 +Error handling +錯誤處理 + +Ignore +忽略 + +Hide all error and warning messages +隱藏所有錯誤和警告訊息 + +Pop-up +彈出視窗 + +Show pop-up on errors or warnings +在彈出視窗上顯示錯誤或警告訊息 + Deletion handling 刪除處理 @@ -648,23 +801,32 @@ is the same Naming convention: 命名慣例: -Item exists on left side only -只存在於左邊的項目 +Batch job +批次處理作業 + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +新建一個批次檔來自動執行同步。按兩下此檔案或安排在您的系統任務計畫表:FreeFileSync.exe <工作名稱>.ffs_batch + +Exit +結束 + +Abort synchronization on first error +在第一個錯誤出現即中止同步 -Item exists on right side only -只存在於右邊的項目 +Show progress dialog +顯示進度對話框 -Left side is newer -左邊較新 +Save log +儲存日誌 -Right side is newer -右邊較新 +Select folder to save log files +選擇要儲存日誌檔的資料夾 -Items have different content -項目具有不同內容 +Limit +限制 -Conflict/item cannot be categorized -衝突/項目不能被分類 +Limit maximum number of log files +限制日誌檔的最大數量 Source code written in C++ using: 使用C++編寫的原始碼 @@ -684,9 +846,6 @@ is the same Homepage 首頁 -FreeFileSync at Sourceforge -FreeFileSync在Sourceforge - Email 信箱 @@ -701,11 +860,11 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. 只有符合所有篩選器設定的檔案才會被同步。 -注意:檔名必須相對到基本目錄! +注意:檔名必須相對到基本目錄。 Include @@ -729,6 +888,9 @@ Note: File names must be relative to base directories! &Clear 清除(&C) +Global settings +整體設定 + Fail-safe file copy 故障保護檔案複製 @@ -759,9 +921,6 @@ Note: File names must be relative to base directories! &Default 預設(&D) -Start synchronization -開始同步 - Variant 變數 @@ -780,8 +939,20 @@ Note: File names must be relative to base directories! &Find next 找下一個(&F) -Main bar -主欄位 +Delete +刪除 + +Configure filter +配置篩選 + +Start synchronization +開始同步 + +Find +尋找 + +Select time span +選擇時間間隔 Folder pairs 配對資料夾 @@ -792,6 +963,9 @@ Note: File names must be relative to base directories! Configuration 配置 +Main bar +主欄位 + Filter files 篩選檔案 @@ -843,11 +1017,8 @@ Note: File names must be relative to base directories! Exclude via filter: 使用篩選器排除: - -<多重選擇> - -Delete -刪除 +multiple selection +多重選擇 Include all 包括所有 @@ -876,14 +1047,14 @@ Note: File names must be relative to base directories! Show "%x" 顯示 "%x" - -<最後連線> +Last session +最後連線 Folder Comparison and Synchronization 資料夾比對和同步 -Configuration saved! -配置已儲存! +Configuration saved +配置已儲存 FreeFileSync batch FreeFileSync批次處理 @@ -897,9 +1068,6 @@ Note: File names must be relative to base directories! Never save changes 不要儲存變更 -Configuration loaded! -配置已載入! - Show files that exist on left side only 顯示只存在於左邊的檔案 @@ -945,20 +1113,17 @@ Note: File names must be relative to base directories! Set as default 設為預設值 -Operation aborted! -操作已中止! +Operation aborted +操作已中止 -All folders are in sync! -所有資料夾都是同步的! +All folders are in sync +所有資料夾都是同步的 Comma separated list 逗號分隔清單 -Legend -圖例 - -File list exported! -檔案清單已匯出! +File list exported +檔案清單已匯出 Searching for program updates... 正在搜尋程式更新... @@ -969,6 +1134,9 @@ Note: File names must be relative to base directories! &Ignore 忽略(&I) +Fatal Error +嚴重錯誤 + Don't show this warning again 不再顯示此警告 @@ -990,6 +1158,9 @@ Note: File names must be relative to base directories! Comparing content... 正在比對内容... +Info +訊息 + Paused 已暫停 @@ -1090,18 +1261,18 @@ Note: File names must be relative to base directories! Leave as unresolved conflict 保留給未解決的衝突 -Time stamp -時間戳記 - -Append a timestamp to each file name -將時間戳記附加到每個檔案名稱上 - Replace 取代 Move files and replace if existing 如果存在,移動檔案並取代 +Time stamp +時間戳記 + +Append a timestamp to each file name +將時間戳記附加到每個檔案名稱上 + Folder 資料夾 @@ -1144,9 +1315,6 @@ Note: File names must be relative to base directories! Cannot write modification time of %x. 無法寫入 %x 的修改時間。 -Cannot find system function %x. -找不到系統函數 %x。 - Cannot read security context of %x. 無法讀取 %x 的安全上下文。 @@ -1162,8 +1330,11 @@ Note: File names must be relative to base directories! Cannot create directory %x. 無法新建目錄 %x。 -Cannot copy symbolic link %x to %y. -無法複製符號連結 %x 到 %y。 +Cannot create symbolic link %x. +無法新建符號連結 %x。 + +Cannot find system function %x. +找不到系統函數 %x。 Cannot copy file %x to %y. 無法複製檔案 %x 到 %y。 @@ -1171,15 +1342,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: 項目類型 %x 不被支援: +Cannot resolve symbolic link %x. +無法解析符號連結 %x。 + Cannot open directory %x. 無法開啟目錄 %x。 Cannot enumerate directory %x. 無法枚舉目錄 %x。 -Detected endless directory recursion. -檢測到無限目錄遞迴。 - %x TB %x TB @@ -1210,6 +1381,9 @@ Note: File names must be relative to base directories! %x 天 +Failed to register to receive system messages. +登錄接收系統訊息失敗。 + Cannot set privilege %x. 無法設定權限 %x。 @@ -1219,204 +1393,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. 無法更改I/O處理優先順序。 -Unable to move %x to the Recycle Bin! -無法將 %x 移動到資源回收筒! - -Both sides have changed since last synchronization! -自上次同步後,兩邊均已變更過! - -Cannot determine sync-direction: -無法判斷同步方向: - -No change since last synchronization! -自上次同步以來都沒有變更! - -The corresponding database entries are not in sync considering current settings. -相應的資料庫條目在同步時,不會考慮到目前的設定。 - -Setting default synchronization directions: Old files will be overwritten with newer files. -設定預設同步方向:舊檔案會被較新的檔案覆蓋。 - -Checking recycle bin availability for folder %x... -正在檢查資源回收筒的可用性資料夾 %x... - -Moving file %x to recycle bin -正在移動檔案 %x 到資源回收筒 - -Moving folder %x to recycle bin -正在移動資料夾 %x 到資源回收筒 - -Moving symbolic link %x to recycle bin -正在移動符號連結 %x 到資源回收筒 - -Deleting file %x -正在刪除檔案 %x - -Deleting folder %x -正在刪除資料夾 %x - -Deleting symbolic link %x -正在刪除符號連結 %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -資源回收筒不可用於以下路徑!相反的,檔案將永遠被刪除: - -The corresponding folder will be considered as empty. -對應的資料夾將視為空的。 - -Cannot find the following folders: -找不到下列資料夾: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -您可以忽略每個資料夾視為空的錯誤。資料夾會在同步過程中自動新建。 - -Directories are dependent! Be careful when setting up synchronization rules: -目錄有依靠性!請小心設定同步規則: - -Start comparison -開始比對 - -Calculating sync directions... -正在計算同步方向... - -Conflict detected: -檢測到衝突: - -File %x has an invalid date! -檔案 %x 的日期無效! - -Files %x have the same date but a different size! -檔案 %x 日期相同但大小不同! - -Items differ in attributes only -只有項目的屬性不同 - -Symbolic links %x have the same date but a different target. -%x 的符號連結具有相同的日期,但不同的目標。 - -Comparing content of files %x -正在比對檔案内容 %x - -Comparing files by content failed. -比對檔案內容失敗。 - -Generating file list... -正在產生檔案清單... - -Both sides are equal -兩邊都相同 - -Copy new item to left -複製新的項目到左邊 - -Copy new item to right -複製新的項目到右邊 - -Delete left item -刪除左邊項目 - -Delete right item -刪除右邊項目 - -Move file on left -移動左邊的檔案 - -Move file on right -移動右邊的檔案 - -Overwrite left item -覆蓋左邊項目 - -Overwrite right item -覆蓋右邊項目 - -Do nothing -維持原狀 - -Update attributes on left -更新左邊的屬性 - -Update attributes on right -更新右邊的屬性 - -Multiple... -多個... - -Moving file %x to %y -正在移動檔案 %x 到 %y - -Moving folder %x to %y -正在移動資料夾 %x 到 %y - -Moving symbolic link %x to %y -正在移動符號連結 %x 到 %y - -Removing old versions... -正在刪除舊版本... - -Creating symbolic link %x -正在新建符號連結 %x - -Creating folder %x -正在新建資料夾 %x - -Overwriting file %x -正在覆蓋檔案 %x - -Overwriting symbolic link %x -正在覆蓋符號連結 %x - -Verifying file %x -正在驗證檔案 %x - -Updating attributes of %x -正在更新 %x 個屬性 - -Cannot find %x. -找不到 %x。 - -Target folder %x already existing. -目標資料夾 %x 已存在。 - -Target folder input field must not be empty. -目標資料夾輸入欄位不能為空。 - -Folder input field for versioning must not be empty. -版本控制資料夾輸入欄位不能為空。 +Unable to move %x to the Recycle Bin. +無法將 %x 移動到資源回收筒。 -Source folder %x not found. -來源資料夾 %x 找不到。 - -The following items have unresolved conflicts and will not be synchronized: -下列項目有未解決的衝突,將不會同步: - -Significant difference detected: -檢測到顯著的差異: - -More than 50% of the total number of files will be copied or deleted! -超過總數 50% 以上的檔案會被複製或刪除! - -Not enough free disk space available in: -沒有足夠的可用空間: - -Required: -必要: - -Available: -可用: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -一個將被修改的資料夾,是多個配對資料夾的一部分。請檢查同步設定。 - -Synchronizing folder pair: -同步配對資料夾: +Cannot determine final path for %x. +無法確定最後路徑為 %x。 -Generating database... -正在產生資料庫... - -Creating Volume Shadow Copy for %x... -正在新建卷影複製為 %x... - -Data verification error: Source and target file have different content! -資料驗證錯誤:來源和目標檔案內容不同! +Error Code %x: +錯誤代碼 %x: diff --git a/BUILD/Languages/croatian.lng b/BUILD/Languages/croatian.lng index 9fefb3ed..b87ebc76 100644 --- a/BUILD/Languages/croatian.lng +++ b/BUILD/Languages/croatian.lng @@ -1,144 +1,221 @@
- Hrvatski + Hrvatski Slavko Blažević hr_HR - croatia.png - 3 - n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2 + flag_croatia.png + 3 + n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2
-Searching for folder %x... -Tražim mapu %x... +Cannot determine final path for %x. + -Items processed: -Obrađeni elementi: +Failed to register to receive system messages. + -Items remaining: -Preostale stavke: +Cannot create symbolic link %x. + -Total time: -Ukupno vrijeme: + +Do you really want to delete the following item? +Do you really want to delete the following %x items? + + -Cannot set directory lock for %x. -Ne mogu zaključiti mapu %x. + +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? + + -Show in Explorer -Prikaži u Exploreru +Do&n't save + -Open with default application -Otvori s zadanom aplikacijom + +%y of 1 row in view +%y of %x rows in view + + -Browse directory -Odaberi direktorij +Select a variant + -Abort requested: Waiting for current operation to finish... -Prekid zahtjevan: čekam da se trenutna akcija završi... +Check for new &version + -Failure to create timestamp for versioning: -Nije moguća vremenska oznaka za varijantu +&Tools + -RealtimeSync - Automated Synchronization -RealtimeSync - Automatska Sinkronizacija +Cannot find current FreeFileSync version number online. Do you want to check manually? + + +&Download + + +New version found + + +Switching to FreeFileSync main dialog + + +Data verification error: %x and %y have different content. + + +Cannot determine volume name for %x. + + +Starting comparison + + +Resolving symbolic link %x + + +The following folders have dependent paths. Be careful when setting up synchronization rules: + + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: + + +The database entry is not in sync considering current settings. + + +Both sides have changed since last synchronization. +Obje su strane promjenjene od posljednje sinkronizacije. + +Cannot determine sync-direction: +Ne mogu odrediti smijer sinkronizacije. + +No change since last synchronization. +Nema promjena od zadnje sinkronizacije. + +Setting default synchronization directions: Old files will be overwritten with newer files. +Postavljam zadani sinkronizacijski smijer: Stare datoteke će biti prepisane novim datotekama. + +Checking recycle bin availability for folder %x... +Provjeravam dosupnost koša za smeće za mapu %x... + +Moving file %x to recycle bin +Premještam datoteku %x u Koš za smeće + +Moving folder %x to recycle bin +Premještam mapu %x u Koš za smeće + +Moving symbolic link %x to recycle bin +Premještam simboličnu poveznicu %x u Koš za smeće + +Deleting file %x +Brisanje datoteke %x + +Deleting folder %x +Brisanje mape %x + +Deleting symbolic link %x +Brisanje simboličnih poveznica %x + +An exception occurred +Dogodilo se izuzeće + +Cannot find file %x. +Ne mogu pronaći datoteku %x. Error Greška -Selected variant: -Odaberite način +File %x does not contain a valid configuration. +Datoteka %x ne sadrži valjanu konfiguraciju -Select alternate comparison settings -Izaberite alternativne postavke usporedbe +A folder input field is empty. +Polje za odabir foldera je prazno. -Select alternate synchronization settings -Izaberite alternativne postavke sinkronizacije +The corresponding folder will be considered as empty. +Odgovarajuća mapa će se smatrati prazna. -Filter is active -Filter je aktivan +Cannot find the following folders: +Ne mogu pronaći slijedeće mape: -No filter selected -Nijedan filter odabran +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Možete ignorirati ovu pogrešku te uzeti u obzir svaku mapu praznom. Mape se tada stvaraju automatski tokom sinkronizacije. -Remove alternate settings -Ukloni alternativne postavke +File %x has an invalid date. +Datoteka %x ima nevaljan datum. -Clear filter settings -Počisti postavke filtera +Date: +Datum: -Copy -Kopiraj +Files %x have the same date but a different size. +Datoteke %x imaju isti datum ali drugačiju veličinu. -Paste -Zalijepi +Size: +Veličina: -Save as batch job -Spremi kao slijedni zadatak +Items differ in attributes only +Stavke se razlikuju samo u atributima -Comparison settings -Postavke usporedbe +Comparing content of files %x +Uspoređujem sadržaj datoteka %x -Synchronization settings -Postavke sinkronizacije +Generating file list... +Generiram listu datoteka... -About -O programu +Calculating sync directions... +Izračunavam smjerove sinkronizacije... -Confirm -Potvrdi +Out of memory. +Nedostatak memorije. -Configure filter -Konfiguriraj filter +Item exists on left side only +Stavka postoji samo na lijevoj strani -Global settings -Globalne postavke +Item exists on right side only +Stavka postoji samo na desnoj strani -Find -Pronađi +Left side is newer +Lijeva strana je novija -Select time span -Izaberite mjerni raspon +Right side is newer +Desna strana je novija -Invalid command line: -Netočna naredba: +Items have different content +Stavke imaju različit sadržaj -Info -Info +Both sides are equal +Obje strane su jednake -Warning -Oprez +Conflict/item cannot be categorized +Sukob/stavka ne može biti razvrstana -Fatal Error -Kritična greška +Copy new item to left +Kopiraj novu stavku lijevo -Error Code %x: -Pogreška broj %x: +Copy new item to right +Kopiraj novu stavku desno -Cannot resolve symbolic link %x. -Ne mogu odrediti poveznicu %x. +Delete left item +Izbriši lijevu stavku -Cannot determine final path for %x. - +Delete right item +Izbriši desnu stavku -Cannot find system function %x. -Ne mogu pronaći sistemsku funkciju %x. +Move file on left +Premjesti datoteku lijevo - -1 Byte -%x Bytes - - -%x Bajt -%x Bajta -%x Bajtova - +Move file on right +Premjest datoteku desno -%x MB -%x MB +Overwrite left item +Prepiši lijevu stavku -%x KB -%x KB +Overwrite right item +Prepiši desnu stavku -%x GB -%x GB +Do nothing +Ne radi ništa + +Update attributes on left +Osvježi atribute lijevo + +Update attributes on right +Osvježi atribute desno Database file %x is incompatible. Datoteka baze %x je nekompatibilna @@ -152,9 +229,6 @@ Database file is corrupt: Baza je oštećena: -Out of memory! -Nedostatak memorije - Cannot write file %x. Ne mogu zapisati datoteku %x. @@ -164,8 +238,8 @@ Database files do not share a common session. Datoteke baze ne dijele zajednički protokol -An exception occurred! -Dogodilo se izuzeće! +Searching for folder %x... +Tražim mapu %x... Cannot read file attributes of %x. Ne mogu pročitati osobine od %x. @@ -189,9 +263,40 @@ Creating file %x Izrađujem datoteku %x +Items processed: +Obrađeni elementi: + +Items remaining: +Preostale stavke: + +Total time: +Ukupno vrijeme: + + +1 Byte +%x Bytes + + +%x Bajt +%x Bajta +%x Bajtova + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Greška u analizi datoteke %x, red %y, stupac %z. +Cannot set directory lock for %x. +Ne mogu zaključiti mapu %x. + Scanning: Pretražujem: @@ -211,12 +316,18 @@ /sec /sek -File %x does not contain a valid configuration. -Datoteka %x ne sadrži valjanu konfiguraciju - Configuration file %x loaded partially only. Datoteka postavki %x učitana samo djelomično +Show in Explorer +Prikaži u Exploreru + +Open with default application +Otvori s zadanom aplikacijom + +Browse directory +Odaberi direktorij + Cannot access Volume Shadow Copy Service. Ne mogu pristupiti Volume Shadow Copy Servisu @@ -226,18 +337,18 @@ Cannot load file %x. Ne mogu učitati datoteku %x. -Path %x does not contain a volume name. -Putanja %x ne sadrži naziv particije +Volume name %x not part of file name %y. +Naziv particije %x dio naziva datoteke %y. + +Abort requested: Waiting for current operation to finish... +Prekid zahtjevan: čekam da se trenutna akcija završi... -Volume name %x not part of file name %y! -Naziv particije %x dio naziva datoteke %y! +Failure to create timestamp for versioning: +Nije moguća vremenska oznaka za varijantu Cannot read the following XML elements: Ne mogu čitati slijedeće XML elemente -Cannot find file %x. -Ne mogu pronaći datoteku %x. - &Open... &Otvori... @@ -318,9 +429,18 @@ Naredba će biti pokrenuta ako se: Cancel Odustani +RealtimeSync - Automated Synchronization +RealtimeSync - Automatska Sinkronizacija + +Warning +Oprez + Build: %x Inačnica: %x +About +O programu + All files Sve datoteke @@ -330,28 +450,121 @@ Naredba će biti pokrenuta ako se: &Exit &Izlaz -Monitoring active... -Nadziranje aktivno... - Waiting for missing directories... Čekam nedostajuće direktorije... -A folder input field is empty. -Polje za odabir foldera je prazno. +Invalid command line: +Netočna naredba: + +File content +Sadržaj datoteke + +File time and size +Vrijeme i veličina datoteke + + Two way +Dvosmjerno + +Mirror +Zrcalno + +Update +Ažuriraj + +Custom +Uobičajeno + +Multiple... +Mnogostruko... + +Moving file %x to %y +Premještam datoteku %x u %y + +Moving folder %x to %y +Premještam mapu %x u %y + +Moving symbolic link %x to %y +Premještam simboličnu poveznicu %x u %y + +Removing old versions... +Uklanjam starije verzije... + +Creating symbolic link %x +Izrađujem simboličnu poveznicu %x + +Creating folder %x +Izrađujem mapu %x + +Overwriting file %x +Prepisujem datoteku %x + +Overwriting symbolic link %x +Prepisujem simboličnu poveznicu %x + +Verifying file %x +Provjeravam datoteku %x + +Updating attributes of %x +Obnavljam atribute od %x + +Cannot find %x. +Ne mogu pronaći %x. + +Target folder %x already existing. +Odredišna mapa %x već postoji. + +Target folder input field must not be empty. +Odredišna mapa ne može biti prazna + +Folder input field for versioning must not be empty. +Mapa unosa ne smije biti prazan + +Source folder %x not found. +Izvorna mapa %x nije pronađena + +The following items have unresolved conflicts and will not be synchronized: +Slijedeće stavke imaju nedefiniranih sukoba te neće biti sinkronizirane: + +Significant difference detected: +Značajna razlika opažena: + +More than 50% of the total number of files will be copied or deleted. +Više od 50% od ukupnog broja datoteka će biti kopirano ili izbrisano. + +Not enough free disk space available in: +Nedovoljno prostora na disku: -Synchronization aborted! -Sinkronizacija prekinuta! +Required: +Potrebno: + +Available: +Dostupno: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Mapa će biti uređena koja je dio više pari mapa. Molimo provjerite sinkronizacijske postavke. + +Synchronizing folder pair: +Par sinkronizirane mape: + +Generating database... +Izrađujem bazu podataka... + +Creating Volume Shadow Copy for %x... +Izrađujem Volume Shadow Kopiju za %x... + +Synchronization aborted +Sinkronizacija prekinuta -Synchronization completed with errors! -Sinkronizacija završena s greškama! +Synchronization completed with errors +Sinkronizacija završena s greškama -Synchronization completed with warnings. +Synchronization completed with warnings Sinkronizacija završena s upozorenjima -Nothing to synchronize! -Ništa za sinkronizirati! +Nothing to synchronize +Ništa za sinkronizirati -Synchronization completed successfully. +Synchronization completed successfully Sinkronizacija uspješno dovršena Saving log file %x... @@ -360,38 +573,26 @@ Naredba će biti pokrenuta ako se: Press "Switch" to resolve issues in FreeFileSync main dialog. Preisni "Zamjeni" za riješavanje problema u FreeFileSync glavnom dijaloškom okviru -Switching to FreeFileSync main dialog... -Prebacujem u FreeFileSync glavni dijaloški okvir - A new version of FreeFileSync is available: Nova verzija FreeFileSync je dostupna: Download now? Preuzeti sada? -FreeFileSync is up to date! -FreeFileSync je ažuriran! +FreeFileSync is up to date. +FreeFileSync je ažuriran. Information Informacija -Unable to connect to sourceforge.net! -Ne mogu se povezati na sourceforge.net! - -Current FreeFileSync version number was not found online! Do you want to check manually? -Trenutna FreeFileSync verzija nije pronađena online! Da li želite pronaći ručno? +Unable to connect to sourceforge.net. +Ne mogu se povezati na sourceforge.net. -Do you want FreeFileSync to automatically check for updates every week? -Dali želite da FreeFileSync automatski traži ažuriranja svaki tjedan? +Symlink +Poveznica simbola -(Requires an Internet connection!) -(Zahtjeva vezu na Internet!) - - - - - - +Folder +Mapa Full path Puna putanja @@ -414,12 +615,6 @@ Naredba će biti pokrenuta ako se: Extension Ekstenzija -Size: -Veličina: - -Date: -Datum: - Category Kategorija @@ -444,6 +639,33 @@ Naredba će biti pokrenuta ako se: Hibernate Hibernacija +Selected variant: +Odaberite način + +Select alternate comparison settings +Izaberite alternativne postavke usporedbe + +Select alternate synchronization settings +Izaberite alternativne postavke sinkronizacije + +Filter is active +Filter je aktivan + +No filter selected +Nijedan filter odabran + +Remove alternate settings +Ukloni alternativne postavke + +Clear filter settings +Počisti postavke filtera + +Copy +Kopiraj + +Paste +Zalijepi + &New &Novo @@ -462,14 +684,11 @@ Naredba će biti pokrenuta ako se: &Language &Jezik -&Global settings... -&Globalne postavke... - &Export file list... &Izvoz liste datoteka... -&Advanced -&Napredno +&Global settings... +&Globalne postavke... &Check now &Provjeri sada @@ -477,12 +696,15 @@ Naredba će biti pokrenuta ako se: Check &automatically once a week Provjeri &automatski jednom tjedno -Check for new version -Potraži noviju verziju - Compare Usporedi +Comparison settings +Postavke usporedbe + +Synchronization settings +Postavke sinkronizacije + Synchronize Sinkroniziraj @@ -495,6 +717,9 @@ Naredba će biti pokrenuta ako se: Swap sides Zamjeni strane +Save as batch job +Spremi kao slijedni zadatak + Hide excluded items Sakrij isključene stavke @@ -537,54 +762,6 @@ Naredba će biti pokrenuta ako se: &Pause &Pauziraj -Batch job -Slijedni zadatak - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Izradite slijednu datoteku za automatizirati sinkronizaciju. Dvostruki klik na ovu datoteku ili dodajte obvezu u vašem sistemskom planeru: FreeFileSync.exe .ffs_batch - -Help -Pomoć - -Error handling -Greška pri obradi - -Ignore -Ignoriraj - -Hide all error and warning messages -Sakrij sve greške i upozorenja - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Prikaži skočni prozor pri greškama i upozorenjima - -Exit -Izađi - -Abort synchronization on first error -Prekini sinkronizaciju pri prvoj pogrešci - -Show progress dialog -Prikaži napredak - -Save log -Spremi izvješće - -Select folder to save log files -Odaberi mapu za spremanje izvješća - -Limit -Ograniči - -Limit maximum number of log files -Ograniči maksimalan broj izvješća - -Select variant -Odaberi varijantu - Files are found equal if - last write time and date @@ -598,9 +775,6 @@ Datoteke se smatraju jednake ako su im jednaki -File time and size -Vrijeme i veličina datoteke - Files are found equal if - file content @@ -612,39 +786,42 @@ Datoteke se smatraju jednake ako im je jednak -File content -Sadržaj datoteke - Symbolic Link handling Upravljanje simboličnim poveznicama +Help +Pomoć + OK U redu -<- Two way -> -Dvosmjerno - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Pronađi i izvrši izmjene na obje strane. Izbrisano, premješteno te sukobe se otkrije automatski pomoću baze. -Mirror ->> -Zrcalno ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Zrcalna pričuva lijeve mape. Desna mapa je uređena da bi bila jednaka lijevom folderu nakon sinkronizacije. -Update -> -Ažuriraj -> - Copy new or updated files to right folder. Kopiraj nove ili ažurirane datoteke u desnu mapu. -Custom -Uobičajeno - Configure your own synchronization rules. Konfigurirajte vaša vlastita sinkronizacijska pravila. +Error handling +Greška pri obradi + +Ignore +Ignoriraj + +Hide all error and warning messages +Sakrij sve greške i upozorenja + +Pop-up +Pop-up + +Show pop-up on errors or warnings +Prikaži skočni prozor pri greškama i upozorenjima + Deletion handling Upravljanje pri brisanju @@ -669,23 +846,32 @@ jednak Naming convention: Pravilo imena: -Item exists on left side only -Stavka postoji samo na lijevoj strani +Batch job +Slijedni zadatak + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Izradite slijednu datoteku za automatizirati sinkronizaciju. Dvostruki klik na ovu datoteku ili dodajte obvezu u vašem sistemskom planeru: FreeFileSync.exe .ffs_batch + +Exit +Izađi + +Abort synchronization on first error +Prekini sinkronizaciju pri prvoj pogrešci -Item exists on right side only -Stavka postoji samo na desnoj strani +Show progress dialog +Prikaži napredak -Left side is newer -Lijeva strana je novija +Save log +Spremi izvješće -Right side is newer -Desna strana je novija +Select folder to save log files +Odaberi mapu za spremanje izvješća -Items have different content -Stavke imaju različit sadržaj +Limit +Ograniči -Conflict/item cannot be categorized -Sukob/stavka ne može biti razvrstana +Limit maximum number of log files +Ograniči maksimalan broj izvješća Source code written in C++ using: Izvorni kod napisan u C++ uz korištenje: @@ -705,9 +891,6 @@ jednak Homepage Početna stranica -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge - Email Email @@ -722,11 +905,11 @@ jednak Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Samo datoteke koje odgovaraju svim filterskim postavkama će biti sinkronizirane. -Napomena: Imena datoteka moraju biti srodni s glavnim mapama! +Napomena: Imena datoteka moraju biti srodni s glavnim mapama. Include @@ -750,6 +933,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! &Clear &Brisati +Global settings +Globalne postavke + Fail-safe file copy Kopiranje zaštićeno od grešaka @@ -780,9 +966,6 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! &Default &Zadano -Start synchronization -Započni sinkronizaciju - Variant Način @@ -801,6 +984,21 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! &Find next &Nađi slijedeće +Delete +Izbriši + +Configure filter +Konfiguriraj filter + +Start synchronization +Započni sinkronizaciju + +Find +Pronađi + +Select time span +Izaberite mjerni raspon + Folder pairs Par mape @@ -848,12 +1046,6 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! %x datoteka - -%y of 1 row in view -%y of %x rows in view - - - Set direction: Odaberi smijer: @@ -866,11 +1058,8 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! Exclude via filter: Isključi preko filtra: - - - -Delete -Izbriši +multiple selection +višestruki odabir Include all Uključi sve @@ -899,14 +1088,14 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! Show "%x" Prikaži "%x" - - +Last session +Zadnja sesija Folder Comparison and Synchronization Usporedba i sinkronizacija mapa -Configuration saved! -Postavke spremljene! +Configuration saved +Postavke spremljene FreeFileSync batch FreeFileSync slijedni zadatak @@ -914,15 +1103,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! Do you want to save changes to %x? Da li želite spremiti izmjene za %x? -Do&n't save -Ne spremaj - Never save changes Nikad ne spremaj promjene -Configuration loaded! -Postavke učitane! - Show files that exist on left side only Prikaži datoteke koje postoje samo na lijevoj strani @@ -968,17 +1151,17 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! Set as default Postavi kao zadano -Operation aborted! -Operacija otkazana! +Operation aborted +Operacija otkazana -All folders are in sync! -Sve mape su u sinkronizaciji! +All folders are in sync +Sve mape su u sinkronizaciji Comma separated list Zarezom odvojene liste -File list exported! -Datotečna lista izvezena! +File list exported +Datotečna lista izvezena Searching for program updates... Pretražujem ažuriranja programa... @@ -989,6 +1172,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! &Ignore &Ignoriraj +Fatal Error +Kritična greška + Don't show this warning again Ne prikazuj ovo upozorenje ponovno @@ -1010,6 +1196,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! Comparing content... Uspoređujem sadržaj... +Info +Info + Paused Pauzirano @@ -1064,18 +1253,6 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! Filter Filtriranje - -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? - - - - -Do you really want to delete the following item? -Do you really want to delete the following %x items? - - - Direct Neposredno @@ -1175,8 +1352,8 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! Cannot create directory %x. Ne mogu izraditi mapu %x. -Cannot create symbolic link %x. - +Cannot find system function %x. +Ne mogu pronaći sistemsku funkciju %x. Cannot copy file %x to %y. Ne mogu kopirati datoteku %x na %y. @@ -1184,15 +1361,15 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! Type of item %x is not supported: Tip stavke %x koji nije podržan: +Cannot resolve symbolic link %x. +Ne mogu odrediti poveznicu %x. + Cannot open directory %x. Ne mogu otvoriti mapu %x. Cannot enumerate directory %x. Ne mogu izlistati mapu %x. -Detected endless directory recursion. -Detektiran bezograničeni direktorij - %x TB %x TB @@ -1238,201 +1415,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama! Cannot change process I/O priorities. Ne može se promjeniti proces I/O prioriteta -Unable to move %x to the Recycle Bin! -Nije moguće premjestiti %x u koš za smeće! - -Both sides have changed since last synchronization! -Obje su strane promjenjene od posljednje sinkronizacije! - -Cannot determine sync-direction: -Ne mogu odrediti smijer sinkronizacije. - -No change since last synchronization! -Nema promjena od zadnje sinkronizacije! - -The corresponding database entries are not in sync considering current settings. -Spomenuti unosi baze nisu u sinkronizaciji gledajući trenutne postavke. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Postavljam zadani sinkronizacijski smijer: Stare datoteke će biti prepisane novim datotekama. - -Checking recycle bin availability for folder %x... -Provjeravam dosupnost koša za smeće za mapu %x... - -Moving file %x to recycle bin -Premještam datoteku %x u Koš za smeće - -Moving folder %x to recycle bin -Premještam mapu %x u Koš za smeće - -Moving symbolic link %x to recycle bin -Premještam simboličnu poveznicu %x u Koš za smeće - -Deleting file %x -Brisanje datoteke %x - -Deleting folder %x -Brisanje mape %x - -Deleting symbolic link %x -Brisanje simboličnih poveznica %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Koš za smeće nije dostupan za navedene putanje! Umjesto toga datoteke će biti trajno izbrisane: - -The corresponding folder will be considered as empty. -Odgovarajuća mapa će se smatrati prazna. - -Cannot find the following folders: -Ne mogu pronaći slijedeće mape: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Možete ignorirati ovu pogrešku te uzeti u obzir svaku mapu praznom. Mape se tada stvaraju automatski tokom sinkronizacije. - -Directories are dependent! Be careful when setting up synchronization rules: -Direktoriji su u ovisnosti! Budite oprezni pri postavljanju sinkronizacijskih pravila: - -Conflict detected: -Sukob pronađen: - -File %x has an invalid date! -Datoteka %x ima nevaljan datum! - -Files %x have the same date but a different size! -Datoteke %x imaju isti datum ali drugačiju veličinu! - -Items differ in attributes only -Stavke se razlikuju samo u atributima - -Resolving symbolic link %x - - -Comparing content of files %x -Uspoređujem sadržaj datoteka %x - -Generating file list... -Generiram listu datoteka... - -Start comparison -Započni usporedbu - -Calculating sync directions... -Izračunavam smjerove sinkronizacije... - -Both sides are equal -Obje strane su jednake - -Copy new item to left -Kopiraj novu stavku lijevo - -Copy new item to right -Kopiraj novu stavku desno - -Delete left item -Izbriši lijevu stavku - -Delete right item -Izbriši desnu stavku - -Move file on left -Premjesti datoteku lijevo - -Move file on right -Premjest datoteku desno - -Overwrite left item -Prepiši lijevu stavku - -Overwrite right item -Prepiši desnu stavku - -Do nothing -Ne radi ništa - -Update attributes on left -Osvježi atribute lijevo - -Update attributes on right -Osvježi atribute desno - -Multiple... -Mnogostruko... - -Moving file %x to %y -Premještam datoteku %x u %y - -Moving folder %x to %y -Premještam mapu %x u %y - -Moving symbolic link %x to %y -Premještam simboličnu poveznicu %x u %y - -Removing old versions... -Uklanjam starije verzije... - -Creating symbolic link %x -Izrađujem simboličnu poveznicu %x - -Creating folder %x -Izrađujem mapu %x - -Overwriting file %x -Prepisujem datoteku %x - -Overwriting symbolic link %x -Prepisujem simboličnu poveznicu %x - -Verifying file %x -Provjeravam datoteku %x - -Updating attributes of %x -Obnavljam atribute od %x - -Cannot find %x. -Ne mogu pronaći %x. - -Target folder %x already existing. -Odredišna mapa %x već postoji. - -Target folder input field must not be empty. -Odredišna mapa ne može biti prazna - -Folder input field for versioning must not be empty. -Mapa unosa ne smije biti prazan - -Source folder %x not found. -Izvorna mapa %x nije pronađena - -The following items have unresolved conflicts and will not be synchronized: -Slijedeće stavke imaju nedefiniranih sukoba te neće biti sinkronizirane: - -Significant difference detected: -Značajna razlika opažena: - -More than 50% of the total number of files will be copied or deleted! -Više od 50% od ukupnog broja datoteka će biti kopirano ili izbrisano! - -Not enough free disk space available in: -Nedovoljno prostora na disku: - -Required: -Potrebno: - -Available: -Dostupno: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Mapa će biti uređena koja je dio više pari mapa. Molimo provjerite sinkronizacijske postavke. - -Synchronizing folder pair: -Par sinkronizirane mape: +Unable to move %x to the Recycle Bin. +Nije moguće premjestiti %x u koš za smeće. -Generating database... -Izrađujem bazu podataka... - -Creating Volume Shadow Copy for %x... -Izrađujem Volume Shadow Kopiju za %x... - -Data verification error: Source and target file have different content! -Greška pri provjeravanju podataka: Izvorna i ciljna datoteka imaju različit sadržaj! +Error Code %x: +Pogreška broj %x: diff --git a/BUILD/Languages/czech.lng b/BUILD/Languages/czech.lng index 33ea5144..0b77b086 100644 --- a/BUILD/Languages/czech.lng +++ b/BUILD/Languages/czech.lng @@ -1,138 +1,164 @@
- Čeština + Čeština ViCi cs_CZ - czechRep.png - 3 - n==1 ? 0 : n>=2 && n<=4 ? 1 : 2 + flag_czech_republic.png + 3 + n==1 ? 0 : n>=2 && n<=4 ? 1 : 2
-Searching for folder %x... -Otevírání složky %x +Both sides have changed since last synchronization. +Došlo ke změně obou stran od poslední synchronizace. -Items processed: -Zpracováno položek: +Cannot determine sync-direction: +Nelze určit směr synchronizace: -Items remaining: -Zbývá položek: +No change since last synchronization. +Žádné změny od poslední synchronizace. -Total time: -Celkový čas: +The database entry is not in sync considering current settings. +Databázové položky nejsou podle aktuální konfigurace synchronní. -Cannot set directory lock for %x. -Nelze nastavit zámek adresáře %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +Nastaven výchozí způsob synchronizace: Staré soubory budou nahrazeny novými. -Show in Explorer -Zobrazit v Průzkumníkovi +Checking recycle bin availability for folder %x... +Kontrola Koše na složku %x ... -Open with default application -Otevřít výchozí aplikací +Moving file %x to recycle bin +Přesouvání souboru %x do Koše -Browse directory -Procházet adresář +Moving folder %x to recycle bin +Přesouvání adresáře %x do Koše -Abort requested: Waiting for current operation to finish... -Požadavek na přerušení: Čekání na ukončení aktuální operace... +Moving symbolic link %x to recycle bin +Přesouvání symbolického odkazu %x do Koše -Failure to create timestamp for versioning: -Chyba při vytvoření časové značky verzování: +Deleting file %x +Mazání souboru %x -RealtimeSync - Automated Synchronization -RealtimeSync - Automatická synchronizace +Deleting folder %x +Mazání adresáře %x + +Deleting symbolic link %x +Mazání symbolického odkazu %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Nelze použít Koš pro následující složky (soubory budou odstraněny permanentně): + +An exception occurred +Vyskytla se chyba + +Cannot find file %x. +Nelze najít soubor %x. Error Chyba -Selected variant: -Vybraná varianta: +File %x does not contain a valid configuration. +Soubor %x neobsahuje platnou konfiguraci. -Select alternate comparison settings -Změnit nastavení porovnání +A folder input field is empty. +Není zadána vstupní složka. -Select alternate synchronization settings -Změnit nastavení synchronizace +The corresponding folder will be considered as empty. +Odpovídající složka bude považována za prázdnou. -Filter is active -Filtr je zapnutý +Cannot find the following folders: +Nelze najít následující složky: -No filter selected -Není vybrán žádný filtr +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Tuto chybu můžete přeskočit a považovat neexistující složku za prázdnou. Složka pak bude vytvořena při synchronizaci automaticky. -Remove alternate settings -Zrušit jiné nastavení +The following folders have dependent paths. Be careful when setting up synchronization rules: +Následující složky mají navzájem závislé cesty! Buďte opatrní s definicí synchronizačních pravidel: -Clear filter settings -Zrušit nastavení filtru +File %x has an invalid date. +Soubor %x má chybné datum. -Copy -Kopírovat +Date: +Čas: -Paste -Vložit +Files %x have the same date but a different size. +Soubory %x mají stejné datum a čas ale rozdílnou velikost. -Save as batch job -Uložit jako dávku +Size: +Velikost: -Comparison settings -Nastavení porovnání +Items differ in attributes only +Položky se liší pouze ve vlastnostech -Synchronization settings -Nastavení synchronizace +Resolving symbolic link %x +Hledání odkazu symbolického zástupce %x -About -O Programu +Comparing content of files %x +Porovnávání obsahu souborů %x -Confirm -Potvrdit +Generating file list... +Vytváření seznamu souborů... -Configure filter -Nastavení filtru +Starting comparison +Začátek porovnávání -Global settings -Nastavení programu +Calculating sync directions... +Příprava adresářů synchronizace... -Find -Najít +Out of memory. +Nedostatek pracovní paměti. -Select time span -Časové rozmezí +Item exists on left side only +Položky existující pouze vlevo -Invalid command line: -Neplatný příkaz: +Item exists on right side only +Položky existující pouze vpravo -Info -Info +Left side is newer +Vlevo je novější -Warning -Varování +Right side is newer +Vpravo je novější -Fatal Error -Závažná chyba +Items have different content +Obsah položek je rozdílný -Error Code %x: -Chybový kód %x +Both sides are equal +Obě strany jsou shodné -Cannot resolve symbolic link %x. -Nelze najít odkaz zástupce %x. +Conflict/item cannot be categorized +Konflikty/položky které nelze zařadit - -1 Byte -%x Bytes - - -%x B -%x B -%x B - +Copy new item to left +Kopírovat novou položku doleva -%x MB -%x MB +Copy new item to right +Kopírovat novou položku doprava -%x KB -%x KB +Delete left item +Smazat položku zleva -%x GB -%x GB +Delete right item +Smazat položku zprava + +Move file on left +Přesunout soubor nalevo + +Move file on right +Přesunout soubor napravo + +Overwrite left item +Přepsat levou položku tou zprava + +Overwrite right item +Přepsat pravou položku tou zleva + +Do nothing +Nic nedělat + +Update attributes on left +Nastavit vlastnosti vlevo + +Update attributes on right +Nastavit vlastnosti vpravo Database file %x is incompatible. Chybný formát databáze %x. @@ -146,9 +172,6 @@ Database file is corrupt: Databáze je poškozená: -Out of memory! -Nedostatek pracovní paměti! - Cannot write file %x. Nelze zapsat soubor %x. @@ -158,8 +181,8 @@ Database files do not share a common session. Databázové soubory nejsou navzájem komplementární. -An exception occurred! -Vyskytla se chyba! +Searching for folder %x... +Otevírání složky %x Cannot read file attributes of %x. Nelze číst atributy souboru %x. @@ -183,9 +206,40 @@ Creating file %x Vytváření souboru %x +Items processed: +Zpracováno položek: + +Items remaining: +Zbývá položek: + +Total time: +Celkový čas: + + +1 Byte +%x Bytes + + +%x B +%x B +%x B + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Chyba zpracování souboru %x: na řádku %y ve sloupci %z +Cannot set directory lock for %x. +Nelze nastavit zámek adresáře %x. + Scanning: Zpracováváno: @@ -205,12 +259,18 @@ /sec /s -File %x does not contain a valid configuration. -Soubor %x neobsahuje platnou konfiguraci. - Configuration file %x loaded partially only. Konfigurace ze souboru %x byla načtena jen částečně. +Show in Explorer +Zobrazit v Průzkumníkovi + +Open with default application +Otevřít výchozí aplikací + +Browse directory +Procházet adresář + Cannot access Volume Shadow Copy Service. Nepodařil se přístup ke službě Stínové kopie. @@ -220,18 +280,21 @@ Cannot load file %x. Nelze načíst soubor %x. -Path %x does not contain a volume name. +Cannot determine volume name for %x. >Nelze zjistit jméno jednotky souboru %x. -Volume name %x not part of file name %y! -Disk %x není součástí jména souboru %y! +Volume name %x not part of file name %y. +Disk %x není součástí jména souboru %y. + +Abort requested: Waiting for current operation to finish... +Požadavek na přerušení: Čekání na ukončení aktuální operace... + +Failure to create timestamp for versioning: +Chyba při vytvoření časové značky verzování: Cannot read the following XML elements: Nelze načíst následující XML elementy: -Cannot find file %x. -Nelze najít soubor %x. - &Open... &Otevřít... @@ -312,9 +375,18 @@ Příkaz je spuštěn když: Cancel Zrušit +RealtimeSync - Automated Synchronization +RealtimeSync - Automatická synchronizace + +Warning +Varování + Build: %x Verze: %x +About +O Programu + All files Všechny soubory @@ -324,29 +396,125 @@ Příkaz je spuštěn když: &Exit &Konec -Monitoring active... -Sledování zapnuto... - Waiting for missing directories... Čekání na nedostupné adresáře... -A folder input field is empty. -Není zadána vstupní složka. +Invalid command line: +Neplatný příkaz: + +File content +Podle obsahu souboru + +File time and size +Podle velikosti a data souboru + + Two way + Databáze + +Mirror +Zrcadlení + +Update +Aktualizace + +Custom +Vlastní + +Multiple... +Různé... + +Moving file %x to %y +Přesouvání souboru %x do %y + +Moving folder %x to %y +Přesouvání adresáře %x do %y + +Moving symbolic link %x to %y +Přesouvání symbolického odkazu %x do %y + +Removing old versions... +Odstraňování starých verzí... + +Creating symbolic link %x +Vytváření symbolického odkazu %x + +Creating folder %x +Vytváření adresáře %x + +Overwriting file %x +Přepisování souboru %x + +Overwriting symbolic link %x +Přepisování symbolického odkazu %x + +Verifying file %x +Kontrola souboru %x -Synchronization aborted! -Synchronizace zrušena! +Updating attributes of %x +Aktualizace atributů souboru %x -Synchronization completed with errors! -Synchronizace dokončena s chybami. +Cannot find %x. +Nelze najít %x. -Synchronization completed with warnings. -Synchronizace dokončena s varováními. +Target folder %x already existing. +Cílová složka %x již existuje. -Nothing to synchronize! -Není co synchronizovat! +Target folder input field must not be empty. +Cílová složka nesmí být prázdná. -Synchronization completed successfully. -Synchronizace dokončena úspěšně. +Folder input field for versioning must not be empty. +Složka pro verzování souborů nesmí být prázdná. + +Source folder %x not found. +Zdrojovou složku %x nelze najít. + +The following items have unresolved conflicts and will not be synchronized: +Následující položky jsou nevyřešené konflikty a nebudou synchronizovány: + +Significant difference detected: +Nalezeny významné změny: + +More than 50% of the total number of files will be copied or deleted. +Více než polovina souborů má být zkopírována nebo smazána. + +Not enough free disk space available in: +Nedostatek místa na disku: + +Required: +Požadováno + +Available: +K dispozici + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Bude změněna složka, která je součástí adresářového páru vícenásobného porovnání. Prosím zkontrolujte si nastavení synchronizace. + +Synchronizing folder pair: +Zpracovávání páru složek: + +Generating database... +Vytváření databáze... + +Creating Volume Shadow Copy for %x... +Vytváření Stínové kopie pro %x... + +Data verification error: %x and %y have different content. +Chyba porovnání dat: %x má jiný obsah než %y + +Synchronization aborted +Synchronizace zrušena + +Synchronization completed with errors +Synchronizace dokončena s chybami + +Synchronization completed with warnings +Synchronizace dokončena s varováními + +Nothing to synchronize +Není co synchronizovat + +Synchronization completed successfully +Synchronizace dokončena úspěšně Saving log file %x... Ukládání žurnálu %x... @@ -354,8 +522,8 @@ Příkaz je spuštěn když: Press "Switch" to resolve issues in FreeFileSync main dialog. Použijte tlačítko "Přepnout" k vyřešení problému pomocí hlavního okna FreeFileSync. -Switching to FreeFileSync main dialog... -Přepínání do hlavního okna FreeFileSync... +Switching to FreeFileSync main dialog +Přepínání do hlavního okna FreeFileSync A new version of FreeFileSync is available: Je dostupná novější verze FreeFileSync: @@ -363,29 +531,29 @@ Příkaz je spuštěn když: Download now? Stáhnout nyní? -FreeFileSync is up to date! -FreeFileSync je aktuální! +New version found +Nalezena novější verze + +&Download +&Stahování + +FreeFileSync is up to date. +FreeFileSync je aktuální. Information Informace -Unable to connect to sourceforge.net! -Není možné se připojit k sourceforge.net! +Unable to connect to sourceforge.net. +Není možné se připojit k sourceforge.net. -Current FreeFileSync version number was not found online! Do you want to check manually? +Cannot find current FreeFileSync version number online. Do you want to check manually? Současná verze FreeFileSync nebyla nalezena online! Chcete verzi zkontrolovat ručně? -Do you want FreeFileSync to automatically check for updates every week? -Chcete aby FreeFileSync automaticky zjišťoval aktualizace každý týden? - -(Requires an Internet connection!) -(Vyžaduje připojení k internetu!) +Symlink +Symlink - - - - - +Folder +Složka Full path Plná cesta @@ -408,18 +576,12 @@ Příkaz je spuštěn když: Extension Přípona -Size: -Velikost: - -Date: -Čas: +Category +Kategorie Action Akce -Category -Kategorie - Drag && drop Přetáhni sem && pusť @@ -438,6 +600,33 @@ Příkaz je spuštěn když: Hibernate Přepnout do režimu spánku +Selected variant: +Vybraná varianta: + +Select alternate comparison settings +Změnit nastavení porovnání + +Select alternate synchronization settings +Změnit nastavení synchronizace + +Filter is active +Filtr je zapnutý + +No filter selected +Není vybrán žádný filtr + +Remove alternate settings +Zrušit jiné nastavení + +Clear filter settings +Zrušit nastavení filtru + +Copy +Kopírovat + +Paste +Vložit + &New &Nový @@ -456,13 +645,13 @@ Příkaz je spuštěn když: &Language &Jazyk -&Global settings... -&Nastavení... - &Export file list... &Exportovat seznam souborů... -&Advanced +&Global settings... +&Nastavení... + +&Tools &Upřesnit &Check now @@ -471,12 +660,18 @@ Příkaz je spuštěn když: Check &automatically once a week Kontrolovat &automaticky jednou týdně -Check for new version +Check for new &version &Zkontrolovat aktualizace Compare Porovnání +Comparison settings +Nastavení porovnání + +Synchronization settings +Nastavení synchronizace + Synchronize Synchronizace @@ -489,6 +684,9 @@ Příkaz je spuštěn když: Swap sides Změna stran +Save as batch job +Uložit jako dávku + Hide excluded items Skrýt vynechané položky @@ -531,52 +729,7 @@ Příkaz je spuštěn když: &Pause &Pauza -Batch job -Dávkový soubor - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Vytvoří dávkový souboru pro automatickou synchronizaci. Ke spuštění dávky jednoduše poklikejte na vytvořený soubor nebo jeho jméno zadejte jako parametr při spuštění FreeFileSync: FreeFileSync.exe . Stejně tak můžete ke spuštění využít plánovač úloh vašeho operačního systému. - -Help -Nápověda - -Error handling -Zpracování chyb - -Ignore -Přeskočit - -Hide all error and warning messages -Skrýt všechny chyby a varování - -Pop-up -Hlášení - -Show pop-up on errors or warnings -Zobrazit hlášení při chybě nebo varování - -Exit -Konec - -Abort synchronization on first error -Ukončit synchronizaci při první chybě - -Show progress dialog -Zobrazit průběh zpracování - -Save log -Uložit žurnál - -Select folder to save log files -Vyberte složku pro žurnály - -Limit -Omezení - -Limit maximum number of log files -Omezení maximálního počtu žurnálů - -Select variant +Select a variant Výběr možnosti @@ -592,9 +745,6 @@ Soubory jsou shodné jestliže jsou stejné -File time and size -Podle velikosti a data souboru - Files are found equal if - file content @@ -606,39 +756,42 @@ Soubory jsou shodné jestliže je stejný -File content -Podle obsahu souboru - Symbolic Link handling Zpracování symbolických odkazů +Help +Nápověda + OK OK -<- Two way -> -<- Databáze -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Rozpoznat a provést změny na obou stranách. Odstraněné, přesunuté nebo přejmenované soubory a konflikty budou detekovány automaticky pomocí databáze. -Mirror ->> -Zrcadlení ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Zrcadlení levého adresáře. Pravý adresář bude změněn tak, aby po synchronizaci byl totožný s levým. -Update -> -Aktualizace -> - Copy new or updated files to right folder. Kopírovat nové nebo aktualizované soubory do adresáře vpravo. -Custom -Vlastní - Configure your own synchronization rules. Nastavení vlastních pravidel synchronizace. +Error handling +Zpracování chyb + +Ignore +Přeskočit + +Hide all error and warning messages +Skrýt všechny chyby a varování + +Pop-up +Hlášení + +Show pop-up on errors or warnings +Zobrazit hlášení při chybě nebo varování + Deletion handling Nastavení mazání @@ -663,23 +816,32 @@ je stejný Naming convention: Pojmenování: -Item exists on left side only -Položky existující pouze vlevo +Batch job +Dávkový soubor + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Vytvoří dávkový souboru pro automatickou synchronizaci. Ke spuštění dávky jednoduše poklikejte na vytvořený soubor nebo jeho jméno zadejte jako parametr při spuštění FreeFileSync: FreeFileSync.exe . Stejně tak můžete ke spuštění využít plánovač úloh vašeho operačního systému. + +Exit +Konec + +Abort synchronization on first error +Ukončit synchronizaci při první chybě -Item exists on right side only -Položky existující pouze vpravo +Show progress dialog +Zobrazit průběh zpracování -Left side is newer -Vlevo je novější +Save log +Uložit žurnál -Right side is newer -Vpravo je novější +Select folder to save log files +Vyberte složku pro žurnály -Items have different content -Obsah položek je rozdílný +Limit +Omezení -Conflict/item cannot be categorized -Konflikty/položky které nelze zařadit +Limit maximum number of log files +Omezení maximálního počtu žurnálů Source code written in C++ using: Zdrojový kód byl napsán kompletně v C++ pomocí: @@ -699,9 +861,6 @@ je stejný Homepage Navštivte -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge - Email Napište @@ -716,7 +875,7 @@ je stejný Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Pouze soubory odpovídající nastavenému filtru budou vybrány pro synchronizaci. @@ -744,6 +903,9 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. &Clear &Smazat +Global settings +Nastavení programu + Fail-safe file copy Bezpečné kopírování souborů @@ -774,9 +936,6 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. &Default &Předdefinované -Start synchronization -Start synchronizace - Variant Varianta @@ -795,8 +954,20 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. &Find next &Najít další -Main bar -Hlavní lišta +Delete +Smazat + +Configure filter +Nastavení filtru + +Start synchronization +Start synchronizace + +Find +Najít + +Select time span +Časové rozmezí Folder pairs Adresářové páry @@ -807,6 +978,9 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Configuration Konfigurace +Main bar +Hlavní lišta + Filter files Filtr souborů @@ -864,11 +1038,8 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Exclude via filter: Vynechat pomocí filtru: - - - -Delete -Smazat +multiple selection +vícenásobný výběr Include all Zahrnout vše @@ -897,14 +1068,14 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Show "%x" Zobrazit "%x" - - +Last session +Poslední sezení Folder Comparison and Synchronization Porovnání a Synchronizace adresářů -Configuration saved! -Konfigurace uložena. +Configuration saved +Konfigurace uložena FreeFileSync batch FreeFileSync dávka @@ -913,14 +1084,11 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Uložit změny do %x? Do&n't save -Neukládat +&Neukládat Never save changes Nikdy neukládat změny -Configuration loaded! -Konfigurace načtena. - Show files that exist on left side only Zobrazit soubory existující pouze vlevo @@ -966,20 +1134,17 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Set as default Nastavit jako výchozí -Operation aborted! -Operace zrušena! +Operation aborted +Operace zrušena -All folders are in sync! -Všechny složky jsou synchronizovány! +All folders are in sync +Všechny složky jsou synchronizovány Comma separated list Text oddělený čárkami -Legend -Legenda - -File list exported! -Seznam souborů exportován! +File list exported +Seznam souborů exportován Searching for program updates... Hledání aktualizací programu ... @@ -990,6 +1155,9 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. &Ignore &Pokračovat +Fatal Error +Závažná chyba + Don't show this warning again Nezobrazovat již příště toto varování @@ -1011,6 +1179,9 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Comparing content... Porovnávání obsahu... +Info +Info + Paused Pauza @@ -1115,18 +1286,18 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Leave as unresolved conflict Ponechat jako nevyřešený konflikt -Time stamp -Časová značka - -Append a timestamp to each file name -Přidat časovou značku ke jménu souboru - Replace Nahradit Move files and replace if existing Přesunout a nahradit pokud soubory existují +Time stamp +Časová značka + +Append a timestamp to each file name +Přidat časovou značku ke jménu souboru + Folder Složka @@ -1169,9 +1340,6 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Cannot write modification time of %x. Nelze nastavit atribut času změny pro %x. -Cannot find system function %x. -Nelze najít systémovou funkci %x. - Cannot read security context of %x. Nelze číst přístupová práva pro %x. @@ -1187,8 +1355,11 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Cannot create directory %x. Nelze vytvořit adresář %x. -Cannot copy symbolic link %x to %y. -Nelze kopírovat zástupce %x do %y. +Cannot create symbolic link %x. +Nelze vytvořit zástupce %x. + +Cannot find system function %x. +Nelze najít systémovou funkci %x. Cannot copy file %x to %y. Nelze kopírovat soubor %x do %y. @@ -1196,15 +1367,15 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Type of item %x is not supported: Typ položky %x není podporován: +Cannot resolve symbolic link %x. +Nelze najít odkaz zástupce %x. + Cannot open directory %x. Nelze otevřít adresář %x. Cannot enumerate directory %x. Nelze procházet adresář %x. -Detected endless directory recursion. -Nalezena nekonečná adresářová smyčka. - %x TB %x TB @@ -1241,6 +1412,9 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. %x dnů +Failed to register to receive system messages. +Nepodařilo se zaregistrovat pro příjem systémových zpráv. + Cannot set privilege %x. Nelze nastavit práva pro %x. @@ -1250,210 +1424,12 @@ Poznámka: Filtr je aplikován relativně k základním adresářům. Cannot change process I/O priorities. Nelze nastavit priority procesu. -Unable to move %x to the Recycle Bin! -Není možné přesunout %x do Koše! - -Both sides have changed since last synchronization! -Došlo ke změně obou stran od poslední synchronizace! - -Cannot determine sync-direction: -Nelze určit směr synchronizace: - -No change since last synchronization! -Žádné změny od poslední synchronizace! - -The corresponding database entries are not in sync considering current settings. -Databázové položky nejsou podle aktuální konfigurace synchronní. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Nastaven výchozí způsob synchronizace: Staré soubory budou nahrazeny novými. - -Checking recycle bin availability for folder %x... -Kontrola Koše na složku %x ... - -Moving file %x to recycle bin -Přesouvání souboru %x do Koše - -Moving folder %x to recycle bin -Přesouvání adresáře %x do Koše - -Moving symbolic link %x to recycle bin -Přesouvání symbolického odkazu %x do Koše - -Deleting file %x -Mazání souboru %x - -Deleting folder %x -Mazání adresáře %x - -Deleting symbolic link %x -Mazání symbolického odkazu %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Nelze použít Koš pro následující umístění! Soubory budou odstraněny trvale: - -The corresponding folder will be considered as empty. -Odpovídající složku bude považován za prázdný. - -Cannot find the following folders: -Nelze najít následující složky: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Tuto chybu můžete přeskočit a považovat neexistující složku za prázdnou. Složka pak bude vytvořena při synchronizaci automaticky. - -Directories are dependent! Be careful when setting up synchronization rules: -Adresáře jsou závislé! Buďte opatrní s definicí synchronizačních pravidel: - -Start comparison -Spustit porovnání - -Calculating sync directions... -Příprava adresářů synchronizace... - -Conflict detected: -Zaznamenán konflikt: +Unable to move %x to the Recycle Bin. +Není možné přesunout %x do Koše. -File %x has an invalid date! -Soubor %x má chybné datum! +Cannot determine final path for %x. +Nelze určit výslednou cestu pro %x. -Files %x have the same date but a different size! -Soubory %x mají stejné datum a čas ale rozdílnou velikost! - -Items differ in attributes only -Položky se liší pouze ve vlastnostech - -Symbolic links %x have the same date but a different target. -Symbolický odkaz %x má stejné datum ale jiný cíl. - -Comparing content of files %x -Porovnávání obsahu souborů %x - -Comparing files by content failed. -Porovnání obsahu souborů se nezdařilo. - -Generating file list... -Vytváření seznamu souborů... - -Both sides are equal -Obě strany jsou shodné - -Copy new item to left -Kopírovat novou položku doleva - -Copy new item to right -Kopírovat novou položku doprava - -Delete left item -Smazat položku zleva - -Delete right item -Smazat položku zprava - -Move file on left -Přesunout soubor nalevo - -Move file on right -Přesunout soubor napravo - -Overwrite left item -Přepsat levou položku tou zprava - -Overwrite right item -Přepsat pravou položku tou zleva - -Do nothing -Nic nedělat - -Update attributes on left -Nastavit vlastnosti vlevo - -Update attributes on right -Nastavit vlastnosti vpravo - -Multiple... -Různé... - -Moving file %x to %y -Přesouvání souboru %x do %y - -Moving folder %x to %y -Přesouvání adresáře %x do %y - -Moving symbolic link %x to %y -Přesouvání symbolického odkazu %x do %y - -Removing old versions... -Odstraňování starých verzí... - -Creating symbolic link %x -Vytváření symbolického odkazu %x - -Creating folder %x -Vytváření adresáře %x - -Overwriting file %x -Přepisování souboru %x - -Overwriting symbolic link %x -Přepisování symbolického odkazu %x - -Verifying file %x -Kontrola souboru %x - -Updating attributes of %x -Aktualizace atributů souboru %x - -Cannot find %x. -Nelze najít %x. - -Target folder %x already existing. -Cílová složka %x již existuje. - -Target folder input field must not be empty. -Cílová složka nesmí být prázdná. - -Folder input field for versioning must not be empty. -Složka pro verzování souborů nesmí být prázdná. - -Source folder %x not found. -Zdrojovou složku %x nelze najít. - -The following items have unresolved conflicts and will not be synchronized: -Následující položky jsou nevyřešené konflikty a nebudou synchronizovány: - -Significant difference detected: -Nalezeny významné změny: - -More than 50% of the total number of files will be copied or deleted! -Více než polovina souborů má být zkopírována nebo smazána! - -Not enough free disk space available in: -Nedostatek místa na disku: - -Required: -Požadováno - -Available: -K dispozici - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Bude změněna složka, která je součástí adresářového páru vícenásobného porovnání. Prosím zkontrolujte si nastavení synchronizace. - -Left -Levý - -Right -Pravý - -Synchronizing folder pair: -Zpracovávání páru složek: - -Generating database... -Vytváření databáze... - -Creating Volume Shadow Copy for %x... -Vytváření Stínové kopie pro %x... - -Data verification error: Source and target file have different content! -Nezdařila se verifikace dat: Zdrojový a cílový soubor mají rozdílný obsah! +Error Code %x: +Chybový kód %x diff --git a/BUILD/Languages/danish.lng b/BUILD/Languages/danish.lng index aa57a5c9..bc01b271 100644 --- a/BUILD/Languages/danish.lng +++ b/BUILD/Languages/danish.lng @@ -1,137 +1,164 @@
- Dansk + Dansk Regmos da_DK - denmark.png - 2 - n == 1 ? 0 : 1 + flag_denmark.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Søger efter mappen %x... +Both sides have changed since last synchronization. +Begge sider ændret siden sidste synkronisering. -Items processed: -Emner behandlet: +Cannot determine sync-direction: +Kan ikke bestemme retning: -Items remaining: -Emner tilbage: +No change since last synchronization. +Ingen ændringer siden sidste synkronisering. -Total time: -Samlet tid: +The database entry is not in sync considering current settings. +Databaseemnet er ikke i synk med de aktuelle indstillinger. -Cannot set directory lock for %x. -Kan ikke låse mappen %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +Sætter standardretning: Gamle filer overskrives med nyere. -Show in Explorer -Åben filplacering +Checking recycle bin availability for folder %x... +Tjekker papirkurvs tilgængelighed for mappen %x... -Open with default application -Åben med standardprogram +Moving file %x to recycle bin +Flytter filen %x til papirkurv -Browse directory -Gennemse mappe +Moving folder %x to recycle bin +Flytter mappen %x til papirkurv -Abort requested: Waiting for current operation to finish... -Afbrydelse: Venter på aktuel opgave afsluttes... +Moving symbolic link %x to recycle bin +Flytter symlink %x til papirkurv -Failure to create timestamp for versioning: -Kunne ikke oprette versioneringstid: +Deleting file %x +Sletter filen %x -RealtimeSync - Automated Synchronization -Realtids synk - automatisk synkronisering +Deleting folder %x +Sletter mappen %x + +Deleting symbolic link %x +Sletter symlink %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Papirkurven kan ikke bruges til følgende mapper. Filerne slettes permanent: + +An exception occurred +Undtagelse opstod + +Cannot find file %x. +Kan ikke finde filen %x. Error Fejl -Selected variant: -Valgt variant: +File %x does not contain a valid configuration. +%x indeholder ikke gyldige indstillinger. -Select alternate comparison settings -Tilpas analyse +A folder input field is empty. +Der er ikke valgt nogen mapper. -Select alternate synchronization settings -Tilpas synkronisering +The corresponding folder will be considered as empty. +Den tilsvarende mappe betragtes som tom. -Filter is active -Aktivt filter +Cannot find the following folders: +Kan ikke finde følgende mapper: -No filter selected -Intet filter valgt +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Ignorer denne fejl for at betragte hver mappe som tom. Mapperne bliver så automatisk oprettet ved synkronisering. -Remove alternate settings -Fjern tilpassede indstillinger +The following folders have dependent paths. Be careful when setting up synchronization rules: +Følgende mapper har afhængige stier. Opsæt synkroniseringsreglerne med omhu: -Clear filter settings -Nulstil filter +File %x has an invalid date. +Filen %x har en ugyldig dato. -Copy -Kopiér +Date: +Dato: -Paste -Indsæt +Files %x have the same date but a different size. +Filerne %x har den samme dato men forskellig størrelse. -Save as batch job -Gem som batchfil +Size: +Størrelse: -Comparison settings -Analyseindstillinger +Items differ in attributes only +Enhederne har kun attributter til forskel -Synchronization settings -Synkroniseringsindstillinger +Resolving symbolic link %x +Løser symbolsk link %x -About -Om +Comparing content of files %x +Sammenligner indhold af filer %x -Confirm -Bekræft +Generating file list... +Opretter filliste... -Configure filter -Indstil filter +Starting comparison +Starter analyse -Global settings -Programindstillinger +Calculating sync directions... +Forbereder synkronisering... -Find -Søg +Out of memory. +Ikke nok hukommelse. -Select time span -Vælg tidsinterval +Item exists on left side only +Emnet findes kun på venstre side -Invalid command line: -Ugyldig kommando: +Item exists on right side only +Emnet findes kun på højre side -Info -Info +Left side is newer +Venstre er nyest -Warning -Advarsel +Right side is newer +Højre er nyest -Fatal Error -Fatal fejl +Items have different content +Emnerne har forskelligt indhold -Error Code %x: -Fejlkode %x: +Both sides are equal +Begge sider er ens -Cannot resolve symbolic link %x. -Kan ikke følge symlinket %x. +Conflict/item cannot be categorized +Konflikt/ukendt emne - -1 Byte -%x Bytes - - -1 byte -%x byte - +Copy new item to left +Kopier nyt emne mod venstre -%x MB -%x MB +Copy new item to right +Kopier nyt emne mod højre -%x KB -%x KB +Delete left item +Slet emne til venstre -%x GB -%x GB +Delete right item +Slet emne til højre + +Move file on left +Flyt filen til venstre + +Move file on right +flyt filen til højre + +Overwrite left item +Overskriv venstre emne + +Overwrite right item +Overskriv højre emne + +Do nothing +Gør intet + +Update attributes on left +Opdater attributter mod venstre + +Update attributes on right +Opdater attributter mod højre Database file %x is incompatible. Databasefilen %x er inkompatibel. @@ -145,9 +172,6 @@ Database file is corrupt: Databasefilen er ødelagt: -Out of memory! -Ikke nok hukommelse! - Cannot write file %x. Kan ikke oprette filen %x. @@ -157,8 +181,8 @@ Database files do not share a common session. Databasefiler kan ikke dele handling. -An exception occurred! -Undtagelse opstod! +Searching for folder %x... +Søger efter mappen %x... Cannot read file attributes of %x. Kan ikke læse filattributterne på %x. @@ -181,9 +205,39 @@ Creating file %x Opretter filen %x +Items processed: +Emner behandlet: + +Items remaining: +Emner tilbage: + +Total time: +Samlet tid: + + +1 Byte +%x Bytes + + +1 byte +%x byte + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Behandlingsfejl i filen %x, række %y, kolonne %z. +Cannot set directory lock for %x. +Kan ikke låse mappen %x. + Scanning: Skanner: @@ -202,12 +256,18 @@ /sec /sek -File %x does not contain a valid configuration. -%x indeholder ikke gyldige indstillinger. - Configuration file %x loaded partially only. Indstillingsfilen %x er kun delvist indlæst. +Show in Explorer +Åben filplacering + +Open with default application +Åben med standardprogram + +Browse directory +Gennemse mappe + Cannot access Volume Shadow Copy Service. Kan ikke opnå adgang til VSS. @@ -217,38 +277,41 @@ Cannot load file %x. Kan ikke indlæse filen %x. -Path %x does not contain a volume name. -Stien %x indeholder ikke et drevnavn. +Cannot determine volume name for %x. +Kan ikke bestemme volumennavn for %x. -Volume name %x not part of file name %y! -Drevnavn %x findes ikke i filnavnet %y! +Volume name %x not part of file name %y. +Drevnavn %x findes ikke i filnavnet %y. + +Abort requested: Waiting for current operation to finish... +Afbrydelse: Venter på aktuel opgave afsluttes... + +Failure to create timestamp for versioning: +Kunne ikke oprette versioneringstid: Cannot read the following XML elements: Kan ikke læse følgende XML emner: -Cannot find file %x. -Kan ikke finde filen %x. - &Open... -Åben... +&Åben... Save &as... -Gem som... +Gem &som... &Quit -Afslut +&Afslut &Program -Filer +&Filer &Content -Åben hjælp +&Åben hjælp &About -Om +&Om &Help -Hjælp +&Hjælp Usage: Gør sådan: @@ -304,45 +367,150 @@ Kommandoen udføres hvis: Start &Retry -Prøv igen +&Prøv igen Cancel Annuller +RealtimeSync - Automated Synchronization +Realtids synk - automatisk synkronisering + +Warning +Advarsel + Build: %x Udgivet: %x +About +Om + All files Alle filer &Restore -Vis vindue +&Vis vindue &Exit -Luk - -Monitoring active... -Overvågning kører... +&Luk Waiting for missing directories... Venter på manglende mapper... -A folder input field is empty. -Der er ikke valgt nogen mapper. +Invalid command line: +Ugyldig kommando: + +File content +Indhold + +File time and size +Størrelse og tid + + Two way + Tovejs + +Mirror +Spejling + +Update +Opdater + +Custom +Tilpasset + +Multiple... +Flere... + +Moving file %x to %y +Flytter filen %x til %y + +Moving folder %x to %y +Flytter mappen %x til %y + +Moving symbolic link %x to %y +Flytter symlinket %x til %y + +Removing old versions... +Fjerner gamle udgaver... + +Creating symbolic link %x +Opretter symlinket %x + +Creating folder %x +Opretter mappen %x + +Overwriting file %x +Overskriver filen %x + +Overwriting symbolic link %x +Overskriver symlinket %x + +Verifying file %x +Verificerer filen %x + +Updating attributes of %x +Opdaterer attributter for %x + +Cannot find %x. +Kan ikke finde %x. + +Target folder %x already existing. +Destinationsmappen %x findes allerede. + +Target folder input field must not be empty. +Destinationsmappen skal angives. + +Folder input field for versioning must not be empty. +Mappe til versionering skal angives. + +Source folder %x not found. +Kildemappen %x blev ikke fundet. + +The following items have unresolved conflicts and will not be synchronized: +Følgende emner har uløste konflikter og synkroniseres ikke: + +Significant difference detected: +Markant forskel: + +More than 50% of the total number of files will be copied or deleted. +Mere end 50% af af filerne kopieres eller slettes. + +Not enough free disk space available in: +Ikke nok ledig diskplads på: + +Required: +Krævet: + +Available: +Tilgængeligt: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Der ændres en mappe der tilhører flere mappepar. Kontroller dine synkroniseringsindstillinger. + +Synchronizing folder pair: +Synkroniserer mappepar: + +Generating database... +Opretter database... + +Creating Volume Shadow Copy for %x... +Opretter VVS kopi for %x... -Synchronization aborted! -Synkronisering afbrudt! +Data verification error: %x and %y have different content. +Godkendelsesfejl: %x og %y har forskelligt indhold -Synchronization completed with errors! -Synkronisering gennemført med fejl! +Synchronization aborted +Synkronisering afbrudt -Synchronization completed with warnings. +Synchronization completed with errors +Synkronisering gennemført med fejl + +Synchronization completed with warnings Synkronisering gennemført med advarsel -Nothing to synchronize! -Alt er synkroniseret! +Nothing to synchronize +Alt er synkroniseret -Synchronization completed successfully. +Synchronization completed successfully Synkronisering gennemført Saving log file %x... @@ -351,8 +519,8 @@ Kommandoen udføres hvis: Press "Switch" to resolve issues in FreeFileSync main dialog. Klik "Skift" for at løse problemerne fra hovedvinduet. -Switching to FreeFileSync main dialog... -Skifter til hovedvindue... +Switching to FreeFileSync main dialog +Skifter til hovedvinduet A new version of FreeFileSync is available: Opdatering tilgængelig: @@ -360,29 +528,29 @@ Kommandoen udføres hvis: Download now? Download nu? -FreeFileSync is up to date! -FreeFileSync er opdateret! +New version found +Opdatering fundet -Information -Information +&Download +&Download -Unable to connect to sourceforge.net! -Kan ikke kontakte sourceforge.net! +FreeFileSync is up to date. +FreeFileSync er opdateret. -Current FreeFileSync version number was not found online! Do you want to check manually? -Den aktuelle version blev ikke fundet! Vil du kontrollere manuelt +Information +Information -Do you want FreeFileSync to automatically check for updates every week? -Skal FreeFileSync søge efter opdateringer en gang om ugen? +Unable to connect to sourceforge.net. +Kan ikke kontakte sourceforge.net. -(Requires an Internet connection!) -(kræver internetforbindelse!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Kunne ikke finde FreeFileSync's versionsnummer online. Vil du kontrollere manuelt? - - +Symlink +Symlink - - +Folder +Mappe Full path Fuld sti @@ -405,18 +573,12 @@ Kommandoen udføres hvis: Extension Filtype -Size: -Størrelse: - -Date: -Dato: +Category +Status Action Handling -Category -Status - Drag && drop Træk emner hertil @@ -435,45 +597,78 @@ Kommandoen udføres hvis: Hibernate Dvale +Selected variant: +Valgt variant: + +Select alternate comparison settings +Tilpas analyse + +Select alternate synchronization settings +Tilpas synkronisering + +Filter is active +Aktivt filter + +No filter selected +Intet filter valgt + +Remove alternate settings +Fjern tilpassede indstillinger + +Clear filter settings +Nulstil filter + +Copy +Kopiér + +Paste +Indsæt + &New -Ny +&Ny &Save -Gem +&Gem Save as &batch job... -Gem som batchfil +Gem som &batchfil 1. &Compare -1. Analyser +1. &Analyser 2. &Synchronize -2. Synkroniser +2. &Synkroniser &Language -Sprog - -&Global settings... -Programindstillinger... +&Sprog &Export file list... -Eksporter filliste... +&Eksporter filliste... + +&Global settings... +&Programindstillinger... -&Advanced -Indstillinger +&Tools +&Værktøj &Check now -Søg nu +Søg &nu Check &automatically once a week -Søg automatisk en gang om ugen +Søg &automatisk en gang om ugen -Check for new version -Søg efter opdatering +Check for new &version +&Søg efter opdatering Compare Analyser +Comparison settings +Analyseindstillinger + +Synchronization settings +Synkroniseringsindstillinger + Synchronize Synkroniser @@ -486,6 +681,9 @@ Kommandoen udføres hvis: Swap sides Byt side +Save as batch job +Gem som batchfil + Hide excluded items Skjul ekskluderede emner @@ -526,55 +724,10 @@ Kommandoen udføres hvis: Luk &Pause -Pause - -Batch job -Batchfil - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Opret en batchfil til automatisk synkronisering. Dobbeltklik på filen eller brug systemets opgavestyring: FreeFileSync.exe .ffs_batch - -Help -Hjælp - -Error handling -Fejlhåndtering - -Ignore -Ignorer - -Hide all error and warning messages -Skjul fejlbeskeder og advarsler +&Pause -Pop-up -Besked - -Show pop-up on errors or warnings -Vis fejlbeskeder og advarsler - -Exit -Luk - -Abort synchronization on first error -Stop synkronisering ved første fejl - -Show progress dialog -Vis fremskridt - -Save log -Gem rapport - -Select folder to save log files -Vælg mappe til rapporter - -Limit -Antal - -Limit maximum number of log files -Begræns antal rapporter - -Select variant -Vælg type +Select a variant +Vælg metode Files are found equal if @@ -589,9 +742,6 @@ Filer betragtes som ens hvis er identisk -File time and size -Størrelse og tid - Files are found equal if - file content @@ -603,39 +753,42 @@ Filer betragtes som ens hvis er identisk -File content -Indhold - Symbolic Link handling Symlink håndtering +Help +Hjælp + OK OK -<- Two way -> -< Tovejs > - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Find og udbred ændringer på begge sider. Sletninger, omdøbninger og konflikter findes automatisk i en database. -Mirror ->> -Spejling >> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Spejl venstre mappe. Efter synkronisering er højre mappe en kopi af venstre. -Update -> -Opdater > - Copy new or updated files to right folder. Kopier nye og opdaterede filer til højre mappe. -Custom -Tilpasset - Configure your own synchronization rules. Opret dine egne synkroniseringsregler. +Error handling +Fejlhåndtering + +Ignore +Ignorer + +Hide all error and warning messages +Skjul fejlbeskeder og advarsler + +Pop-up +Besked + +Show pop-up on errors or warnings +Vis fejlbeskeder og advarsler + Deletion handling Sletning @@ -660,23 +813,32 @@ er identisk Naming convention: Navneregler: -Item exists on left side only -Emnet findes kun på venstre side +Batch job +Batchfil + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Opret en batchfil til automatisk synkronisering. Dobbeltklik på filen eller brug systemets opgavestyring: FreeFileSync.exe .ffs_batch + +Exit +Luk + +Abort synchronization on first error +Stop synkronisering ved første fejl -Item exists on right side only -Emnet findes kun på højre side +Show progress dialog +Vis fremskridt -Left side is newer -Venstre er nyest +Save log +Gem rapport -Right side is newer -Højre er nyest +Select folder to save log files +Vælg mappe til rapporter -Items have different content -Emnerne har forskelligt indhold +Limit +Antal -Conflict/item cannot be categorized -Konflikt/ukendt emne +Limit maximum number of log files +Begræns antal rapporter Source code written in C++ using: Kildekoden er skrevet i C++ med hjælp fra: @@ -696,9 +858,6 @@ er identisk Homepage Hjemmeside -FreeFileSync at Sourceforge -FreeFileSync på Sourceforge - Email Email @@ -713,11 +872,11 @@ er identisk Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Synkroniserer kun filer der opfylder alle betingelser. -Bemærk: Filnavne skal relatere til grundmapperne! +Bemærk: Filnavne skal relatere til grundmapperne. Include @@ -739,7 +898,10 @@ Bemærk: Filnavne skal relatere til grundmapperne! Maksimum &Clear -Ryd +&Ryd + +Global settings +Programindstillinger Fail-safe file copy Sikker filkopiering @@ -769,10 +931,7 @@ Bemærk: Filnavne skal relatere til grundmapperne! Beskrivelse &Default -Standard - -Start synchronization -Start synkronisering +S&tandard Variant Jobtype @@ -790,10 +949,22 @@ Bemærk: Filnavne skal relatere til grundmapperne! Versalfølsom (a/A) &Find next -Find næste +&Find næste -Main bar -Hovedlinie +Delete +Slet + +Configure filter +Indstil filter + +Start synchronization +Start synkronisering + +Find +Søg + +Select time span +Vælg tidsinterval Folder pairs Mappepar @@ -804,6 +975,9 @@ Bemærk: Filnavne skal relatere til grundmapperne! Configuration Indstilling +Main bar +Hovedlinie + Filter files Filtrer filer @@ -858,11 +1032,8 @@ Bemærk: Filnavne skal relatere til grundmapperne! Exclude via filter: Ekskluder m. filter: - - - -Delete -Slet +multiple selection +vælg flere Include all Vælg alle @@ -891,14 +1062,14 @@ Bemærk: Filnavne skal relatere til grundmapperne! Show "%x" Vis "%x" - - +Last session +Sidste opgave Folder Comparison and Synchronization Mappeanalyse og synkronisering -Configuration saved! -Indstillinger gemt! +Configuration saved +Indstillinger gemt FreeFileSync batch FreeFileSync batchfil @@ -907,14 +1078,11 @@ Bemærk: Filnavne skal relatere til grundmapperne! Vil du gemme ændringer i %x? Do&n't save -Gem ikke +&Gem ikke Never save changes Gem aldrig -Configuration loaded! -Indstillinger indlæst! - Show files that exist on left side only Vis filer der kun findes på venstre side @@ -960,20 +1128,17 @@ Bemærk: Filnavne skal relatere til grundmapperne! Set as default Sæt som standard -Operation aborted! -Handling afbrudt! +Operation aborted +Handling afbrudt -All folders are in sync! +All folders are in sync Alle mapper er synkrone Comma separated list Kommaopdelt liste -Legend -Definitioner - -File list exported! -Fillisten blev eksporteret! +File list exported +Fillisten blev eksporteret Searching for program updates... Søger efter opdatering... @@ -982,22 +1147,25 @@ Bemærk: Filnavne skal relatere til grundmapperne! Ignorer fremtidige fejl &Ignore -Ignorer +&Ignorer + +Fatal Error +Fatal fejl Don't show this warning again Vis ikke igen &Switch -Skift +&Skift Question Spørgsmål &Yes -Ja +&Ja &No -Nej +&Nej Scanning... Skanner... @@ -1005,6 +1173,9 @@ Bemærk: Filnavne skal relatere til grundmapperne! Comparing content... Analyserer indhold... +Info +Info + Paused Pauset @@ -1107,18 +1278,18 @@ Bemærk: Filnavne skal relatere til grundmapperne! Leave as unresolved conflict Efterlad som uløst konflikt -Time stamp -Tidsstempel - -Append a timestamp to each file name -Føj tidsstempel til hvert filnavn - Replace Erstat Move files and replace if existing Flyt fil og erstat eventuelt eksisterende +Time stamp +Tidsstempel + +Append a timestamp to each file name +Føj tidsstempel til hvert filnavn + Folder Mappe @@ -1161,9 +1332,6 @@ Bemærk: Filnavne skal relatere til grundmapperne! Cannot write modification time of %x. Kan ikke opdatere tidsændring på %x. -Cannot find system function %x. -Kan ikke finde systemfunktionen %x. - Cannot read security context of %x. Kan ikke læse sikkerhedsindstillinger på %x. @@ -1179,8 +1347,11 @@ Bemærk: Filnavne skal relatere til grundmapperne! Cannot create directory %x. Kan ikke oprette mappen %x. -Cannot copy symbolic link %x to %y. -Kan ikke kopiere symlinket %x til %y. +Cannot create symbolic link %x. +Kan ikke oprette symbolsk link %x. + +Cannot find system function %x. +Kan ikke finde systemfunktionen %x. Cannot copy file %x to %y. Kan ikke kopiere filen %x til %y. @@ -1188,15 +1359,15 @@ Bemærk: Filnavne skal relatere til grundmapperne! Type of item %x is not supported: Filtypen %x understøttes ikke: +Cannot resolve symbolic link %x. +Kan ikke følge symlinket %x. + Cannot open directory %x. Kan ikke åbne mappen %x. Cannot enumerate directory %x. Kan ikke optælle mappen %x. -Detected endless directory recursion. -Uendelig mappegentagelse fundet. - %x TB %x TB @@ -1230,6 +1401,9 @@ Bemærk: Filnavne skal relatere til grundmapperne! %x dage +Failed to register to receive system messages. +Kunne ikke registrere modtagelse af systembeskeder + Cannot set privilege %x. Kan ikke sætte %x privilegier. @@ -1239,210 +1413,12 @@ Bemærk: Filnavne skal relatere til grundmapperne! Cannot change process I/O priorities. Kan ikke ændre I/O prioriteter. -Unable to move %x to the Recycle Bin! -Kan ikke flytte %x til papirkurv! - -Both sides have changed since last synchronization! -Begge sider ændret siden sidste synkronisering! - -Cannot determine sync-direction: -Kan ikke bestemme retning: - -No change since last synchronization! -Ingen ændringer siden sidste synkronisering! - -The corresponding database entries are not in sync considering current settings. -Databasen er ikke synkroniseret i forhold til aktuelle indstillinger. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Sætter standardretning: Gamle filer overskrives med nyere. - -Checking recycle bin availability for folder %x... -Tjekker papirkurvs tilgængelighed for mappen %x... - -Moving file %x to recycle bin -Flytter filen %x til papirkurv - -Moving folder %x to recycle bin -Flytter mappen %x til papirkurv - -Moving symbolic link %x to recycle bin -Flytter symlink %x til papirkurv - -Deleting file %x -Sletter filen %x - -Deleting folder %x -Sletter mappen %x - -Deleting symbolic link %x -Sletter symlink %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Papirkurven kan ikke bruges på følgende stier! Filer slettes permanent: - -The corresponding folder will be considered as empty. -Den tilsvarende mappe betragtes som tom. - -Cannot find the following folders: -Kan ikke finde følgende mapper: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Ignorer denne fejl for at betragte hver mappe som tom. Mapperne bliver så automatisk oprettet ved synkronisering. - -Directories are dependent! Be careful when setting up synchronization rules: -Afhængige mapper! Vær forsigtig når du laver synkroniseringsregler: - -Start comparison -Start analyse - -Calculating sync directions... -Forbereder synkronisering... - -Conflict detected: -Konflikt fundet: +Unable to move %x to the Recycle Bin. +Kan ikke flytte %x til papirkurv. -File %x has an invalid date! -Filen %x har en ugyldig dato! +Cannot determine final path for %x. +Kan ikke bestemme endelig sti for %x -Files %x have the same date but a different size! -Filerne %x har den samme dato men forskellig størrelse! - -Items differ in attributes only -Enhederne har kun attributter til forskel - -Symbolic links %x have the same date but a different target. -Symlinkene %x har samme dato men forskellige mål. - -Comparing content of files %x -Sammenligner indhold af filer %x - -Comparing files by content failed. -Fejl ved analyse af filindhold. - -Generating file list... -Opretter filliste... - -Both sides are equal -Begge sider er ens - -Copy new item to left -Kopier nyt emne mod venstre - -Copy new item to right -Kopier nyt emne mod højre - -Delete left item -Slet emne til venstre - -Delete right item -Slet emne til højre - -Move file on left -Flyt filen til venstre - -Move file on right -flyt filen til højre - -Overwrite left item -Overskriv venstre emne - -Overwrite right item -Overskriv højre emne - -Do nothing -Gør intet - -Update attributes on left -Opdater attributter mod venstre - -Update attributes on right -Opdater attributter mod højre - -Multiple... -Flere... - -Moving file %x to %y -Flytter filen %x til %y - -Moving folder %x to %y -Flytter mappen %x til %y - -Moving symbolic link %x to %y -Flytter symlinket %x til %y - -Removing old versions... -Fjerner gamle udgaver... - -Creating symbolic link %x -Opretter symlinket %x - -Creating folder %x -Opretter mappen %x - -Overwriting file %x -Overskriver filen %x - -Overwriting symbolic link %x -Overskriver symlinket %x - -Verifying file %x -Verificerer filen %x - -Updating attributes of %x -Opdaterer attributter for %x - -Cannot find %x. -Kan ikke finde %x. - -Target folder %x already existing. -Destinationsmappen %x findes allerede. - -Target folder input field must not be empty. -Destinationsmappen skal angives. - -Folder input field for versioning must not be empty. -Mappe til versionering skal angives. - -Source folder %x not found. -Kildemappen %x blev ikke fundet. - -The following items have unresolved conflicts and will not be synchronized: -Følgende emner har uløste konflikter og synkroniseres ikke: - -Significant difference detected: -Markant forskel: - -More than 50% of the total number of files will be copied or deleted! -Mere end 50% af af filerne kopieres eller slettes! - -Not enough free disk space available in: -Ikke nok ledig diskplads på: - -Required: -Krævet: - -Available: -Tilgængeligt: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Der ændres en mappe der tilhører flere mappepar. Kontroller dine synkroniseringsindstillinger. - -Left -Venstre - -Right -Højre - -Synchronizing folder pair: -Synkroniserer mappepar: - -Generating database... -Opretter database... - -Creating Volume Shadow Copy for %x... -Opretter VVS kopi for %x... - -Data verification error: Source and target file have different content! -Godkendelsesfejl: Kilde og destinationsfil har forskelligt indhold! +Error Code %x: +Fejlkode %x: diff --git a/BUILD/Languages/dutch.lng b/BUILD/Languages/dutch.lng index cec09b84..eee7d1fb 100644 --- a/BUILD/Languages/dutch.lng +++ b/BUILD/Languages/dutch.lng @@ -1,137 +1,200 @@
- Nederlands + Nederlands Edwin Dierssen && Jochem Sparla nl_NL - holland.png - 2 - n == 1 ? 0 : 1 + flag_holland.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Bezig met zoeken naar map %x... +Cannot determine final path for %x. + -Items processed: -Onderdelen verwerkt: +Failed to register to receive system messages. + -Items remaining: -Onderdelen te gaan: +Cannot create symbolic link %x. + -Total time: -Totale tijd: +Select a variant + -Cannot set directory lock for %x. -Kan locatie %x niet op slot zetten. +Check for new &version + -Show in Explorer -Toon in Verkenner +&Tools + -Open with default application -Open met standaardapplicatie +Cannot find current FreeFileSync version number online. Do you want to check manually? + -Browse directory -Verken map +&Download + -Abort requested: Waiting for current operation to finish... -Bezig met afbreken: Wacht op beëindiging huidige bewerking... +New version found + -Failure to create timestamp for versioning: -Het creëren van een tijdsstempen voor versiebeheer is mislukt: +Switching to FreeFileSync main dialog + -RealtimeSync - Automated Synchronization -RealtimeSync - Geautomatiseerde Synchronisatie +Data verification error: %x and %y have different content. + + +Cannot determine volume name for %x. + + +Starting comparison + + +Resolving symbolic link %x + + +The following folders have dependent paths. Be careful when setting up synchronization rules: + + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: + + +The database entry is not in sync considering current settings. + + +Both sides have changed since last synchronization. +Beide zijdes zijn veranderd sinds de laatste synchronisatie. + +Cannot determine sync-direction: +Kan de synchronisatie-richting niet bepalen: + +No change since last synchronization. +Geen veranderingen sinds de laatste synchronisatie. + +Setting default synchronization directions: Old files will be overwritten with newer files. +Stel standaard synchronisatie richtingen in: Oude bestanden worden door nieuwere bestanden overschreven. + +Checking recycle bin availability for folder %x... +Prullebak beschikbaarheid voor map %x te controleren... + +Moving file %x to recycle bin +Bezig met verplaatsen van bestand %x naar de prullenbak + +Moving folder %x to recycle bin +Bezig met verplaatsen van map %x naar de prullenbak + +Moving symbolic link %x to recycle bin +Bezig met verplaatsen van snelkoppeling %x naar de prullenbak + +Deleting file %x +Verwijderen van bestand %x + +Deleting folder %x +Verwijderen van map %x + +Deleting symbolic link %x +Verwijderen van snelkoppeling %x + +An exception occurred +Er heeft een uitzondering plaatsgevonden + +Cannot find file %x. +Kan bestand %x niet vinden. Error Fout -Selected variant: -Selecter variant: +File %x does not contain a valid configuration. +Bestand %x bevat geen valide configuratie. -Select alternate comparison settings -Selecteer alternatieve vergelijkingsinstellingen +A folder input field is empty. +Een map invoerveld is leeg. -Select alternate synchronization settings -Selecteer alternatieve synchronisatieinstellingen +The corresponding folder will be considered as empty. +De overeenkomstige map zal als leeg worden beschouwd. -Filter is active -Filter is actief +Cannot find the following folders: +Kan de volgende mappen niet vinden: -No filter selected -Geen filter geselecteerd +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +U kunt deze foutmelding negeren om elke map als leeg te markeren. De mappen worden dan automatisch aangemaakt tijdens de synchronisatie. -Remove alternate settings -Verwijder alternatieve instellingen +File %x has an invalid date. +Bestand %x heeft een ongeldige datum. -Clear filter settings -Verwijder filterinstellingen +Date: +Datum: -Copy -Kopiëren +Files %x have the same date but a different size. +Bestanden %x hebben dezelfde datums maar een afwijkende grootte. -Paste -Plakken +Size: +Grootte: -Save as batch job -Opslaan als batch opdracht +Items differ in attributes only +Items verschillen alleen in attributen -Comparison settings -Vergelijksinstellingen +Comparing content of files %x +De inhoud van %x bestanden wordt vergeleken -Synchronization settings -Synchronisatieinstellingen +Generating file list... +Genereren van bestandslijst... -About -Informatie +Calculating sync directions... +Synchronisatie richtingen calculeren... -Confirm -Bevestig +Out of memory. +Onvoldoende geheugen. -Configure filter -Filterconfiguratie +Item exists on left side only +Item bestaat alleen aan de linkerkant -Global settings -Algemene instellingen +Item exists on right side only +Item bestaat alleen aan de rechterkant -Find -Vind +Left side is newer +De linkerkant is nieuwer -Select time span -Selecteer tijdsspanne +Right side is newer +De rechterkant is nieuwer -Invalid command line: -Ongeldige opdrachtregel: +Items have different content +De items hebben een andere inhoud -Info -Info +Both sides are equal +Beide kanten zijn gelijk -Warning -Waarschuwing +Conflict/item cannot be categorized +Conflict/item kan niet worden gecategoriseerd -Fatal Error -Kritieke fout +Copy new item to left +Kopieër nieuw item naar de linkerkant -Error Code %x: -Foutcode %x: +Copy new item to right +Kopieër nieuw item naar de rechterkant -Cannot resolve symbolic link %x. -Kan snelkoppeling %x niet vinden. +Delete left item +Verwijder linker item - -1 Byte -%x Bytes - - -1 Byte -%x Bytes - +Delete right item +Verwijder rechter item -%x MB -%x MB +Move file on left +Verplaats bestand aan de linkerkant -%x KB -%x KB +Move file on right +Verplaats bestand aan de rechterkant -%x GB -%x GB +Overwrite left item +Overschrijf linker item + +Overwrite right item +Overschrijf rechter item + +Do nothing +Geen actie ondernemen + +Update attributes on left +Update attributen aan de linkerkant + +Update attributes on right +Update attributen aan de rechterkant Database file %x is incompatible. Databasebestand %x is niet compatibel. @@ -145,9 +208,6 @@ Database file is corrupt: Databasebestand is corrupt: -Out of memory! -Onvoldoende geheugen! - Cannot write file %x. Kan bestand %x niet schrijven. @@ -157,8 +217,8 @@ Database files do not share a common session. Databasebestanden delen geen gezamelijke sessie. -An exception occurred! -Er heeft een uitzondering plaatsgevonden! +Searching for folder %x... +Bezig met zoeken naar map %x... Cannot read file attributes of %x. Kan bestandskenmerken van %x niet uitlezen. @@ -181,9 +241,39 @@ Creating file %x Bestand %x wordt aangemaakt +Items processed: +Onderdelen verwerkt: + +Items remaining: +Onderdelen te gaan: + +Total time: +Totale tijd: + + +1 Byte +%x Bytes + + +1 Byte +%x Bytes + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Fout bij het parsen van bestand %x, rij %y, kolom %z. +Cannot set directory lock for %x. +Kan locatie %x niet op slot zetten. + Scanning: Doorzoekt: @@ -202,12 +292,18 @@ /sec /sec -File %x does not contain a valid configuration. -Bestand %x bevat geen valide configuratie. - Configuration file %x loaded partially only. Configuratiebestand %x alleen deels geladen. +Show in Explorer +Toon in Verkenner + +Open with default application +Open met standaardapplicatie + +Browse directory +Verken map + Cannot access Volume Shadow Copy Service. Kan de Volume Schaduwkopie Service niet benaderen. @@ -217,18 +313,18 @@ Cannot load file %x. Kan bestand %x niet laden. -Path %x does not contain a volume name. -Het pad %x bevat geen schijfnaam. +Volume name %x not part of file name %y. +Schijfnaam %x maakt geen deel uit van bestandsnaam %y. + +Abort requested: Waiting for current operation to finish... +Bezig met afbreken: Wacht op beëindiging huidige bewerking... -Volume name %x not part of file name %y! -Schijfnaam %x maakt geen deel uit van bestandsnaam %y! +Failure to create timestamp for versioning: +Het creëren van een tijdsstempen voor versiebeheer is mislukt: Cannot read the following XML elements: Kan de volgende XML elementen niet lezen: -Cannot find file %x. -Kan bestand %x niet vinden. - &Open... &Open... @@ -309,9 +405,18 @@ De opdracht word geactiveerd als: Cancel Annuleren +RealtimeSync - Automated Synchronization +RealtimeSync - Geautomatiseerde Synchronisatie + +Warning +Waarschuwing + Build: %x Build: %x +About +Informatie + All files Alle bestanden @@ -321,29 +426,122 @@ De opdracht word geactiveerd als: &Exit &Afsluiten -Monitoring active... -Controle actief... - Waiting for missing directories... Wacht op ontbrekende mappen... -A folder input field is empty. -Een map invoerveld is leeg. +Invalid command line: +Ongeldige opdrachtregel: + +File content +Bestandsinhoud -Synchronization aborted! -Synchronisatie afgebroken! +File time and size +Bestandstijd- en grootte -Synchronization completed with errors! -Synchronisatie is met fouten afgerond! + Two way + Twee kanten op -Synchronization completed with warnings. -Synchronisatie afgerond met waarschuwingen. +Mirror +Spiegelen -Nothing to synchronize! -Niets om te synchroniseren! +Update +Bijwerken -Synchronization completed successfully. -Synchronisatie succesvol. +Custom +Aangepast + +Multiple... +Meerdere... + +Moving file %x to %y +Bezig met verplaatsen van bestand %x naar %y + +Moving folder %x to %y +Bezig met verplaatsen van map %x naar %y + +Moving symbolic link %x to %y +Bezig met verplaatsen van snelkoppeling %x naar %y + +Removing old versions... +Bezig met verwijderen van oude versies... + +Creating symbolic link %x +Snelkoppeling %x wordt aangemaakt + +Creating folder %x +Map %x wordt aangemaakt + +Overwriting file %x +Bezig met overschrijven van bestand %x + +Overwriting symbolic link %x +Bezig met overschrijven van snelkoppeling %x + +Verifying file %x +Verifieert bestand %x + +Updating attributes of %x +Attributen bijwerken van %x + +Cannot find %x. +Kan %x niet vinden. + +Target folder %x already existing. +Doelmap %x bestaat al. + +Target folder input field must not be empty. +Doelmap mag niet leeg zijn. + +Folder input field for versioning must not be empty. +Bronmap voor versiebeheer mag niet leeg zijn. + +Source folder %x not found. +Bronmap %x niet gevonden. + +The following items have unresolved conflicts and will not be synchronized: +De volgende items hebben onopgeloste conflicten en zullen niet worden gesynchroniseerd: + +Significant difference detected: +Significant verschil gedetecteerd: + +More than 50% of the total number of files will be copied or deleted. +Meer dan 50% van alle bestanden zal gekopiëerd of verwijderd worden. + +Not enough free disk space available in: +Niet genoeg vrije schijfruimte beschikbaar op: + +Required: +Vereist: + +Available: +Beschikbaar: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Een map die onderdeel is van meerdere map paren word aangepast. Kijk alstublieft uw synchronisatie instellingen na. + +Synchronizing folder pair: +Bezig met synchroniseren van folder paar: + +Generating database... +Genereren van database... + +Creating Volume Shadow Copy for %x... +Bezig met Volume Schaduwkopie te maken voor %x... + +Synchronization aborted +Synchronisatie afgebroken + +Synchronization completed with errors +Synchronisatie is met fouten afgerond + +Synchronization completed with warnings +Synchronisatie afgerond met waarschuwingen + +Nothing to synchronize +Niets om te synchroniseren + +Synchronization completed successfully +Synchronisatie succesvol Saving log file %x... Opslaan van logbestand %x... @@ -351,38 +549,26 @@ De opdracht word geactiveerd als: Press "Switch" to resolve issues in FreeFileSync main dialog. Druk op "Omschakelen" om problemen op te lossen in het hoofdscherm van FreeFileSync. -Switching to FreeFileSync main dialog... -Bezig met omschakelen naar het FreeFileSync hoofdscherm. - A new version of FreeFileSync is available: Er is een nieuwe versie van FreeFileSync beschikbaar: Download now? Nu downloaden? -FreeFileSync is up to date! -U gebruikt de nieuwste versie van FreeFileSync! +FreeFileSync is up to date. +U gebruikt de nieuwste versie van FreeFileSync. Information Informatie -Unable to connect to sourceforge.net! -Kan geen verbinding maken met sourceforge.net! - -Current FreeFileSync version number was not found online! Do you want to check manually? -Het huidige FreeFileSync versienummer is niet online gevonden! Wilt u handmatig checken? +Unable to connect to sourceforge.net. +Kan geen verbinding maken met sourceforge.net. -Do you want FreeFileSync to automatically check for updates every week? -Wilt u FreeFileSync elke week automatisch laten controleren of er een nieuwe versie is? +Symlink +Symlink -(Requires an Internet connection!) -(Vereist een internetverbinding!) - - - - - - +Folder +Map Full path Volledig pad @@ -405,18 +591,12 @@ De opdracht word geactiveerd als: Extension Extensie -Size: -Grootte: - -Date: -Datum: +Category +Categorie Action Actie -Category -Categorie - Drag && drop Drag en drop @@ -435,6 +615,33 @@ De opdracht word geactiveerd als: Hibernate Slaapstand +Selected variant: +Selecter variant: + +Select alternate comparison settings +Selecteer alternatieve vergelijkingsinstellingen + +Select alternate synchronization settings +Selecteer alternatieve synchronisatieinstellingen + +Filter is active +Filter is actief + +No filter selected +Geen filter geselecteerd + +Remove alternate settings +Verwijder alternatieve instellingen + +Clear filter settings +Verwijder filterinstellingen + +Copy +Kopiëren + +Paste +Plakken + &New &Nieuw @@ -453,14 +660,11 @@ De opdracht word geactiveerd als: &Language &Taal -&Global settings... -&Algemene instellingen... - &Export file list... &Exporteer bestandslijst... -&Advanced -&Geavanceerd +&Global settings... +&Algemene instellingen... &Check now &Controleer nu @@ -468,12 +672,15 @@ De opdracht word geactiveerd als: Check &automatically once a week Controleer &automatisch eens per week -Check for new version -Controleer voor nieuwe versie - Compare Vergelijk +Comparison settings +Vergelijksinstellingen + +Synchronization settings +Synchronisatieinstellingen + Synchronize Synchroniseer @@ -486,6 +693,9 @@ De opdracht word geactiveerd als: Swap sides Wissel zijdes +Save as batch job +Opslaan als batch opdracht + Hide excluded items Verberg uitgesloten bestanden @@ -528,54 +738,6 @@ De opdracht word geactiveerd als: &Pause &Pauze -Batch job -Taaklijst - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Maak een taakbestand om synchronisatie te automatiseren. Dubbelklik op dit bestand of plan dit in de systeem taakplanner: FreeFileSync.exe .ffs_batch - -Help -Help - -Error handling -Fout afhandeling - -Ignore -Negeer - -Hide all error and warning messages -Verberg alle fout- en waarschuwingsberichten - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Laat pop-up zien bij foutmeldingen of waarschuwingen - -Exit -Sluiten - -Abort synchronization on first error -Synchronisatie stoppen bij eerste foutmelding - -Show progress dialog -Toon voortgangsdialoogvenster - -Save log -Logbestand opslaan - -Select folder to save log files -Selecteer map om log bestanden op te slaan - -Limit -Limiet - -Limit maximum number of log files -Limiteer maximaal aantal log bestanden - -Select variant -Selecteer variant - Files are found equal if - last write time and date @@ -589,9 +751,6 @@ Bestanden worden als gelijk bevonden indien gelijk zijn -File time and size -Bestandstijd- en grootte - Files are found equal if - file content @@ -603,39 +762,42 @@ Bestanden worden als gelijk beschouwd indien overeenkomt -File content -Bestandsinhoud - Symbolic Link handling Afhandeling van snelkoppelingen +Help +Help + OK OK -<- Two way -> -<- Twee kanten op -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identificeer en pas veranderingen toe aan beide kanten. Verwijderingen, verplaatsingen en conflicten worden automatisch gevonden met behulp van een database. -Mirror ->> -Spiegelen ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Spiegel backup van linker map. Rechter map is na synchronisatie een exacte kopie van de linker map. -Update -> -Bijwerken -> - Copy new or updated files to right folder. Kopiëer nieuwe of geupdate bestanden naar de rechter map. -Custom -Aangepast - Configure your own synchronization rules. Configureer uw eigen synchronisatieregels. +Error handling +Fout afhandeling + +Ignore +Negeer + +Hide all error and warning messages +Verberg alle fout- en waarschuwingsberichten + +Pop-up +Pop-up + +Show pop-up on errors or warnings +Laat pop-up zien bij foutmeldingen of waarschuwingen + Deletion handling Verwijder-afhandeling @@ -660,23 +822,32 @@ overeenkomt Naming convention: Naamgevingsconventie -Item exists on left side only -Item bestaat alleen aan de linkerkant +Batch job +Taaklijst + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Maak een taakbestand om synchronisatie te automatiseren. Dubbelklik op dit bestand of plan dit in de systeem taakplanner: FreeFileSync.exe .ffs_batch + +Exit +Sluiten -Item exists on right side only -Item bestaat alleen aan de rechterkant +Abort synchronization on first error +Synchronisatie stoppen bij eerste foutmelding -Left side is newer -De linkerkant is nieuwer +Show progress dialog +Toon voortgangsdialoogvenster -Right side is newer -De rechterkant is nieuwer +Save log +Logbestand opslaan -Items have different content -De items hebben een andere inhoud +Select folder to save log files +Selecteer map om log bestanden op te slaan -Conflict/item cannot be categorized -Conflict/item kan niet worden gecategoriseerd +Limit +Limiet + +Limit maximum number of log files +Limiteer maximaal aantal log bestanden Source code written in C++ using: Broncode geschreven in C++ met behulp van: @@ -696,9 +867,6 @@ overeenkomt Homepage Homepage -FreeFileSync at Sourceforge -FreeFileSync op Sourceforge - Email E-mail @@ -713,11 +881,11 @@ overeenkomt Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Alleen bestanden die met alle filter instellingen overeen komen worden gesynchroniseerd. -Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! +Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen. Include @@ -741,6 +909,9 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! &Clear &Leegmaken +Global settings +Algemene instellingen + Fail-safe file copy Fail-safe bestandskopie @@ -771,9 +942,6 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! &Default &Standaard -Start synchronization -Start synchronisatie - Variant Variant @@ -792,11 +960,20 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! &Find next &Vind volgende -Operation aborted! -Bewerking afgebroken! +Delete +Verwijderen + +Configure filter +Filterconfiguratie -Main bar -Hoofdbalk +Start synchronization +Start synchronisatie + +Find +Vind + +Select time span +Selecteer tijdsspanne Folder pairs Map paren @@ -807,6 +984,9 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Configuration Configuratie +Main bar +Hoofdbalk + Filter files Filter bestanden @@ -861,11 +1041,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Exclude via filter: Sluit via filter uit: - - - -Delete -Verwijderen +multiple selection +meervoudige selectie Include all Alles opnemen @@ -894,14 +1071,14 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Show "%x" Toon "%x" - - +Last session +Laatste sessie Folder Comparison and Synchronization Mappen vergelijken en synchroniseren -Configuration saved! -Configuratie opgeslagen! +Configuration saved +Configuratie opgeslagen FreeFileSync batch FreeFileSync taak @@ -915,9 +1092,6 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Never save changes Wijzigingen nooit opslaan -Configuration loaded! -Configuratie geladen! - Show files that exist on left side only Toon bestanden die alleen aan de linkerzijde bestaan @@ -963,17 +1137,17 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Set as default Instellen als standaard -All folders are in sync! -Alle mappen zijn gesynchroniseerd! +Operation aborted +Bewerking afgebroken + +All folders are in sync +Alle mappen zijn gesynchroniseerd Comma separated list Kommagescheiden bestand -Legend -Legenda - -File list exported! -Bestandslijst geëxporteerd! +File list exported +Bestandslijst geëxporteerd Searching for program updates... Bezig met zoeken naar programma updates... @@ -984,6 +1158,9 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! &Ignore &Negeren +Fatal Error +Kritieke fout + Don't show this warning again Laat deze waarschuwing niet opnieuw zien @@ -1005,6 +1182,9 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Comparing content... Inhoud vergelijken... +Info +Info + Paused Gepauzeerd @@ -1107,18 +1287,18 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Leave as unresolved conflict Beschouw als onopgelost conflict -Time stamp -Tijdstempel - -Append a timestamp to each file name -Voeg een timestamp aan elke bestandsnaam toe - Replace Vervangen Move files and replace if existing Verplaats bestanden en overschrijf bestaande bestanden +Time stamp +Tijdstempel + +Append a timestamp to each file name +Voeg een timestamp aan elke bestandsnaam toe + Folder Map @@ -1161,9 +1341,6 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Cannot write modification time of %x. Kan wijzigingstijd van %x niet toevoegen. -Cannot find system function %x. -Kan systeemfunctie %x niet vinden. - Cannot read security context of %x. Kan de beveiligingscontext van %x niet lezen. @@ -1179,8 +1356,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Cannot create directory %x. Kan map %x niet aanmaken. -Cannot copy symbolic link %x to %y. -Kan snelkoppeling %x niet kopiëren naar %y. +Cannot find system function %x. +Kan systeemfunctie %x niet vinden. Cannot copy file %x to %y. Kan bestand %x niet kopiëren naar %y. @@ -1188,15 +1365,15 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Type of item %x is not supported: Type van bestand %x is niet ondersteund: +Cannot resolve symbolic link %x. +Kan snelkoppeling %x niet vinden. + Cannot open directory %x. Kan map %x niet openen. Cannot enumerate directory %x. Kan map %x niet opsommen. -Detected endless directory recursion. -Eindeloze map recursie gedetecteerd. - %x TB %x TB @@ -1239,210 +1416,9 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen! Cannot change process I/O priorities. Kan de I/O prioriteiten niet aanpassen. -Unable to move %x to the Recycle Bin! -Niet mogelijk om %x naar de Prullenbak te verplaatsen! - -Both sides have changed since last synchronization! -Beide zijdes zijn veranderd sinds de laatste synchronisatie! - -Cannot determine sync-direction: -Kan de synchronisatie-richting niet bepalen: - -No change since last synchronization! -Geen veranderingen sinds de laatste synchronisatie! - -The corresponding database entries are not in sync considering current settings. -De volgende databaseregels zijn niet gesynchroniseerd volgens de huidige instellingen. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Stel standaard synchronisatie richtingen in: Oude bestanden worden door nieuwere bestanden overschreven. - -Checking recycle bin availability for folder %x... -Prullebak beschikbaarheid voor map %x te controleren... - -Moving file %x to recycle bin -Bezig met verplaatsen van bestand %x naar de prullenbak - -Moving folder %x to recycle bin -Bezig met verplaatsen van map %x naar de prullenbak - -Moving symbolic link %x to recycle bin -Bezig met verplaatsen van snelkoppeling %x naar de prullenbak - -Deleting file %x -Verwijderen van bestand %x - -Deleting folder %x -Verwijderen van map %x - -Deleting symbolic link %x -Verwijderen van snelkoppeling %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Prullenbak is niet beschikbaar voor de volgende locaties! De bestanden worden permanent verwijderd: - -The corresponding folder will be considered as empty. -De overeenkomstige map zal als leeg worden beschouwd. - -Cannot find the following folders: -Kan de volgende mappen niet vinden: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -U kunt deze foutmelding negeren om elke map als leeg te markeren. De mappen worden dan automatisch aangemaakt tijdens de synchronisatie. - -Directories are dependent! Be careful when setting up synchronization rules: -Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels: - -Start comparison -Start vergelijking - -Calculating sync directions... -Synchronisatie richtingen calculeren... - -Conflict detected: -Conflict gedetecteerd: - -File %x has an invalid date! -Bestand %x heeft een ongeldige datum! +Unable to move %x to the Recycle Bin. +Niet mogelijk om %x naar de Prullenbak te verplaatsen. -Files %x have the same date but a different size! -Bestanden %x hebben dezelfde datums maar een afwijkende grootte! - -Items differ in attributes only -Items verschillen alleen in attributen - -Symbolic links %x have the same date but a different target. -Snelkoppelingen %x hebben dezelfde datum maar een verschillend doel. - -Comparing content of files %x -De inhoud van %x bestanden wordt vergeleken - -Comparing files by content failed. -Bestand-inhoudvergelijking mislukt. - -Generating file list... -Genereren van bestandslijst... - -Both sides are equal -Beide kanten zijn gelijk - -Copy new item to left -Kopieër nieuw item naar de linkerkant - -Copy new item to right -Kopieër nieuw item naar de rechterkant - -Delete left item -Verwijder linker item - -Delete right item -Verwijder rechter item - -Move file on left -Verplaats bestand aan de linkerkant - -Move file on right -Verplaats bestand aan de rechterkant - -Overwrite left item -Overschrijf linker item - -Overwrite right item -Overschrijf rechter item - -Do nothing -Geen actie ondernemen - -Update attributes on left -Update attributen aan de linkerkant - -Update attributes on right -Update attributen aan de rechterkant - -Multiple... -Meerdere... - -Moving file %x to %y -Bezig met verplaatsen van bestand %x naar %y - -Moving folder %x to %y -Bezig met verplaatsen van map %x naar %y - -Moving symbolic link %x to %y -Bezig met verplaatsen van snelkoppeling %x naar %y - -Removing old versions... -Bezig met verwijderen van oude versies... - -Creating symbolic link %x -Snelkoppeling %x wordt aangemaakt - -Creating folder %x -Map %x wordt aangemaakt - -Overwriting file %x -Bezig met overschrijven van bestand %x - -Overwriting symbolic link %x -Bezig met overschrijven van snelkoppeling %x - -Verifying file %x -Verifieert bestand %x - -Updating attributes of %x -Attributen bijwerken van %x - -Cannot find %x. -Kan %x niet vinden. - -Target folder %x already existing. -Doelmap %x bestaat al. - -Target folder input field must not be empty. -Doelmap mag niet leeg zijn. - -Folder input field for versioning must not be empty. -Bronmap voor versiebeheer mag niet leeg zijn. - -Source folder %x not found. -Bronmap %x niet gevonden. - -The following items have unresolved conflicts and will not be synchronized: -De volgende items hebben onopgeloste conflicten en zullen niet worden gesynchroniseerd: - -Significant difference detected: -Significant verschil gedetecteerd: - -More than 50% of the total number of files will be copied or deleted! -Meer dan 50% van alle bestanden zal gekopiëerd of verwijderd worden! - -Not enough free disk space available in: -Niet genoeg vrije schijfruimte beschikbaar op: - -Required: -Vereist: - -Available: -Beschikbaar: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Een map die onderdeel is van meerdere map paren word aangepast. Kijk alstublieft uw synchronisatie instellingen na. - -Left -Links - -Right -Rechts - -Synchronizing folder pair: -Bezig met synchroniseren van folder paar: - -Generating database... -Genereren van database... - -Creating Volume Shadow Copy for %x... -Bezig met Volume Schaduwkopie te maken voor %x... - -Data verification error: Source and target file have different content! -Dataverificatie-fout: Bron en doelbestand hebben verschillende inhoud! +Error Code %x: +Foutcode %x: diff --git a/BUILD/Languages/english_uk.lng b/BUILD/Languages/english_uk.lng index 43cf6f51..d1fcab3d 100644 --- a/BUILD/Languages/english_uk.lng +++ b/BUILD/Languages/english_uk.lng @@ -1,143 +1,164 @@
- English (UK) + English (UK) Robert Readman en_GB - england.png - 2 - n == 1 ? 0 : 1 + flag_england.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Searching for folder %x... +Both sides have changed since last synchronization. +Both sides have changed since last synchronisation. -Items processed: -Elements processed: +Cannot determine sync-direction: +Cannot determine sync-direction: -Items remaining: -Elements remaining: +No change since last synchronization. +No change since last synchronisation. -Total time: -Total time: +The database entry is not in sync considering current settings. +The database entry is not in sync considering current settings. -Cannot set directory lock for %x. -Cannot set directory lock for %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +Setting default synchronisation directions: Old files will be overwritten with newer files. -Show in Explorer -Show in Explorer +Checking recycle bin availability for folder %x... +Checking recycle bin availability for folder %x... -Open with default application -Open with default application +Moving file %x to recycle bin +Moving file %x to recycle bin -Browse directory -Browse directory +Moving folder %x to recycle bin +Moving folder %x to recycle bin -Abort requested: Waiting for current operation to finish... -Abort requested: Waiting for current operation to finish... +Moving symbolic link %x to recycle bin +Moving symbolic link %x to recycle bin -Failure to create timestamp for versioning: -Failure to create time stamp for versioning: +Deleting file %x +Deleting file %x -RealtimeSync - Automated Synchronization -RealtimeSync - Automated Synchronisation +Deleting folder %x +Deleting folder %x + +Deleting symbolic link %x +Deleting symbolic link %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: + +An exception occurred +An exception occurred + +Cannot find file %x. +Cannot find file %x. Error Error -Selected variant: -Selected variant: +File %x does not contain a valid configuration. +File %x does not contain a valid configuration. -Select alternate comparison settings -Select alternate comparison settings +A folder input field is empty. +A folder input field is empty. -Select alternate synchronization settings -Select alternate synchronisation settings +The corresponding folder will be considered as empty. +The corresponding folder will be considered as empty. -Filter is active -Filter is active +Cannot find the following folders: +Cannot find the following folders: -No filter selected -No filter selected +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronisation. -Remove alternate settings -Remove alternate settings +The following folders have dependent paths. Be careful when setting up synchronization rules: +The following folders have dependent paths. Be careful when setting up synchronisation rules: -Clear filter settings -Clear filter settings +File %x has an invalid date. +File %x has an invalid date. -Copy -Copy +Date: +Date: -Paste -Paste +Files %x have the same date but a different size. +Files %x have the same date but a different size. -Save as batch job -Save as batch job +Size: +Size: -Comparison settings -Comparison settings +Items differ in attributes only +Items differ in attributes only -Synchronization settings -Synchronisation settings +Resolving symbolic link %x +Resolving symbolic link %x -About -About +Comparing content of files %x +Comparing content of files %x -Confirm -Confirm +Generating file list... +Generating file list... -Configure filter -Configure filter +Starting comparison +Starting comparison -Global settings -Global settings +Calculating sync directions... +Calculating sync directions... -Find -Find +Out of memory. +Out of memory. -Select time span -Select time span +Item exists on left side only +Item exists on left side only -Invalid command line: -Invalid command line: +Item exists on right side only +Item exists on right side only -Info -Info +Left side is newer +Left side is newer -Warning -Warning +Right side is newer +Right side is newer -Fatal Error -Fatal Error +Items have different content +Items have different content -Error Code %x: -Error Code %x: +Both sides are equal +Both sides are equal -Cannot resolve symbolic link %x. -Cannot resolve symbolic link %x. +Conflict/item cannot be categorized +Conflict/item cannot be categorised -Cannot determine final path for %x. -Cannot determine final path for %x. +Copy new item to left +Copy new item to left -Cannot find system function %x. -Cannot find system function %x. +Copy new item to right +Copy new item to right - -1 Byte -%x Bytes - - -1 Byte -%x Bytes - +Delete left item +Delete left item -%x MB -%x MB +Delete right item +Delete right item -%x KB -%x KB +Move file on left +Move file on left -%x GB -%x GB +Move file on right +Move file on right + +Overwrite left item +Overwrite left item + +Overwrite right item +Overwrite right item + +Do nothing +Do nothing + +Update attributes on left +Update attributes on left + +Update attributes on right +Update attributes on right Database file %x is incompatible. Database file %x is incompatible. @@ -151,9 +172,6 @@ Database file is corrupt: Database file is corrupt: -Out of memory! -Out of memory! - Cannot write file %x. Cannot write file %x. @@ -163,8 +181,8 @@ Database files do not share a common session. Database files do not share a common session. -An exception occurred! -An exception occurred! +Searching for folder %x... +Searching for folder %x... Cannot read file attributes of %x. Cannot read file attributes of %x. @@ -187,9 +205,39 @@ Creating file %x Creating file %x +Items processed: +Elements processed: + +Items remaining: +Elements remaining: + +Total time: +Total time: + + +1 Byte +%x Bytes + + +1 Byte +%x Bytes + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Error parsing file %x, row %y, column %z. +Cannot set directory lock for %x. +Cannot set directory lock for %x. + Scanning: Scanning: @@ -208,12 +256,18 @@ /sec /sec -File %x does not contain a valid configuration. -File %x does not contain a valid configuration. - Configuration file %x loaded partially only. Configuration file %x loaded partially only. +Show in Explorer +Show in Explorer + +Open with default application +Open with default application + +Browse directory +Browse directory + Cannot access Volume Shadow Copy Service. Cannot access Volume Shadow Copy Service. @@ -223,18 +277,21 @@ Cannot load file %x. Cannot load file %x. -Path %x does not contain a volume name. -Path %x does not contain a volume name. +Cannot determine volume name for %x. +Cannot determine volume name for %x. -Volume name %x not part of file name %y! -Volume name %x not part of file name %y! +Volume name %x not part of file name %y. +Volume name %x not part of file name %y. + +Abort requested: Waiting for current operation to finish... +Abort requested: Waiting for current operation to finish... + +Failure to create timestamp for versioning: +Failure to create time stamp for versioning: Cannot read the following XML elements: Cannot read the following XML elements: -Cannot find file %x. -Cannot find file %x. - &Open... &Open... @@ -315,9 +372,18 @@ The command is triggered if: Cancel Cancel +RealtimeSync - Automated Synchronization +RealtimeSync - Automated Synchronisation + +Warning +Warning + Build: %x Build: %x +About +About + All files All files @@ -327,29 +393,125 @@ The command is triggered if: &Exit &Exit -Monitoring active... -Monitoring active... - Waiting for missing directories... Waiting for missing directories... -A folder input field is empty. -A folder input field is empty. +Invalid command line: +Invalid command line: + +File content +File content + +File time and size +File time and size + + Two way + Two way + +Mirror +Mirror + +Update +Update + +Custom +Custom + +Multiple... +Multiple... + +Moving file %x to %y +Moving file %x to %y + +Moving folder %x to %y +Moving folder %x to %y + +Moving symbolic link %x to %y +Moving symbolic link %x to %y + +Removing old versions... +Removing old versions... + +Creating symbolic link %x +Creating symbolic link %x + +Creating folder %x +Creating folder %x + +Overwriting file %x +Overwriting file %x + +Overwriting symbolic link %x +Overwriting symbolic link %x + +Verifying file %x +Verifying file %x -Synchronization aborted! -Synchronisation aborted! +Updating attributes of %x +Updating attributes of %x -Synchronization completed with errors! -Synchronisation completed with errors! +Cannot find %x. +Cannot find %x. -Synchronization completed with warnings. -Synchronization completed with warnings. +Target folder %x already existing. +Target folder %x already existing. -Nothing to synchronize! -Nothing to synchronise! +Target folder input field must not be empty. +Target folder input field must not be empty. -Synchronization completed successfully. -Synchronisation completed successfully. +Folder input field for versioning must not be empty. +Folder input field for versioning must not be empty. + +Source folder %x not found. +Source folder %x not found. + +The following items have unresolved conflicts and will not be synchronized: +The following items have unresolved conflicts and will not be synchronised: + +Significant difference detected: +Significant difference detected: + +More than 50% of the total number of files will be copied or deleted. +More than 50% of the total number of files will be copied or deleted. + +Not enough free disk space available in: +Not enough free disk space available in: + +Required: +Required: + +Available: +Available: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +A folder will be modified which is part of multiple folder pairs. Please review synchronisation settings. + +Synchronizing folder pair: +Synchronising folder pair: + +Generating database... +Generating database... + +Creating Volume Shadow Copy for %x... +Creating Volume Shadow Copy for %x... + +Data verification error: %x and %y have different content. +Data verification error: %x and %y have different content. + +Synchronization aborted +Synchronisation aborted + +Synchronization completed with errors +Synchronisation completed with errors + +Synchronization completed with warnings +Synchronization completed with warnings + +Nothing to synchronize +Nothing to synchronise + +Synchronization completed successfully +Synchronisation completed successfully Saving log file %x... Saving log file %x... @@ -357,8 +519,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. Press "Switch" to resolve issues in FreeFileSync main dialogue. -Switching to FreeFileSync main dialog... -Switching to FreeFileSync main dialogue... +Switching to FreeFileSync main dialog +Switching to FreeFileSync main dialog A new version of FreeFileSync is available: A new version of FreeFileSync is available: @@ -366,29 +528,29 @@ The command is triggered if: Download now? Download now? -FreeFileSync is up to date! -FreeFileSync is up to date! +New version found +New version found -Information -Information +&Download +&Download -Unable to connect to sourceforge.net! -Unable to connect to sourceforge.net! +FreeFileSync is up to date. +FreeFileSync is up to date. -Current FreeFileSync version number was not found online! Do you want to check manually? -Current FreeFileSync version number was not found online! Do you want to check manually? +Information +Information -Do you want FreeFileSync to automatically check for updates every week? -Do you want FreeFileSync to automatically check for updates every week? +Unable to connect to sourceforge.net. +Unable to connect to sourceforge.net. -(Requires an Internet connection!) -(Requires an Internet connection!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Cannot find current FreeFileSync version number online. Do you want to check manually? - - +Symlink +Symlink - - +Folder +Folder Full path Full path @@ -411,12 +573,6 @@ The command is triggered if: Extension Extension -Size: -Size: - -Date: -Date: - Category Category @@ -441,6 +597,33 @@ The command is triggered if: Hibernate Hibernate +Selected variant: +Selected variant: + +Select alternate comparison settings +Select alternate comparison settings + +Select alternate synchronization settings +Select alternate synchronisation settings + +Filter is active +Filter is active + +No filter selected +No filter selected + +Remove alternate settings +Remove alternate settings + +Clear filter settings +Clear filter settings + +Copy +Copy + +Paste +Paste + &New &New @@ -459,14 +642,14 @@ The command is triggered if: &Language &Language -&Global settings... -&Global settings... - &Export file list... &Export file list... -&Advanced -&Advanced +&Global settings... +&Global settings... + +&Tools +&Tools &Check now &Check now @@ -474,12 +657,18 @@ The command is triggered if: Check &automatically once a week Check &automatically once a week -Check for new version -Check for new version +Check for new &version +Check for new &version Compare Compare +Comparison settings +Comparison settings + +Synchronization settings +Synchronisation settings + Synchronize Synchronise @@ -492,6 +681,9 @@ The command is triggered if: Swap sides Swap sides +Save as batch job +Save as batch job + Hide excluded items Hide excluded items @@ -534,53 +726,8 @@ The command is triggered if: &Pause &Pause -Batch job -Batch job - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Create a batch file to automate synchronisation. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch - -Help -Help - -Error handling -Error handling - -Ignore -Ignore - -Hide all error and warning messages -Hide all error and warning messages - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Show pop-up on errors or warnings - -Exit -Exit - -Abort synchronization on first error -Abort synchronisation on first error - -Show progress dialog -Show progress dialogue - -Save log -Save log - -Select folder to save log files -Select folder to save log files - -Limit -Limit - -Limit maximum number of log files -Limit maximum number of log files - -Select variant -Select variant +Select a variant +Select a variant Files are found equal if @@ -595,9 +742,6 @@ Files are found equal if are the same -File time and size -File time and size - Files are found equal if - file content @@ -609,38 +753,41 @@ Files are found equal if is the same -File content -File content - Symbolic Link handling Symbolic Link handling +Help +Help + OK OK -<- Two way -> -<- Two way -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. -Mirror ->> -Mirror ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronisation. -Update -> -Update -> - Copy new or updated files to right folder. Copy new or updated files to right folder. -Custom -Custom +Configure your own synchronization rules. +Configure your own synchronisation rules. + +Error handling +Error handling + +Ignore +Ignore + +Hide all error and warning messages +Hide all error and warning messages + +Pop-up +Pop-up -Configure your own synchronization rules. -Configure your own synchronisation rules. +Show pop-up on errors or warnings +Show pop-up on errors or warnings Deletion handling Deletion handling @@ -666,23 +813,32 @@ is the same Naming convention: Naming convention: -Item exists on left side only -Item exists on left side only +Batch job +Batch job -Item exists on right side only -Item exists on right side only +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Create a batch file to automate synchronisation. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Left side is newer -Left side is newer +Exit +Exit -Right side is newer -Right side is newer +Abort synchronization on first error +Abort synchronisation on first error -Items have different content -Items have different content +Show progress dialog +Show progress dialogue -Conflict/item cannot be categorized -Conflict/item cannot be categorised +Save log +Save log + +Select folder to save log files +Select folder to save log files + +Limit +Limit + +Limit maximum number of log files +Limit maximum number of log files Source code written in C++ using: Source code written in C++ using: @@ -702,9 +858,6 @@ is the same Homepage Homepage -FreeFileSync at Sourceforge -FreeFileSync at Sourceforge - Email E-mail @@ -719,11 +872,11 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Only files that match all filter settings will be synchronised. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Include @@ -747,6 +900,9 @@ Note: File names must be relative to base directories! &Clear &Clear +Global settings +Global settings + Fail-safe file copy Fail-safe file copy @@ -777,9 +933,6 @@ Note: File names must be relative to base directories! &Default &Default -Start synchronization -Start synchronisation - Variant Variant @@ -798,6 +951,21 @@ Note: File names must be relative to base directories! &Find next &Find next +Delete +Delete + +Configure filter +Configure filter + +Start synchronization +Start synchronisation + +Find +Find + +Select time span +Select time span + Folder pairs Folder pairs @@ -864,11 +1032,8 @@ Note: File names must be relative to base directories! Exclude via filter: Exclude via filter: - - - -Delete -Delete +multiple selection +multiple selection Include all Include all @@ -897,14 +1062,14 @@ Note: File names must be relative to base directories! Show "%x" Show "%x" - - +Last session +Last session Folder Comparison and Synchronization Folder Comparison and Synchronisation -Configuration saved! -Configuration saved! +Configuration saved +Configuration saved FreeFileSync batch FreeFileSync batch @@ -918,9 +1083,6 @@ Note: File names must be relative to base directories! Never save changes Never save changes -Configuration loaded! -Configuration loaded! - Show files that exist on left side only Show files that exist on left side only @@ -966,17 +1128,17 @@ Note: File names must be relative to base directories! Set as default Set as default -Operation aborted! -Operation aborted! +Operation aborted +Operation aborted -All folders are in sync! -All folders are in sync! +All folders are in sync +All folders are in sync Comma separated list Comma separated list -File list exported! -File list exported! +File list exported +File list exported Searching for program updates... Searching for program updates... @@ -987,6 +1149,9 @@ Note: File names must be relative to base directories! &Ignore &Ignore +Fatal Error +Fatal Error + Don't show this warning again Don't show this warning again @@ -1008,6 +1173,9 @@ Note: File names must be relative to base directories! Comparing content... Comparing content... +Info +Info + Paused Paused @@ -1182,12 +1350,18 @@ Note: File names must be relative to base directories! Cannot create symbolic link %x. Cannot create symbolic link %x. +Cannot find system function %x. +Cannot find system function %x. + Cannot copy file %x to %y. Cannot copy file %x to %y. Type of item %x is not supported: Type of item %x is not supported: +Cannot resolve symbolic link %x. +Cannot resolve symbolic link %x. + Cannot open directory %x. Cannot open directory %x. @@ -1227,6 +1401,9 @@ Note: File names must be relative to base directories! %x days +Failed to register to receive system messages. +Failed to register to receive system messages. + Cannot set privilege %x. Cannot set privilege %x. @@ -1236,201 +1413,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. Cannot change process I/O priorities. -Unable to move %x to the Recycle Bin! -Unable to move %x to the Recycle Bin! - -Both sides have changed since last synchronization! -Both sides have changed since last synchronisation! - -Cannot determine sync-direction: -Cannot determine sync-direction: - -No change since last synchronization! -No change since last synchronisation! - -The corresponding database entries are not in sync considering current settings. -The corresponding database entries are not in sync considering current settings. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Setting default synchronisation directions: Old files will be overwritten with newer files. - -Checking recycle bin availability for folder %x... -Checking recycle bin availability for folder %x... - -Moving file %x to recycle bin -Moving file %x to recycle bin - -Moving folder %x to recycle bin -Moving folder %x to recycle bin - -Moving symbolic link %x to recycle bin -Moving symbolic link %x to recycle bin - -Deleting file %x -Deleting file %x - -Deleting folder %x -Deleting folder %x - -Deleting symbolic link %x -Deleting symbolic link %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: - -The corresponding folder will be considered as empty. -The corresponding folder will be considered as empty. - -Cannot find the following folders: -Cannot find the following folders: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronisation. - -Directories are dependent! Be careful when setting up synchronization rules: -Directories are dependent! Be careful when setting up synchronisation rules: - -Conflict detected: -Conflict detected: - -File %x has an invalid date! -File %x has an invalid date! - -Files %x have the same date but a different size! -Files %x have the same date but a different size! - -Items differ in attributes only -Items differ in attributes only - -Resolving symbolic link %x -Resolving symbolic link %x - -Comparing content of files %x -Comparing content of files %x - -Generating file list... -Generating file list... - -Start comparison -Start comparison - -Calculating sync directions... -Calculating sync directions... - -Both sides are equal -Both sides are equal - -Copy new item to left -Copy new item to left - -Copy new item to right -Copy new item to right - -Delete left item -Delete left item - -Delete right item -Delete right item - -Move file on left -Move file on left - -Move file on right -Move file on right - -Overwrite left item -Overwrite left item - -Overwrite right item -Overwrite right item - -Do nothing -Do nothing - -Update attributes on left -Update attributes on left - -Update attributes on right -Update attributes on right - -Multiple... -Multiple... - -Moving file %x to %y -Moving file %x to %y - -Moving folder %x to %y -Moving folder %x to %y - -Moving symbolic link %x to %y -Moving symbolic link %x to %y - -Removing old versions... -Removing old versions... - -Creating symbolic link %x -Creating symbolic link %x - -Creating folder %x -Creating folder %x - -Overwriting file %x -Overwriting file %x - -Overwriting symbolic link %x -Overwriting symbolic link %x - -Verifying file %x -Verifying file %x - -Updating attributes of %x -Updating attributes of %x - -Cannot find %x. -Cannot find %x. - -Target folder %x already existing. -Target folder %x already existing. - -Target folder input field must not be empty. -Target folder input field must not be empty. - -Folder input field for versioning must not be empty. -Folder input field for versioning must not be empty. - -Source folder %x not found. -Source folder %x not found. - -The following items have unresolved conflicts and will not be synchronized: -The following items have unresolved conflicts and will not be synchronised: - -Significant difference detected: -Significant difference detected: - -More than 50% of the total number of files will be copied or deleted! -More than 50% of the total number of files will be copied or deleted! - -Not enough free disk space available in: -Not enough free disk space available in: - -Required: -Required: - -Available: -Available: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -A folder will be modified which is part of multiple folder pairs. Please review synchronisation settings. - -Synchronizing folder pair: -Synchronising folder pair: - -Generating database... -Generating database... +Unable to move %x to the Recycle Bin. +Unable to move %x to the Recycle Bin. -Creating Volume Shadow Copy for %x... -Creating Volume Shadow Copy for %x... +Cannot determine final path for %x. +Cannot determine final path for %x. -Data verification error: Source and target file have different content! -Data verification error: Source and target file have different content! +Error Code %x: +Error Code %x: diff --git a/BUILD/Languages/finnish.lng b/BUILD/Languages/finnish.lng index 8c594d10..81c5bf61 100644 --- a/BUILD/Languages/finnish.lng +++ b/BUILD/Languages/finnish.lng @@ -1,137 +1,164 @@
- Suomi + Suomi Nalle Juslén fi_FI - finland.png - 2 - n == 1 ? 0 : 1 + flag_finland.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Etsitään hakemistoa %x... +Both sides have changed since last synchronization. +Molemmat puolet muuttuneet edellisestä täsmäyksestä. -Items processed: -Osia käsitelty: +Cannot determine sync-direction: +Tuntematon suunta täsmäykselle: -Items remaining: -Osia jäljellä: +No change since last synchronization. +Ei muutoksia edellisen täsmäyksen jälkeen. -Total time: -Kokonaisaika: +The database entry is not in sync considering current settings. +Tietokanta ei vastaa nykyisiä asetuksia. -Cannot set directory lock for %x. -Hakemiston %x lukitus ei onnistu. +Setting default synchronization directions: Old files will be overwritten with newer files. +Aseta oletussuunta täsmäykselle: Vanhat tiedostot korvataan uudemilla tiedostoilla. -Show in Explorer -Näytä Explorerissa +Checking recycle bin availability for folder %x... +Tarkistetaan Roskakorin käyttö hakemistolle %x... -Open with default application -Avaa oletussovelluksessa +Moving file %x to recycle bin +Siirrä tiedosto %x roskakoriin -Browse directory -Selaa hakemistoa +Moving folder %x to recycle bin +Siirrä hakemisto %x roskakoriin -Abort requested: Waiting for current operation to finish... -Keskeytys pyydetty: Odotetaan toiminnon loppumista... +Moving symbolic link %x to recycle bin +Siirrä pikakuvake %x roskakoriin -Failure to create timestamp for versioning: -Ongelma luoda aikaleimaa versionnissa: +Deleting file %x +Poista tiedosto %x -RealtimeSync - Automated Synchronization -RealtimeSync - Automaattisoitu täsmäytys +Deleting folder %x +Poista hakemisto %x + +Deleting symbolic link %x +Pistetaan pikakuvake %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Roskakori ei ole käytössä näillä hakemistoilla. Tiedostot poistetaan pysyvästi: + +An exception occurred +Virhe havaittu + +Cannot find file %x. +Tiedosto %x ei löydy. Error Virhe -Selected variant: -Valitse tyyppi: +File %x does not contain a valid configuration. +Tiedosto %x ei sisällä kelvollista kokoonpanoa. -Select alternate comparison settings -Muuta vertailun asetusta +A folder input field is empty. +Hakemiston syöte on tyhjä. -Select alternate synchronization settings -Muuta täsmäytyksen asetus +The corresponding folder will be considered as empty. +Hakemisto tulkitaan tyhjäksi. -Filter is active -Suodin aktivoitu +Cannot find the following folders: +Hakemistot ei löydy: -No filter selected -Suodin valitsematta +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Voit ohita virhe olettamalla hakemistot tyhjiksi. Hakemistot luodaan täsmäytyksen aikana. -Remove alternate settings -Poista muut asetukset +The following folders have dependent paths. Be careful when setting up synchronization rules: +Hakemistolla on polkumäärittely. Luo täsmäytyksen vertailusäännöt huolella: -Clear filter settings -Nollaa suodin +File %x has an invalid date. +Tiedostolla %x on virheellinen päiväys. -Copy -Monista +Date: +Pvm: -Paste -Liitä +Files %x have the same date but a different size. +Tiedostoilla %x on sama päiväys mutta eri koko. -Save as batch job -Tallenna eräajona +Size: +Koko: -Comparison settings -Vertailun asetukset +Items differ in attributes only +Kohteiden eroaa vain määritteissä -Synchronization settings -Täsmäytyksen asetukset +Resolving symbolic link %x +Tulkitaan pikakuvike %x -About -Ohje +Comparing content of files %x +Vertaa tiedostojen %x tietosisältöä -Confirm -Vahvista +Generating file list... +Luodaan tiedostolista... -Configure filter -Määritä suodin +Starting comparison +Vertailu alkaa -Global settings -Yleiset asetukset +Calculating sync directions... +Lasketaa täsmäytyksen suuntaa... -Find -Etsi +Out of memory. +Muisti loppui. -Select time span -Valitse aikajana +Item exists on left side only +Kohde löytyy vain vasemmalta -Invalid command line: -Virheellinen komentokehote: +Item exists on right side only +Kohde löytyy vain oikealta -Info -Info +Left side is newer +Uudempi vasemmalla -Warning -Varoitus +Right side is newer +Uudempi oikealla -Fatal Error -Kohtalokas virhe +Items have different content +Kohteilla eri sisältö -Error Code %x: -Virhe %x: +Both sides are equal +Puolet ovat identtiset -Cannot resolve symbolic link %x. -Tämä linkki on virheellinen %x. +Conflict/item cannot be categorized +Ristiriita, ei määriteltävissä - -1 Byte -%x Bytes - - -1 tavu -%x tavua - +Copy new item to left +Monista uusi vasemmalle -%x MB -%x MB +Copy new item to right +Monista uusi oikealle -%x KB -%x KB +Delete left item +Poista vasen -%x GB -%x GB +Delete right item +Poista oikea + +Move file on left +Siirä vasen tiedosto + +Move file on right +Siirrä oikea tiedosto + +Overwrite left item +Korvaa vasen + +Overwrite right item +Korvaa oikea + +Do nothing +Älä tee mitään + +Update attributes on left +Päivitä oikeudet vasemmalla + +Update attributes on right +Päivitä oikeudet oikealla Database file %x is incompatible. Tietokanta %x vierasta muotoa. @@ -145,9 +172,6 @@ Database file is corrupt: Tietokanta viottunut: -Out of memory! -Muisti loppui! - Cannot write file %x. Kirjoittaminen ei onnistu %x. @@ -157,8 +181,8 @@ Database files do not share a common session. Tietokannan tiedostot eri sessioista. -An exception occurred! -Virhe havaittu! +Searching for folder %x... +Etsitään hakemistoa %x... Cannot read file attributes of %x. Tiedoston %x määritteitä ei voitu lukea. @@ -181,9 +205,39 @@ Creating file %x Luodaan tiedosto %x +Items processed: +Osia käsitelty: + +Items remaining: +Osia jäljellä: + +Total time: +Kokonaisaika: + + +1 Byte +%x Bytes + + +1 tavu +%x tavua + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Virhe jäsennys tiedo %x, rivi %y, sarake %z. +Cannot set directory lock for %x. +Hakemiston %x lukitus ei onnistu. + Scanning: Skannaus: @@ -202,12 +256,18 @@ /sec /s -File %x does not contain a valid configuration. -Tiedosto %x ei sisällä kelvollista kokoonpanoa. - Configuration file %x loaded partially only. Kokoonpanotiedosto %x ladattu vain osittain. +Show in Explorer +Näytä Explorerissa + +Open with default application +Avaa oletussovelluksessa + +Browse directory +Selaa hakemistoa + Cannot access Volume Shadow Copy Service. Ei voi käyttää Volume Shadow Copy Service. @@ -217,18 +277,21 @@ Cannot load file %x. Tiedostoa %x ei voida ladata. -Path %x does not contain a volume name. -Polku %x ei sisällä taltion nimeä. +Cannot determine volume name for %x. +Nimen %x tunnistus ei onnistu. + +Volume name %x not part of file name %y. +Taltion nimi %x ei esiinny tiedostonimessä %y. -Volume name %x not part of file name %y! -Taltion nimi %x ei esiinny tiedostonimessä %y! +Abort requested: Waiting for current operation to finish... +Keskeytys pyydetty: Odotetaan toiminnon loppumista... + +Failure to create timestamp for versioning: +Ongelma luoda aikaleimaa versionnissa: Cannot read the following XML elements: XML elementit lukukelvottimia: -Cannot find file %x. -Tiedosto %x ei löydy. - &Open... &Avaa... @@ -309,9 +372,18 @@ Käsky suoritetaan jos: Cancel Lopeta +RealtimeSync - Automated Synchronization +RealtimeSync - Automaattisoitu täsmäytys + +Warning +Varoitus + Build: %x Versio: %x +About +Ohje + All files Kaikki tiedostot @@ -321,29 +393,125 @@ Käsky suoritetaan jos: &Exit &Poistu -Monitoring active... -Seuranta käynnissä... - Waiting for missing directories... Odottaa puuttuvia hakemistoja... -A folder input field is empty. -Hakemiston syöte on tyhjä. +Invalid command line: +Virheellinen komentokehote: + +File content +Tiedoston sisältö + +File time and size +Tiedoston aika ja koko + + Two way + Molemmat + +Mirror +Peilaava + +Update +Päivittävä + +Custom +Oma määritelmä + +Multiple... +Moninkertainen... + +Moving file %x to %y +Siirrä tiedosto %x -> %y + +Moving folder %x to %y +Siirrä hakemisto %x -> %y + +Moving symbolic link %x to %y +Siirrä pikakuvike %x -> %y + +Removing old versions... +Vanhat poistetaa... + +Creating symbolic link %x +Luodaan pikakuvake %x + +Creating folder %x +LuoDAAN hakemisto %x + +Overwriting file %x +Korvaa tiedosto %x + +Overwriting symbolic link %x +Korvaa pikakuvake %x + +Verifying file %x +Tarkistan tiedostoa %x + +Updating attributes of %x +Päivitän %x:n ominaisuudet + +Cannot find %x. +%x ei löydy. + +Target folder %x already existing. +Kohdehakemisto %x on olemassa. + +Target folder input field must not be empty. +Kohde hakemiston kenttä on annettava. + +Folder input field for versioning must not be empty. +Kohde hakemiston version syötettävä. + +Source folder %x not found. +Lähdehakemisto %x ei löydy. + +The following items have unresolved conflicts and will not be synchronized: +Näissä kohteissa on selvittämättömiä ristiriitoja, niitä ei täsmäytetä: + +Significant difference detected: +Merkittävä eroavavuus todettu: + +More than 50% of the total number of files will be copied or deleted. +Yli 50% tiedostoista kopioidaan tai poistetaan. + +Not enough free disk space available in: +Vapaa levytila ei riitä: + +Required: +Vaadittu: + +Available: +Saatavilla: -Synchronization aborted! -Täsmäytys lopetettiin! +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Moniosaisen hakemistoparin hakemistoa muutetaan. Tarkista täsmäytyksen asetuksia. -Synchronization completed with errors! -Täsmäytys päättyi virheisiin! +Synchronizing folder pair: +Täsmäytetään hakemistoparia: + +Generating database... +Tietokanta luodaan... + +Creating Volume Shadow Copy for %x... +Luodaan Volume Shadow Copy %x:lle... -Synchronization completed with warnings. -Täsmäytys päättyi varoituksin. +Data verification error: %x and %y have different content. +Tiedon verifiointie virhe: %x ja %y sisältö on erilainen. -Nothing to synchronize! -Ei mitään täsmäytettävää! +Synchronization aborted +Täsmäytys lopetettiin -Synchronization completed successfully. -Täsmäytys päättyi onnistuneesti. +Synchronization completed with errors +Täsmäytys päättyi virheisiin + +Synchronization completed with warnings +Täsmäytys päättyi varoituksin + +Nothing to synchronize +Ei mitään täsmäytettävää + +Synchronization completed successfully +Täsmäytys päättyi onnistuneesti Saving log file %x... Lokitiedosto: tallennetaan %x... @@ -351,8 +519,8 @@ Käsky suoritetaan jos: Press "Switch" to resolve issues in FreeFileSync main dialog. Paina "Vaihda" ja korjaa virheet FreeFileSync päävalintaikkunassa -Switching to FreeFileSync main dialog... -Siiry FreeFileSync päävalintaikkunaan ... +Switching to FreeFileSync main dialog +Siirry FreeFileSync perusikkunaan A new version of FreeFileSync is available: FreeFileSync:n uusi verio on saatavilla: @@ -360,29 +528,29 @@ Käsky suoritetaan jos: Download now? Lataa nyt? -FreeFileSync is up to date! -FreeFileSync on ajan tasalla! +New version found +Uusi versio saatavilla -Information -Tietoja +&Download +&Lataa -Unable to connect to sourceforge.net! -Yhteys sourceforge.net:n ei onnistu! +FreeFileSync is up to date. +FreeFileSync on ajan tasalla. -Current FreeFileSync version number was not found online! Do you want to check manually? -Nykyinen FreeFileSync versionumero ei löytynyt online! Haluatko tarkistaa manuaalisesti? +Information +Tietoja -Do you want FreeFileSync to automatically check for updates every week? -Haluatko että FreeFileSync hakee päivityksiä automaattisesti viikoittain? +Unable to connect to sourceforge.net. +Yhteys sourceforge.net:n ei onnistu. -(Requires an Internet connection!) -(Vaatii Internet-yhteyden!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Nykyinen FreeFileSync versio ei löydy verkosta, etsitäänkö manuaalisesti? - - +Symlink +Pikakuvake - - +Folder +Hakemisto Full path Koko polku @@ -405,18 +573,12 @@ Käsky suoritetaan jos: Extension Laajennus -Size: -Koko: - -Date: -Pvm: +Category +Luokka Action Suorita -Category -Luokka - Drag && drop Vedä ja pudota @@ -435,11 +597,38 @@ Käsky suoritetaan jos: Hibernate Horrostila +Selected variant: +Valitse tyyppi: + +Select alternate comparison settings +Muuta vertailun asetusta + +Select alternate synchronization settings +Muuta täsmäytyksen asetus + +Filter is active +Suodin aktivoitu + +No filter selected +Suodin valitsematta + +Remove alternate settings +Poista muut asetukset + +Clear filter settings +Nollaa suodin + +Copy +Monista + +Paste +Liitä + &New &Uusi &Save -Tallenna +&Tallenna Save as &batch job... Tallenna &eräajona... @@ -453,14 +642,14 @@ Käsky suoritetaan jos: &Language &Kieli -&Global settings... -&Yleiset asetukset... - &Export file list... &Vie tiedostojoukko... -&Advanced -&Laajennettu +&Global settings... +&Yleiset asetukset... + +&Tools +&Asetukset &Check now &Tarkista nyt @@ -468,12 +657,18 @@ Käsky suoritetaan jos: Check &automatically once a week Tarkista &viikoittain -Check for new version -Tarkita onko uudempaa +Check for new &version +Onko uusi &versio saatavilla Compare Vertaile +Comparison settings +Vertailun asetukset + +Synchronization settings +Täsmäytyksen asetukset + Synchronize Täsmäytä @@ -486,6 +681,9 @@ Käsky suoritetaan jos: Swap sides Puolten vaihto +Save as batch job +Tallenna eräajona + Hide excluded items Piilota ohitettavat @@ -528,52 +726,7 @@ Käsky suoritetaan jos: &Pause &Keskeytä -Batch job -Eräajo - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Täsmäytyken automatisoinnen eräajotiedoston teko. Tehtävien ajoitus; Tuplaklikkaa tai ajoita tämä tiedosto: FreeFileSync.exe .ffs_batch - -Help -Ohje - -Error handling -Virheiden käsittely - -Ignore -Ohita - -Hide all error and warning messages -Piilota kaikki virhe- ja varoitusviestit - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Näytä Pop-Up (virheet/varoitukset) - -Exit -Poistu - -Abort synchronization on first error -Keskeytä täsmäytys ensimmäisestä virheestä - -Show progress dialog -Näytä etenemä ikkuna - -Save log -Tallenna loki - -Select folder to save log files -Valitse tallennushakemisto lokeille - -Limit -Raja - -Limit maximum number of log files -Lokeja enintäin - -Select variant +Select a variant Valitse tyyppi @@ -589,9 +742,6 @@ Tiedostot samat jos ovat samat -File time and size -Tiedoston aika ja koko - Files are found equal if - file content @@ -603,39 +753,42 @@ Tiedostot samat jos, on sama -File content -Tiedoston sisältö - Symbolic Link handling Pikakuvakkeiden hallinta +Help +Ohje + OK OK -<- Two way -> -<- Molemmat -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Löydä ja suorita muutokset molemmilla puolilla. Poistot, siirrot ja eroavuudet tunnistetaan tietokannan avulla. -Mirror ->> -Peilaava ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Vasemman peilaava varmuuskopio. Oikeanpuoleinen hakemisto muutetaan täsmäytyksessä vastaamaan tarkasti vasenta. -Update -> -Päivittävä -> - Copy new or updated files to right folder. Kopioi uudet tai päivitetyt tiedostot oikeaan kansioon. -Custom -Oma määritelmä - Configure your own synchronization rules. Määritä omat täsmäytyssäännöt. +Error handling +Virheiden käsittely + +Ignore +Ohita + +Hide all error and warning messages +Piilota kaikki virhe- ja varoitusviestit + +Pop-up +Pop-up + +Show pop-up on errors or warnings +Näytä Pop-Up (virheet/varoitukset) + Deletion handling Poistotapa @@ -660,23 +813,32 @@ on sama Naming convention: Nimeämis käytäntö: -Item exists on left side only -Kohde löytyy vain vasemmalta +Batch job +Eräajo + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Täsmäytyken automatisoinnen eräajotiedoston teko. Tehtävien ajoitus; Tuplaklikkaa tai ajoita tämä tiedosto: FreeFileSync.exe .ffs_batch + +Exit +Poistu + +Abort synchronization on first error +Keskeytä täsmäytys ensimmäisestä virheestä -Item exists on right side only -Kohde löytyy vain oikealta +Show progress dialog +Näytä etenemä ikkuna -Left side is newer -Uudempi vasemmalla +Save log +Tallenna loki -Right side is newer -Uudempi oikealla +Select folder to save log files +Valitse tallennushakemisto lokeille -Items have different content -Kohteilla eri sisältö +Limit +Raja -Conflict/item cannot be categorized -Ristiriita, ei määriteltävissä +Limit maximum number of log files +Lokeja enintäin Source code written in C++ using: Koodikieli on C++ käyttäen: @@ -696,9 +858,6 @@ on sama Homepage Kotisivu -FreeFileSync at Sourceforge -FreeFileSync Sourceforge:lla - Email S-posti @@ -713,11 +872,11 @@ on sama Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Vain tiedostot, jotka vastaavat kaikkia suodattimen asetuksia synkronoidaan. -Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! +Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin. Include @@ -741,6 +900,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! &Clear &Pyyhi +Global settings +Yleiset asetukset + Fail-safe file copy Varmennettu tiedostokopiointi @@ -771,9 +933,6 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! &Default &Vakio -Start synchronization -Käynnistä täsmäytys - Variant Vaihtoehto @@ -792,8 +951,20 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! &Find next &Etsi seuraava -Main bar -Pääpalkki +Delete +Poista + +Configure filter +Määritä suodin + +Start synchronization +Käynnistä täsmäytys + +Find +Etsi + +Select time span +Valitse aikajana Folder pairs Hakemistoparit @@ -804,6 +975,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Configuration Asetukset +Main bar +Pääpalkki + Filter files Suodata tiedostot @@ -858,11 +1032,8 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Exclude via filter: Sulje pois suotimella: - - - -Delete -Poista +multiple selection +monivalinta Include all Valitse kaikki @@ -891,14 +1062,14 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Show "%x" Näytä "%x" - - +Last session +Edellinen istunto Folder Comparison and Synchronization Hakemistojen vertailu ja täsmäytys -Configuration saved! -Asetukset tallennettu! +Configuration saved +Asetukset tallennettu FreeFileSync batch FreeFileSync eräajo @@ -907,14 +1078,11 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Haluatko tallentaa muutokset: %x? Do&n't save -Älä tallenna +Äl&ä tallenna Never save changes Älä tallenna muutoksia -Configuration loaded! -Asetukset ladattu! - Show files that exist on left side only Näytä vain vasemmalla esiintyvät tiedostot @@ -960,20 +1128,17 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Set as default Aseta oletukseksi -Operation aborted! -Toiminto lopetettiin! +Operation aborted +Toiminto lopetettiin -All folders are in sync! -Kaikki hakemistot täsmäytetty! +All folders are in sync +Kaikki hakemistot täsmäytetty Comma separated list CSV-muotoinen lista -Legend -Selite - -File list exported! -Tiedostolista viety! +File list exported +Tiedostolista viety Searching for program updates... Ohjelmapäivytys haetaa... @@ -984,6 +1149,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! &Ignore &Unohda +Fatal Error +Kohtalokas virhe + Don't show this warning again Älä enää näytä varoitusta @@ -1005,6 +1173,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Comparing content... Sisällön vertailu... +Info +Info + Paused Pysäytetty @@ -1107,18 +1278,18 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Leave as unresolved conflict Jätä ratkaisemattomana virheenä -Time stamp -Aikaleima - -Append a timestamp to each file name -Lisää aikaleima tiedostoihin - Replace Korvaa Move files and replace if existing Siirrä tiedostot ja korvaa olemassaolevat +Time stamp +Aikaleima + +Append a timestamp to each file name +Lisää aikaleima tiedostoihin + Folder Hakemisto @@ -1161,9 +1332,6 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Cannot write modification time of %x. Tiedoston %x muutosaikaa ei voida kirjoittaa. -Cannot find system function %x. -Järjestelmäfunktio ei löydy, %x - Cannot read security context of %x. Ei voi lukea %x -suojauskontekstia. @@ -1179,8 +1347,11 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Cannot create directory %x. Hakemistoa %x ei voitu luoda. -Cannot copy symbolic link %x to %y. -Pikakuviketta %x ei voida kopioida kohtaan %y. +Cannot create symbolic link %x. +Pikakuvikkeen luonti epäonnistui %x. + +Cannot find system function %x. +Järjestelmäfunktio ei löydy, %x Cannot copy file %x to %y. Tiedostoa %x ei voida kopioida kohtaan %y. @@ -1188,15 +1359,15 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Type of item %x is not supported: Kohteen %x tyyppiä ei tueta: +Cannot resolve symbolic link %x. +Tämä linkki on virheellinen %x. + Cannot open directory %x. Hakemistoa %x ei voida avata. Cannot enumerate directory %x. Hakemistoa %x ei voitu luetella. -Detected endless directory recursion. -Päättymätön hakemiston toisto. - %x TB %x TB @@ -1230,6 +1401,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! %x päivää +Failed to register to receive system messages. +Järjestelmäviestien vastaanottoa ei voitu aktivoida. + Cannot set privilege %x. Oikeuksia %x ei voitu asettaa. @@ -1239,204 +1413,12 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin! Cannot change process I/O priorities. Prosessin I/O -pririteetin muutos ei onnistu. -Unable to move %x to the Recycle Bin! -Ei voitu siirtää %x Roskakoriin! - -Both sides have changed since last synchronization! -Molemmat puolet muuttuneet edellisestä täsmäyksestä! - -Cannot determine sync-direction: -Tuntematon suunta täsmäykselle: - -No change since last synchronization! -Ei muutoksia edellisen täsmäyksen jälkeen! - -The corresponding database entries are not in sync considering current settings. -Käytetyn tietokannan tiedot eivät täsmää nykyisiin asetuksiin. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Aseta oletussuunta täsmäykselle: Vanhat tiedostot korvataan uudemilla tiedostoilla. - -Checking recycle bin availability for folder %x... -Tarkistetaan Roskakorin käyttö hakemistolle %x... - -Moving file %x to recycle bin -Siirrä tiedosto %x roskakoriin - -Moving folder %x to recycle bin -Siirrä hakemisto %x roskakoriin - -Moving symbolic link %x to recycle bin -Siirrä pikakuvake %x roskakoriin - -Deleting file %x -Poista tiedosto %x - -Deleting folder %x -Poista hakemisto %x - -Deleting symbolic link %x -Pistetaan pikakuvake %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Roskakori puuttuu näistä polusta! Tiedostot poistetaan pysyvästi: - -The corresponding folder will be considered as empty. -Hakemisto tulkitaan tyhjäksi. - -Cannot find the following folders: -Hakemistot ei löydy: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Voit ohita virhe olettamalla hakemistot tyhjiksi. Hakemistot luodaan täsmäytyksen aikana. - -Directories are dependent! Be careful when setting up synchronization rules: -Hakemistot riippuvuussuhteessa! Aseta täsmäyssääntöjä varovasti: - -Start comparison -Käynnistä vertailu - -Calculating sync directions... -Lasketaa täsmäytyksen suuntaa... - -Conflict detected: -Ristiriita todettu: - -File %x has an invalid date! -Tiedostolla %x on virheellinen päiväys! - -Files %x have the same date but a different size! -Tiedostoilla %x on sama päiväys mutta eri koko! - -Items differ in attributes only -Kohteiden eroaa vain määritteissä - -Symbolic links %x have the same date but a different target. -Pikakuvikeilla %x on sama päiväys mutta osoittavat eri kohtiin. - -Comparing content of files %x -Vertaa tiedostojen %x tietosisältöä - -Comparing files by content failed. -Tietosisällön vertailu epäonnistui. - -Generating file list... -Luodaan tiedostolista... - -Both sides are equal -Puolet ovat identtiset - -Copy new item to left -Monista uusi vasemmalle - -Copy new item to right -Monista uusi oikealle - -Delete left item -Poista vasen - -Delete right item -Poista oikea - -Move file on left -Siirä vasen tiedosto - -Move file on right -Siirrä oikea tiedosto - -Overwrite left item -Korvaa vasen - -Overwrite right item -Korvaa oikea - -Do nothing -Älä tee mitään - -Update attributes on left -Päivitä oikeudet vasemmalla - -Update attributes on right -Päivitä oikeudet oikealla - -Multiple... -Moninkertainen... - -Moving file %x to %y -Siirrä tiedosto %x -> %y - -Moving folder %x to %y -Siirrä hakemisto %x -> %y - -Moving symbolic link %x to %y -Siirrä pikakuvike %x -> %y - -Removing old versions... -Vanhat poistetaa... - -Creating symbolic link %x -Luodaan pikakuvake %x - -Creating folder %x -LuoDAAN hakemisto %x - -Overwriting file %x -Korvaa tiedosto %x - -Overwriting symbolic link %x -Korvaa pikakuvake %x - -Verifying file %x -Tarkistan tiedostoa %x - -Updating attributes of %x -Päivitän %x:n ominaisuudet - -Cannot find %x. -%x ei löydy. - -Target folder %x already existing. -Kohdehakemisto %x on olemassa. - -Target folder input field must not be empty. -Kohde hakemiston kenttä on annettava. - -Folder input field for versioning must not be empty. -Kohde hakemiston version syötettävä. +Unable to move %x to the Recycle Bin. +Ei voitu siirtää %x Roskakoriin. -Source folder %x not found. -Lähdehakemisto %x ei löydy. - -The following items have unresolved conflicts and will not be synchronized: -Näissä kohteissa on selvittämättömiä ristiriitoja, niitä ei täsmäytetä: - -Significant difference detected: -Merkittävä eroavavuus todettu: - -More than 50% of the total number of files will be copied or deleted! -Yli 50% tiedostoista kopioidaan tai poistetaan! - -Not enough free disk space available in: -Vapaa levytila ei riitä: - -Required: -Vaadittu: - -Available: -Saatavilla: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Moniosaisen hakemistoparin hakemistoa muutetaan. Tarkista täsmäytyksen asetuksia. - -Synchronizing folder pair: -Täsmäytetään hakemistoparia: +Cannot determine final path for %x. +Polkua ei voida määrittää, %x. -Generating database... -Tietokanta luodaan... - -Creating Volume Shadow Copy for %x... -Luodaan Volume Shadow Copy %x:lle... - -Data verification error: Source and target file have different content! -Tiedon varmennusvirhe: Lähteellä ja kohteella on eri sisältö! +Error Code %x: +Virhe %x: diff --git a/BUILD/Languages/french.lng b/BUILD/Languages/french.lng index b6f7d90d..0a720f41 100644 --- a/BUILD/Languages/french.lng +++ b/BUILD/Languages/french.lng @@ -1,137 +1,164 @@
- Français + Français Jean-François Hartmann fr_FR - france.png - 2 - n <= 1 ? 0 : 1 + flag_france.png + 2 + n <= 1 ? 0 : 1
-Searching for folder %x... -Recherche du dossier %x... +Both sides have changed since last synchronization. +Les deux côtés ont changé depuis la dernière synchronisation. -Items processed: -Elements traités : +Cannot determine sync-direction: +Impossible de déterminer le sens de la synchro : -Items remaining: -Elements restants : +No change since last synchronization. +Aucun changement depuis la dernière synchronisation. -Total time: -Durée totale : +The database entry is not in sync considering current settings. +L'entrée de la base de données n'est pas en phase compte tenu des paramètres actuels. -Cannot set directory lock for %x. -Impossible de verrouiller le dossier %x +Setting default synchronization directions: Old files will be overwritten with newer files. +Directions de la synchronisation par défaut : les anciens fichiers seront remplacés par les nouveaux. -Show in Explorer -Montrer dans l'explorateur +Checking recycle bin availability for folder %x... +Contrôle de la disponibilité de la Corbeille pour le dossier %x ... -Open with default application -Ouvrir avec l'application par défaut +Moving file %x to recycle bin +Envoi du fichier %x dans la corbeille -Browse directory -Parcourir le répertoire +Moving folder %x to recycle bin +Envoi du dossier %x dans la corbeille -Abort requested: Waiting for current operation to finish... -Abandon demandé : En attente de la fin de l'opération en cours... +Moving symbolic link %x to recycle bin +Envoi du lien symbolique %x dans la corbeille -Failure to create timestamp for versioning: -Impossible de créer l'horodatage des versions +Deleting file %x +Suppression du fichier %x -RealtimeSync - Automated Synchronization -RealtimeSync - Synchronisation Automatisée +Deleting folder %x +Suppression du dossier %x + +Deleting symbolic link %x +Suppression du lien symbolique %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +La Corbeille est inaccessible pour les dossiers suivants. Les fichiers seront donc détruits définitivement. + +An exception occurred +Une erreur s'est produite + +Cannot find file %x. +Impossible de trouver le fichier %x. Error Erreur -Selected variant: -Variante choisie : +File %x does not contain a valid configuration. +Le fichier %x ne contient pas une configuration valide. -Select alternate comparison settings -Choisir d'autres paramètres de comparaison +A folder input field is empty. +Une entrée dossier est vide. -Select alternate synchronization settings -Sélectionner une autre configuration de la synchronisation +The corresponding folder will be considered as empty. +Le dossier correspondant sera considéré comme vide. -Filter is active -Le filtre est actif +Cannot find the following folders: +Impossible de trouver les dossiers suivants : -No filter selected -Aucun filtre sélectionné +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Vous pouvez ignorer cette erreur en considérant chaque dossier comme vide. Les dossiers seront automatiquement créés pendant la synchronisation. -Remove alternate settings -Supprimer les paramètres de rechange +The following folders have dependent paths. Be careful when setting up synchronization rules: +Les fichiers suivants ont des chemins interdépendants. Attention à la mise à jour des règles de synchronisation : -Clear filter settings -Effacer la configuration du filtrage +File %x has an invalid date. +Le fichier %x a une date invalide. -Copy -Copier +Date: +Date : -Paste -Coller +Files %x have the same date but a different size. +Les fichiers %x ont la même date mais une taille différente. -Save as batch job -Enrgistrer en temps que fichier batch +Size: +Taille : -Comparison settings -Paramètres de comparaison +Items differ in attributes only +Seuls les attributs des éléments diffèrent -Synchronization settings -Paramétrage de la synchronisation +Resolving symbolic link %x +Résolution du lien symbolique %x -About -A propos de +Comparing content of files %x +Comparaison du contenu des fichiers %x -Confirm -Confirmation +Generating file list... +Génération de la liste des fichiers... -Configure filter -Configuration des filtres +Starting comparison +Comparaison en cours -Global settings -Paramètres généraux +Calculating sync directions... +Evaluation du sens des synchronisations ... -Find -Chercher +Out of memory. +Mémoire insuffisante. -Select time span -Choisir un intervalle de temps +Item exists on left side only +Cet élément existe seulement à gauche -Invalid command line: -Ligne de commande incorrecte : +Item exists on right side only +Cet élément existe seulement à droite -Info -Info +Left side is newer +L'élément de gauche est plus récent -Warning -Attention +Right side is newer +L'élément de droite est plus récent -Fatal Error -Erreur Fatale +Items have different content +Les élement ont un contenu différent -Error Code %x: -Code erreur %x : +Both sides are equal +Les deux cotés sont identiques -Cannot resolve symbolic link %x. -Impossible de résoudre le lien symbolique %x. +Conflict/item cannot be categorized +Conflit/élément impossible à classer - -1 Byte -%x Bytes - - -%x octet -%x octets - +Copy new item to left +Copie du nouvel élément à gauche -%x MB -%x Mo +Copy new item to right +Copie du nouvel élément à droite -%x KB -%x Ko +Delete left item +Suppression de l'élément de gauche -%x GB -%x Go +Delete right item +Suppression de l'élément de droite + +Move file on left +Déplacer les fichiers à gauche + +Move file on right +Déplacer les fichiers à droite + +Overwrite left item +Remplacement de l'élément de gauche + +Overwrite right item +Remplacement de l'élément de droite + +Do nothing +Ne rien faire + +Update attributes on left +Mise à jour des attributs à gauche + +Update attributes on right +Mise à jour des attributs à droite Database file %x is incompatible. La base de données %x n'est pas compatible. @@ -145,9 +172,6 @@ Database file is corrupt: Le fichier Base de données est endommagé : -Out of memory! -Mémoire insuffisante ! - Cannot write file %x. Impossible d'écrire le fichier %x. @@ -157,8 +181,8 @@ Database files do not share a common session. Les fichiers de la base de données ne font pas partie de la même session. -An exception occurred! -Une erreur s'est produite ! +Searching for folder %x... +Recherche du dossier %x... Cannot read file attributes of %x. Impossible de lire les attributs du fichier %x. @@ -181,9 +205,39 @@ Creating file %x Création du fichier %x +Items processed: +Elements traités : + +Items remaining: +Elements restants : + +Total time: +Durée totale : + + +1 Byte +%x Bytes + + +%x octet +%x octets + + +%x MB +%x Mo + +%x KB +%x Ko + +%x GB +%x Go + Error parsing file %x, row %y, column %z. Erreur lors de l'analyse du fichier %x, ligne %y, colonne %z. +Cannot set directory lock for %x. +Impossible de verrouiller le dossier %x + Scanning: Lecture en cours : @@ -202,12 +256,18 @@ /sec /sec -File %x does not contain a valid configuration. -Le fichier %x ne contient pas une configuration valide. - Configuration file %x loaded partially only. Le fichier de configuration %x a été chargé seulement partiellement. +Show in Explorer +Montrer dans l'explorateur + +Open with default application +Ouvrir avec l'application par défaut + +Browse directory +Parcourir le répertoire + Cannot access Volume Shadow Copy Service. Impossible d'accéder au service Volume Shadow Copy @@ -217,18 +277,21 @@ Cannot load file %x. Impossible de charger le fichier %x. -Path %x does not contain a volume name. -Le chemin %x ne contient pas de nom de volume. +Cannot determine volume name for %x. +Impossible de déterminer le nom du volume de %x. -Volume name %x not part of file name %y! -Le nom de volume %x ne fait pas partie du nom de fichier %y ! +Volume name %x not part of file name %y. +Le nom de volume %x ne fait pas partie du nom de fichier %y. + +Abort requested: Waiting for current operation to finish... +Abandon demandé : En attente de la fin de l'opération en cours... + +Failure to create timestamp for versioning: +Impossible de créer l'horodatage des versions Cannot read the following XML elements: Impossible de lire les données XML suivantes : -Cannot find file %x. -Impossible de trouver le fichier %x. - &Open... &Ouvrir... @@ -309,9 +372,18 @@ La commande est déclenchée si : Cancel Annuler +RealtimeSync - Automated Synchronization +RealtimeSync - Synchronisation Automatisée + +Warning +Attention + Build: %x Généré : %x +About +A propos de + All files Tous les fichiers @@ -321,28 +393,124 @@ La commande est déclenchée si : &Exit &Quitter -Monitoring active... -Surveillance en cours... - Waiting for missing directories... En attente des répertoires absents ... -A folder input field is empty. -Une entrée dossier est vide. +Invalid command line: +Ligne de commande incorrecte : + +File content +Contenu du fichier + +File time and size +Date et taille du fichier + + Two way + Deux sens + +Mirror +Miroir + +Update +Mise à Jour + +Custom +Personnaliser + +Multiple... +Multiple... + +Moving file %x to %y +Déplacement du fichier %x vers %y + +Moving folder %x to %y +Déplacement du dossier %x vers %y + +Moving symbolic link %x to %y +Déplacement du lien symbolique %x vers %y + +Removing old versions... +Suppression des anciennes versions... + +Creating symbolic link %x +Création du lien symbolique %x + +Creating folder %x +Création du dossier %x + +Overwriting file %x +Remplacement du fichier %x + +Overwriting symbolic link %x +Remplacement du lien symbolique %x + +Verifying file %x +Contrôle du fichier %x + +Updating attributes of %x +Mise à jour des attributs de %x + +Cannot find %x. +Impossible de trouver %x + +Target folder %x already existing. +Le dossier destination %x existe déjà. + +Target folder input field must not be empty. +L'entrée dossier de destination ne doit pas être vide. + +Folder input field for versioning must not be empty. +L'entrée dossier de gestion des versions ne doit pas être vide. + +Source folder %x not found. +Dossier source %x non trouvé. + +The following items have unresolved conflicts and will not be synchronized: +Les éléments suivants sont en conflit non résolu et ne seront pas synchronisés : + +Significant difference detected: +Différence significative détectée : + +More than 50% of the total number of files will be copied or deleted. +Plus de 50% des fichiers seront copiés ou détruits. + +Not enough free disk space available in: +Espace disque insuffisant sur : -Synchronization aborted! -Synchronisation abandonnée ! +Required: +Requis : + +Available: +Disponible : -Synchronization completed with errors! -Synchronisation terminée avec des erreurs ! +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Un dossier faisant partie de paires multiples sera modifié. Veuillez vérifier les paramètres de synchronisation. -Synchronization completed with warnings. +Synchronizing folder pair: +Synchronisation de la paire de dossiers + +Generating database... +Génération de la base de données... + +Creating Volume Shadow Copy for %x... +Création d'un Volume Shadow Copy pour %x ... + +Data verification error: %x and %y have different content. +Erreur lors de la vérification des données : %x et %y ont des contenus différents. + +Synchronization aborted +Synchronisation abandonnée + +Synchronization completed with errors +Synchronisation terminée avec des erreurs + +Synchronization completed with warnings Synchronisation terminée avec avertissements -Nothing to synchronize! -Rien à synchroniser ! +Nothing to synchronize +Rien à synchroniser -Synchronization completed successfully. +Synchronization completed successfully Synchronisation terminée sans erreurs Saving log file %x... @@ -351,8 +519,8 @@ La commande est déclenchée si : Press "Switch" to resolve issues in FreeFileSync main dialog. Cliquez sur "Permuter" pour résoudre les problèmes dans l'écran principal de FreeFileSync. -Switching to FreeFileSync main dialog... -Passage à l'écran principal de FreeFileSync... +Switching to FreeFileSync main dialog +Passage à la fenêtre principale de FreeFileSync A new version of FreeFileSync is available: Une nouvelle version de FreeFileSync est disponible @@ -360,29 +528,29 @@ La commande est déclenchée si : Download now? Télécharger maintenant ? -FreeFileSync is up to date! -FreeFileSync est à jour ! +New version found +Une nouvelle version a été trouvée -Information -Information +&Download +&Télécharger -Unable to connect to sourceforge.net! -Impossible de se connecter à sourceforge.net ! +FreeFileSync is up to date. +FreeFileSync est à jour. -Current FreeFileSync version number was not found online! Do you want to check manually? -Le numéro de la version actuelle de FreeFileSync n'a pas été trouvé en ligne ! Voulez-vous le rechercher manuellement ? +Information +Information -Do you want FreeFileSync to automatically check for updates every week? -Voulez-vous que FreeFileSync recherche automatiquement une nouvelle version chaque semaine ? +Unable to connect to sourceforge.net. +Impossible de se connecter à sourceforge.net. -(Requires an Internet connection!) -(Nécessite une connexion Internet) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Impossible de trouver en ligne une nouvelle version de FreeFileSync.Voulez-vous le faire manuellement ? - - +Symlink +Lien symbolique - - +Folder +Dossier Full path Chemin complet @@ -405,18 +573,12 @@ La commande est déclenchée si : Extension Extension -Size: -Taille : - -Date: -Date : +Category +Catégorie Action Action -Category -Catégorie - Drag && drop Glisser && Déposer @@ -435,6 +597,33 @@ La commande est déclenchée si : Hibernate Figer +Selected variant: +Variante choisie : + +Select alternate comparison settings +Choisir d'autres paramètres de comparaison + +Select alternate synchronization settings +Sélectionner une autre configuration de la synchronisation + +Filter is active +Le filtre est actif + +No filter selected +Aucun filtre sélectionné + +Remove alternate settings +Supprimer les paramètres de rechange + +Clear filter settings +Effacer la configuration du filtrage + +Copy +Copier + +Paste +Coller + &New &Nouveau @@ -453,14 +642,14 @@ La commande est déclenchée si : &Language &Langue -&Global settings... -&Paramètres généraux... - &Export file list... &Exportation de la liste des fichiers... -&Advanced -&Avancé +&Global settings... +&Paramètres généraux... + +&Tools +Ou&tils &Check now &Contrôler maintenant @@ -468,12 +657,18 @@ La commande est déclenchée si : Check &automatically once a week Contrôler &automatiquement une fois par semaine -Check for new version -Rechercher une nouvelle version +Check for new &version +Existence d'une nouvelle &version Compare Comparer +Comparison settings +Paramètres de comparaison + +Synchronization settings +Paramétrage de la synchronisation + Synchronize Synchroniser @@ -486,6 +681,9 @@ La commande est déclenchée si : Swap sides Permuter les côtés +Save as batch job +Enrgistrer en temps que fichier batch + Hide excluded items Cacher les éléments exclus @@ -528,52 +726,7 @@ La commande est déclenchée si : &Pause &Pause -Batch job -Traitement batch - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Créer un fichier batch pour automatiser la synchronisation. Double-cliquez sur ce fichier ou entrez-le dans le planificateur de tâches : FreeFileSync.exe .ffs_batch - -Help -Aide - -Error handling -Erreur de gestion de fichiers - -Ignore -Ignorer - -Hide all error and warning messages -Masquer tous les messages d'erreurs et les avertissements - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Montrer les messages d'avertissement ou d'erreur - -Exit -Quitter - -Abort synchronization on first error -Abandonner la synchronisation dès la première erreur - -Show progress dialog -Montrer la fenêtre de progression - -Save log -Sauvegarder le fichier log - -Select folder to save log files -Choisir le dossier de sauvegarde des fichiers log - -Limit -Limite - -Limit maximum number of log files -Nombre maximal de fichiers log - -Select variant +Select a variant Choisir une variante @@ -589,9 +742,6 @@ Les fichiers sont considérés comme identiques si sont les mêmes -File time and size -Date et taille du fichier - Files are found equal if - file content @@ -603,39 +753,42 @@ Les fichiers sont considérés comme identiques si est identique -File content -Contenu du fichier - Symbolic Link handling Gestion des Liens Symboliques +Help +Aide + OK OK -<- Two way -> -<- Deux sens -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identifier et propager les modifications des deux côtés. Suppressions, déplacements et conflits sont détectés automatiquement en utilisant une base de données. -Mirror ->> -Miroir ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Copie miroir du dossier de gauche. Le dossier de droite est modifié pour être strictement identique après la synchronisation. -Update -> -Mise à Jour -> - Copy new or updated files to right folder. Copie les fichiers nouveaux ou modifiés dans le dossier de droite. -Custom -Personnaliser - Configure your own synchronization rules. Paramétrage de vos règles de synchronisation. +Error handling +Erreur de gestion de fichiers + +Ignore +Ignorer + +Hide all error and warning messages +Masquer tous les messages d'erreurs et les avertissements + +Pop-up +Pop-up + +Show pop-up on errors or warnings +Montrer les messages d'avertissement ou d'erreur + Deletion handling Gestion des suppressions @@ -660,23 +813,32 @@ est identique Naming convention: Convention de nommage : -Item exists on left side only -Cet élément existe seulement à gauche +Batch job +Traitement batch + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Créer un fichier batch pour automatiser la synchronisation. Double-cliquez sur ce fichier ou entrez-le dans le planificateur de tâches : FreeFileSync.exe .ffs_batch + +Exit +Quitter + +Abort synchronization on first error +Abandonner la synchronisation dès la première erreur -Item exists on right side only -Cet élément existe seulement à droite +Show progress dialog +Montrer la fenêtre de progression -Left side is newer -L'élément de gauche est plus récent +Save log +Sauvegarder le fichier log -Right side is newer -L'élément de droite est plus récent +Select folder to save log files +Choisir le dossier de sauvegarde des fichiers log -Items have different content -Les élement ont un contenu différent +Limit +Limite -Conflict/item cannot be categorized -Conflit/élément impossible à classer +Limit maximum number of log files +Nombre maximal de fichiers log Source code written in C++ using: Code source écrit en C++ utilisant : @@ -696,9 +858,6 @@ est identique Homepage Accueil -FreeFileSync at Sourceforge -FreeFileSync par Sourceforge - Email Email @@ -713,11 +872,11 @@ est identique Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Seuls les fichiers correspondant à tous les paramètres de filtrage seront synchronisés. -Attention : les noms de fichiers doivent être relatifs aux répertoires de base ! +Attention : les noms de fichiers doivent être relatifs aux répertoires de base. Include @@ -741,6 +900,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base &Clear &Effacer +Global settings +Paramètres généraux + Fail-safe file copy Copie de fichiers sécurisé @@ -771,9 +933,6 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base &Default &Défaut -Start synchronization -Démarrer la synchronisation - Variant Variante @@ -792,8 +951,20 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base &Find next &Chercher le suivant -Main bar -Barre principale +Delete +Supprimer + +Configure filter +Configuration des filtres + +Start synchronization +Démarrer la synchronisation + +Find +Chercher + +Select time span +Choisir un intervalle de temps Folder pairs Paires de dossiers @@ -804,6 +975,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Configuration Configuration +Main bar +Barre principale + Filter files Filtrage des fichiers @@ -858,11 +1032,8 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Exclude via filter: Exclure à l'aide du filtre : - - - -Delete -Supprimer +multiple selection +sélection multiple Include all Inclure tout @@ -891,14 +1062,14 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Show "%x" Afficher "%x" - - +Last session +Dernière session Folder Comparison and Synchronization Comparaison de dossiers et Synchronisation -Configuration saved! -Configuration enregistrée ! +Configuration saved +Configuration enregistrée FreeFileSync batch FreeFileSync batch @@ -912,9 +1083,6 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Never save changes Ne jamais enregistrer les modifications -Configuration loaded! -Configuration chargée ! - Show files that exist on left side only Afficher les fichiers existant seulement à gauche @@ -960,20 +1128,17 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Set as default Définir par défaut -Operation aborted! -Opération abandonnée ! +Operation aborted +Opération abandonnée -All folders are in sync! -Tous les dossiers sont synchronisés ! +All folders are in sync +Tous les dossiers sont synchronisés Comma separated list Liste d'éléments séparés par une virgule -Legend -Légende - -File list exported! -Liste des fichiers exportée ! +File list exported +Liste des fichiers exportée Searching for program updates... Recherche de mises à jour ... @@ -984,6 +1149,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base &Ignore &Ignorer +Fatal Error +Erreur Fatale + Don't show this warning again Ne plus afficher cet avertissement @@ -1005,6 +1173,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Comparing content... Comparaison du contenu... +Info +Info + Paused En pause @@ -1107,18 +1278,18 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Leave as unresolved conflict Abandonner en tant que conflit non résolu -Time stamp -Horodatage - -Append a timestamp to each file name -Ajouter un horodatage à chaque fichier - Replace Remplacer Move files and replace if existing Déplacer les fichiers et remplacer ceux existant +Time stamp +Horodatage + +Append a timestamp to each file name +Ajouter un horodatage à chaque fichier + Folder Dossier @@ -1161,9 +1332,6 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Cannot write modification time of %x. Impossible d'écrire la date de modification de %x. -Cannot find system function %x. -Impossible de trouver la fonction système %x. - Cannot read security context of %x. Impossible de lire les paramètres de sécurité de %x. @@ -1179,8 +1347,11 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Cannot create directory %x. Impossible de créer le répertoire %x. -Cannot copy symbolic link %x to %y. -Impossible de copier le lien symbolique %x vers %y. +Cannot create symbolic link %x. +Impossible de créer le lien symbolique %x. + +Cannot find system function %x. +Impossible de trouver la fonction système %x. Cannot copy file %x to %y. Impossible de copier le fichier %x vers %y. @@ -1188,15 +1359,15 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Type of item %x is not supported: Le type de l'élément %x n'est pas accepté : +Cannot resolve symbolic link %x. +Impossible de résoudre le lien symbolique %x. + Cannot open directory %x. Impossible d'ouvrir le répertoire %x. Cannot enumerate directory %x. Impossible de parcourir le répertoire %x. -Detected endless directory recursion. -Une boucle sans fin détectée dans un répertoire. - %x TB %x To @@ -1230,6 +1401,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base %x jours +Failed to register to receive system messages. +Impossible d'enregistrer la réception des messages système. + Cannot set privilege %x. Impossible de fixer le privilège %x. @@ -1239,204 +1413,12 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base Cannot change process I/O priorities. Impossible de modifier les priorités E/S des tâches -Unable to move %x to the Recycle Bin! -Impossible de déplacer %x dans la Corbeille ! - -Both sides have changed since last synchronization! -Les deux côtés ont changé depuis la dernière synchronisation ! - -Cannot determine sync-direction: -Impossible de déterminer le sens de la synchro : - -No change since last synchronization! -Aucun changement depuis la dernière synchronisation ! - -The corresponding database entries are not in sync considering current settings. -Les entrées de la Base de données ne sont pas synchronisées vu les paramètres actuels. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Directions de la synchronisation par défaut : les anciens fichiers seront remplacés par les nouveaux. - -Checking recycle bin availability for folder %x... -Contrôle de la disponibilité de la Corbeille pour le dossier %x ... - -Moving file %x to recycle bin -Envoi du fichier %x dans la corbeille - -Moving folder %x to recycle bin -Envoi du dossier %x dans la corbeille - -Moving symbolic link %x to recycle bin -Envoi du lien symbolique %x dans la corbeille - -Deleting file %x -Suppression du fichier %x - -Deleting folder %x -Suppression du dossier %x - -Deleting symbolic link %x -Suppression du lien symbolique %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -La corbeille n'est pas valable pour les chemins suivants ! Les fichiers seront détruits définitivement : - -The corresponding folder will be considered as empty. -Le dossier correspondant sera considéré comme vide. - -Cannot find the following folders: -Impossible de trouver les dossiers suivants : - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Vous pouvez ignorer cette erreur en considérant chaque dossier comme vide. Les dossiers seront automatiquement créés pendant la synchronisation. - -Directories are dependent! Be careful when setting up synchronization rules: -Les répertoires sont imbriqués ! Attention à la mise à jour des règles de synchronisation : - -Start comparison -Démarrer la comparaison - -Calculating sync directions... -Evaluation du sens des synchronisations ... - -Conflict detected: -Conflit détecté : - -File %x has an invalid date! -Le fichier %x a une date invalide ! - -Files %x have the same date but a different size! -Les fichiers %x ont la même date mais une taille différente ! - -Items differ in attributes only -Seuls les attributs des éléments diffèrent - -Symbolic links %x have the same date but a different target. -Le lien symbolique %x a la même date mais pas la même cible. - -Comparing content of files %x -Comparaison du contenu des fichiers %x - -Comparing files by content failed. -La comparaison des fichiers par leur contenu a échoué. - -Generating file list... -Génération de la liste des fichiers... - -Both sides are equal -Les deux cotés sont identiques - -Copy new item to left -Copie du nouvel élément à gauche - -Copy new item to right -Copie du nouvel élément à droite - -Delete left item -Suppression de l'élément de gauche - -Delete right item -Suppression de l'élément de droite - -Move file on left -Déplacer les fichiers à gauche - -Move file on right -Déplacer les fichiers à droite - -Overwrite left item -Remplacement de l'élément de gauche - -Overwrite right item -Remplacement de l'élément de droite - -Do nothing -Ne rien faire - -Update attributes on left -Mise à jour des attributs à gauche - -Update attributes on right -Mise à jour des attributs à droite - -Multiple... -Multiple... - -Moving file %x to %y -Déplacement du fichier %x vers %y - -Moving folder %x to %y -Déplacement du dossier %x vers %y - -Moving symbolic link %x to %y -Déplacement du lien symbolique %x vers %y - -Removing old versions... -Suppression des anciennes versions... - -Creating symbolic link %x -Création du lien symbolique %x - -Creating folder %x -Création du dossier %x - -Overwriting file %x -Remplacement du fichier %x - -Overwriting symbolic link %x -Remplacement du lien symbolique %x - -Verifying file %x -Contrôle du fichier %x - -Updating attributes of %x -Mise à jour des attributs de %x - -Cannot find %x. -Impossible de trouver %x - -Target folder %x already existing. -Le dossier destination %x existe déjà. - -Target folder input field must not be empty. -L'entrée dossier de destination ne doit pas être vide. - -Folder input field for versioning must not be empty. -L'entrée dossier de gestion des versions ne doit pas être vide. +Unable to move %x to the Recycle Bin. +Impossible de déplacer %x dans la Corbeille. -Source folder %x not found. -Dossier source %x non trouvé. - -The following items have unresolved conflicts and will not be synchronized: -Les éléments suivants sont en conflit non résolu et ne seront pas synchronisés : - -Significant difference detected: -Différence significative détectée : - -More than 50% of the total number of files will be copied or deleted! -Plus de 50% des fichiers seront copiés ou détruits ! - -Not enough free disk space available in: -Espace disque insuffisant sur : - -Required: -Requis : - -Available: -Disponible : - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Un dossier faisant partie de paires multiples sera modifié. Veuillez vérifier les paramètres de synchronisation. - -Synchronizing folder pair: -Synchronisation de la paire de dossiers +Cannot determine final path for %x. +Impossible de déterminer le chemin pour %x. -Generating database... -Génération de la base de données... - -Creating Volume Shadow Copy for %x... -Création d'un Volume Shadow Copy pour %x ... - -Data verification error: Source and target file have different content! -Erreur lors du contrôle des données : Les fichiers source et destination ont des contenus différents ! +Error Code %x: +Code erreur %x : diff --git a/BUILD/Languages/german.lng b/BUILD/Languages/german.lng index c068055f..94c955a4 100644 --- a/BUILD/Languages/german.lng +++ b/BUILD/Languages/german.lng @@ -1,143 +1,167 @@
- Deutsch + Deutsch Zenju de_DE - germany.png - 2 - n == 1 ? 0 : 1 + flag_germany.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Suche Ordner %x... +Retrying operation after error: +Wiederhole Operation nach Fehler: -Items processed: -Verarbeitete Elemente: +Both sides have changed since last synchronization. +Beide Seiten wurden seit der letzten Synchronisation verändert. -Items remaining: -Verbleibende Elemente: +Cannot determine sync-direction: +Die Synchronisationsrichtung konnte nicht bestimmt werden: -Total time: -Gesamtzeit: +No change since last synchronization. +Keine Änderungen seit der letzten Synchronisation. -Cannot set directory lock for %x. -Die Verzeichnissperre für %x kann nicht gesetzt werden. +The database entry is not in sync considering current settings. +Der Datenbankeintrag ist nicht synchron gemäß den aktuellen Einstellungen. -Show in Explorer -Im Explorer anzeigen +Setting default synchronization directions: Old files will be overwritten with newer files. +Setze Standardwerte für Synchronisationsrichtungen: Alte Dateien werden durch neuere überschrieben. -Open with default application -Mit Standardanwendung öffnen +Checking recycle bin availability for folder %x... +Prüfe Verfügbarkeit des Papierkorbs für Ordner %x... -Browse directory -Verzeichnis öffnen +Moving file %x to recycle bin +Verschiebe Datei %x in den Papierkorb -Abort requested: Waiting for current operation to finish... -Abbruch initiiert: Warte bis die aktuelle Operation beendet ist... +Moving folder %x to recycle bin +Verschiebe Ordner %x in den Papierkorb -Failure to create timestamp for versioning: -Der Zeitstempel für die Versionierung kann nicht erstellt werden: +Moving symbolic link %x to recycle bin +Verschiebe Symbolischen Link %x in den Papierkorb -RealtimeSync - Automated Synchronization -RealtimeSync - Automatisierte Synchronisation +Deleting file %x +Lösche Datei %x + +Deleting folder %x +Lösche Ordner %x + +Deleting symbolic link %x +Lösche Symbolischen Link %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Der Papierkorb ist für die folgenden Ordner nicht verfügbar. Die Dateien werden stattdessen permanent gelöscht: + +An exception occurred +Eine Ausnahme ist aufgetreten + +Cannot find file %x. +Die Datei %x wurde nicht gefunden. Error Fehler -Selected variant: -Ausgewählte Variante: +File %x does not contain a valid configuration. +Die Datei %x enthält keine gültige Konfiguration. -Select alternate comparison settings -Alternative Vergleichseinstellungen auswählen +A folder input field is empty. +Ein Ordnereingabefeld ist leer. -Select alternate synchronization settings -Alternative Synchronisationseinstellungen auswählen +The corresponding folder will be considered as empty. +Der entsprechende Ordner wird als leer angesehen. -Filter is active -Filter ist aktiv +Cannot find the following folders: +Die folgenden Ordner wurden nicht gefunden: -No filter selected -Kein Filter gesetzt +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Dieser Fehler kann ignoriert werden, um die Ordner als leer anzusehen. Die Ordner werden dann beim Synchronisieren automatisch erstellt. -Remove alternate settings -Alternative Einstellungen entfernen +The following folders have dependent paths. Be careful when setting up synchronization rules: +Die folgenden Ordner haben abhängige Pfade. Achtung beim Festlegen der Synchronisationsregeln: -Clear filter settings -Filtereinstellungen löschen +File %x has an invalid date. +Die Datei %x hat ein ungültiges Datum. -Copy -Kopieren +Date: +Datum: -Paste -Einfügen +Files %x have the same date but a different size. +Die Dateien %x haben dasselbe Datum, aber unterschiedliche Größen. -Save as batch job -Als Batch-Job speichern +Size: +Größe: -Comparison settings -Vergleichseinstellungen +Items differ in attributes only +Die Elemente unterscheiden sich nur in Attributen -Synchronization settings -Synchronisationseinstellungen +Resolving symbolic link %x +Folge dem Symbolischen Link %x -About -Über +Comparing content of files %x +Vergleiche Inhalt der Dateien %x -Confirm -Bestätigen +Generating file list... +Erzeuge Dateiliste... -Configure filter -Konfiguriere Filter +Starting comparison +Starte Vergleich -Global settings -Globale Einstellungen +Calculating sync directions... +Berechne Synchronisationsrichtungen... -Find -Suchen +Out of memory. +Nicht genügend Arbeitsspeicher. -Select time span -Zeitspanne auswählen +Item exists on left side only +Element existiert nur links -Invalid command line: -Ungültige Befehlszeile: +Item exists on right side only +Element existiert nur rechts -Info -Info +Left side is newer +Linke Seite ist neuer -Warning -Warnung +Right side is newer +Rechte Seite ist neuer -Fatal Error -Schwerer Fehler +Items have different content +Elemente haben unterschiedlichen Inhalt -Error Code %x: -Fehlercode %x: +Both sides are equal +Beide Seiten sind gleich -Cannot resolve symbolic link %x. -Der Symbolische Link %x kann nicht aufgelöst werden. +Conflict/item cannot be categorized +Konflikt/Element, das nicht eingeordnet werden kann -Cannot determine final path for %x. -Der endgültige Pfad für %x kann nicht ermittelt werden. +Copy new item to left +Kopiere neues Element nach links -Cannot find system function %x. -Die Systemfunktion %x wurde nicht gefunden. +Copy new item to right +Kopiere neues Element nach rechts - -1 Byte -%x Bytes - - -1 Byte -%x Bytes - +Delete left item +Lösche linkes Element -%x MB -%x MB +Delete right item +Lösche rechtes Element -%x KB -%x KB +Move file on left +Verschiebe linke Datei -%x GB -%x GB +Move file on right +Verschiebe rechte Datei + +Overwrite left item +Überschreibe linkes Element + +Overwrite right item +Überschreibe rechtes Element + +Do nothing +Nichts tun + +Update attributes on left +Aktualisiere Attribute des linken Elements + +Update attributes on right +Aktualisiere Attribute des rechten Elements Database file %x is incompatible. Die Datenbankdatei %x ist nicht kompatibel. @@ -151,9 +175,6 @@ Database file is corrupt: Die Datenbankdatei ist beschädigt: -Out of memory! -Nicht genügend Arbeitsspeicher! - Cannot write file %x. Die Datei %x kann nicht geschrieben werden. @@ -163,8 +184,8 @@ Database files do not share a common session. Die Datenbankdateien teilen keine gemeinsame Sitzung. -An exception occurred! -Eine Ausnahme ist aufgetreten! +Searching for folder %x... +Suche Ordner %x... Cannot read file attributes of %x. Die Dateiattribute von %x können nicht gelesen werden. @@ -187,9 +208,39 @@ Creating file %x Erstelle Datei %x +Items processed: +Verarbeitete Elemente: + +Items remaining: +Verbleibende Elemente: + +Total time: +Gesamtzeit: + + +1 Byte +%x Bytes + + +1 Byte +%x Bytes + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Fehler beim Auswerten der Datei %x, Zeile %y, Spalte %z. +Cannot set directory lock for %x. +Die Verzeichnissperre für %x kann nicht gesetzt werden. + Scanning: Suche Dateien: @@ -208,12 +259,18 @@ /sec /s -File %x does not contain a valid configuration. -Die Datei %x enthält keine gültige Konfiguration. - Configuration file %x loaded partially only. Die Konfigurationsdatei %x wurde nur teilweise geladen. +Show in Explorer +Im Explorer anzeigen + +Open with default application +Mit Standardanwendung öffnen + +Browse directory +Verzeichnis öffnen + Cannot access Volume Shadow Copy Service. Auf den Volumenschattenkopiedienst kann nicht zugegriffen werden. @@ -223,18 +280,21 @@ Cannot load file %x. Die Datei %x kann nicht geladen werden. -Path %x does not contain a volume name. -Der Pfad %x enthält keinen Laufwerksnamen. +Cannot determine volume name for %x. +Der Laufwerksname für %x konnte nicht bestimmt werden. -Volume name %x not part of file name %y! -Laufwerksname %x ist kein Teil des Dateinamens %y! +Volume name %x not part of file name %y. +Laufwerksname %x ist kein Teil des Dateinamens %y. + +Abort requested: Waiting for current operation to finish... +Abbruch initiiert: Warte bis die aktuelle Operation beendet ist... + +Failure to create timestamp for versioning: +Der Zeitstempel für die Versionierung kann nicht erstellt werden: Cannot read the following XML elements: Die folgenden XML-Elemente können nicht gelesen werden: -Cannot find file %x. -Die Datei %x wurde nicht gefunden. - &Open... Ö&ffnen... @@ -315,9 +375,18 @@ Die Befehlszeile wird ausgelöst wenn: Cancel Abbrechen +RealtimeSync - Automated Synchronization +RealtimeSync - Automatisierte Synchronisation + +Warning +Warnung + Build: %x Build: %x +About +Über + All files Alle Dateien @@ -327,29 +396,125 @@ Die Befehlszeile wird ausgelöst wenn: &Exit &Beenden -Monitoring active... -Überwachung aktiv... - Waiting for missing directories... Warte auf fehlende Verzeichnisse... -A folder input field is empty. -Ein Ordnereingabefeld ist leer. +Invalid command line: +Ungültige Befehlszeile: + +File content +Dateiinhalt + +File time and size +Datum und Größe -Synchronization aborted! -Synchronisation abgebrochen! + Two way + Zwei Wege -Synchronization completed with errors! -Synchronisation mit Fehlern abgeschlossen! +Mirror +Spiegeln -Synchronization completed with warnings. -Synchronisation mit Warnungen abgeschlossen. +Update +Aktualisieren -Nothing to synchronize! -Es gibt nichts zu synchronisieren! +Custom +Eigene -Synchronization completed successfully. -Synchronisation erfolgreich abgeschlossen. +Multiple... +Verschiedene... + +Moving file %x to %y +Verschiebe Datei %x nach %y + +Moving folder %x to %y +Verschiebe Ordner %x nach %y + +Moving symbolic link %x to %y +Verschiebe Symbolischen Link %x nach %y + +Removing old versions... +Entferne alte Versionen... + +Creating symbolic link %x +Erstelle Symbolischen Link %x + +Creating folder %x +Erstelle Ordner %x + +Overwriting file %x +Überschreibe Datei %x + +Overwriting symbolic link %x +Überschreibe Symbolischen Link %x + +Verifying file %x +Verifiziere Datei %x + +Updating attributes of %x +Aktualisiere Attribute von %x + +Cannot find %x. +%x wurde nicht gefunden. + +Target folder %x already existing. +Der Zielordner %x existiert bereits. + +Target folder input field must not be empty. +Das Eingabefeld für den Zielordner darf nicht leer sein. + +Folder input field for versioning must not be empty. +Das Eingabefeld für den Ordner für die Versionierung darf nicht leer sein. + +Source folder %x not found. +Der Quellordner %x wurde nicht gefunden. + +The following items have unresolved conflicts and will not be synchronized: +Die folgenden Elemente haben ungelöste Konflikte und werden nicht synchronisiert werden: + +Significant difference detected: +Ein erheblicher Unterschied wurde festgestellt: + +More than 50% of the total number of files will be copied or deleted. +Mehr als 50% aller Dateien werden kopiert oder gelöscht. + +Not enough free disk space available in: +Nicht genügend freier Speicher verfügbar unter: + +Required: +Benötigt: + +Available: +Verfügbar: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Ein Ordner wird verändert werden, der Teil mehrerer Ordnerpaare ist. Bitte überprüfen Sie die Synchronisationseinstellungen. + +Synchronizing folder pair: +Synchronisiere Ordnerpaar: + +Generating database... +Erzeuge Synchronisationsdatenbank... + +Creating Volume Shadow Copy for %x... +Erstelle Volumenschattenkopie für %x... + +Data verification error: %x and %y have different content. +Verifizierungsfehler: %x und %y haben unterschiedlichen Inhalt. + +Synchronization aborted +Synchronisation abgebrochen + +Synchronization completed with errors +Synchronisation mit Fehlern abgeschlossen + +Synchronization completed with warnings +Synchronisation mit Warnungen abgeschlossen + +Nothing to synchronize +Es gibt nichts zu synchronisieren + +Synchronization completed successfully +Synchronisation erfolgreich abgeschlossen Saving log file %x... Speichere Logdatei %x... @@ -357,8 +522,8 @@ Die Befehlszeile wird ausgelöst wenn: Press "Switch" to resolve issues in FreeFileSync main dialog. Drücken Sie "Wechseln", um die Probleme in FreeFileSyncs Hauptdialog zu beheben. -Switching to FreeFileSync main dialog... -Wechsle in FreeFileSyncs Hauptdialog... +Switching to FreeFileSync main dialog +Wechsle in FreeFileSyncs Hauptdialog A new version of FreeFileSync is available: Eine neue Version von FreeFileSync ist verfügbar: @@ -366,29 +531,29 @@ Die Befehlszeile wird ausgelöst wenn: Download now? Jetzt herunterladen? -FreeFileSync is up to date! -FreeFileSync ist auf dem neuesten Stand! +New version found +Neue Version gefunden -Information -Information +&Download +&Download -Unable to connect to sourceforge.net! -Es konnte keine Verbindung zu Sourceforge.net aufgebaut werden! +FreeFileSync is up to date. +FreeFileSync ist auf dem neuesten Stand. -Current FreeFileSync version number was not found online! Do you want to check manually? -Die aktuelle FreeFileSync Versionsnummer wurde online nicht gefunden! Möchten Sie manuell prüfen? +Information +Information -Do you want FreeFileSync to automatically check for updates every week? -Soll FreeFileSync automatisch jede Woche nach Aktualisierungen suchen? +Unable to connect to sourceforge.net. +Es konnte keine Verbindung zu Sourceforge.net aufgebaut werden. -(Requires an Internet connection!) -(Eine Internetverbindung wird benötigt!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Die aktuelle FreeFileSync Versionsnummer wurde online nicht gefunden. Möchten Sie manuell prüfen? - - +Symlink +Symlink - - +Folder +Ordner Full path Absoluter Pfad @@ -411,12 +576,6 @@ Die Befehlszeile wird ausgelöst wenn: Extension Erweiterung -Size: -Größe: - -Date: -Datum: - Category Kategorie @@ -441,6 +600,33 @@ Die Befehlszeile wird ausgelöst wenn: Hibernate Ruhezustand +Selected variant: +Ausgewählte Variante: + +Select alternate comparison settings +Alternative Vergleichseinstellungen auswählen + +Select alternate synchronization settings +Alternative Synchronisationseinstellungen auswählen + +Filter is active +Filter ist aktiv + +No filter selected +Kein Filter gesetzt + +Remove alternate settings +Alternative Einstellungen entfernen + +Clear filter settings +Filtereinstellungen löschen + +Copy +Kopieren + +Paste +Einfügen + &New &Neu @@ -459,14 +645,14 @@ Die Befehlszeile wird ausgelöst wenn: &Language &Sprache -&Global settings... -&Globale Einstellungen... - &Export file list... Dateiliste e&xportieren... -&Advanced -&Erweitert +&Global settings... +&Globale Einstellungen... + +&Tools +E&xtras &Check now &Jetzt prüfen @@ -474,12 +660,18 @@ Die Befehlszeile wird ausgelöst wenn: Check &automatically once a week &Automatisch wöchentlich prüfen -Check for new version -Auf neuere Version prüfen +Check for new &version +Auf neue &Version prüfen Compare Vergleichen +Comparison settings +Vergleichseinstellungen + +Synchronization settings +Synchronisationseinstellungen + Synchronize Synchronisieren @@ -492,6 +684,9 @@ Die Befehlszeile wird ausgelöst wenn: Swap sides Seiten vertauschen +Save as batch job +Als Batch-Job speichern + Hide excluded items Ausgeschlossene Elemente verstecken @@ -534,52 +729,7 @@ Die Befehlszeile wird ausgelöst wenn: &Pause &Pause -Batch job -Batch-Job - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Erstellt eine Batchdatei für die automatisierte Synchronisation. Anschließend die Datei doppelklicken oder in den Taskplaner des Betriebssystems eintragen: FreeFileSync.exe .ffs_batch. - -Help -Hilfe - -Error handling -Fehlerbehandlung - -Ignore -Ignorieren - -Hide all error and warning messages -Alle Fehler- und Warnmeldungen unterdrücken - -Pop-up -Nachfragen - -Show pop-up on errors or warnings -Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen - -Exit -Beenden - -Abort synchronization on first error -Synchronisation beim ersten Fehler abbrechen - -Show progress dialog -Fortschrittsdialog zeigen - -Save log -Log speichern - -Select folder to save log files -Ordner zum speichern der Logdateien wählen - -Limit -Limit - -Limit maximum number of log files -Maximale Anzahl von Logdateien begrenzen - -Select variant +Select a variant Variante auswählen @@ -595,9 +745,6 @@ Dateien gelten als gleich, wenn gleich sind -File time and size -Datum und Größe - Files are found equal if - file content @@ -609,38 +756,41 @@ Dateien gelten als gleich, wenn gleich ist -File content -Dateiinhalt - Symbolic Link handling Symbolische Links +Help +Hilfe + OK OK -<- Two way -> -<- Zwei Wege -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identifiziere und propagiere Änderungen auf beiden Seiten. Löschungen, Verschiebungen und Konflikte werden automatisch mit Hilfe einer Datenbank erkannt. -Mirror ->> -Spiegeln ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Spiegelkopie des linken Ordners erstellen. Der rechte Ordner wird dem linken exakt angeglichen. -Update -> -Aktualisieren -> - Copy new or updated files to right folder. Neue oder aktualisierte Dateien in den rechten Ordner kopieren. -Custom -Eigene +Configure your own synchronization rules. +Eigene Synchronisationsregeln definieren. + +Error handling +Fehlerbehandlung + +Ignore +Ignorieren + +Hide all error and warning messages +Alle Fehler- und Warnmeldungen unterdrücken + +Pop-up +Nachfragen -Configure your own synchronization rules. -Eigene Synchronisationsregeln definieren. +Show pop-up on errors or warnings +Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen Deletion handling Behandlung von Löschungen @@ -666,23 +816,32 @@ gleich ist Naming convention: Namenskonvention: -Item exists on left side only -Element existiert nur links +Batch job +Batch-Job -Item exists on right side only -Element existiert nur rechts +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Erstellt eine Batchdatei für die automatisierte Synchronisation. Anschließend die Datei doppelklicken oder in den Taskplaner des Betriebssystems eintragen: FreeFileSync.exe .ffs_batch. -Left side is newer -Linke Seite ist neuer +Exit +Beenden -Right side is newer -Rechte Seite ist neuer +Abort synchronization on first error +Synchronisation beim ersten Fehler abbrechen -Items have different content -Elemente haben unterschiedlichen Inhalt +Show progress dialog +Fortschrittsdialog zeigen -Conflict/item cannot be categorized -Konflikt/Element, das nicht eingeordnet werden kann +Save log +Log speichern + +Select folder to save log files +Ordner zum Speichern der Logdateien wählen + +Limit +Limit + +Limit maximum number of log files +Maximale Anzahl der Logdateien begrenzen Source code written in C++ using: Sourcecode in C++ geschrieben mit Hilfe von: @@ -702,9 +861,6 @@ gleich ist Homepage Homepage -FreeFileSync at Sourceforge -FreeFileSync auf Sourceforge - Email Email @@ -719,11 +875,11 @@ gleich ist Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Nur Dateien, die zu allen Filtereinstellungen passen, werden synchronisiert. -Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! +Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein. Include @@ -747,6 +903,9 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! &Clear &Löschen +Global settings +Globale Einstellungen + Fail-safe file copy Dateien ausfallsicher kopieren @@ -777,9 +936,6 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! &Default &Standard -Start synchronization -Synchronisation starten - Variant Variante @@ -798,6 +954,21 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! &Find next &Weitersuchen +Delete +Löschen + +Configure filter +Konfiguriere Filter + +Start synchronization +Synchronisation starten + +Find +Suchen + +Select time span +Zeitspanne auswählen + Folder pairs Ordnerpaare @@ -864,11 +1035,8 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! Exclude via filter: Über Filter ausschließen: - - - -Delete -Löschen +multiple selection +Mehrfachauswahl Include all Alle einschließen @@ -897,14 +1065,14 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! Show "%x" Zeige "%x" - - +Last session +Letzte Sitzung Folder Comparison and Synchronization Ordnervergleich und Synchronisation -Configuration saved! -Konfiguration gespeichert! +Configuration saved +Konfiguration gespeichert FreeFileSync batch FreeFileSync Batch @@ -918,9 +1086,6 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! Never save changes Änderungen nie speichern -Configuration loaded! -Konfiguration geladen! - Show files that exist on left side only Nur links existierende Dateien anzeigen @@ -966,17 +1131,17 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! Set as default Als Standard festlegen -Operation aborted! -Vorgang abgebrochen! +Operation aborted +Vorgang abgebrochen -All folders are in sync! -Alle Ordner sind synchron! +All folders are in sync +Alle Ordner sind synchron Comma separated list Kommagetrennte Liste -File list exported! -Dateiliste exportiert! +File list exported +Dateiliste exportiert Searching for program updates... Suche nach aktualisierten Programmversionen... @@ -987,6 +1152,9 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! &Ignore &Ignorieren +Fatal Error +Schwerer Fehler + Don't show this warning again Diese Warnung nicht mehr anzeigen @@ -1008,6 +1176,9 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! Comparing content... Vergleiche Dateiinhalt... +Info +Info + Paused Angehalten @@ -1105,7 +1276,7 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! - Entsprechung der anderen Seite zu %item_folder% Make hidden warnings and dialogs visible again? -Versteckte Warnungen und Dialoge wieder sichtbar machen? +Sollen versteckte Warnungen und Dialoge wieder sichtbar gemacht werden? Leave as unresolved conflict Als unbehandelten Konflikt belassen @@ -1182,12 +1353,18 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! Cannot create symbolic link %x. Der Symbolische Link %x kann nicht erstellt werden. +Cannot find system function %x. +Die Systemfunktion %x wurde nicht gefunden. + Cannot copy file %x to %y. Die Datei %x kann nicht nach %y kopiert werden. Type of item %x is not supported: Der Typ des Elements %x wird nicht unterstützt: +Cannot resolve symbolic link %x. +Der Symbolische Link %x kann nicht aufgelöst werden. + Cannot open directory %x. Das Verzeichnis %x kann nicht geöffnet werden. @@ -1227,6 +1404,9 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! %x Tage +Failed to register to receive system messages. +Die Registrierung zum Empfang von Systemmeldungen ist fehlgeschlagen. + Cannot set privilege %x. Das Privileg %x kann nicht gesetzt werden. @@ -1236,201 +1416,12 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein! Cannot change process I/O priorities. Die Eingabe/Ausgabe Prioritäten für den Prozess konnten nicht geändert werden. -Unable to move %x to the Recycle Bin! -%x kann nicht in den Papierkorb verschoben werden! - -Both sides have changed since last synchronization! -Beide Seiten wurden seit der letzten Synchronisation verändert! - -Cannot determine sync-direction: -Die Synchronisationsrichtung konnte nicht bestimmt werden: - -No change since last synchronization! -Keine Änderungen seit der letzten Synchronisation! - -The corresponding database entries are not in sync considering current settings. -Die entsprechenden Datenbankeinträge sind nicht synchron gemäß den aktuellen Einstellungen - -Setting default synchronization directions: Old files will be overwritten with newer files. -Setze Standardwerte für Synchronisationsrichtungen: Alte Dateien werden durch neuere überschrieben. - -Checking recycle bin availability for folder %x... -Prüfe Verfügbarkeit des Papierkorbs für Ordner %x... - -Moving file %x to recycle bin -Verschiebe Datei %x in den Papierkorb - -Moving folder %x to recycle bin -Verschiebe Ordner %x in den Papierkorb - -Moving symbolic link %x to recycle bin -Verschiebe Symbolischen Link %x in den Papierkorb - -Deleting file %x -Lösche Datei %x - -Deleting folder %x -Lösche Ordner %x - -Deleting symbolic link %x -Lösche Symbolischen Link %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Der Papierkorb ist für die folgenden Pfade nicht verfügbar! Die Dateien werden stattdessen permanent gelöscht: - -The corresponding folder will be considered as empty. -Der entsprechende Ordner wird als leer angesehen. - -Cannot find the following folders: -Die folgenden Ordner wurden nicht gefunden: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Dieser Fehler kann ignoriert werden, um die Ordner als leer anzusehen. Die Ordner werden dann beim Synchronisieren automatisch erstellt. - -Directories are dependent! Be careful when setting up synchronization rules: -Die Verzeichnisse sind voneinander abhängig! Achtung beim Festlegen der Synchronisationsregeln: - -Conflict detected: -Ein Konflikt wurde erkannt: - -File %x has an invalid date! -Die Datei %x hat ein ungültiges Datum! - -Files %x have the same date but a different size! -Die Dateien %x haben dasselbe Datum, aber unterschiedliche Größen! - -Items differ in attributes only -Die Elemente unterscheiden sich nur in Attributen - -Resolving symbolic link %x -Folge dem Symbolischen Link %x - -Comparing content of files %x -Vergleiche Inhalt der Dateien %x - -Generating file list... -Erzeuge Dateiliste... - -Start comparison -Starte Vergleich - -Calculating sync directions... -Berechne Synchronisationsrichtungen... - -Both sides are equal -Beide Seiten sind gleich - -Copy new item to left -Kopiere neues Element nach links - -Copy new item to right -Kopiere neues Element nach rechts - -Delete left item -Lösche linkes Element - -Delete right item -Lösche rechtes Element - -Move file on left -Verschiebe linke Datei - -Move file on right -Verschiebe rechte Datei - -Overwrite left item -Überschreibe linkes Element - -Overwrite right item -Überschreibe rechtes Element - -Do nothing -Nichts tun - -Update attributes on left -Aktualisiere Attribute des linken Elements - -Update attributes on right -Aktualisiere Attribute des rechten Elements - -Multiple... -Verschiedene... - -Moving file %x to %y -Verschiebe Datei %x nach %y - -Moving folder %x to %y -Verschiebe Ordner %x nach %y - -Moving symbolic link %x to %y -Verschiebe Symbolischen Link %x nach %y - -Removing old versions... -Entferne alte Versionen... +Unable to move %x to the Recycle Bin. +%x kann nicht in den Papierkorb verschoben werden. -Creating symbolic link %x -Erstelle Symbolischen Link %x - -Creating folder %x -Erstelle Ordner %x - -Overwriting file %x -Überschreibe Datei %x - -Overwriting symbolic link %x -Überschreibe Symbolischen Link %x - -Verifying file %x -Verifiziere Datei %x - -Updating attributes of %x -Aktualisiere Attribute von %x - -Cannot find %x. -%x wurde nicht gefunden. - -Target folder %x already existing. -Der Zielordner %x existiert bereits. - -Target folder input field must not be empty. -Das Eingabefeld für den Zielordner darf nicht leer sein. - -Folder input field for versioning must not be empty. -Das Eingabefeld für den Ordner für die Versionierung darf nicht leer sein. - -Source folder %x not found. -Der Quellordner %x wurde nicht gefunden. - -The following items have unresolved conflicts and will not be synchronized: -Die folgenden Elemente haben ungelöste Konflikte und werden nicht synchronisiert werden: - -Significant difference detected: -Ein erheblicher Unterschied wurde festgestellt: - -More than 50% of the total number of files will be copied or deleted! -Mehr als 50% aller Dateien werden kopiert oder gelöscht! - -Not enough free disk space available in: -Nicht genügend freier Speicher verfügbar unter: - -Required: -Benötigt: - -Available: -Verfügbar: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Ein Ordner wird verändert werden, der Teil mehrerer Ordnerpaare ist. Bitte überprüfen Sie die Synchronisationseinstellungen. - -Synchronizing folder pair: -Synchronisiere Ordnerpaar: - -Generating database... -Erzeuge Synchronisationsdatenbank... - -Creating Volume Shadow Copy for %x... -Erstelle Volumenschattenkopie für %x... +Cannot determine final path for %x. +Der endgültige Pfad für %x kann nicht ermittelt werden. -Data verification error: Source and target file have different content! -Verifizierungsfehler: Quell- und Zieldatei haben unterschiedlichen Inhalt! +Error Code %x: +Fehlercode %x: diff --git a/BUILD/Languages/greek.lng b/BUILD/Languages/greek.lng index 3dc272d9..dc22668c 100644 --- a/BUILD/Languages/greek.lng +++ b/BUILD/Languages/greek.lng @@ -1,137 +1,164 @@
- Eλληνικά + Eλληνικά Γιώργος Γιαγλής el_GR - greece.png - 2 - n == 1 ? 0 : 1 + flag_greece.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Αναζήτηση του υποκαταλόγου %x... +Both sides have changed since last synchronization. +Και οι δυο πλευρές έχουν αλλάξει από τον τελευταίο συγχρονισμό. -Items processed: -Επεξεργάστηκαν στοιχεία: +Cannot determine sync-direction: +Δεν μπορεί να προσδιοριστεί η κατεύθυνση συγχρονισμού: -Items remaining: -Περισσεύουν στοιχεία: +No change since last synchronization. +Καμία αλλαγή από τον προηγούμενο συγχρονισμό. -Total time: -Συνολική διάρκεια: +The database entry is not in sync considering current settings. +Με βάση τις τρέχουσες ρυθμίσεις η βάση δεδομένων δεν είναι συγχρονισμένη. -Cannot set directory lock for %x. -Ο υποκατάλογος για το %x δεν μπορεί να κλειδωθεί. +Setting default synchronization directions: Old files will be overwritten with newer files. +Ρύθμιση προεπιλεγμένης κατεύθυνσης συγχρονισμού: Τα νεότερα αρχεία θα αντικαταστήσουν τα παλιότερα. -Show in Explorer -Εμφάνιση στην Εξερεύνηση +Checking recycle bin availability for folder %x... +Έλεγχος της διαθεσιμότητας του κάδου ανακύκλωσης για τον υποκατάλογο %x... -Open with default application -Άνοιγμα με την προεπιλεγμένη εφαρμογή +Moving file %x to recycle bin +Μεταφορά του αρχείου %x στον κάδο ανακύκλωσης -Browse directory -Αναζήτηση υποκαταλόγου +Moving folder %x to recycle bin +Μεταφορά του υποκαταλόγου %x στον κάδο ανακύκλωσης -Abort requested: Waiting for current operation to finish... -Ζητήθηκε ματαίωση: Αναμονή για την λήξη της τρέχουσας εργασίας... +Moving symbolic link %x to recycle bin +Μεταφορά του συμβολικού δεσμού %x στον κάδο ανακύκλωσης -Failure to create timestamp for versioning: -Αποτυχία να δημιουργηθεί χρονική σήμανση για τη διατήρηση παλιών εκδόσεων: +Deleting file %x +Διαγραφή του αρχείου %x -RealtimeSync - Automated Synchronization -RealtimeSync - Αυτοματοποιημένος Συγχρονισμός +Deleting folder %x +Διαγραφή του υποκαταλόγου %x + +Deleting symbolic link %x +Διαγραφή του συμβολικού δεσμού %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Ο Κάθος Ανακύκλωσης δεν είναι διαθέσιμος στους παρακάτω υποκαταλόγους. Τα αρχεία θα διαγραφούν μόνιμα: + +An exception occurred +Παρουσιάστηκε σφάλμα + +Cannot find file %x. +Το αρχείο %x δε βρέθηκε. Error Σφάλματα -Selected variant: -Μέθοδος που επιλέχθηκε: +File %x does not contain a valid configuration. +Το αρχείο %x δεν περιέχει μια έγκυρη διάταξη. -Select alternate comparison settings -Επιλογή διαφοροποιημένων ρυθμίσεων σύγκρισης +A folder input field is empty. +Ένα πεδίο εισαγωγής υποκαταλόγων είναι άδειο. -Select alternate synchronization settings -Επιλογή διαφοροποιημένων ρυθμίσεων συγχρονισμού +The corresponding folder will be considered as empty. +Ο αντίστοιχος υποκατάλογος θα θεωρηθεί κενός. -Filter is active -Το φίλτρο είναι ενεργό +Cannot find the following folders: +Οι ακόλουθοι υποκατάλογοι δεν ήταν δυνατό να βρεθούν: -No filter selected -Δεν έχει επιλεχθεί φίλτρο +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Μπορείτε να αγνοήσετε αυτό το σφάλμα, για να αντιμετωπίσετε κάθε υποκατάλογο ως κενό. Οι υποκατάλογοι θα δημιουργηθούν αυτόματα κατά τη διάρκεια του συγχρονισμού. -Remove alternate settings -Διαγραφή των διαφοροποιημένων ρυθμίσεων +The following folders have dependent paths. Be careful when setting up synchronization rules: +Οι παρακάτω υποκατάλογοι δεν έχουν σταθερή διαδρομή. Προσοχή όταν ορίσετε κανόνες συγχρονισμού: -Clear filter settings -Διαγραφή όλων των ρυθμίσεων φίλτρου +File %x has an invalid date. +Το αρχείο %x δεν έχει έγκυρη ημερομηνία. -Copy -Αντιγραφή +Date: +Ημερομηνία: -Paste -Επικόλληση +Files %x have the same date but a different size. +Τα αρχεία %x έχουν την ίδια ημερομηνία αλλά διαφορετικό μέγεθος. -Save as batch job -Αποθήκευση ως δέσμη ενεργειών +Size: +Μέγεθος: -Comparison settings -Ρυθμίσεις σύγκρισης +Items differ in attributes only +Τα στοιχεία διαφέρουν μόνο ως προς τα χαρακτηριστικά τους -Synchronization settings -Ρυθμίσεις συγχρονισμού +Resolving symbolic link %x +Επίλυση του συμβολικού δεσμού %x -About -Σχετικά με το... +Comparing content of files %x +Σύγκριση του περιεχομένου των αρχείων %x -Confirm -Επιβεβαίωση +Generating file list... +Δημιουργία καταλόγου αρχείων... -Configure filter -Ρύθμιση του φίλτρου +Starting comparison +Έναρξη της σύγκρισης -Global settings -Γενικές ρυθμίσεις +Calculating sync directions... +Υπολογισμός των κατευθύνσεων συγχρονισμού... -Find -Αναζήτηση +Out of memory. +Ανεπαρκής μνήμη. -Select time span -Επιλογή χρονικού διαστήματος +Item exists on left side only +Το αντικείμενο υπάρχει μόνο στην αριστερή πλευρά -Invalid command line: -Σφάλμα στη γραμμή εντολών: +Item exists on right side only +Το αντικείμενο υπάρχει μόνο στη δεξιά πλευρά -Info -Πληροφορίες +Left side is newer +Το αντικείμενο στην αριστερή πλευρά είναι πιο πρόσφατο -Warning -Προειδοποίηση +Right side is newer +Το αντικείμενο στη δεξιά πλευρά είναι πιο πρόσφατο -Fatal Error -Σημαντικό Σφάλμα +Items have different content +Τα αντικείμενα έχουν διαφορετικό περιεχόμενο -Error Code %x: -Κωδικός Σφάλματος %x +Both sides are equal +Οι δυο πλευρές είναι ίδιες -Cannot resolve symbolic link %x. -Ο συμβολικός δεσμός %x δεν μπορεί να επιλυθεί +Conflict/item cannot be categorized +Διένεξη/το αντικείμενο δεν μπορεί να κατηγοριοποιηθεί - -1 Byte -%x Bytes - - -1 Byte -%x Bytes - +Copy new item to left +Αντιγραφή του νέου στοιχείου στα αριστερά -%x MB -%x MB +Copy new item to right +Αντιγραφή του νέου στοιχείου στα δεξιά -%x KB -%x KB +Delete left item +Διαγραφή του στοιχείου στα αριστερά -%x GB -%x GB +Delete right item +Διαγραφή του στοιχείου στα δεξιά + +Move file on left +Μεταφορά του αρχείου που βρίσκεται αριστερά + +Move file on right +Μεταφορά του αρχείου που βρίσκεται δεξιά + +Overwrite left item +Αντικατάσταση του στοιχείου που βρίσκεται στα αριστερά + +Overwrite right item +Αντικατάσταση του στοιχείου που βρίσκεται στα δεξιά + +Do nothing +Καμία ενέργεια + +Update attributes on left +Ενημέρωση των στοιχείων στα αριστερά + +Update attributes on right +Ενημέρωση των στοιχείων στα δεξιά Database file %x is incompatible. Το αρχείο βάσης δεδομένων %x δεν είναι συμβατό @@ -145,9 +172,6 @@ Database file is corrupt: Το αρχείο βάσης δεδομένων είναι αλλοιωμένο: -Out of memory! -Ανεπαρκής μνήμη! - Cannot write file %x. Δεν μπορεί να γίνει εγγραφή του αρχείου %x. @@ -157,8 +181,8 @@ Database files do not share a common session. Τα αρχεία βάσης δεδομένων δεν έχουν χρησιμοποιηθεί από κοινού σε συγχρονισμό. -An exception occurred! -Παρουσιάστηκε σφάλμα! +Searching for folder %x... +Αναζήτηση του υποκαταλόγου %x... Cannot read file attributes of %x. Δεν μπορεί να γίνει ανάγνωση των χαρακτηριστικών του αρχείου %x. @@ -181,9 +205,39 @@ Creating file %x Δημιουργία του αρχείου %x +Items processed: +Επεξεργάστηκαν στοιχεία: + +Items remaining: +Περισσεύουν στοιχεία: + +Total time: +Συνολική διάρκεια: + + +1 Byte +%x Bytes + + +1 Byte +%x Bytes + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Σφάλμα κατά την ανάλυση του αρχείου %x, γραμμή %y, στήλη %z. +Cannot set directory lock for %x. +Ο υποκατάλογος για το %x δεν μπορεί να κλειδωθεί. + Scanning: Ανίχνευση: @@ -202,12 +256,18 @@ /sec /δευτερόλεπτο -File %x does not contain a valid configuration. -Το αρχείο %x δεν περιέχει μια έγκυρη διάταξη. - Configuration file %x loaded partially only. Το αρχείο διάταξης %x έχει φορτωθεί μόνο κατά ένα μέρος. +Show in Explorer +Εμφάνιση στην Εξερεύνηση + +Open with default application +Άνοιγμα με την προεπιλεγμένη εφαρμογή + +Browse directory +Αναζήτηση υποκαταλόγου + Cannot access Volume Shadow Copy Service. Δεν πέτυχε η πρόσφαση στην Υπηρεσεία Σκιώδους Αντίγραφου Τόμου. @@ -217,23 +277,26 @@ Cannot load file %x. Το αρχείο %x δεν ήταν δυνατόν να φορτωθεί. -Path %x does not contain a volume name. -Η διαδρομή %x δεν περιέχει ένα όνομα τόμου. +Cannot determine volume name for %x. +Δεν μπορεί να προσδιοριστεί το όνομα τόμου για το %x. -Volume name %x not part of file name %y! -Το όνομα τόμου %x δεν είναι μέρος του ονόματος του αρχείου %y! +Volume name %x not part of file name %y. +Το όνομα τόμου %x δεν είναι μέρος του ονόματος του αρχείου %y. + +Abort requested: Waiting for current operation to finish... +Ζητήθηκε ματαίωση: Αναμονή για την λήξη της τρέχουσας εργασίας... + +Failure to create timestamp for versioning: +Αποτυχία να δημιουργηθεί χρονική σήμανση για τη διατήρηση παλιών εκδόσεων: Cannot read the following XML elements: Δεν ήταν δυνατό να αναγνωσθούν τα ακόλουθα στοιχεία XML: -Cannot find file %x. -Το αρχείο %x δε βρέθηκε. - &Open... Ά&νοιγμα... Save &as... -Αποθή&κευση ως... +Αποθήκευση &ως... &Quit Έ&ξοδος @@ -309,9 +372,18 @@ The command is triggered if: Cancel Άκυρο +RealtimeSync - Automated Synchronization +RealtimeSync - Αυτοματοποιημένος Συγχρονισμός + +Warning +Προειδοποίηση + Build: %x Δημιουργήθηκε : %x +About +Σχετικά με το... + All files Όλα τα αρχεία @@ -319,31 +391,127 @@ The command is triggered if: &Επαναφορά &Exit -&Έξοδος - -Monitoring active... -Ενεργή παρακολούθηση... +Έ&ξοδος Waiting for missing directories... Αναμονή για τους υποκαταλόγους που απουσιάζουν... -A folder input field is empty. -Ένα πεδίο εισαγωγής υποκαταλόγων είναι άδειο. +Invalid command line: +Σφάλμα στη γραμμή εντολών: + +File content +Περιεχόμενο αρχείων + +File time and size +Ημερομηνία και μέγεθος αρχείων + + Two way + Διπλής κατεύθυνσης + +Mirror +Κατοπτρισμός + +Update +Ενημέρωση + +Custom +Εξατομίκευση + +Multiple... +Πολλαπλές ρυθμίσεις... + +Moving file %x to %y +Μεταφορά του αρχείου %x στο %y + +Moving folder %x to %y +Μεταφορά του υποκαταλόγου %x στο %y + +Moving symbolic link %x to %y +Μεταφορά του συμβολικού δεσμού %x στο %y + +Removing old versions... +Διαγραφή παλιών εκδόσεων... + +Creating symbolic link %x +Δημιουργία του συμβολικού δεσμού %x + +Creating folder %x +Δημιουργία του υποκαταλόγου %x + +Overwriting file %x +Αντικατάσταση του αρχείου %x + +Overwriting symbolic link %x +Αντικατάσταση του συμβολικού δεσμού %x + +Verifying file %x +Επικύρωση του αρχείου %x + +Updating attributes of %x +Ενημέρωση των χαρακτηριστικών αρχείου του %x + +Cannot find %x. +Το %x δεν μπορεί να βρεθεί. + +Target folder %x already existing. +Ο υποκατάλογος-στόχος %x υπάρχει ήδη. + +Target folder input field must not be empty. +Το πεδίο εισαγωγής του υποκαταλόγου-στόχου πρέπει να μην είναι κενό. -Synchronization aborted! -Ο συγχρονισμός ματαιώθηκε! +Folder input field for versioning must not be empty. +Το πεδίο εισαγωγής του υποκαταλόγου για διατήρηση παλιών εκδόσεων πρέπει να μην είναι κενό. + +Source folder %x not found. +Ο υποκατάλογος %x δε βρέθηκε. + +The following items have unresolved conflicts and will not be synchronized: +Τα ακόλουθα στοιχεία έχουν ανεπίλυτες διενέξεις και δε θα συγχρονιστούν: + +Significant difference detected: +Ανιχνεύθηκαν σημαντικές διαφορές: + +More than 50% of the total number of files will be copied or deleted. +Περισσότερα από το 50% των αρχείων θα αντιγραφούν ή διαγραφούν. + +Not enough free disk space available in: +Δεν υπάρχει αρκετός διαθέσιμος χώρος στο δίσκο: -Synchronization completed with errors! -Ο συγχρονισμός ολοκληρώθηκε με σφάλματα! +Required: +Απαιτείται: + +Available: +Διαθέσιμος: -Synchronization completed with warnings. -Ο συγχρονισμός ολοκληρώθηκε με προειδοποιήσεις. +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Θα τροποποιηθεί ένας υποκατάλογος που είναι μέρος από πολλαπλά ζεύγη υποκαταλόγων. Παρακαλούμε επανελέγξτε τις ρυθμίσεις συγχρονισμού. -Nothing to synchronize! -Δεν υπάρχει τίποτα προς συγχρονισμό! +Synchronizing folder pair: +Συγχρονίζεται το ζευγάρι υποκαταλόγων: + +Generating database... +Δημιουργία βάσης δεδομένων... + +Creating Volume Shadow Copy for %x... +Δημιουργία Σκιώδους Αντίγραφου Τόμου για το %x... -Synchronization completed successfully. -Ο συγχρονισμός ολοκληρώθηκε επιτυχώς. +Data verification error: %x and %y have different content. +Λάθος επαλήθευσης δεδομένων: το %x και το %y έχουν διαφορετικό περιεχόμενο. + +Synchronization aborted +Ο συγχρονισμός ματαιώθηκε + +Synchronization completed with errors +Ο συγχρονισμός ολοκληρώθηκε με σφάλματα + +Synchronization completed with warnings +Ο συγχρονισμός ολοκληρώθηκε με προειδοποιήσεις + +Nothing to synchronize +Δεν υπάρχει τίποτα προς συγχρονισμό + +Synchronization completed successfully +Ο συγχρονισμός ολοκληρώθηκε επιτυχώς Saving log file %x... Αποθήκευση του αρχείου καταγραφής %x... @@ -351,8 +519,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. Πατήστε "Εναλλαγή" για να επιλύσετε τα θέματα στο κεντρικό παράθυρο του FreeFileSync. -Switching to FreeFileSync main dialog... -Επιστρέφοντας στο κεντρικό παράθυρο του FreeFileSync... +Switching to FreeFileSync main dialog +Εναλλαγή στο βασικό παράθυρο του FreeFileSync A new version of FreeFileSync is available: Μια νέα έκδοση του FreeFileSync είναι διαθέσιμη: @@ -360,28 +528,28 @@ The command is triggered if: Download now? Λήψη τώρα; -FreeFileSync is up to date! -Το FreeFileSync είναι ενημερωμένο! +New version found +Βρέθηκε νέα έκδοση -Information -Πληροφορία +&Download +&Λήψη -Unable to connect to sourceforge.net! -Δεν είναι δυνατή η σύνδεση με το sourceforge.net! +FreeFileSync is up to date. +Το FreeFileSync είναι ενημερωμένο. -Current FreeFileSync version number was not found online! Do you want to check manually? -Η τρέχουσα έκδοση του FreeFileSync δεν βρέθηκε στο δίκτυο! Θέλετε να την αναζητήσετε μόνος σας; +Information +Πληροφορία -Do you want FreeFileSync to automatically check for updates every week? -Θέλετε το FreeFileSync να ελέγχει αυτόματα για ενημερώσεις κάθε εβδομάδα; +Unable to connect to sourceforge.net. +Δεν είναι δυνατή η σύνδεση με το sourceforge.net. -(Requires an Internet connection!) -(Απαιτεί σύνδεση με το Internet) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Ο αριθμός της τρέχουσας έκδοσης του FreeFileSync δεν βρέθηκε στο δίκτυο. Θέλετε να το ελέγξετε εσείς; - -<Συμβολικός δεσμός> +Symlink +Συμβολικός δεσμός - +Folder Υποκατάλογος Full path @@ -405,18 +573,12 @@ The command is triggered if: Extension Επέκταση -Size: -Μέγεθος: - -Date: -Ημερομηνία: +Category +Κατηγορία Action Ενέργεια -Category -Κατηγορία - Drag && drop Μεταφορά && Απόθεση @@ -435,11 +597,38 @@ The command is triggered if: Hibernate Αδρανοποίηση +Selected variant: +Μέθοδος που επιλέχθηκε: + +Select alternate comparison settings +Επιλογή διαφοροποιημένων ρυθμίσεων σύγκρισης + +Select alternate synchronization settings +Επιλογή διαφοροποιημένων ρυθμίσεων συγχρονισμού + +Filter is active +Το φίλτρο είναι ενεργό + +No filter selected +Δεν έχει επιλεχθεί φίλτρο + +Remove alternate settings +Διαγραφή των διαφοροποιημένων ρυθμίσεων + +Clear filter settings +Διαγραφή όλων των ρυθμίσεων φίλτρου + +Copy +Αντιγραφή + +Paste +Επικόλληση + &New &Δημιουργία &Save -Απο&θήκευση +&Αποθήκευση Save as &batch job... Αποθήκευση ως δέσ&μη ενεργειών... @@ -453,14 +642,14 @@ The command is triggered if: &Language &Γλώσσα -&Global settings... -Γε&νικές ρυθμίσεις... - &Export file list... Ε&ξαγωγή καταλόγου αρχείων... -&Advanced -&Για προχωρημένους +&Global settings... +Γενικές &ρυθμίσεις... + +&Tools +&Εργαλεία &Check now Έλεγχος &τώρα @@ -468,12 +657,18 @@ The command is triggered if: Check &automatically once a week &Aυτόματος έλεγχος μια φορά την εβδομάδα -Check for new version -Έλεγχος για νέα έκδοση +Check for new &version +Έλεγχος για &νέα έκδοση Compare Σύγκριση +Comparison settings +Ρυθμίσεις σύγκρισης + +Synchronization settings +Ρυθμίσεις συγχρονισμού + Synchronize Συγχρονισμός @@ -486,6 +681,9 @@ The command is triggered if: Swap sides Ανταλλαγή πλευρών +Save as batch job +Αποθήκευση ως δέσμη ενεργειών + Hide excluded items Απόκρυψη στοιχείων που εξαιρέθηκαν @@ -528,53 +726,8 @@ The command is triggered if: &Pause &Παύση -Batch job -Δέσμη ενεργειών - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Δημιουργείστε ένα αρχείο δέσμης για να αυτοματοποιήσετε το συγχρονισμό. Κάντε διπλό κλικ στο αρχείο αυτό ή προγραμματίστε το στο χρονοδιάγραμμα εργασιών του συστήματός σας: FreeFileSync.exe <όνομα δέσμης>.ffs_batch - -Help -Βοήθεια - -Error handling -Διαχείριση σφαλμάτων - -Ignore -Παράβλεψη - -Hide all error and warning messages -Απόκρυψη όλων των σφαλμάτων και προειδοποιήσεων - -Pop-up -Αναδυόμενο μήνυμα - -Show pop-up on errors or warnings -Εμφάνιση αναδυόμενου παράθυρου σε σφάλματα ή προειδοποιήσεις - -Exit -Έξοδος - -Abort synchronization on first error -Ματαίωση του συγχρονισμού με το πρώτο σφάλμα - -Show progress dialog -Εμφάνιση της αναφοράς προόδου - -Save log -Αποθήκευση αρχείου καταγραφής - -Select folder to save log files -Επιλογή υποκαταλόγου για την αποθήκευση των αρχείων καταγραφής - -Limit -Μέγιστος αριθμός - -Limit maximum number of log files -Μέγιστος αριθμός αρχείων καταγραφής - -Select variant -Επιλογή μεθόδου +Select a variant +Επιλέξτε μια μέθοδο Files are found equal if @@ -589,9 +742,6 @@ are the same είναι ίδια -File time and size -Ημερομηνία και μέγεθος αρχείων - Files are found equal if - file content @@ -603,39 +753,42 @@ is the same είναι ίδιο -File content -Περιεχόμενο αρχείων - Symbolic Link handling Τρόπος διαχείρισης των συμβολικών δεσμών +Help +Βοήθεια + OK OK -<- Two way -> -<- Διπλής κατεύθυνσης -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Αναγνώριση και εφαρμογή αλλαγών και στις δυο πλευρές. Οι διαγραφές, οι μεταφορές και οι διενέξεις αναγνωρίζονται αυτόματα με τη βοήθεια μιας βάσης δεδομένων. -Mirror ->> -Κατοπτρισμός ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Κατοπτρικό αντίγραφο του αριστερού υποκαταλόγου. Ο υποκατάλογος δεξιά θα τροποποιηθεί και θα αντιστοιχεί εξολοκλήρου στον αριστερό μετά το συγχρονισμό -Update -> -Ενημέρωση -> - Copy new or updated files to right folder. Αντιγραφή των νέων ή πιο πρόσφατων αρχείων στον υποκατάλογο δεξιά. -Custom -Εξατομίκευση - Configure your own synchronization rules. Ορίστε τους δικούς σας κανόνες συγχρονισμού. +Error handling +Διαχείριση σφαλμάτων + +Ignore +Παράβλεψη + +Hide all error and warning messages +Απόκρυψη όλων των σφαλμάτων και προειδοποιήσεων + +Pop-up +Αναδυόμενο μήνυμα + +Show pop-up on errors or warnings +Εμφάνιση αναδυόμενου παράθυρου σε σφάλματα ή προειδοποιήσεις + Deletion handling Διαγραφή των αρχείων @@ -660,23 +813,32 @@ is the same Naming convention: Τρόπος ονομασίας: -Item exists on left side only -Το αντικείμενο υπάρχει μόνο στην αριστερή πλευρά +Batch job +Δέσμη ενεργειών + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Δημιουργείστε ένα αρχείο δέσμης για να αυτοματοποιήσετε το συγχρονισμό. Κάντε διπλό κλικ στο αρχείο αυτό ή προγραμματίστε το στο χρονοδιάγραμμα εργασιών του συστήματός σας: FreeFileSync.exe <όνομα δέσμης>.ffs_batch + +Exit +Έξοδος + +Abort synchronization on first error +Ματαίωση του συγχρονισμού με το πρώτο σφάλμα -Item exists on right side only -Το αντικείμενο υπάρχει μόνο στη δεξιά πλευρά +Show progress dialog +Εμφάνιση της αναφοράς προόδου -Left side is newer -Το αντικείμενο στην αριστερή πλευρά είναι πιο πρόσφατο +Save log +Αποθήκευση αρχείου καταγραφής -Right side is newer -Το αντικείμενο στη δεξιά πλευρά είναι πιο πρόσφατο +Select folder to save log files +Επιλογή υποκαταλόγου για την αποθήκευση των αρχείων καταγραφής -Items have different content -Τα αντικείμενα έχουν διαφορετικό περιεχόμενο +Limit +Μέγιστος αριθμός -Conflict/item cannot be categorized -Διένεξη/το αντικείμενο δεν μπορεί να κατηγοριοποιηθεί +Limit maximum number of log files +Μέγιστος αριθμός αρχείων καταγραφής Source code written in C++ using: Ο πηγαίος κώδικας γράφτηκε σε C++ χρησιμοποιώντας τα: @@ -696,9 +858,6 @@ is the same Homepage Ιστοσελίδα -FreeFileSync at Sourceforge -Το FreeFileSync στο Sourceforge - Email Email @@ -713,7 +872,7 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Θα συγχρονιστούν μόνον όσα αρχεία πληρούν όλες τις απαιτήσεις των φίλτρων. @@ -741,6 +900,9 @@ Note: File names must be relative to base directories! &Clear &Καθαρισμός +Global settings +Γενικές ρυθμίσεις + Fail-safe file copy Ασφαλής αντιγραφή αρχείων @@ -771,9 +933,6 @@ Note: File names must be relative to base directories! &Default &Προεπιλογή -Start synchronization -Έναρξη του συγχρονισμού - Variant Μέθοδος @@ -792,11 +951,20 @@ Note: File names must be relative to base directories! &Find next &Εύρεση επομένου -Operation aborted! -Η λειτουργία ματαιώθηκε! +Delete +Διαγραφή -Main bar -Γραμμή εργαλείων +Configure filter +Ρύθμιση του φίλτρου + +Start synchronization +Έναρξη του συγχρονισμού + +Find +Αναζήτηση + +Select time span +Επιλογή χρονικού διαστήματος Folder pairs Ζεύγη υποκαταλόγων @@ -807,6 +975,9 @@ Note: File names must be relative to base directories! Configuration Διάταξη +Main bar +Γραμμή εργαλείων + Filter files Φιλτράρισμα @@ -861,11 +1032,8 @@ Note: File names must be relative to base directories! Exclude via filter: Εξαίρεση με βάση το φίλτρο: - -<πολλαπλή επιλογή> - -Delete -Διαγραφή +multiple selection +πολλαπλή επιλογή Include all Συμπερίληψη όλων @@ -894,14 +1062,14 @@ Note: File names must be relative to base directories! Show "%x" Εμφάνιση της γραμμής "%x" - -<Τελευταία χρήση> +Last session +Τελευταία χρήση Folder Comparison and Synchronization Σύγκριση υποκαταλόγων και Συγχρονισμός -Configuration saved! -Η διάταξη αποθηκεύτηκε! +Configuration saved +Η διάταξη αποθηκεύτηκε FreeFileSync batch Δέσμη ενεργειών του FreeFileSync @@ -915,9 +1083,6 @@ Note: File names must be relative to base directories! Never save changes Να μην αποθηκεύονται οι αλλαγές -Configuration loaded! -Η διάταξη έχει ανοιχθεί! - Show files that exist on left side only Εμφάνιση των αρχείων που υπάρχουν μόνο στα αριστερά @@ -963,17 +1128,17 @@ Note: File names must be relative to base directories! Set as default Ορισμός ως προεπιλογής -All folders are in sync! -Όλοι οι υποκατάλογοι είναι συγχρονισμένοι! +Operation aborted +Η λειτουργία ματαιώθηκε + +All folders are in sync +Όλοι οι υποκατάλογοι είναι συγχρονισμένοι Comma separated list Κατάλογος οριοθετημένος με κόμματα -Legend -Εξήγηση των συμβόλων για κάθε κατηγορία - -File list exported! -Ο κατάλογος των αρχείων έχει εξαχθεί! +File list exported +Ο κατάλογος των αρχείων έχει εξαχθεί Searching for program updates... Αναζήτηση καινούριας έκδοσης... @@ -984,6 +1149,9 @@ Note: File names must be relative to base directories! &Ignore &Παράβλεψη +Fatal Error +Σημαντικό Σφάλμα + Don't show this warning again Να μην εμφανιστεί ξανά αυτή η προειδοποίηση @@ -997,7 +1165,7 @@ Note: File names must be relative to base directories! &Ναι &No -&Όχι +Ό&χι Scanning... Ανίχνευση... @@ -1005,6 +1173,9 @@ Note: File names must be relative to base directories! Comparing content... Σύγκριση του περιεχομένου... +Info +Πληροφορίες + Paused Σε παύση @@ -1107,18 +1278,18 @@ Note: File names must be relative to base directories! Leave as unresolved conflict Παράβλεψη ως ανεπίλυτη διένεξη -Time stamp -Χρονική σήμανση - -Append a timestamp to each file name -Προσάρτηση χρονικής σήμανσης σε κάθε όνομα αρχείου - Replace Αντικατάσταση προηγούμενης Move files and replace if existing Μετακίνηση αρχείων και αντικατάσταση +Time stamp +Χρονική σήμανση + +Append a timestamp to each file name +Προσάρτηση χρονικής σήμανσης σε κάθε όνομα αρχείου + Folder Υποκατάλογος @@ -1161,9 +1332,6 @@ Note: File names must be relative to base directories! Cannot write modification time of %x. Δεν μπορεί να γίνει εγγραφή της ώρας τροποποίησης του %x. -Cannot find system function %x. -Δεν ανευρίσκεται η λειτουργία συστήματος %x. - Cannot read security context of %x. Δεν μπορεί να αναγνωσθεί το περιβάλλον ασφαλείας του %x. @@ -1179,8 +1347,11 @@ Note: File names must be relative to base directories! Cannot create directory %x. Δεν μπορεί να δημιουργηθεί ο υποκατάλογος %x. -Cannot copy symbolic link %x to %y. -Δεν μπορεί να αντιγραφεί ο συμβολικός δεσμός %x στο %y. +Cannot create symbolic link %x. +Ο συμβολικός δεσμός %x δεν μπορεί να δημιουργηθεί. + +Cannot find system function %x. +Δεν ανευρίσκεται η λειτουργία συστήματος %x. Cannot copy file %x to %y. Δεν μπορεί να αντιγραφεί το αρχείο %x στο %y. @@ -1188,15 +1359,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: Ο τύπος του στοιχείου %x δεν υποστηρίζεται: +Cannot resolve symbolic link %x. +Ο συμβολικός δεσμός %x δεν μπορεί να επιλυθεί + Cannot open directory %x. Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x. Cannot enumerate directory %x. Δεν είναι δυνατή η καταλογογράφηση του υποκαταλόγου %x. -Detected endless directory recursion. -Ανιχνεύτηκε αέναος βρόχος υποκαταλόγων. - %x TB %x TB @@ -1230,6 +1401,9 @@ Note: File names must be relative to base directories! %x μέρες +Failed to register to receive system messages. +Αποτυχία στην καταχώρηση για τη λήψη μηνυμάτων του συστήματος. + Cannot set privilege %x. Τα δικαιώματα %x δεν μπορούν να οριστούν. @@ -1239,210 +1413,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. Δεν μπορούν να αλλάξουν οι προτεραιότητες I/O της διεργασίας. -Unable to move %x to the Recycle Bin! -Το αρχείο %x δεν ήταν δυνατό να μεταφερθεί στον Κάδο Ανακύκλωσης! - -Both sides have changed since last synchronization! -Και οι δυο πλευρές έχουν αλλάξει από τον τελευταίο συγχρονισμό! - -Cannot determine sync-direction: -Δεν μπορεί να προσδιοριστεί η κατεύθυνση συγχρονισμού: - -No change since last synchronization! -Καμία αλλαγή από τον προηγούμενο συγχρονισμό! - -The corresponding database entries are not in sync considering current settings. -Οι αντίστοιχες καταχωρήσεις του αρχείου δεδομένων δεν είναι συγχρονισμένες, λαμβάνοντας υπόψη τις τρέχουσες ρυθμίσεις. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Ρύθμιση προεπιλεγμένης κατεύθυνσης συγχρονισμού: Τα νεότερα αρχεία θα αντικαταστήσουν τα παλιότερα. - -Checking recycle bin availability for folder %x... -Έλεγχος της διαθεσιμότητας του κάδου ανακύκλωσης για τον υποκατάλογο %x... - -Moving file %x to recycle bin -Μεταφορά του αρχείου %x στον κάδο ανακύκλωσης - -Moving folder %x to recycle bin -Μεταφορά του υποκαταλόγου %x στον κάδο ανακύκλωσης - -Moving symbolic link %x to recycle bin -Μεταφορά του συμβολικού δεσμού %x στον κάδο ανακύκλωσης - -Deleting file %x -Διαγραφή του αρχείου %x - -Deleting folder %x -Διαγραφή του υποκαταλόγου %x - -Deleting symbolic link %x -Διαγραφή του συμβολικού δεσμού %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Ο Κάδος Ανακύκλωσης δεν είναι διαθέσιμος για τις ακόλουθες διαδρομές! Τα αρχεία θα διαγραφούν μόνιμα: - -The corresponding folder will be considered as empty. -Ο αντίστοιχος υποκατάλογος θα θεωρηθεί κενός. - -Cannot find the following folders: -Οι ακόλουθοι υποκατάλογοι δεν ήταν δυνατό να βρεθούν: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Μπορείτε να αγνοήσετε αυτό το σφάλμα, για να αντιμετωπίσετε κάθε υποκατάλογο ως κενό. Οι υποκατάλογοι θα δημιουργηθούν αυτόματα κατά τη διάρκεια του συγχρονισμού. - -Directories are dependent! Be careful when setting up synchronization rules: -Οι υποκατάλογοι είναι εξαρτώμενοι. Προσοχή κατά την εισαγωγή των κανόνων συγχρονισμού: - -Start comparison -Έναρξη σύγκρισης - -Calculating sync directions... -Υπολογισμός των κατευθύνσεων συγχρονισμού... - -Conflict detected: -Ανιχνεύθηκε διένεξη: +Unable to move %x to the Recycle Bin. +Το αρχείο %x δεν ήταν δυνατό να μεταφερθεί στον Κάδο Ανακύκλωσης. -File %x has an invalid date! -Το αρχείο %x δεν έχει έγκυρη ημερομηνία! +Cannot determine final path for %x. +Δεν μπορεί να προσδιοριστεί η τελική διαδρομή για το %x. -Files %x have the same date but a different size! -Τα αρχεία %x έχουν την ίδια ημερομηνία αλλά διαφορετικό μέγεθος! - -Items differ in attributes only -Τα στοιχεία διαφέρουν μόνο ως προς τα χαρακτηριστικά τους - -Symbolic links %x have the same date but a different target. -Οι συμβολικοί δεσμοί %x έχουν την ίδια ημερομηνία αλλά διαφορετικό προορισμό. - -Comparing content of files %x -Σύγκριση του περιεχομένου των αρχείων %x - -Comparing files by content failed. -Η σύγκριση του περιεχομένου των αρχείων απέτυχε. - -Generating file list... -Δημιουργία καταλόγου αρχείων... - -Both sides are equal -Οι δυο πλευρές είναι ίδιες - -Copy new item to left -Αντιγραφή του νέου στοιχείου στα αριστερά - -Copy new item to right -Αντιγραφή του νέου στοιχείου στα δεξιά - -Delete left item -Διαγραφή του στοιχείου στα αριστερά - -Delete right item -Διαγραφή του στοιχείου στα δεξιά - -Move file on left -Μεταφορά του αρχείου που βρίσκεται αριστερά - -Move file on right -Μεταφορά του αρχείου που βρίσκεται δεξιά - -Overwrite left item -Αντικατάσταση του στοιχείου που βρίσκεται στα αριστερά - -Overwrite right item -Αντικατάσταση του στοιχείου που βρίσκεται στα δεξιά - -Do nothing -Καμία ενέργεια - -Update attributes on left -Ενημέρωση των στοιχείων στα αριστερά - -Update attributes on right -Ενημέρωση των στοιχείων στα δεξιά - -Multiple... -Πολλαπλές ρυθμίσεις... - -Moving file %x to %y -Μεταφορά του αρχείου %x στο %y - -Moving folder %x to %y -Μεταφορά του υποκαταλόγου %x στο %y - -Moving symbolic link %x to %y -Μεταφορά του συμβολικού δεσμού %x στο %y - -Removing old versions... -Διαγραφή παλιών εκδόσεων... - -Creating symbolic link %x -Δημιουργία του συμβολικού δεσμού %x - -Creating folder %x -Δημιουργία του υποκαταλόγου %x - -Overwriting file %x -Αντικατάσταση του αρχείου %x - -Overwriting symbolic link %x -Αντικατάσταση του συμβολικού δεσμού %x - -Verifying file %x -Επικύρωση του αρχείου %x - -Updating attributes of %x -Ενημέρωση των χαρακτηριστικών αρχείου του %x - -Cannot find %x. -Το %x δεν μπορεί να βρεθεί. - -Target folder %x already existing. -Ο υποκατάλογος-στόχος %x υπάρχει ήδη. - -Target folder input field must not be empty. -Το πεδίο εισαγωγής του υποκαταλόγου-στόχου πρέπει να μην είναι κενό. - -Folder input field for versioning must not be empty. -Το πεδίο εισαγωγής του υποκαταλόγου για διατήρηση παλιών εκδόσεων πρέπει να μην είναι κενό. - -Source folder %x not found. -Ο υποκατάλογος %x δε βρέθηκε. - -The following items have unresolved conflicts and will not be synchronized: -Τα ακόλουθα στοιχεία έχουν ανεπίλυτες διενέξεις και δε θα συγχρονιστούν: - -Significant difference detected: -Ανιχνεύθηκαν σημαντικές διαφορές: - -More than 50% of the total number of files will be copied or deleted! -Περισσότερα από το 50% των αρχείων θα αντιγραφούν ή διαγραφούν! - -Not enough free disk space available in: -Δεν υπάρχει αρκετός διαθέσιμος χώρος στο δίσκο: - -Required: -Απαιτείται: - -Available: -Διαθέσιμος: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Θα τροποποιηθεί ένας υποκατάλογος που είναι μέρος από πολλαπλά ζεύγη υποκαταλόγων. Παρακαλούμε επανελέγξτε τις ρυθμίσεις συγχρονισμού. - -Left -Αριστερά - -Right -Δεξιά - -Synchronizing folder pair: -Συγχρονίζεται το ζευγάρι υποκαταλόγων: - -Generating database... -Δημιουργία βάσης δεδομένων... - -Creating Volume Shadow Copy for %x... -Δημιουργία Σκιώδους Αντίγραφου Τόμου για το %x... - -Data verification error: Source and target file have different content! -Σφάλμα επικύρωσης δεδομένων: Τα αρχεία προέλευσης και προορισμού έχουν διαφορετικό περιεχόμενο! +Error Code %x: +Κωδικός Σφάλματος %x diff --git a/BUILD/Languages/hebrew.lng b/BUILD/Languages/hebrew.lng index cdaf1dea..c7b0adcd 100644 --- a/BUILD/Languages/hebrew.lng +++ b/BUILD/Languages/hebrew.lng @@ -1,137 +1,164 @@
- עברית + עברית nitnit he_IL - israel.png - 2 - n == 1 ? 0 : 1 + flag_israel.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -מחפש את תיקייה %x... +Both sides have changed since last synchronization. +שני הצדדים שונו מאז הסנכרון האחרון. -Items processed: -אלמנטים עובדו: +Cannot determine sync-direction: +לא מזהה כוון סנכרון: -Items remaining: -אלמנתים נותרו: +No change since last synchronization. +אין שינוי מאז הסנכרון האחרון. -Total time: -זמן כולל: +The database entry is not in sync considering current settings. +בסיס הנתונים אינו מסונכרן בהתאם להגדרות הנוכחיות. -Cannot set directory lock for %x. -לא ניתן לנעול מחיצה עבור %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +בחר ברירת מחדל של סנכרון: קבצים ישנים ידרסו ע"י קבצים חדשים יותר. -Show in Explorer -הראה בסייר הקבצים +Checking recycle bin availability for folder %x... +בודק זמינות סל מחזור עבור מחיצה %x... -Open with default application -פתח באמצאות האפליקציה המתאימה +Moving file %x to recycle bin +מעביר קובץ %x לסל מחזור -Browse directory -עיין במחיצה +Moving folder %x to recycle bin +מעביר מחיצה %x לסל מחזור -Abort requested: Waiting for current operation to finish... -התקבלה בקשת ביטול: מחכה לפעולה הנוכחית להסתיים... +Moving symbolic link %x to recycle bin +מעביר קישור סימבולי %x לסל מחזור -Failure to create timestamp for versioning: -נכשל ייצור תג זמן עבור עדכון גרסאות +Deleting file %x +מוחק קובץ %x -RealtimeSync - Automated Synchronization -RealtimeSync - סינכרון אוטומטי +Deleting folder %x +מוחק מחיצה %x + +Deleting symbolic link %x +מוחק קישור סימבולי %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +סל המיחזור אינו זמין עבור התיקיות הבאות. קבצים ימחקו סופית: + +An exception occurred +אירוע חריג + +Cannot find file %x. +לא יכול למצוא קובץ %x. Error שגיאה -Selected variant: -גירסה שנבחרה: +File %x does not contain a valid configuration. +קובץ %x אינו כולל תצורה תקינה. -Select alternate comparison settings -בחר הגדרות השוואה חליפיות +A folder input field is empty. +שדה קלט תיקייה ריק. -Select alternate synchronization settings -בחר הגדרות סנכרון חליפיות +The corresponding folder will be considered as empty. +המחיצה המתאימה תחשב כריקה. -Filter is active -מסנן פעיל +Cannot find the following folders: +לא יכול למצוא את המחיצות הבאות: -No filter selected -לא נבחר מסנן פעיל +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +אפשר להתעלם משגיאה זו ולהחשיב כל תיקיה כריקה. התיקיות יווצרו אוטומטית בזמן הסינכרון. -Remove alternate settings -הסר הגדרות תצורה חליפיות +The following folders have dependent paths. Be careful when setting up synchronization rules: +מסלול המחיצות הבאות מותנה. שים לב כאשר חוקי הסינכרון מוגדרים: -Clear filter settings -נקה בחירת מסנן +File %x has an invalid date. +קובץ %x מכיל תאריך שגוי. -Copy -העתק +Date: +תאריך: -Paste -הדבק +Files %x have the same date but a different size. +קובץ %x בעל תאריך זהה אך גודל שונה. -Save as batch job -שמור כעבודת אצווה +Size: +גודל: -Comparison settings -הגדרות השוואה +Items differ in attributes only +פריטים שונים בתכונות בלבד -Synchronization settings -הגדרות סנכרון +Resolving symbolic link %x +פותר קישור סימבולי %x -About -אודות +Comparing content of files %x +השווה תכולה של קבצים %x -Confirm -אשר +Generating file list... +מייצר רשימת קבצים... -Configure filter -תצורת מסנן +Starting comparison +מתחיל השוואה -Global settings -משתנים גלובליים +Calculating sync directions... +מחשב כיווני סנכרון... -Find -חפש +Out of memory. +תם הזכרון. -Select time span -בחר תחום זמן +Item exists on left side only +הפריט קיים בצד ימין בלבד -Invalid command line: -שורת פקודה בלתי חוקית: +Item exists on right side only +הפריט קיים בצד שמאל בלבד -Info -מידע +Left side is newer +צד ימין חדש יותר -Warning -אזהרה +Right side is newer +צד שמאל חדש יותר -Fatal Error -שגיאה פטלית +Items have different content +הפריטים הם בעלי תוכן שונה -Error Code %x: -קוד שגיאה %x: +Both sides are equal +שני הצדדים שווים -Cannot resolve symbolic link %x. -לא יכול לפענח את הקישור הסימבולי %x. +Conflict/item cannot be categorized +סתירה/פריט אינו ניתן לסיווג - -1 Byte -%x Bytes - - -1 בייט -%x בייט - +Copy new item to left +העתק פריט חדש לצד ימין -%x MB -%x מגה בייט +Copy new item to right +העתק פריט חדש לצד שמאל -%x KB -%x קילו בייט +Delete left item +מחק פריט בצד ימין -%x GB -%x גיגה בייט +Delete right item +מחק פריט בצד שמאל + +Move file on left +העבר קובץ בצד ימין + +Move file on right +העבר קובץ בצד שמאל + +Overwrite left item +רשום על גבי פריט בצד ימין + +Overwrite right item +רשום על גבי פריט בצד שמאל + +Do nothing +אל תעשה כלום + +Update attributes on left +עדכן תכונות בצד ימין + +Update attributes on right +עדכן תכונות בצד שמאל Database file %x is incompatible. קובץ מסד נתונים %x אינו במבנה מתאים. @@ -145,9 +172,6 @@ Database file is corrupt: קובץ מסד נתונים משובש: -Out of memory! -תם הזכרון! - Cannot write file %x. לא יכול לכתוב קובץ %x. @@ -157,8 +181,8 @@ Database files do not share a common session. קבצי הנתונים אינם כוללים מופע פעילות משותף. -An exception occurred! -אירוע חריג! +Searching for folder %x... +מחפש את תיקייה %x... Cannot read file attributes of %x. לא יכול לקרוא תכונות של קובץ %x. @@ -181,9 +205,39 @@ Creating file %x יוצר קובץ %x +Items processed: +אלמנטים עובדו: + +Items remaining: +אלמנתים נותרו: + +Total time: +זמן כולל: + + +1 Byte +%x Bytes + + +1 בייט +%x בייט + + +%x MB +%x מגה בייט + +%x KB +%x קילו בייט + +%x GB +%x גיגה בייט + Error parsing file %x, row %y, column %z. שגיאה בפענוח קובץ %x, שורה %y, טור %z. +Cannot set directory lock for %x. +לא ניתן לנעול מחיצה עבור %x. + Scanning: סורק: @@ -202,12 +256,18 @@ /sec /שנ -File %x does not contain a valid configuration. -קובץ %x אינו כולל תצורה תקינה. - Configuration file %x loaded partially only. קובץ תצורה %x נטען חלקית בלבד. +Show in Explorer +הראה בסייר הקבצים + +Open with default application +פתח באמצאות האפליקציה המתאימה + +Browse directory +עיין במחיצה + Cannot access Volume Shadow Copy Service. לא יכול לגשת אל volume shadow copy service. @@ -215,20 +275,23 @@ אנא השתמש בגירסת 64-bit של FreeFileSync על מנת ליצר shadow copies במערכת הפעלה זו. Cannot load file %x. -לא יכול לטעון קובץ %x! +לא יכול לטעון קובץ %x. + +Cannot determine volume name for %x. +לא יכול לקבוע שם אמצעי אחסון %x. -Path %x does not contain a volume name. -נתיב %x אינו כולל שם כרך. +Volume name %x not part of file name %y. +ככונן %x לא בנתיב של קובץ %y. + +Abort requested: Waiting for current operation to finish... +התקבלה בקשת ביטול: מחכה לפעולה הנוכחית להסתיים... -Volume name %x not part of file name %y! -ככונן %x לא בנתיב של קובץ %y! +Failure to create timestamp for versioning: +נכשל ייצור תג זמן עבור עדכון גרסאות Cannot read the following XML elements: לא יכול לקרוא את שמות צמתי XML: -Cannot find file %x. -לא יכול למצוא קובץ %x. - &Open... &פתח... @@ -309,9 +372,18 @@ The command is triggered if: Cancel בטל +RealtimeSync - Automated Synchronization +RealtimeSync - סינכרון אוטומטי + +Warning +אזהרה + Build: %x מבנה: %x +About +אודות + All files כל הקבצים @@ -321,29 +393,125 @@ The command is triggered if: &Exit &יציאה -Monitoring active... -נטר ארכיב... - Waiting for missing directories... מחכה למחיצות חסרות... -A folder input field is empty. -שדה קלט תיקייה ריק. +Invalid command line: +שורת פקודה בלתי חוקית: + +File content +תכולת הקובץ + +File time and size +זמן וגודל קובץ + + Two way +דו כווני + +Mirror +מראה + +Update +שדרג + +Custom +מותאם + +Multiple... +הכפל... + +Moving file %x to %y +מעביר קובץ %x אל %y + +Moving folder %x to %y +מעביר מחיצה %x אל %y + +Moving symbolic link %x to %y +מעביר קישור סימבולי %x אל %y + +Removing old versions... +מסיר גרסאות ישנות... + +Creating symbolic link %x +יוצר קישור סימבולי %x + +Creating folder %x +יוצר מחיצה %x + +Overwriting file %x +דורס קובץ %x + +Overwriting symbolic link %x +דורס קישור סימבולי %x + +Verifying file %x +מאמת קובץ %x + +Updating attributes of %x +מעדכן תכונות של %x -Synchronization aborted! -סינכרון בוטל! +Cannot find %x. +לא מוצא %x. -Synchronization completed with errors! -סנכרון הושלם עם שגיאות! +Target folder %x already existing. +תיקיית מטרה %x כבר קיימת. -Synchronization completed with warnings. -סנכרון הסתיים עם אזהרות. +Target folder input field must not be empty. +קלט תיקיית מטרה אינה יכול להיות ריק. -Nothing to synchronize! -אין מה לסנכרן! +Folder input field for versioning must not be empty. +קלט שדה תיקייה עבור גירסאות אינו יכול להיות ריק. -Synchronization completed successfully. -סנכרון הסתיים בהצלחה. +Source folder %x not found. +תיקיית מקור %x לא נמצאת. + +The following items have unresolved conflicts and will not be synchronized: +לפריטים הבאים יש קונפליקטים בלתי פתורים והם לא יסונכרנו: + +Significant difference detected: +התגלה שוני גדול מידי: + +More than 50% of the total number of files will be copied or deleted. +יותר מ 50% מהקבצים ימחקו או יועתקו. + +Not enough free disk space available in: +אין מספיק מקום דיסק פנוי ב: + +Required: +נדרש: + +Available: +זמין: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +התיקייה שתשתנה היא חלק מריבוי זוגות תיקיות. אנא סקור מחדש הגדרות סינכרון. + +Synchronizing folder pair: +מסנכרן זוג תיקיות: + +Generating database... +מייצר מסד נתונים... + +Creating Volume Shadow Copy for %x... +יוצר העתק volume shadow עבור %x... + +Data verification error: %x and %y have different content. +שגיאת אימות נתונים. ל %x ו %y יש תוכן שונה. + +Synchronization aborted +סינכרון בוטל + +Synchronization completed with errors +סנכרון הושלם עם שגיאות + +Synchronization completed with warnings +סנכרון הסתיים עם אזהרות + +Nothing to synchronize +אין מה לסנכרן + +Synchronization completed successfully +סנכרון הסתיים בהצלחה Saving log file %x... שומר קובץ יומן %x... @@ -351,8 +519,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. לחץ על "החלפה" בכדי לפתור בעיות בדיאלוג הראשי. -Switching to FreeFileSync main dialog... -עובר לדיאלוג הראשי של FreeFileSync +Switching to FreeFileSync main dialog +מחליף לתיבת דו שיח ראשית של FreeFileSync A new version of FreeFileSync is available: גירסה חדשה של FreeFileSync זמינה: @@ -360,29 +528,29 @@ The command is triggered if: Download now? הורד עכשיו? -FreeFileSync is up to date! -FreeFileSync מעודכן לגירסה האחרונה! +New version found +גרסה חדשה נמצאה -Information -מידע +&Download +&הורד -Unable to connect to sourceforge.net! -אין תקשורת ל sourceforge.net! +FreeFileSync is up to date. +FreeFileSync מעודכן לגירסה האחרונה. -Current FreeFileSync version number was not found online! Do you want to check manually? -מספר גירסה נוכחית של FreeFileSync לא נמצא באופן מכוון! האם ברצונך לבדוק ידנית? +Information +מידע -Do you want FreeFileSync to automatically check for updates every week? -האם ברצונך שהתוכנה תבדוק לעדכון בכל שבוע? +Unable to connect to sourceforge.net. +אין תקשורת ל sourceforge.net. -(Requires an Internet connection!) -(מחייב קישור אינטרנטי פעיל!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +לא מוצא מספר גירסה עדכנית של FreeFileSync באופן מכוון. האם אתה רוצה לבדוק באופן ידני? - -<קשור סימבולי> +Symlink +קשור סימבולי - -<תיקייה> +Folder +תיקייה Full path נתיב מלא @@ -405,12 +573,6 @@ The command is triggered if: Extension סיומת -Size: -גודל: - -Date: -תאריך: - Category קטגוריה @@ -418,7 +580,7 @@ The command is triggered if: פעולה Drag && drop -גרור והשלך +גרור &והשלך Close progress dialog סגור שיח התקדמות @@ -435,6 +597,33 @@ The command is triggered if: Hibernate עבור למצב שינה +Selected variant: +גירסה שנבחרה: + +Select alternate comparison settings +בחר הגדרות השוואה חליפיות + +Select alternate synchronization settings +בחר הגדרות סנכרון חליפיות + +Filter is active +מסנן פעיל + +No filter selected +לא נבחר מסנן פעיל + +Remove alternate settings +הסר הגדרות תצורה חליפיות + +Clear filter settings +נקה בחירת מסנן + +Copy +העתק + +Paste +הדבק + &New &חדש @@ -453,14 +642,14 @@ The command is triggered if: &Language &שפה -&Global settings... -&משתנים גלובליים... - &Export file list... &יצא רשימת קבצים... -&Advanced -&מתקדם +&Global settings... +&משתנים גלובליים... + +&Tools +&כלים &Check now &בדוק עכשיו @@ -468,12 +657,18 @@ The command is triggered if: Check &automatically once a week בדוק &אוטומטית אחת לשבוע -Check for new version -בדוק האם קיימת גירסה חדשה +Check for new &version +בדוק גרסה &חדשה Compare השוואה +Comparison settings +הגדרות השוואה + +Synchronization settings +הגדרות סנכרון + Synchronize סנכרן @@ -486,6 +681,9 @@ The command is triggered if: Swap sides החלף צדדים +Save as batch job +שמור כעבודת אצווה + Hide excluded items הסתר פריטים שלט נכללו @@ -528,53 +726,8 @@ The command is triggered if: &Pause &עצור -Batch job -עבודת אצווה - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -יצר קובץ אצווה למכן את הסנכרון. הקלק פעמיים על קובץ זה או תזמן במתכנן המשימות: FreeFileSYnc.exe .ffs - -Help -עזרה - -Error handling -טיפול בשגיאות - -Ignore -התעלם - -Hide all error and warning messages -הסתר את כל הודעות ההזהרה והשגיאה - -Pop-up -מוקפץ - -Show pop-up on errors or warnings -הראה חלונות מוקפצים עבור שגיאות או אזהרות - -Exit -יציאה - -Abort synchronization on first error -הפסק פעולת סינכרון בשגיאה ראשונה - -Show progress dialog -הראה שיח התקדמות - -Save log -שמור קובץ יומן - -Select folder to save log files -בחר תיקיה לשמירת קובץ יומן - -Limit -הגבלה - -Limit maximum number of log files -הגבל מספר מכסימלי של קבצי יומן - -Select variant -בחר גרסה +Select a variant +בחר גירסה Files are found equal if @@ -589,9 +742,6 @@ are the same הם זהים -File time and size -זמן וגודל קובץ - Files are found equal if - file content @@ -603,39 +753,42 @@ is the same היא זהה -File content -תכולת הקובץ - Symbolic Link handling טיפול בקישור סימבולי +Help +עזרה + OK אשר -<- Two way -> -- דו כווני - - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. זהה והפץ שינויים בשני הצדדים. מחיקות העברות וסתירות מתגלים באופן אוטומטי באמצעות מסד נתונים. -Mirror ->> -מראה ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. גיבוי מראה של מחיצה ימנית. מחיצה שמאלית תתעדכן ותהיה זהה לימנית לאחר הסינכרון. -Update -> -שדרג -> - Copy new or updated files to right folder. העתק קבצים חדשים או מעודכנים למחיצה השמאלית. -Custom -מותאם - Configure your own synchronization rules. סדר את כללי הסנכרון שלך. +Error handling +טיפול בשגיאות + +Ignore +התעלם + +Hide all error and warning messages +הסתר את כל הודעות ההזהרה והשגיאה + +Pop-up +מוקפץ + +Show pop-up on errors or warnings +הראה חלונות מוקפצים עבור שגיאות או אזהרות + Deletion handling טיפול במחיקות @@ -660,23 +813,32 @@ is the same Naming convention: מוסכמות לקביעת שמות: -Item exists on left side only -הפריט קיים בצד ימין בלבד +Batch job +עבודת אצווה -Item exists on right side only -הפריט קיים בצד שמאל בלבד +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +יצר קובץ אצווה למכן את הסנכרון. הקלק פעמיים על קובץ זה או תזמן במתכנן המשימות: FreeFileSYnc.exe .ffs -Left side is newer -צד ימין חדש יותר +Exit +יציאה -Right side is newer -צד שמאל חדש יותר +Abort synchronization on first error +הפסק פעולת סינכרון בשגיאה ראשונה -Items have different content -הפריטים הם בעלי תוכן שונה +Show progress dialog +הראה שיח התקדמות -Conflict/item cannot be categorized -סתירה/פריט אינו ניתן לסיווג +Save log +שמור קובץ יומן + +Select folder to save log files +בחר תיקיה לשמירת קובץ יומן + +Limit +הגבלה + +Limit maximum number of log files +הגבל מספר מכסימלי של קבצי יומן Source code written in C++ using: קוד מקור נכתב ב- C++ באמצעות: @@ -696,9 +858,6 @@ is the same Homepage אתר-הבית: -FreeFileSync at Sourceforge -FreeFileSync ב Sourceforge - Email דוא"ל: @@ -713,11 +872,11 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. רק קבצים המתאימים לכל הגדרות המסנן יסונכרנו. -הערה: שמות קבצים חייבים להיות מוגדרים באופן יחסי למחיצות הראשיות! +הערה: שמות קבצים חייבים להיות מוגדרים באופן יחסי למחיצות הראשיות. Include @@ -741,6 +900,9 @@ Note: File names must be relative to base directories! &Clear &נקה +Global settings +משתנים גלובליים + Fail-safe file copy כשלון באבטחת העתקת קובץ @@ -771,9 +933,6 @@ Note: File names must be relative to base directories! &Default &ברירת מחדל -Start synchronization -התחל סנכרון - Variant משתנה @@ -792,8 +951,20 @@ Note: File names must be relative to base directories! &Find next &מצא הבא -Main bar -סרגל ראשי +Delete +מחק + +Configure filter +תצורת מסנן + +Start synchronization +התחל סנכרון + +Find +חפש + +Select time span +בחר תחום זמן Folder pairs זוגות מחיצות @@ -804,6 +975,9 @@ Note: File names must be relative to base directories! Configuration תצורה +Main bar +סרגל ראשי + Filter files קבצי המסנן @@ -858,11 +1032,8 @@ Note: File names must be relative to base directories! Exclude via filter: אל תכלול בעזרת סנן: - -<בחירה מרובה> - -Delete -מחק +multiple selection +בחירה מרובה Include all הכלל הכל @@ -891,14 +1062,14 @@ Note: File names must be relative to base directories! Show "%x" הראה "%x" - -<פעילות אחרונה> +Last session +פעילות אחרונה Folder Comparison and Synchronization סנכרון קבצים ומחיצות -Configuration saved! -תצורה נשמרה! +Configuration saved +תצורה נשמרה FreeFileSync batch אצוות FreeFileSync @@ -912,9 +1083,6 @@ Note: File names must be relative to base directories! Never save changes אל תשמור שינויים לעולם -Configuration loaded! -תצורה הוטענה! - Show files that exist on left side only הראה קבצים הנמצאים אך ורק בצד ימין @@ -960,20 +1128,17 @@ Note: File names must be relative to base directories! Set as default הגדר כברירת מחדל -Operation aborted! -הפעולה בוטלה! +Operation aborted +הפעולה בוטלה -All folders are in sync! +All folders are in sync כל התיקיות מסונכרנות Comma separated list רשימה מופרדת פסיקים -Legend -מקרא - -File list exported! -רשימת קבצים יוצאה! +File list exported +רשימת קבצים יוצאה Searching for program updates... מחפש עידכוני תוכנה... @@ -984,6 +1149,9 @@ Note: File names must be relative to base directories! &Ignore &התעלם +Fatal Error +שגיאה פטלית + Don't show this warning again אל תראה אזהרה זו שוב @@ -1005,6 +1173,9 @@ Note: File names must be relative to base directories! Comparing content... משווה תכולה... +Info +מידע + Paused עצור @@ -1161,9 +1332,6 @@ Note: File names must be relative to base directories! Cannot write modification time of %x. לא יכול לרשום זמן שינוי של %x. -Cannot find system function %x. -לא יכול למצוא פונקצית מערכת %x. - Cannot read security context of %x. לא יכול לקרוא הקשר בטיחות של %x. @@ -1179,8 +1347,11 @@ Note: File names must be relative to base directories! Cannot create directory %x. לא יכול ליצור מחיצה %x. -Cannot copy symbolic link %x to %y. -לא יכול להעתיק קישור סימבולי %x אל %y. +Cannot create symbolic link %x. +לא יכול ליצור קישור סימבולי %x. + +Cannot find system function %x. +לא יכול למצוא פונקצית מערכת %x. Cannot copy file %x to %y. לא יכול להעתיק קובץ %x אל %y. @@ -1188,15 +1359,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: סוג של פריט %x אינו נתמך: +Cannot resolve symbolic link %x. +לא יכול לפענח את הקישור הסימבולי %x. + Cannot open directory %x. לא יכול לפתוח מחיצה %x. Cannot enumerate directory %x. לא יכול למספר מחיצה %x. -Detected endless directory recursion. -אובחנה רקורסית תיקיות אינסופית. - %x TB %x טרה בייט @@ -1230,6 +1401,9 @@ Note: File names must be relative to base directories! %x ימים +Failed to register to receive system messages. +נכשל נסיון להקשם לקבלת הודעות מערכת. + Cannot set privilege %x. לא יכול להגדיר זבות %x. @@ -1239,204 +1413,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. לא יכול לשנות קדימויות של תהליך קלט פלט. -Unable to move %x to the Recycle Bin! -לא יכול להעביר את %x לסל המיחזור! - -Both sides have changed since last synchronization! -שני הצדדים שונו מאז הסנכרון האחרון! - -Cannot determine sync-direction: -לא מזהה כוון סנכרון: - -No change since last synchronization! -אין שינוי מאז הסנכרון האחרון! - -The corresponding database entries are not in sync considering current settings. -ערכי מסד הנתונים המתאימים אינם מסונכרנים בהתחשב בהגדרות הנוכחיות. - -Setting default synchronization directions: Old files will be overwritten with newer files. -בחר ברירת מחדל של סנכרון: קבצים ישנים ידרסו ע"י קבצים חדשים יותר. - -Checking recycle bin availability for folder %x... -בודק זמינות סל מחזור עבור מחיצה %x... - -Moving file %x to recycle bin -מעביר קובץ %x לסל מחזור - -Moving folder %x to recycle bin -מעביר מחיצה %x לסל מחזור - -Moving symbolic link %x to recycle bin -מעביר קישור סימבולי %x לסל מחזור - -Deleting file %x -מוחק קובץ %x - -Deleting folder %x -מוחק מחיצה %x - -Deleting symbolic link %x -מוחק קישור סימבולי %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -סל מחזור אינו זמין עבור הנתיבים הבאים! קבצים ימחקו לצמיתות: - -The corresponding folder will be considered as empty. -המחיצה המתאימה תחשב כריקה. - -Cannot find the following folders: -לא יכול למצוא את המחיצות הבאות: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -אפשר להתעלם משגיאה זו ולהחשיב כל תיקיה כריקה. התיקיות יווצרו אוטומטית בזמן הסינכרון. - -Directories are dependent! Be careful when setting up synchronization rules: -מחיצות תלויות! זהירות בהגדרת כללי סנכרון: - -Start comparison -התחל השוואה - -Calculating sync directions... -מחשב כיווני סנכרון... - -Conflict detected: -התגלה קונפליקט: - -File %x has an invalid date! -קובץ %x מכיל תאריך שגוי! - -Files %x have the same date but a different size! -קובץ %x בעל תאריך זהה אך גודל שונה! - -Items differ in attributes only -פריטים שונים בתכונות בלבד - -Symbolic links %x have the same date but a different target. -לקישורים סימבוליים %x יש תאריך זהה אבל יעד שונה. - -Comparing content of files %x -השווה תכולה של קבצים %x - -Comparing files by content failed. -השוואת קבצים באמצעות תכולה נכשלה. - -Generating file list... -מייצר רשימת קבצים... - -Both sides are equal -שני הצדדים שווים - -Copy new item to left -העתק פריט חדש לצד ימין - -Copy new item to right -העתק פריט חדש לצד שמאל - -Delete left item -מחק פריט בצד ימין - -Delete right item -מחק פריט בצד שמאל - -Move file on left -העבר קובץ בצד ימין - -Move file on right -העבר קובץ בצד שמאל - -Overwrite left item -רשום על גבי פריט בצד ימין - -Overwrite right item -רשום על גבי פריט בצד שמאל - -Do nothing -אל תעשה כלום - -Update attributes on left -עדכן תכונות בצד ימין - -Update attributes on right -עדכן תכונות בצד שמאל - -Multiple... -הכפל... - -Moving file %x to %y -מעביר קובץ %x אל %y - -Moving folder %x to %y -מעביר מחיצה %x אל %y - -Moving symbolic link %x to %y -מעביר קישור סימבולי %x אל %y - -Removing old versions... -מסיר גרסאות ישנות... - -Creating symbolic link %x -יוצר קישור סימבולי %x - -Creating folder %x -יוצר מחיצה %x - -Overwriting file %x -דורס קובץ %x - -Overwriting symbolic link %x -דורס קישור סימבולי %x - -Verifying file %x -מאמת קובץ %x - -Updating attributes of %x -מעדכן תכונות של %x - -Cannot find %x. -לא מוצא %x. - -Target folder %x already existing. -תיקיית מטרה %x כבר קיימת. - -Target folder input field must not be empty. -קלט תיקיית מטרה אינה יכול להיות ריק. - -Folder input field for versioning must not be empty. -קלט שדה תיקייה עבור גירסאות אינו יכול להיות ריק. +Unable to move %x to the Recycle Bin. +לא יכול להעביר את %x לסל המיחזור. -Source folder %x not found. -תיקיית מקור %x לא נמצאת. - -The following items have unresolved conflicts and will not be synchronized: -לפריטים הבאים יש קונפליקטים בלתי פתורים והם לא יסונכרנו: - -Significant difference detected: -התגלה שוני גדול מידי: - -More than 50% of the total number of files will be copied or deleted! -יותר מ 50% מהקבצים ימחקו או יועתקו! - -Not enough free disk space available in: -אין מספיק מקום דיסק פנוי ב: - -Required: -נדרש: - -Available: -זמין: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -התיקייה שתשתנה היא חלק מריבוי זוגות תיקיות. אנא סקור מחדש הגדרות סינכרון. - -Synchronizing folder pair: -מסנכרן זוג תיקיות: +Cannot determine final path for %x. +לא יכול לקבוע את המסלול הסופי ל %x. -Generating database... -מייצר מסד נתונים... - -Creating Volume Shadow Copy for %x... -יוצר העתק volume shadow עבור %x... - -Data verification error: Source and target file have different content! -שגיאה של אימות נתונים קובץ מקור ומטרה בעלי תכולת נתונים שונה! +Error Code %x: +קוד שגיאה %x: diff --git a/BUILD/Languages/hungarian.lng b/BUILD/Languages/hungarian.lng index e407e030..a58698fb 100644 --- a/BUILD/Languages/hungarian.lng +++ b/BUILD/Languages/hungarian.lng @@ -1,179 +1,197 @@
- Magyar - Demon + Magyar + szittner hu_HU - hungary.png - 2 - n == 1 ? 0 : 1 + flag_hungary.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -A(z) %x mappa keresése... +Both sides have changed since last synchronization. +Mindkét oldal megváltozott az utolsó szikronizálás óta. -Items processed: -Feldolgozott elemek száma: +Cannot determine sync-direction: +Nem lehet meghatározni a szinkronizálás irányát: -Items remaining: -Hátralévő elemek száma: +No change since last synchronization. +Az utolsó szinkronizálás óta nem történt változás. -Total time: -Becsült idő: +The database entry is not in sync considering current settings. +Az adatbázis-bejegyzés nincs összhangban figyelembe véve a jelenlegi beállításokat. -Cannot set directory lock for %x. -A következő mappa zárolása sikertelen: %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +Alapértelmezett szinkronizálási irányok beállítása: a régebbi fájlokat írja felül az újabbakkal. -Show in Explorer -Mutatás az Intézőben +Checking recycle bin availability for folder %x... +A Lomtár elérhetőségének ellenőrzése a következő könyvtár vonatkozásában: %x. -Open with default application -Megnyitás az alapértelmezett alkalmazással +Moving file %x to recycle bin +%x fájl mozgatása a Lomtárba (Recycle Bin) -Browse directory -Mappa tallózása +Moving folder %x to recycle bin +%x könyvtár mozgatása a Lomtárba (Recycle Bin) -Abort requested: Waiting for current operation to finish... -Megszakítási kérelem: Várakozás a folyamatban lévő művelet befejezésére... +Moving symbolic link %x to recycle bin +%x szimbolikus hivatkozás mozgatása a Lomtárba (Recycle Bin) -Failure to create timestamp for versioning: -A verziókövetéshez szükséges időbélyeg létrehozása sikertelen: +Deleting file %x +%x Fájl törlése -RealtimeSync - Automated Synchronization -RealtimeSync - Automatikus szinkronizálás +Deleting folder %x +%x könyvtár törlése + +Deleting symbolic link %x +%x szimbolikus hivatkozás törlése + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +A Lomtár nem elérhető a következő könytárak esetében. A fájlok ehelyett végleges törlésre kerülnek! + +An exception occurred +Kivétel lépett fel + +Cannot find file %x. +Nem található a következő fájl: %x. Error Hiba -Selected variant: -Változat kiválasztása: +File %x does not contain a valid configuration. +A következő fájl nem tartalmaz érvényes beállításokat: %x. -Select alternate comparison settings -Alternatív összehasonlítás beállításai +A folder input field is empty. +A könyvtár beviteli mezeje üres. -Select alternate synchronization settings -Alternatív szinkronizációs beállítások kiválasztása +The corresponding folder will be considered as empty. +A kapcsolódó könyvtárat üresként kezeli. -Filter is active -A szűrő aktív +Cannot find the following folders: +A következő könyvtárak nem találhatóak: -No filter selected -Nincs szűrő kiválasztva +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Figyelmen kívül hagyhatod ezt a hibát ezzel üresnek tekintve minden egyes könyvtárat. A könytárak automatikusan létrejönnek a szinkronizálás folyamán. -Remove alternate settings -Alternatív beállítások eltávolítása +The following folders have dependent paths. Be careful when setting up synchronization rules: +A következő könytárak egymástól függő útvonalat tartalmaznak. Légy óvatos a szinkronizálás szabályainak meghatározásánál! -Clear filter settings -Szűrőbeállítások törlése +File %x has an invalid date. +%x fájl dátuma érvénytelen. -Copy -Másolás +Date: +Dátum: -Paste -Beillesztés +Files %x have the same date but a different size. +A(z) %x fájlok dátuma megegyezik, de a méretük nem. -Save as batch job -Mentés kötegelt feladatként +Size: +Méret: -Comparison settings -Összehasonlítási beállítások +Items differ in attributes only +Az elemek csak attribútumaikban különböznek -Synchronization settings -Szinkronizáció beállításai +Resolving symbolic link %x +A %x szimbolikus hivatkozás feloldása -About -A programról +Comparing content of files %x +%x fájlok tartalmának összehasonlítása -Confirm -Megerősítés +Generating file list... +Fájllista generálása... -Configure filter -Szűrő beállítása +Starting comparison +Kezdi az összehasonlítást -Global settings -Globális beállítások +Calculating sync directions... +Szinkronizálási irányok számítása... -Find -Keresés: +Out of memory. +Memória túlcsordulás. -Select time span -Időintervallum kiválasztása +Item exists on left side only +Az elem csak a bal oldalon létezik -Invalid command line: -Érvénytelen parancssor: +Item exists on right side only +Az elem csak a jobb oldalon létezik -Info -Információ +Left side is newer +A bal oldal újabb -Warning -Figyelem +Right side is newer +A jobb oldal újabb -Fatal Error -Kritikus hiba +Items have different content +Az elemek tartalma különböző -Error Code %x: -Hibakód %x: +Both sides are equal +Mindkét oldal azonos -Cannot resolve symbolic link %x. -Sikertelen a következő symlink feloldása: %x. +Conflict/item cannot be categorized +Az ütközés vagy elem nem kategorizálható -Cannot determine final path for %x. - +Copy new item to left +Új elem másolása a bal oldalra -Cannot find system function %x. -Nem található a következő rendszerfunkció: %x. +Copy new item to right +Új elem másolása a jobb oldalra - -1 Byte -%x Bytes - - -1 Bájt -%x Bájt - +Delete left item +Bal oldali elem törlése -%x MB -%x MB +Delete right item +Jobb oldali elem törlése -%x KB -%x KB +Move file on left +Bal oldali fájl mozgatása -%x GB -%x GB +Move file on right +Jobb oldali fájl mozgatása + +Overwrite left item +Bal oldali elem fölülírása + +Overwrite right item +Jobb oldali elem fölülírása + +Do nothing +Nincs mit csinálni + +Update attributes on left +Attribútumok frissítése a bal oldalon + +Update attributes on right +Attribútumok frissítése a jobb oldalon Database file %x is incompatible. -Inkompatibilis adatbázisfájl: %x. +%x adatbázisfájl inkompatibilis: . Initial synchronization: -Első szinkronizáció: +Kezdeti szinkronizálás: Database file %x does not yet exist. -A következő adatbázisfájl nem létezik: %x. +%x adatbázisfájl még nem létezik. Database file is corrupt: Sérült adatbázisfájl: -Out of memory! -Elfogyott a szabad memória! - Cannot write file %x. -A következő fájl írása sikertelen: %x. +A következő fájl írása nem sikerült: %x. Cannot read file %x. -A következő fájl olvasása sikertelen: %x. +A következő fájl olvasása nem sikerült: %x. Database files do not share a common session. -Az adatbázisfájlok nem osztanak meg közös munkamenetet. +Az adatbázisfájloknak nincs közös munkafolyamatuk. -An exception occurred! -Kivétel keletkezett! +Searching for folder %x... +%x könyvtár keresése... Cannot read file attributes of %x. -A következő fájl attribútumainak olvasása sikertelen: %x. +%x fájl attribútumainak olvasása nem sikerült. Cannot get process information. -A processzinformációk lekérdezése sikertelen. +Nem sikerült lekérdezni processz-információkat. Waiting while directory is locked (%x)... -Várakozás a mappa zárolásának a feloldására (%x)... +Várakozás a könyvtár zárolásának a feloldására (%x)... 1 sec @@ -187,8 +205,38 @@ Creating file %x %x fájl létrehozása +Items processed: +Feldolgozott elemek száma: + +Items remaining: +Hátralévő elemek száma: + +Total time: +Összes időszükségelet: + + +1 Byte +%x Bytes + + +1 Bájt +%x Bájt + + +%x MB +%x MB + +%x KB +%x kB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. -Hiba történt a fájl feldolgozása közben: %x fájl, %y sor, %z oszlop. +Hiba történt a feldolgozás közben: %x fájl, %y sor, %z oszlop. + +Cannot set directory lock for %x. +Nem sikerült zárolni a(z) %x könyvtárat. Scanning: Vizsgálat: @@ -208,32 +256,41 @@ /sec /másodperc -File %x does not contain a valid configuration. -A következő fájl nem tartalmaz érvényes beállításokat: %x. - Configuration file %x loaded partially only. -Csak részlegesen töltődött be a következő beállításokat tartalmazó fájl: %x. +%x konfigurációs fájl csak részlegesen töltődött be: . + +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 Cannot access Volume Shadow Copy Service. -A Volume Shadow Copy szolgáltatás elérése sikertelen. +Nem sikerült elérni a kötet-árnyékmásolat (Volume Shadow Copy) szolgáltatást. Please use FreeFileSync 64-bit version to create shadow copies on this system. -Kérjük, használd a FreeFileSync 64 bites verzióját a shadow másolatok készítéséhez ezen a rendszeren. +Kérjük, használd a FreeFileSync 64 bites verzióját az árnyékmásolatok készítéséhez ezen a rendszeren. Cannot load file %x. -%x fájl betöltése sikertelen. +%x fájl betöltése nem sikerült. -Path %x does not contain a volume name. -A következő útvonal nem tartalmaz kötetnevet: %x. +Cannot determine volume name for %x. +Nem lehet meghatározni a kötet-nevet a(z) %x számára -Volume name %x not part of file name %y! -A(z) %x kötetnevet nem tartalmazza a(z) %y fájlnév! +Volume name %x not part of file name %y. +%x kötet-nevet nem tartalmazza a(z) %y fájlnév. -Cannot read the following XML elements: -A következő XML elemek olvasása sikertelen: +Abort requested: Waiting for current operation to finish... +Megszakítást igényelt: Várakozás a folyamatban lévő művelet befejezésére... -Cannot find file %x. -Nem található a következő fájl: %x. +Failure to create timestamp for versioning: +Nem sikerült a verziókövetéshez szükséges időbélyeg létrehozása: + +Cannot read the following XML elements: +Nem sikerült a következő XML elemek olvasása: &Open... &Megnyitás... @@ -260,7 +317,7 @@ Használat: 1. Select folders to watch. -1. Válaszd ki a figyelendő mappát. +1. Válaszd ki a figyelendő könyvtárat. 2. Enter a command line. 2. Add meg a parancssort. @@ -272,25 +329,25 @@ Az induláshoz importálj be egy .ffs_batch fájlt. Folders to watch -Figyelendő mappák +Figyelendő könyvtárak Add folder -Mappa hozzáadása +Könyvtárat hozzáad Remove folder -Mappa eltávolítása +Könyvtárat eltávolít Browse -Tallózás +Tallóz Select a folder -Mappa kiválasztása +Könyvtárat kiválaszt Idle time [seconds] -Tétlenségi idő (másodpercekben) +Üresjárat (másodpercben) Idle time between last detected change and execution of command -Tétlenség időtartama az utolsó változás észlelése és a parancs végrehajtása között +Üresjárat időtartama az utolsó változás észlelése és a parancs végrehajtása között Command line Parancssor @@ -302,8 +359,8 @@ The command is triggered if: A parancs végrehajtódik, ha: -- fájlok vagy almappák megváltoznak -- új mappák jelennek meg (pl. USB-kulcs csatlakoztatása) +- fájlok vagy alkönyvtárak megváltoznak +- új könyvtárak jelennek meg (pl. USB-kulcs csatlakoztatása) Start @@ -315,50 +372,155 @@ A parancs végrehajtódik, ha: Cancel Mégsem +RealtimeSync - Automated Synchronization +Valós idejű - Automatikus szinkronizálás + +Warning +Figyelem + Build: %x Build: %x +About +A programról + All files Összes fájl &Restore -&Visszaállítás +&Visszaállít &Exit -&Kilépés - -Monitoring active... -Figyelés aktív... +&Kilép Waiting for missing directories... -Várakozás a hiányzó mappákra... +Várakozás a hiányzó könyvtárakra... -A folder input field is empty. -A mappa beviteli mezeje üres. +Invalid command line: +Érvénytelen parancssor: + +File content +Fájl tartalma + +File time and size +Fájl dátuma és mérete + + Two way + Kétirányú + +Mirror +Tükröz + +Update +Frissít + +Custom +Egyedi + +Multiple... +Sokszoroz + +Moving file %x to %y +%x fájl mozgatása ide: %y + +Moving folder %x to %y +%x könyvtár mozgatása ide: %y + +Moving symbolic link %x to %y +%x szimbolikus hivatkozás mozgatása ide: %y + +Removing old versions... +Régi verziók eltávolítása... + +Creating symbolic link %x +%x szimbolikus hivatkozás létrehozása + +Creating folder %x +%x könyvtár létrehozása + +Overwriting file %x +%x fájl felülírása + +Overwriting symbolic link %x +%x szimbolikus hivatkozás felülírása + +Verifying file %x +%x fájl ellenőrzése + +Updating attributes of %x +%x attribútumainak frissítése + +Cannot find %x. +%x nem található. + +Target folder %x already existing. +%x célkönyvtár már létezik. + +Target folder input field must not be empty. +A célkönytárat meghatározó beviteli mező nem lehet üres. + +Folder input field for versioning must not be empty. +A verziókövetéshez a könytárat meghatározó beviteli mező nem lehet üres. + +Source folder %x not found. +%x forráskönyvtár nem található . + +The following items have unresolved conflicts and will not be synchronized: +A következő elemek feloldatlan ütközést tartalmaznak, így nem lesznek szinkronizálva: + +Significant difference detected: +Jelentős különbség érzékelt: + +More than 50% of the total number of files will be copied or deleted. +Az összes fájl több mint 50%-át másolni vagy törölni fogja. + +Not enough free disk space available in: +Nincs elég szabad lemezterület: + +Required: +Szükséges: + +Available: +Szabad: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Egy olyan könyvtár kerül módosításra, amely több könyvtár-pár része. Kérjük, ellenőrizze a szinkronizálási beállításokat. + +Synchronizing folder pair: +A szinkronizált könytár-pár: + +Generating database... +Adatbázis generálása... + +Creating Volume Shadow Copy for %x... +Kötet árnyékmásolat (Volume Shadow Copy) létrehozása %x számára... -Synchronization aborted! -A szinkronizáció megszakítva! +Data verification error: %x and %y have different content. +Adat-ellenőrzési hiba: %x és %y tartalma különböző. -Synchronization completed with errors! -A szinkronizáció befejeződött, de akadtak hibák! +Synchronization aborted +A szinkronizálás megszakítva -Synchronization completed with warnings. -A szinkronizáció befejeződött figyelmeztetésekkel. +Synchronization completed with errors +A szinkronizálás befejeződött, de történtek hibák -Nothing to synchronize! -Nincs mit szinkronizálni! +Synchronization completed with warnings +A szinkronizálás befejeződött, de figyelmeztetésekkel -Synchronization completed successfully. -A szinkronizáció sikeresen befejeződött. +Nothing to synchronize +Nincs mit szinkronizálni + +Synchronization completed successfully +A szinkronizálás sikeresen befejeződött Saving log file %x... Naplófájl mentése a következő fájlba: %x. Press "Switch" to resolve issues in FreeFileSync main dialog. -Nyomg meg a "Váltás" gombot az események kezeléséhez a FreeFileSync fő párbeszédablakában. +Nyomd meg az "Váltás" gombot az események kezeléséhez a FreeFileSync fő párbeszédablakában. -Switching to FreeFileSync main dialog... -Váltás a FreeFileSync fő párbeszédablakára... +Switching to FreeFileSync main dialog +Váltás a FreeFileSync fő párbeszéd-ablakára A new version of FreeFileSync is available: Elérhető a FreeFileSync új verziója: @@ -366,29 +528,29 @@ A parancs végrehajtódik, ha: Download now? Letöltsem most? -FreeFileSync is up to date! -A FreeFileSync naprakész! +New version found +Új verziót találtam -Information -Információ +&Download +&Letölt -Unable to connect to sourceforge.net! -A csatlakozás a sourceforge.net-hez sikertelen! +FreeFileSync is up to date. +A FreeFileSync naprakész. -Current FreeFileSync version number was not found online! Do you want to check manually? -A jelenlegi FreeFileSync verziószám nem található meg online. Akarod manuálisan ellenőrizni? +Information +Információ -Do you want FreeFileSync to automatically check for updates every week? -Akarod, hogy a FreeFileSync automatikusan minden héten keressen frissítést? +Unable to connect to sourceforge.net. +Nem sikerült a csatlakozás a sourceforge.net-hez. -(Requires an Internet connection!) -(Internetkapcsolat szükséges!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Nem lehet online megtalálni a jelenlegi FreeFileSync verziószámot. Meg akarod keresni manuálisan? - - +Symlink +Symlink - - +Folder +Könyvtár Full path Teljes elérési útvonal @@ -400,7 +562,7 @@ A parancs végrehajtódik, ha: Relatív útvonal Base folder -Főmappa +Alapkönyvtár Size Méret @@ -411,12 +573,6 @@ A parancs végrehajtódik, ha: Extension Kiterjesztés -Size: -Méret: - -Date: -Dátum: - Category Kategória @@ -427,160 +583,151 @@ A parancs végrehajtódik, ha: Húzd && Ejtsd Close progress dialog -Folyamatjelző párbeszédablak bezárása +Zárja be a folyamatjelző párbeszédablakot Standby Készenléti állapot Log off -Kijelentkezés +Kijelentkezik Shut down -Gép leállítása +Leállítja a gépet Hibernate -Hibernálás +Hibernál + +Selected variant: +Kiválasztott változat: + +Select alternate comparison settings +Válassz más összehasonlítási beállításokat + +Select alternate synchronization settings +Válassz más szinkronizálási beállításokat + +Filter is active +A szűrő aktív + +No filter selected +Nincs kiválasztott szűrő + +Remove alternate settings +Törölje a módosított beállításokat + +Clear filter settings +Törölje a szűrőbeállításokat + +Copy +Másol + +Paste +Beilleszt &New &Új &Save -&Mentés +&Ment Save as &batch job... -Mentés &kötegelt feladatként... +Mentse &kötegelt feladatként... 1. &Compare -1. &Összehasonlítás +1. &Összehasonlít 2. &Synchronize -2. &Szinkronizálás +2. &Szinkronizál &Language &Nyelv +&Export file list... +&Exportálja a fájllistát... + &Global settings... &Globális beállítások... -&Export file list... -&Fájllista exportálása... - -&Advanced -&Haladó +&Tools +Es&zközök &Check now -&Ellenőrzés most +&Ellenőrizze most Check &automatically once a week &Automatikus ellenőrzés hetente -Check for new version -Új verzió keresése +Check for new &version +Vizsgál&ja meg, létezik-e új verzió Compare -Összehasonlítás +Összehasonlít + +Comparison settings +Összehasonlítási beállítások + +Synchronization settings +Szinkronizálási beállítások Synchronize -Szinkronizálás +Szinkronizál Add folder pair -Mappa pár megadása +Adjon hozzá könyvtár-párt Remove folder pair -Mappa párok eltávolítása +Távolítsa el a könyvtár-párt Swap sides -Oldalak felcserélése +Cserélje fel az oldalakat + +Save as batch job +Mentse kötegelt feladatként Hide excluded items -Kizárt elemek elrejtése +Rejtse el a kizárt elemeket Show filtered or temporarily excluded files -A szűrt vagy ideiglenesen kizárt fájlok mutatása +Mutassa a szűrt vagy ideiglenesen kizárt fájlokat Number of files and folders that will be created -A létrehozandó fájlok és mappák száma - -Number of files that will be overwritten -A felülírandó fájlok száma - -Number of files and folders that will be deleted -A törlendő fájlok és mappák száma - -Total bytes to copy -Összesen másolandó bájtok - -Items found: -Talált elemek száma: - -Speed: -Sebesség: - -Time remaining: -Hátralévő idő: - -Time elapsed: -Eltelt idő: - -Synchronizing... -Szinkronizálás folyamatban... - -On completion -Befejezés esetén - -Close -Bezárás - -&Pause -&Szünet - -Batch job -Kötegelt feladat - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Kötegelt fájl létrehozása a szinkronizálás automatizálásához. Kattints duplán a fájlon vagy ütemezed be a rendszered feladatütemezőjével: FreeFileSync.exe .ffs_batch - -Help -Súgó - -Error handling -Hibakezelés - -Ignore -Kihagy +A létrehozandó fájlok és könyvtárak száma -Hide all error and warning messages -Összes hibaüzenet és figyelmeztetés elrejtése +Number of files that will be overwritten +A felülírandó fájlok száma -Pop-up -Párbeszédablak +Number of files and folders that will be deleted +A törlendő fájlok és könyvtárak száma -Show pop-up on errors or warnings -Párbeszédablakok mutatása hiba vagy figyelmeztetés esetén +Total bytes to copy +Összesen másolandó bájtok -Exit -Kilépés +Items found: +Talált elemek száma: -Abort synchronization on first error -Szinkronizáció leállítása az első hibánál +Speed: +Sebesség: -Show progress dialog -Folyamatjelző párbeszédablak mutatása +Time remaining: +Hátralévő idő: -Save log -Naplófájl mentése +Time elapsed: +Eltelt idő: -Select folder to save log files -Válaszd ki a mappát a naplófájlok mentéséhez +Synchronizing... +Szinkronizálás folyamatban... -Limit -Korlát +On completion +Befejezés esetén -Limit maximum number of log files -Naplófájlok maximális számának korlátozása +Close +Bezár + +&Pause +&Várakozás -Select variant -Változat kiválasztása +Select a variant +Válassz egy variánst Files are found equal if @@ -589,110 +736,121 @@ Files are found equal if are the same -A fájlok egyezőnek tekintendők, ha megegyezik - - az utolsó módosításuk dátuma és ideje +A fájlokat egyezőnek tekintjük, ha + - az utolsó módosításuk (írásuk) dátuma és időpontja, valamint - a fájlméret +megegyezik -File time and size -Fájl dátuma és mérete - Files are found equal if - file content is the same -A fájlok megegyeznek, ha megegyezik +A fájlokat egyezőnek tekintjük, ha - a fájlok tartalma +megegyezik -File content -fájl tartalma alapján - Symbolic Link handling -Symlink kezelés +Szimbolikus hivatkozás kezelése + +Help +Súgó OK OK -<- Two way -> -<- Kétirányú -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. -Változások keresése mindkét oldalon. A törlések, mozgatások és ütközések automatikus felismerése adatbázis segítségével. - -Mirror ->> -Tükrözés ->> +Változások keresése és bemutatása mindkét oldalon. A törléseket, mozgatásokat és ütközéseket automatikusan ismeri fel egy adatbázis segítségével. Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. -A bal oldali mappa tükrözött másolata. A jobb oldali mappa úgy lesz megváltoztatva, hogy a szinkronizáció után pontosan megegyezzen a bal oldalival. - -Update -> -Frissítés -> +A bal oldali könyvtár tükörmásolata. A jobb oldali könyvtárat úgy változtatja meg, hogy a szinkronizálás után pontosan egyezzen a bal oldalival. Copy new or updated files to right folder. -Új vagy frissített fájlok másolása a jobb oldali mappába. - -Custom -Egyedi +Másolja az új vagy frissített fájlokat a jobb oldali könyvtárba. Configure your own synchronization rules. -Saját szinkronizálási szabályok beállítása. +Állítsd be a saját szinkronizálási szabályaidat + +Error handling +Hibakezelés + +Ignore +Kihagy + +Hide all error and warning messages +Rejtse el az összes hibaüzenetet és figyelmeztetést + +Pop-up +Párbeszédablak + +Show pop-up on errors or warnings +Hiba vagy figyelmeztetés esetén mutasson párbeszédablakot Deletion handling -Törlések kezelése +Törlés kezelése Permanent Állandó Delete or overwrite files permanently -A fájlok folyamatos törlése vagy felülírása +Törölje vagy írja felül véglegesen a fájlokat Recycle Bin Lomtár (Recycle Bin) Use Recycle Bin for deleted and overwritten files -Lomtár használata a törölt és felülírt fájlokhoz +Használd a Lomtárat a törölt és felülírt fájlok számára Versioning Verziókövetés Move files to user-defined folder -Fájlok mozgatása előre megadott mappába +Mozgasd a fájlokat a felhasználó által megadott könyvtárba Naming convention: Elnevezési konvenció: -Item exists on left side only -Az elem csak a bal oldalon létezik +Batch job +Kötegelt feladat -Item exists on right side only -Az elem csak a jobb oldalon létezik +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Kötegelt fájl létrehozása a szinkronizálás automatizálásához. Kattints duplán a fájlnévre vagy ütemezd a rendszered feladatütemezőjével: FreeFileSync.exe .ffs_batch -Left side is newer -A bal oldal újabb +Exit +Kilép -Right side is newer -A jobb oldal újabb +Abort synchronization on first error +Állítsa le a szinkronizálást az első hibánál -Items have different content -Az elemek tartalma különbözik +Show progress dialog +Mutassa a folyamatjelző párbeszédablakot -Conflict/item cannot be categorized -Az ütközés vagy elem nem kategorizálható +Save log +Mentssa a naplófájlt + +Select folder to save log files +Válaszd ki a naplófájlok mentésére szolgáló könytárat + +Limit +Korlát + +Limit maximum number of log files +Naplófájlok maximális számának korlátja Source code written in C++ using: A programot C++-ban fejlesztették a következők felhasználásával: If you like FreeFileSync -FreeFileSync támogatása +Ha szereted a FreeFileSync-et Donate with PayPal -Ha szereted a FreeFileSync-et, támogasd a PayPal segítségével. +Támogasd a PayPal segítségével Many thanks for localization: -Ezer köszönet a lokalizációért: +Köszönet a lokalizációért: Feedback and suggestions are welcome Várjuk a visszajelzéseket és az ötleteket @@ -700,35 +858,32 @@ A fájlok megegyeznek, ha megegyezik Homepage Honlap -FreeFileSync at Sourceforge -FreeFileSync a Sourceforge-on - Email E-mail Published under the GNU General Public License -Kiadva a GNU General Public License alatt +Közzétéve a GNU General Public License alatt Delete on both sides Törlés mindkét oldalon Delete on both sides even if the file is selected on one side only -Törlés mindkét oldalon, még akkor is, ha csak egyik oldalon lett kijelölve +Törlés mindkét oldalon, még akkor is, ha a fájl csak az egyik oldalon lett kijelölve Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. -Csak azok a fájlok lesznek szinkronizálva, amelyek megfelelnek az összes szűrő beállításnak. -Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszonyítva! +Csak a valamennyi szűrő-beállításnak megfelelő fájlok lesznek szinkronizálva. +Megjegyzés: A fájlneveket az alapkönyvtárakhoz képest kell vizsgálni. Include -Csatolni +Csatol Exclude -Kizárni +Kizár Time span Időtartam @@ -743,93 +898,108 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony Maximum &Clear -&Törlés +&Töröl + +Global settings +Globális beállítások Fail-safe file copy Hibamentes fájlmásolás Write to a temporary file (*.ffs_tmp) first then rename it. This guarantees a consistent state even in case of fatal error. -Írás egy ideiglenes fájlba (*.ffs_tmp), majd annak átnevezése. Ez egyező állapotot garantál még végzetes hiba esetén is. +Írja egy ideiglenes fájlba (*.ffs_tmp), majd azt nevezze át. Ez garantálja az konzisztens állapotot még végzetes hiba esetén is. Copy locked files -Zárolt fájlok másolása +Másolja a zárolt fájlokat Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) -A megosztott vagy zárolt fájlok másolása a Volume Shadow Copy szolgáltatással (Adminisztrátori jogok szükségesek) +Másolja a megosztott vagy zárolt fájlokat a Volume Shadow Copy szolgáltatással (Adminisztrátori jogosultság szükséges) Copy file access permissions -Fájl hozzáférési jogosultságainak másolása +Másolja a fájl hozzáférési jogosultságokat Transfer file and folder permissions (Requires Administrator rights) -Fájlok és mappák jogosultságának átvitele (adminisztrátori jogok szükségesek) +Fájlok és könytárak jogosultságainak átvitele (Adminisztrátori jogosultság szükséges) Restore hidden dialogs -Rejtett párbeszédablakok visszaállítása +Állítsa vissza a rejtett párbeszédablakokat External applications Külső alkalmazások Description -Megjegyzés +Leírás &Default &Alapértelmezett -Start synchronization -Szinkronizáció indítása - Variant Variáns Statistics -Statisztikák +Statisztika Don't show this dialog again -Ne mutasd ezt a párbeszédablakot többé +Ne mutasd többé ezt a párbeszédablakot Find what: -Mit keresünk: +Mit keres: Match case -Kis-/nagybetű egyezés +Kis-/nagybetű megkülönböztetése &Find next -&Következő keresése +&Keresse a következőt + +Delete +Töröl + +Configure filter +Beállítja a szűrőt + +Start synchronization +Indítja a szinkronizálást + +Find +Keres: + +Select time span +Kiválasztja az időintervallumot Folder pairs -Mappa párok +Könyvtár-párok Overview -Összefoglaló +Áttekintés Configuration Beállítás Main bar -Fő panel +Fő sáv Filter files -Fájlok szűrése +Szűrje a fájlokat Select view -Nézet kiválasztása +Válasszon nézetet Open... -Megnyitás... +Megnyit... Save -Mentés +Ment Compare both sides -Mindkét oldal összehasonlítása +Vesse össze mindkét oldalt 1 directory %x directories -1 mappát -%x mappát +1 könyvtárat +%x könyvtárat @@ -846,36 +1016,33 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony %y of %x rows in view -%y sor látható +1 sorból %y sor látható %x sorból %y látható Set direction: -Irány +Állítsa be az irányt: Exclude temporarily -Ideiglenesen kizár +Zárja ki ideiglenesen Include temporarily -Ideiglenesen csatolni +Csatolja ideiglenesen Exclude via filter: -Kizárás szűrő segítségével: +Zárja ki szűrő segítségével: - - - -Delete -Törlés +multiple selection +többszörös kijelölés Include all -Csatolni az összeset +Csatolja az összest Exclude all -Kizárni az összeset +Zárja ki az összest Show icons: -Ikonok mutatása: +Mutassa az ikonokat: Small Kicsi @@ -895,98 +1062,98 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony Show "%x" "%x" mutatása - - +Last session +Utolsó munkamenet Folder Comparison and Synchronization -Mappa összehasonlítás és szinkronizáció +Könyvtár összehasonlítás és szinkronizálás -Configuration saved! -Beállítások elmentve! +Configuration saved +Beállítások elmentve FreeFileSync batch FreeFileSync kötegelt fájl Do you want to save changes to %x? -Akarod menteni a %x változtatásait? +Akarod menteni a(z) %x változtatásait? Do&n't save -Ne mentsd +&ne mentse Never save changes -Változtatások figyelmen kívül hagyása - -Configuration loaded! -Beállítások betöltve! +Ne mentse a változtatásokat Show files that exist on left side only -Csak a bal oldalon létező fájlok mutatása +Mutassa a csak a bal oldalon létező fájlokat Show files that exist on right side only -Csak a jobb oldalon létező fájlok mutatása +Mutassa a csak a jobb oldalon létező fájlokat Show files that are newer on left -A bal oldali újabb fájlok mutatása +Mutassa a fájlokat, amelyek a bal oldalon frissebbek Show files that are newer on right -A jobb oldali újabb fájlok mutatása +Mutassa a fájlokat, amelyek a jobb oldalon frissebbek Show files that are equal -Egyező fájlok mutatása +Mutassa az egyező fájlokat Show files that are different -Eltérő fájlok mutatása +Mutassa az eltérő fájlokat Show conflicts -Ütközések mutatása +Mutassa az ütközéseket Show files that will be created on the left side -A bal oldalon létrehozandó fájlok mutatása +Mutassa a bal oldalon létrehozandó fájlokat Show files that will be created on the right side -A jobb oldalon létrehozandó fájlok mutatása +Mutassa a jobb oldalon létrehozandó fájlokat Show files that will be deleted on the left side -A bal oldalon törlendő fájlok mutatása +Mutassa a bal oldalon törlendő fájlokat Show files that will be deleted on the right side -A jobb oldalon törlendő fájlok mutatása +Mutassa a jobb oldalon törlendő fájlokat Show files that will be overwritten on left side -A bal oldalon felülírandó fájlok mutatása +Mutassa a bal oldalon felülírandó fájlokat Show files that will be overwritten on right side -A jobb oldalon felülírandó fájlok mutatása +Mutassa a jobb oldalon felülírandó fájlokat Show files that won't be copied -A nem másolandó fájlok mutatása +Mutassa a nem másolandó fájlokat Set as default Beállítás alapértelmezettként -Operation aborted! -Művelet megszakítva! +Operation aborted +Művelet megszakítva -All folders are in sync! -Minden mappa szinkronban! +All folders are in sync +Minden könyvtár szinkronban Comma separated list -Comma separated values +CSV formátumú (vesszővel elválasztott) lista -File list exported! -A fájllista exportálása befejeződött! +File list exported +A fájllista exportálása befejeződött Searching for program updates... -Szoftverfrissítés keresése... +Programfrissítés keresése... Ignore further errors -További hibák figyelmen kívül hagyása +Hagyja figyelmen kívül a további hibákat &Ignore &Kihagy +Fatal Error +Kritikus hiba + Don't show this warning again -Figyelmeztetés elrejtése legközelebb +Ne mutassa ismét ezt a figyelmeztetést &Switch &Váltás @@ -1006,8 +1173,11 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony Comparing content... Tartalom összehasonlítása... +Info +Információ + Paused -Szüneteltetve +Megállítva Initializing... Inicializálás... @@ -1016,10 +1186,10 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony Megszakítva Completed -Befejezve +Befejeződött Continue -Folytatás +Folytat Pause Szünet @@ -1043,7 +1213,7 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony Ehavi This year -Idei +Ezévi Last x days Utolsó x nap @@ -1052,7 +1222,7 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony Bájt KB -KB +kB MB MB @@ -1082,46 +1252,46 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony Közvetlen Follow -Követés +Követ Copy NTFS permissions -NTFS jogosultságok másolása +Másolja az NTFS jogosultságokat Integrate external applications into context menu. The following macros are available: -Külső alkalmazás integrálása a helyi menübe. Az elérhető makrók a következők: +Integráljon a helyi menübe külső alkalmazásokat. A következő makrók érhetők et: - full file or folder name -- teljes fájl- vagy mappanév +- teljes fájl- vagy könyvtárnév - folder part only -- csak mappa rész +- csak a könyvtár része - Other side's counterpart to %item_path% -- A másik oldal megfelelőjét a következő fájlba: %item_path% +- A másik oldali megfelelőjét a következő fájlba: %item_path% - Other side's counterpart to %item_folder% -- A másik oldal megfelelőjét a következő mappába: %item_path% +- A másik oldali megfelelőjét a következő könyvtárba: %item_folder% Make hidden warnings and dialogs visible again? -Tegyük újra láthatóvá a rejtett figyelmeztetéseket és párbeszédablakokat? +Tegye újra láthatóvá a rejtett figyelmeztetéseket és párbeszédablakokat? Leave as unresolved conflict -Feloldatlan ütközésként hagyni +Hagyja feloldatlan ütközésként Replace -Felülírás +Felülír Move files and replace if existing -Fájlok mozgatása és felülírása létezés esetén +Mozgassa a fájlokat és írja felül amennyiben léteztek Time stamp Időbélyeg Append a timestamp to each file name -Időbélyeg hozzáadása a minden fájlnévhez +Adjon időbélyeget minden fájlnévhez Folder -Mappa +Könyvtár File Fájl @@ -1139,58 +1309,64 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony Százalék Cannot monitor directory %x. -A következő mappa monitorozása sikertelen: %x. +Nem sikerült monitorozni a(z) %x könyvtárat. Conversion error: Konverziós hiba: Cannot delete file %x. -A következő fájl törlése sikertelen: %x. +Nem sikerült a(z) %x fájl törlése. The file is locked by another process: -A fájl zárolva van egy másik processz által: +A fájlt egy másik processz zárolta: Cannot move file %x to %y. -%x fájl mozgatása %y fájlba sikertelen. +Nem sikerült %x fájl mozgatása %y fájlba. Cannot delete directory %x. -A következő mappa törlése sikertelen: %x. +Nem sikerült a %x könyvtár törlése. Cannot write file attributes of %x. -A következő fájl attribútumainak írása sikertelen: %x. +Nem sikerült %x fájl attribútumainak írása. Cannot write modification time of %x. -Az utolsó módosítás dátumának a beállítása sikertelen a következő fájlnál: %x. +Nem sikerült felírni az utolsó módosítás dátumát a következőnél: %x. Cannot read security context of %x. -A következő fájl biztonsági tulajdonságainak olvasása sikertelen: %x. +Nem sikerült a biztonsági környezet olvasása a következőnél: %x. Cannot write security context of %x. -A következő fájl biztonsági tulajdonságainak írása sikertelen: %x. +Nem sikerült a biztonsági környezet írása a következőnél: %x. Cannot read permissions of %x. -A következő fájl jogosultságainak az olvasása sikertelen: %x. +Nem sikerült a jogosultságok olvasása a következőnél: %x. Cannot write permissions of %x. -A következő fájl jogosultságainak az írása sikertelen: %x. +Nem sikerült a jogosultságok írása a következőnél: %x. Cannot create directory %x. -A következő mappa létrehozása sikertelen: %x. +Nem sikerült a következő könyvtár létrehozása: %x. Cannot create symbolic link %x. - +Nem lehet létrehozni a(z) %x szimbolikus hivatkozást + +Cannot find system function %x. +Nem található a következő rendszerfunkció: %x. Cannot copy file %x to %y. -%x fájl másolása a(z) %y fájlba sikertelen. +%x fájl másolása a(z) %y fájlba nem sikerült. Type of item %x is not supported: A(z) %x elem típusa nem támogatott: +Cannot resolve symbolic link %x. +Nem sikerült a következő szimbolikus hivatkozás feloldása: %x. + Cannot open directory %x. -A következő mappa megnyitása sikertelen: %x. +A %x könyvtár megnyitása nem sikerült. Cannot enumerate directory %x. -A következő mappa sorszámozása sikertelen: %x. +Nem sikerült besorolni a(z) %x könyvtárat. . %x TB %x TB @@ -1225,210 +1401,24 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony %x nap +Failed to register to receive system messages. +Nem sikerült regisztrálni, hogy megkaphassa a rendszer-üzeneteket + Cannot set privilege %x. A következő privilégium beállítása sikertelen: %x. Failed to suspend system sleep mode. -A rendszer alvó üzemmódjának felfüggesztése sikertelen. +Nem sikerült a rendszer alvó üzemmódját felfüggeszteni. Cannot change process I/O priorities. -A feladat I/O priorításainak megváltoztatása sikertelen! - -Unable to move %x to the Recycle Bin! -%x Lomtárba helyezése sikertelen! - -Both sides have changed since last synchronization! -Mindkét oldal megváltozott az utolsó szikronizálás óta! - -Cannot determine sync-direction: -Nem lehet meghatározni a szinkronizáció irányát: - -No change since last synchronization! -Az utolsó szinkronizálás után nem történt változás. - -The corresponding database entries are not in sync considering current settings. -A megfelelő adatbázisbejegyzések nincsenek szinkronban a jelenlegi beállításokat tekintve. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Alapértelmezett szinkronizációs irányok beállítása: a régebbi fájlok felülíródnak az újabbakkal. - -Checking recycle bin availability for folder %x... -A következő mappa meglétének ellenőrzése a Lomtárban: %x. - -Moving file %x to recycle bin -%x fájl mozgatása a Lomtárba (Recycle Bin) +Nem sikerült a folyamatok I/O prioritását megváltoztatni. -Moving folder %x to recycle bin -%x mappa mozgatása a Lomtárba (Recycle Bin) - -Moving symbolic link %x to recycle bin -%x symlink mozgatása a Lomtárba (Recycle Bin) - -Deleting file %x -Fájl törlése %x - -Deleting folder %x -Mappa törlése %x - -Deleting symbolic link %x -Symlink törlése: %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -A Lomtár (Recycle Bin) nem elérhető a következő útvonalakhoz! A fájlok azonnali törlésre kerülnek helyette: - -The corresponding folder will be considered as empty. -A megfelelő mappa üresként lesz kezelve. - -Cannot find the following folders: -A következő mappák nem találhatóak: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Figyelmen kívül hagyhatod ezt a hibát ezzel üresnek tekintve a mappákat. Később a mappák létre lesznek hozva automatikusan a szinkronizálás közben. - -Directories are dependent! Be careful when setting up synchronization rules: -A mappák függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat: - -Conflict detected: -Ütközés történt: - -File %x has an invalid date! -A(z) %x fájlnak érvénytelen a dátuma! - -Files %x have the same date but a different size! -A(z) %x fájlok dátuma megegyezik, de a mérete nem! - -Items differ in attributes only -Az elemek csak attribútumaikban különböznek - -Resolving symbolic link %x - - -Comparing content of files %x -%x fájlok tartalmának összehasonlítása - -Generating file list... -Fájllista generálása... - -Start comparison -Összehasonlítás megkezdése - -Calculating sync directions... -Szinkronizációs irányok számítása... - -Both sides are equal -Mindkét oldal egyforma - -Copy new item to left -Új elemek másolása a bal oldalra - -Copy new item to right -Új elemek másolása a jobb oldalra - -Delete left item -Bal oldali elem törlése - -Delete right item -Jobb oldali elem törlése - -Move file on left -Bal oldali fájl mozgatása - -Move file on right -Jobb oldali fájl mozgatása - -Overwrite left item -Bal oldali elem fölülírása - -Overwrite right item -Jobb oldali elem fölülírása - -Do nothing -Nincs mit csinálni - -Update attributes on left -Attribútumok frissítése a bal oldalon +Unable to move %x to the Recycle Bin. +%x Lomtárba helyezése sikertelen. -Update attributes on right -Attribútumok frissítése a jobb oldalon - -Multiple... -Sokszorosítás - -Moving file %x to %y -%x fájl mozgatása ide: %y - -Moving folder %x to %y -%x mappa mozgatása ide: %y - -Moving symbolic link %x to %y -%x symlink mozgatása ide: %y - -Removing old versions... -Régi verziók eltávolítása... - -Creating symbolic link %x -%x symlink létrehozása - -Creating folder %x -%x mappa létrehozása - -Overwriting file %x -%x fájl felülírása - -Overwriting symbolic link %x -%x symlink felülírása - -Verifying file %x -%x fájl ellenőrzése - -Updating attributes of %x -A(z) %x attribútumainak frissítése - -Cannot find %x. -A(z) %x nem található. - -Target folder %x already existing. -A következő célmappa már létezik: %x. - -Target folder input field must not be empty. -A célmappa beviteli mezeje nem lehet üres. - -Folder input field for versioning must not be empty. -A verziókövetés mappájának beviteli mezeje nem lehet üres. - -Source folder %x not found. -A következő forrásmappa nem található: %x. - -The following items have unresolved conflicts and will not be synchronized: -A következő elemek feloldatlan ütközésekkel rendelkeznek és nem lesznek szinkronizálva: - -Significant difference detected: -Jelentős különbség érzékelve: - -More than 50% of the total number of files will be copied or deleted! -Az összes fájl több mint 50%-a másolva vagy törölve lesz! - -Not enough free disk space available in: -Nincs elég szabad lemezterület: - -Required: -Szükséges: - -Available: -Szabad: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Egy olyan mappa kerül módosításra, amely része több mappapárnak. Kérjük, ellenőrizze a szinkronizációs beállításokat. - -Synchronizing folder pair: -Mappapár szinkronizálása: - -Generating database... -Adatbázis generálása... - -Creating Volume Shadow Copy for %x... -Volume Shadow Copy létrehozása %x számára... +Cannot determine final path for %x. +Nem lehet meghatározni a végső útvonalat a(z) %x számára. -Data verification error: Source and target file have different content! -Adatellenőrzési hiba: A forrás és cél fájl tartalma különbözik! +Error Code %x: +Hibakód %x: diff --git a/BUILD/Languages/italian.lng b/BUILD/Languages/italian.lng index f0f8aa0d..e1bfa558 100644 --- a/BUILD/Languages/italian.lng +++ b/BUILD/Languages/italian.lng @@ -1,143 +1,209 @@
- Italiano + Italiano Emmo it_IT - italy.png - 2 - n == 1 ? 0 : 1 + flag_italy.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Ricerca della cartella %x... +Cannot determine final path for %x. + -Items processed: -Elementi processati: +Failed to register to receive system messages. + -Items remaining: -Elementi rimanenti: +Cannot create symbolic link %x. + -Total time: -Tempo totale: +Items + -Cannot set directory lock for %x. -Impossibile impostare blocco cartella per %x. + +%y of 1 row in view +%y of %x rows in view + + -Show in Explorer -Mostra in Esplora Risorse +Select a variant + -Open with default application -Apri con applicazione predefinita +Check for new &version + -Browse directory -Sfoglia cartelle +&Tools + -Abort requested: Waiting for current operation to finish... -Selezionata interruazione: conclusione dell'operazione... +Cannot find current FreeFileSync version number online. Do you want to check manually? + -Failure to create timestamp for versioning: -Errore nella creazione di data e ora per il controllo delle versioni: +&Download + -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronizzazione automatizzata +New version found + + +Switching to FreeFileSync main dialog + + +Data verification error: %x and %y have different content. + + +Cannot determine volume name for %x. + + +Starting comparison + + +Resolving symbolic link %x + + +The following folders have dependent paths. Be careful when setting up synchronization rules: + + +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. + + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: + + +The database entry is not in sync considering current settings. + + +Both sides have changed since last synchronization. +Entrambi i lati sono cambiati dall'ultima sincronizzazione. + +Cannot determine sync-direction: +Impossibile determinare direzione di sincronia: + +No change since last synchronization. +Nessun cambiamento dall'ultima sincronizzazione. + +Setting default synchronization directions: Old files will be overwritten with newer files. +Imposta direzioni di sincronizzazione dpredefinite: i vecchi file saranno sovrascritti dai nuovi. + +Checking recycle bin availability for folder %x... +Controllo di disponibilità Cestino per la cartella %x... + +Moving file %x to recycle bin +Spostamento file %x nel Cestino + +Moving folder %x to recycle bin +Spostamento cartella %x nel Cestino + +Moving symbolic link %x to recycle bin +Spostamento collegamento %x nel Cestino + +Deleting file %x +Eliminazione file %x + +Deleting folder %x +Eliminazione cartella %x + +Deleting symbolic link %x +Eliminazione collegamento %x + +An exception occurred +Si è verificata una eccezione + +Cannot find file %x. +Impossibile trovare il file %x. Error Errore -Selected variant: -Variante selezionata: +File %x does not contain a valid configuration. +Il file %x non contiene una configurazione valida. -Select alternate comparison settings -Seleziona impostazioni di comparazione alternative +A folder input field is empty. +Un campo cartella input è vuoto. -Select alternate synchronization settings -Seleziona impostazioni di sincronizzazione alternative +The corresponding folder will be considered as empty. +La cartella corrispondente sarà considerata come vuota. -Filter is active -Il filtro e' attivo +Cannot find the following folders: +Impossibile trovare le seguenti cartelle: -No filter selected -Nessun filtro selezionato +File %x has an invalid date. +Il file %x ha una data non valida. -Remove alternate settings -Rimuovi impostazioni alternative +Date: +Data: -Clear filter settings -Azzera impostazioni filtro +Files %x have the same date but a different size. +I file %x hanno la stessa data ma dimensione diversa. -Copy -Copia +Size: +Dimensione: -Paste -Incolla +Items differ in attributes only +Gli oggetti differiscono solo negli attributi -Save as batch job -Salva come processo batch +Comparing content of files %x +Comparazione contenuto del file %x -Comparison settings -Impostazioni di comparazione +Generating file list... +Generazione elenco file... -Synchronization settings -Parametri di sincronizzazione +Calculating sync directions... +Calcolo della direzione di sincronizzazione... -About -Info su +Out of memory. +Memoria insufficiente. -Confirm -Conferma +Item exists on left side only +L'elemento esiste solo sul lato sinistro -Configure filter -Configurazione dei filtri +Item exists on right side only +L'elemento esiste solo sul lato destro -Global settings -Preferenze +Left side is newer +Il più recente è sul lato sinistro -Find -Trova +Right side is newer +Il più recente è sul lato destro -Select time span -Seleziona intervallo di tempo +Items have different content +Gli elementi hanno contenuto differente -Invalid command line: -Linea di comando non valida: +Both sides are equal +Entrambi i lati sono uguali -Info -Info +Conflict/item cannot be categorized +Conflitto/elemento non categorizzabile -Warning -Attenzione +Copy new item to left +Copia nuovo elemento a sinistra -Fatal Error -Errore fatale +Copy new item to right +Copia nuovo elemento a destra -Error Code %x: -Errore Codice %x: +Delete left item +Elimina elemento di sinistra -Cannot resolve symbolic link %x. -Impossibile risolvere collegamento %x. +Delete right item +Elimina elemento di destra -Cannot determine final path for %x. - +Move file on left +Sposta il file a sinistra -Cannot find system function %x. -Impossibile trovare funzione di sistema %x. +Move file on right +Sposta il file a destra - -1 Byte -%x Bytes - - -1 Byte -%x Byte - +Overwrite left item +Sovrascrivi elemento di sinistra -%x MB -%x MB +Overwrite right item +Sovrascrivi elemento di destra -%x KB -%x KB +Do nothing +Non fare nulla -%x GB -%x GB +Update attributes on left +Aggiorna attributi a sinistra + +Update attributes on right +Aggiorna attributi a destra Database file %x is incompatible. Il file database %x non è compatibile. @@ -151,9 +217,6 @@ Database file is corrupt: Il file database è corrotto: -Out of memory! -Memoria insufficiente! - Cannot write file %x. Impossibile scrivere il file %x. @@ -163,8 +226,8 @@ Database files do not share a common session. I file database non condividono una sessione comune. -An exception occurred! -Si è verificata una eccezione! +Searching for folder %x... +Ricerca della cartella %x... Cannot read file attributes of %x. Impossibile leggere gli attributi del file %x. @@ -187,9 +250,39 @@ Creating file %x Creazione file %x +Items processed: +Elementi processati: + +Items remaining: +Elementi rimanenti: + +Total time: +Tempo totale: + + +1 Byte +%x Bytes + + +1 Byte +%x Byte + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Errore nel parsing del file %x, riga %y, colonna %z. +Cannot set directory lock for %x. +Impossibile impostare blocco cartella per %x. + Scanning: Analisi di: @@ -208,12 +301,18 @@ /sec /sec -File %x does not contain a valid configuration. -Il file %x non contiene una configurazione valida. - Configuration file %x loaded partially only. File di configurazione %x caricato solo parzialmente. +Show in Explorer +Mostra in Esplora Risorse + +Open with default application +Apri con applicazione predefinita + +Browse directory +Sfoglia cartelle + Cannot access Volume Shadow Copy Service. Impossibile accedere al servizio Volume Shadow Copy. @@ -223,18 +322,18 @@ Cannot load file %x. Impossibile caricare il file %x. -Path %x does not contain a volume name. -Il percorso %x non contiene un nome di volume. +Volume name %x not part of file name %y. +Il nome volume %x non è parte del nome file %y. + +Abort requested: Waiting for current operation to finish... +Selezionata interruazione: conclusione dell'operazione... -Volume name %x not part of file name %y! -Il nome volume %x non è parte del nome file %y! +Failure to create timestamp for versioning: +Errore nella creazione di data e ora per il controllo delle versioni: Cannot read the following XML elements: Impossibile leggere i seguenti elementi XML: -Cannot find file %x. -Impossibile trovare il file %x. - &Open... &Apri... @@ -315,9 +414,18 @@ Il comando è attivato se: Cancel Annulla +RealtimeSync - Automated Synchronization +RealtimeSync - Sincronizzazione automatizzata + +Warning +Attenzione + Build: %x Versione: %x +About +Info su + All files Tutti i file @@ -327,29 +435,122 @@ Il comando è attivato se: &Exit &Esci -Monitoring active... -Monitoraggio attivo... - Waiting for missing directories... In attesa delle cartelle mancanti... -A folder input field is empty. -Un campo cartella input è vuoto. +Invalid command line: +Linea di comando non valida: -Synchronization aborted! -Sincronizzazione abortita! +File content +Contenuto del file + +File time and size +Ora e dimensione file -Synchronization completed with errors! -Sincronizzazione completata con errori! + Two way + Due vie + +Mirror +Mirror + +Update +Aggiorna + +Custom +Personalizza -Synchronization completed with warnings. -Sincronizzazione completata con avvisi. +Multiple... +Multiplo... -Nothing to synchronize! -Non c'è nulla da sincronizzare! +Moving file %x to %y +Spostamento file %x in %y -Synchronization completed successfully. -Sincronizzazione completata con successo. +Moving folder %x to %y +Spostamento cartella %x in %y + +Moving symbolic link %x to %y +Spostamento collegamento %x in %y + +Removing old versions... +Rimozione di vecchie versioni... + +Creating symbolic link %x +Creazione collegamento %x + +Creating folder %x +Creazione cartella %x + +Overwriting file %x +Sovrascrittura file %x + +Overwriting symbolic link %x +Sovrascrittura collegamento %x + +Verifying file %x +Verifica file %x + +Updating attributes of %x +Aggiornamento attributi di %x + +Cannot find %x. +Impossibile trovare %x. + +Target folder %x already existing. +La cartella di destinazione %x è già esistente. + +Target folder input field must not be empty. +Il campo per la cartella di destinazione non può essere vuoto. + +Folder input field for versioning must not be empty. +Il campo per la cartella di versione non può essere vuoto. + +Source folder %x not found. +Cartella sorgente %x non trovata. + +The following items have unresolved conflicts and will not be synchronized: +I seguenti oggetti hanno conflitti irrisolti e non saranno sincronizzati: + +Significant difference detected: +Riscontrate differenze significative: + +More than 50% of the total number of files will be copied or deleted. +Piu' del 50% del totale dei file saranno copiati o cancellati. + +Not enough free disk space available in: +Spazio libero su disco insufficiente in: + +Required: +Richiesto: + +Available: +Dispobilile: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Verrà modificata una cartella che è parte di molteplici coppie di cartelle. Controlla le impostazioni di sincronizzazione. + +Synchronizing folder pair: +Sincronizzazione della coppia di cartelle: + +Generating database... +Generazione database... + +Creating Volume Shadow Copy for %x... +Creazione di Volume Shadow Copy per %x... + +Synchronization aborted +Sincronizzazione abortita + +Synchronization completed with errors +Sincronizzazione completata con errori + +Synchronization completed with warnings +Sincronizzazione completata con avvisi + +Nothing to synchronize +Non c'è nulla da sincronizzare + +Synchronization completed successfully +Sincronizzazione completata con successo Saving log file %x... Salvataggio file di log %x... @@ -357,38 +558,26 @@ Il comando è attivato se: Press "Switch" to resolve issues in FreeFileSync main dialog. Premere "Passa" per risolvere i problemi nella finestra principale di FreeFileSync. -Switching to FreeFileSync main dialog... -Sto passando alla finestra principale di FreeFileSync... - A new version of FreeFileSync is available: E' disponibile una nuova versione di FreeFileSync: Download now? Scaricarla ora? -FreeFileSync is up to date! -FreeFileSync è aggiornato! +FreeFileSync is up to date. +FreeFileSync è aggiornato. Information Informazioni -Unable to connect to sourceforge.net! -Impossibile collegarsi a sourceforge.net! - -Current FreeFileSync version number was not found online! Do you want to check manually? -La versione aggiornata di FreeFileSync non è stata trovata online! Vuoi controllare manualmente? - -Do you want FreeFileSync to automatically check for updates every week? -Vuoi che FreeFileSync controlli automaticamente gli aggiornamenti ogni settimana? +Unable to connect to sourceforge.net. +Impossibile collegarsi a sourceforge.net. -(Requires an Internet connection!) -(Richiede una connessione internet!) +Symlink +Symlink - - - - - +Folder +Cartella Full path Percorso completo @@ -411,12 +600,6 @@ Il comando è attivato se: Extension Estensione -Size: -Dimensione: - -Date: -Data: - Category Categoria @@ -441,6 +624,33 @@ Il comando è attivato se: Hibernate Iberna +Selected variant: +Variante selezionata: + +Select alternate comparison settings +Seleziona impostazioni di comparazione alternative + +Select alternate synchronization settings +Seleziona impostazioni di sincronizzazione alternative + +Filter is active +Il filtro e' attivo + +No filter selected +Nessun filtro selezionato + +Remove alternate settings +Rimuovi impostazioni alternative + +Clear filter settings +Azzera impostazioni filtro + +Copy +Copia + +Paste +Incolla + &New &Nuovo @@ -459,14 +669,11 @@ Il comando è attivato se: &Language &Lingua -&Global settings... -&Preferenze... - &Export file list... &Esporta l'elenco dei file... -&Advanced -&Avanzate +&Global settings... +&Preferenze... &Check now &Controlla ora @@ -474,12 +681,15 @@ Il comando è attivato se: Check &automatically once a week Controlla &automaticamente una volta a settimana -Check for new version -Controlla presenza di nuove versioni - Compare Compara +Comparison settings +Impostazioni di comparazione + +Synchronization settings +Parametri di sincronizzazione + Synchronize Sincronizza @@ -492,6 +702,9 @@ Il comando è attivato se: Swap sides Inverti i lati +Save as batch job +Salva come processo batch + Hide excluded items Nascondi oggetti esclusi @@ -534,54 +747,6 @@ Il comando è attivato se: &Pause &Pausa -Batch job -Attività batch - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Crea un file batch per automatizzare la sincronizzazione. Doppio click su questo file o schedula nelle operazioni pianificate del tuo sistema: FreeFileSync.exe .ffs_batch - -Help -? - -Error handling -Gestione degli errori - -Ignore -Ignora - -Hide all error and warning messages -Nascondi tutti gli errori e i messaggi d'avviso - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Mostra popup di errore o avviso - -Exit -Esci - -Abort synchronization on first error -Interrompi sincronizzazione al primo errore - -Show progress dialog -Mostra stato di avanzamento - -Save log -Salva log - -Select folder to save log files -Seleziona cartella dove salvare i file log - -Limit -Limita - -Limit maximum number of log files -Limita il numero massimo di file log - -Select variant -Seleziona variante - Files are found equal if - last write time and date @@ -595,9 +760,6 @@ I file sono considerati identici se sono identici -File time and size -Ora e dimensione file - Files are found equal if - file content @@ -609,39 +771,42 @@ I file sono considerati identici se è identico -File content -Contenuto del file - Symbolic Link handling Gestione Collegamenti +Help +? + OK OK -<- Two way -> -<- Due vie -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identifica e propaga cambiamenti su entrambi i lati. Cancellazioni, spostamenti e conflitti sono identificati automaticamente usando un database. -Mirror ->> -Mirror ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Backup mirror della cartella di sinistra. La cartella destra verrà modificata per corrispondere esattamente alla cartella di sinistra dopo la sincronizzazione. -Update -> -Aggiorna -> - Copy new or updated files to right folder. Copia file nuovi o aggiornati nella cartella di destra. -Custom -Personalizza - Configure your own synchronization rules. Configura le tue regole di sincronizzazione. +Error handling +Gestione degli errori + +Ignore +Ignora + +Hide all error and warning messages +Nascondi tutti gli errori e i messaggi d'avviso + +Pop-up +Pop-up + +Show pop-up on errors or warnings +Mostra popup di errore o avviso + Deletion handling Gestione cancellazione @@ -666,23 +831,32 @@ I file sono considerati identici se Naming convention: Modalità di rinomina: -Item exists on left side only -L'elemento esiste solo sul lato sinistro +Batch job +Attività batch -Item exists on right side only -L'elemento esiste solo sul lato destro +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Crea un file batch per automatizzare la sincronizzazione. Doppio click su questo file o schedula nelle operazioni pianificate del tuo sistema: FreeFileSync.exe .ffs_batch -Left side is newer -Il più recente è sul lato sinistro +Exit +Esci -Right side is newer -Il più recente è sul lato destro +Abort synchronization on first error +Interrompi sincronizzazione al primo errore -Items have different content -Gli elementi hanno contenuto differente +Show progress dialog +Mostra stato di avanzamento -Conflict/item cannot be categorized -Conflitto/elemento non categorizzabile +Save log +Salva log + +Select folder to save log files +Seleziona cartella dove salvare i file log + +Limit +Limita + +Limit maximum number of log files +Limita il numero massimo di file log Source code written in C++ using: Codice sorgente scritto in C++ utilizzando: @@ -702,9 +876,6 @@ I file sono considerati identici se Homepage Homepage -FreeFileSync at Sourceforge -FreeFileSync su Sourceforge - Email Email @@ -719,11 +890,11 @@ I file sono considerati identici se Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Solo i file che corrispondono esattamente a tutti i filtri impostati verrranno sincronizzati. -Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! +Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza. Include @@ -747,6 +918,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! &Clear &Pulisci +Global settings +Preferenze + Fail-safe file copy Copia file sicura @@ -777,9 +951,6 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! &Default &Predefinito -Start synchronization -Avvia sincronizzazione - Variant Variante @@ -798,6 +969,21 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! &Find next &Trova successivo +Delete +Elimina + +Configure filter +Configurazione dei filtri + +Start synchronization +Avvia sincronizzazione + +Find +Trova + +Select time span +Seleziona intervallo di tempo + Folder pairs Coppia di cartelle @@ -843,12 +1029,6 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! %x file - -%y of 1 row in view -%y of %x rows in view - - - Set direction: Imposta direzione: @@ -861,11 +1041,8 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! Exclude via filter: Escludi tramite filtro: - - - -Delete -Elimina +multiple selection +selezione multipla Include all Includi tutto @@ -894,14 +1071,14 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! Show "%x" Mostra "%x" - - +Last session +Ultima sessione Folder Comparison and Synchronization Comparazione di cartelle e sincronizzazione -Configuration saved! -Configurazione salvata! +Configuration saved +Configurazione salvata FreeFileSync batch FreeFileSync batch @@ -915,9 +1092,6 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! Never save changes Non salvare mai le modifiche -Configuration loaded! -Configurazione caricata! - Show files that exist on left side only Mostra file esistenti solo a sinistra @@ -963,17 +1137,17 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! Set as default Imposta come predefinito -Operation aborted! -Operazione abortita! +Operation aborted +Operazione abortita -All folders are in sync! -Tutte le cartelle sono sincronizzate! +All folders are in sync +Tutte le cartelle sono sincronizzate Comma separated list Elenco elementi separati da virgola -File list exported! -Elenco file esportato! +File list exported +Elenco file esportato Searching for program updates... Ricerca di aggiornamenti al programma... @@ -984,6 +1158,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! &Ignore &Ignora +Fatal Error +Errore fatale + Don't show this warning again Non mostrare più questo avviso @@ -1005,6 +1182,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! Comparing content... Comparazione contenuto... +Info +Info + Paused In pausa @@ -1131,9 +1311,6 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! Files File -Items - - Percentage Percentuale @@ -1176,8 +1353,8 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! Cannot create directory %x. Impossibile creare cartella %x. -Cannot create symbolic link %x. - +Cannot find system function %x. +Impossibile trovare funzione di sistema %x. Cannot copy file %x to %y. Impossibile copiare file %x in %y. @@ -1185,15 +1362,15 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! Type of item %x is not supported: Il tipo di oggetto %x non è supportato: +Cannot resolve symbolic link %x. +Impossibile risolvere collegamento %x. + Cannot open directory %x. Impossibile aprire cartella %x. Cannot enumerate directory %x. Impossibile numerare cartella %x. -Detected endless directory recursion. -Rilevato percorso ricorsivo senza fine. - %x TB %x TB @@ -1236,201 +1413,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza! Cannot change process I/O priorities. Impossibile modificare le priorità I/O del processo. -Unable to move %x to the Recycle Bin! -Impossibile spostare %x nel Cestino! - -Both sides have changed since last synchronization! -Entrambi i lati sono cambiati dall'ultima sincronizzazione! - -Cannot determine sync-direction: -Impossibile determinare direzione di sincronia: - -No change since last synchronization! -Nessun cambiamento dall'ultima sincronizzazione! - -The corresponding database entries are not in sync considering current settings. -Le voci del database corrispondenti non sono in sincronia con le impostazioni correnti. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Imposta direzioni di sincronizzazione dpredefinite: i vecchi file saranno sovrascritti dai nuovi. - -Checking recycle bin availability for folder %x... -Controllo di disponibilità Cestino per la cartella %x... - -Moving file %x to recycle bin -Spostamento file %x nel Cestino - -Moving folder %x to recycle bin -Spostamento cartella %x nel Cestino - -Moving symbolic link %x to recycle bin -Spostamento collegamento %x nel Cestino - -Deleting file %x -Eliminazione file %x - -Deleting folder %x -Eliminazione cartella %x - -Deleting symbolic link %x -Eliminazione collegamento %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Cestino non disponibile per i seguenti percorsi! I file verranno cancellati in modo permanente: - -The corresponding folder will be considered as empty. -La cartella corrispondente sarà considerata come vuota. - -Cannot find the following folders: -Impossibile trovare le seguenti cartelle: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. - - -Directories are dependent! Be careful when setting up synchronization rules: -Le cartelle sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione: - -Conflict detected: -Rilevato conflitto: - -File %x has an invalid date! -Il file %x ha una data non valida! - -Files %x have the same date but a different size! -I file %x hanno la stessa data ma dimensione diversa! - -Items differ in attributes only -Gli oggetti differiscono solo negli attributi - -Resolving symbolic link %x - - -Comparing content of files %x -Comparazione contenuto del file %x - -Generating file list... -Generazione elenco file... - -Start comparison -Inizia comparazione - -Calculating sync directions... -Calcolo della direzione di sincronizzazione... - -Both sides are equal -Entrambi i lati sono uguali - -Copy new item to left -Copia nuovo elemento a sinistra - -Copy new item to right -Copia nuovo elemento a destra - -Delete left item -Elimina elemento di sinistra - -Delete right item -Elimina elemento di destra - -Move file on left -Sposta il file a sinistra - -Move file on right -Sposta il file a destra - -Overwrite left item -Sovrascrivi elemento di sinistra - -Overwrite right item -Sovrascrivi elemento di destra - -Do nothing -Non fare nulla - -Update attributes on left -Aggiorna attributi a sinistra - -Update attributes on right -Aggiorna attributi a destra - -Multiple... -Multiplo... - -Moving file %x to %y -Spostamento file %x in %y - -Moving folder %x to %y -Spostamento cartella %x in %y - -Moving symbolic link %x to %y -Spostamento collegamento %x in %y - -Removing old versions... -Rimozione di vecchie versioni... - -Creating symbolic link %x -Creazione collegamento %x - -Creating folder %x -Creazione cartella %x - -Overwriting file %x -Sovrascrittura file %x - -Overwriting symbolic link %x -Sovrascrittura collegamento %x - -Verifying file %x -Verifica file %x - -Updating attributes of %x -Aggiornamento attributi di %x - -Cannot find %x. -Impossibile trovare %x. - -Target folder %x already existing. -La cartella di destinazione %x è già esistente. - -Target folder input field must not be empty. -Il campo per la cartella di destinazione non può essere vuoto. - -Folder input field for versioning must not be empty. -Il campo per la cartella di versione non può essere vuoto. - -Source folder %x not found. -Cartella sorgente %x non trovata. - -The following items have unresolved conflicts and will not be synchronized: -I seguenti oggetti hanno conflitti irrisolti e non saranno sincronizzati: - -Significant difference detected: -Riscontrate differenze significative: - -More than 50% of the total number of files will be copied or deleted! -Piu' del 50% del totale dei file saranno copiati o cancellati! - -Not enough free disk space available in: -Spazio libero su disco insufficiente in: - -Required: -Richiesto: - -Available: -Dispobilile: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Verrà modificata una cartella che è parte di molteplici coppie di cartelle. Controlla le impostazioni di sincronizzazione. - -Synchronizing folder pair: -Sincronizzazione della coppia di cartelle: +Unable to move %x to the Recycle Bin. +Impossibile spostare %x nel Cestino. -Generating database... -Generazione database... - -Creating Volume Shadow Copy for %x... -Creazione di Volume Shadow Copy per %x... - -Data verification error: Source and target file have different content! -Errore nella verifica data: i file sorgente e destinazione hanno differente contenuto! +Error Code %x: +Errore Codice %x: diff --git a/BUILD/Languages/japanese.lng b/BUILD/Languages/japanese.lng index 3b855ea5..fb3de4e8 100644 --- a/BUILD/Languages/japanese.lng +++ b/BUILD/Languages/japanese.lng @@ -1,136 +1,164 @@
- 日本語 + 日本語 Tilt ja_JP - japan.png - 1 - 0 + flag_japan.png + 1 + 0
-Searching for folder %x... -フォルダ %x を検索中... +Both sides have changed since last synchronization. +前回最後の同期処理以降、両側とも変更があります. -Items processed: -処理された要素: +Cannot determine sync-direction: +同期方向が決定されていません: -Items remaining: -残りの要素: +No change since last synchronization. +前回の同期以降、変更はありません. -Total time: -合計時間: +The database entry is not in sync considering current settings. +現在の設定により、このデータベースエントリの同期は行われていません. -Cannot set directory lock for %x. -%x のディレクトリロックができません. +Setting default synchronization directions: Old files will be overwritten with newer files. +同期方向のデフォルト設定: 古いファイルに新しいファイルを上書き -Show in Explorer -エクスプローラで表示 +Checking recycle bin availability for folder %x... +フォルダ %x をゴミ箱として使用できるかを確認中... -Open with default application -既定アプリケーションで開く +Moving file %x to recycle bin +ファイル %x をゴミ箱に移動中 -Browse directory -ディレクトリを参照 +Moving folder %x to recycle bin +フォルダ %x をゴミ箱に移動中 -Abort requested: Waiting for current operation to finish... -ユーザによる中断: 現在の処理を終了しています.. お待ちください... +Moving symbolic link %x to recycle bin +シンボリックリンク %x をゴミ箱に移動中 -Failure to create timestamp for versioning: -バージョン付けのタイムスタンプ作成に失敗: +Deleting file %x +ファイル %x を削除中 -RealtimeSync - Automated Synchronization -リアルタイム同期 - 自動同期 +Deleting folder %x +フォルダ %x を削除中 + +Deleting symbolic link %x +シンボリックリンク %x を削除中 + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +以下のフォルダでは、ゴミ箱を使用する事が出来ません。代替手段としてファイルは完全に削除されます: + +An exception occurred +例外が発生しました + +Cannot find file %x. +ファイル %x がみつかりません. Error エラー -Selected variant: -選択されたバリアント: +File %x does not contain a valid configuration. +ファイル %x には有効な構成が含まれていません. -Select alternate comparison settings -代替比較設定を選択 +A folder input field is empty. +フォルダ入力欄が空白です. -Select alternate synchronization settings -代替同期設定を選択 +The corresponding folder will be considered as empty. +対応するフォルダは空であるとみなされます -Filter is active -フィルターを有効化 +Cannot find the following folders: +以下のフォルダがみつかりません: -No filter selected -フィルター選択なし +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +各フォルダを空とみなす場合はこのエラーを無視することができます。このフォルダは、同期処理を実行する際自動的に作成されるものです。 -Remove alternate settings -代替設定を除去 +The following folders have dependent paths. Be careful when setting up synchronization rules: +以下のフォルダには、依存関係にあるパスが存在します。同期規則を設定する時は慎重に行ってください: -Clear filter settings -フィルター設定をクリア +File %x has an invalid date. +ファイル %x の日付は無効なものです. -Copy -コピー +Date: +日時: -Paste -貼り付け +Files %x have the same date but a different size. +ファイル %x は、同じ時間ですがサイズが異なっています. -Save as batch job -一括ジョブで保存 +Size: +サイズ: -Comparison settings -比較設定 +Items differ in attributes only +属性のみ異なる項目 -Synchronization settings -同期処理設定 +Resolving symbolic link %x +シンボリックリンク %x を解決中 -About -情報 +Comparing content of files %x +ファイル %x の内容を比較中 -Confirm -確認 +Generating file list... +ファイル一覧を作成中... -Configure filter -フィルター設定 +Starting comparison +比較処理を開始中 -Global settings -全般的な設定 +Calculating sync directions... +同期方向を計算しています... -Find -検索 +Out of memory. +メモリが足りません. -Select time span -タイムスパンを選択 +Item exists on left side only +左側のみに存在する項目 -Invalid command line: -無効なコマンドライン: +Item exists on right side only +右側のみに存在する項目 -Info -情報 +Left side is newer +左側がより新しい -Warning -警告 +Right side is newer +右側がより新しい -Fatal Error -致命的なエラー +Items have different content +内容が異なる項目 -Error Code %x: -エラーコード %x: +Both sides are equal +両側とも等しい -Cannot resolve symbolic link %x. -シンボリックリンク %x を解決できません. +Conflict/item cannot be categorized +競合/分類化できない項目 - -1 Byte -%x Bytes - - -%x バイト - +Copy new item to left +新しい項目を左にコピー -%x MB -%x MB +Copy new item to right +新しい項目を右にコピー -%x KB -%x KB +Delete left item +左の項目を削除 -%x GB -%x GB +Delete right item +右の項目を削除 + +Move file on left +ファイルを左に移動 + +Move file on right +ファイルを右に移動 + +Overwrite left item +左の項目に上書き + +Overwrite right item +右の項目に上書き + +Do nothing +何もしない + +Update attributes on left +左の属性を更新 + +Update attributes on right +右の属性を更新 Database file %x is incompatible. データベース %x とは互換性がありません. @@ -144,9 +172,6 @@ Database file is corrupt: 破損しているデータベース: -Out of memory! -メモリが足りません! - Cannot write file %x. ファイル %x に書き込めません. @@ -156,8 +181,8 @@ Database files do not share a common session. データベースは一般セッションで共有できません. -An exception occurred! -例外が発生しました! +Searching for folder %x... +フォルダ %x を検索中... Cannot read file attributes of %x. %x のファイル属性を読み込めません. @@ -179,9 +204,38 @@ Creating file %x ファイル %x を作成中 +Items processed: +処理された要素: + +Items remaining: +残りの要素: + +Total time: +合計時間: + + +1 Byte +%x Bytes + + +%x バイト + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. ファイル %x の構文解析エラー, 行 %y, 列 %z. +Cannot set directory lock for %x. +%x のディレクトリロックができません. + Scanning: スキャン: @@ -199,12 +253,18 @@ /sec /秒 -File %x does not contain a valid configuration. -ファイル %x には有効な構成が含まれていません. - Configuration file %x loaded partially only. 構成ファイル %x は部分的のみ読み込まれます. +Show in Explorer +エクスプローラで表示 + +Open with default application +既定アプリケーションで開く + +Browse directory +ディレクトリを参照 + Cannot access Volume Shadow Copy Service. ボリュームシャドウコピーサービスにアクセス出来ません. @@ -214,18 +274,21 @@ Cannot load file %x. ファイル %x を読み込めません. -Path %x does not contain a volume name. -パス %x にはボリューム名が含まれていません. +Cannot determine volume name for %x. +%x のボリューム名が決定されていません -Volume name %x not part of file name %y! -ボリューム名 %x にファイル名 %y はありません! +Volume name %x not part of file name %y. +ボリューム名 %x にファイル名 %y はありません. + +Abort requested: Waiting for current operation to finish... +ユーザによる中断: 現在の処理を終了しています.. お待ちください... + +Failure to create timestamp for versioning: +バージョン付けのタイムスタンプ作成に失敗: Cannot read the following XML elements: 次の XML要素を読み込めません: -Cannot find file %x. -ファイル %x がみつかりません. - &Open... 開く(&O)... @@ -306,9 +369,18 @@ The command is triggered if: Cancel キャンセル +RealtimeSync - Automated Synchronization +リアルタイム同期 - 自動同期 + +Warning +警告 + Build: %x ビルド: %x +About +情報 + All files すべてのファイル @@ -318,28 +390,124 @@ The command is triggered if: &Exit 終了(&E) -Monitoring active... -監視を開始します... - Waiting for missing directories... 見失ったディレクトリの待機中... -A folder input field is empty. -フォルダ入力欄が空白です. +Invalid command line: +無効なコマンドライン: + +File content +ファイルの内容 + +File time and size +ファイル時刻とサイズ + + Two way + 両方向 + +Mirror +ミラー + +Update +更新 + +Custom +カスタム + +Multiple... +複数処理... + +Moving file %x to %y +ファイル %x を %y に移動中 + +Moving folder %x to %y +フォルダ %x を %y に移動中 + +Moving symbolic link %x to %y +シンボリックリンク %x を %y に移動中 + +Removing old versions... +旧バージョンを除去中... + +Creating symbolic link %x +シンボリックリンク %x を作成中 + +Creating folder %x +フォルダ %x を作成中 + +Overwriting file %x +ファイル %x を上書き中 + +Overwriting symbolic link %x +シンボリックリンク %x を上書き中 + +Verifying file %x +ファイル %x の検証中 + +Updating attributes of %x +%x の属性を更新 + +Cannot find %x. +%x が見つかりません + +Target folder %x already existing. +対象フォルダ %x は既に存在します. + +Target folder input field must not be empty. +対象フォルダ入力欄が空白になっています. + +Folder input field for versioning must not be empty. +バージョン管理のためフォルダ入力欄に空白は使えません. -Synchronization aborted! -同期処理を中断! +Source folder %x not found. +ソースフォルダ %x が見つかりません + +The following items have unresolved conflicts and will not be synchronized: +以下の項目は、未解決の競合が存在するため同期処理を実行できませんでした: + +Significant difference detected: +重大な差異が検出されました: + +More than 50% of the total number of files will be copied or deleted. +ファイル合計総数の 50% 以上が削除、またはコピーされます。 + +Not enough free disk space available in: +利用可能なディスク空き容量が足りません: + +Required: +必須: + +Available: +利用可能: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +複数フォルダペアの一部であるフォルダが変更されています. 同期設定を確認してください. + +Synchronizing folder pair: +フォルダペアを同期処理中: + +Generating database... +データベースを作成中... + +Creating Volume Shadow Copy for %x... +%x のボリュームシャドウコピーを作成中... -Synchronization completed with errors! -同期処理はエラーで終了しています! +Data verification error: %x and %y have different content. +データ検証エラー: %x と %y には異なる内容が含まれています. -Synchronization completed with warnings. +Synchronization aborted +同期処理を中断 + +Synchronization completed with errors +同期処理はエラーで終了しています + +Synchronization completed with warnings 同期処理は警告で終了しています -Nothing to synchronize! -同期対象がありません! +Nothing to synchronize +同期対象がありません -Synchronization completed successfully. +Synchronization completed successfully 同期処理はすべてが正常に完了しました Saving log file %x... @@ -348,8 +516,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. "切り替え"を押すと FreeFileSync ダイアログの問題を解決します. -Switching to FreeFileSync main dialog... -FreeFileSync メインダイアログを切替中... +Switching to FreeFileSync main dialog +FreeFileSync メインダイアログを切り替え中 A new version of FreeFileSync is available: FreeFileSync の新しいバージョンが利用できます: @@ -357,29 +525,29 @@ The command is triggered if: Download now? ダウンロードしますか? -FreeFileSync is up to date! -FreeFileSync は最新です! +New version found +新たなバージョンがあります -Information -インフォメーション +&Download +ダウンロード(&D) -Unable to connect to sourceforge.net! -Sourceforge.net に接続できません! +FreeFileSync is up to date. +FreeFileSync は最新です. -Current FreeFileSync version number was not found online! Do you want to check manually? -FreeFileSync の現在のバージョン番号を取得できませんでした! 手動で確認しますか? +Information +インフォメーション -Do you want FreeFileSync to automatically check for updates every week? -FreeFileSync の更新確認を毎週自動的に行いますか? +Unable to connect to sourceforge.net. +Sourceforge.net に接続できません. -(Requires an Internet connection!) -(インターネット接続を必要とします!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +現在の FreeFileSync バージョン番号を確認できませんでした、手動で確認しますか? - -<シンボリックリンク> +Symlink +シンボリックリンク - -<フォルダ> +Folder +フォルダ Full path フルパス @@ -402,18 +570,12 @@ The command is triggered if: Extension 拡張子 -Size: -サイズ: - -Date: -日時: +Category +カテゴリ Action 操作 -Category -カテゴリ - Drag && drop ドラッグ && ドロップ @@ -432,6 +594,33 @@ The command is triggered if: Hibernate 休止状態 +Selected variant: +選択されたバリアント: + +Select alternate comparison settings +代替比較設定を選択 + +Select alternate synchronization settings +代替同期設定を選択 + +Filter is active +フィルターを有効化 + +No filter selected +フィルター選択なし + +Remove alternate settings +代替設定を除去 + +Clear filter settings +フィルター設定をクリア + +Copy +コピー + +Paste +貼り付け + &New 新規(&N) @@ -450,14 +639,14 @@ The command is triggered if: &Language 使用言語(&L) -&Global settings... -全般的な設定(&G)... - &Export file list... ファイル一覧をエクスポート(&E)... -&Advanced -拡張(&A) +&Global settings... +全般的な設定(&G)... + +&Tools +ツール(&T) &Check now 今すぐ確認(&C) @@ -465,12 +654,18 @@ The command is triggered if: Check &automatically once a week 週に一回、自動的に確認する(&A) -Check for new version -新バージョンの確認 +Check for new &version +新バージョンの確認(&V) Compare 比較 +Comparison settings +比較設定 + +Synchronization settings +同期処理設定 + Synchronize 同期処理 @@ -483,6 +678,9 @@ The command is triggered if: Swap sides パネルを入れ替え +Save as batch job +一括ジョブで保存 + Hide excluded items 除外対象項目を隠す @@ -525,53 +723,8 @@ The command is triggered if: &Pause 一時停止(&P) -Batch job -一括処理 - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -同期処理を自動的に行うための一括ファイルを作成します。ファイルをダブルクリック,または次のコマンドをタスクから実行:FreeFileSync.exe <ジョブ名>.ffs_batch - -Help -ヘルプ - -Error handling -ハンドリングのエラー時: - -Ignore -無視 - -Hide all error and warning messages -すべてのエラーと警告メッセージを非表示 - -Pop-up -ポップアップ - -Show pop-up on errors or warnings -エラーと警告をポップアップで表示 - -Exit -終了 - -Abort synchronization on first error -最初のエラー発生時に同期を中断する - -Show progress dialog -進捗ダイアログを表示 - -Save log -ログを保存 - -Select folder to save log files -ログファイル保存先フォルダを選択 - -Limit -制限 - -Limit maximum number of log files -ログファイルの最大数を制限 - -Select variant -変数を選択 +Select a variant +バリアントを選択 Files are found equal if @@ -586,9 +739,6 @@ are the same で判断する -File time and size -ファイル時刻とサイズ - Files are found equal if - file content @@ -600,39 +750,42 @@ is the same で判断する -File content -ファイルの内容 - Symbolic Link handling シンボリック・リンクの取り扱い +Help +ヘルプ + OK OK -<- Two way -> -<- 両方向 -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. 変更箇所を識別して両側に変更を反映します。データベースを使用することで、削除、移動および競合などが自動的に検出されます。 -Mirror ->> -ミラー >> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. 左側に合わせてバックアップ. 右側のフォルダ内容が同期処理後に左側と同じになるようにします。 -Update -> -更新 -> - Copy new or updated files to right folder. 新しい(更新)ファイルを右フォルダにコピー -Custom -カスタム - Configure your own synchronization rules. あなたの設定した同期規則を使用します。 +Error handling +ハンドリングのエラー時: + +Ignore +無視 + +Hide all error and warning messages +すべてのエラーと警告メッセージを非表示 + +Pop-up +ポップアップ + +Show pop-up on errors or warnings +エラーと警告をポップアップで表示 + Deletion handling 削除の取り扱い @@ -657,29 +810,38 @@ is the same Naming convention: 命名規則: -Item exists on left side only -左側のみに存在する項目 +Batch job +一括処理 + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +同期処理を自動的に行うための一括ファイルを作成します。ファイルをダブルクリック,または次のコマンドをタスクから実行:FreeFileSync.exe <ジョブ名>.ffs_batch + +Exit +終了 + +Abort synchronization on first error +最初のエラー発生時に同期を中断する -Item exists on right side only -右側のみに存在する項目 +Show progress dialog +進捗ダイアログを表示 -Left side is newer -左側がより新しい +Save log +ログを保存 -Right side is newer -右側がより新しい +Select folder to save log files +ログファイル保存先フォルダを選択 -Items have different content -内容が異なる項目 +Limit +制限 -Conflict/item cannot be categorized -競合/分類化できない項目 +Limit maximum number of log files +ログファイルの最大数を制限 Source code written in C++ using: ソースコードは C++ で書かれています If you like FreeFileSync -FreeFileSync を支援したい! +FreeFileSync を気に入ってくれた方へ Donate with PayPal PayPal から寄付 @@ -693,9 +855,6 @@ is the same Homepage ホームページ -FreeFileSync at Sourceforge -FreeFileSync at Sourceforge - Email E-メール @@ -710,11 +869,11 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. すべてのフィルターに合致するファイルのみが同期されます. -注意: ファイル名は基準ディレクトリに比例する必要があります! +注意: ファイル名は基準ディレクトリに比例する必要があります. Include @@ -738,6 +897,9 @@ Note: File names must be relative to base directories! &Clear クリア(&C) +Global settings +全般的な設定 + Fail-safe file copy 安全なファイルコピーを実施 @@ -768,9 +930,6 @@ Note: File names must be relative to base directories! &Default デフォルト(&D) -Start synchronization -同期の開始 - Variant 変化 @@ -789,11 +948,20 @@ Note: File names must be relative to base directories! &Find next 次を検索(&F) -Operation aborted! -操作の中断! +Delete +削除 -Main bar -メインバー +Configure filter +フィルター設定 + +Start synchronization +同期の開始 + +Find +検索 + +Select time span +タイムスパンを選択 Folder pairs フォルダ・ペア @@ -804,6 +972,9 @@ Note: File names must be relative to base directories! Configuration 構成設定 +Main bar +メインバー + Filter files ファイルフィルター @@ -855,11 +1026,8 @@ Note: File names must be relative to base directories! Exclude via filter: フィルターを通して除外 - -<複数選択> - -Delete -削除 +multiple selection +複数選択 Include all すべて含める @@ -888,14 +1056,14 @@ Note: File names must be relative to base directories! Show "%x" "%x" で表示 - -<最後のセッション> +Last session +最後のセッション Folder Comparison and Synchronization フォルダの比較と同期 -Configuration saved! -構成設定は保存されました! +Configuration saved +構成設定は保存されました FreeFileSync batch FreeFileSync 一括 @@ -909,9 +1077,6 @@ Note: File names must be relative to base directories! Never save changes 変更を保存しない -Configuration loaded! -構成設定を読み込み中! - Show files that exist on left side only 左側のみに存在するファイルを表示 @@ -957,17 +1122,17 @@ Note: File names must be relative to base directories! Set as default デフォルトにセット -All folders are in sync! -すべてのフォルダを同期! +Operation aborted +操作の中断 + +All folders are in sync +すべてのフォルダを同期 Comma separated list カンマ区切り -Legend -凡例 - -File list exported! -ファイル一覧のエクスポートが完了! +File list exported +ファイル一覧のエクスポートが完了 Searching for program updates... アップデートを検索しています... @@ -978,6 +1143,9 @@ Note: File names must be relative to base directories! &Ignore 無視(&I) +Fatal Error +致命的なエラー + Don't show this warning again 次回からこの警告は表示しない @@ -999,6 +1167,9 @@ Note: File names must be relative to base directories! Comparing content... 内容を比較中... +Info +情報 + Paused 一時停止中 @@ -1099,18 +1270,18 @@ Note: File names must be relative to base directories! Leave as unresolved conflict 未解決の競合はそのまま残す -Time stamp -タイムスタンプ - -Append a timestamp to each file name -各ファイル名にタイムスタンプを追加 - Replace 置換 Move files and replace if existing ファイルを移動、存在する場合は上書き +Time stamp +タイムスタンプ + +Append a timestamp to each file name +各ファイル名にタイムスタンプを追加 + Folder フォルダ @@ -1153,9 +1324,6 @@ Note: File names must be relative to base directories! Cannot write modification time of %x. %x の更新時刻を書き込めませんでした. -Cannot find system function %x. -システム関数 %x がみつかりません. - Cannot read security context of %x. %x のセキュリティコンテキストを読み込めません. @@ -1171,8 +1339,11 @@ Note: File names must be relative to base directories! Cannot create directory %x. ディレクトリ %x を作成出来ません. -Cannot copy symbolic link %x to %y. -S リンクを %x から %y にコピーできません. +Cannot create symbolic link %x. +シンボリックリンク %x を作成出来ません + +Cannot find system function %x. +システム関数 %x がみつかりません. Cannot copy file %x to %y. %x から %y にコピーできません. @@ -1180,15 +1351,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: 項目 %x には対応していません: +Cannot resolve symbolic link %x. +シンボリックリンク %x を解決できません. + Cannot open directory %x. ディレクトリ %x を開けません. Cannot enumerate directory %x. ディレクトリ %x を列挙できません -Detected endless directory recursion. -ディレクトリ再帰処理でループを検出 - %x TB %x TB @@ -1219,6 +1390,9 @@ Note: File names must be relative to base directories! %x 日 +Failed to register to receive system messages. +受信したシステムメッセージの登録に失敗. + Cannot set privilege %x. %x の特権をセットできません. @@ -1228,210 +1402,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. プロセスの I/O 優先度を変更できません -Unable to move %x to the Recycle Bin! -%x をゴミ箱に移動できません! - -Both sides have changed since last synchronization! -前回最後の同期処理以降、両側とも変更があります! - -Cannot determine sync-direction: -同期方向が決定されていません: - -No change since last synchronization! -前回の同期以降、変更はありません! - -The corresponding database entries are not in sync considering current settings. -現在の設定で同期を行うための、対応したデータベースエントリが存在しません. - -Setting default synchronization directions: Old files will be overwritten with newer files. -同期方向のデフォルト設定: 古いファイルに新しいファイルを上書き - -Checking recycle bin availability for folder %x... -フォルダ %x をゴミ箱として使用できるかを確認中... - -Moving file %x to recycle bin -ファイル %x をゴミ箱に移動中 - -Moving folder %x to recycle bin -フォルダ %x をゴミ箱に移動中 - -Moving symbolic link %x to recycle bin -シンボリックリンク %x をゴミ箱に移動中 - -Deleting file %x -ファイル %x を削除中 - -Deleting folder %x -フォルダ %x を削除中 - -Deleting symbolic link %x -シンボリックリンク %x を削除中 - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -以下のパスにあるゴミ箱が利用できません! 代わりにファイルは完全削除されます: - -The corresponding folder will be considered as empty. -対応するフォルダは空であるとみなされます - -Cannot find the following folders: -以下のフォルダがみつかりません: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -各フォルダを空とみなす場合はこのエラーを無視することができます。このフォルダは、同期処理を実行する際自動的に作成されるものです。 - -Directories are dependent! Be careful when setting up synchronization rules: -ディレクトリが依存関係にあります! 同期規則の設定時には注意してください: - -Start comparison -比較を開始 - -Calculating sync directions... -同期方向を計算しています... - -Conflict detected: -検出された競合: +Unable to move %x to the Recycle Bin. +%x をゴミ箱に移動できません. -File %x has an invalid date! -ファイル %x の日付は無効なものです! +Cannot determine final path for %x. +%x の最終的なパスを決定できません. -Files %x have the same date but a different size! -ファイル %x は、同じ時間ですがサイズが異なっています! - -Items differ in attributes only -属性のみ異なる項目 - -Symbolic links %x have the same date but a different target. -シンボリックリンク %x の日付は同じですが、対象が異なっています. - -Comparing content of files %x -ファイル %x の内容を比較中 - -Comparing files by content failed. -ファイル内容の比較に失敗しました - -Generating file list... -ファイル一覧を作成中... - -Both sides are equal -両側とも等しい - -Copy new item to left -新しい項目を左にコピー - -Copy new item to right -新しい項目を右にコピー - -Delete left item -左の項目を削除 - -Delete right item -右の項目を削除 - -Move file on left -ファイルを左に移動 - -Move file on right -ファイルを右に移動 - -Overwrite left item -左の項目に上書き - -Overwrite right item -右の項目に上書き - -Do nothing -何もしない - -Update attributes on left -左の属性を更新 - -Update attributes on right -右の属性を更新 - -Multiple... -複数処理... - -Moving file %x to %y -ファイル %x を %y に移動中 - -Moving folder %x to %y -フォルダ %x を %y に移動中 - -Moving symbolic link %x to %y -シンボリックリンク %x を %y に移動中 - -Removing old versions... -旧バージョンを除去中... - -Creating symbolic link %x -シンボリックリンク %x を作成中 - -Creating folder %x -フォルダ %x を作成中 - -Overwriting file %x -ファイル %x を上書き中 - -Overwriting symbolic link %x -シンボリックリンク %x を上書き中 - -Verifying file %x -ファイル %x の検証中 - -Updating attributes of %x -%x の属性を更新 - -Cannot find %x. -%x が見つかりません - -Target folder %x already existing. -対象フォルダ %x は既に存在します. - -Target folder input field must not be empty. -対象フォルダ入力欄が空白になっています. - -Folder input field for versioning must not be empty. -バージョン管理のためフォルダ入力欄に空白は使えません. - -Source folder %x not found. -ソースフォルダ %x が見つかりません - -The following items have unresolved conflicts and will not be synchronized: -以下の項目は、未解決の競合が存在するため同期処理を実行できませんでした: - -Significant difference detected: -重大な差異が検出されました: - -More than 50% of the total number of files will be copied or deleted! -ファイル合計総数の 50% 以上が削除、またはコピーされます - -Not enough free disk space available in: -利用可能なディスク空き容量が足りません: - -Required: -必須: - -Available: -利用可能: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -複数フォルダペアの一部であるフォルダが変更されています. 同期設定を確認してください. - -Left -左側 - -Right -右側 - -Synchronizing folder pair: -フォルダペアを同期処理中: - -Generating database... -データベースを作成中... - -Creating Volume Shadow Copy for %x... -%x のボリュームシャドウコピーを作成中... - -Data verification error: Source and target file have different content! -データ検証エラー: ソースと対象ファイルに異なる内容が含まれています! +Error Code %x: +エラーコード %x: diff --git a/BUILD/Languages/korean.lng b/BUILD/Languages/korean.lng index e47f241d..d25b490b 100644 --- a/BUILD/Languages/korean.lng +++ b/BUILD/Languages/korean.lng @@ -1,136 +1,164 @@
- 한국어 + 한국어 Simon Park ko_KR - south_korea.png - 1 - 0 + flag_south_korea.png + 1 + 0
-Searching for folder %x... -폴더 %x 검색 중... +Both sides have changed since last synchronization. +마지막 동기화 작업 이후, 양측 모두 변경 되었습니다. -Items processed: -처리된 항목 : +Cannot determine sync-direction: +동기화 방향을 결정할 수 없습니다 : -Items remaining: -남은 항목 : +No change since last synchronization. +마지막 동기화 이후 변경사항 없음. -Total time: -전체 시간 : +The database entry is not in sync considering current settings. +데이터베이스 항목이 현재 설정을 고려하여 동기화 되지 않았습니다. -Cannot set directory lock for %x. -%x 에 대한 디렉토리 잠금을 설정할 수 없습니다. +Setting default synchronization directions: Old files will be overwritten with newer files. +기본값 동기화 방향 설정 : 이전 파일들은 보다 최신 파일들로 덮어 쓰여집니다. -Show in Explorer -탐색기에 표시 +Checking recycle bin availability for folder %x... +폴더 %x 을(를) 위한 휴지통 가용성 여부 확인 중... -Open with default application -기본값 응용 프로그램으로 열기 +Moving file %x to recycle bin +파일 %x을(를) 휴지통으로 이동 중 -Browse directory -디렉토리 찾아보기 +Moving folder %x to recycle bin +폴더 %x을(를) 휴지통으로 이동 중 -Abort requested: Waiting for current operation to finish... -사용자에 의한 작업 중단 : 현재 작업 종료 대기 중... +Moving symbolic link %x to recycle bin +심볼릭 링크 %x을(를) 휴지통으로 이동 중 -Failure to create timestamp for versioning: -버저닝을 위한 타임 스탬프 생성 실패 : +Deleting file %x +파일 %x 삭제 중 -RealtimeSync - Automated Synchronization -실시간 동기화 - 자동 동기화 +Deleting folder %x +폴더 %x 삭제 중 + +Deleting symbolic link %x +심볼릭 링크 %x 삭제 중 + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +다음 폴더들을 위해 휴지통을 사용할 수 없어 대신 파일들을 영구 삭제합니다 : + +An exception occurred +예외 발생 + +Cannot find file %x. +파일 %x 을(를) 찾을 수 없습니다. Error 오류 -Selected variant: -선택한 베어리언트 +File %x does not contain a valid configuration. +파일 %x 의 구성이 유효하지 않습니다. -Select alternate comparison settings -대체 비교 설정 선택 +A folder input field is empty. +폴더 입력 필드 하나가 비어 있습니다. -Select alternate synchronization settings -대체 동기화 설정 선택 +The corresponding folder will be considered as empty. +해당 폴더를 비어 있는 상태로 간주합니다. -Filter is active -필터 활성화 +Cannot find the following folders: +다음 폴더를 찾을 수 없습니다 : -No filter selected -선택한 필터가 없음 +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +각 폴더를 비어있는 상태로 간주할 경우 이 오류는 무시될 수 있습니다. 폴더들은 동기화가 진행되는 동안 자동 생성됩니다. -Remove alternate settings -대체설정 제거 +The following folders have dependent paths. Be careful when setting up synchronization rules: +다음 폴더들에는 종속 경로가 있습니다. 동기화 규칙을 설정 시 주의하시기 바랍니다 : -Clear filter settings -필터 설정 지우기 +File %x has an invalid date. +파일 %x 의 날짜가 유효하지 않습니다. -Copy -복사 +Date: +날짜 : -Paste -붙여넣기 +Files %x have the same date but a different size. +파일 %x 의 날짜는 같으나, 크기가 다릅니다. -Save as batch job -일괄 작업으로 저장 +Size: +크기 : -Comparison settings -비교 설정 +Items differ in attributes only +항목들이 속성에서만 차이가 있습니다. -Synchronization settings -동기화 설정 +Resolving symbolic link %x +심볼릭 링크 %x 해결 -About -상세 정보 +Comparing content of files %x +파일 %x 내용 별 비교 중 -Confirm -확인 +Generating file list... +파일 리스트 생성 중... -Configure filter -필터 설정 +Starting comparison +비교 시작 -Global settings -전체 설정 +Calculating sync directions... +동기화 방향을 계산 중... -Find -검색 +Out of memory. +메모리 부족. -Select time span -시간간격(타임스팬) 선택 +Item exists on left side only +항목이 좌측에만 존재합니다. -Invalid command line: -잘못된 명령줄 : +Item exists on right side only +항목이 우측에만 존재합니다. -Info -정보 +Left side is newer +좌측이 최신입니다. -Warning -경고 +Right side is newer +우측이 최신입니다. -Fatal Error -치명적 오류 +Items have different content +항목 내용이 서로 다릅니다. -Error Code %x: -오류 코드 %x +Both sides are equal +양측이 같음 -Cannot resolve symbolic link %x. -심볼릭 링크 %x 을(를) 해결할 수 없습니다. +Conflict/item cannot be categorized +충돌 / 항목을 분류할 수 없음 - -1 Byte -%x Bytes - - -%x 바이트 - +Copy new item to left +좌측에 새 항목 복사 -%x MB -%x MB +Copy new item to right +우측에 새 항목 복사 -%x KB -%x KB +Delete left item +좌측 항목 삭제 -%x GB -%x GB +Delete right item +우측 항목 삭제 + +Move file on left +좌측 파일 이동 + +Move file on right +우측 파일 이동 + +Overwrite left item +좌측 항목 덮어쓰기 + +Overwrite right item +우측 항목 덮어쓰기 + +Do nothing +아무 것도 하지 않음 + +Update attributes on left +좌측 속성 업데이트 + +Update attributes on right +우측 속성 업데이트 Database file %x is incompatible. 데이터베이스 파일 %x 은(는) 호환 불가능합니다. @@ -144,9 +172,6 @@ Database file is corrupt: 데이터베이스 파일 손상 : -Out of memory! -메모리 부족! - Cannot write file %x. 파일 %x 을(를) 쓸 수 없습니다. @@ -156,8 +181,8 @@ Database files do not share a common session. 데이터베이스 파일이 일반/공동 세션을 공유하지 않습니다. -An exception occurred! -예외 발생! +Searching for folder %x... +폴더 %x 검색 중... Cannot read file attributes of %x. %x의 파일 속성을 읽을 수 없습니다. @@ -179,9 +204,38 @@ Creating file %x 파일 %x 생성 중 +Items processed: +처리된 항목 : + +Items remaining: +남은 항목 : + +Total time: +전체 시간 : + + +1 Byte +%x Bytes + + +%x 바이트 + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. 분석 오류 - 파일: %x; 행: %y; 열: %z +Cannot set directory lock for %x. +%x 에 대한 디렉토리 잠금을 설정할 수 없습니다. + Scanning: 스캔 : @@ -199,12 +253,18 @@ /sec /초 -File %x does not contain a valid configuration. -파일 %x 의 구성이 유효하지 않습니다. - Configuration file %x loaded partially only. 구성 파일 %x 이(가) 부분적으로만 로드 되었음. +Show in Explorer +탐색기에 표시 + +Open with default application +기본값 응용 프로그램으로 열기 + +Browse directory +디렉토리 찾아보기 + Cannot access Volume Shadow Copy Service. Volume Shadow Copy Service 접근 불가 @@ -214,18 +274,21 @@ Cannot load file %x. 파일 %x 을(를) 로드할 수 없습니다. -Path %x does not contain a volume name. -경로 %x에 볼륨 이름이 없습니다. +Cannot determine volume name for %x. +%x 에 대한 볼륨 이름을 결정할 수 없습니다. -Volume name %x not part of file name %y! -볼륨 이름 %x 은(는) 파일 이름 %y 의 일부가 아님! +Volume name %x not part of file name %y. +볼륨 이름 %x 은(는) 파일 이름 %y 의 일부가 아님. + +Abort requested: Waiting for current operation to finish... +사용자에 의한 작업 중단 : 현재 작업 종료 대기 중... + +Failure to create timestamp for versioning: +버저닝을 위한 타임 스탬프 생성 실패 : Cannot read the following XML elements: 다음 XML 요소를 읽을 수 없습니다 : -Cannot find file %x. -파일 %x 을(를) 찾을 수 없습니다. - &Open... 열기(&O) @@ -306,9 +369,18 @@ The command is triggered if: Cancel 취소 +RealtimeSync - Automated Synchronization +실시간 동기화 - 자동 동기화 + +Warning +경고 + Build: %x 빌드: %x +About +상세 정보 + All files 모든 파일 @@ -318,29 +390,125 @@ The command is triggered if: &Exit 나가기(&E) -Monitoring active... -모니터링 활성화... - Waiting for missing directories... 누락 디렉토리 대기 중... -A folder input field is empty. -폴더 입력 필드 하나가 비어 있습니다. +Invalid command line: +잘못된 명령줄 : + +File content +파일 내용 + +File time and size +파일 시간 및 크기 + + Two way + 양방/양면 (Two Way) + +Mirror +미러 + +Update +업데이트 + +Custom +개인 설정 + +Multiple... +다중처리 (멀티플) 작업... + +Moving file %x to %y +파일 %x을(를) %y(으)로 이동 중 + +Moving folder %x to %y +폴더 %x을(를) %y(으)로 이동 중 + +Moving symbolic link %x to %y +심볼릭 링크 %x을(를) %y(으)로 이동 중 + +Removing old versions... +구 버전 삭제 중... + +Creating symbolic link %x +심볼릭 링크 %x 생성 중 + +Creating folder %x +폴더 %x 생성 중 + +Overwriting file %x +파일 %x 덮어쓰는 중 + +Overwriting symbolic link %x +심볼릭 링크 %x 덮어쓰는 중 + +Verifying file %x +파일 %x 확인 중 + +Updating attributes of %x +%x 속성 업데이트 중 + +Cannot find %x. +%x을(를) 찾을 수 없습니다. + +Target folder %x already existing. +대상 폴더 %x이(가) 이미 존재함. + +Target folder input field must not be empty. +대상 폴더 입력 필드가 비어 있어서는 안 됩니다. + +Folder input field for versioning must not be empty. +버저닝을 위한 폴더 입력 필드가 비어 있어서는 안 됩니다. -Synchronization aborted! -동기화 중단! +Source folder %x not found. +소스 폴더 %x을(를) 찾을 수 없음. + +The following items have unresolved conflicts and will not be synchronized: +아래의 항목들은 해결치 못 한 충돌로 인해 동기화할 수 없습니다 : + +Significant difference detected: +상당한 차이가 감지됐습니다 : + +More than 50% of the total number of files will be copied or deleted. +총 파일 개수의 50% 이상이 복사되거나 삭제 됩니다. + +Not enough free disk space available in: +사용 가능한 디스크 여유 공간이 부족합니다 : + +Required: +필요 공간(크기) : + +Available: +여유 공간(크기) : + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +다중 폴더 페어의 일부인 폴더가 변경됩니다. 동기화 설정을 재검토하세요. + +Synchronizing folder pair: +폴더 페어(짝) 동기화 진행 중 + +Generating database... +데이터베이스 생성 중... + +Creating Volume Shadow Copy for %x... +%x을(를) 위한 Volume Shadow Copy 생성 중... -Synchronization completed with errors! -동기화가 완료되긴 했으나, 오류가 있습니다! +Data verification error: %x and %y have different content. +데이터 확인 오류 : %x 및 %y 의 내용이 서로 다릅니다. -Synchronization completed with warnings. +Synchronization aborted +동기화 중단 + +Synchronization completed with errors +동기화가 완료되긴 했으나, 오류가 있습니다 + +Synchronization completed with warnings 경고 메세지와 함께 동기화 완료 -Nothing to synchronize! -동기화 할 항목이 없습니다! +Nothing to synchronize +동기화 할 항목이 없습니다 -Synchronization completed successfully. -동기화가 성공적으로 완료 됐습니다. +Synchronization completed successfully +동기화가 성공적으로 완료 됐습니다 Saving log file %x... 로그 파일 %x 저장 중... @@ -348,8 +516,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. FreeFileSync 메인 다이얼로그에서 문제 해결을 하려면 "Switch" [전환]을 누르십시오. -Switching to FreeFileSync main dialog... -FreeFileSync 메인 다이얼로그로 전환 중... +Switching to FreeFileSync main dialog +FreeFileSync 기본 대화 창으로 전환 A new version of FreeFileSync is available: 새로운 버전의 FreeFileSync가 나왔습니다 : @@ -357,29 +525,29 @@ The command is triggered if: Download now? 지금 다운로드 하시겠습니까? -FreeFileSync is up to date! -FreeFileSync 는 현재 최신버전 상태입니다! +New version found +새로운 버전이 발견되었습니다. -Information -인포메이션 (정보) +&Download +다운로드(&D) -Unable to connect to sourceforge.net! -Sourceforge.net에 접속할 수 없습니다! +FreeFileSync is up to date. +FreeFileSync는 현재 최신버전 상태입니다. -Current FreeFileSync version number was not found online! Do you want to check manually? -현재 사용하고 계신 FreeFileSync 버전 번호를 온라인에서 찾을 수가 없습니다! 수동으로 확인하시겠습니까? +Information +인포메이션 (정보) -Do you want FreeFileSync to automatically check for updates every week? -FreeFileSync가 매주 자동으로 업데이트를 확인하도록 하시겠습니까? +Unable to connect to sourceforge.net. +Sourceforge.net에 접속할 수 없습니다. -(Requires an Internet connection!) -(인터넷 연결이 필요합니다!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +현재 사용 중인 FreeFileSync 버전 번호를 온라인에서 찾을 수 없습니다. 수동으로 확인해 보시겠습니까? - -<심링크> +Symlink +심링크 - -<폴더> +Folder +폴더 Full path 전체 경로 @@ -402,20 +570,14 @@ The command is triggered if: Extension 확장자 -Size: -크기 : - -Date: -날짜 : +Category +카테고리 Action 실행 -Category -카테고리 - Drag && drop -드래그 && 드랍 (마우스로 파일 끌어다 놓기) +드래그 앤 드랍(&&) [마우스로 파일 끌어다 놓기] Close progress dialog 프로그레스 다이얼로그 (진행 표시 창) 닫기 @@ -432,8 +594,35 @@ The command is triggered if: Hibernate 최대절전모드 +Selected variant: +선택한 베어리언트 + +Select alternate comparison settings +대체 비교 설정 선택 + +Select alternate synchronization settings +대체 동기화 설정 선택 + +Filter is active +필터 활성화 + +No filter selected +선택한 필터가 없음 + +Remove alternate settings +대체설정 제거 + +Clear filter settings +필터 설정 지우기 + +Copy +복사 + +Paste +붙여넣기 + &New -신규 작업(&N) +신규 작업 (&N) &Save 저장(&S) @@ -450,14 +639,14 @@ The command is triggered if: &Language 언어 선택(&L) -&Global settings... -전체 설정(&G) - &Export file list... 파일 리스트 내보내기(&E) -&Advanced -고급기능(&A) +&Global settings... +전체 설정(&G) + +&Tools +도구(&T) &Check now 지금 확인(&C) @@ -465,12 +654,18 @@ The command is triggered if: Check &automatically once a week 자동으로 주당 1회 확인(&a) -Check for new version -신규 버전 확인 +Check for new &version +신규 버전 확인(&v) Compare 비 교 +Comparison settings +비교 설정 + +Synchronization settings +동기화 설정 + Synchronize 동 기 화 @@ -483,6 +678,9 @@ The command is triggered if: Swap sides 양측 위치 바꾸기 +Save as batch job +일괄 작업으로 저장 + Hide excluded items 제외 항목 숨기기 @@ -525,52 +723,7 @@ The command is triggered if: &Pause 일시정지(&P) -Batch job -일괄 작업 - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -자동 동기화를 위한 일괄 파일을 만듭니다. 본 파일을 더블 클릭하거나 시스템 태스크 플래너에 다음과 같이 예약하세요 : FreeFileSync.exe .ffs_batch - -Help -도움말 - -Error handling -오류 발생시 : - -Ignore -무시 - -Hide all error and warning messages -모든 오류/경고 메세지 숨기기 - -Pop-up -팝업 - -Show pop-up on errors or warnings -오류 또는 경고에 대한 팝업 보이기 - -Exit -종료 - -Abort synchronization on first error -첫 번째 오류 시 동기화 중지 - -Show progress dialog -프로그레스 다이얼로그 (진행 표시 창) 보기 - -Save log -로그 저장 - -Select folder to save log files -로그 파일을 저장할 폴더 선택 - -Limit -제한 - -Limit maximum number of log files -로그 파일의 최대 개수 제한 - -Select variant +Select a variant 베어리언트 선택 @@ -586,9 +739,6 @@ are the same 동일한 파일로 간주됩니다. -File time and size -파일 시간 및 크기 - Files are found equal if - file content @@ -600,39 +750,42 @@ is the same 동일한 파일로 간주됩니다. -File content -파일 내용 - Symbolic Link handling 심볼릭 링크 처리 +Help +도움말 + OK OK -<- Two way -> -<- 양방/양면 (Two Way) -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. 양측 변경사항을 확인하고 전달. 삭제, 이동 및 충돌은 데이터베이스를 통해 자동으로 감지됩니다. -Mirror ->> -미러 ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. 좌측 폴더 백업 미러. 동기화 이후 우측 폴더는 좌측 폴더와 완전히 똑같이 매치 되도록 변경 됩니다. -Update -> -업데이트 -> - Copy new or updated files to right folder. 신규 또는 업데이트 된 파일을 우측 폴더로 복사 -Custom -개인 설정 - Configure your own synchronization rules. 개인 동기화 규칙 설정 +Error handling +오류 발생시 : + +Ignore +무시 + +Hide all error and warning messages +모든 오류/경고 메세지 숨기기 + +Pop-up +팝업 + +Show pop-up on errors or warnings +오류 또는 경고에 대한 팝업 보이기 + Deletion handling 삭제 처리 옵션 @@ -657,23 +810,32 @@ is the same Naming convention: 이름 지정 : -Item exists on left side only -항목이 좌측에만 존재합니다. +Batch job +일괄 작업 + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +자동 동기화를 위한 일괄 파일을 만듭니다. 본 파일을 더블 클릭하거나 시스템 태스크 플래너에 다음과 같이 예약하세요 : FreeFileSync.exe .ffs_batch + +Exit +종료 + +Abort synchronization on first error +첫 번째 오류 시 동기화 중지 -Item exists on right side only -항목이 우측에만 존재합니다. +Show progress dialog +프로그레스 다이얼로그 (진행 표시 창) 보기 -Left side is newer -좌측이 최신입니다. +Save log +로그 저장 -Right side is newer -우측이 최신입니다. +Select folder to save log files +로그 파일을 저장할 폴더 선택 -Items have different content -항목 내용이 서로 다릅니다. +Limit +제한 -Conflict/item cannot be categorized -충돌 / 항목을 분류할 수 없음 +Limit maximum number of log files +로그 파일의 최대 개수 제한 Source code written in C++ using: 소스코드는 C++ 언어로 아래 툴을 사용하여 작성되었습니다 : @@ -693,9 +855,6 @@ is the same Homepage 홈페이지 -FreeFileSync at Sourceforge -FreeFileSync at Sourceforge [오픈소스 보기] - Email 이메일 @@ -710,11 +869,11 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. 모든 필터 설정과 일치하는 파일만 동기화 됩니다. -참고 : 파일 이름은 기본 디렉토리와 상응해야 합니다! +참고 : 파일 이름은 기본 디렉토리와 상응해야 합니다. Include @@ -738,6 +897,9 @@ Note: File names must be relative to base directories! &Clear 지우기(&C) +Global settings +전체 설정 + Fail-safe file copy 실패 - 안전 파일 복사 @@ -768,9 +930,6 @@ Note: File names must be relative to base directories! &Default 기본 설정/값(&D) -Start synchronization -동기화 시작 - Variant 베어리언트 @@ -789,11 +948,20 @@ Note: File names must be relative to base directories! &Find next 다음 검색(&F) -Operation aborted! -작업 중단! +Delete +삭제 -Main bar -메인 바 +Configure filter +필터 설정 + +Start synchronization +동기화 시작 + +Find +검색 + +Select time span +시간간격(타임스팬) 선택 Folder pairs 폴더 페어(짝) @@ -804,6 +972,9 @@ Note: File names must be relative to base directories! Configuration 구성 설정 +Main bar +메인 바 + Filter files 파일 필터 @@ -855,11 +1026,8 @@ Note: File names must be relative to base directories! Exclude via filter: 필터를 통하여 제외 - -<복수 선택> - -Delete -삭제 +multiple selection +복수 선택 Include all 모두 포함 @@ -888,14 +1056,14 @@ Note: File names must be relative to base directories! Show "%x" "%x" 표시 - -<마지막 세션> +Last session +마지막 세션 Folder Comparison and Synchronization 폴더 비교 및 동기화 -Configuration saved! -설정 저장 완료! +Configuration saved +설정 저장 완료 FreeFileSync batch FreeFileSync 일괄처리(배치) @@ -909,9 +1077,6 @@ Note: File names must be relative to base directories! Never save changes 변경사항 절대 저장 안 함. -Configuration loaded! -설정 로드 완료! - Show files that exist on left side only 좌측에만 존재하는 파일 표시 @@ -957,17 +1122,17 @@ Note: File names must be relative to base directories! Set as default 기본 값으로 설정 -All folders are in sync! -모든 폴더가 동기화 되었음! +Operation aborted +작업 중단 + +All folders are in sync +모든 폴더가 동기화 되었음 Comma separated list 콤마 분리 목록 -Legend -범례 - -File list exported! -파일 리스트 내보내기 완료! +File list exported +파일 리스트 내보내기 완료 Searching for program updates... 프로그램 업데이트 검색 중... @@ -978,6 +1143,9 @@ Note: File names must be relative to base directories! &Ignore 무시(&I) +Fatal Error +치명적 오류 + Don't show this warning again 이 경고를 다시 표시하지 않음 @@ -999,6 +1167,9 @@ Note: File names must be relative to base directories! Comparing content... 내용 비교 중... +Info +정보 + Paused 일시정지 중 @@ -1099,18 +1270,18 @@ Note: File names must be relative to base directories! Leave as unresolved conflict 미해결 충돌로 놔두기 -Time stamp -타임 스탬프 - -Append a timestamp to each file name -각 파일 이름마다 타임스탬프 추가 - Replace 대체 Move files and replace if existing 파일 이동 및 기존 파일 존재 시에는 대체 +Time stamp +타임 스탬프 + +Append a timestamp to each file name +각 파일 이름마다 타임스탬프 추가 + Folder 폴더 @@ -1153,9 +1324,6 @@ Note: File names must be relative to base directories! Cannot write modification time of %x. %x의 수정 시간을 쓸 수 없습니다. -Cannot find system function %x. -시스템 함수 %x 을(를) 찾을 수 없습니다. - Cannot read security context of %x. %x의 보안 컨텍스트를 읽을 수 없습니다. @@ -1171,8 +1339,11 @@ Note: File names must be relative to base directories! Cannot create directory %x. 디렉토리 %x 을(를) 생성할 수 없습니다. -Cannot copy symbolic link %x to %y. -심볼릭 링크 %x 을(를) %y (으)로 복사할 수 없습니다. +Cannot create symbolic link %x. +심볼릭 링크 %x 을(를) 생성할 수 없습니다. + +Cannot find system function %x. +시스템 함수 %x 을(를) 찾을 수 없습니다. Cannot copy file %x to %y. 파일 %x 을(를) %y (으)로 복사할 수 없습니다. @@ -1180,15 +1351,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: 항목 %x의 형식은 지원되지 않습니다 : +Cannot resolve symbolic link %x. +심볼릭 링크 %x 을(를) 해결할 수 없습니다. + Cannot open directory %x. 디렉토리 %x 을(를) 열 수 없습니다. Cannot enumerate directory %x. 디렉토리 %x 을(를) 열거할 수 없습니다. -Detected endless directory recursion. -삭제된 무한 디렉토리 재귀(반복) - %x TB %x TB @@ -1219,6 +1390,9 @@ Note: File names must be relative to base directories! %x일 +Failed to register to receive system messages. +시스템 메시지를 받기 위한 등록에 실패하였습니다. + Cannot set privilege %x. 권한 %x 을(를) 설정할 수 없습니다. @@ -1228,210 +1402,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. I/O 우선순위 프로세스 변경 불가 -Unable to move %x to the Recycle Bin! -%x 을(를) 휴지통으로 이동할 수 없습니다! - -Both sides have changed since last synchronization! -마지막 동기화 작업 이후, 양측 모두 변경 되었습니다! - -Cannot determine sync-direction: -동기화 방향을 결정할 수 없습니다 : - -No change since last synchronization! -마지막 동기화 이후 변경사항 없음! - -The corresponding database entries are not in sync considering current settings. -해당 데이터베이스 항목은 현재 설정 상태에서 동기화 되지 않습니다. - -Setting default synchronization directions: Old files will be overwritten with newer files. -기본값 동기화 방향 설정 : 이전 파일들은 보다 최신 파일들로 덮어 쓰여집니다. - -Checking recycle bin availability for folder %x... -폴더 %x 을(를) 위한 휴지통 가용성 여부 확인 중... - -Moving file %x to recycle bin -파일 %x을(를) 휴지통으로 이동 중 - -Moving folder %x to recycle bin -폴더 %x을(를) 휴지통으로 이동 중 - -Moving symbolic link %x to recycle bin -심볼릭 링크 %x을(를) 휴지통으로 이동 중 - -Deleting file %x -파일 %x 삭제 중 - -Deleting folder %x -폴더 %x 삭제 중 - -Deleting symbolic link %x -심볼릭 링크 %x 삭제 중 - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -다음 경로로는 휴지통을 사용할 수 없습니다! 대신 파일을 영구적으로 삭제합니다 : - -The corresponding folder will be considered as empty. -해당 폴더를 비어 있는 상태로 간주합니다. - -Cannot find the following folders: -다음 폴더를 찾을 수 없습니다 : - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -각 폴더를 비어있는 상태로 간주할 경우 이 오류는 무시될 수 있습니다. 폴더들은 동기화가 진행되는 동안 자동 생성됩니다. - -Directories are dependent! Be careful when setting up synchronization rules: -디렉토리가 의존 관계에 있습니다. 동기화 규칙 설정시 주의하십시오. - -Start comparison -비교 시작 - -Calculating sync directions... -동기화 방향을 계산 중... - -Conflict detected: -탐지된 충돌/불일치 : +Unable to move %x to the Recycle Bin. +%x 을(를) 휴지통으로 이동할 수 없습니다. -File %x has an invalid date! -파일 %x 의 날짜가 유효하지 않습니다! +Cannot determine final path for %x. +%x 에 대한 최종 경로를 결정할 수 없습니다. -Files %x have the same date but a different size! -파일 %x 의 날짜는 같으나, 크기가 다릅니다! - -Items differ in attributes only -항목들이 속성에서만 차이가 있습니다. - -Symbolic links %x have the same date but a different target. -심볼릭 링크 %x 의 날짜는 같으나, 타겟이 다릅니다. - -Comparing content of files %x -파일 %x 내용 별 비교 중 - -Comparing files by content failed. -내용 별 파일 비교 실패 - -Generating file list... -파일 리스트 생성 중... - -Both sides are equal -양측이 같음 - -Copy new item to left -좌측에 새 항목 복사 - -Copy new item to right -우측에 새 항목 복사 - -Delete left item -좌측 항목 삭제 - -Delete right item -우측 항목 삭제 - -Move file on left -좌측 파일 이동 - -Move file on right -우측 파일 이동 - -Overwrite left item -좌측 항목 덮어쓰기 - -Overwrite right item -우측 항목 덮어쓰기 - -Do nothing -아무 것도 하지 않음 - -Update attributes on left -좌측 속성 업데이트 - -Update attributes on right -우측 속성 업데이트 - -Multiple... -다중처리 (멀티플) 작업... - -Moving file %x to %y -파일 %x을(를) %y(으)로 이동 중 - -Moving folder %x to %y -폴더 %x을(를) %y(으)로 이동 중 - -Moving symbolic link %x to %y -심볼릭 링크 %x을(를) %y(으)로 이동 중 - -Removing old versions... -구 버전 삭제 중... - -Creating symbolic link %x -심볼릭 링크 %x 생성 중 - -Creating folder %x -폴더 %x 생성 중 - -Overwriting file %x -파일 %x 덮어쓰는 중 - -Overwriting symbolic link %x -심볼릭 링크 %x 덮어쓰는 중 - -Verifying file %x -파일 %x 확인 중 - -Updating attributes of %x -%x 속성 업데이트 중 - -Cannot find %x. -%x을(를) 찾을 수 없습니다. - -Target folder %x already existing. -대상 폴더 %x이(가) 이미 존재함. - -Target folder input field must not be empty. -대상 폴더 입력 필드가 비어 있어서는 안 됩니다. - -Folder input field for versioning must not be empty. -버저닝을 위한 폴더 입력 필드가 비어 있어서는 안 됩니다. - -Source folder %x not found. -소스 폴더 %x을(를) 찾을 수 없음. - -The following items have unresolved conflicts and will not be synchronized: -아래의 항목들은 해결치 못 한 충돌로 인해 동기화할 수 없습니다 : - -Significant difference detected: -상당한 차이가 감지됐습니다 : - -More than 50% of the total number of files will be copied or deleted! -총 파일 개수의 50% 이상이 복사되거나 삭제 됩니다! - -Not enough free disk space available in: -사용 가능한 디스크 여유 공간이 부족합니다 : - -Required: -필요 공간(크기) : - -Available: -여유 공간(크기) : - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -다중 폴더 페어의 일부인 폴더가 변경됩니다. 동기화 설정을 재검토하세요. - -Left -좌측 - -Right -우측 - -Synchronizing folder pair: -폴더 페어(짝) 동기화 진행 중 - -Generating database... -데이터베이스 생성 중... - -Creating Volume Shadow Copy for %x... -%x을(를) 위한 Volume Shadow Copy 생성 중... - -Data verification error: Source and target file have different content! -데이터 확인 오류 : 소스 및 타겟 파일의 내용이 다릅니다! +Error Code %x: +오류 코드 %x diff --git a/BUILD/Languages/lithuanian.lng b/BUILD/Languages/lithuanian.lng index 6c4ca60a..0c4cc9b9 100644 --- a/BUILD/Languages/lithuanian.lng +++ b/BUILD/Languages/lithuanian.lng @@ -1,145 +1,215 @@
- Lietuvių + Lietuvių Liudas Ališauskas lt_LT - lithuania.png - 4 - n==1 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3 + flag_lithuania.png + 4 + n==1 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3
-Searching for folder %x... -Ieškoma aplanko %x... +Cannot determine final path for %x. + -Items processed: -Elementų apdorota: +Failed to register to receive system messages. + -Items remaining: -Likę elementai: +Cannot resolve symbolic link %x. + -Total time: -Visas laikas: +Cannot create symbolic link %x. + -Cannot set directory lock for %x. -Nepavyksta nustatyti katalogo užrakto %x. +Items + -Show in Explorer -Rodyti naršyklėje + +%y of 1 row in view +%y of %x rows in view + + -Open with default application -Atverti su numatyta programa +Select a variant + -Browse directory -Naršyti katalogą +Check for new &version + -Abort requested: Waiting for current operation to finish... -Nutraukti: laukiama kol baigsis esama operacija... +&Tools + -Failure to create timestamp for versioning: -Nepavyo sukurti laiko žymės versijavimui: +Cannot find current FreeFileSync version number online. Do you want to check manually? + -RealtimeSync - Automated Synchronization -RealtimeSync - Automatizuotas sinchronizavimas +&Download + + +New version found + + +Switching to FreeFileSync main dialog + + +Data verification error: %x and %y have different content. + + +Cannot determine volume name for %x. + + +Cannot read file attributes of %x. + + +Starting comparison + + +Resolving symbolic link %x + + +The following folders have dependent paths. Be careful when setting up synchronization rules: + + +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. + + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: + + +The database entry is not in sync considering current settings. + + +Both sides have changed since last synchronization. +Abi pusės buvo pakeistos nuo paskutinio sinchronizavimo. + +Cannot determine sync-direction: +Nepavyksta nustatyti sinchronizavimo krypties: + +No change since last synchronization. +Nėra pakitimo nuo pakutinio sinchronizavimo. + +Setting default synchronization directions: Old files will be overwritten with newer files. +Nustatomos numatytos sinchronizavimo kryptys: Seni failai bus perrašyti naujesniais failais. + +Checking recycle bin availability for folder %x... +Tikrinamas šiukšliadėžės prieinamumas aplankui %x... + +Moving file %x to recycle bin +Perkeliamas failas %x į šiukšliadėžę + +Moving folder %x to recycle bin +Perkeliamas aplankas %x į šiukšliadėžę + +Moving symbolic link %x to recycle bin +Perkeliama simbolinė nuoroda %x į šiukšliadėžę + +Deleting file %x +Trinamas failas %x + +Deleting folder %x +Trinamas aplankas %x + +Deleting symbolic link %x +Tinama simbolinė nuoroda %x + +An exception occurred +Atsirado išimtis + +Cannot find file %x. +Nepavyksta rasti failo %x. Error Klaida -Selected variant: -Pasirinktas variantas: +File %x does not contain a valid configuration. +Failas %x neturi tinkamų nustatymų. -Select alternate comparison settings -Pasirinkite alternatyvius sulyginimo nustatymus +A folder input field is empty. +Aplanko įvesties laukas yra tuščias. -Select alternate synchronization settings -Pasirinkite alternatyvius sinchronizavimo nustatymus +The corresponding folder will be considered as empty. +Atitinkamas aplankas bus laikomas tuščiu. -Filter is active -Filtas yra aktyvus +Cannot find the following folders: +Nepavyksta rasti šių aplankų: -No filter selected -Nepažymėti jokie filtrai +File %x has an invalid date. +Failas %x turi netinkamą datą. -Remove alternate settings -Pašalinti alternatyvius nustatymus +Date: +Data: -Clear filter settings -Išvalyti filtro nustatymus +Files %x have the same date but a different size. +Failai %x turi tokią pačią datą bet skirtingą dydį. -Copy -Kopijuoti +Size: +Dydis: -Paste -Įklijuoti +Items differ in attributes only +Elementai skiriasi tik atributais -Save as batch job -Išsaugoti kaip paketinį darbą +Comparing content of files %x +Sulyginamas failų turinys %x -Comparison settings -Sulyginimo nustatymai +Generating file list... +Generuojamas failų sąrašas... -Synchronization settings -Sinchronizavimo nustatymai +Calculating sync directions... +Apskaičiuojamos sinchrinizacijos kryptys... -About -Apie +Out of memory. +Trūksta atminties. -Confirm -Patvirtinti +Item exists on left side only +Elementas egzistuoja tik kairėje pusėje -Configure filter -Nustatyti filtrą +Item exists on right side only +Elementas egzistuoja tik dešinėje pusėje -Global settings -Bendri nustatymai +Left side is newer +Kairė pusė yra naujesnė -Find -Rasti +Right side is newer +Dešinė pusė yra naujesnė -Select time span -Pažymėti laiko trukmę +Items have different content +Elementai turi skirtingą turinį -Invalid command line: -Netinkama komandinė eilutė: +Both sides are equal +Abi pusės yra lygios -Info -Informacija +Conflict/item cannot be categorized +Konfliktas/elementas negali būti kategorizuojamas -Warning -Perspėjimas +Copy new item to left +Kopijuoti naują elementą į kairę -Fatal Error -Kritinė klaida +Copy new item to right +Kopijuoti naują elementą į dešinę -Error Code %x: -Klaidos kodas %x: +Delete left item +Ištrinti kairįjį elementą -Cannot resolve symbolic link %x. - +Delete right item +Ištrinti dešinįjį elementą -Cannot determine final path for %x. - +Move file on left +Perkelti failą į kairę -Cannot find system function %x. -Nepavyksta rasti sistemos funkcijos %x. +Move file on right +Perkelti failą į dešinę - -1 Byte -%x Bytes - - -1 Baitas -%x Baitai -%x Baitų -%x Baitas - +Overwrite left item +Perrašyti kairįjį elementą -%x MB -%x MB +Overwrite right item +Perrašyti dešinįjį elementą -%x KB -%x KB +Do nothing +Nieko nedaryti -%x GB -%x GB +Update attributes on left +Atnaujinti atributus kairėje + +Update attributes on right +Atnaujinti atributus dešinėje Database file %x is incompatible. Duomenų bazė %x yra netinkama. @@ -153,9 +223,6 @@ Database file is corrupt: Duomenų bazės failas sugadintas -Out of memory! -Trūksta atminties! - Cannot write file %x. Nepavyksta įrašyti failo %x. @@ -165,11 +232,8 @@ Database files do not share a common session. Duomenų bazės failai nesidalina bendros sesijos. -An exception occurred! -Atsirado išimtis! - -Cannot read file attributes of %x. - +Searching for folder %x... +Ieškoma aplanko %x... Cannot get process information. Nepavyksta gauti eigos informacijos. @@ -191,9 +255,41 @@ Creating file %x Kuriamas failas %x +Items processed: +Elementų apdorota: + +Items remaining: +Likę elementai: + +Total time: +Visas laikas: + + +1 Byte +%x Bytes + + +1 Baitas +%x Baitai +%x Baitų +%x Baitas + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Klaida trinant failą %x, eilė %y, stulpelis %z. +Cannot set directory lock for %x. +Nepavyksta nustatyti katalogo užrakto %x. + Scanning: Skenuojama: @@ -214,12 +310,18 @@ /sec /sek. -File %x does not contain a valid configuration. -Failas %x neturi tinkamų nustatymų. - Configuration file %x loaded partially only. Nustatymų failas %x įkeltas tik dalinai. +Show in Explorer +Rodyti naršyklėje + +Open with default application +Atverti su numatyta programa + +Browse directory +Naršyti katalogą + Cannot access Volume Shadow Copy Service. Nepavyksta apsiekti tomo šėšėlinio kopijavimo tarnybos. @@ -229,18 +331,18 @@ Cannot load file %x. Nepavyksta įkelti failo %x. -Path %x does not contain a volume name. -Kelias %x neturi tomo pavadinimo. +Volume name %x not part of file name %y. +Tomo pavadinimas %x nėra dalis failo pavadinimo %y. + +Abort requested: Waiting for current operation to finish... +Nutraukti: laukiama kol baigsis esama operacija... -Volume name %x not part of file name %y! -Tomo pavadinimas %x nėra dalis failo pavadinimo %y! +Failure to create timestamp for versioning: +Nepavyo sukurti laiko žymės versijavimui: Cannot read the following XML elements: Nepavyksta perskaityti sekančių XML elementų: -Cannot find file %x. -Nepavyksta rasti failo %x. - &Open... &Atverti... @@ -321,9 +423,18 @@ Komanda inicijuojama jei: Cancel Atšaukti +RealtimeSync - Automated Synchronization +RealtimeSync - Automatizuotas sinchronizavimas + +Warning +Perspėjimas + Build: %x Versija: %x +About +Apie + All files Visi failai @@ -333,29 +444,122 @@ Komanda inicijuojama jei: &Exit &Išeiti -Monitoring active... -Stebėjimas aktyvus... - Waiting for missing directories... Laikiama trūkstamų katalogų... -A folder input field is empty. -Aplanko įvesties laukas yra tuščias. +Invalid command line: +Netinkama komandinė eilutė: + +File content +Failo turinį + +File time and size +Failo laiką ir dydį + + Two way + Dvipusis + +Mirror +Veidrodis + +Update +Atnaujinti + +Custom +Savitas + +Multiple... +Keletas... + +Moving file %x to %y +Perkeliamas failas %x į %y + +Moving folder %x to %y +Perkeliamas aplankas %x į %y + +Moving symbolic link %x to %y +Perkeliama simbolinė nuoroda %x į %y + +Removing old versions... +Šalinamos senos versijos... + +Creating symbolic link %x +Kuriama simbolinė nuoroda %x + +Creating folder %x +Kuriamas aplankas %x + +Overwriting file %x +Perrašomas failas %x + +Overwriting symbolic link %x +Perrašoma simbolinė nuoroda %x + +Verifying file %x +Tikrinamas failas %x + +Updating attributes of %x +Atnaujinami atributai %x + +Cannot find %x. +Nepavyksta rasti %x. + +Target folder %x already existing. +Tikslo aplankas %x jau yra. + +Target folder input field must not be empty. +Tikslo aplanko įvesties laukas negali būti tuščias. + +Folder input field for versioning must not be empty. +Aplanko įvesties laukas versijavimui negali būti tuščias. + +Source folder %x not found. +Šaltinio aplankas %x nerastas. + +The following items have unresolved conflicts and will not be synchronized: +Šie elementai turi neišspręstų konfliktų ir nebus sinchronizuoti: + +Significant difference detected: +Žymus skirtumas nustatytas: + +More than 50% of the total number of files will be copied or deleted. +Daugiau nei 50% failų bus nukopijuota arba ištrinta. + +Not enough free disk space available in: +Nepakanka laisvos disko vietos: + +Required: +Reikia: + +Available: +Pasiekiama: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Aplankas, kuris yra dalis keletos aplankų porų, bus pakeistas. Prašome peržiūrėti sinchronizavimo nustatymus. + +Synchronizing folder pair: +Sinchrinizuojama aplankų pora: + +Generating database... +Generuojama duomenų bazė... + +Creating Volume Shadow Copy for %x... +Kuriama vietos šėšėlinė kopija dėl %x... -Synchronization aborted! -Synchronizavimas nutrauktas! +Synchronization aborted +Synchronizavimas nutrauktas -Synchronization completed with errors! -Synchronizavimas baigtas su klaidomis! +Synchronization completed with errors +Synchronizavimas baigtas su klaidomis -Synchronization completed with warnings. -Synchronizavimas baigtas su perspėjimais! +Synchronization completed with warnings +Synchronizavimas baigtas su perspėjimais -Nothing to synchronize! -Nėra ko sinchronizuoti! +Nothing to synchronize +Nėra ko sinchronizuoti -Synchronization completed successfully. -Synchronizavimas sėkmingai baigtas. +Synchronization completed successfully +Synchronizavimas sėkmingai baigtas Saving log file %x... Saugmas žurnalo failas %x... @@ -363,38 +567,26 @@ Komanda inicijuojama jei: Press "Switch" to resolve issues in FreeFileSync main dialog. Spauskite „Perjungti“, kad išspręsti problemas pagrindiniame FreeFileSync lange. -Switching to FreeFileSync main dialog... -Perjungiama į pagrindinį FreeFileSync langą... - A new version of FreeFileSync is available: Yra nauja FreeFileSync versija: Download now? Atsiųsti dabar? -FreeFileSync is up to date! -FreeFileSync yra naujausia! +FreeFileSync is up to date. +FreeFileSync yra naujausia. Information Informacija -Unable to connect to sourceforge.net! -Nepavyksta prisijungti prie sourceforge.net! - -Current FreeFileSync version number was not found online! Do you want to check manually? -Šis FreeFileSync versijos numeris nerastas internete! Ar norite patikrinti rankiniu būdu? - -Do you want FreeFileSync to automatically check for updates every week? -Ar tikrai norite, kad FreeFileSync automatiškai ieškoti atnaujinimų kiekvieną savaitę? - -(Requires an Internet connection!) -(Reikalingas interneto ryšys!) +Unable to connect to sourceforge.net. +Nepavyksta prisijungti prie sourceforge.net. - - +Symlink +Simbolinė nuoroda - - +Folder +Aplankas Full path Pilnas kelias @@ -417,12 +609,6 @@ Komanda inicijuojama jei: Extension Plėtinys -Size: -Dydis: - -Date: -Data: - Category Kategorija @@ -447,6 +633,33 @@ Komanda inicijuojama jei: Hibernate Stabdyti į operatyviąją atmintį +Selected variant: +Pasirinktas variantas: + +Select alternate comparison settings +Pasirinkite alternatyvius sulyginimo nustatymus + +Select alternate synchronization settings +Pasirinkite alternatyvius sinchronizavimo nustatymus + +Filter is active +Filtas yra aktyvus + +No filter selected +Nepažymėti jokie filtrai + +Remove alternate settings +Pašalinti alternatyvius nustatymus + +Clear filter settings +Išvalyti filtro nustatymus + +Copy +Kopijuoti + +Paste +Įklijuoti + &New &Naujas @@ -465,14 +678,11 @@ Komanda inicijuojama jei: &Language &Kalba -&Global settings... -&Bendri nustatymai... - &Export file list... &Eksportuoti failų sąrašą... -&Advanced -&Išsamiau +&Global settings... +&Bendri nustatymai... &Check now &Tikrinti dabar @@ -480,12 +690,15 @@ Komanda inicijuojama jei: Check &automatically once a week Tikrinti &automatiškai kartą per savaitę -Check for new version -Tikrinti ar yra nauja versija - Compare Sulyginti +Comparison settings +Sulyginimo nustatymai + +Synchronization settings +Sinchronizavimo nustatymai + Synchronize Sinchronizuoti @@ -498,6 +711,9 @@ Komanda inicijuojama jei: Swap sides Sukeisti puses +Save as batch job +Išsaugoti kaip paketinį darbą + Hide excluded items Slėpti išskirtus elementus @@ -540,54 +756,6 @@ Komanda inicijuojama jei: &Pause &Pauzė -Batch job -Paketinė užduotis - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Sukurkite paketinės užduoties failą, kad automatizuoti sinchronizaciją. Spragtelėkite du kartus šį failą arba nustatykite Jūsų sistemos užduočių planuoklėje: FreeFileSync.exe .ffs_batch - -Help -Pagalba - -Error handling -Klaidų valdymas - -Ignore -Ignoruoti - -Hide all error and warning messages -Slėpti visus klaidų ir perspėjimų pranešimus - -Pop-up -Iššokti - -Show pop-up on errors or warnings -Rodyti pranešimą esant klaidoms ar perspėjimams - -Exit -Išeiti - -Abort synchronization on first error -Nutraukti sinchronizavimą su pirma klaida - -Show progress dialog -Rodyti eigos langą - -Save log -Saugoti žurnalus - -Select folder to save log files -Pasirinkite aplanką ataskaitos failų saugojimui - -Limit -Riba - -Limit maximum number of log files -Apriboti ataskaitų failų skaičių - -Select variant -Pasirinkti variantą - Files are found equal if - last write time and date @@ -601,9 +769,6 @@ Failai laikomi lygiais jei yra tokie patys -File time and size -Failo laiką ir dydį - Files are found equal if - file content @@ -615,39 +780,42 @@ Failai laikomi lygiais jei yra toks pats -File content -Failo turinį - Symbolic Link handling Simbolinių nuorodų valdymas +Help +Pagalba + OK Gerai -<- Two way -> -<- Dvipusis -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Nustatyti ir skatinti pokyčius apbiejose pusėse. Trinimai, perkėlimai ir konfliktai yra aptinkami automatiškai naudojant duomenų bazę. -Mirror ->> -Veidrodis ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Veidrodinė kairiojo aplanko kopija. Dešinysis aplankas yra pakeičiamas taip, kad po sinchronizavimo tiksliai atitiktų kairyjį aplanką. -Update -> -Atnaujinti -> - Copy new or updated files to right folder. Kopijuoti naujus ar atnaujintus failus į dešinyjį aplanką. -Custom -Savitas - Configure your own synchronization rules. Nustatyti Jūsų pačių sinchronizavimo taisykles. +Error handling +Klaidų valdymas + +Ignore +Ignoruoti + +Hide all error and warning messages +Slėpti visus klaidų ir perspėjimų pranešimus + +Pop-up +Iššokti + +Show pop-up on errors or warnings +Rodyti pranešimą esant klaidoms ar perspėjimams + Deletion handling Trinimo valdymas @@ -672,23 +840,32 @@ yra toks pats Naming convention: Pavadinimų taisyklės: -Item exists on left side only -Elementas egzistuoja tik kairėje pusėje +Batch job +Paketinė užduotis -Item exists on right side only -Elementas egzistuoja tik dešinėje pusėje +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Sukurkite paketinės užduoties failą, kad automatizuoti sinchronizaciją. Spragtelėkite du kartus šį failą arba nustatykite Jūsų sistemos užduočių planuoklėje: FreeFileSync.exe .ffs_batch -Left side is newer -Kairė pusė yra naujesnė +Exit +Išeiti -Right side is newer -Dešinė pusė yra naujesnė +Abort synchronization on first error +Nutraukti sinchronizavimą su pirma klaida -Items have different content -Elementai turi skirtingą turinį +Show progress dialog +Rodyti eigos langą -Conflict/item cannot be categorized -Konfliktas/elementas negali būti kategorizuojamas +Save log +Saugoti žurnalus + +Select folder to save log files +Pasirinkite aplanką ataskaitos failų saugojimui + +Limit +Riba + +Limit maximum number of log files +Apriboti ataskaitų failų skaičių Source code written in C++ using: Šaltinio kodas parašytas su C++ naudojant: @@ -708,9 +885,6 @@ yra toks pats Homepage Namų puslapis -FreeFileSync at Sourceforge -FreeFileSync svetainėje Sourceforge - Email El. paštas @@ -725,11 +899,11 @@ yra toks pats Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Tik failai, kurie atitinka visus filtro nustatymus bus sinchronizuoti. -Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! +Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus. Include @@ -753,6 +927,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! &Clear &Išvalyti +Global settings +Bendri nustatymai + Fail-safe file copy Apsauginė failo kopija @@ -783,9 +960,6 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! &Default &Numatyta -Start synchronization -Pradėti sinchronizavimą - Variant Variantas @@ -804,6 +978,21 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! &Find next &Rasti kitą +Delete +Trinti + +Configure filter +Nustatyti filtrą + +Start synchronization +Pradėti sinchronizavimą + +Find +Rasti + +Select time span +Pažymėti laiko trukmę + Folder pairs Aplankų poros @@ -853,12 +1042,6 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! %x failas - -%y of 1 row in view -%y of %x rows in view - - - Set direction: Nustatyti kryptį: @@ -871,11 +1054,8 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! Exclude via filter: Neįtraukti per filtrą: - - - -Delete -Trinti +multiple selection +keletos pažymėjimas Include all Įtraukti visus @@ -904,14 +1084,14 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! Show "%x" Rodyti "%x" - - +Last session +Paskutinė sesija Folder Comparison and Synchronization Aplankų sulyginimas ir sinchronizavimas -Configuration saved! -Nustatymai išsaugoti! +Configuration saved +Nustatymai išsaugoti FreeFileSync batch FreeFileSync paketinė užduotis @@ -925,9 +1105,6 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! Never save changes Niekada nesaugoti pakeitimų -Configuration loaded! -Nustatymai įkelti! - Show files that exist on left side only Rodyti failus, kurie egzistuoja tik kairėje pusėje @@ -973,17 +1150,17 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! Set as default Nustatyti kaip numatytą -Operation aborted! -Operacija nutraukta! +Operation aborted +Operacija nutraukta -All folders are in sync! -Visi aplankai susinchronizuoti! +All folders are in sync +Visi aplankai susinchronizuoti Comma separated list Kableliais atksirtas sąrašas -File list exported! -Failų sąrašas eksportuotas! +File list exported +Failų sąrašas eksportuotas Searching for program updates... Ieškoma programos atnaujinimų... @@ -994,6 +1171,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! &Ignore &Ignoruoti +Fatal Error +Kritinė klaida + Don't show this warning again Neberodyti daugiau šio perspėjimo @@ -1015,6 +1195,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! Comparing content... Sulyginamas turinys... +Info +Informacija + Paused Pristabdyta @@ -1145,9 +1328,6 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! Files Failai -Items - - Percentage Procentai @@ -1190,8 +1370,8 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! Cannot create directory %x. Nepavyksta sukurti katalogo %x. -Cannot create symbolic link %x. - +Cannot find system function %x. +Nepavyksta rasti sistemos funkcijos %x. Cannot copy file %x to %y. Nepavyksta nukopijuoti failo %x į %y. @@ -1205,9 +1385,6 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! Cannot enumerate directory %x. Nepavyksta sunumeruoti direktorijos %x. -Detected endless directory recursion. -Aptikri nesibaigiančią katalogo rekursiją. - %x TB %x TB @@ -1256,201 +1433,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus! Cannot change process I/O priorities. Nepavyksta pakeisti proceso I/O prioritetų. -Unable to move %x to the Recycle Bin! -Nepavyksta perkelti %x į šiukšliadėžę! - -Both sides have changed since last synchronization! -Abi pusės buvo pakeistos nuo paskutinio sinchronizavimo! - -Cannot determine sync-direction: -Nepavyksta nustatyti sinchronizavimo krypties: - -No change since last synchronization! -Nėra pakitimo nuo pakutinio sinchronizavimo! - -The corresponding database entries are not in sync considering current settings. -Atitinkami duomenų bazės įrašai nėra susinchronizuoti atsižvelgiant į dabartinius nustatymus. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Nustatomos numatytos sinchronizavimo kryptys: Seni failai bus perrašyti naujesniais failais. - -Checking recycle bin availability for folder %x... -Tikrinamas šiukšliadėžės prieinamumas aplankui %x... - -Moving file %x to recycle bin -Perkeliamas failas %x į šiukšliadėžę - -Moving folder %x to recycle bin -Perkeliamas aplankas %x į šiukšliadėžę - -Moving symbolic link %x to recycle bin -Perkeliama simbolinė nuoroda %x į šiukšliadėžę - -Deleting file %x -Trinamas failas %x - -Deleting folder %x -Trinamas aplankas %x - -Deleting symbolic link %x -Tinama simbolinė nuoroda %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Šiukšliadėžė nepasiekiama sekantiems keliams! Failai bus ištrinti visam laikui išskyrus: - -The corresponding folder will be considered as empty. -Atitinkamas aplankas bus laikomas tuščiu. - -Cannot find the following folders: -Nepavyksta rasti šių aplankų: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. - - -Directories are dependent! Be careful when setting up synchronization rules: -Katalogai yra priklausomi! Būkite atsargūs nustatydami sinchronizavimo taisykles: - -Conflict detected: -Aptiktas konfliktas: - -File %x has an invalid date! -Failas %x turi netinkamą datą! - -Files %x have the same date but a different size! -Failai %x turi tokią pačią datą bet skirtingą dydį! - -Items differ in attributes only -Elementai skiriasi tik atributais - -Resolving symbolic link %x - - -Comparing content of files %x -Sulyginamas failų turinys %x - -Generating file list... -Generuojamas failų sąrašas... - -Start comparison -Pradėti palyginimą - -Calculating sync directions... -Apskaičiuojamos sinchrinizacijos kryptys... - -Both sides are equal -Abi pusės yra lygios - -Copy new item to left -Kopijuoti naują elementą į kairę - -Copy new item to right -Kopijuoti naują elementą į dešinę - -Delete left item -Ištrinti kairįjį elementą - -Delete right item -Ištrinti dešinįjį elementą - -Move file on left -Perkelti failą į kairę - -Move file on right -Perkelti failą į dešinę - -Overwrite left item -Perrašyti kairįjį elementą - -Overwrite right item -Perrašyti dešinįjį elementą - -Do nothing -Nieko nedaryti - -Update attributes on left -Atnaujinti atributus kairėje - -Update attributes on right -Atnaujinti atributus dešinėje - -Multiple... -Keletas... - -Moving file %x to %y -Perkeliamas failas %x į %y - -Moving folder %x to %y -Perkeliamas aplankas %x į %y - -Moving symbolic link %x to %y -Perkeliama simbolinė nuoroda %x į %y - -Removing old versions... -Šalinamos senos versijos... - -Creating symbolic link %x -Kuriama simbolinė nuoroda %x - -Creating folder %x -Kuriamas aplankas %x - -Overwriting file %x -Perrašomas failas %x - -Overwriting symbolic link %x -Perrašoma simbolinė nuoroda %x - -Verifying file %x -Tikrinamas failas %x - -Updating attributes of %x -Atnaujinami atributai %x - -Cannot find %x. -Nepavyksta rasti %x. - -Target folder %x already existing. -Tikslo aplankas %x jau yra. - -Target folder input field must not be empty. -Tikslo aplanko įvesties laukas negali būti tuščias. - -Folder input field for versioning must not be empty. -Aplanko įvesties laukas versijavimui negali būti tuščias. - -Source folder %x not found. -Šaltinio aplankas %x nerastas. - -The following items have unresolved conflicts and will not be synchronized: -Šie elementai turi neišspręstų konfliktų ir nebus sinchronizuoti: - -Significant difference detected: -Žymus skirtumas nustatytas: - -More than 50% of the total number of files will be copied or deleted! -Daugiau nei 50% failų bus nukopijuota arba ištrinta! - -Not enough free disk space available in: -Nepakanka laisvos disko vietos: - -Required: -Reikia: - -Available: -Pasiekiama: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Aplankas, kuris yra dalis keletos aplankų porų, bus pakeistas. Prašome peržiūrėti sinchronizavimo nustatymus. - -Synchronizing folder pair: -Sinchrinizuojama aplankų pora: +Unable to move %x to the Recycle Bin. +Nepavyksta perkelti %x į šiukšliadėžę. -Generating database... -Generuojama duomenų bazė... - -Creating Volume Shadow Copy for %x... -Kuriama vietos šėšėlinė kopija dėl %x... - -Data verification error: Source and target file have different content! -Duomenų patikrinimo klaida: Šaltinio ir tikslo failas turi skirtingus turinius! +Error Code %x: +Klaidos kodas %x: diff --git a/BUILD/Languages/norwegian.lng b/BUILD/Languages/norwegian.lng index d453b110..4ebcd3a5 100644 --- a/BUILD/Languages/norwegian.lng +++ b/BUILD/Languages/norwegian.lng @@ -1,143 +1,254 @@
- Norsk + Norsk Bjørn Snoen nb_NO - norway.png - 2 - n == 1 ? 0 : 1 + flag_norway.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Søker etter mappen %x... +Cannot determine final path for %x. + -Items processed: -Elementer behandlet: +Failed to register to receive system messages. + -Items remaining: -Gjenværende elementer: +Cannot create symbolic link %x. + -Total time: -Total tid: +Items + + +Time stamp + + + +Do you really want to delete the following item? +Do you really want to delete the following %x items? + + + + +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? + + + +Don't show this warning again + + +Searching for program updates... + + + +%y of 1 row in view +%y of %x rows in view + + + +&Clear + + +Move files to user-defined folder + + +Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. + + +Select a variant + + +Check for new &version + + +Check &automatically once a week + + +&Check now + + +&Tools + + +Paste + + +Cannot find current FreeFileSync version number online. Do you want to check manually? + + +&Download + + +New version found + + +Switching to FreeFileSync main dialog + + +Data verification error: %x and %y have different content. + + +Creating Volume Shadow Copy for %x... + + +Cannot determine volume name for %x. + Cannot set directory lock for %x. -Show in Explorer -Vis i utforsker +Calculating sync directions... + -Open with default application -Åpne med standardprogram +Starting comparison + -Browse directory -Utforsk mappe +Resolving symbolic link %x + -Abort requested: Waiting for current operation to finish... -Handling avbrutt: Venter på at nåværende handling fullføres... +The following folders have dependent paths. Be careful when setting up synchronization rules: + -Failure to create timestamp for versioning: -Feil ved opprettelse av tidsstempel for versjon: +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. + -RealtimeSync - Automated Synchronization -RealtimeSync - Automatisk synkronisering +The corresponding folder will be considered as empty. + + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: + + +The database entry is not in sync considering current settings. + + +Both sides have changed since last synchronization. +Begge sider er endret siden siste synkronisering. + +Cannot determine sync-direction: +Kan ikke bestemme synkroniseringsretning: + +No change since last synchronization. +Ingen endringer siden siste synkronisering. + +Setting default synchronization directions: Old files will be overwritten with newer files. +Stiller inn standard synkroniseringsretning: Gamle filer blir overskrevet med nyere filer. + +Checking recycle bin availability for folder %x... +Sjekker søppelbøtte for tilgjengelig mappe %x... + +Moving file %x to recycle bin +Flytter fil %x til papirkurv + +Moving folder %x to recycle bin +Flytter mappe %x til papirkurv + +Moving symbolic link %x to recycle bin +Flytter symbolsk lenke %x til papirkurv + +Deleting file %x +Sletter fil %x + +Deleting folder %x +Sletter mappe %x + +Deleting symbolic link %x +Sletter symbolsk lenke %x + +An exception occurred +Et avvik har oppstått + +Cannot find file %x. +Kan ikke finne filen %x. Error Feil -Selected variant: -Valgt variant: - -Select alternate comparison settings -Velg alternative innstillinger for sammenligning +File %x does not contain a valid configuration. +Filen %x inneholder en ugyldig innstilling. -Select alternate synchronization settings -Velg alternative innstillinger for synkronisering +A folder input field is empty. +Et mappefelt er tomt. -Filter is active -Filter er aktivt +Cannot find the following folders: +Kan ikke finne følgende mapper: -No filter selected -Ingen filter valgt +File %x has an invalid date. +Filen %x har en ugyldig dato. -Remove alternate settings -Fjern alternative innstillinger +Date: +Dato: -Clear filter settings -Fjern filterinnstillinger +Files %x have the same date but a different size. +Filer %x har den samme datoen, men forskjellig størrelse. -Copy -Kopier +Size: +Størrelse: -Paste - +Items differ in attributes only +Elementer har kun forskjellige attributter -Save as batch job -Lagre som sammensatt oppgave +Comparing content of files %x +Sammenligner innhold til filer %x -Comparison settings -Innstillinger for sammenligning +Generating file list... +Lager filliste... -Synchronization settings -Innstillinger for synkronisering +Out of memory. +For lite minne. -About -Om +Item exists on left side only +Element eksisterer kun på venstre side -Confirm -Bekreft +Item exists on right side only +Element eksisterer kun på høyre side -Configure filter -Still inn filter +Left side is newer +Venstre side er nyere -Global settings -Globale innstillinger +Right side is newer +Høyre side er nyere -Find -Søk +Items have different content +Elementer har forskjellig innhold -Select time span -Velg tidsrom +Both sides are equal +Begge sider er like -Invalid command line: -Ugyldig kommando: +Conflict/item cannot be categorized +Konflikt/element kan ikke kategoriseres -Info -Info +Copy new item to left +Kopier nytt element til venstre -Warning -Advarsel +Copy new item to right +Kopier nytt element til høyre -Fatal Error -Fatal feil +Delete left item +Slett venstre element -Error Code %x: -Feil kode %x: +Delete right item +Slett høyre element -Cannot resolve symbolic link %x. -Kan ikke følge symbolsk lenke %x. +Move file on left +Flytt venstre fil -Cannot determine final path for %x. - +Move file on right +Flytt høyre fil -Cannot find system function %x. -Kan ikke finne systemfunksjonen %x. +Overwrite left item +Skriv over venstre element - -1 Byte -%x Bytes - - -1 Byte -%x Bytes - +Overwrite right item +Skriv over høyre element -%x MB -%x MB +Do nothing +Ikke gjør noe -%x KB -%x KB +Update attributes on left +Oppdater attributter til venstre -%x GB -%x GB +Update attributes on right +Oppdater attributter til høyre Database file %x is incompatible. Databasefil %x er inkompatibel. @@ -151,9 +262,6 @@ Database file is corrupt: Databasefilen er korrupt -Out of memory! -For lite minne! - Cannot write file %x. Kan ikke skrive fil %x. @@ -163,8 +271,8 @@ Database files do not share a common session. Databasefiler deler ikke en felles synkroniseringsøkt. -An exception occurred! -Et avvik har oppstått! +Searching for folder %x... +Søker etter mappen %x... Cannot read file attributes of %x. Kan ikke lese filattributter fra %x. @@ -187,6 +295,33 @@ Creating file %x Oppretter fil %x +Items processed: +Elementer behandlet: + +Items remaining: +Gjenværende elementer: + +Total time: +Total tid: + + +1 Byte +%x Bytes + + +1 Byte +%x Bytes + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Feil ved analysering av fil %x, rekke %y, kolonne %z. @@ -208,12 +343,18 @@ /sec /sekund -File %x does not contain a valid configuration. -Filen %x inneholder en ugyldig innstilling. - Configuration file %x loaded partially only. Innstillingsfilen %x bare delvis lastet. +Show in Explorer +Vis i utforsker + +Open with default application +Åpne med standardprogram + +Browse directory +Utforsk mappe + Cannot access Volume Shadow Copy Service. Kan ikke få adgang til Volume Shadow Copy Service. @@ -223,18 +364,18 @@ Cannot load file %x. Kan ikke laste filen %x. -Path %x does not contain a volume name. -Banen %x inneholder ikke et volumnavn. +Volume name %x not part of file name %y. +Volumnavn %x ikke del av filnavn %y. + +Abort requested: Waiting for current operation to finish... +Handling avbrutt: Venter på at nåværende handling fullføres... -Volume name %x not part of file name %y! -Volumnavn %x ikke del av filnavn %y! +Failure to create timestamp for versioning: +Feil ved opprettelse av tidsstempel for versjon: Cannot read the following XML elements: Kan ikke lese følgende XML-elementer: -Cannot find file %x. -Kan ikke finne filen %x. - &Open... &Åpne... @@ -259,97 +400,196 @@ Usage: Bruk: -1. Select folders to watch. -1. Velg mapper å overvåke. +1. Select folders to watch. +1. Velg mapper å overvåke. + +2. Enter a command line. +2. Skriv en kommandolinje. + +3. Press 'Start'. +3. Trykk 'Start'. + +To get started just import a .ffs_batch file. +Importer en .ffs_batch-fil for å komme i gang + +Folders to watch +Mapper å overvåke + +Add folder +Legg til mappe + +Remove folder +Fjern mappe + +Browse +Bla gjennom + +Select a folder +Velg en mappe + +Idle time [seconds] +Inaktiv tid [sekunder] + +Idle time between last detected change and execution of command +Inaktiv tid mellom forrige endring og utførelse av kommando + +Command line +Kommandolinje + + +The command is triggered if: +- files or subfolders change +- new folders arrive (e.g. USB stick insert) + + +Kommandoen utløses hvis: +- filer eller mapper endres +- nye mapper legges til (f.eks. en USB-pinne kobles til) + + +Start +Start + +&Retry +&Prøv igjen + +Cancel +Avbryt + +RealtimeSync - Automated Synchronization +RealtimeSync - Automatisk synkronisering + +Warning +Advarsel + +Build: %x +Build: %x + +About +Om + +All files +Alle filer + +&Restore +&Gjenopprett + +&Exit +&Avslutt + +Waiting for missing directories... +Venter på manglende mapper... + +Invalid command line: +Ugyldig kommando: + +File content +Filinnhold + +File time and size +Filtid og størrelse + + Two way + Toveis + +Mirror +Speile + +Update +Oppdatere + +Custom +Brukerdefinert + +Multiple... +Flere... + +Moving file %x to %y +Flytter fil %x til %y + +Moving folder %x to %y +Flytter mappe %x til %y -2. Enter a command line. -2. Skriv en kommandolinje. +Moving symbolic link %x to %y +Flytter symbolsk lenke %x til %y -3. Press 'Start'. -3. Trykk 'Start'. +Removing old versions... +Fjerner gamle versjoner... -To get started just import a .ffs_batch file. -Importer en .ffs_batch-fil for å komme i gang +Creating symbolic link %x +Oppretter symbolsk lenke %x -Folders to watch -Mapper å overvåke +Creating folder %x +Oppretter mappe %x -Add folder -Legg til mappe +Overwriting file %x +Overskriver fil %x -Remove folder -Fjern mappe +Overwriting symbolic link %x +Overskriver symbolsk lenke %x -Browse -Bla gjennom +Verifying file %x +Verifiserer fil %x -Select a folder -Velg en mappe +Updating attributes of %x +Oppdaterer attributter til %x -Idle time [seconds] -Inaktiv tid [sekunder] +Cannot find %x. +Kan ikke finne %x. -Idle time between last detected change and execution of command -Inaktiv tid mellom forrige endring og utførelse av kommando +Target folder %x already existing. +Målmappe %x eksisterer allerede. -Command line -Kommandolinje +Target folder input field must not be empty. +Feltet for målmappe kan ikke være tomt. - -The command is triggered if: -- files or subfolders change -- new folders arrive (e.g. USB stick insert) - - -Kommandoen utløses hvis: -- filer eller mapper endres -- nye mapper legges til (f.eks. en USB-pinne kobles til) - +Folder input field for versioning must not be empty. +Mappefeltet for versjon kan ikke være tomt. -Start -Start +Source folder %x not found. +Kildemappe %x finnes ikke. -&Retry -&Prøv igjen +The following items have unresolved conflicts and will not be synchronized: +De følgende elementene har uoppklarte konflikter og vil ikke bli synkroniserte: -Cancel -Avbryt +Significant difference detected: +Betydelig forskjell oppdaget: -Build: %x -Build: %x +More than 50% of the total number of files will be copied or deleted. +Mer enn 50% av det totale antall filer blir kopiert eller slettet. -All files -Alle filer +Not enough free disk space available in: +Ikke nok ledig diskplass tilgjengelig på: -&Restore -&Gjenopprett +Required: +Nødvendig: -&Exit -&Avslutt +Available: +Tilgjengelig: -Monitoring active... -Overvåkning aktiv... +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +En mappe vil endres som er en del av flere mappepar. Se over innstillingene for synkronisering. -Waiting for missing directories... -Venter på manglende mapper... +Synchronizing folder pair: +Synkroniserer mappepar: -A folder input field is empty. -Et mappefelt er tomt. +Generating database... +Oppretter database... -Synchronization aborted! -Synkronisering avbrutt! +Synchronization aborted +Synkronisering avbrutt -Synchronization completed with errors! -Synkronisering fullført med feil! +Synchronization completed with errors +Synkronisering fullført med feil -Synchronization completed with warnings. -Synkronisering fullført med advarsler. +Synchronization completed with warnings +Synkronisering fullført med advarsler -Nothing to synchronize! -Ikke noe å synkronisere! +Nothing to synchronize +Ikke noe å synkronisere -Synchronization completed successfully. -Synkdonisering fullført. +Synchronization completed successfully +Synkdonisering fullført Saving log file %x... Lagrer loggfil %x... @@ -357,38 +597,26 @@ Kommandoen utløses hvis: Press "Switch" to resolve issues in FreeFileSync main dialog. Trykk "Skift" for å løse problemer i FreeFileSync hovedvindu. -Switching to FreeFileSync main dialog... -Endrer til FreeFileSync hovedvindu... - A new version of FreeFileSync is available: En ny versjon av FreeFileSync er tilgjengelig Download now? Laste ned nå? -FreeFileSync is up to date! -FreeFileSync er oppdatert! +FreeFileSync is up to date. +FreeFileSync er oppdatert. Information Informasjon -Unable to connect to sourceforge.net! -Kan ikke koble til sourceforge.net! - -Current FreeFileSync version number was not found online! Do you want to check manually? -Nyeste FreeFileSyncversjon ble ikke funnet online! Vil du sjekke manuelt? - -Do you want FreeFileSync to automatically check for updates every week? -Skal FreeFileSync automatisk se etter oppdateringer hver uke? - -(Requires an Internet connection!) -(Krever en internettforbindelse!) +Unable to connect to sourceforge.net. +Kan ikke koble til sourceforge.net. - - +Symlink +Symbolsk lenke - - +Folder +Mappe Full path Full bane @@ -411,12 +639,6 @@ Kommandoen utløses hvis: Extension Filendelse -Size: -Størrelse: - -Date: -Dato: - Category Kategori @@ -441,6 +663,30 @@ Kommandoen utløses hvis: Hibernate Sett i dvalemodus +Selected variant: +Valgt variant: + +Select alternate comparison settings +Velg alternative innstillinger for sammenligning + +Select alternate synchronization settings +Velg alternative innstillinger for synkronisering + +Filter is active +Filter er aktivt + +No filter selected +Ingen filter valgt + +Remove alternate settings +Fjern alternative innstillinger + +Clear filter settings +Fjern filterinnstillinger + +Copy +Kopier + &New &Ny @@ -459,27 +705,21 @@ Kommandoen utløses hvis: &Language &Språk -&Global settings... -&Felles innstillinger... - &Export file list... &Eksporter filliste... -&Advanced -&Avansert - -&Check now - - -Check &automatically once a week - - -Check for new version - +&Global settings... +&Felles innstillinger... Compare Sammenlign +Comparison settings +Innstillinger for sammenligning + +Synchronization settings +Innstillinger for synkronisering + Synchronize Synkroniser @@ -492,6 +732,9 @@ Kommandoen utløses hvis: Swap sides Bytt sider +Save as batch job +Lagre som sammensatt oppgave + Hide excluded items Skjul ekskluderte elementer @@ -534,54 +777,6 @@ Kommandoen utløses hvis: &Pause &Pause -Batch job -Batch-jobb - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Lag en batch-fil for å automatisere synkronisering. Dobbelklikk denne filen eller legg til i ditt systems planlegger: FreFileSync.exe .ffs_batch - -Help -Hjelp - -Error handling -Feilhåndtering - -Ignore -Ignorer - -Hide all error and warning messages -Skjul feilmeldinger og advarsler - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Vis pop-upvindu ved feil eller advarsler - -Exit -Avslutt - -Abort synchronization on first error -Stopp synkronisering ved første feil - -Show progress dialog -Vis statuslinje - -Save log -Lagre logg - -Select folder to save log files -Velg mappe for lagring av loggfiler - -Limit -Grense - -Limit maximum number of log files -Begrens maks antall loggfiler - -Select variant -Velg variant - Files are found equal if - last write time and date @@ -595,9 +790,6 @@ Filer blir funnet like hvis er den samme -File time and size -Filtid og størrelse - Files are found equal if - file content @@ -609,39 +801,39 @@ Filer blir funnet like hvis er det samme -File content -Filinnhold - Symbolic Link handling Symbolsk lenkehåndtering +Help +Hjelp + OK OK -<- Two way -> -<- Toveis -> - -Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. - - -Mirror ->> -Speile ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Speilings-sikkerhetskopi av venstre mappe. Høyre mappe endres slik at den blir helt lik venstre mappe etter synkronisering. -Update -> -Oppdatere -> - Copy new or updated files to right folder. Kopier nye og endrede filer til høyre mappe. -Custom -Brukerdefinert - Configure your own synchronization rules. Still inn dine egne synkroniseringsregler. +Error handling +Feilhåndtering + +Ignore +Ignorer + +Hide all error and warning messages +Skjul feilmeldinger og advarsler + +Pop-up +Pop-up + +Show pop-up on errors or warnings +Vis pop-upvindu ved feil eller advarsler + Deletion handling Slette-håndtering @@ -660,29 +852,35 @@ er det samme Versioning Versjonshåndtering -Move files to user-defined folder - - Naming convention: Navnekonvensjon: -Item exists on left side only -Element eksisterer kun på venstre side +Batch job +Batch-jobb -Item exists on right side only -Element eksisterer kun på høyre side +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Lag en batch-fil for å automatisere synkronisering. Dobbelklikk denne filen eller legg til i ditt systems planlegger: FreFileSync.exe .ffs_batch -Left side is newer -Venstre side er nyere +Exit +Avslutt + +Abort synchronization on first error +Stopp synkronisering ved første feil + +Show progress dialog +Vis statuslinje + +Save log +Lagre logg -Right side is newer -Høyre side er nyere +Select folder to save log files +Velg mappe for lagring av loggfiler -Items have different content -Elementer har forskjellig innhold +Limit +Grense -Conflict/item cannot be categorized -Konflikt/element kan ikke kategoriseres +Limit maximum number of log files +Begrens maks antall loggfiler Source code written in C++ using: Kildekode skrevet i C++ med hjelp fra: @@ -702,9 +900,6 @@ er det samme Homepage Hjemmeside -FreeFileSync at Sourceforge -FreeFileSync på Sourceforge - Email E-post @@ -719,11 +914,11 @@ er det samme Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Synkroniserer kun filer som passer til alle filterinnstillinger. -Merk: Filnavn må være relative til basismapper! +Merk: Filnavn må være relative til basismapper. Include @@ -744,8 +939,8 @@ Merk: Filnavn må være relative til basismapper! Maximum Maksimum -&Clear - +Global settings +Globale innstillinger Fail-safe file copy Trygg filkopi @@ -777,9 +972,6 @@ Merk: Filnavn må være relative til basismapper! &Default &Standard -Start synchronization -Start synkronisering - Variant Variant @@ -798,6 +990,21 @@ Merk: Filnavn må være relative til basismapper! &Find next &Søk neste +Delete +Slett + +Configure filter +Still inn filter + +Start synchronization +Start synkronisering + +Find +Søk + +Select time span +Velg tidsrom + Folder pairs Mappepar @@ -843,12 +1050,6 @@ Merk: Filnavn må være relative til basismapper! %x filer - -%y of 1 row in view -%y of %x rows in view - - - Set direction: Still inn retningen: @@ -861,11 +1062,8 @@ Merk: Filnavn må være relative til basismapper! Exclude via filter: Ekskluder via filter: - - - -Delete -Slett +multiple selection +flervalg Include all Inkluder alle @@ -894,14 +1092,14 @@ Merk: Filnavn må være relative til basismapper! Show "%x" Vis "%x" - - +Last session +Siste økt Folder Comparison and Synchronization Mappesammenligning og synkronisering -Configuration saved! -Innstilling lagret! +Configuration saved +Innstilling lagret FreeFileSync batch FreeFileSync batch @@ -915,9 +1113,6 @@ Merk: Filnavn må være relative til basismapper! Never save changes Aldri lagre endringer -Configuration loaded! -Innstilling lastet! - Show files that exist on left side only Vis filer som bare finnes på venstre side @@ -963,20 +1158,17 @@ Merk: Filnavn må være relative til basismapper! Set as default Set som standard -Operation aborted! -Handling avbrutt! +Operation aborted +Handling avbrutt -All folders are in sync! -Alle mapper er synkroniserte! +All folders are in sync +Alle mapper er synkroniserte Comma separated list Komma-separert liste -File list exported! -Filliste eksportert! - -Searching for program updates... - +File list exported +Filliste eksportert Ignore further errors Ignorer ytterligere feil @@ -984,8 +1176,8 @@ Merk: Filnavn må være relative til basismapper! &Ignore &Ignorer -Don't show this warning again - +Fatal Error +Fatal feil &Switch &Skift @@ -1005,6 +1197,9 @@ Merk: Filnavn må være relative til basismapper! Comparing content... Sammenligner innhold... +Info +Info + Paused Pauset @@ -1059,18 +1254,6 @@ Merk: Filnavn må være relative til basismapper! Filter Filter - -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? - - - - -Do you really want to delete the following item? -Do you really want to delete the following %x items? - - - Direct Direkte @@ -1107,9 +1290,6 @@ Merk: Filnavn må være relative til basismapper! Move files and replace if existing Flytt filer og erstatt hvis eksisterer -Time stamp - - Append a timestamp to each file name Legg til et tidsstempel til hvert filnavn @@ -1125,9 +1305,6 @@ Merk: Filnavn må være relative til basismapper! Files Filer -Items - - Percentage Prosent @@ -1170,8 +1347,8 @@ Merk: Filnavn må være relative til basismapper! Cannot create directory %x. Kan ikke opprette mappen %x. -Cannot create symbolic link %x. - +Cannot find system function %x. +Kan ikke finne systemfunksjonen %x. Cannot copy file %x to %y. Kan ikke kopiere filen %x til %y. @@ -1179,15 +1356,15 @@ Merk: Filnavn må være relative til basismapper! Type of item %x is not supported: Type element %x er ikke støttet: +Cannot resolve symbolic link %x. +Kan ikke følge symbolsk lenke %x. + Cannot open directory %x. Kan ikke åpne mappe %x. Cannot enumerate directory %x. Kan ikke gjennomgå mappe %x. -Detected endless directory recursion. -Fant uendelig dyp mappestruktur (lenker til mapper høyere opp i strukturen) - %x TB %x TB @@ -1230,201 +1407,9 @@ Merk: Filnavn må være relative til basismapper! Cannot change process I/O priorities. Kan ikke endre I/O prioriet på prosess -Unable to move %x to the Recycle Bin! -Ikke i stand til å flytte %x til papirkurven! - -Both sides have changed since last synchronization! -Begge sider er endret siden siste synkronisering! - -Cannot determine sync-direction: -Kan ikke bestemme synkroniseringsretning: - -No change since last synchronization! -Ingen endringer siden siste synkronisering! - -The corresponding database entries are not in sync considering current settings. -De tilsvarende databaseoppføringene er ikke synkroniserte i forhold til innstillingene. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Stiller inn standard synkroniseringsretning: Gamle filer blir overskrevet med nyere filer. - -Checking recycle bin availability for folder %x... -Sjekker søppelbøtte for tilgjengelig mappe %x... - -Moving file %x to recycle bin -Flytter fil %x til papirkurv - -Moving folder %x to recycle bin -Flytter mappe %x til papirkurv - -Moving symbolic link %x to recycle bin -Flytter symbolsk lenke %x til papirkurv - -Deleting file %x -Sletter fil %x - -Deleting folder %x -Sletter mappe %x - -Deleting symbolic link %x -Sletter symbolsk lenke %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Papirkurv er ikke tilgjengelig for de følgende baner! Filer blir isteden slettet permanent: - -The corresponding folder will be considered as empty. - - -Cannot find the following folders: -Kan ikke finne følgende mapper: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. - - -Directories are dependent! Be careful when setting up synchronization rules: -Mapper er avhengige av hverandre! Vær forsiktig når du setter opp synkroniseringsregler: - -Conflict detected: -Konflikt oppdaget: - -File %x has an invalid date! -Filen %x har en ugyldig dato! - -Files %x have the same date but a different size! -Filer %x har den samme datoen, men forskjellig størrelse! - -Items differ in attributes only -Elementer har kun forskjellige attributter - -Resolving symbolic link %x - - -Comparing content of files %x -Sammenligner innhold til filer %x - -Generating file list... -Lager filliste... - -Start comparison -Start sammenligning - -Calculating sync directions... - - -Both sides are equal -Begge sider er like - -Copy new item to left -Kopier nytt element til venstre - -Copy new item to right -Kopier nytt element til høyre - -Delete left item -Slett venstre element - -Delete right item -Slett høyre element - -Move file on left -Flytt venstre fil - -Move file on right -Flytt høyre fil - -Overwrite left item -Skriv over venstre element - -Overwrite right item -Skriv over høyre element - -Do nothing -Ikke gjør noe - -Update attributes on left -Oppdater attributter til venstre - -Update attributes on right -Oppdater attributter til høyre - -Multiple... -Flere... - -Moving file %x to %y -Flytter fil %x til %y - -Moving folder %x to %y -Flytter mappe %x til %y - -Moving symbolic link %x to %y -Flytter symbolsk lenke %x til %y - -Removing old versions... -Fjerner gamle versjoner... - -Creating symbolic link %x -Oppretter symbolsk lenke %x - -Creating folder %x -Oppretter mappe %x - -Overwriting file %x -Overskriver fil %x - -Overwriting symbolic link %x -Overskriver symbolsk lenke %x - -Verifying file %x -Verifiserer fil %x - -Updating attributes of %x -Oppdaterer attributter til %x - -Cannot find %x. -Kan ikke finne %x. - -Target folder %x already existing. -Målmappe %x eksisterer allerede. - -Target folder input field must not be empty. -Feltet for målmappe kan ikke være tomt. - -Folder input field for versioning must not be empty. -Mappefeltet for versjon kan ikke være tomt. - -Source folder %x not found. -Kildemappe %x finnes ikke. - -The following items have unresolved conflicts and will not be synchronized: -De følgende elementene har uoppklarte konflikter og vil ikke bli synkroniserte: - -Significant difference detected: -Betydelig forskjell oppdaget: - -More than 50% of the total number of files will be copied or deleted! -Mer enn 50% av det totale antall filer blir kopiert eller slettet! - -Not enough free disk space available in: -Ikke nok ledig diskplass tilgjengelig på: - -Required: -Nødvendig: - -Available: -Tilgjengelig: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -En mappe vil endres som er en del av flere mappepar. Se over innstillingene for synkronisering. - -Synchronizing folder pair: -Synkroniserer mappepar: +Unable to move %x to the Recycle Bin. +Ikke i stand til å flytte %x til papirkurven. -Generating database... -Oppretter database... - -Creating Volume Shadow Copy for %x... - - -Data verification error: Source and target file have different content! -Dataverifiseringsfeil: Kilde- og målfil har forskjellig innhold! +Error Code %x: +Feil kode %x: diff --git a/BUILD/Languages/polish.lng b/BUILD/Languages/polish.lng index 0906761a..78b97d59 100644 --- a/BUILD/Languages/polish.lng +++ b/BUILD/Languages/polish.lng @@ -1,138 +1,167 @@
- Polski + Polski Wojciech Pietruszewski pl_PL - poland.png - 3 - n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2 + flag_poland.png + 3 + n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2
-Searching for folder %x... -Wyszukiwanie katalogu %x... +Retrying operation after error: + -Items processed: -Przetworzone elementy: +Both sides have changed since last synchronization. +Obie strony uległy zmianie od ostatniej synchronizacji. -Items remaining: -Pozostałe elementy: +Cannot determine sync-direction: +Nie można określić kierunku synchronizacji: -Total time: -Całkowity czas: +No change since last synchronization. +Brak zmian od ostatniej synchronizacji. -Cannot set directory lock for %x. -Nie można utworzyć blokady dla katalogu %x. +The database entry is not in sync considering current settings. +Baza danych nie jest spójna z aktualnymi ustawieniami. -Show in Explorer -Wyświetl w Eksploratorze +Setting default synchronization directions: Old files will be overwritten with newer files. +Ustawianie domyślnego kierunku synchronizacji: Stare pliki zostaną nadpisane nowszymi. -Open with default application -Otwórz za pomocą domyślnej aplikacji +Checking recycle bin availability for folder %x... +Sprawdzanie dostępności kosza dla katalogu %x... -Browse directory -Przeglądaj katalog +Moving file %x to recycle bin +Przenoszenie pliku %x do kosza -Abort requested: Waiting for current operation to finish... -Żądanie przerwania: Oczekiwanie na koniec aktualnie wykonywanego zadania... +Moving folder %x to recycle bin +Przenoszenie katalogu %x do kosza -Failure to create timestamp for versioning: -Nie można utworzyć sygnatury czasu na potrzeby wersjonowania: +Moving symbolic link %x to recycle bin +Przenoszenie dowiązania symbolicznego %x do kosza -RealtimeSync - Automated Synchronization -RealtimeSync - Automatyczna Synchronizacja +Deleting file %x +Usuwanie pliku %x + +Deleting folder %x +Usuwanie folderu %x + +Deleting symbolic link %x +Usuwanie dowiązania symbolicznego %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Kosz systemowy nie jest dostępny dla podanych katalogów. Katalogi zostaną usunięte permanentnie: + +An exception occurred +Wystąpił wyjątek + +Cannot find file %x. +Nie można znaleźć pliku %x. Error Błąd -Selected variant: -Określ wariant: +File %x does not contain a valid configuration. +Plik %x nie zawiera prawidłowej konfiguracji -Select alternate comparison settings -Określ alternatywne ustawienia porównywania +A folder input field is empty. +Pole katalog źródłowy jest puste. -Select alternate synchronization settings -Określ alternatywne reguły synchronizacji +The corresponding folder will be considered as empty. +Katalog będzie oznaczony jako pusty. -Filter is active -Filtr jest aktywny +Cannot find the following folders: +Nie można znaleźć następujących katalogów: -No filter selected -Nie wybrano żadnego filtra +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Możesz zignorować ten błąd aby uznając katalogi jako puste. Katalog zostanie utworzony automatycznie podczas synchronizacji. -Remove alternate settings -Usuń alternatywne ustawienia +The following folders have dependent paths. Be careful when setting up synchronization rules: +Podane katalogi mają zależne ścieżki. Bądź ostrożny podczas ustawiania reguł synchronizacji: -Clear filter settings -Wyczyść ustawienia filtra +File %x has an invalid date. +Plik %x ma nieprawidłową datę. -Copy -Kopiuj +Date: +Data: -Paste -Wklej +Files %x have the same date but a different size. +Pliki %x mają tą samą datę lecz różne rozmiary. -Save as batch job -Zapisz w trybie wsadowym +Size: +Rozmiar: -Comparison settings -Ustawienia porównywania +Items differ in attributes only +Elementy różnią się wyłącznie atrybutami -Synchronization settings -Ustawienia synchronizacji +Resolving symbolic link %x +Rozwiązywanie dowiązania symbolicznego %x -About -O Programie +Comparing content of files %x +Porównywanie zawartości plików %x -Confirm -Potwierdź +Generating file list... +Generowanie listy plików... -Configure filter -Konfiguruj filtr +Starting comparison +Kompresowanie -Global settings -Ustawienia programu +Calculating sync directions... +Obliczanie kierunków synchronizacji... -Find -Znajdź +Out of memory. +Brak wolnej pamięci. -Select time span -Określ przedział czasowy +Item exists on left side only +Element istnieje tylko po lewej stronie -Invalid command line: -Nieprawidłowa komenda: +Item exists on right side only +Element istnieje tylko po prawej stronie -Info -Info +Left side is newer +Lewa strona jest nowsza -Warning -Ostrzeżenie +Right side is newer +Prawa strona jest nowsza -Fatal Error -Błąd krytyczny +Items have different content +Elementy różnią się zawartością -Error Code %x: -Kod błędu %x: +Both sides are equal +Obie strony są równe -Cannot resolve symbolic link %x. -Nie można określić położenia dowiązania symbolicznego %x. +Conflict/item cannot be categorized +Konflikt/element nie może zostać skategoryzowany - -1 Byte -%x Bytes - - -1 Bajt -%x Bajty -%x Bajtów - +Copy new item to left +Kopiuj nowy element na lewą stronę -%x MB -%x MB +Copy new item to right +Kopiuj nowy element na prawą stronę -%x KB -%x KB +Delete left item +Usuń lewy element -%x GB -%x GB +Delete right item +Usuń prawy element + +Move file on left +Przenieś plik na lewą stronę + +Move file on right +Przenieś plik na prawą stronę + +Overwrite left item +Nadpisz lewy element + +Overwrite right item +Nadpisz prawy element + +Do nothing +Nie rób nic + +Update attributes on left +Aktualizuj atrybuty po lewej stronie + +Update attributes on right +Aktualizuj atrybuty po prawej stronie Database file %x is incompatible. Plik bazy danych %x nie jest kompatybilny. @@ -146,9 +175,6 @@ Database file is corrupt: Plik bazy danych jest uszkodzony: -Out of memory! -Brak wolnej pamięci! - Cannot write file %x. Nie można zapisać pliku %x. @@ -158,8 +184,8 @@ Database files do not share a common session. Pliki bazy danych nie współdzielą sesji. -An exception occurred! -Wystąpił wyjątek! +Searching for folder %x... +Wyszukiwanie katalogu %x... Cannot read file attributes of %x. Nie można odczytać atrybutów pliku %x. @@ -183,9 +209,40 @@ Creating file %x Tworzenie pliku %x +Items processed: +Przetworzone elementy: + +Items remaining: +Pozostałe elementy: + +Total time: +Całkowity czas: + + +1 Byte +%x Bytes + + +1 Bajt +%x Bajty +%x Bajtów + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Błąd podczas parsowania pliku %x, rząd %y, kolumna %z. +Cannot set directory lock for %x. +Nie można utworzyć blokady dla katalogu %x. + Scanning: Skanowanie: @@ -205,12 +262,18 @@ /sec /sekundę -File %x does not contain a valid configuration. -Plik %x nie zawiera prawidłowej konfiguracji - Configuration file %x loaded partially only. Plik konfiguracyjny %x został wczytany tylko częściowo. +Show in Explorer +Wyświetl w Eksploratorze + +Open with default application +Otwórz za pomocą domyślnej aplikacji + +Browse directory +Przeglądaj katalog + Cannot access Volume Shadow Copy Service. Nie można uzyskać dostępu do usługi Volume Shadow Copy. @@ -220,18 +283,21 @@ Cannot load file %x. Nie można wczytać pliku %x. -Path %x does not contain a volume name. -Ścieżka %x nie zawiera poprawnej etykiety dysku. +Cannot determine volume name for %x. +Nie można określić nazwy dysku dla %x. -Volume name %x not part of file name %y! -Dysk %x nie jest częścią pliku %y! +Volume name %x not part of file name %y. +Dysk %x nie jest częścią pliku %y. + +Abort requested: Waiting for current operation to finish... +Żądanie przerwania: Oczekiwanie na koniec aktualnie wykonywanego zadania... + +Failure to create timestamp for versioning: +Nie można utworzyć sygnatury czasu na potrzeby wersjonowania: Cannot read the following XML elements: Nie można odczytać elementu XML: -Cannot find file %x. -Nie można znaleźć pliku %x. - &Open... &Otwórz... @@ -312,9 +378,18 @@ Komenda jest wykonywana gdy: Cancel Anuluj +RealtimeSync - Automated Synchronization +RealtimeSync - Automatyczna Synchronizacja + +Warning +Ostrzeżenie + Build: %x Zbudowano: %x +About +O Programie + All files Wszystkie pliki @@ -324,29 +399,125 @@ Komenda jest wykonywana gdy: &Exit &Wyjście -Monitoring active... -Monitorowanie aktywne... - Waiting for missing directories... Oczekiwanie na brakujące katalogi... -A folder input field is empty. -Pole katalog źródłowy jest puste. +Invalid command line: +Nieprawidłowa komenda: + +File content +Zawartość pliku + +File time and size +Czas modyfikacji i rozmiar + + Two way + Obustronna + +Mirror +Lustrzana + +Update +Uaktualnij + +Custom +Własne + +Multiple... +Wiele... + +Moving file %x to %y +Przenoszenie pliku %x do %y + +Moving folder %x to %y +Przenoszenie katalogu %x do %y + +Moving symbolic link %x to %y +Przenoszenie dowiązania symbolicznego %x do %y + +Removing old versions... +Usuwanie starszych wersji... + +Creating symbolic link %x +Tworzenie dowiązania symbolicznego %x + +Creating folder %x +Tworzenie folderu %x + +Overwriting file %x +Nadpisywanie pliku %x + +Overwriting symbolic link %x +Nadpisywanie dowiązania symbolicznego %x + +Verifying file %x +Weryfikowanie pliku %x + +Updating attributes of %x +Aktualizowanie atrybutów %x + +Cannot find %x. +Nie można znaleźć %x. + +Target folder %x already existing. +Katalog docelowy %x już istnieje. + +Target folder input field must not be empty. +Pole katalog docelowy nie może być puste. -Synchronization aborted! -Synchronizacja przerwana! +Folder input field for versioning must not be empty. +Określ katalog do przechowywania wersjonowanych plików. + +Source folder %x not found. +Nie znaleziono katalogu docelowego %x. + +The following items have unresolved conflicts and will not be synchronized: +Te elementy znajdują się w konflikcie, którego nie można rozwiązać. Pliki nie zostaną zsynchronizowane: + +Significant difference detected: +Wykryto znaczące zmiany: + +More than 50% of the total number of files will be copied or deleted. +Ponad 50% plików zostanie skopiowanych lub usuniętych. + +Not enough free disk space available in: +Brak wystarczającej przestrzeni dyskowej na: -Synchronization completed with errors! -Synchronizacja zakończona z błędami! +Required: +Wymagane: + +Available: +Dostępne: -Synchronization completed with warnings. -Synchronizacja zakończona z ostrzeżeniami! +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Katalog zostanie zmodyfikowany w związku z synchronizacją wielu katalogów. Zweryfikuj ustawienia synchronizacji. -Nothing to synchronize! -Brak plików do synchronizacji! +Synchronizing folder pair: +Synchronizacja katalgów: + +Generating database... +Generowanie bazy danych... + +Creating Volume Shadow Copy for %x... +Tworzenie Volume Shadow Copy dla %x... -Synchronization completed successfully. -Synchronizacja zakończona pomyślnie. +Data verification error: %x and %y have different content. +Nastąpił błąd weryfikacji: %x oraz %y różnią się zawartością. + +Synchronization aborted +Synchronizacja przerwana + +Synchronization completed with errors +Synchronizacja zakończona z błędami + +Synchronization completed with warnings +Synchronizacja zakończona z ostrzeżeniami + +Nothing to synchronize +Brak plików do synchronizacji + +Synchronization completed successfully +Synchronizacja zakończona pomyślnie Saving log file %x... Zapisywanie pliku logów %x... @@ -354,8 +525,8 @@ Komenda jest wykonywana gdy: Press "Switch" to resolve issues in FreeFileSync main dialog. Kliknij "Przełącz" aby rozwiązać wszystkie problemy w głównym oknie FreeFileSync. -Switching to FreeFileSync main dialog... -Przełączanie do głównego okna FreeFileSync... +Switching to FreeFileSync main dialog +Przełączanie do głównego okna FreeFileSync A new version of FreeFileSync is available: Dostępna jest nowa wersja FreeFileSync: @@ -363,29 +534,29 @@ Komenda jest wykonywana gdy: Download now? Pobrać teraz? -FreeFileSync is up to date! -Posiadasz aktualną wersję FreeFileSync! +New version found +Dostępna jest nowa wersja programu -Information -Informacja +&Download +&Pobierz -Unable to connect to sourceforge.net! -Nie można się połączyć z sourceforge.net! +FreeFileSync is up to date. +Posiadasz aktualną wersję FreeFileSync. -Current FreeFileSync version number was not found online! Do you want to check manually? -Aktualna wersja FreeFileSync nie została znaleziona! Czy chcesz to sprawdzić ręcznie? +Information +Informacja -Do you want FreeFileSync to automatically check for updates every week? -Czy chcesz aby FreeFileSync sprawdzał aktualizacje co tydzień? +Unable to connect to sourceforge.net. +Nie można się połączyć z sourceforge.net. -(Requires an Internet connection!) -(Wymaga połączenia z Internetem!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Nie można znaleźć obecnej wersji FreeFileSync. Czy chcesz sprawdzić ręcznie? - - +Symlink +Dowiązanie symboliczne - - +Folder +Katalog Full path Pełna ścieżka @@ -408,18 +579,12 @@ Komenda jest wykonywana gdy: Extension Rozszerzenie -Size: -Rozmiar: - -Date: -Data: +Category +Kategoria Action Akcja -Category -Kategoria - Drag && drop Drag && Drop @@ -438,6 +603,33 @@ Komenda jest wykonywana gdy: Hibernate Przejdź w stan hibernacji +Selected variant: +Określ wariant: + +Select alternate comparison settings +Określ alternatywne ustawienia porównywania + +Select alternate synchronization settings +Określ alternatywne reguły synchronizacji + +Filter is active +Filtr jest aktywny + +No filter selected +Nie wybrano żadnego filtra + +Remove alternate settings +Usuń alternatywne ustawienia + +Clear filter settings +Wyczyść ustawienia filtra + +Copy +Kopiuj + +Paste +Wklej + &New &Nowy @@ -456,14 +648,14 @@ Komenda jest wykonywana gdy: &Language &Język -&Global settings... -&Ustawienia programu... - &Export file list... &Eksportuj listę plików... -&Advanced -&Zaawansowane +&Global settings... +&Ustawienia programu... + +&Tools +&Narzędzia &Check now Spra&wdź teraz @@ -471,12 +663,18 @@ Komenda jest wykonywana gdy: Check &automatically once a week Sprawdzaj &automatycznie raz w tygodniu -Check for new version -Sprawdź dostępność aktualizacji +Check for new &version +&Sprawdź aktualizacje Compare Porównaj +Comparison settings +Ustawienia porównywania + +Synchronization settings +Ustawienia synchronizacji + Synchronize Synchronizuj @@ -489,6 +687,9 @@ Komenda jest wykonywana gdy: Swap sides Zamień stronami +Save as batch job +Zapisz w trybie wsadowym + Hide excluded items Ukryj wykluczone elementy @@ -531,52 +732,7 @@ Komenda jest wykonywana gdy: &Pause &Pauza -Batch job -Plik wsadowy - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Utwórz plik wsadowy aby zautomatyzować proces synchronizacji. Kliknij dwa razy na ten plik lub dodaj go do menadżera zadań w Twoim systemie: FreeFileSync.exe .ffs_batch - -Help -Pomoc - -Error handling -Obsługa błędów - -Ignore -Ignoruj - -Hide all error and warning messages -Ukryj wszystkie informacje błędach i ostrzeżeniach - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Pokazuj okna pop-up dla błędów i ostrzeżeń - -Exit -Wyjście - -Abort synchronization on first error -Zakończ synchronizację przy pierwszym błędzie - -Show progress dialog -Pokaż okno postępu - -Save log -Zapisz logi - -Select folder to save log files -Określ katalog z logami - -Limit -Limit - -Limit maximum number of log files -Określ maksymalną liczbę plików z logami - -Select variant +Select a variant Określ wariant @@ -592,9 +748,6 @@ Pliki są równe jeżeli są równe -File time and size -Czas modyfikacji i rozmiar - Files are found equal if - file content @@ -606,39 +759,42 @@ Pliki są jednakowe jeżeli jest identyczna -File content -Zawartość pliku - Symbolic Link handling Obsługa dowiązań symbolicznych +Help +Pomoc + OK OK -<- Two way -> -<- Obustronna -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Wyszukaj oraz zastosuj zmiany po obu stronach. Wszystkie operacje na plikach takie jak usunięcia, zmiany oraz konflikty wykrywane są automatycznie przy użyciu bazy danych. -Mirror ->> -Lustrzana ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzaną kopią lewego folderu. -Update -> -Uaktualnij -> - Copy new or updated files to right folder. Kopiuj nowe lub aktualniejsze pliki na prawą stronę. -Custom -Własne - Configure your own synchronization rules. Skonfiguruj swoje własne reguły synchronizacji. +Error handling +Obsługa błędów + +Ignore +Ignoruj + +Hide all error and warning messages +Ukryj wszystkie informacje błędach i ostrzeżeniach + +Pop-up +Pop-up + +Show pop-up on errors or warnings +Pokazuj okna pop-up dla błędów i ostrzeżeń + Deletion handling Usuwanie @@ -663,23 +819,32 @@ jest identyczna Naming convention: Konwencja nazewnictwa: -Item exists on left side only -Element istnieje tylko po lewej stronie +Batch job +Plik wsadowy + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Utwórz plik wsadowy aby zautomatyzować proces synchronizacji. Kliknij dwa razy na ten plik lub dodaj go do menadżera zadań w Twoim systemie: FreeFileSync.exe .ffs_batch + +Exit +Wyjście + +Abort synchronization on first error +Zakończ synchronizację przy pierwszym błędzie -Item exists on right side only -Element istnieje tylko po prawej stronie +Show progress dialog +Pokaż okno postępu -Left side is newer -Lewa strona jest nowsza +Save log +Zapisz logi -Right side is newer -Prawa strona jest nowsza +Select folder to save log files +Określ katalog z logami -Items have different content -Elementy różnią się zawartością +Limit +Limit -Conflict/item cannot be categorized -Konflikt/element nie może zostać skategoryzowany +Limit maximum number of log files +Określ maksymalną liczbę plików z logami Source code written in C++ using: Kod stworzony w C++ z wykorzystaniem: @@ -699,9 +864,6 @@ jest identyczna Homepage Strona domowa -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge - Email Poczta @@ -716,7 +878,7 @@ jest identyczna Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Tylko pliki pasujące do wszystkich filtrów będą synchronizowane. @@ -744,6 +906,9 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe &Clear W&yczyść +Global settings +Ustawienia programu + Fail-safe file copy Bezpieczne kopiowanie @@ -774,9 +939,6 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe &Default &Domyślne -Start synchronization -Rozpocznij synchronizację - Variant Wariant @@ -795,8 +957,20 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe &Find next &Znajdź następny -Main bar -Główny pasek +Delete +Usuń + +Configure filter +Konfiguruj filtr + +Start synchronization +Rozpocznij synchronizację + +Find +Znajdź + +Select time span +Określ przedział czasowy Folder pairs Pary folderów @@ -807,6 +981,9 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Configuration Konfiguracja +Main bar +Główny pasek + Filter files Filtruj pliki @@ -864,11 +1041,8 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Exclude via filter: Dodaj filtr: - - - -Delete -Usuń +multiple selection +zaznaczone elementy Include all Zaznacz wszystko @@ -897,14 +1071,14 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Show "%x" Pokaż "%x" - - +Last session +Ostatnia sesja Folder Comparison and Synchronization Porównywanie i Synchronizacja folderów -Configuration saved! -Konfiguracja zapisana! +Configuration saved +Konfiguracja zapisana FreeFileSync batch Plik wsadowy FreeFileSync @@ -918,9 +1092,6 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Never save changes Nigdy nie zapisuj zmian -Configuration loaded! -Konfiguracja wczytana! - Show files that exist on left side only Pokaż pliki istniejące tylko po lewej stronie @@ -966,20 +1137,17 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Set as default Zapisz jako domyślne -Operation aborted! -Operacja przerwana! +Operation aborted +Operacja przerwana -All folders are in sync! -Wszystkie katalogi są zsynchronizowane! +All folders are in sync +Wszystkie katalogi są zsynchronizowane Comma separated list Lista oddzielona przecinkami -Legend -Legenda - -File list exported! -Lista plików wyeksportowana! +File list exported +Lista plików wyeksportowana Searching for program updates... Wyszukiwanie aktualizacji... @@ -990,6 +1158,9 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe &Ignore &Ignoruj +Fatal Error +Błąd krytyczny + Don't show this warning again Nie pokazuj więcej tego ostrzeżenia @@ -1011,6 +1182,9 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Comparing content... Porównywanie zawartości... +Info +Info + Paused Pauza @@ -1115,18 +1289,18 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Leave as unresolved conflict Zostaw jako nierozwiązany konflikt -Time stamp -Znacznik czasu - -Append a timestamp to each file name -Dołącz znacznik czasu do nazwy każdego pliku - Replace Zamień Move files and replace if existing Przenieś pliki i nadpisz jeżeli już istnieją +Time stamp +Znacznik czasu + +Append a timestamp to each file name +Dołącz znacznik czasu do nazwy każdego pliku + Folder Katalog @@ -1169,9 +1343,6 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Cannot write modification time of %x. Nie można zapisać czasu modyfikacji %x. -Cannot find system function %x. -Nie można odnaleźć funkcji systemowej %x. - Cannot read security context of %x. Nie można odczytać ustawień bezpieczeństwa %x. @@ -1187,8 +1358,11 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Cannot create directory %x. Nie można utworzyć katalogu %x. -Cannot copy symbolic link %x to %y. -Nie można skopiować dowiązania symbolicznego %x do %y. +Cannot create symbolic link %x. +Nie można utworzyć dowiązania symbolicznego dla %x. + +Cannot find system function %x. +Nie można odnaleźć funkcji systemowej %x. Cannot copy file %x to %y. Nie można skopiować pliku %x do %y. @@ -1196,15 +1370,15 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Type of item %x is not supported: Element typu %x nie jest wspierany: +Cannot resolve symbolic link %x. +Nie można określić położenia dowiązania symbolicznego %x. + Cannot open directory %x. Nie można otworzyć katalogu %x. Cannot enumerate directory %x. Nie można wyliczyć katalogu %x. -Detected endless directory recursion. -Wykryto nieskończoną pętlę katalogów - %x TB %x TB @@ -1241,6 +1415,9 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe %x dni +Failed to register to receive system messages. +Błąd podczas rejestracji odbioru komunikatów systemowych. + Cannot set privilege %x. Nie można ustawić uprawnień %x. @@ -1250,204 +1427,12 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe Cannot change process I/O priorities. Nie można zmienić priorytetu I/O procesu. -Unable to move %x to the Recycle Bin! -Nie można przenieść %x do kosza! - -Both sides have changed since last synchronization! -Obie strony uległy zmianie od ostatniej synchronizacji! - -Cannot determine sync-direction: -Nie można określić kierunku synchronizacji: - -No change since last synchronization! -Brak zmian od ostatniej synchronizacji! - -The corresponding database entries are not in sync considering current settings. -Zgodnie z obecnymi ustawieniami, poszczególne wpisy w bazie danych nie są zsynchronizowane. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Ustawianie domyślnego kierunku synchronizacji: Stare pliki zostaną nadpisane nowszymi. - -Checking recycle bin availability for folder %x... -Sprawdzanie dostępności kosza dla katalogu %x... - -Moving file %x to recycle bin -Przenoszenie pliku %x do kosza - -Moving folder %x to recycle bin -Przenoszenie katalogu %x do kosza - -Moving symbolic link %x to recycle bin -Przenoszenie dowiązania symbolicznego %x do kosza - -Deleting file %x -Usuwanie pliku %x - -Deleting folder %x -Usuwanie folderu %x - -Deleting symbolic link %x -Usuwanie dowiązania symbolicznego %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Kosz nie jest dostępny dla określonych ścieżek! Pliki zostaną nieodwracalnie usuniętę: - -The corresponding folder will be considered as empty. -Katalog będzie oznaczony jako pusty. - -Cannot find the following folders: -Nie można znaleźć następujących katalogów: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Możesz zignorować ten błąd aby uznając katalogi jako puste. Katalog zostanie utworzony automatycznie podczas synchronizacji. - -Directories are dependent! Be careful when setting up synchronization rules: -Katalogi są zależne! Pamiętaj o tym podczas ustawiania zasad synchronizacji: - -Start comparison -Rozpocznij porównywanie - -Calculating sync directions... -Obliczanie kierunków synchronizacji... - -Conflict detected: -Wykryto konflikt: - -File %x has an invalid date! -Plik %x ma nieprawidłową datę! - -Files %x have the same date but a different size! -Pliki %x mają tą samą datę lecz różne rozmiary! - -Items differ in attributes only -Elementy różnią się wyłącznie atrybutami - -Symbolic links %x have the same date but a different target. -Dowiązania symboliczne %x mają tą samą datę, ale różne źródła. - -Comparing content of files %x -Porównywanie zawartości plików %x - -Comparing files by content failed. -Porównywanie przez zawartość zakończone niepowodzeniem. - -Generating file list... -Generowanie listy plików... - -Both sides are equal -Obie strony są równe - -Copy new item to left -Kopiuj nowy element na lewą stronę - -Copy new item to right -Kopiuj nowy element na prawą stronę - -Delete left item -Usuń lewy element - -Delete right item -Usuń prawy element - -Move file on left -Przenieś plik na lewą stronę - -Move file on right -Przenieś plik na prawą stronę - -Overwrite left item -Nadpisz lewy element - -Overwrite right item -Nadpisz prawy element - -Do nothing -Nie rób nic - -Update attributes on left -Aktualizuj atrybuty po lewej stronie - -Update attributes on right -Aktualizuj atrybuty po prawej stronie - -Multiple... -Wiele... - -Moving file %x to %y -Przenoszenie pliku %x do %y - -Moving folder %x to %y -Przenoszenie katalogu %x do %y - -Moving symbolic link %x to %y -Przenoszenie dowiązania symbolicznego %x do %y - -Removing old versions... -Usuwanie starszych wersji... - -Creating symbolic link %x -Tworzenie dowiązania symbolicznego %x - -Creating folder %x -Tworzenie folderu %x - -Overwriting file %x -Nadpisywanie pliku %x - -Overwriting symbolic link %x -Nadpisywanie dowiązania symbolicznego %x - -Verifying file %x -Weryfikowanie pliku %x - -Updating attributes of %x -Aktualizowanie atrybutów %x - -Cannot find %x. -Nie można znaleźć %x. - -Target folder %x already existing. -Katalog docelowy %x już istnieje. - -Target folder input field must not be empty. -Pole katalog docelowy nie może być puste. - -Folder input field for versioning must not be empty. -Określ katalog do przechowywania wersjonowanych plików. +Unable to move %x to the Recycle Bin. +Nie można przenieść %x do kosza. -Source folder %x not found. -Nie znaleziono katalogu docelowego %x. - -The following items have unresolved conflicts and will not be synchronized: -Te elementy znajdują się w konflikcie, którego nie można rozwiązać. Pliki nie zostaną zsynchronizowane: - -Significant difference detected: -Wykryto znaczące zmiany: - -More than 50% of the total number of files will be copied or deleted! -Ponad 50% plików zostanie skopiowanych lub usuniętych! - -Not enough free disk space available in: -Brak wystarczającej przestrzeni dyskowej na: - -Required: -Wymagane: - -Available: -Dostępne: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Katalog zostanie zmodyfikowany w związku z synchronizacją wielu katalogów. Zweryfikuj ustawienia synchronizacji. - -Synchronizing folder pair: -Synchronizacja katalgów: +Cannot determine final path for %x. +Nie można określić ostatecznej ścieżki dla %x. -Generating database... -Generowanie bazy danych... - -Creating Volume Shadow Copy for %x... -Tworzenie Volume Shadow Copy dla %x... - -Data verification error: Source and target file have different content! -Błąd weryfikacji danych: Plik źródłowy i docelowy różnią się zawartością! +Error Code %x: +Kod błędu %x: diff --git a/BUILD/Languages/portuguese.lng b/BUILD/Languages/portuguese.lng index c524a9db..e7529706 100644 --- a/BUILD/Languages/portuguese.lng +++ b/BUILD/Languages/portuguese.lng @@ -1,137 +1,167 @@
- Português - QuestMark + Português + Carlos Balseiro pt_PT - portugal.png - 2 - n == 1 ? 0 : 1 + flag_portugal.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -À procura da pasta %x... +Retrying operation after error: + -Items processed: -Elementos processados: +Both sides have changed since last synchronization. +Ambos os lados tiveram alterações desde a última sincronização. -Items remaining: -Elementos restantes: +Cannot determine sync-direction: +Não é possível saber a direção de sincronização: -Total time: -Tempo total: +No change since last synchronization. +Não há alterações desde a última sincronização. -Cannot set directory lock for %x. -Não é possível colocar o bloqueio de directório para %x. +The database entry is not in sync considering current settings. +A base de dados não está sincronizada com as definições correntes. -Show in Explorer -Mostrar no Explorer +Setting default synchronization directions: Old files will be overwritten with newer files. +Escolher direcção de sincronização por defeito: Os ficheiros antigos serão substituídos pelos novos. -Open with default application -Abrir com a aplicação associada +Checking recycle bin availability for folder %x... +A verificar a disponibilidade da reciclagem para a pasta %x... -Browse directory -Procurar directório +Moving file %x to recycle bin +Mover ficheiro %x para a Reciclagem -Abort requested: Waiting for current operation to finish... -Abortar pedido: À espera do fim da operação atual... +Moving folder %x to recycle bin +Mover pasta %x para a Reciclagem -Failure to create timestamp for versioning: -Falha ao criar selo temporal para versões anteriores: +Moving symbolic link %x to recycle bin +Mover link simbólico %x para a Reciclagem -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronização Automatizada +Deleting file %x +Eliminar ficheiro %x + +Deleting folder %x +Eliminar pasta %x + +Deleting symbolic link %x +Eliminar link simbólico %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +A Reciclagem não está disponível para as seguintes pastas. Os ficheiros serão eliminados permanentemente: + +An exception occurred +Ocorreu uma excepção + +Cannot find file %x. +Não é possível encontrar o ficheiro %x. Error Erro -Selected variant: -Variante selecionada: +File %x does not contain a valid configuration. +Ficheiro %x não tem uma configuração válida. -Select alternate comparison settings -Selecionar opções alternativas de comparação +A folder input field is empty. +Um dos campos de directório para comparar está vazio. -Select alternate synchronization settings -Selecionar opções alternativas de sincronização +The corresponding folder will be considered as empty. +A pasta correspondente será considerada como vazia. -Filter is active -Filtro activo +Cannot find the following folders: +Não é possível encontrar as seguintes pastas: -No filter selected -Nenhum filtro selecionado +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Pode ignorar este erro para considerar cada pasta como vazia. As pastas necessárias serão criadas automaticamente durante a sincronização. -Remove alternate settings -Remover opções alternativas +The following folders have dependent paths. Be careful when setting up synchronization rules: +As seguintes pastas têm caminhos dependentes. Tenha atenção ao definir as regras de sincronizaçção: -Clear filter settings -Limpar opções do filtro +File %x has an invalid date. +Ficheiro %x tem data inválida. -Copy -Copiar +Date: +Data: -Paste -Colar +Files %x have the same date but a different size. +Os ficheiros %x têm a mesma data, mas tamanho diferente. -Save as batch job -Guardar como batch +Size: +Tamanho: -Comparison settings -Opções de comparação +Items differ in attributes only +Itens diferem apenas nos atributos -Synchronization settings -Parametros de sincronização +Resolving symbolic link %x +Resolver link simbólico %x -About -Sobre +Comparing content of files %x +A comparar o conteúdo do ficheiro %x -Confirm -Confirmar +Generating file list... +A gerar lista ficheiros... -Configure filter -Configurar filtros +Starting comparison +A iniciar a comparação -Global settings -Opções +Calculating sync directions... +A calcular a direcção de sincronização... -Find -Procurar +Out of memory. +Sem memória disponível. -Select time span -Selecionar intervalo de tempo +Item exists on left side only +Item existe apenas à esquerda -Invalid command line: -Linha de comando inválida: +Item exists on right side only +Item existe apenas à direita -Info -Info +Left side is newer +Esquerda é mais recente -Warning -Atenção +Right side is newer +Direita é mais recente -Fatal Error -Erro crítico +Items have different content +Itens tem conteúdo diferente -Error Code %x: -Código de erro %x: +Both sides are equal +Ambos os lados iguais -Cannot resolve symbolic link %x. -Não é possível resolver o link simbólico %x. +Conflict/item cannot be categorized +Conflito/item não pode ser categorizado - -1 Byte -%x Bytes - - -1 Byte -%x Bytes - +Copy new item to left +Copiar novo item para a esquerda -%x MB -%x MB +Copy new item to right +Copiar novo item para a direita -%x KB -%x KB +Delete left item +Apagar item esquerdo -%x GB -%x GB +Delete right item +Apagar item direito + +Move file on left +Mover ficheiro à esquerda + +Move file on right +Mover ficheiro à direita + +Overwrite left item +Substituir item da esquerda + +Overwrite right item +Substituir item da direita + +Do nothing +Não fazer nada + +Update attributes on left +Actualizar atributos à esquerda + +Update attributes on right +Actualizar atributos à direita Database file %x is incompatible. Base de dados %x não é compatível. @@ -145,9 +175,6 @@ Database file is corrupt: Ficheiro de base de dados está corrompido: -Out of memory! -Sem memória disponível! - Cannot write file %x. Não é possível escrever o ficheiro %x. @@ -157,8 +184,8 @@ Database files do not share a common session. As bases de dados são de sessões diferentes. -An exception occurred! -Ocorreu uma excepção! +Searching for folder %x... +À procura da pasta %x... Cannot read file attributes of %x. Não é possível ler os atributos do ficheiro %x. @@ -181,9 +208,39 @@ Creating file %x Criar ficheiro %x +Items processed: +Elementos processados: + +Items remaining: +Elementos restantes: + +Total time: +Tempo total: + + +1 Byte +%x Bytes + + +1 Byte +%x Bytes + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Erro ao analisar ficheiro %x, linha %y, coluna %z. +Cannot set directory lock for %x. +Não é possível colocar o bloqueio de directório para %x. + Scanning: A pesquisar: @@ -202,12 +259,18 @@ /sec /seg -File %x does not contain a valid configuration. -Ficheiro %x não tem uma configuração válida. - Configuration file %x loaded partially only. Ficheiro de configuração %x carregado parcialmente. +Show in Explorer +Mostrar no Explorer + +Open with default application +Abrir com a aplicação associada + +Browse directory +Procurar directório + Cannot access Volume Shadow Copy Service. Não é possível aceder ao serviço Volume Shadow Copy. @@ -217,18 +280,21 @@ Cannot load file %x. Não é possível carregar o ficheiro %x. -Path %x does not contain a volume name. -O caminho %x não tem um nome de volume. +Cannot determine volume name for %x. +Não é possível determinar o nome do volume para %x. + +Volume name %x not part of file name %y. +Nome do volume %x não faz parte do ficheiro %y. + +Abort requested: Waiting for current operation to finish... +Abortar pedido: À espera do fim da operação atual... -Volume name %x not part of file name %y! -Nome do volume %x não faz parte do ficheiro %y! +Failure to create timestamp for versioning: +Falha ao criar selo temporal para versões anteriores: Cannot read the following XML elements: Não é possível ler os elementos XML: -Cannot find file %x. -Não é possível encontrar o ficheiro %x. - &Open... &Abrir... @@ -309,9 +375,18 @@ O comando é executado se: Cancel Cancelar +RealtimeSync - Automated Synchronization +RealtimeSync - Sincronização Automatizada + +Warning +Atenção + Build: %x Build: %x +About +Sobre + All files Todos os ficheiros @@ -321,29 +396,125 @@ O comando é executado se: &Exit &Sair -Monitoring active... -Monitorizar activado... - Waiting for missing directories... A aguardar pelos directórios em falta... -A folder input field is empty. -Um dos campos de directório para comparar está vazio. +Invalid command line: +Linha de comando inválida: + +File content +Conteúdo do ficheiro + +File time and size +Data e tamanho do ficheiro + + Two way + Duas vias + +Mirror +Espelhar + +Update +Actualizar + +Custom +Personalizado + +Multiple... +Multiplo... + +Moving file %x to %y +Mover ficheiro %x para %y + +Moving folder %x to %y +Mover pasta %x para %y + +Moving symbolic link %x to %y +Mover link simbólico %x para %y + +Removing old versions... +A remover versões antigas... + +Creating symbolic link %x +Criar link simbólico %x + +Creating folder %x +Criar pasta %x + +Overwriting file %x +Substituir ficheiro %x + +Overwriting symbolic link %x +Substituir link simbólico %x + +Verifying file %x +A verificar ficheiro %x + +Updating attributes of %x +Actualizar atributos de %x + +Cannot find %x. +Não é possível encontrar %x. + +Target folder %x already existing. +Directório de destino %x já existe. + +Target folder input field must not be empty. +Campo de directório de destino não deve estar vazio. + +Folder input field for versioning must not be empty. +Campo do directório para manter versões não deve estar vazio. + +Source folder %x not found. +Directório %x não encontrado. + +The following items have unresolved conflicts and will not be synchronized: +Os seguintes itens têm conflitos não resolvidos, e não serão sincronizados: + +Significant difference detected: +Diferença significativa detectada: + +More than 50% of the total number of files will be copied or deleted. +Mais de 50% dos ficheiros vai ser copiado ou apagado. + +Not enough free disk space available in: +Não há espaço livre suficiente em: + +Required: +Requirido: + +Available: +Disponível: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Uma pasta que faz parte de vários pares vai ser modificada. Por favor, reveja os parametros de sincronização. + +Synchronizing folder pair: +Sincronizar o par de pastas: + +Generating database... +A gerar base de dados... -Synchronization aborted! -Sincronização abortada! +Creating Volume Shadow Copy for %x... +A criar Volume Shadow Copy para %x... + +Data verification error: %x and %y have different content. +Erro de verificação de dados: %x e %y têm conteúdo diferente. + +Synchronization aborted +Sincronização abortada -Synchronization completed with errors! -Sincronização completa com erros! +Synchronization completed with errors +Sincronização completa com erros -Synchronization completed with warnings. -Sincronização completa com avisos. +Synchronization completed with warnings +Sincronização completa com avisos -Nothing to synchronize! -Nada a sincronizar! +Nothing to synchronize +Nada a sincronizar -Synchronization completed successfully. -Sincronização completa com sucesso. +Synchronization completed successfully +Sincronização completa com sucesso Saving log file %x... A guardar ficheiro log %x... @@ -351,8 +522,8 @@ O comando é executado se: Press "Switch" to resolve issues in FreeFileSync main dialog. Pressionar "Trocar" para resolver problemas com a interface principal do FreeFileSync. -Switching to FreeFileSync main dialog... -A trocar para a interface principal do FreeFileSync... +Switching to FreeFileSync main dialog +A mudar para o diálogo principal do FreeFileSync A new version of FreeFileSync is available: Uma nova versão do FreeFileSync está disponível: @@ -360,29 +531,29 @@ O comando é executado se: Download now? Fazer download agora? -FreeFileSync is up to date! -FreeFileSync está actualizado! +New version found +Nova versão encontrada -Information -Informação +&Download +&Download -Unable to connect to sourceforge.net! -Não é possível ligar a sourceforge.net! +FreeFileSync is up to date. +FreeFileSync está actualizado. -Current FreeFileSync version number was not found online! Do you want to check manually? -Não foi possível encontrar online a última versão do FreeFileSync! Quer verificar manualmente? +Information +Informação -Do you want FreeFileSync to automatically check for updates every week? -Deseja que o FreeFileSync procure automaticamente actualizações todas as semanas? +Unable to connect to sourceforge.net. +Não é possível ligar a sourceforge.net. -(Requires an Internet connection!) -(Necessita acesso à Internet!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Não é possível encontrar a última versão do FreeFileSync online. Deseja verificar manualmente? - - +Symlink +Link Simbólico - - +Folder +Pasta Full path Caminho completo @@ -405,12 +576,6 @@ O comando é executado se: Extension Extensão -Size: -Tamanho: - -Date: -Data: - Category Categoria @@ -435,6 +600,33 @@ O comando é executado se: Hibernate Hibernar +Selected variant: +Variante selecionada: + +Select alternate comparison settings +Selecionar opções alternativas de comparação + +Select alternate synchronization settings +Selecionar opções alternativas de sincronização + +Filter is active +Filtro activo + +No filter selected +Nenhum filtro selecionado + +Remove alternate settings +Remover opções alternativas + +Clear filter settings +Limpar opções do filtro + +Copy +Copiar + +Paste +Colar + &New &Novo @@ -453,14 +645,14 @@ O comando é executado se: &Language &Língua -&Global settings... -&Opções... - &Export file list... &Exportar lista de ficheiros... -&Advanced -&Avançado +&Global settings... +&Opções... + +&Tools +&Ferramentas &Check now &Verificar agora @@ -468,12 +660,18 @@ O comando é executado se: Check &automatically once a week Verificar &automaticamente uma vez por semana -Check for new version -Verificar se há nova versão +Check for new &version +Verificar nova &versão Compare Comparar +Comparison settings +Opções de comparação + +Synchronization settings +Parametros de sincronização + Synchronize Sincronizar @@ -486,6 +684,9 @@ O comando é executado se: Swap sides Trocar lados +Save as batch job +Guardar como batch + Hide excluded items Esconder itens excluídos @@ -528,53 +729,8 @@ O comando é executado se: &Pause &Pausa -Batch job -Ficheiro Batch - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Criar ficheiro batch para automatizar a sincronização. Faça duplo-clique no ficheiro ou adicione ao planeador de tarefas do sistema: FreeFileSync.exe .ffs_batch - -Help -Ajuda - -Error handling -Controlador de erros - -Ignore -Ignorar - -Hide all error and warning messages -Ocultar todas as mensagens de erro/aviso - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Mostrar popup em caso de erros ou avisos - -Exit -Sair - -Abort synchronization on first error -Abortar sincronização ao primeiro erro - -Show progress dialog -Mostrar diálogo de progresso - -Save log -Guardar log - -Select folder to save log files -Seleccionar pasta para guardar ficheiros log - -Limit -Limitar - -Limit maximum number of log files -Limitar o número máximo de ficheiros log - -Select variant -Selecionar variante +Select a variant +Seleccione uma variante Files are found equal if @@ -589,9 +745,6 @@ Ficheiros considerados iguais se são iguais -File time and size -Data e tamanho do ficheiro - Files are found equal if - file content @@ -602,38 +755,41 @@ Os ficheiros são considerados iguais se - o conteúdo é o mesmo -File content -Conteúdo do ficheiro - Symbolic Link handling Tratamento de links simbólicos +Help +Ajuda + OK OK -<- Two way -> -<- Duas vias -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identificar e propagar mudanças nos dois lados. Eliminações, cópias e conflitos são detectados automaticamente usando base de dados. -Mirror ->> -Espelhar ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Cópia de segurança do directório à esquerda. O directório da direita é alterado para ficar igual ao da esquerda após sincronização. -Update -> -Actualizar -> - Copy new or updated files to right folder. Copiar ficheiros novos ou actualizados para a direita -Custom -Personalizado +Configure your own synchronization rules. +Configure as suas regras de sincronização. + +Error handling +Controlador de erros + +Ignore +Ignorar + +Hide all error and warning messages +Ocultar todas as mensagens de erro/aviso + +Pop-up +Pop-up -Configure your own synchronization rules. -Configure as suas regras de sincronização. +Show pop-up on errors or warnings +Mostrar popup em caso de erros ou avisos Deletion handling Controlo eliminação @@ -659,23 +815,32 @@ Os ficheiros são considerados iguais se Naming convention: Convenção de nomes: -Item exists on left side only -Item existe apenas à esquerda +Batch job +Ficheiro Batch -Item exists on right side only -Item existe apenas à direita +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Criar ficheiro batch para automatizar a sincronização. Faça duplo-clique no ficheiro ou adicione ao planeador de tarefas do sistema: FreeFileSync.exe .ffs_batch -Left side is newer -Esquerda é mais recente +Exit +Sair -Right side is newer -Direita é mais recente +Abort synchronization on first error +Abortar sincronização ao primeiro erro -Items have different content -Itens tem conteúdo diferente +Show progress dialog +Mostrar diálogo de progresso -Conflict/item cannot be categorized -Conflito/item não pode ser categorizado +Save log +Guardar log + +Select folder to save log files +Seleccionar pasta para guardar ficheiros log + +Limit +Limitar + +Limit maximum number of log files +Limitar o número máximo de ficheiros log Source code written in C++ using: Código fonte escrito em C++ utilizando: @@ -695,9 +860,6 @@ Os ficheiros são considerados iguais se Homepage Site -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge - Email Email @@ -712,11 +874,11 @@ Os ficheiros são considerados iguais se Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Apenas ficheiros que condigam com todos os filtros serão sincronizados. -Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! +Nota: Nome dos ficheiros tem que ser relativo aos diretórios base. Include @@ -740,6 +902,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! &Clear &Limpar +Global settings +Opções + Fail-safe file copy Cópia à prova de falhas @@ -770,9 +935,6 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! &Default &Config. Iniciais -Start synchronization -Iniciar a sincronização - Variant Variável @@ -791,6 +953,21 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! &Find next &Procurar seguinte +Delete +Eliminar + +Configure filter +Configurar filtros + +Start synchronization +Iniciar a sincronização + +Find +Procurar + +Select time span +Selecionar intervalo de tempo + Folder pairs Par de directório @@ -857,11 +1034,8 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! Exclude via filter: Excluir por filtro: - - - -Delete -Eliminar +multiple selection +seleção múltipla Include all Incluir tudo @@ -890,14 +1064,14 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! Show "%x" Mostrar "%x" - -<Última Sessão> +Last session +Última Sessão Folder Comparison and Synchronization Comparação e Sincronização de Pastas -Configuration saved! -Configuração guardada! +Configuration saved +Configuração guardada FreeFileSync batch FreeFileSync batch @@ -911,9 +1085,6 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! Never save changes Nunca guardar alterações -Configuration loaded! -Configuração carregada! - Show files that exist on left side only Mostrar ficheiros existentes somente à esquerda @@ -959,20 +1130,17 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! Set as default Definir como padrão -Operation aborted! -Operação abortada! +Operation aborted +Operação abortada -All folders are in sync! -Todas as pastas estão sincronizadas! +All folders are in sync +Todas as pastas estão sincronizadas Comma separated list Lista de itens separados por vírgulas -Legend -Legenda - -File list exported! -Lista dos ficheiros exportada! +File list exported +Lista dos ficheiros exportada Searching for program updates... A procurar actualizações do programa... @@ -983,6 +1151,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! &Ignore &Ignorar +Fatal Error +Erro crítico + Don't show this warning again Não mostrar este aviso novamente @@ -1004,6 +1175,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! Comparing content... A comparar... +Info +Info + Paused Em pausa @@ -1160,9 +1334,6 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! Cannot write modification time of %x. Não é possível alterar a data de modificação a %x. -Cannot find system function %x. -Não é possível encontrar a função do sistema %x. - Cannot read security context of %x. Não é possível ler o contexto de segurança %x. @@ -1178,8 +1349,11 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! Cannot create directory %x. Não é possível criar o directório %x. -Cannot copy symbolic link %x to %y. -Não é possível copiar o link simbólico %x para %y. +Cannot create symbolic link %x. +Não é possível criar link simbólico %x. + +Cannot find system function %x. +Não é possível encontrar a função do sistema %x. Cannot copy file %x to %y. Não é possível copiar o ficheiro %x para %y. @@ -1187,15 +1361,15 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! Type of item %x is not supported: Tipo de item %x não é suportado: +Cannot resolve symbolic link %x. +Não é possível resolver o link simbólico %x. + Cannot open directory %x. Não é possível abrir o directório %x. Cannot enumerate directory %x. Não é possível enumerar o directório %x. -Detected endless directory recursion. -Recursão infinita detetada no directório - %x TB %x TB @@ -1229,6 +1403,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! %x dias +Failed to register to receive system messages. +Falhou o registo para receber mensagens de sistema. + Cannot set privilege %x. Não é possível definir o privilégio %x. @@ -1238,204 +1415,12 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base! Cannot change process I/O priorities. Não é possível alterar as prioridades de E / S do processo. -Unable to move %x to the Recycle Bin! -Não é possível mover %x para a Reciclagem! - -Both sides have changed since last synchronization! -Ambos os lados tiveram alterações desde a última sincronização! - -Cannot determine sync-direction: -Não é possível saber a direção de sincronização: - -No change since last synchronization! -Não há alterações desde a última sincronização! - -The corresponding database entries are not in sync considering current settings. -As entradas da base de dados correspondentes não estão sincronizadas, considerando as opções actuais. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Escolher direcção de sincronização por defeito: Os ficheiros antigos serão substituídos pelos novos. - -Checking recycle bin availability for folder %x... -A verificar a disponibilidade da reciclagem para a pasta %x... - -Moving file %x to recycle bin -Mover ficheiro %x para a Reciclagem - -Moving folder %x to recycle bin -Mover pasta %x para a Reciclagem - -Moving symbolic link %x to recycle bin -Mover link simbólico %x para a Reciclagem - -Deleting file %x -Apagar ficheiro %x - -Deleting folder %x -Apagar pasta %x - -Deleting symbolic link %x -Eliminar link simbólico %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Reciclagem não disponível para os seguintes caminhos! Os ficheiros serão apagados permanentemente: - -The corresponding folder will be considered as empty. -A pasta correspondente será considerada como vazia. - -Cannot find the following folders: -Não é possível encontrar as seguintes pastas: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Pode ignorar este erro para considerar cada pasta como vazia. As pastas necessárias serão criadas automaticamente durante a sincronização. - -Directories are dependent! Be careful when setting up synchronization rules: -Directórios são dependentes! Cuidado ao definir as regras de sincronização: - -Start comparison -Iniciar comparação - -Calculating sync directions... -A calcular a direcção de sincronização... - -Conflict detected: -Conflito detectado: - -File %x has an invalid date! -Ficheiro %x tem data inválida! - -Files %x have the same date but a different size! -Os ficheiros %x têm a mesma data, mas tamanho diferente! - -Items differ in attributes only -Itens diferem apenas nos atributos - -Symbolic links %x have the same date but a different target. -Links simbólicos %x tem a mesma data, mas alvos diferentes. - -Comparing content of files %x -A comparar o conteúdo do ficheiro %x - -Comparing files by content failed. -A comparação de ficheiros por conteúdo falhou. - -Generating file list... -A gerar lista ficheiros... - -Both sides are equal -Ambos os lados iguais - -Copy new item to left -Copiar novo item para a esquerda - -Copy new item to right -Copiar novo item para a direita - -Delete left item -Apagar item esquerdo - -Delete right item -Apagar item direito - -Move file on left -Mover ficheiro à esquerda - -Move file on right -Mover ficheiro à direita - -Overwrite left item -Substituir item da esquerda - -Overwrite right item -Substituir item da direita - -Do nothing -Não fazer nada - -Update attributes on left -Actualizar atributos à esquerda - -Update attributes on right -Actualizar atributos à direita - -Multiple... -Multiplo... - -Moving file %x to %y -Mover ficheiro %x para %y - -Moving folder %x to %y -Mover pasta %x para %y - -Moving symbolic link %x to %y -Mover link simbólico %x para %y - -Removing old versions... -A remover versões antigas... - -Creating symbolic link %x -Criar link simbólico %x - -Creating folder %x -Criar pasta %x - -Overwriting file %x -Substituir ficheiro %x - -Overwriting symbolic link %x -Substituir link simbólico %x - -Verifying file %x -A verificar ficheiro %x - -Updating attributes of %x -Actualizar atributos de %x - -Cannot find %x. -Não é possível encontrar %x. - -Target folder %x already existing. -Directório de destino %x já existe. - -Target folder input field must not be empty. -Campo de directório de destino não deve estar vazio. - -Folder input field for versioning must not be empty. -Campo do directório para manter versões não deve estar vazio. +Unable to move %x to the Recycle Bin. +Não é possível mover %x para a Reciclagem. -Source folder %x not found. -Directório %x não encontrado. - -The following items have unresolved conflicts and will not be synchronized: -Os seguintes itens têm conflitos não resolvidos, e não serão sincronizados: - -Significant difference detected: -Diferença significativa detectada: - -More than 50% of the total number of files will be copied or deleted! -Mais de 50% dos ficheiros vai ser copiado ou apagado! - -Not enough free disk space available in: -Não há espaço livre suficiente em: - -Required: -Requirido: - -Available: -Disponível: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Uma pasta que faz parte de vários pares vai ser modificada. Por favor, reveja os parametros de sincronização. - -Synchronizing folder pair: -Sincronizar o par de pastas: +Cannot determine final path for %x. +Não é possível determinar o caminho final de %x. -Generating database... -A gerar base de dados... - -Creating Volume Shadow Copy for %x... -A criar Volume Shadow Copy para %x... - -Data verification error: Source and target file have different content! -Erro na verificação de dados: ficheiro fonte e de destino têm conteúdo diferente! +Error Code %x: +Código de erro %x: diff --git a/BUILD/Languages/portuguese_br.lng b/BUILD/Languages/portuguese_br.lng index e952271b..a4d44140 100644 --- a/BUILD/Languages/portuguese_br.lng +++ b/BUILD/Languages/portuguese_br.lng @@ -1,137 +1,164 @@
- Português (BR) + Português (BR) Edison Aranha pt_BR - brazil.png - 2 - n == 1 ? 0 : 1 + flag_brazil.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Buscando pela pasta %x... +Both sides have changed since last synchronization. +Ambos os lados foram alterados desde a última sincronização. -Items processed: -Elementos processados: +Cannot determine sync-direction: +Não foi possível determinar a direção de sincronização: -Items remaining: -Elementos restantes: +No change since last synchronization. +Nenhuma mudança desde a última sincronização. -Total time: -Tempo total: +The database entry is not in sync considering current settings. +A entrada de banco de dados não está em sincronia considerando as configurações atuais. -Cannot set directory lock for %x. -Não foi possível travar o diretório %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +Configurando direções padrões de sincronização: Arquivos antigos serão substituídos por arquivos mais novos. -Show in Explorer -Mostrar no Explorer +Checking recycle bin availability for folder %x... +Verificando a disponibilidade da lixeira para a pasta %x... -Open with default application -Abrir com aplicativo padrão +Moving file %x to recycle bin +Movendo arquivo %x para a lixeira -Browse directory -Procurar diretório +Moving folder %x to recycle bin +Movendo pasta %x para a lixeira -Abort requested: Waiting for current operation to finish... -Cancelar solicitado: Esperando fim da operação... +Moving symbolic link %x to recycle bin +Movendo link simbólico %x para a lixeira -Failure to create timestamp for versioning: -Erro ao criar estampa de tempo para controle de versão: +Deleting file %x +Apagando arquivo %x -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronização Automatizada +Deleting folder %x +Apagando pasta %x + +Deleting symbolic link %x +Apagando link simbólico %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +A Lixeira não está disponível para as seguintes pastas. Os arquivos serão apagados permanentemente: + +An exception occurred +Ocorreu uma exceção + +Cannot find file %x. +Não foi possível localizar o aquivo %x. Error Erro -Selected variant: -Modo selecionado: +File %x does not contain a valid configuration. +O arquivo %x não contém uma configuração válida. -Select alternate comparison settings -Selecionar configurações alternativas de comparação +A folder input field is empty. +Um campo de entrada de pasta está vazio. -Select alternate synchronization settings -Selecionar configurações alternativas de sincronização +The corresponding folder will be considered as empty. +A pasta correspondente será considerar como vazia. -Filter is active -Filtro está ativo +Cannot find the following folders: +Não foi possível localizar as seguintes pastas: -No filter selected -Nenhum filtro selecionado +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Você pode ignorar este erro para considerar cada pasta como vazia. As pastas serão criadas automaticamentes durante a sincronização. -Remove alternate settings -Remover configurações alternativas +The following folders have dependent paths. Be careful when setting up synchronization rules: +As seguintes pastas tem caminhos dependentes. Cuidado na hora de estabelecer as regras de sincronização: -Clear filter settings -Limpar configurações do filtro +File %x has an invalid date. +O arquivo %x tem uma data inválida. -Copy -Copiar +Date: +Data: -Paste -Colar +Files %x have the same date but a different size. +Os arquivos %x têm a mesma data mas tamanhos diferentes. -Save as batch job -Salvar como tarefa em lote +Size: +Tamanho: -Comparison settings -Parâmetros de comparação +Items differ in attributes only +Os itens diferem apenas nos atributos -Synchronization settings -Parâmetros de sincronização +Resolving symbolic link %x +Resolvendo link simbólico %x -About -Sobre +Comparing content of files %x +Comparando conteúdo do arquivo %x -Confirm -Confirmar +Generating file list... +Gerando lista de arquivos... -Configure filter -Configurar filtros +Starting comparison +Iniciando comparação -Global settings -Configurações +Calculating sync directions... +Calculando as direções de sincronização... -Find -Localizar +Out of memory. +Falta de memória. -Select time span -Selecionar intervalo de tempo +Item exists on left side only +Item existe apenas no lado esquerdo -Invalid command line: -Linha de comando inválida: +Item exists on right side only +Item existe apenas no lado direito -Info -Informações +Left side is newer +Lado esquerdo é novo -Warning -Avisos +Right side is newer +Lado direito é novo -Fatal Error -Erro fatal +Items have different content +Itens têm conteúdos diferentes -Error Code %x: -Código do Erro %x: +Both sides are equal +Ambos os lados são iguais -Cannot resolve symbolic link %x. -Não foi possível resolver o link simbólico %x. +Conflict/item cannot be categorized +Conflito/item não pode ser categorizado - -1 Byte -%x Bytes - - -1 Byte -%x Bytes - +Copy new item to left +Copiar novo item para a esquerda -%x MB -%x MB +Copy new item to right +Copiar novo item para a direita -%x KB -%x kB +Delete left item +Apagar item à esquerda -%x GB -%x GB +Delete right item +Apagar item à direita + +Move file on left +Mover arquivo à esquerda + +Move file on right +Mover arquivo à direita + +Overwrite left item +Sobrescrever item à esquerda + +Overwrite right item +Sobrescrever item à direita + +Do nothing +Não fazer nada + +Update attributes on left +Atualizar atributos à esquerda + +Update attributes on right +Atualizar atributos à direita Database file %x is incompatible. O arquivo de banco de dados %x é incompatível. @@ -145,9 +172,6 @@ Database file is corrupt: O arquivo de banco de dados está corrompido -Out of memory! -Falta de memória! - Cannot write file %x. Não foi possível escrever o arquivo %x. @@ -157,8 +181,8 @@ Database files do not share a common session. Os arquivos de banco de dados são de sessões diferentes. -An exception occurred! -Ocorreu uma exceção! +Searching for folder %x... +Buscando pela pasta %x... Cannot read file attributes of %x. Não foi possível ler os atributos do arquivo %x. @@ -181,9 +205,39 @@ Creating file %x Criando arquivo %x +Items processed: +Elementos processados: + +Items remaining: +Elementos restantes: + +Total time: +Tempo total: + + +1 Byte +%x Bytes + + +1 Byte +%x Bytes + + +%x MB +%x MB + +%x KB +%x kB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Erro analisando o arquivo %x, linha %y, coluna %z. +Cannot set directory lock for %x. +Não foi possível travar o diretório %x. + Scanning: Pesquisando: @@ -202,12 +256,18 @@ /sec /seg -File %x does not contain a valid configuration. -O arquivo %x não contém uma configuração válida. - Configuration file %x loaded partially only. O arquivo de configuração %x foi carregado parcialmente. +Show in Explorer +Mostrar no Explorer + +Open with default application +Abrir com aplicativo padrão + +Browse directory +Procurar diretório + Cannot access Volume Shadow Copy Service. Não foi possível acessar o Serviço Cópia de Sombra de Volume. @@ -217,18 +277,21 @@ Cannot load file %x. Não foi possível carregar o aquivo %x. -Path %x does not contain a volume name. -O caminho %x não contém um nome de volume. +Cannot determine volume name for %x. +Não foi possível determinar o nome do volume para %x. -Volume name %x not part of file name %y! -Nome do volume %x não é parte do arquivo %y! +Volume name %x not part of file name %y. +Nome do volume %x não é parte do arquivo %y. + +Abort requested: Waiting for current operation to finish... +Cancelar solicitado: Esperando fim da operação... + +Failure to create timestamp for versioning: +Erro ao criar estampa de tempo para controle de versão: Cannot read the following XML elements: Não foi possível ler os seguintes elementos XML: -Cannot find file %x. -Não foi possível localizar o aquivo %x. - &Open... &Abrir... @@ -309,9 +372,18 @@ O comando é disparado se: Cancel Cancelar +RealtimeSync - Automated Synchronization +RealtimeSync - Sincronização Automatizada + +Warning +Avisos + Build: %x Versão: %x +About +Sobre + All files Todos os arquivos @@ -321,29 +393,125 @@ O comando é disparado se: &Exit &Sair -Monitoring active... -Monitoramento ativo... - Waiting for missing directories... Esperando por diretórios faltantes... -A folder input field is empty. -Um campo de entrada de pasta está vazio. +Invalid command line: +Linha de comando inválida: + +File content +Conteúdo do arquivo + +File time and size +Data e tamanho do arquivo + + Two way + Dois sentidos + +Mirror +Espelhar + +Update +Atualizar + +Custom +Personalizado + +Multiple... +Múltiplo... + +Moving file %x to %y +Movendo arquivo %x para %y + +Moving folder %x to %y +Movendo pasta %x para %y + +Moving symbolic link %x to %y +Movendo link simbólico %x para %y + +Removing old versions... +Removendo versões antigas... + +Creating symbolic link %x +Criando link simbólico %x + +Creating folder %x +Criando pasta %x + +Overwriting file %x +Substituindo arquivo %x + +Overwriting symbolic link %x +Substituindo link simbólico %x + +Verifying file %x +Verificando arquivo %x + +Updating attributes of %x +Atualizando atributos de %x + +Cannot find %x. +Não foi possível localizar %x. + +Target folder %x already existing. +Pasta de destino %x já existe. + +Target folder input field must not be empty. +Campo de entrada da pasta de destino não pode ficar vazio. + +Folder input field for versioning must not be empty. +Campo de entrada da pasta para controle de versão não pode ficar vazio. + +Source folder %x not found. +Pasta de origem %x não foi encontrada. + +The following items have unresolved conflicts and will not be synchronized: +Os seguintes itens possuem conflitos não resolvidos e não serão sincronizados: + +Significant difference detected: +Diferença significativa detectada: + +More than 50% of the total number of files will be copied or deleted. +Mais de 50% do número total de arquivos será copiado ou apagado. + +Not enough free disk space available in: +Espaço em disco insuficiente em: -Synchronization aborted! -Sincronização cancelada! +Required: +Necessário: + +Available: +Disponível: -Synchronization completed with errors! -Sincronização finalizada com erros! +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Uma pasta que é parte de múltiplos pares de pasta será modificada. Por favor, revise as configurações de sincronização. -Synchronization completed with warnings. -Sincronização finalizada com avisos. +Synchronizing folder pair: +Sincronizando par de pastas: + +Generating database... +Gerando banco de dados... + +Creating Volume Shadow Copy for %x... +Criando Cópia de Sombra de Volume para %x... -Nothing to synchronize! -Nada para sincronizar! +Data verification error: %x and %y have different content. +Erro na verificação dos dados: %x e %y têm conteúdo diferente. -Synchronization completed successfully. -Sincronização finalizada com sucesso. +Synchronization aborted +Sincronização cancelada + +Synchronization completed with errors +Sincronização finalizada com erros + +Synchronization completed with warnings +Sincronização finalizada com avisos + +Nothing to synchronize +Nada para sincronizar + +Synchronization completed successfully +Sincronização finalizada com sucesso Saving log file %x... Salvando arquivo de log %x... @@ -351,8 +519,8 @@ O comando é disparado se: Press "Switch" to resolve issues in FreeFileSync main dialog. Pressione "Alterar" para resolver os conflitos na tela principal do FreeFileSync. -Switching to FreeFileSync main dialog... -Alterando para a tela principal do FreeFileSync... +Switching to FreeFileSync main dialog +Mudando para a caixa de diálogo principal do FreeFileSync A new version of FreeFileSync is available: Uma nova versão do FreeFileSync está disponível: @@ -360,29 +528,29 @@ O comando é disparado se: Download now? Baixar agora? -FreeFileSync is up to date! -FreeFileSync está atualizado! +New version found +Nova versão encontrada -Information -Informação +&Download +&Baixar -Unable to connect to sourceforge.net! -Não foi possível conectar a sourceforge.net! +FreeFileSync is up to date. +FreeFileSync está atualizado. -Current FreeFileSync version number was not found online! Do you want to check manually? -A versão atual do FreeFileSync não foi encontra on-line! Deseja verificar manualmente? +Information +Informação -Do you want FreeFileSync to automatically check for updates every week? -Deseja que o FreeFileSync procure automaticamente novas versões todas as semanas? +Unable to connect to sourceforge.net. +Não foi possível conectar a sourceforge.net. -(Requires an Internet connection!) -(Requer conexão com a Internet!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Não foi possível encontrar a versão atual do FreeFileSync online. Deseja verificar manualmente? - - +Symlink +Link Simbólico - - +Folder +Pasta Full path Caminho completo @@ -405,18 +573,12 @@ O comando é disparado se: Extension Extensão -Size: -Tamanho: - -Date: -Data: +Category +Categoria Action Ação -Category -Categoria - Drag && drop Arrastar && Soltar @@ -435,6 +597,33 @@ O comando é disparado se: Hibernate Hibernar +Selected variant: +Modo selecionado: + +Select alternate comparison settings +Selecionar configurações alternativas de comparação + +Select alternate synchronization settings +Selecionar configurações alternativas de sincronização + +Filter is active +Filtro está ativo + +No filter selected +Nenhum filtro selecionado + +Remove alternate settings +Remover configurações alternativas + +Clear filter settings +Limpar configurações do filtro + +Copy +Copiar + +Paste +Colar + &New &Novo @@ -453,14 +642,14 @@ O comando é disparado se: &Language &Idioma -&Global settings... -&Configurações... - &Export file list... &Exportar lista de arquivos... -&Advanced -&Avançado +&Global settings... +&Configurações... + +&Tools +&Ferramentas &Check now &Verificar agora @@ -468,12 +657,18 @@ O comando é disparado se: Check &automatically once a week Verificar &automaticamente uma vez por semana -Check for new version -&Verificar novas versões +Check for new &version +Verificar se existe nova &versão Compare Comparar +Comparison settings +Parâmetros de comparação + +Synchronization settings +Parâmetros de sincronização + Synchronize Sincronizar @@ -486,6 +681,9 @@ O comando é disparado se: Swap sides Inverter lados +Save as batch job +Salvar como tarefa em lote + Hide excluded items Ocultar itens excluídos @@ -528,53 +726,8 @@ O comando é disparado se: &Pause &Pausar -Batch job -Tarefa em lote - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Cria um arquivo de lote para automatizar a sincronização. Dê um clique duplo ou agende no Agendador de Tarefas do sistema operacional: FreeFileSync.exe .ffs_batch - -Help -Ajuda - -Error handling -Tratamento de erros - -Ignore -Ignorar - -Hide all error and warning messages -Oculta todas as mensagens de erros e avisos - -Pop-up -Pop-up - -Show pop-up on errors or warnings -Mostra pop-up em caso de erros ou avisos - -Exit -Sair - -Abort synchronization on first error -Cancela sincronização no primeiro erro - -Show progress dialog -Mostrar indicador de progresso - -Save log -Salvar log - -Select folder to save log files -Seleciona pasta para salvar arquivos de log - -Limit -Limite - -Limit maximum number of log files -Limita número máximo de arquivos de log - -Select variant -Selecionar modo +Select a variant +Selecione uma variante Files are found equal if @@ -589,9 +742,6 @@ Os arquivos são considerados iguais se são os mesmos -File time and size -Data e tamanho do arquivo - Files are found equal if - file content @@ -603,39 +753,42 @@ Os arquivos são considerados iguais se é o mesmo -File content -Conteúdo do arquivo - Symbolic Link handling Tratamento de Links Simbólicos +Help +Ajuda + OK OK -<- Two way -> -<- Dois sentidos -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identifica e propaga as mudanças em ambos os lados. Arquivos e pastas apagados e/ou movidos e conflitos são detectados automaticamente usando um banco de dados. -Mirror ->> -Espelhar ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Cópia espelho da pasta da esquerda. A pasta da direita será modificada para ficar exatamente igual à pasta da esquerda após a sincronização. -Update -> -Atualizar -> - Copy new or updated files to right folder. Copia arquivos novos ou atualizados para a pasta da direita -Custom -Personalizado - Configure your own synchronization rules. Configure as suas próprias regras de sincronização. +Error handling +Tratamento de erros + +Ignore +Ignorar + +Hide all error and warning messages +Oculta todas as mensagens de erros e avisos + +Pop-up +Pop-up + +Show pop-up on errors or warnings +Mostra pop-up em caso de erros ou avisos + Deletion handling Tratamento da exclusão @@ -660,23 +813,32 @@ Os arquivos são considerados iguais se Naming convention: Convenção de nomenclatura: -Item exists on left side only -Item existe apenas no lado esquerdo +Batch job +Tarefa em lote + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Cria um arquivo de lote para automatizar a sincronização. Dê um clique duplo ou agende no Agendador de Tarefas do sistema operacional: FreeFileSync.exe .ffs_batch + +Exit +Sair + +Abort synchronization on first error +Cancela sincronização no primeiro erro -Item exists on right side only -Item existe apenas no lado direito +Show progress dialog +Mostrar indicador de progresso -Left side is newer -Lado esquerdo é novo +Save log +Salvar log -Right side is newer -Lado direito é novo +Select folder to save log files +Seleciona pasta para salvar arquivos de log -Items have different content -Itens têm conteúdos diferentes +Limit +Limite -Conflict/item cannot be categorized -Conflito/item não pode ser categorizado +Limit maximum number of log files +Limita número máximo de arquivos de log Source code written in C++ using: Código-fonte escrito em C++ utilizando: @@ -696,9 +858,6 @@ Os arquivos são considerados iguais se Homepage Homepage -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge - Email E-mail @@ -713,11 +872,11 @@ Os arquivos são considerados iguais se Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Apenas arquivos que correspondem a todas as configurações do filtro serão sincronizados. -Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! +Nota: Os nomes dos arquivos devem ser relativos aos diretórios base. Include @@ -741,6 +900,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! &Clear &Limpar +Global settings +Configurações + Fail-safe file copy Cópia de arquivos a prova de falhas @@ -771,9 +933,6 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! &Default &Config. Padrão -Start synchronization -Iniciar a sincronização - Variant Modo @@ -792,8 +951,20 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! &Find next &Localizar próxima -Main bar -Barra principal +Delete +Apagar + +Configure filter +Configurar filtros + +Start synchronization +Iniciar a sincronização + +Find +Localizar + +Select time span +Selecionar intervalo de tempo Folder pairs Pares de pastas @@ -804,6 +975,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Configuration Configuração +Main bar +Barra principal + Filter files Filtrar arquivos @@ -858,11 +1032,8 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Exclude via filter: Excluir via filtro: - - - -Delete -Apagar +multiple selection +seleção múltipla Include all Incluir todos @@ -891,14 +1062,14 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Show "%x" Mostrar "%x" - -<Última sessão> +Last session +Última sessão Folder Comparison and Synchronization Comparação e Sincronização de Pastas -Configuration saved! -Configuração salva! +Configuration saved +Configuração salva FreeFileSync batch Tarefa em lote do FreeFileSync @@ -912,9 +1083,6 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Never save changes Nunca salvar alterações -Configuration loaded! -Configuração carregada! - Show files that exist on left side only Mostrar arquivos que existem somente à esquerda @@ -960,20 +1128,17 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Set as default Definir como padrão -Operation aborted! -Operação cancelada! +Operation aborted +Operação cancelada -All folders are in sync! -Todas as pastas estão sincronizadas! +All folders are in sync +Todas as pastas estão sincronizadas Comma separated list Lista de itens separados por vírgulas -Legend -Legenda - -File list exported! -Lista de arquivos exportada! +File list exported +Lista de arquivos exportada Searching for program updates... Procurando atualizações do programa... @@ -984,6 +1149,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! &Ignore &Ignorar +Fatal Error +Erro fatal + Don't show this warning again Não mostrar este aviso novamente @@ -1005,6 +1173,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Comparing content... Comparando conteúdo... +Info +Informações + Paused Pausado @@ -1107,18 +1278,18 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Leave as unresolved conflict Deixar como conflito não resolvido -Time stamp -Estampa de tempo - -Append a timestamp to each file name -Atribuir uma estampa de tempo para cada nome de arquivo - Replace Substituir Move files and replace if existing Move arquivos e substitui se existente +Time stamp +Estampa de tempo + +Append a timestamp to each file name +Atribuir uma estampa de tempo para cada nome de arquivo + Folder Pasta @@ -1161,9 +1332,6 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Cannot write modification time of %x. Não foi possível escrever a data de modificação de %x. -Cannot find system function %x. -Não foi possível localizar a função de sistema %x. - Cannot read security context of %x. Não foi possível ler o contexto de segurança de %x. @@ -1179,8 +1347,11 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Cannot create directory %x. Não foi possível criar o diretório %x. -Cannot copy symbolic link %x to %y. -Não foi possível copiar o link simbólico %x para %y. +Cannot create symbolic link %x. +Não foi possível criar o link simbólico %x. + +Cannot find system function %x. +Não foi possível localizar a função de sistema %x. Cannot copy file %x to %y. Não foi possível copiar o arquivo %x para %y. @@ -1188,15 +1359,15 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Type of item %x is not supported: Tipo de item %x não é suportado: +Cannot resolve symbolic link %x. +Não foi possível resolver o link simbólico %x. + Cannot open directory %x. Não foi possível abrir o diretório %x. Cannot enumerate directory %x. Não foi possível enumerar o diretório %x. -Detected endless directory recursion. -Recursão de diretório infinita detectada. - %x TB %x TB @@ -1230,6 +1401,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! %x dias +Failed to register to receive system messages. +Falha ao registrar para receber mensagens do sistema. + Cannot set privilege %x. Não foi possível estabelecer o privilégio %x. @@ -1239,204 +1413,12 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base! Cannot change process I/O priorities. Não foi possível mudar a prioridade de E/S do processo. -Unable to move %x to the Recycle Bin! -Não foi possível mover %x para a Lixeira! - -Both sides have changed since last synchronization! -Ambos os lados foram alterados desde a última sincronização! - -Cannot determine sync-direction: -Não foi possível determinar a direção de sincronização: - -No change since last synchronization! -Nenhuma mudança desde a última sincronização! - -The corresponding database entries are not in sync considering current settings. -As entradas de banco de dados correspondentes não estão em sincronia considerando as configurações atuais. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Configurando direções padrões de sincronização: Arquivos antigos serão substituídos por arquivos mais novos. - -Checking recycle bin availability for folder %x... -Verificando a disponibilidade da lixeira para a pasta %x... - -Moving file %x to recycle bin -Movendo arquivo %x para a lixeira - -Moving folder %x to recycle bin -Movendo pasta %x para a lixeira - -Moving symbolic link %x to recycle bin -Movendo link simbólico %x para a lixeira - -Deleting file %x -Apagando arquivo %x - -Deleting folder %x -Apagando pasta %x - -Deleting symbolic link %x -Apagando link simbólico %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -A Lixeira não está disponível para os seguintes caminhos! Os arquivos serão apagados permanentemente: - -The corresponding folder will be considered as empty. -A pasta correspondente será considerar como vazia. - -Cannot find the following folders: -Não foi possível localizar as seguintes pastas: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Você pode ignorar este erro para considerar cada pasta como vazia. As pastas serão criadas automaticamentes durante a sincronização. - -Directories are dependent! Be careful when setting up synchronization rules: -Os diretórios são dependentes! Cuidado ao definir as regras de sincronização: - -Start comparison -Iniciar a comparação - -Calculating sync directions... -Calculando as direções de sincronização... - -Conflict detected: -Conflito detectado: - -File %x has an invalid date! -O arquivo %x tem uma data inválida! - -Files %x have the same date but a different size! -Os arquivos %x têm a mesma data mas tamanhos diferentes! - -Items differ in attributes only -Os itens diferem apenas nos atributos - -Symbolic links %x have the same date but a different target. -Os links simbólicos %x têm a mesma data mas um destino diferente. - -Comparing content of files %x -Comparando conteúdo do arquivo %x - -Comparing files by content failed. -Comparação de arquivos pelo conteúdo falhou. - -Generating file list... -Gerando lista de arquivos... - -Both sides are equal -Ambos os lados são iguais - -Copy new item to left -Copiar novo item para a esquerda - -Copy new item to right -Copiar novo item para a direita - -Delete left item -Apagar item à esquerda - -Delete right item -Apagar item à direita - -Move file on left -Mover arquivo à esquerda - -Move file on right -Mover arquivo à direita - -Overwrite left item -Sobrescrever item à esquerda - -Overwrite right item -Sobrescrever item à direita - -Do nothing -Não fazer nada - -Update attributes on left -Atualizar atributos à esquerda - -Update attributes on right -Atualizar atributos à direita - -Multiple... -Múltiplo... - -Moving file %x to %y -Movendo arquivo %x para %y - -Moving folder %x to %y -Movendo pasta %x para %y - -Moving symbolic link %x to %y -Movendo link simbólico %x para %y - -Removing old versions... -Removendo versões antigas... - -Creating symbolic link %x -Criando link simbólico %x - -Creating folder %x -Criando pasta %x - -Overwriting file %x -Substituindo arquivo %x - -Overwriting symbolic link %x -Substituindo link simbólico %x - -Verifying file %x -Verificando arquivo %x - -Updating attributes of %x -Atualizando atributos de %x - -Cannot find %x. -Não foi possível localizar %x. - -Target folder %x already existing. -Pasta de destino %x já existe. - -Target folder input field must not be empty. -Campo de entrada da pasta de destino não pode ficar vazio. - -Folder input field for versioning must not be empty. -Campo de entrada da pasta para controle de versão não pode ficar vazio. +Unable to move %x to the Recycle Bin. +Não foi possível mover %x para a Lixeira. -Source folder %x not found. -Pasta de origem %x não foi encontrada. - -The following items have unresolved conflicts and will not be synchronized: -Os seguintes itens possuem conflitos não resolvidos e não serão sincronizados: - -Significant difference detected: -Diferença significativa detectada: - -More than 50% of the total number of files will be copied or deleted! -Mais de 50% do número total de arquivos será copiado ou apagado! - -Not enough free disk space available in: -Espaço em disco insuficiente em: - -Required: -Necessário: - -Available: -Disponível: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Uma pasta que é parte de múltiplos pares de pasta será modificada. Por favor, revise as configurações de sincronização. - -Synchronizing folder pair: -Sincronizando par de pastas: +Cannot determine final path for %x. +Não foi possível determinar o caminho final para %x. -Generating database... -Gerando banco de dados... - -Creating Volume Shadow Copy for %x... -Criando Cópia de Sombra de Volume para %x... - -Data verification error: Source and target file have different content! -Erro de verificação de dados: Arquivo de origem e destino têm o mesmo conteúdo! +Error Code %x: +Código do Erro %x: diff --git a/BUILD/Languages/romanian.lng b/BUILD/Languages/romanian.lng index e34a4b9c..1e4efa96 100644 --- a/BUILD/Languages/romanian.lng +++ b/BUILD/Languages/romanian.lng @@ -1,138 +1,164 @@
- Română + Română Alexandru Bogdan Munteanu ro_RO - romania.png - 3 - n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2 + flag_romania.png + 3 + n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2
-Searching for folder %x... -Caut dosarul %x... +Both sides have changed since last synchronization. +Ambele părți s-au modificat de la ultima sincronizare. -Items processed: -Elemente Procesate: +Cannot determine sync-direction: +Nu pot determina sensul de sincronizare: -Items remaining: -Elemente Rămase: +No change since last synchronization. +Nu sînt schimbări de la ultima sincronizare. -Total time: -Timp Total: +The database entry is not in sync considering current settings. +Intrarea în baza de date nu e sincronizată, ținînd cont de setările curente. -Cannot set directory lock for %x. -Nu pot face zăvorîrea dosarului %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +Baza de date existentă va fi făcută compatibilă cu versiunea softului și apoi va fi setat sensul implicit de sincronizare: Filele vechi vor fi suprascrise de cele noi. -Show in Explorer -Arată în Exploratorul de File +Checking recycle bin availability for folder %x... +Verific dacă Reciclatorul e disponibil pentru dosarul %x... -Open with default application -Deschide cu Aplicația Implicită +Moving file %x to recycle bin +Mut fila %x în Reciclator -Browse directory -Explorează Dosarul +Moving folder %x to recycle bin +Mut dosarul %x în Reciclator -Abort requested: Waiting for current operation to finish... -Abandonare solicitată: Se așteaptă terminarea operației în curs... +Moving symbolic link %x to recycle bin +Mut legătura simbolică %x în Reciclator -Failure to create timestamp for versioning: -Crearea marcajului temporal pentru versionare a eșuat +Deleting file %x +Șterg fila %x -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronizare Inteligentă +Deleting folder %x +Șterg dosarul %x + +Deleting symbolic link %x +Șterg legătura simbolică %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Reciclatorul nu este disponibil pentru dosarele următoare. Filele șterse de acolo vor fi șterse în mod definitiv: + +An exception occurred +A apărut o excepție + +Cannot find file %x. +Nu pot găsi fila %x. Error Eroare -Selected variant: -Varianta selectată: +File %x does not contain a valid configuration. +Fila %x nu conține o configurație validă. -Select alternate comparison settings -Selectează setările alternative de comparare +A folder input field is empty. +Un cîmp de introducere a dosarului este gol. -Select alternate synchronization settings -Selectează o altă configurație a sincronizării +The corresponding folder will be considered as empty. +Dosarul corespondent va fi considerat ca fiind gol. -Filter is active -Filtrul de elemente este activ +Cannot find the following folders: +Nu pot găsi dosarele următoare: -No filter selected -Nu a fost selectat nici un filtru +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Poți ignora această eroare dacă vrei ca ambele dosare să fie considerate goale. Dosarele vor fi apoi create automat în timpul sincronizării. -Remove alternate settings -Înlătură setările alternative +The following folders have dependent paths. Be careful when setting up synchronization rules: +Dosarele următoare au căi dependente. Atenție la setarea regulilor de sincronizare: -Clear filter settings -Curăță Setările Filtrului +File %x has an invalid date. +Fila %x are o dată nevalidă. -Copy -Copiază +Date: +Dată: -Paste -Lipește +Files %x have the same date but a different size. +Filele %x au dată identică, dar mărime diferită. -Save as batch job -Salvează ca Sarcină Set +Size: +Mărime: -Comparison settings -Setările Comparării +Items differ in attributes only +Elementele diferă doar prin atributele lor -Synchronization settings -Setările Sincronizării +Resolving symbolic link %x +Rezolv legătura simbolică %x -About -Despre +Comparing content of files %x +Compar conținutul filelor %x -Confirm -Confirmare +Generating file list... +Generez lista de file... -Configure filter -Configurează Filtrul +Starting comparison +Pornesc compararea -Global settings -Setări Globale +Calculating sync directions... +Calculez acțiunile de sincronizare... -Find -Găsește +Out of memory. +Memorie epuizată. -Select time span -Selectează intervalul de timp +Item exists on left side only +Elementul există doar în partea stîngă -Invalid command line: -Linie de comandă nevalidă: +Item exists on right side only +Elementul există doar în partea dreaptă -Info -Informații +Left side is newer +Elementul din partea stîngă e mai nou -Warning -Atenție +Right side is newer +Elementul din partea dreaptă e mai nou -Fatal Error -Eroare Fatală +Items have different content +Elementele au conținut diferit -Error Code %x: -Cod de Eroare %x: +Both sides are equal +Ambele părți sînt identice -Cannot resolve symbolic link %x. -Nu pot rezolva legătura simbolică %x. +Conflict/item cannot be categorized +Conflictul/elementul nu poate fi inclus într-o anumită categorie - -1 Byte -%x Bytes - - -1 Bait -%x Baiți -%x de Baiți - +Copy new item to left +Copiază elementul nou în stînga -%x MB -%x MB +Copy new item to right +Copiază elementul nou în dreapta -%x KB -%x KB +Delete left item +Șterge elementul stîng -%x GB -%x GB +Delete right item +Șterge elementul drept + +Move file on left +Mută fila în stînga + +Move file on right +Mută fila în dreapta + +Overwrite left item +Suprascrie elementul stîng cu cel drept + +Overwrite right item +Suprascrie elementul drept cu cel stîng + +Do nothing +Nici o Acțiune + +Update attributes on left +Actualizează atributele în partea stîngă + +Update attributes on right +Actualizează atributele în partea dreaptă Database file %x is incompatible. Fila cu baza de date %x este incompatibilă. @@ -146,9 +172,6 @@ Database file is corrupt: Fila bazei de date este stricată (coruptă) -Out of memory! -Memorie epuizată! - Cannot write file %x. Nu pot scrie fila %x. @@ -158,8 +181,8 @@ Database files do not share a common session. Filele cu baze de date nu partajează o sesiune comună. -An exception occurred! -A apărut o excepție ! +Searching for folder %x... +Caut dosarul %x... Cannot read file attributes of %x. Nu pot citi atributele filei %x. @@ -183,9 +206,40 @@ Creating file %x Creez fila %x +Items processed: +Elemente Procesate: + +Items remaining: +Elemente Rămase: + +Total time: +Timp Total: + + +1 Byte +%x Bytes + + +1 Bait +%x Baiți +%x de Baiți + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Eroare la parsarea filei %x, rîndul %y, coloana %z. +Cannot set directory lock for %x. +Nu pot face zăvorîrea dosarului %x. + Scanning: Scanez: @@ -205,12 +259,18 @@ /sec /sec -File %x does not contain a valid configuration. -Fila %x nu conține o configurație validă. - Configuration file %x loaded partially only. Fila de configurație %x a fost deschisă doar parțial. +Show in Explorer +Arată în Exploratorul de File + +Open with default application +Deschide cu Aplicația Implicită + +Browse directory +Explorează Dosarul + Cannot access Volume Shadow Copy Service. Nu pot accesa Serviciul de Conservare a Volumelor [Volume Shadow Copy]. @@ -220,18 +280,21 @@ Cannot load file %x. Nu pot deschide fila %x. -Path %x does not contain a volume name. -Calea %x nu conține un nume de volum valid. +Cannot determine volume name for %x. +Nu pot determina numele volumului pentru %x. -Volume name %x not part of file name %y! -Numele volumului %x nu face parte din numele filei %y ! +Volume name %x not part of file name %y. +Numele volumului %x nu face parte din numele filei %y. + +Abort requested: Waiting for current operation to finish... +Abandonare solicitată: Se așteaptă terminarea operației în curs... + +Failure to create timestamp for versioning: +Crearea marcajului temporal pentru versionare a eșuat Cannot read the following XML elements: Nu pot citi următoarele elemente XML: -Cannot find file %x. -Nu pot găsi fila %x. - &Open... &Deschide... @@ -312,9 +375,18 @@ Comanda este declanșată dacă: Cancel Anulează +RealtimeSync - Automated Synchronization +RealtimeSync - Sincronizare Inteligentă + +Warning +Atenție + Build: %x Compilația: %x +About +Despre + All files Toate Filele @@ -324,29 +396,125 @@ Comanda este declanșată dacă: &Exit &Ieși -Monitoring active... -Monitorizare activă... - Waiting for missing directories... Aștept ca dosarele lipsă să devină disponibile... -A folder input field is empty. -Un cîmp de introducere a dosarului este gol. +Invalid command line: +Linie de comandă nevalidă: + +File content +Conținutul Filelor + +File time and size +Timpul și Mărimea Filelor + + Two way + Bidirecțională + +Mirror +Clonare + +Update +Actualizare + +Custom +Sincronizare Personalizată + +Multiple... +Multiplu... + +Moving file %x to %y +Mut fila %x în %y + +Moving folder %x to %y +Mut dosarul %x în %y + +Moving symbolic link %x to %y +Mut legătura simbolică %x în %y + +Removing old versions... +Înlătur versiunile vechi... + +Creating symbolic link %x +Creez legătura simbolică %x + +Creating folder %x +Creez dosarul %x + +Overwriting file %x +Suprascriu fila %x + +Overwriting symbolic link %x +Suprascriu legătura simbolică %x + +Verifying file %x +Verific fila %x + +Updating attributes of %x +Actualizez atributele lui %x + +Cannot find %x. +Nu pot găsi %x. + +Target folder %x already existing. +Dosarul țintă %x există deja. + +Target folder input field must not be empty. +Cîmpul de introducere a dosarului țintă nu trebuie să fie gol. + +Folder input field for versioning must not be empty. +Cîmpul de introducere a dosarului pentru versionare nu trebuie să fie gol. + +Source folder %x not found. +Dosarul sursă %x nu a fost găsit. + +The following items have unresolved conflicts and will not be synchronized: +Există conflicte nerezolvate la elementele listate mai jos, deci ele nu vor fi sincronizate: + +Significant difference detected: +Diferență semnificativă detectată: + +More than 50% of the total number of files will be copied or deleted. +Peste 50% din numărul total de file vor fi copiate sau distruse. + +Not enough free disk space available in: +Spațiu de stocare insuficient pe: -Synchronization aborted! -Sincronizare abandonată! +Required: +Necesar: -Synchronization completed with errors! -Sincronizare terminată cu erori! +Available: +Disponibil: -Synchronization completed with warnings. -Sincronizare realizată, dar cu avertismente. +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Va fi modificat un dosar care face parte din mai multe perechi de dosare. Reverifică setările de sincronizare. -Nothing to synchronize! -Nu e nimic de sincronizat! +Synchronizing folder pair: +Sincronizez perechea de dosare: + +Generating database... +Generez baza de date... + +Creating Volume Shadow Copy for %x... +Creez Conservare a Volumului [Volume Shadow Copy] pentru %x... -Synchronization completed successfully. -Sincronizare realizată cu succes. +Data verification error: %x and %y have different content. +Eroare la verificarea datelor: %x și %y au conținut diferit. + +Synchronization aborted +Sincronizare abandonată + +Synchronization completed with errors +Sincronizare terminată cu erori + +Synchronization completed with warnings +Sincronizare realizată, dar cu avertismente + +Nothing to synchronize +Nu e nimic de sincronizat + +Synchronization completed successfully +Sincronizare realizată cu succes Saving log file %x... Salvez fila jurnal %x... @@ -354,8 +522,8 @@ Comanda este declanșată dacă: Press "Switch" to resolve issues in FreeFileSync main dialog. Apasă "Comută" pentru a rezolva problemele din dialogul principal FreeFileSync. -Switching to FreeFileSync main dialog... -Comut la dialogul principal FreeFileSync... +Switching to FreeFileSync main dialog +Comut la dialogul principal FreeFileSync A new version of FreeFileSync is available: Este disponibilă o versiune nouă a softului: @@ -363,29 +531,29 @@ Comanda este declanșată dacă: Download now? Vrei s-o descarci acum ? -FreeFileSync is up to date! -Ai deja ultima versiune a softului! +New version found +A fost găsită o versiune nouă -Information -Informații +&Download +&Descarcă -Unable to connect to sourceforge.net! -Conectarea la situl sourceforge.net nu poate fi realizată! +FreeFileSync is up to date. +Ai deja ultima versiune a softului. -Current FreeFileSync version number was not found online! Do you want to check manually? -Numărul versiunii curente de FreeFileSync nu a fost găsit pe internet! Vrei să verifici manual? +Information +Informații -Do you want FreeFileSync to automatically check for updates every week? -Vrei ca FreeFileSync să caute automat actualizări în fiecare săptămînă ? +Unable to connect to sourceforge.net. +Conectarea la situl sourceforge.net nu poate fi realizată. -(Requires an Internet connection!) -(Necesită o conexiune la internet!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Nu pot afla numărul versiunii FreeFileSync disponibile acum pe internet. Vrei să-l cauți manual? - - +Symlink +Simlegătură - - +Folder +Dosar Full path Cale Completă @@ -408,18 +576,12 @@ Comanda este declanșată dacă: Extension Extensie -Size: -Mărime: - -Date: -Dată: +Category +Categorie Action Acțiune -Category -Categorie - Drag && drop Trage și pune un dosar mai jos sau explorează către el @@ -438,6 +600,33 @@ Comanda este declanșată dacă: Hibernate Pune Calculatorul în Hibernare +Selected variant: +Varianta selectată: + +Select alternate comparison settings +Selectează setările alternative de comparare + +Select alternate synchronization settings +Selectează o altă configurație a sincronizării + +Filter is active +Filtrul de elemente este activ + +No filter selected +Nu a fost selectat nici un filtru + +Remove alternate settings +Înlătură setările alternative + +Clear filter settings +Curăță Setările Filtrului + +Copy +Copiază + +Paste +Lipește + &New Configurație &Nouă @@ -456,14 +645,14 @@ Comanda este declanșată dacă: &Language &Limbă -&Global settings... -&Setări Globale... - &Export file list... &Exportă Lista de File... -&Advanced -&Avansate +&Global settings... +&Setări Globale... + +&Tools +&Unelte &Check now &Caută Acum @@ -471,12 +660,18 @@ Comanda este declanșată dacă: Check &automatically once a week Caută &Automat în Fiecare Săptămînă -Check for new version -Caută Versiune Nouă +Check for new &version +Caută &Versiune Nouă Compare Compară +Comparison settings +Setările Comparării + +Synchronization settings +Setările Sincronizării + Synchronize Sincronizează @@ -489,6 +684,9 @@ Comanda este declanșată dacă: Swap sides Schimbă compartimentele stîng și drept între ele +Save as batch job +Salvează ca Sarcină Set + Hide excluded items Ascunde elementele excluse @@ -531,53 +729,8 @@ Comanda este declanșată dacă: &Pause &Pauzează -Batch job -Sarcină Set - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Automatizează sincronizarea prin crearea unei file set [batch file]. Pentru efectuarea sincronizării, dublu-clichează această filă sau programează sarcina următoare în Planificatorul de Sarcini [Task Scheduler] al SO: FreeFileSync.exe .ffs_batch - -Help -Ajutor - -Error handling -Gestionarea Erorilor - -Ignore -Ignorare - -Hide all error and warning messages -Mesajele de eroare și de avertizare nu sînt arătate - -Pop-up -Popîc - -Show pop-up on errors or warnings -În caz de erori sau avertizări este arătată o fereastră popîc [popup] - -Exit -Ieșire - -Abort synchronization on first error -Sincronizarea e abandonată la prima eroare - -Show progress dialog -Arată progresul sincronizării - -Save log -Salvează jurnalul acțiunilor - -Select folder to save log files -Selectează dosarul cu filele jurnal - -Limit -Limită - -Limit maximum number of log files -Limitează numărul maxim de file jurnal - -Select variant -Selectează varianta dorită +Select a variant +Selectează o variantă Files are found equal if @@ -592,9 +745,6 @@ Filele sînt considerate identice dacă sînt aceleași -File time and size -Timpul și Mărimea Filelor - Files are found equal if - file content @@ -606,39 +756,42 @@ Filele sînt considerate identice dacă este același -File content -Conținutul Filelor - Symbolic Link handling Gestionarea Legăturilor Simbolice +Help +Ajutor + OK OK -<- Two way -> -<= Bidirecțională => - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identificare și propagare a modificărilor din ambele părți. Ștergerile, renumirile și conflictele sînt detectate automat, folosind o bază de date. -Mirror ->> -Clonare =>> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Conservare [backup] în oglindă a dosarului stîng. Dosarul drept e modificat pentru a fi identic după sincronizare cu cel stîng. -Update -> -Actualizare => - Copy new or updated files to right folder. Copiere în dosarul din dreapta a filelor actualizate sau noi. -Custom -Sincronizare Personalizată - Configure your own synchronization rules. Reguli de sincronizare definite de utilizator pentru fiecare situație. +Error handling +Gestionarea Erorilor + +Ignore +Ignorare + +Hide all error and warning messages +Mesajele de eroare și de avertizare nu sînt arătate + +Pop-up +Popîc + +Show pop-up on errors or warnings +În caz de erori sau avertizări este arătată o fereastră popîc [popup] + Deletion handling Gestionarea Ștergerii @@ -663,23 +816,32 @@ este același Naming convention: Convenție de numire: -Item exists on left side only -Elementul există doar în partea stîngă +Batch job +Sarcină Set + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Automatizează sincronizarea prin crearea unei file set [batch file]. Pentru efectuarea sincronizării, dublu-clichează această filă sau programează sarcina următoare în Planificatorul de Sarcini [Task Scheduler] al SO: FreeFileSync.exe .ffs_batch + +Exit +Ieșire + +Abort synchronization on first error +Sincronizarea e abandonată la prima eroare -Item exists on right side only -Elementul există doar în partea dreaptă +Show progress dialog +Arată progresul sincronizării -Left side is newer -Elementul din partea stîngă e mai nou +Save log +Salvează jurnalul acțiunilor -Right side is newer -Elementul din partea dreaptă e mai nou +Select folder to save log files +Selectează dosarul cu filele jurnal -Items have different content -Elementele au conținut diferit +Limit +Limită -Conflict/item cannot be categorized -Conflictul/elementul nu poate fi inclus într-o anumită categorie +Limit maximum number of log files +Limitează numărul maxim de file jurnal Source code written in C++ using: Cod sursă scris în C++ folosind: @@ -699,9 +861,6 @@ este același Homepage Situl Softului -FreeFileSync at Sourceforge -FreeFileSync la Sourceforge - Email Adresa Autorului @@ -716,11 +875,11 @@ este același Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Doar filele care se potrivesc cu toate setările de filtrare vor fi sincronizate. -Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! +Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină). Include @@ -744,6 +903,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! &Clear &Curăță +Global settings +Setări Globale + Fail-safe file copy Copiază filele în modul protejat la eșec [fail-safe] @@ -774,9 +936,6 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! &Default Coloanele &Implicite -Start synchronization -Pornește Sincronizarea - Variant Varianta Sincronizării @@ -795,8 +954,20 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! &Find next &Găsește Următorul -Main bar -Bara Principală +Delete +Șterge + +Configure filter +Configurează Filtrul + +Start synchronization +Pornește Sincronizarea + +Find +Găsește + +Select time span +Selectează intervalul de timp Folder pairs Perechi de Dosare @@ -807,6 +978,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Configuration Configurație +Main bar +Bara Principală + Filter files Filtru @@ -864,11 +1038,8 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Exclude via filter: Exclude prin Filtru: - - - -Delete -Șterge +multiple selection +selectare multiplă Include all Include Tot @@ -897,14 +1068,14 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Show "%x" Arată "%x" - - +Last session +Ultima Sesiune Folder Comparison and Synchronization Comparare și Sincronizare de Dosare -Configuration saved! -Configurație salvată ! +Configuration saved +Configurație salvată FreeFileSync batch Set FreeFileSync @@ -918,9 +1089,6 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Never save changes Nu salva niciodată modificările -Configuration loaded! -Configurație deschisă ! - Show files that exist on left side only Arată filele care există doar în stînga @@ -966,20 +1134,17 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Set as default Setează ca implicit -Operation aborted! -Operație abandonată! +Operation aborted +Operație abandonată -All folders are in sync! -Toate dosarele sînt sincronizate! +All folders are in sync +Toate dosarele sînt sincronizate Comma separated list Listă de elemente separate prin virgulă -Legend -Legendă - -File list exported! -Lista de file a fost exportată! +File list exported +Lista de file a fost exportată Searching for program updates... Caut actualizări ale programului... @@ -990,6 +1155,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! &Ignore &OK +Fatal Error +Eroare Fatală + Don't show this warning again Nu arăta această atenționare din nou @@ -1011,6 +1179,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Comparing content... Compar conținutul... +Info +Informații + Paused Sincronizare Pauzată @@ -1115,18 +1286,18 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Leave as unresolved conflict Lasă ca Conflict Nerezolvat -Time stamp -Marcaj Temporal - -Append a timestamp to each file name -Adaugă un marcaj temporal la numele fiecărei file - Replace Înlocuiește Move files and replace if existing Mută filele și înlocuiește-le pe cele existente +Time stamp +Marcaj Temporal + +Append a timestamp to each file name +Adaugă un marcaj temporal la numele fiecărei file + Folder Dosar @@ -1169,9 +1340,6 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Cannot write modification time of %x. Nu pot scrie modificarea timpului pentru %x. -Cannot find system function %x. -Nu pot găsi funcția de sistem %x. - Cannot read security context of %x. Nu pot citi contextul de securitate pentru %x. @@ -1187,8 +1355,11 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Cannot create directory %x. Nu pot crea dosarul %x. -Cannot copy symbolic link %x to %y. -Nu pot copia legătura simbolică %x în %y. +Cannot create symbolic link %x. +Nu pot crea legătura simbolică %x. + +Cannot find system function %x. +Nu pot găsi funcția de sistem %x. Cannot copy file %x to %y. Nu pot copia fila %x în %y. @@ -1196,15 +1367,15 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Type of item %x is not supported: Tipul de element %x nu e suportat: +Cannot resolve symbolic link %x. +Nu pot rezolva legătura simbolică %x. + Cannot open directory %x. Nu pot deschide dosarul %x. Cannot enumerate directory %x. Nu pot enumera dosarul %x. -Detected endless directory recursion. -A fost detectată o recursivitate infinită a dosarului. - %x TB %x TB @@ -1241,6 +1412,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! %x de zile +Failed to register to receive system messages. +Eșec al înregistrării pentru primirea mesajelor de sistem. + Cannot set privilege %x. Nu pot seta privilegiul %x. @@ -1250,204 +1424,12 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)! Cannot change process I/O priorities. Nu pot schimba prioritățile I/O ale procesului. -Unable to move %x to the Recycle Bin! -Nu pot muta %x în Reciclator! - -Both sides have changed since last synchronization! -Ambele părți s-au modificat de la ultima sincronizare! - -Cannot determine sync-direction: -Nu pot determina sensul de sincronizare: - -No change since last synchronization! -Nu sînt schimbări de la ultima sincronizare! - -The corresponding database entries are not in sync considering current settings. -Intrările corespondente din baza de date nu sînt considerate sincronizate, avînd în vedere setările curente. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Baza de date existentă va fi făcută compatibilă cu versiunea softului și apoi va fi setat sensul implicit de sincronizare: Filele vechi vor fi suprascrise de cele noi. - -Checking recycle bin availability for folder %x... -Verific dacă Reciclatorul e disponibil pentru dosarul %x... - -Moving file %x to recycle bin -Mut fila %x în Reciclator - -Moving folder %x to recycle bin -Mut dosarul %x în Reciclator - -Moving symbolic link %x to recycle bin -Mut legătura simbolică %x în Reciclator - -Deleting file %x -Șterg fila %x - -Deleting folder %x -Șterg dosarul %x - -Deleting symbolic link %x -Șterg legătura simbolică %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Reciclatorul nu este disponibil pentru căile următoare! Filele de acolo care trebuie șterse ca urmare a sincronizării, vor fi deci șterse definitiv: - -The corresponding folder will be considered as empty. -Dosarul corespondent va fi considerat ca fiind gol. - -Cannot find the following folders: -Nu pot găsi dosarele următoare: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Poți ignora această eroare dacă vrei ca ambele dosare să fie considerate goale. Dosarele vor fi apoi create automat în timpul sincronizării. - -Directories are dependent! Be careful when setting up synchronization rules: -Dosarele sînt interdependente! Atenție la setarea regulilor de sincronizare: - -Start comparison -Pornește compararea - -Calculating sync directions... -Calculez acțiunile de sincronizare... - -Conflict detected: -Conflict detectat: - -File %x has an invalid date! -Fila %x are o dată nevalidă ! - -Files %x have the same date but a different size! -Filele %x au dată identică, dar mărime diferită! - -Items differ in attributes only -Elementele diferă doar prin atributele lor - -Symbolic links %x have the same date but a different target. -Legăturile simbolice %x au aceeași dată, dar ținte diferite. - -Comparing content of files %x -Compar conținutul filelor %x - -Comparing files by content failed. -Compararea filelor după conținut a eșuat. - -Generating file list... -Generez lista de file... - -Both sides are equal -Ambele părți sînt identice - -Copy new item to left -Copiază elementul nou în stînga - -Copy new item to right -Copiază elementul nou în dreapta - -Delete left item -Șterge elementul stîng - -Delete right item -Șterge elementul drept - -Move file on left -Mută fila în stînga - -Move file on right -Mută fila în dreapta - -Overwrite left item -Suprascrie elementul stîng cu cel drept - -Overwrite right item -Suprascrie elementul drept cu cel stîng - -Do nothing -Nici o Acțiune - -Update attributes on left -Actualizează atributele în partea stîngă - -Update attributes on right -Actualizează atributele în partea dreaptă - -Multiple... -Multiplu... - -Moving file %x to %y -Mut fila %x în %y - -Moving folder %x to %y -Mut dosarul %x în %y - -Moving symbolic link %x to %y -Mut legătura simbolică %x în %y +Unable to move %x to the Recycle Bin. +Nu pot muta %x în Reciclator. -Removing old versions... -Înlătur versiunile vechi... - -Creating symbolic link %x -Creez legătura simbolică %x - -Creating folder %x -Creez dosarul %x - -Overwriting file %x -Suprascriu fila %x - -Overwriting symbolic link %x -Suprascriu legătura simbolică %x - -Verifying file %x -Verific fila %x - -Updating attributes of %x -Actualizez atributele lui %x - -Cannot find %x. -Nu pot găsi %x. - -Target folder %x already existing. -Dosarul țintă %x există deja. - -Target folder input field must not be empty. -Cîmpul de introducere a dosarului țintă nu trebuie să fie gol. - -Folder input field for versioning must not be empty. -Cîmpul de introducere a dosarului pentru versionare nu trebuie să fie gol. +Cannot determine final path for %x. +Nu pot determina calea finală pentru %x. -Source folder %x not found. -Dosarul sursă %x nu a fost găsit. - -The following items have unresolved conflicts and will not be synchronized: -Există conflicte nerezolvate la elementele listate mai jos, deci ele nu vor fi sincronizate: - -Significant difference detected: -Diferență semnificativă detectată: - -More than 50% of the total number of files will be copied or deleted! -Peste 50% din numărul total de file vor fi copiate sau distruse! - -Not enough free disk space available in: -Spațiu de stocare insuficient pe: - -Required: -Necesar: - -Available: -Disponibil: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Va fi modificat un dosar care face parte din mai multe perechi de dosare! Reverifică setările de sincronizare! - -Synchronizing folder pair: -Sincronizez perechea de dosare: - -Generating database... -Generez baza de date... - -Creating Volume Shadow Copy for %x... -Creez Conservare a Volumului [Volume Shadow Copy] pentru %x... - -Data verification error: Source and target file have different content! -Eroare la verificarea datelor: Filele sursă și țintă au conținut diferit! +Error Code %x: +Cod de Eroare %x: diff --git a/BUILD/Languages/russian.lng b/BUILD/Languages/russian.lng index 8a9ef592..4d7b5f09 100644 --- a/BUILD/Languages/russian.lng +++ b/BUILD/Languages/russian.lng @@ -1,138 +1,167 @@
- Pусский + Pусский Fayzullin T.N. aka Svobodniy ru_RU - russia.png - 3 - n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<11 || n%100>14) ? 1 : 2 + flag_russia.png + 3 + n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<11 || n%100>14) ? 1 : 2
-Searching for folder %x... -Поиск папки %x... +Both sides have changed since last synchronization. +Со времени последней синхронизации с обеих сторон произошли изменения. -Items processed: -Элементов обработано: +Cannot determine sync-direction: +Невозможно определить направление синхронизации: -Items remaining: -Элементов осталось: +No change since last synchronization. +Никаких изменений с последней синхронизации. -Total time: -Общее время: +The database entry is not in sync considering current settings. +Запись в базе данных не находится в состоянии синхронизации, учитывая текущие настройки. -Cannot set directory lock for %x. -Невозможно установить блокировку папки для %x. +Setting default synchronization directions: Old files will be overwritten with newer files. + +Настройка направления синхронизации по умолчанию: +Старые файлы будут заменены более новыми файлами. + -Show in Explorer -Показать в Проводнике +Checking recycle bin availability for folder %x... +Проверка доступности "Корзины" для папки %x... -Open with default application -Открыть с помощью приложения по умолчанию +Moving file %x to recycle bin +Перемещение файла %x в "Корзину" -Browse directory -Обзор папок +Moving folder %x to recycle bin +Перемещение папки %x в "Корзину" -Abort requested: Waiting for current operation to finish... -Запрос отмены: Ожидайте, пока текущая операция завершится... +Moving symbolic link %x to recycle bin +Перемещение символьной ссылки %x в "Корзину" -Failure to create timestamp for versioning: -Неспособность создать отметку времени для архивации файлов: +Deleting file %x +Удаление файла %x -RealtimeSync - Automated Synchronization -RealtimeSync - Автоматическая синхронизация +Deleting folder %x +Удаление папки %x + +Deleting symbolic link %x +Удаление символьной ссылки %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Для этого пути "Корзина" недоступна! Файлы будут удалены безвозвратно: + +An exception occurred +Исключение произошло + +Cannot find file %x. +Невозможно найти файл %x. Error Ошибка -Selected variant: -Выбранный вариант: +File %x does not contain a valid configuration. +Файл %x не содержит действительной конфигурации. -Select alternate comparison settings -Выбрать альтернативные настройки сравнения +A folder input field is empty. +Поле ввода папки пустое. -Select alternate synchronization settings -Выбрать альтернативные настройки синхронизации +The corresponding folder will be considered as empty. +Соответствующая папка будет считаться пустой. -Filter is active -Фильтр активен +Cannot find the following folders: +Невозможно найти следующие папки: -No filter selected -Ни один фильтр не выбран +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Вы можете проигнорировать эту ошибку, приняв каждую папку за пустую. При этом папки будут созданы автоматически во время синхронизации. -Remove alternate settings -Удалить альтернативные настройки +The following folders have dependent paths. Be careful when setting up synchronization rules: +Следующие папки имеют зависимые пути. Будьте осторожны при настройке правил синхронизации: -Clear filter settings -Очистить настройки фильтра +File %x has an invalid date. +Файл %x имеет недействительную дату. -Copy -Копировать +Date: +Дата: -Paste -Вставить +Files %x have the same date but a different size. +Файлы %x имеют одинаковую дату, но различаются по размеру. -Save as batch job -Сохранить как пакетное задание +Size: +Размер: -Comparison settings -Настройки сравнения +Items differ in attributes only +Элементы различаются только атрибутами -Synchronization settings -Настройки синхронизации +Resolving symbolic link %x +Разрешение символьной ссылки %x -About -О программе +Comparing content of files %x +Сравнение содержания файлов %x -Confirm -Подтвердить +Generating file list... +Создание списка файлов... -Configure filter -Настройки фильтра +Starting comparison +Начать сравнение -Global settings -Глобальные настройки +Calculating sync directions... +Расчет направлений синхронизации... -Find -Найти +Out of memory. +Недостаточно памяти. -Select time span -Выберите промежуток времени +Item exists on left side only +Элемент существует только на левой стороне -Invalid command line: -Неверная командная строка: +Item exists on right side only +Элемент существует только на правой стороне -Info -Информация +Left side is newer +На левой стороне новее -Warning -Внимание +Right side is newer +На правой стороне новее -Fatal Error -Критическая ошибка +Items have different content +Элемент имеют различное содержание -Error Code %x: -Код ошибки %x: +Both sides are equal +Обе стороны равны -Cannot resolve symbolic link %x. -Невозможно разрешить символьную ссылку %x. +Conflict/item cannot be categorized +Конфликт/элемент невозможно отнести к какой-либо категории - -1 Byte -%x Bytes - - -%x Байт -%x Байта -%x Байт - +Copy new item to left +Скопировать новый элемент налево -%x MB -%x МБ +Copy new item to right +Скопировать новый элемент направо -%x KB -%x КБ +Delete left item +Удалить элемент слева -%x GB -%x ГБ +Delete right item +Удалить элемент справа + +Move file on left +Переместить файл налево + +Move file on right +Переместить файл направо + +Overwrite left item +Перезаписать элемент слева + +Overwrite right item +Перезаписать элемент справа + +Do nothing +Ничего не делать + +Update attributes on left +Обновление атрибутов слева + +Update attributes on right +Обновление атрибутов справа Database file %x is incompatible. Файл базы данных %x несовместим. @@ -146,9 +175,6 @@ Database file is corrupt: Файл базы данных поврежден: -Out of memory! -Недостаточно памяти! - Cannot write file %x. Невозможно записать файл %x. @@ -158,8 +184,8 @@ Database files do not share a common session. Файлы баз данных не имеют общей сессии. -An exception occurred! -Исключение произошло! +Searching for folder %x... +Поиск папки %x... Cannot read file attributes of %x. Невозможно прочитать атрибуты файла %x. @@ -183,9 +209,40 @@ Creating file %x Создание файла %x +Items processed: +Элементов обработано: + +Items remaining: +Элементов осталось: + +Total time: +Общее время: + + +1 Byte +%x Bytes + + +%x Байт +%x Байта +%x Байт + + +%x MB +%x МБ + +%x KB +%x КБ + +%x GB +%x ГБ + Error parsing file %x, row %y, column %z. Ошибка при разборе файла %x, строка %y, колонка %z. +Cannot set directory lock for %x. +Невозможно установить блокировку папки для %x. + Scanning: Сканирую: @@ -205,12 +262,18 @@ /sec -File %x does not contain a valid configuration. -Файл %x не содержит действительной конфигурации. - Configuration file %x loaded partially only. Файл конфигурации %x загрузился частично. +Show in Explorer +Показать в Проводнике + +Open with default application +Открыть с помощью приложения по умолчанию + +Browse directory +Обзор папок + Cannot access Volume Shadow Copy Service. Невозможно получить доступ к службе Теневого Копирования Тома. @@ -220,18 +283,21 @@ Cannot load file %x. Невозможно загрузить файл %x. -Path %x does not contain a volume name. -Путь %x не содержит имя тома. +Cannot determine volume name for %x. +Невозможно определить имя тома для %x. + +Volume name %x not part of file name %y. +Имя тома %x не является частью имени файла %y. + +Abort requested: Waiting for current operation to finish... +Запрос отмены: Ожидайте, пока текущая операция завершится... -Volume name %x not part of file name %y! -Имя тома %x не является частью имени файла %y! +Failure to create timestamp for versioning: +Неспособность создать отметку времени для архивации файлов: Cannot read the following XML elements: Невозможно прочитать следующие XML элементы: -Cannot find file %x. -Невозможно найти файл %x. - &Open... &Открыть... @@ -312,9 +378,18 @@ The command is triggered if: Cancel Отмена +RealtimeSync - Automated Synchronization +RealtimeSync - Автоматическая синхронизация + +Warning +Внимание + Build: %x сборка %x +About +О программе + All files Все файлы @@ -324,29 +399,125 @@ The command is triggered if: &Exit &Выход -Monitoring active... -Наблюдение включено... - Waiting for missing directories... Ожидание пропущенных папок... -A folder input field is empty. -Поле ввода папки пустое. +Invalid command line: +Неверная командная строка: + +File content +Содержимое файла + +File time and size +Дата и размер файла + + Two way + В обе стороны + +Mirror +Зеркало + +Update +Обновить + +Custom +Выборочно + +Multiple... +Различные варианты синхронизации + +Moving file %x to %y +Перемещение файла %x в %y + +Moving folder %x to %y +Перемещение папки %x в %y + +Moving symbolic link %x to %y +Перемещение символьной ссылки %x в %y + +Removing old versions... +Удаление старых версий... + +Creating symbolic link %x +Создание символьной ссылки %x + +Creating folder %x +Создание папки %x + +Overwriting file %x +Перезапись файла %x + +Overwriting symbolic link %x +Перезапись символьной ссылки %x + +Verifying file %x +Проверка файла %x + +Updating attributes of %x +Обновление атрибутов %x + +Cannot find %x. +Невозможно найти %x. + +Target folder %x already existing. +Целевая папка %x уже существует. + +Target folder input field must not be empty. +Поле ввода целевой папки не должно быть пустым. + +Folder input field for versioning must not be empty. +Поле ввода папки для архивации файлов не должно быть пустым. + +Source folder %x not found. +Исходная папка %x не найдена. + +The following items have unresolved conflicts and will not be synchronized: +Следующие элементы имеют неурегулированные конфликты и не будут синхронизированы: + +Significant difference detected: +Обнаружено существенное различие: + +More than 50% of the total number of files will be copied or deleted. +Более 50% общего количества файлов будет скопировано или удалено. + +Not enough free disk space available in: +Не достаточно свободного места в: + +Required: +Требуется: + +Available: +Доступно: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Папка, входящая в несколько пар папок, будет изменена. Пожалуйста, проверьте настройки синхронизации. + +Synchronizing folder pair: +Синхронизация пары папок: + +Generating database... +Создание базы данных... -Synchronization aborted! -Синхронизация отменена! +Creating Volume Shadow Copy for %x... +Создание Тома Теневого Копирования для %x... + +Data verification error: %x and %y have different content. +Ошибка проверки данных: %x и %y имеют разное содержание! + +Synchronization aborted +Синхронизация отменена -Synchronization completed with errors! -Синхронизация завершена. В процессе синхронизации возникли ошибки! +Synchronization completed with errors +Синхронизация завершена. В процессе синхронизации возникли ошибки -Synchronization completed with warnings. -Синхронизация завершена. В процессе синхронизации возникли проблемы. +Synchronization completed with warnings +Синхронизация завершена. В процессе синхронизации возникли проблемы -Nothing to synchronize! -Ничего нет для синхронизации! +Nothing to synchronize +Ничего нет для синхронизации -Synchronization completed successfully. -Синхронизация завершена успешно. +Synchronization completed successfully +Синхронизация завершена успешно Saving log file %x... Сохранение лог-файла %x... @@ -354,8 +525,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. Нажмите "Переключить" для продолжения работы в главном окне FreeFileSync. -Switching to FreeFileSync main dialog... -Переключение на главное окно FreeFileSync... +Switching to FreeFileSync main dialog +Переключение на главное окно FreeFileSync A new version of FreeFileSync is available: Доступна новая версия FreeFileSync: @@ -363,29 +534,29 @@ The command is triggered if: Download now? Загрузить сейчас? -FreeFileSync is up to date! -У Вас самая последняя версия FreeFileSync! +New version found +Найдена новая версия -Information -Информация +&Download +&Загрузить -Unable to connect to sourceforge.net! -Невозможно соединиться с sourceforge.net! +FreeFileSync is up to date. +У Вас самая последняя версия FreeFileSync. -Current FreeFileSync version number was not found online! Do you want to check manually? -Текущая версия FreeFileSync не была найдена онлайн! Вы хотите проверить вручную? +Information +Информация -Do you want FreeFileSync to automatically check for updates every week? -Вы хотите, чтобы FreeFileSync автоматически проверял наличие обновлений каждую неделю? +Unable to connect to sourceforge.net. +Невозможно соединиться с sourceforge.net. -(Requires an Internet connection!) -(требуется подключение к Интернету!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Невозможно найти номер текущей версии FreeFileSync онлайн! Вы хотите проверить вручную? - -<Символьная ссылка> +Symlink +Символьная ссылка - -<Папка> +Folder +Папка Full path Полный путь @@ -408,18 +579,12 @@ The command is triggered if: Extension Расширение -Size: -Размер: - -Date: -Дата: +Category +Категория Action Действие -Category -Категория - Drag && drop Drag && drop @@ -438,6 +603,33 @@ The command is triggered if: Hibernate Гибернация +Selected variant: +Выбранный вариант: + +Select alternate comparison settings +Выбрать альтернативные настройки сравнения + +Select alternate synchronization settings +Выбрать альтернативные настройки синхронизации + +Filter is active +Фильтр активен + +No filter selected +Ни один фильтр не выбран + +Remove alternate settings +Удалить альтернативные настройки + +Clear filter settings +Очистить настройки фильтра + +Copy +Копировать + +Paste +Вставить + &New &Новая @@ -456,14 +648,14 @@ The command is triggered if: &Language &Язык -&Global settings... -&Глобальные настройки... - &Export file list... &Экспортировать список файлов... -&Advanced -&Дополнительно +&Global settings... +&Глобальные настройки... + +&Tools +&Опции &Check now &Проверить сейчас @@ -471,12 +663,18 @@ The command is triggered if: Check &automatically once a week Проверять &автоматически раз в неделю -Check for new version -Проверка обновлений +Check for new &version +&Проверка обновлений Compare Сравнить +Comparison settings +Настройки сравнения + +Synchronization settings +Настройки синхронизации + Synchronize Синхронизировать @@ -489,6 +687,9 @@ The command is triggered if: Swap sides Поменять направление +Save as batch job +Сохранить как пакетное задание + Hide excluded items Скрыть исключенные элементы @@ -531,52 +732,7 @@ The command is triggered if: &Pause &Пауза -Batch job -Пакетное задание - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Создайте файл пакетного задания для автоматической синхронизации. Для запуска дважды кликните на файле или создайте расписание в планировщике вашей системы: FreeFileSync.exe <название>.ffs_batch - -Help -Помощь - -Error handling -Обработка ошибок - -Ignore -Игнорировать - -Hide all error and warning messages -Скрывать все ошибки и сообщения с предупреждениями - -Pop-up -Всплывающие окна - -Show pop-up on errors or warnings -Показывать всплывающие окна при ошибках и предупреждениях - -Exit -Выход - -Abort synchronization on first error -Отменить синхронизацию при первой ошибке - -Show progress dialog -Показать окно прогресса - -Save log -Сохранить лог-файл - -Select folder to save log files -Выберите папку для сохранения лог-файлов - -Limit -Ограничение - -Limit maximum number of log files -Ограничить максимальное количество лог-файлов - -Select variant +Select a variant Выберите вариант @@ -591,9 +747,6 @@ are the same - размер файла -File time and size -Дата и размер файла - Files are found equal if - file content @@ -601,39 +754,42 @@ is the same Файлы считаются равными, если содержание файлов одинаковое -File content -Содержимое файла - Symbolic Link handling Обращение к символьной ссылке +Help +Помощь + OK OK -<- Two way -> -<= В обе стороны => - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Выявление и распространение изменений на обе стороны. Удаленные, перемещенные и конфликтующие файлы определяются автоматически с использованием базы данных. -Mirror ->> -Зеркало =>> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Зеркальная (резервная) копия левой части. В результате синхронизации правая сторона будет изменена до полного соответствия с левой. -Update -> -Обновить => - Copy new or updated files to right folder. Копировать новые или обновлять файлы на правой стороне. -Custom -Выборочно - Configure your own synchronization rules. Настроить свои собственные правила синхронизации. +Error handling +Обработка ошибок + +Ignore +Игнорировать + +Hide all error and warning messages +Скрывать все ошибки и сообщения с предупреждениями + +Pop-up +Всплывающие окна + +Show pop-up on errors or warnings +Показывать всплывающие окна при ошибках и предупреждениях + Deletion handling Настройки удаления @@ -658,23 +814,32 @@ is the same Naming convention: Условие переименования: -Item exists on left side only -Элемент существует только на левой стороне +Batch job +Пакетное задание + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Создайте файл пакетного задания для автоматической синхронизации. Для запуска дважды кликните на файле или создайте расписание в планировщике вашей системы: FreeFileSync.exe <название>.ffs_batch + +Exit +Выход + +Abort synchronization on first error +Отменить синхронизацию при первой ошибке -Item exists on right side only -Элемент существует только на правой стороне +Show progress dialog +Показать окно прогресса -Left side is newer -На левой стороне новее +Save log +Сохранить лог-файл -Right side is newer -На правой стороне новее +Select folder to save log files +Выберите папку для сохранения лог-файлов -Items have different content -Элемент имеют различное содержание +Limit +Ограничение -Conflict/item cannot be categorized -Конфликт/элемент невозможно отнести к какой-либо категории +Limit maximum number of log files +Ограничить максимальное количество лог-файлов Source code written in C++ using: Исходный код написан на C++ с использованием: @@ -694,9 +859,6 @@ is the same Homepage Оф.сайт -FreeFileSync at Sourceforge -FreeFileSync на Sourceforge - Email Почта @@ -711,11 +873,11 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Только файлы, соответствующие всем настройкам фильтра, будут синхронизированы. -Примечание: Файлы должны относиться к синхронизируемым папкам! +Примечание: Файлы должны относиться к синхронизируемым папкам. Include @@ -739,6 +901,9 @@ Note: File names must be relative to base directories! &Clear &Очистить +Global settings +Глобальные настройки + Fail-safe file copy Отказоустойчивое копирование файла @@ -769,9 +934,6 @@ Note: File names must be relative to base directories! &Default &По умолчанию -Start synchronization -Начать синхронизацию - Variant Вариант @@ -790,8 +952,20 @@ Note: File names must be relative to base directories! &Find next &Найти далее -Main bar -Главная панель +Delete +Удалить + +Configure filter +Настройки фильтра + +Start synchronization +Начать синхронизацию + +Find +Найти + +Select time span +Выберите промежуток времени Folder pairs Пары папок для синхронизации @@ -802,6 +976,9 @@ Note: File names must be relative to base directories! Configuration Настройки +Main bar +Главная панель + Filter files Фильтр @@ -859,11 +1036,8 @@ Note: File names must be relative to base directories! Exclude via filter: Исключить через фильтр: - -<групповое выделение> - -Delete -Удалить +multiple selection +групповое выделение Include all Включить все @@ -892,14 +1066,14 @@ Note: File names must be relative to base directories! Show "%x" Показать "%x" - -<Последняя сессия> +Last session +Последняя сессия Folder Comparison and Synchronization Сравнение и синхронизация -Configuration saved! -Настройки синхронизации сохранены! +Configuration saved +Настройки синхронизации сохранены FreeFileSync batch Пакетное задание FreeFileSync @@ -913,9 +1087,6 @@ Note: File names must be relative to base directories! Never save changes Никогда не сохранять изменения -Configuration loaded! -Настройки синхронизации загружены! - Show files that exist on left side only Показать файлы, существующие только слева @@ -961,20 +1132,17 @@ Note: File names must be relative to base directories! Set as default Установить по умолчанию -Operation aborted! -Операция отменена! +Operation aborted +Операция отменена -All folders are in sync! -Все папки синхронизированы! +All folders are in sync +Все папки синхронизированы Comma separated list Список, разделяемый запятыми -Legend -Легенда - -File list exported! -Список файлов экспортирован! +File list exported +Список файлов экспортирован Searching for program updates... Проверка обновлений программы... @@ -985,6 +1153,9 @@ Note: File names must be relative to base directories! &Ignore &Игнорировать +Fatal Error +Критическая ошибка + Don't show this warning again Больше не показывать это предупреждение @@ -1006,6 +1177,9 @@ Note: File names must be relative to base directories! Comparing content... Сравнение содержания... +Info +Информация + Paused Пауза @@ -1113,18 +1287,18 @@ Note: File names must be relative to base directories! Leave as unresolved conflict Оставить как нерешенный конфликт -Time stamp -Добавить отметку времени - -Append a timestamp to each file name -Добавить отметку времени для каждого имени файла - Replace Без переименования Move files and replace if existing Переместить файлы и заменить, если существуют +Time stamp +Добавить отметку времени + +Append a timestamp to each file name +Добавить отметку времени для каждого имени файла + Folder Папка @@ -1167,9 +1341,6 @@ Note: File names must be relative to base directories! Cannot write modification time of %x. Невозможно записать время модификации файла %x. -Cannot find system function %x. -Невозможно найти системную функцию %x. - Cannot read security context of %x. Невозможно прочитать контекст безобасности %x. @@ -1185,8 +1356,11 @@ Note: File names must be relative to base directories! Cannot create directory %x. Невозможно создать папку %x. -Cannot copy symbolic link %x to %y. -Невозможно скопировать символьную ссылку %x в %y. +Cannot create symbolic link %x. +Невозможно создать символьную ссылку %x. + +Cannot find system function %x. +Невозможно найти системную функцию %x. Cannot copy file %x to %y. Невозможно скопировать файл %x в %y. @@ -1194,15 +1368,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: Тип элемента %x не поддерживается: +Cannot resolve symbolic link %x. +Невозможно разрешить символьную ссылку %x. + Cannot open directory %x. Невозможно открыть папку %x. Cannot enumerate directory %x. Невозможно прочесть папку %x. -Detected endless directory recursion. -Обнаружена бесконечная рекурсия папок. - %x TB %x ТБ @@ -1239,6 +1413,9 @@ Note: File names must be relative to base directories! %x дней +Failed to register to receive system messages. +Не удалось зарегистрироваться для получения системных сообщений. + Cannot set privilege %x. Невозможно установить привелегии %x. @@ -1248,207 +1425,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. Невозможно изменить приоритет процесса. -Unable to move %x to the Recycle Bin! -Невозможно переместить %x в "Корзину"! - -Both sides have changed since last synchronization! -Со времени последней синхронизации с обеих сторон произошли изменения! - -Cannot determine sync-direction: -Невозможно определить направление синхронизации: - -No change since last synchronization! -Никаких изменений с последней синхронизации! - -The corresponding database entries are not in sync considering current settings. -Соответствующие записи в базе данных не синхронизированы с учетом текущих настроек. - -Setting default synchronization directions: Old files will be overwritten with newer files. - -Настройка направления синхронизации по умолчанию: -Старые файлы будут заменены более новыми файлами. - - -Checking recycle bin availability for folder %x... -Проверка доступности "Корзины" для папки %x... - -Moving file %x to recycle bin -Перемещение файла %x в "Корзину" - -Moving folder %x to recycle bin -Перемещение папки %x в "Корзину" - -Moving symbolic link %x to recycle bin -Перемещение символьной ссылки %x в "Корзину" - -Deleting file %x -Удаление файла %x - -Deleting folder %x -Удаление папки %x - -Deleting symbolic link %x -Удаление символьной ссылки %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Для этого пути "Корзина" не доступна! Файлы будут удалены безвозвратно: - -The corresponding folder will be considered as empty. -Соответствующая папка будет считаться пустой. - -Cannot find the following folders: -Невозможно найти следующие папки: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Вы можете проигнорировать эту ошибку, приняв каждую папку за пустую. При этом папки будут созданы автоматически во время синхронизации. - -Directories are dependent! Be careful when setting up synchronization rules: -Зависимые папки! Будьте внимательны при настройке правил синхронизации: - -Start comparison -Начать сравнение - -Calculating sync directions... -Расчет направлений синхронизации... - -Conflict detected: -Обнаружен конфликт: - -File %x has an invalid date! -Файл %x имеет недействительную дату! - -Files %x have the same date but a different size! -Файлы %x имеют одинаковую дату, но различаются по размеру! - -Items differ in attributes only -Элементы различаются только атрибутами - -Symbolic links %x have the same date but a different target. -Символьная ссылка %x имеет ту же дату, но отличающуюся цель. - -Comparing content of files %x -Сравнение содержания файлов %x - -Comparing files by content failed. -Сравнение файлов по содержимому провалено. - -Generating file list... -Создание списка файлов... - -Both sides are equal -Обе стороны равны - -Copy new item to left -Скопировать новый элемент налево - -Copy new item to right -Скопировать новый элемент направо - -Delete left item -Удалить элемент слева - -Delete right item -Удалить элемент справа - -Move file on left -Переместить файл налево - -Move file on right -Переместить файл направо - -Overwrite left item -Перезаписать элемент слева - -Overwrite right item -Перезаписать элемент справа - -Do nothing -Ничего не делать - -Update attributes on left -Обновление атрибутов слева - -Update attributes on right -Обновление атрибутов справа - -Multiple... -Различные варианты синхронизации - -Moving file %x to %y -Перемещение файла %x в %y - -Moving folder %x to %y -Перемещение папки %x в %y - -Moving symbolic link %x to %y -Перемещение символьной ссылки %x в %y - -Removing old versions... -Удаление старых версий... - -Creating symbolic link %x -Создание символьной ссылки %x - -Creating folder %x -Создание папки %x - -Overwriting file %x -Перезапись файла %x - -Overwriting symbolic link %x -Перезапись символьной ссылки %x - -Verifying file %x -Проверка файла %x - -Updating attributes of %x -Обновление атрибутов %x - -Cannot find %x. -Невозможно найти %x. - -Target folder %x already existing. -Целевая папка %x уже существует. - -Target folder input field must not be empty. -Поле ввода целевой папки не должно быть пустым. - -Folder input field for versioning must not be empty. -Поле ввода папки для архивации файлов не должно быть пустым. +Unable to move %x to the Recycle Bin. +Невозможно переместить %x в "Корзину". -Source folder %x not found. -Исходная папка %x не найдена. - -The following items have unresolved conflicts and will not be synchronized: -Следующие элементы имеют неурегулированные конфликты и не будут синхронизированы: - -Significant difference detected: -Обнаружено существенное различие: - -More than 50% of the total number of files will be copied or deleted! -Более 50% общего количества файлов будет скопировано или удалено! - -Not enough free disk space available in: -Не достаточно свободного места в: - -Required: -Требуется: - -Available: -Доступно: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Папка, входящая в несколько пар папок, будет изменена. Пожалуйста, проверьте настройки синхронизации. - -Synchronizing folder pair: -Синхронизация пары папок: +Cannot determine final path for %x. +Невозможно определить конечный путь для %x. -Generating database... -Создание базы данных... - -Creating Volume Shadow Copy for %x... -Создание Тома Теневого Копирования для %x... - -Data verification error: Source and target file have different content! -Ошибка проверки данных: исходный и конечный файлы имеют разное содержание! +Error Code %x: +Код ошибки %x: diff --git a/BUILD/Languages/scottish_gaelic.lng b/BUILD/Languages/scottish_gaelic.lng index 3a0e3064..80d0a971 100644 --- a/BUILD/Languages/scottish_gaelic.lng +++ b/BUILD/Languages/scottish_gaelic.lng @@ -1,139 +1,164 @@
- Gàidhlig + Gàidhlig Michael Bauer aka Akerbeltz gd - scotland.png - 4 - (n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3 + flag_scotland.png + 4 + (n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3
-Searching for folder %x... -A' lorg a' phasgain %x... +Both sides have changed since last synchronization. +Chaidh an dà thaobh atharrachadh on t-sioncronachadh mu dheireadh. -Items processed: -Nithean a tha deiseil: +Cannot determine sync-direction: +Cha ghabh comhair an t-sioncronachaidh aithneachadh: -Items remaining: -Nithean a tha ri dhèanamh: +No change since last synchronization. +Cha deach dad atharrachadh on t-sioncronachadh mu dheireadh. -Total time: -An ùine gu lèir: +The database entry is not in sync considering current settings. +Chan eil innteart an stòir-dhàta sioncronaicht a-rèir nan roghainnean làithreach -Cannot set directory lock for %x. -Cha ghabh glas a' phasgain airson %x a shuidheachadh. +Setting default synchronization directions: Old files will be overwritten with newer files. +A' suidheachadh comhair bhunaiteach an t-sioncronachaidh: Thèid faidhlichean nas ùire a sgrìobhadh thairis air seann-fhaidhlichean. -Show in Explorer -Seall san taisgealaiche +Checking recycle bin availability for folder %x... +A' toirt sùil a bheil am biona ri fhaighin airson a' phasgain %x... -Open with default application -Fosgail leis an aplacaid bhunaiteach +Moving file %x to recycle bin +A' gluasad an fhaidhle %x dhan bhiona ath-chuairteachaidh -Browse directory -Rùraich am pasgan +Moving folder %x to recycle bin +A' gluasad a' phasgain %x dhan bhiona ath-chuairteachaidh -Abort requested: Waiting for current operation to finish... -Tha thu airson sgur dheth: A' feitheamh gus an crìochnaich an gnìomh làithreach... +Moving symbolic link %x to recycle bin +A' gluasad an symbolic link %x dhan bhiona ath-chuairteachaidh -Failure to create timestamp for versioning: -Cha b' urrainn dhuinn stampa-ama a chruthachadh airson versioning: +Deleting file %x +A' sguabadh às an fhaidhle %x -RealtimeSync - Automated Synchronization -RealtimeSync - Sioncronachadh fèin-obrachail +Deleting folder %x +A' sguabadh às a' phasgain %x + +Deleting symbolic link %x +A' sguabadh às an symbolic link %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Chan eil am biona ri làimh nam pasganan a leanas. Thèid na faidhlichean a sguabadh às gu buan an àite sin: + +An exception occurred +Thachair eisgeachd + +Cannot find file %x. +Cha deach am faidhle %x a lorg. Error Mearachd -Selected variant: -An t-eug-samhail a thagh thu: +File %x does not contain a valid configuration. +Chan eil rèiteachadh dligheach san fhaidhle %x. -Select alternate comparison settings -Tagh roghainnean coimeasaidh eile +A folder input field is empty. +Tha co-dhiù aon raon pasgain ann a tha falamh. -Select alternate synchronization settings -Tagh roghainnean sioncronachaidh eile +The corresponding folder will be considered as empty. +Thèid am pasgan a leanas a làimhseachadh mar phasgan falamh. -Filter is active -Tha a' chriathrag gnìomhach +Cannot find the following folders: +Chan urrainn dhuinn na pasgain a leanas a lorg: -No filter selected -Cha deach criathrag a thaghadh +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +'S urrainn dhut a' mhearachd seo a leigeil seachad ma tha thu airson 's gun dèilig sinn ri gach pasgan mar gum biodh iad falamh. Thèid na pasgain a chruthachadh gu fèin-obrachail an uairsin rè an t-sioncronachaidh -Remove alternate settings -Thoir air falbh na roghainnean eile +The following folders have dependent paths. Be careful when setting up synchronization rules: +Tha slighean eisimeileachdach aig na pasganan a leanas. Bi faiceallach nuair a chruthaicheas tu riaghailtean sioncronachaidh: -Clear filter settings -Falamhaich roghainnean na criathraige +File %x has an invalid date. +Tha ceann-là mì-dhligheach aig an fhaidhle %x. -Copy -Dèan lethbhreac +Date: +Ceann-là: -Paste -Cuir ann +Files %x have the same date but a different size. +Tha an dearbh cheann-là aig na faidhlichean %x ach chan eil am meud co-ionnann. -Save as batch job -Sàbhail mar obair baidse +Size: +Meud: -Comparison settings -Roghainnean a' choimeasaidh +Items differ in attributes only +Chan eil diofar eatarra ach a thaobh an cuid bhuadhan -Synchronization settings -Roghainnean an t-sioncronachaidh +Resolving symbolic link %x +Duilgheadas a' rèiteachadh a' symbolic link %x -About -Mu dheidhinn +Comparing content of files %x +A' dèanamh coimheas eadar na faidhlichean %x -Confirm -Dearbh +Generating file list... +A' gintinn liosta nam faidhle... -Configure filter -Rèitich a' chriathrag +Starting comparison +A' tòiseachadh air a' choimeas -Global settings -Na roghainnean uile-choitcheann +Calculating sync directions... +Ag àireamhachadh comhairean an t-sioncronachaidh... -Find -Lorg +Out of memory. +Chan eil cuimhne gu leòr ann. -Select time span -Tagh an raon-ama +Item exists on left side only +Chan eil an nì seo ann ach air an taobh chlì -Invalid command line: -Loidhne-àithne mhì-dhligheach: +Item exists on right side only +Chan eil an nì seo ann ach air an taobh deas -Info -Fiosrachadh +Left side is newer +Tha an taobh clì nas ùire -Warning -Rabhadh +Right side is newer +Tha an taobh deas nas ùire -Fatal Error -Mearachd mharbhtach +Items have different content +Tha diofar susbaint sna nithean -Error Code %x: -Còd na mearachd %x: +Both sides are equal +Tha an dà thaobh co-ionnann -Cannot resolve symbolic link %x. -Cha ghabh an symbolic link %x fhuasgladh. +Conflict/item cannot be categorized +Tha còmhstri/nì ann nach urrainn dhuinn aithneachadh - -1 Byte -%x Bytes - - -%x bhaidht -%x bhaidht -%x baidht -%x baidht - +Copy new item to left +Cuir lethbhreac dhen nì ùr dhan taobh chlì -%x MB -%x MB +Copy new item to right +Cuir lethbhreac dhen nì ùr dhan taobh deas -%x KB -%x KB +Delete left item +Sguab às an nì air an taobh chlì -%x GB -%x GB +Delete right item +Sguab às an nì air an taobh deas + +Move file on left +Gluais am faidhle a tha air an taobh chlì + +Move file on right +Gluais am faidhle a tha air an taobh deas + +Overwrite left item +Sgrìobh thairis air an nì chlì + +Overwrite right item +Sgrìobh thairis air an nì deas + +Do nothing +Na dèan dad + +Update attributes on left +Ùraich na buadhan air an taobh chlì + +Update attributes on right +Ùraich na buadhan air an taobh deas Database file %x is incompatible. Chan eil am faidhle stòir-dhàta %x co-chòrdail. @@ -147,9 +172,6 @@ Database file is corrupt: Tha am faidhle stòir-dhàta coirbte: -Out of memory! -Chan eil cuimhne gu leòr ann! - Cannot write file %x. Cha ghabh am faidhle %x a sgrìobhadh. @@ -159,8 +181,8 @@ Database files do not share a common session. Chan eil seisean an cumantas aig na faidhlichean stòir-dhàta. -An exception occurred! -Thachair eisgeachd! +Searching for folder %x... +A' lorg a' phasgain %x... Cannot read file attributes of %x. Cha ghabh buadhan an fhaidhle %x a leughadh. @@ -185,9 +207,41 @@ Creating file %x A' cruthachadh an fhaidhle %x +Items processed: +Nithean a tha deiseil: + +Items remaining: +Nithean a tha ri dhèanamh: + +Total time: +An ùine gu lèir: + + +1 Byte +%x Bytes + + +%x bhaidht +%x bhaidht +%x baidht +%x baidht + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Mearachd le parsadh an fhaidhle %x, loidhne %y, colbh %z. +Cannot set directory lock for %x. +Cha ghabh glas a' phasgain airson %x a shuidheachadh. + Scanning: 'Ga sganadh: @@ -208,12 +262,18 @@ /sec /diog -File %x does not contain a valid configuration. -Chan eil rèiteachadh dligheach san fhaidhle %x. - Configuration file %x loaded partially only. Cha deach faidhle an rèiteachaidh %x a luchdadh gu tur. +Show in Explorer +Seall san taisgealaiche + +Open with default application +Fosgail leis an aplacaid bhunaiteach + +Browse directory +Rùraich am pasgan + Cannot access Volume Shadow Copy Service. Chan fhaigh sinn cothrom air seirbheis lethbhreacan-sgàile nan clàr. @@ -223,18 +283,21 @@ Cannot load file %x. Cha ghabh am faidhle %x a lorg. -Path %x does not contain a volume name. -CHan eil ainm clàir san t-slighe %x. +Cannot determine volume name for %x. +Chan urrainn dhuinn ainm an draibh airson %x a dhearbhadh. + +Volume name %x not part of file name %y. +Chan eil an t-ainm clàir %x 'na phàirt dhen ainm fhaidhle %y. + +Abort requested: Waiting for current operation to finish... +Tha thu airson sgur dheth: A' feitheamh gus an crìochnaich an gnìomh làithreach... -Volume name %x not part of file name %y! -Chan eil an t-ainm clàir %x 'na phàirt dhen ainm fhaidhle %y! +Failure to create timestamp for versioning: +Cha b' urrainn dhuinn stampa-ama a chruthachadh airson versioning: Cannot read the following XML elements: Chan urrainn dhuinn na h-eileamaidean XML a leanas a leughadh: -Cannot find file %x. -Cha deach am faidhle %x a lorg. - &Open... F&osgail... @@ -315,9 +378,18 @@ Thèid an loidhne-àithne a chur gu dol: Cancel Sguir dheth +RealtimeSync - Automated Synchronization +RealtimeSync - Sioncronachadh fèin-obrachail + +Warning +Rabhadh + Build: %x Build: %x +About +Mu dheidhinn + All files Gach faidhle @@ -327,29 +399,125 @@ Thèid an loidhne-àithne a chur gu dol: &Exit &Fàg an-seo -Monitoring active... -A' cumail sùil... - Waiting for missing directories... A' feitheamh ris na pasgain a tha a dhìth... -A folder input field is empty. -Tha co-dhiù aon raon pasgain ann a tha falamh. +Invalid command line: +Loidhne-àithne mhì-dhligheach: + +File content +Susbaint an fhaidhle + +File time and size +Ceann-là is meud + + Two way + An dà chomhair + +Mirror +Sgàthanaich + +Update +Ùraich + +Custom +Gnàthaichte + +Multiple... +Iomadh fear... + +Moving file %x to %y +A' gluasad an fhaidhle %x gu %y -Synchronization aborted! -Sguireadh dhen t-sioncronachadh! +Moving folder %x to %y +A' gluasad a' phasgain %x gu %y -Synchronization completed with errors! -Chaidh an sioncronachadh a choileanadh ach bha mearachdan ann! +Moving symbolic link %x to %y +A' gluasad an symbolic link %x gu %y -Synchronization completed with warnings. -Chaidh a shioncronachadh ach bha rabhaidhean ann. +Removing old versions... +A' toirt air falbh nan seann tionndaidhean... -Nothing to synchronize! -Chan eil dad ri shioncronachadh! +Creating symbolic link %x +A' cruthachadh an symbolic link %x -Synchronization completed successfully. -Chaidh a shioncronachadh. +Creating folder %x +A' cruthachadh a' phasgain %x + +Overwriting file %x +A' sgrìobhadh thairis air an fhaidhle %x + +Overwriting symbolic link %x +A' sgrìobhadh thairis air an symbolic link %x + +Verifying file %x +A' dearbhadh an fhaidhle %x + +Updating attributes of %x +Ag ùrachadh buadhan %x + +Cannot find %x. +Cha ghabh %x a lorg. + +Target folder %x already existing. +Tha am pasgan-uidhe %x ann mu thràth. + +Target folder input field must not be empty. +Chan fhaod raon a' phasgain a bhith falamh. + +Folder input field for versioning must not be empty. +Chan fhaod raon a' pasgain airson versioning a bhith falamh. + +Source folder %x not found. +Cha deach am pasgan tùsail %x a lorg. + +The following items have unresolved conflicts and will not be synchronized: +Tha còmstrithean aig na nithean a leanas fhathast is cha dèid an sioncronachadh: + +Significant difference detected: +Chaidh diofar mòr a lorg: + +More than 50% of the total number of files will be copied or deleted. +Tha thu an impis barrachd air an dàrna leth dhe na faidhlichean uile sguabadh às no lethbhreac a dhèanamh dhiubh. + +Not enough free disk space available in: +Chan eil rùm saor gu leòr air an diosga: + +Required: +Na tha feum air: + +Available: +Na tha ri làimh: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Thèid pasgan atharrachadh a tha 'na phàirt de dh'iomadh paidhir de phasgain. Nach doir thu sùil air roghainnean an t-sioncronachaidh? + +Synchronizing folder pair: +A' sioncronachadh paidhir nam pasgan: + +Generating database... +A' gintinn an stòir-dhàta... + +Creating Volume Shadow Copy for %x... +A' cruthachadh Volume Shadow Copy de %x... + +Data verification error: %x and %y have different content. +Mearachd le dearbhadh an dàta: tha susbaint eadar-dhealaichte ann an %x agus %y. + +Synchronization aborted +Sguireadh dhen t-sioncronachadh + +Synchronization completed with errors +Chaidh an sioncronachadh a choileanadh ach bha mearachdan ann + +Synchronization completed with warnings +Chaidh a shioncronachadh ach bha rabhaidhean ann + +Nothing to synchronize +Chan eil dad ri shioncronachadh + +Synchronization completed successfully +Chaidh a shioncronachadh Saving log file %x... A' sàbhaladh faidhle an loga %x... @@ -357,8 +525,8 @@ Thèid an loidhne-àithne a chur gu dol: Press "Switch" to resolve issues in FreeFileSync main dialog. Briog air "Gearr leum" gus duilgheadasan a rèiteachadh sa phrìomh-chòmhradh aig FreeFileSync. -Switching to FreeFileSync main dialog... -A' gearradh leum gu prìomh-chòmhradh FreeFileSyncs... +Switching to FreeFileSync main dialog +A' gearradh leum gu FreeFileSync sa phrìomh-chòmhradh A new version of FreeFileSync is available: Tha tionndadh ùr de FreeFileSync ann: @@ -366,29 +534,29 @@ Thèid an loidhne-àithne a chur gu dol: Download now? A bheil thu airson a luchdadh a-nuas an-dràsta? -FreeFileSync is up to date! -Tha FreeFileSync cho ùr 's a ghabhas! +New version found +Chaidh tionndadh ùr a lorg -Information -Fiosrachadh +&Download +&Luchdaich a-nuas -Unable to connect to sourceforge.net! -Cha b' urrainn dhuinn ceangal a dhèanamh ri Sourceforge.net! +FreeFileSync is up to date. +Tha FreeFileSync cho ùr 's a ghabhas. -Current FreeFileSync version number was not found online! Do you want to check manually? -Cha do lorg sinn àireamh an tionndaidh làithrich aig FreeFileSync air loidhne! A bheil thu airson a lorg a làimh? +Information +Fiosrachadh -Do you want FreeFileSync to automatically check for updates every week? -A bheil thu airson 's gun doir FreeFileSync sùil gach seachdain ach a bheil ùrachadh ann? +Unable to connect to sourceforge.net. +Cha b' urrainn dhuinn ceangal a dhèanamh ri Sourceforge.net. -(Requires an Internet connection!) -(Tha feum air ceangal ris an eadar-lìon!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Chan urrainn dhuinn àireamh an tionndaidh làithrich aig FreeFileSync a lorg air loidhne. A bheil thu airson sùil a thoirt thu fhèin? - - +Symlink +Symlink - - +Folder +Pasgan Full path Slighe shlan @@ -411,12 +579,6 @@ Thèid an loidhne-àithne a chur gu dol: Extension Leudachan -Size: -Meud: - -Date: -Ceann-là: - Category Roinn seòrsa @@ -441,6 +603,33 @@ Thèid an loidhne-àithne a chur gu dol: Hibernate Geamhraich +Selected variant: +An t-eug-samhail a thagh thu: + +Select alternate comparison settings +Tagh roghainnean coimeasaidh eile + +Select alternate synchronization settings +Tagh roghainnean sioncronachaidh eile + +Filter is active +Tha a' chriathrag gnìomhach + +No filter selected +Cha deach criathrag a thaghadh + +Remove alternate settings +Thoir air falbh na roghainnean eile + +Clear filter settings +Falamhaich roghainnean na criathraige + +Copy +Dèan lethbhreac + +Paste +Cuir ann + &New Ù&r @@ -459,14 +648,14 @@ Thèid an loidhne-àithne a chur gu dol: &Language &Cànan -&Global settings... -&Na roghainnean uile-choitcheann... - &Export file list... Às-p&hortaich liosta nam faidhle... -&Advanced -&Adhartach +&Global settings... +&Na roghainnean uile-choitcheann... + +&Tools +&Innealan &Check now &Thoir sùil an-dràsta @@ -474,12 +663,18 @@ Thèid an loidhne-àithne a chur gu dol: Check &automatically once a week Thoir sùil gu &fèin-obrachail turas san t-seachdain -Check for new version -Thoir sùil ach a bheil tionndadh ùr ann +Check for new &version +Thoir sùil a bheil &tionndadh ùr ann Compare Dèan coimeas +Comparison settings +Roghainnean a' choimeasaidh + +Synchronization settings +Roghainnean an t-sioncronachaidh + Synchronize Dèan sioncronachadh @@ -492,6 +687,9 @@ Thèid an loidhne-àithne a chur gu dol: Swap sides Cuir an dà thaobh an àite a chèile +Save as batch job +Sàbhail mar obair baidse + Hide excluded items Falaich nithean a chaidh a dhùnadh às @@ -534,53 +732,8 @@ Thèid an loidhne-àithne a chur gu dol: &Pause &Cuir 'na stad -Batch job -Obair baidse - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Cruthaich faidhle batch airson sioncronachadh fèin-obrachail. Dèan briogadh dùbailte air an fhaidhle seo no cuir e air sgeideal an t-siostaim agad: FreeFileSync.exe .ffs_batch. - -Help -Cobhair - -Error handling -Làimhseachadh mhearachdan - -Ignore -Leig seachad - -Hide all error and warning messages -Falaich gach teachdaireachd mu mhearachdan no rabhaidhean - -Pop-up -Priob-uinneag - -Show pop-up on errors or warnings -Seall priob-uinneagan a thaobh mhearachdan no rabhaidhean - -Exit -Fàg an-seo - -Abort synchronization on first error -Sguir dhen t-sioncronachadh nuair a thachras a' chiad mhearachd - -Show progress dialog -Seall còmhradh an adhartais - -Save log -Sàbhail an loga - -Select folder to save log files -Tagh pasgan far an dèid faidhlichean an loga a shàbhaladh - -Limit -Cuingich - -Limit maximum number of log files -Cuingich an àireamh as motha de dh'fhaidhlichean an loga - -Select variant -Tagh fear +Select a variant +Tagh eug-samhail Files are found equal if @@ -595,9 +748,6 @@ Bidh dà fhaidhle co-ionnann 'nar beachd-sa co-ionnann -File time and size -Ceann-là is meud - Files are found equal if - file content @@ -608,39 +758,42 @@ Bidh dà fhaidhle co-ionnann 'nar beachd-sa - susbaint an dà fhaidhle co-ionnann -File content -Susbaint an fhaidhle - Symbolic Link handling Làimhseachadh nan symbolic links +Help +Cobhair + OK Ceart ma-thà -<- Two way -> -<- An dà chomhair -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Lorg is sìolaich na h-atharraichean air an dà thaobh. Mothaichidh sinn do rudan a chaidh a sguabadh às, a ghluasad no còmhstrithean gu fèin-obrachail le stòr-dàta. -Mirror ->> -Sgàthanaich ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Dèan lethbhreac-glèidhidh 's tu a' sgàthanadh a' phasgain air an taobh chlì. Thèid am pasgan air an taobh deas a chur air gleus ach am bi e gu tur co-ionnann ris a' phasgan air an taobh chlì as dèidh dha sioncronachadh. -Update -> -Ùraich -> - Copy new or updated files to right folder. Cuir lethbhreac de dh'fhaidhlichean a tha ùr no ùraichte dhan phasgan air an taobh deas. -Custom -Gnàthaichte - Configure your own synchronization rules. Sònraich riaghailtean sioncronachaidh thu fhèin. +Error handling +Làimhseachadh mhearachdan + +Ignore +Leig seachad + +Hide all error and warning messages +Falaich gach teachdaireachd mu mhearachdan no rabhaidhean + +Pop-up +Priob-uinneag + +Show pop-up on errors or warnings +Seall priob-uinneagan a thaobh mhearachdan no rabhaidhean + Deletion handling Mar a dhèiligear ri sguabadh às @@ -665,23 +818,32 @@ Bidh dà fhaidhle co-ionnann 'nar beachd-sa Naming convention: Gnàthas nan ainmean: -Item exists on left side only -Chan eil an nì seo ann ach air an taobh chlì +Batch job +Obair baidse -Item exists on right side only -Chan eil an nì seo ann ach air an taobh deas +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Cruthaich faidhle batch airson sioncronachadh fèin-obrachail. Dèan briogadh dùbailte air an fhaidhle seo no cuir e air sgeideal an t-siostaim agad: FreeFileSync.exe .ffs_batch. -Left side is newer -Tha an taobh clì nas ùire +Exit +Fàg an-seo -Right side is newer -Tha an taobh deas nas ùire +Abort synchronization on first error +Sguir dhen t-sioncronachadh nuair a thachras a' chiad mhearachd -Items have different content -Tha diofar susbaint sna nithean +Show progress dialog +Seall còmhradh an adhartais -Conflict/item cannot be categorized -Tha còmhstri/nì ann nach urrainn dhuinn aithneachadh +Save log +Sàbhail an loga + +Select folder to save log files +Tagh pasgan far an dèid faidhlichean an loga a shàbhaladh + +Limit +Cuingich + +Limit maximum number of log files +Cuingich an àireamh as motha de dh'fhaidhlichean an loga Source code written in C++ using: Chaidh an còd tùsail a sgrìobhadh ann an C++ le taic: @@ -701,9 +863,6 @@ Bidh dà fhaidhle co-ionnann 'nar beachd-sa Homepage An duilleag-dhachaigh -FreeFileSync at Sourceforge -FreeFileSync air Sourceforge - Email Post-d @@ -718,11 +877,11 @@ Bidh dà fhaidhle co-ionnann 'nar beachd-sa Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Cha dèid ach na faidhlichean a fhreagras ri gach roghainn na criathraige a shioncronachadh. -An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain aca! +An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain aca. Include @@ -746,6 +905,9 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain &Clear Fala&mhaich +Global settings +Na roghainnean uile-choitcheann + Fail-safe file copy Dèan lethbhreac nach gabh fàilligeadh @@ -776,9 +938,6 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain &Default &Bun-roghainn -Start synchronization -Tòisich air an t-sioncronachadh - Variant Eugsamhail @@ -797,8 +956,20 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain &Find next &Lorg an ath-fhear -Main bar -Am prìomh-bhàr +Delete +Sguab às + +Configure filter +Rèitich a' chriathrag + +Start synchronization +Tòisich air an t-sioncronachadh + +Find +Lorg + +Select time span +Tagh an raon-ama Folder pairs Paidhrichean phasgan @@ -809,6 +980,9 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Configuration Rèiteachadh +Main bar +Am prìomh-bhàr + Filter files Criathraich na faidhlichean @@ -869,11 +1043,8 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Exclude via filter: Dùin a-mach le criathrag: - - - -Delete -Sguab às +multiple selection +Ioma-thaghadh Include all Gabh a-steach na h-uile @@ -902,14 +1073,14 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Show "%x" Seall "%x" - - +Last session +An seisean mu dheireadh Folder Comparison and Synchronization Coimeas eadar na pasgain is sioncronachadh -Configuration saved! -Chaidh an rèiteachadh a shàbhaladh! +Configuration saved +Chaidh an rèiteachadh a shàbhaladh FreeFileSync batch FreeFileSync batch @@ -923,9 +1094,6 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Never save changes Na sàbhail atharraichean idir -Configuration loaded! -Chaidh an rèiteachadh a luchdadh! - Show files that exist on left side only Na seall ach faidhlichean a tha air an taobh chlì a-mhàin @@ -971,20 +1139,17 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Set as default Suidhich mar a' bhun-roghainn -Operation aborted! -Sguireadh dhen ghnìomh! +Operation aborted +Sguireadh dhen ghnìomh -All folders are in sync! -Tha gach pasgan air a shioncronachadh! +All folders are in sync +Tha gach pasgan air a shioncronachadh Comma separated list Liosta air a sgaradh le cromagan -Legend -Treòir - -File list exported! -Chaidh liosta nam faidhle às-phortadh! +File list exported +Chaidh liosta nam faidhle às-phortadh Searching for program updates... A' lorg ùrachaidhean a' phrògraim... @@ -995,6 +1160,9 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain &Ignore &Leig seachad +Fatal Error +Mearachd mharbhtach + Don't show this warning again Na seall an rabhadh seo a-rithist @@ -1016,6 +1184,9 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Comparing content... A' dèanamh coimeas eadar an cuid susbaint... +Info +Fiosrachadh + Paused 'Na stad @@ -1176,9 +1347,6 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Cannot write modification time of %x. Cha ghabh àm atharrachaidh %x a sgrìobhadh. -Cannot find system function %x. -Chan urrainn dhuinn foincsean an t-siostaim %x a lorg. - Cannot read security context of %x. Cha ghabh susbaint tèarainteachd %x a leughadh. @@ -1194,8 +1362,11 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Cannot create directory %x. Cha ghabh am pasgan %x a chruthachadh. -Cannot copy symbolic link %x to %y. -Chan ghabh lethbhreac dhen symbolic link %x a chur gu %y. +Cannot create symbolic link %x. +Cha ghabh an symbolic link %x a chruthachadh + +Cannot find system function %x. +Chan urrainn dhuinn foincsean an t-siostaim %x a lorg. Cannot copy file %x to %y. Cha ghabh lethbhreac an fhaidhle %x a chur gu %y. @@ -1203,15 +1374,15 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Type of item %x is not supported: Chan eil taic ri nì dhen t-seòrsa %x: +Cannot resolve symbolic link %x. +Cha ghabh an symbolic link %x fhuasgladh. + Cannot open directory %x. Cha ghabh am pasgan %x fhosgladh. Cannot enumerate directory %x. Cha ghabh am pasgan %x àireamhachadh. -Detected endless directory recursion. -Mhothaich sinn dha ath-chùrsadh phasgan gun chrìoch. - %x TB %x TB @@ -1251,6 +1422,9 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain %x latha +Failed to register to receive system messages. +Cha b' urrainn dhuinn clàraidh airson teachdaireachdan an t-siostaim. + Cannot set privilege %x. Cha ghabh a' phribhleid %x a shuidheachadh. @@ -1260,204 +1434,12 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-phasgain Cannot change process I/O priorities. Chan urrainn dhuinn na prìomhachasan I/O atharrachadh. -Unable to move %x to the Recycle Bin! -Chan urrainn dhuinn %x a ghluasad dhan bhiona ath-chuairteachaidh! - -Both sides have changed since last synchronization! -Chaidh an dà thaobh atharrachadh on t-sioncronachadh mu dheireadh! - -Cannot determine sync-direction: -Cha ghabh comhair an t-sioncronachaidh aithneachadh: - -No change since last synchronization! -Cha deach dad atharrachadh on t-sioncronachadh mu dheireadh! - -The corresponding database entries are not in sync considering current settings. -Chan eil seisean nan innteartan san stòr-dàta sioncronaichte a-rèir nan roghainnean làithreach. - -Setting default synchronization directions: Old files will be overwritten with newer files. -A' suidheachadh comhair bhunaiteach an t-sioncronachaidh: Thèid faidhlichean nas ùire a sgrìobhadh thairis air seann-fhaidhlichean. - -Checking recycle bin availability for folder %x... -A' toirt sùil a bheil am biona ri fhaighin airson a' phasgain %x... - -Moving file %x to recycle bin -A' gluasad an fhaidhle %x dhan bhiona ath-chuairteachaidh - -Moving folder %x to recycle bin -A' gluasad a' phasgain %x dhan bhiona ath-chuairteachaidh - -Moving symbolic link %x to recycle bin -A' gluasad an symbolic link %x dhan bhiona ath-chuairteachaidh - -Deleting file %x -A' sguabadh às an fhaidhle %x - -Deleting folder %x -A' sguabadh às a' phasgain %x - -Deleting symbolic link %x -A' sguabadh às an symbolic link %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Chan eil am biona ath-chuairteachaidh ri làimh nan slighean a leanas! Thèid na faidhlichean a sguabhadh às gu buan an àite sin: - -The corresponding folder will be considered as empty. -Thèid am pasgan a leanas a làimhseachadh mar phasgan falamh. - -Cannot find the following folders: -Chan urrainn dhuinn na pasgain a leanas a lorg: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -'S urrainn dhut a' mhearachd seo a leigeil seachad ma tha thu airson 's gun dèilig sinn ri gach pasgan mar gum biodh iad falamh. Thèid na pasgain a chruthachadh gu fèin-obrachail an uairsin rè an t-sioncronachaidh - -Directories are dependent! Be careful when setting up synchronization rules: -Tha na pasgain an eisimeil a chèile! Bi faiceallach nuair a shuidhicheas tu na riaghailtean sioncronachaidh: - -Start comparison -Dèan coimeas - -Calculating sync directions... -Ag àireamhachadh comhairean an t-sioncronachaidh... - -Conflict detected: -Mhothaich sinn do chòmhstri: - -File %x has an invalid date! -Tha ceann-là mì-dhligheach aig an fhaidhle %x! - -Files %x have the same date but a different size! -Tha an dearbh cheann-là aig na faidhlichean %x ach chan eil am meud co-ionnann! - -Items differ in attributes only -Chan eil diofar eatarra ach a thaobh an cuid bhuadhan - -Symbolic links %x have the same date but a different target. -Tha an dearbh cheann-là aig na symbolic links %x ach targaidean eadar-dhealaichte. - -Comparing content of files %x -A' dèanamh coimheas eadar na faidhlichean %x - -Comparing files by content failed. -Dh'fhàillig coimeasadh nam faidhlichean a thaobh susbaint. - -Generating file list... -A' gintinn liosta nam faidhle... - -Both sides are equal -Tha an dà thaobh co-ionnann - -Copy new item to left -Cuir lethbhreac dhen nì ùr dhan taobh chlì - -Copy new item to right -Cuir lethbhreac dhen nì ùr dhan taobh deas - -Delete left item -Sguab às an nì air an taobh chlì - -Delete right item -Sguab às an nì air an taobh deas - -Move file on left -Gluais am faidhle a tha air an taobh chlì - -Move file on right -Gluais am faidhle a tha air an taobh deas - -Overwrite left item -Sgrìobh thairis air an nì chlì - -Overwrite right item -Sgrìobh thairis air an nì deas - -Do nothing -Na dèan dad - -Update attributes on left -Ùraich na buadhan air an taobh chlì - -Update attributes on right -Ùraich na buadhan air an taobh deas - -Multiple... -Iomadh fear... - -Moving file %x to %y -A' gluasad an fhaidhle %x gu %y - -Moving folder %x to %y -A' gluasad a' phasgain %x gu %y - -Moving symbolic link %x to %y -A' gluasad an symbolic link %x gu %y - -Removing old versions... -A' toirt air falbh nan seann tionndaidhean... - -Creating symbolic link %x -A' cruthachadh an symbolic link %x - -Creating folder %x -A' cruthachadh a' phasgain %x - -Overwriting file %x -A' sgrìobhadh thairis air an fhaidhle %x - -Overwriting symbolic link %x -A' sgrìobhadh thairis air an symbolic link %x - -Verifying file %x -A' dearbhadh an fhaidhle %x - -Updating attributes of %x -Ag ùrachadh buadhan %x - -Cannot find %x. -Cha ghabh %x a lorg. - -Target folder %x already existing. -Tha am pasgan-uidhe %x ann mu thràth. - -Target folder input field must not be empty. -Chan fhaod raon a' phasgain a bhith falamh. - -Folder input field for versioning must not be empty. -Chan fhaod raon a' pasgain airson versioning a bhith falamh. +Unable to move %x to the Recycle Bin. +Chan urrainn dhuinn %x a ghluasad dhan bhiona ath-chuairteachaidh. -Source folder %x not found. -Cha deach am pasgan tùsail %x a lorg. - -The following items have unresolved conflicts and will not be synchronized: -Tha còmstrithean aig na nithean a leanas fhathast is cha dèid an sioncronachadh: - -Significant difference detected: -Chaidh diofar mòr a lorg: - -More than 50% of the total number of files will be copied or deleted! -Tha thu an impis barrachd air an dàrna leth dhe na faidhlichean uile sguabadh às no lethbhreac a dhèanamh dhiubh! - -Not enough free disk space available in: -Chan eil rùm saor gu leòr air an diosga: - -Required: -Na tha feum air: - -Available: -Na tha ri làimh: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Thèid pasgan atharrachadh a tha 'na phàirt de dh'iomadh paidhir de phasgain. Nach doir thu sùil air roghainnean an t-sioncronachaidh? - -Synchronizing folder pair: -A' sioncronachadh paidhir nam pasgan: +Cannot determine final path for %x. +Chan urrainn dhuinn an t-slighe dheireannach airson %x a dhearbhadh. -Generating database... -A' gintinn an stòir-dhàta... - -Creating Volume Shadow Copy for %x... -A' cruthachadh Volume Shadow Copy de %x... - -Data verification error: Source and target file have different content! -Mearachd dearbhadh an dàta: Tha susbaint eadar-dhealaichte san fhaidhle tùsail is san targaid! +Error Code %x: +Còd na mearachd %x: diff --git a/BUILD/Languages/serbian.lng b/BUILD/Languages/serbian.lng index a3fe8a9a..f0a26e49 100644 --- a/BUILD/Languages/serbian.lng +++ b/BUILD/Languages/serbian.lng @@ -1,144 +1,164 @@
- Cрпски + Cрпски Балкански Шпијун sr_RS - serbia.png - 3 - n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2 + flag_serbia.png + 3 + n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2
-Searching for folder %x... -Тражим фолдер %x... +Both sides have changed since last synchronization. +Обе су стране промењене од последње синхронизације. -Items processed: -Обрађени елементи: +Cannot determine sync-direction: +Не могу одредити смер синхронизације: -Items remaining: -Преостали елементи: +No change since last synchronization. +Нема промена од задње синхронизације. -Total time: -Укупно време: +The database entry is not in sync considering current settings. +Унос у бази података није синхронизован у односу на тренутна подешавања. -Cannot set directory lock for %x. -Не могу закључати фолдер %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +Постављам подразумеване синхронизацијске смерове: Старе датотеке биће замењене новијим датотекама. -Show in Explorer -Прикажи у Експлореру +Checking recycle bin availability for folder %x... +Проверавам доступност Корпе за смеће за фолдер %x... -Open with default application -Отвори са подразумеваном апликацијом +Moving file %x to recycle bin +Премештам датотеку %x у Корпи за смеће -Browse directory -Одабери фолдер +Moving folder %x to recycle bin +Премештам фолдер %x у Корпи за смеће -Abort requested: Waiting for current operation to finish... -Прекид захтеван: Чека се да се тренутна акција заврши... +Moving symbolic link %x to recycle bin +Премештам симболичну везу %x у Корпи за смеће -Failure to create timestamp for versioning: -Неуспело стварање временске ознаке за верзију: +Deleting file %x +Брисање датотеке %x -RealtimeSync - Automated Synchronization -RealtimeSync - Аутоматска Синхронизација +Deleting folder %x +Брисање фолдера %x + +Deleting symbolic link %x +Брисање симболичне везе %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Корпа за смеће није доступна за следеће фолдере. Уместо тога датотеке биће обрисане трајно: + +An exception occurred +Догодило се изузеће + +Cannot find file %x. +Не могу пронаћи датотеку %x. Error Грешка -Selected variant: -Одабрани начин: +File %x does not contain a valid configuration. +Датотека %x не садржи валидну конфигурацију. -Select alternate comparison settings -Изаберите алтернативна подешавања упоређивања +A folder input field is empty. +Поље за одабир фолдера је празно. -Select alternate synchronization settings -Изаберите алтернативна подешавања синхронизације +The corresponding folder will be considered as empty. +Одговарајући фолдер сматраће се празним. -Filter is active -Филтер је активан +Cannot find the following folders: +Не могу пронаћи следеће фолдере: -No filter selected -Ниједан филтер није одабран +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Можете игнорисати ову грешку да би сматрали сваки фолдер празним. Фолдери ће бити креирани аутоматски током синхронизације. -Remove alternate settings -Уклони алтернативна подешавања +The following folders have dependent paths. Be careful when setting up synchronization rules: +Следећи фолдери имају зависне путање. Будите пажљиви када подешавате синхронизациона правила: -Clear filter settings -Уклони подешавања филтера +File %x has an invalid date. +Датотека %x има невалидни датум. -Copy -Копирај +Date: +Датум: -Paste -Залепи +Files %x have the same date but a different size. +Датотеке %x имају исти датум али другачију величину. -Save as batch job -Сачувај као беч задатак +Size: +Величина: -Comparison settings -Подешавања упоређивања +Items differ in attributes only +Ставке се разликују само у атрибутима -Synchronization settings -Подешавања синхронизације +Resolving symbolic link %x +Разрешавање симболичне везе %x -About -О програму +Comparing content of files %x +Упоређујем садржај датотека %x -Confirm -Потврди +Generating file list... +Стварам листу датотека... -Configure filter -Конфигуриши филтер +Starting comparison +Покретање упоређивања -Global settings -Глобална подешавања +Calculating sync directions... +Одређујем смерове синхронизације... -Find -Пронађи +Out of memory. +Недостатак меморије. -Select time span -Изаберите временски распон +Item exists on left side only +Ставка постоји само на левој страни -Invalid command line: -Нетачна командна линија: +Item exists on right side only +Ставка постоји само на десној страни -Info -Инфо +Left side is newer +Лева страна је новија -Warning -Упозорење +Right side is newer +Десна страна је новија -Fatal Error -Критична грешка +Items have different content +Ставке имају различит садржај -Error Code %x: -Грешка број %x: +Both sides are equal +Обе стране су једнаке -Cannot resolve symbolic link %x. -Не могу разрешити симболичну везу %x. +Conflict/item cannot be categorized +Конфликт/ставка не може бити разврстана -Cannot determine final path for %x. - +Copy new item to left +Копирај нову ставку лево -Cannot find system function %x. -Не могу пронаћи системску функцију %x. +Copy new item to right +Копирај нову ставку десно - -1 Byte -%x Bytes - - -%x Бајт -%x Бајта -%x Бајтова - +Delete left item +Избриши леву ставку -%x MB -%x MB +Delete right item +Избриши десну ставку -%x KB -%x KB +Move file on left +Премести датотеку лево -%x GB -%x GB +Move file on right +Премести датотеку десно + +Overwrite left item +Замени леву ставку + +Overwrite right item +Замени десну ставку + +Do nothing +Не ради ништа + +Update attributes on left +Освежи атрибуте лево + +Update attributes on right +Освежи атрибуте десно Database file %x is incompatible. Датотека базе %x је некомпатибилна. @@ -152,9 +172,6 @@ Database file is corrupt: Датотека базе је оштећена: -Out of memory! -Недостатак меморије! - Cannot write file %x. Не могу уписати датотеку %x. @@ -164,8 +181,8 @@ Database files do not share a common session. Датотеке базе не деле заједничку сесију. -An exception occurred! -Догодило се изузеће! +Searching for folder %x... +Тражим фолдер %x... Cannot read file attributes of %x. Не могу прочитати атрибуте од %x. @@ -189,9 +206,40 @@ Creating file %x Правим датотеку %x +Items processed: +Обрађени елементи: + +Items remaining: +Преостали елементи: + +Total time: +Укупно време: + + +1 Byte +%x Bytes + + +%x Бајт +%x Бајта +%x Бајтова + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Грешка у анализи датотеке %x, ред %y, колона %z. +Cannot set directory lock for %x. +Не могу закључати фолдер %x. + Scanning: Претражујем: @@ -211,12 +259,18 @@ /sec /сек -File %x does not contain a valid configuration. -Датотека %x не садржи валидну конфигурацију. - Configuration file %x loaded partially only. Датотека подешавања %x учитана само делимично. +Show in Explorer +Прикажи у Експлореру + +Open with default application +Отвори са подразумеваном апликацијом + +Browse directory +Одабери фолдер + Cannot access Volume Shadow Copy Service. Не могу приступити Volume Shadow Copy Сервису. @@ -226,18 +280,21 @@ Cannot load file %x. Не могу учитати датотеку %x. -Path %x does not contain a volume name. -Путања %x не садржи назив партиције. +Cannot determine volume name for %x. +Не могу утврдити назив партиције за %x. -Volume name %x not part of file name %y! -Назив партиције %x није део имена датотеке %y! +Volume name %x not part of file name %y. +Назив партиције %x није део имена датотеке %y. + +Abort requested: Waiting for current operation to finish... +Прекид захтеван: Чека се да се тренутна акција заврши... + +Failure to create timestamp for versioning: +Неуспело стварање временске ознаке за верзију: Cannot read the following XML elements: Не могу прочитати следеће XML елементе: -Cannot find file %x. -Не могу пронаћи датотеку %x. - &Open... &Отвори... @@ -318,9 +375,18 @@ The command is triggered if: Cancel Одустани +RealtimeSync - Automated Synchronization +RealtimeSync - Аутоматска Синхронизација + +Warning +Упозорење + Build: %x Подверзија: %x +About +О програму + All files Све датотеке @@ -330,29 +396,125 @@ The command is triggered if: &Exit &Излаз -Monitoring active... -Надгледање активно... - Waiting for missing directories... Чека се недостајући фолдери... -A folder input field is empty. -Поље за одабир фолдера је празно. +Invalid command line: +Нетачна командна линија: + +File content +Садржај датотеке + +File time and size +Време и величина датотеке -Synchronization aborted! -Синхронизација прекинута! + Two way + Двосмерно -Synchronization completed with errors! -Синхронизација завршена с грешкама! +Mirror +Огледално -Synchronization completed with warnings. -Синхронизација завршена с упозорењима. +Update +Ажурирарно -Nothing to synchronize! -Нема ничега за синхронизацију! +Custom +Специфично -Synchronization completed successfully. -Синхронизација успешно завршена. +Multiple... +Многоструко... + +Moving file %x to %y +Премештам датотеку %x у %y + +Moving folder %x to %y +Премештам фолдер %x у %y + +Moving symbolic link %x to %y +Премештам симболичну везу %x у %y + +Removing old versions... +Уклањам старије верзије... + +Creating symbolic link %x +Креирам симболичну везу %x + +Creating folder %x +Креирам фолдер %x + +Overwriting file %x +Замењујем датотеку %x + +Overwriting symbolic link %x +Замењујем симболичну везу %x + +Verifying file %x +Проверавам датотеку %x + +Updating attributes of %x +Обнављам атрибуте од %x + +Cannot find %x. +Не могу пронаћи %x. + +Target folder %x already existing. +Одредишни фолдер %x већ постоји. + +Target folder input field must not be empty. +Поље за одабир одредишног фолдера не може бити празно. + +Folder input field for versioning must not be empty. +Поље за одабир фолдера за верзионирање не може бити празно. + +Source folder %x not found. +Изворни фолдер %x није пронађен. + +The following items have unresolved conflicts and will not be synchronized: +Следеће ставке имају неразрешених конфликата и неће бити синхронизоване: + +Significant difference detected: +Значајна разлика опажена: + +More than 50% of the total number of files will be copied or deleted. +Више од 50% од укупног броја датотека ће бити копирано или избрисано. + +Not enough free disk space available in: +Недовољно простора на диску у: + +Required: +Потребно: + +Available: +Доступно: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Фолдер ће бити промењен који је део више парова фолдера. Молимо проверите синхронизацијска подешавања. + +Synchronizing folder pair: +Синхронизовање фолдерског пара: + +Generating database... +Генерисање базе података... + +Creating Volume Shadow Copy for %x... +Креирање Volume Shadow Copy за %x... + +Data verification error: %x and %y have different content. +Грешка при провери података: %x и %y имају различит садржај. + +Synchronization aborted +Синхронизација прекинута + +Synchronization completed with errors +Синхронизација завршена с грешкама + +Synchronization completed with warnings +Синхронизација завршена с упозорењима + +Nothing to synchronize +Нема ничега за синхронизацију + +Synchronization completed successfully +Синхронизација успешно завршена Saving log file %x... Уписујем лог датотеку %x... @@ -360,8 +522,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. Притисни "Замени" за решавање проблема у FreeFileSync главном оквиру дијалога. -Switching to FreeFileSync main dialog... -Пребацујем у FreeFileSync главни оквир дијалога... +Switching to FreeFileSync main dialog +Пребацујем се на главни оквир диалога FreeFileSync-а A new version of FreeFileSync is available: Нова верзија FreeFileSync је доступна: @@ -369,29 +531,29 @@ The command is triggered if: Download now? Преузети сада? -FreeFileSync is up to date! -FreeFileSync је ажуриран! +New version found +Пронађена нова верзија -Information -Информација +&Download +&Преузми -Unable to connect to sourceforge.net! -Не могу се повезати на sourceforge.net! +FreeFileSync is up to date. +FreeFileSync је ажуриран. -Current FreeFileSync version number was not found online! Do you want to check manually? -Тренутна FreeFileSync верзија није пронађена online! Да ли желите да проверите ручно? +Information +Информација -Do you want FreeFileSync to automatically check for updates every week? -Да ли желите да FreeFileSync аутоматски провери апдејт сваке недеље? +Unable to connect to sourceforge.net. +Не могу се повезати на sourceforge.net. -(Requires an Internet connection!) -(Потребна интернет конекција!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Не могу на мрежи пронаћи тренутни број верзије FreeFileSync-а. Да ли желите да проверите ручно? - -<Сим-веза> +Symlink +Сим-веза - -<Фолдер> +Folder +Фолдер Full path Пуна путања @@ -414,12 +576,6 @@ The command is triggered if: Extension Екстензија -Size: -Величина: - -Date: -Датум: - Category Категорија @@ -444,6 +600,33 @@ The command is triggered if: Hibernate Хибернација +Selected variant: +Одабрана варијанта: + +Select alternate comparison settings +Изаберите алтернативна подешавања упоређивања + +Select alternate synchronization settings +Изаберите алтернативна подешавања синхронизације + +Filter is active +Филтер је активан + +No filter selected +Ниједан филтер није одабран + +Remove alternate settings +Уклони алтернативна подешавања + +Clear filter settings +Уклони подешавања филтера + +Copy +Копирај + +Paste +Залепи + &New &Ново @@ -462,14 +645,14 @@ The command is triggered if: &Language &Језик -&Global settings... -&Глобална подешавања... - &Export file list... &Извоз листе датотека... -&Advanced -&Напредно +&Global settings... +&Глобална подешавања... + +&Tools +&Алати &Check now &Провери сада @@ -477,12 +660,18 @@ The command is triggered if: Check &automatically once a week Провери &аутоматски једном недељно -Check for new version -Потражи новију верзију +Check for new &version +Провери постојање нове &верзије Compare Упореди +Comparison settings +Подешавања упоређивања + +Synchronization settings +Подешавања синхронизације + Synchronize Синхронизуј @@ -495,6 +684,9 @@ The command is triggered if: Swap sides Замени стране +Save as batch job +Сачувај као беч задатак + Hide excluded items Сакриј искључене ставке @@ -537,53 +729,8 @@ The command is triggered if: &Pause &Пауза -Batch job -Беч задатак - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Креирајте беч датотеку за аутоматску синхронизацију. Дупли клик на ову датотеку или додајте задатак у вашем таск менаџеру: FreeFileSync.exe <назив задатка>.ffs_batch - -Help -Помоћ - -Error handling -Грешка при обради - -Ignore -Игнориши - -Hide all error and warning messages -Сакриј све грешке и упозорења - -Pop-up -Искачући прозор - -Show pop-up on errors or warnings -Прикажи искачући прозор при грешкама и упозорењима - -Exit -Изађи - -Abort synchronization on first error -Прекини синхронизацију при првој грешци - -Show progress dialog -Прикажи дијалог прогреса - -Save log -Сачувај лог - -Select folder to save log files -Одабери фолдер за чување лог датотека - -Limit -Ограничи - -Limit maximum number of log files -Ограничи максималан број лог датотека - -Select variant -Одабери варијанту +Select a variant +Одаберите варијанту Files are found equal if @@ -598,9 +745,6 @@ are the same једнаки -File time and size -Време и величина датотеке - Files are found equal if - file content @@ -612,38 +756,41 @@ is the same једнак -File content -Садржај датотеке - Symbolic Link handling Управљање симболичним везама +Help +Помоћ + OK У реду -<- Two way -> -<- Двосмерно -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Пронађи и изврши промене на обе стране. Брисања, премештања и конфликти се откривају аутоматски употребом базе података. -Mirror ->> -Огледално ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Огледални бекап левог фолдера. Десни фолдер се модификује да би био једнак левом фолдеру након синхронизације. -Update -> -Ажурирарно -> - Copy new or updated files to right folder. Копирај нове или ажуриране датотеке у десни фолдер. -Custom -Специфично +Configure your own synchronization rules. +Конфигуришите ваша властита синхронизациона правила. + +Error handling +Грешка при обради + +Ignore +Игнориши + +Hide all error and warning messages +Сакриј све грешке и упозорења + +Pop-up +Искачући прозор -Configure your own synchronization rules. -Конфигуришите ваша властита синхронизациона правила. +Show pop-up on errors or warnings +Прикажи искачући прозор при грешкама и упозорењима Deletion handling Управљање при брисању @@ -669,23 +816,32 @@ is the same Naming convention: Правило именовања: -Item exists on left side only -Ставка постоји само на левој страни +Batch job +Беч задатак -Item exists on right side only -Ставка постоји само на десној страни +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Креирајте беч датотеку за аутоматску синхронизацију. Дупли клик на ову датотеку или додајте задатак у вашем таск менаџеру: FreeFileSync.exe <назив задатка>.ffs_batch -Left side is newer -Лева страна је новија +Exit +Изађи -Right side is newer -Десна страна је новија +Abort synchronization on first error +Прекини синхронизацију при првој грешци -Items have different content -Ставке имају различит садржај +Show progress dialog +Прикажи дијалог прогреса -Conflict/item cannot be categorized -Конфликт/ставка не може бити разврстана +Save log +Сачувај лог + +Select folder to save log files +Одабери фолдер за чување лог датотека + +Limit +Ограничи + +Limit maximum number of log files +Ограничи максималан број лог датотека Source code written in C++ using: Изворни код написан у C++ уз коришћење: @@ -705,9 +861,6 @@ is the same Homepage Веб страница -FreeFileSync at Sourceforge -FreeFileSync на Sourceforge-у - Email И-меил @@ -722,11 +875,11 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Само датотеке које одговарају свим филтерским подешавањима биће синхронизоване. -Напомена: Имена датотека морају бити релативна према основним фолдерима! +Напомена: Имена датотека морају бити релативна према основним фолдерима. Include @@ -750,6 +903,9 @@ Note: File names must be relative to base directories! &Clear &Уклони +Global settings +Глобална подешавања + Fail-safe file copy Копирање заштићено од грешака @@ -780,9 +936,6 @@ Note: File names must be relative to base directories! &Default &Подразумевано -Start synchronization -Почни синхронизацију - Variant Варијанта @@ -801,6 +954,21 @@ Note: File names must be relative to base directories! &Find next &Нађи следеће +Delete +Избриши + +Configure filter +Конфигуриши филтер + +Start synchronization +Почни синхронизацију + +Find +Пронађи + +Select time span +Изаберите временски распон + Folder pairs Фолдерски парови @@ -870,11 +1038,8 @@ Note: File names must be relative to base directories! Exclude via filter: Искључи преко филтера: - -<вишеструки одабир> - -Delete -Избриши +multiple selection +вишеструки одабир Include all Укључи све @@ -903,14 +1068,14 @@ Note: File names must be relative to base directories! Show "%x" Прикажи "%x" - -<Задња сесија> +Last session +Задња сесија Folder Comparison and Synchronization Упоређивање и синхронизација фолдера -Configuration saved! -Подешавања сачувана! +Configuration saved +Подешавања сачувана FreeFileSync batch FreeFileSync беч задатак @@ -924,9 +1089,6 @@ Note: File names must be relative to base directories! Never save changes Немој никад сачувати промене -Configuration loaded! -Подешавања учитана! - Show files that exist on left side only Прикажи датотеке које постоје само на левој страни @@ -972,17 +1134,17 @@ Note: File names must be relative to base directories! Set as default Постави као подразумевано -Operation aborted! -Операција отказана! +Operation aborted +Операција отказана -All folders are in sync! -Сви фолдери су синхронизовани! +All folders are in sync +Сви фолдери су синхронизовани Comma separated list Зарезом одвојене листе -File list exported! -Листа датотека експортована! +File list exported +Листа датотека експортована Searching for program updates... Претражујем ажурирање за програм... @@ -993,6 +1155,9 @@ Note: File names must be relative to base directories! &Ignore &Игнориши +Fatal Error +Критична грешка + Don't show this warning again Не приказуј ово упозорење поновно @@ -1014,6 +1179,9 @@ Note: File names must be relative to base directories! Comparing content... Упоређујем садржај... +Info +Инфо + Paused Паузирано @@ -1188,7 +1356,10 @@ Note: File names must be relative to base directories! Не могу креирати фолдер %x. Cannot create symbolic link %x. - +Не могу креирати симболичну везу %x. + +Cannot find system function %x. +Не могу пронаћи системску функцију %x. Cannot copy file %x to %y. Не могу копирати датотеку %x на %y. @@ -1196,15 +1367,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: Тип ставке %x није подржан: +Cannot resolve symbolic link %x. +Не могу разрешити симболичну везу %x. + Cannot open directory %x. Не могу отворити фолдер %x. Cannot enumerate directory %x. Не могу излистати фолдер %x. -Detected endless directory recursion. -Детектована неограничена фолдер рекурзија - %x TB %x TB @@ -1241,6 +1412,9 @@ Note: File names must be relative to base directories! %x дана +Failed to register to receive system messages. +Неуспела регистрација намењена пријему системских порука. + Cannot set privilege %x. Не могу поставити права за %x. @@ -1250,201 +1424,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. Не може се променити процес I/O приоритета -Unable to move %x to the Recycle Bin! -Није могуће пребацити %x у Корпи за смеће - -Both sides have changed since last synchronization! -Обе су стране промењене од последње синхронизације! - -Cannot determine sync-direction: -Не могу одредити смер синхронизације: - -No change since last synchronization! -Нема промена од задње синхронизације! - -The corresponding database entries are not in sync considering current settings. -Споменути уноси базе података нису у синхронизацији у односу на тренутна подешавања. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Постављам подразумеване синхронизацијске смерове: Старе датотеке биће замењене новијим датотекама. - -Checking recycle bin availability for folder %x... -Проверавам доступност Корпе за смеће за фолдер %x... - -Moving file %x to recycle bin -Премештам датотеку %x у Корпи за смеће - -Moving folder %x to recycle bin -Премештам фолдер %x у Корпи за смеће - -Moving symbolic link %x to recycle bin -Премештам симболичну везу %x у Корпи за смеће - -Deleting file %x -Брисање датотеке %x - -Deleting folder %x -Брисање фолдера %x - -Deleting symbolic link %x -Брисање симболичне везе %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Корпа за смеће није доступна за наведене путање! Уместо тога датотеке ће бити трајно обрисане: - -The corresponding folder will be considered as empty. -Одговарајући фолдер сматраће се празним. - -Cannot find the following folders: -Не могу пронаћи следеће фолдере: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Можете игнорисати ову грешку да би сматрали сваки фолдер празним. Фолдери ће бити креирани аутоматски током синхронизације. - -Directories are dependent! Be careful when setting up synchronization rules: -Фолдери су зависни! Будите опрезни при постављању синхронизационих правила: - -Conflict detected: -Конфликт уочен: - -File %x has an invalid date! -Датотека %x има невалидни датум! - -Files %x have the same date but a different size! -Датотеке %x имају исти датум али другачију величину! - -Items differ in attributes only -Ставке се разликују само у атрибутима - -Resolving symbolic link %x - - -Comparing content of files %x -Упоређујем садржај датотека %x - -Generating file list... -Стварам листу датотека... - -Start comparison -Почни упоређивање - -Calculating sync directions... -Одређујем смерове синхронизације... - -Both sides are equal -Обе стране су једнаке - -Copy new item to left -Копирај нову ставку лево - -Copy new item to right -Копирај нову ставку десно - -Delete left item -Избриши леву ставку - -Delete right item -Избриши десну ставку - -Move file on left -Премести датотеку лево - -Move file on right -Премести датотеку десно - -Overwrite left item -Замени леву ставку - -Overwrite right item -Замени десну ставку - -Do nothing -Не ради ништа - -Update attributes on left -Освежи атрибуте лево - -Update attributes on right -Освежи атрибуте десно - -Multiple... -Многоструко... - -Moving file %x to %y -Премештам датотеку %x у %y - -Moving folder %x to %y -Премештам фолдер %x у %y - -Moving symbolic link %x to %y -Премештам симболичну везу %x у %y - -Removing old versions... -Уклањам старије верзије... - -Creating symbolic link %x -Креирам симболичну везу %x - -Creating folder %x -Креирам фолдер %x - -Overwriting file %x -Замењујем датотеку %x - -Overwriting symbolic link %x -Замењујем симболичну везу %x - -Verifying file %x -Проверавам датотеку %x - -Updating attributes of %x -Обнављам атрибуте од %x - -Cannot find %x. -Не могу пронаћи %x. - -Target folder %x already existing. -Одредишни фолдер %x већ постоји. - -Target folder input field must not be empty. -Поље за одабир одредишног фолдера не може бити празно. - -Folder input field for versioning must not be empty. -Поље за одабир фолдера за верзионирање не може бити празно. - -Source folder %x not found. -Изворни фолдер %x није пронађен. - -The following items have unresolved conflicts and will not be synchronized: -Следеће ставке имају неразрешених конфликата и неће бити синхронизоване: - -Significant difference detected: -Значајна разлика опажена: - -More than 50% of the total number of files will be copied or deleted! -Више од 50% од укупног броја датотека ће бити копирано или избрисано! - -Not enough free disk space available in: -Недовољно простора на диску у: - -Required: -Потребно: - -Available: -Доступно: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Фолдер ће бити промењен који је део више парова фолдера. Молимо проверите синхронизацијска подешавања. - -Synchronizing folder pair: -Синхронизовање фолдерског пара: +Unable to move %x to the Recycle Bin. +Није могуће пребацити %x у Корпи за смеће. -Generating database... -Генерисање базе података... - -Creating Volume Shadow Copy for %x... -Креирање Volume Shadow Copy за %x... +Cannot determine final path for %x. +Не могу утврдити коначну путању за %x. -Data verification error: Source and target file have different content! -Грешка при проверавању података: Изворна и циљна датотека имају различите садржаје! +Error Code %x: +Грешка број %x: diff --git a/BUILD/Languages/slovenian.lng b/BUILD/Languages/slovenian.lng index a5973b7c..e368737c 100644 --- a/BUILD/Languages/slovenian.lng +++ b/BUILD/Languages/slovenian.lng @@ -1,139 +1,167 @@
- Slovenščina - Matej Badalič + Slovenščina + Matej Badalič, Tine Mlakar sl_SI - slovenia.png - 4 - n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3 + flag_slovenia.png + 4 + n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3
-Searching for folder %x... -Iskanje mape %x... +Retrying operation after error: + -Items processed: -Obdelanih elementov: +Both sides have changed since last synchronization. +Obe strani sta se spremenili od zadnje sinhronizacije. -Items remaining: -Preostalih elementov: +Cannot determine sync-direction: +Ne morem določiti sinhronizacijske smeri. -Total time: -Celoten čas: +No change since last synchronization. +Ni sprememb od zadnje sinhronizacije. -Cannot set directory lock for %x. -Ne morem nastaviti zaklepanja imenikov za %x. +The database entry is not in sync considering current settings. +Glede na trenutne nastavitve vnos v podatkovni bazi ni sinhroniziran. -Show in Explorer -Prikaži v Raziskovalcu +Setting default synchronization directions: Old files will be overwritten with newer files. +Nastavljanje privzetih smeri sinhronizacije: Stare datoteke bodo prepisane z novimi datotekami. -Open with default application -Odpri s privzeto aplikacijo +Checking recycle bin availability for folder %x... +Preverjam razpoložljivost koša za mapo %x... -Browse directory -Brskaj po imeniku +Moving file %x to recycle bin +Premikam datoteko %x v koš -Abort requested: Waiting for current operation to finish... -Zahtevana je bila prekinitev: čakam, da se zaključi trenutna operacija... +Moving folder %x to recycle bin +Premikam mapo %x v koš -Failure to create timestamp for versioning: -Napaka pri ustvarjanju časovne oznake pri ustvarjanju različic: +Moving symbolic link %x to recycle bin +Premikam simbolično povezavo %x v koš -RealtimeSync - Automated Synchronization -RealtimeSync - Avtomatizirana sinhronizacija +Deleting file %x +Brisanje datoteke %x + +Deleting folder %x +Brisanje mape %x + +Deleting symbolic link %x +Brisanje simboličnih povezav %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Za naslednje mape Koš ni na voljo. Datoteke bodo zato dokončno izbrisane: + +An exception occurred +Zgodila se je napaka + +Cannot find file %x. +Ne morem najti datoteke %x. Error Napaka -Selected variant: -Izbrana varianta: +File %x does not contain a valid configuration. +Datoteka %x ne vsebuje veljavnih nastavitev -Select alternate comparison settings -Izberite alternativne nastavitve primerjanja +A folder input field is empty. +Vnosno polje za mapo je prazno. -Select alternate synchronization settings -Izberite nadomestne nastavitve sinhronizacije +The corresponding folder will be considered as empty. +Ustrezajoča mapa bo smatrana kot prazna. -Filter is active -Filter je aktiven +Cannot find the following folders: +Ne morem najti naslednjih map: -No filter selected -Noben filter ni izbran +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +To napako, ki smatra vsako mapo kot prazno, lahko ignorirate. Mape bodo potem samodejno ustvarjene med sinhronizacijo. -Remove alternate settings -Odstrani nadomestne nastavitve +The following folders have dependent paths. Be careful when setting up synchronization rules: +Naslednje mape imajo odvisne poti. Bodite previdni pri nastavitvi sinhronizacijskih pravil: -Clear filter settings -Počisti nastavitve filtra +File %x has an invalid date. +Datoteka %x ima neveljaven datum. -Copy -Kopiraj +Date: +Datum: -Paste -Prilepi +Files %x have the same date but a different size. +Datoteki %x imata enak datum ampak različno velikost. -Save as batch job -Shrani kot paketno opravilo +Size: +Velikost: -Comparison settings -Nastavitve primerjanja +Items differ in attributes only +Elementi se razlikujejo samo v atributih -Synchronization settings -Nastavitve sinhronizacije +Resolving symbolic link %x +Razrešujem simbolično povezavo %x -About -O programu(1) +Comparing content of files %x +Primerjam vsebino datotek %x -Confirm -Potrdi +Generating file list... +Ustvarjam seznam datotek... -Configure filter -Konfiguriraj filter +Starting comparison +Začenjam primerjavo -Global settings -Globalne nastavitve +Calculating sync directions... +Preračunavam sinhronizacijske smeri... -Find -Najdi +Out of memory. +Zmanjkalo pomnilnika. -Select time span -Izberite časovni okvir +Item exists on left side only +Element obstaja samo na levi strani -Invalid command line: -Napačna ukazna vrstica: +Item exists on right side only +Element obstaja samo na desni strani -Info -Info +Left side is newer +Leva stran je novejša -Warning -Pozor +Right side is newer +Desna stran je novejša -Fatal Error -Usodna napaka +Items have different content +Elementi imajo različno vsebino -Error Code %x: -Koda napake %x: +Both sides are equal +Obe strani sta enaki -Cannot resolve symbolic link %x. -Ne morem razrešiti simbolične povezave %x. +Conflict/item cannot be categorized +Spor/element ne more biti kategoriziran - -1 Byte -%x Bytes - - -%x Bajt -%x Bajta -%x Bajti -%x Bajtov - +Copy new item to left +Kopiraj nov element na levo -%x MB -%x MB +Copy new item to right +Kopiraj nov element na desno -%x KB -%x KB +Delete left item +Izbriši levi element -%x GB -%x GB +Delete right item +Izbriše desni element + +Move file on left +Premakni datoteko na levo + +Move file on right +Premakni datoteko na desno + +Overwrite left item +Prepiši levi element + +Overwrite right item +Prepiši desni element + +Do nothing +Ne naredi ničesar + +Update attributes on left +Posodobi atribute na levi + +Update attributes on right +Posodobi atribute na desni Database file %x is incompatible. Datoteka podatkovne baze %x je nekompatibilna. @@ -147,9 +175,6 @@ Database file is corrupt: Datoteka podatkovne baze je poškodovana: -Out of memory! -Zmanjkalo pomnilnika! - Cannot write file %x. Ne morem zapisati datoteke %x. @@ -159,8 +184,8 @@ Database files do not share a common session. Datoteke podatkovne baze si ne delijo skupne seje. -An exception occurred! -Zgodila se je napaka! +Searching for folder %x... +Iskanje mape %x... Cannot read file attributes of %x. Ne morem brati datotečnih atributov od %x. @@ -185,9 +210,41 @@ Creating file %x Ustvarjam datoteko %x +Items processed: +Obdelanih elementov: + +Items remaining: +Preostalih elementov: + +Total time: +Celoten čas: + + +1 Byte +%x Bytes + + +%x Bajt +%x Bajta +%x Bajti +%x Bajtov + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Napaka pri razčlenjevanju datoteke %x, vrstica %y, stolpec %z. +Cannot set directory lock for %x. +Ne morem nastaviti zaklepanja imenikov za %x. + Scanning: Pregledujem: @@ -208,12 +265,18 @@ /sec /sek -File %x does not contain a valid configuration. -Datoteka %x ne vsebuje veljavnih nastavitev - Configuration file %x loaded partially only. Nastavitvena datoteka %x naložena samo delno. +Show in Explorer +Prikaži v Raziskovalcu + +Open with default application +Odpri s privzeto aplikacijo + +Browse directory +Brskaj po imeniku + Cannot access Volume Shadow Copy Service. Ne morem dostopati do servisa Volume Shadow Copy @@ -223,18 +286,21 @@ Cannot load file %x. Ne morem naložiti datoteko %x. -Path %x does not contain a volume name. -Pot %x ne vsebuje ime volumna. +Cannot determine volume name for %x. +Ne morem določiti ime nosilca za %x. -Volume name %x not part of file name %y! -Ime volumna %x ni del imena datoteke %y! +Volume name %x not part of file name %y. +Ime nosilca %x ni del imena datoteke %y. + +Abort requested: Waiting for current operation to finish... +Zahtevana je bila prekinitev: čakam, da se zaključi trenutna operacija... + +Failure to create timestamp for versioning: +Napaka pri ustvarjanju časovne oznake pri ustvarjanju različic: Cannot read the following XML elements: Ne morem brati naslednje XML elemente: -Cannot find file %x. -Ne morem najti datoteke %x. - &Open... &Odpri... @@ -315,9 +381,18 @@ Ukaz se sproži če: Cancel Prekliči +RealtimeSync - Automated Synchronization +RealtimeSync - Avtomatizirana sinhronizacija + +Warning +Pozor + Build: %x Izgradnja: %x +About +O programu(1) + All files Vse datoteke @@ -327,29 +402,125 @@ Ukaz se sproži če: &Exit &Izhod -Monitoring active... -Nadziranje aktivno... - Waiting for missing directories... Čakam na manjkajoče imenike... -A folder input field is empty. -Vnosno polje za mapo je prazno. +Invalid command line: +Napačna ukazna vrstica: + +File content +Vsebini datoteke + +File time and size +Čas in velikost datoteke + + Two way + Obojesmerno + +Mirror +Zrcalno + +Update +Posodobi + +Custom +Po meri + +Multiple... +Večkratno... + +Moving file %x to %y +Premikam datoteko %x v %y + +Moving folder %x to %y +Premikam mapo %x v %y + +Moving symbolic link %x to %y +Premikam simbolično povezavo %x v %y -Synchronization aborted! -Sinhronizacija prekinjena! +Removing old versions... +Odstranjujem stare različice... + +Creating symbolic link %x +Ustvarjam simbolično povezavo %x + +Creating folder %x +Ustvarjam mapo %x + +Overwriting file %x +Prepisujem datoteko %x + +Overwriting symbolic link %x +Prepisujem simbolično povezavo %x + +Verifying file %x +Preverjam datoteko %x -Synchronization completed with errors! -Sinhronizacija se je končala z napakami! +Updating attributes of %x +Posodabljam atribute od %x -Synchronization completed with warnings. -Sinhronizacija se je končala z opozorili. +Cannot find %x. +Ne morem najti %x. -Nothing to synchronize! -Nič za sinhronizirati! +Target folder %x already existing. +Ciljna mapa %x že obstaja. -Synchronization completed successfully. -Sinhronizacija se je uspešno končala. +Target folder input field must not be empty. +Vnosno polje za ciljno mapo ne sme biti prazno. + +Folder input field for versioning must not be empty. +Vnosno polje za ustvarjanje različic ne sme biti prazno. + +Source folder %x not found. +Izvorna mapa %x se ne najde. + +The following items have unresolved conflicts and will not be synchronized: +Naslednji elementi imajo nerešene konflikte in ne bodo sinhronizirani: + +Significant difference detected: +Zaznana je pomembna razlika: + +More than 50% of the total number of files will be copied or deleted. +Več kot 50% od celotnega števila datotek bo kopiranih ali izbrisanih. + +Not enough free disk space available in: +Na voljo ni dovolj prostega prostora na disku v: + +Required: +Zahtevano: + +Available: +Na voljo: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Spremenjena bo mapa, ki je del večkratnih parov map. Prosim preglejte nastavitve sinhronizacije. + +Synchronizing folder pair: +Sinhroniziram par map: + +Generating database... +Ustvarjam podatkovno bazo... + +Creating Volume Shadow Copy for %x... +Ustvarjam Senčno kopijo nosilca za %x... + +Data verification error: %x and %y have different content. +Napaka pri preverjanju podatkov: %x in %y imata drugačno vsebino. + +Synchronization aborted +Sinhronizacija prekinjena + +Synchronization completed with errors +Sinhronizacija se je končala z napakami + +Synchronization completed with warnings +Sinhronizacija se je končala z opozorili + +Nothing to synchronize +Nič za sinhronizirati + +Synchronization completed successfully +Sinhronizacija se je uspešno končala Saving log file %x... Shranjujem datoteko beleženja %x... @@ -357,8 +528,8 @@ Ukaz se sproži če: Press "Switch" to resolve issues in FreeFileSync main dialog. Pritisnite "Preklopi", da razrešite vprašanja v glavnem pogovornem oknu FreeFileSync. -Switching to FreeFileSync main dialog... -Preklapljam na FreeFileSync glavno pogovorno okno... +Switching to FreeFileSync main dialog +Preklapljam na FreeFileSync osrednje pogovorno okno A new version of FreeFileSync is available: Nova različica FreeFileSync je na voljo: @@ -366,29 +537,29 @@ Ukaz se sproži če: Download now? Prenesem sedaj? -FreeFileSync is up to date! -FreeFileSync je posodobljen! +New version found +Najdena nova verzija -Information -Informacije +&Download +&Prenesi -Unable to connect to sourceforge.net! -Ne morem se povezati na sourceforge.net! +FreeFileSync is up to date. +FreeFileSync je posodobljen. -Current FreeFileSync version number was not found online! Do you want to check manually? -Trenutno različico FreeFileSync ni moč najti na spletu! Ali želite ročno preveriti? +Information +Informacije -Do you want FreeFileSync to automatically check for updates every week? -Ali želite, da FreeFileSync samodejno preverja za posodobitve vsak teden? +Unable to connect to sourceforge.net. +Ne morem se povezati na sourceforge.net. -(Requires an Internet connection!) -(Zahteva povezavo z Internetom!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Na omrežju ne najdem obstoječe verzije FreeFileSync-a. Ali želite preveriti lastnoročno? - - +Symlink +Simbolična povezava - - +Folder +Mapa Full path Polna pot @@ -411,18 +582,12 @@ Ukaz se sproži če: Extension Razširitev -Size: -Velikost: - -Date: -Datum: +Category +Kategorija Action Ukrep -Category -Kategorija - Drag && drop Povleci && spusti @@ -441,6 +606,33 @@ Ukaz se sproži če: Hibernate Hibernacija +Selected variant: +Izbrana varianta: + +Select alternate comparison settings +Izberite alternativne nastavitve primerjanja + +Select alternate synchronization settings +Izberite nadomestne nastavitve sinhronizacije + +Filter is active +Filter je aktiven + +No filter selected +Noben filter ni izbran + +Remove alternate settings +Odstrani nadomestne nastavitve + +Clear filter settings +Počisti nastavitve filtra + +Copy +Kopiraj + +Paste +Prilepi + &New &Novo @@ -459,14 +651,14 @@ Ukaz se sproži če: &Language &Jezik -&Global settings... -&Globalne nastavitve... - &Export file list... &Izvozi seznam datotek... -&Advanced -&Napredno +&Global settings... +&Globalne nastavitve... + +&Tools +&Orodja &Check now P&reveri zdaj @@ -474,12 +666,18 @@ Ukaz se sproži če: Check &automatically once a week S&amodejno preveri enkrat tedensko -Check for new version -Preveri za novo različico +Check for new &version +Preveri, če obstaja nova &verzija Compare Primerjaj +Comparison settings +Nastavitve primerjanja + +Synchronization settings +Nastavitve sinhronizacije + Synchronize Sinhroniziraj @@ -492,6 +690,9 @@ Ukaz se sproži če: Swap sides Zamenjaj strani +Save as batch job +Shrani kot paketno opravilo + Hide excluded items Skrij izključene elemente @@ -534,53 +735,8 @@ Ukaz se sproži če: &Pause &Premor -Batch job -Paketno opravilo - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Ustvari paketno datoteko za avtomatiziranje sinhronizacije. Dvokliknite to datoteko ali jo nastavite v razpored opravil vašega sistema: FreeFileSync.exe .ffs_batch - -Help -Pomoč - -Error handling -Napaka pri obravnavanju - -Ignore -Ignoriraj - -Hide all error and warning messages -Skrij vsa obvestila o napakah in opozorilih - -Pop-up -Pogovorno okno - -Show pop-up on errors or warnings -Prikaži pojavne napaka ali opozorila - -Exit -Izhod - -Abort synchronization on first error -Prekini sinhronizacijo ob prvi napaki - -Show progress dialog -Prikazuj pogovorno okno z napredkom - -Save log -Shrani beleženje - -Select folder to save log files -Izberite mapo za shranjevanje datotek beleženja - -Limit -Omejitev - -Limit maximum number of log files -Omeji maksimalno število datotek beleženja - -Select variant -Izberite varianto +Select a variant +Izberite spremenljivko Files are found equal if @@ -595,9 +751,6 @@ Datoteki sta enaki, če sta enaka -File time and size -Čas in velikost datoteke - Files are found equal if - file content @@ -609,39 +762,42 @@ Datoteki sta enaki, če enaka -File content -Vsebini datoteke - Symbolic Link handling Rokovanje s simboličnimi povezavami +Help +Pomoč + OK V redu -<- Two way -> -<- Obojesmerno -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identificiraj in razširjaj spremembe na obeh straneh. Izbrisi, premiki in spori so samodejno zaznani z uporabo podatkovne baze. -Mirror ->> -Zrcalno ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Zrcalna varnostna kopija leve mape. Desna mapa bo spremenjena, da se bo natančno ujemala z levo mapo po sinhronizaciji. -Update -> -Posodobi -> - Copy new or updated files to right folder. Kopiraj nove ali posodobljene datoteke v desno mapo. -Custom -Po meri - Configure your own synchronization rules. Konfigurirajte vaša lastna sinhronizacijska pravila. +Error handling +Napaka pri obravnavanju + +Ignore +Ignoriraj + +Hide all error and warning messages +Skrij vsa obvestila o napakah in opozorilih + +Pop-up +Pogovorno okno + +Show pop-up on errors or warnings +Prikaži pojavne napaka ali opozorila + Deletion handling Ravnanje pri brisanju @@ -666,23 +822,32 @@ enaka Naming convention: Konvencija poimenovanja: -Item exists on left side only -Element obstaja samo na levi strani +Batch job +Paketno opravilo + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Ustvari paketno datoteko za avtomatiziranje sinhronizacije. Dvokliknite to datoteko ali jo nastavite v razpored opravil vašega sistema: FreeFileSync.exe .ffs_batch + +Exit +Izhod + +Abort synchronization on first error +Prekini sinhronizacijo ob prvi napaki -Item exists on right side only -Element obstaja samo na desni strani +Show progress dialog +Prikazuj pogovorno okno z napredkom -Left side is newer -Leva stran je novejša +Save log +Shrani beleženje -Right side is newer -Desna stran je novejša +Select folder to save log files +Izberite mapo za shranjevanje datotek beleženja -Items have different content -Elementi imajo različno vsebino +Limit +Omejitev -Conflict/item cannot be categorized -Spor/element ne more biti kategoriziran +Limit maximum number of log files +Omeji maksimalno število datotek beleženja Source code written in C++ using: Izvorna koda napisana v C++ z uporabo: @@ -702,9 +867,6 @@ enaka Homepage Domača stran -FreeFileSync at Sourceforge -FreeFileSync na Sourceforge - Email Email @@ -719,11 +881,11 @@ enaka Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Samo datoteke, ki ustrezajo vsem nastavitvam filtra bodo sinhronizirane. -Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! +Opomba: Imena datoteka morajo biti relativna osnovnim imenikom. Include @@ -747,6 +909,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! &Clear P&očisti +Global settings +Globalne nastavitve + Fail-safe file copy Kopiranje datotek varno pred odpovedjo @@ -777,9 +942,6 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! &Default &Privzeto -Start synchronization -Začni sinhronizacijo - Variant Različica @@ -798,8 +960,20 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! &Find next &Najdi naslednje -Main bar -Glavna vrstica +Delete +Izbriši + +Configure filter +Konfiguriraj filter + +Start synchronization +Začni sinhronizacijo + +Find +Najdi + +Select time span +Izberite časovni okvir Folder pairs Pari map @@ -810,6 +984,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Configuration Konfiguracija +Main bar +Glavna vrstica + Filter files Filtriraj datoteke @@ -870,11 +1047,8 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Exclude via filter: Izključi preko filtra: - - - -Delete -Izbriši +multiple selection +mnogokratna izbira Include all Vključi vse @@ -903,14 +1077,14 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Show "%x" Prikaži "%x" - - +Last session +Zadnja seja Folder Comparison and Synchronization Primerjava in sinhronizacija imenika -Configuration saved! -Konfiguracija shranjena! +Configuration saved +Konfiguracija shranjena FreeFileSync batch FreeFileSync paket @@ -924,9 +1098,6 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Never save changes Nikoli ne shrani sprememb -Configuration loaded! -Konfiguracija naložena! - Show files that exist on left side only Prikaži datoteke, ki obstajajo samo na levi @@ -972,20 +1143,17 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Set as default Nastavi kot privzeto -Operation aborted! -Operacija prekinjena! +Operation aborted +Operacija prekinjena -All folders are in sync! -Vse mape so sinhronizirane! +All folders are in sync +Vse mape so sinhronizirane Comma separated list Seznam ločen z vejico -Legend -Legenda - -File list exported! -Seznam datotek je bil izvožen! +File list exported +Seznam datotek je bil izvožen Searching for program updates... Iščem posodobitve programa... @@ -996,6 +1164,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! &Ignore &Ignoriraj +Fatal Error +Usodna napaka + Don't show this warning again Ne prikaži več tega opozorila @@ -1017,6 +1188,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Comparing content... Primerjam vsebino... +Info +Info + Paused Na premoru @@ -1123,18 +1297,18 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Leave as unresolved conflict Pusti kot nerešeni spor -Time stamp -Časovna oznaka - -Append a timestamp to each file name -Dodaj časovno oznako k vsakemu imenu datoteke - Replace Zamenjaj Move files and replace if existing Premakne datoteke in jih zamenja, če obstajajo +Time stamp +Časovna oznaka + +Append a timestamp to each file name +Dodaj časovno oznako k vsakemu imenu datoteke + Folder Mapa @@ -1177,9 +1351,6 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Cannot write modification time of %x. Ne morem zapisati časa spremembe od %x. -Cannot find system function %x. -Ne morem najti sistemske funkcije %x. - Cannot read security context of %x. Ne morem prebrati varnostnega konteksta od %x. @@ -1195,8 +1366,11 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Cannot create directory %x. Ne morem ustvariti imenika %x. -Cannot copy symbolic link %x to %y. -Ne morem kopirati simboličnih povezav %x v %y. +Cannot create symbolic link %x. +Ne morem ustvariti simbolične povezave %x. + +Cannot find system function %x. +Ne morem najti sistemske funkcije %x. Cannot copy file %x to %y. Ne morem kopirati datoteke %x v %y. @@ -1204,15 +1378,15 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Type of item %x is not supported: Element tipa %x ni podprt: +Cannot resolve symbolic link %x. +Ne morem razrešiti simbolične povezave %x. + Cannot open directory %x. Ne morem odpreti imenika %x. Cannot enumerate directory %x. Ne morem oštevilčiti imenika %x. -Detected endless directory recursion. -Zaznana neskončna imeniška rekurzija - %x TB %x TB @@ -1252,6 +1426,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! %x dni +Failed to register to receive system messages. +Neuspešna registracija za sprejem sistemskih sporočil. + Cannot set privilege %x. Ne morem nastaviti privilegija %x. @@ -1261,204 +1438,12 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom! Cannot change process I/O priorities. Ne morem spremeniti V/I prioritet procesa. -Unable to move %x to the Recycle Bin! -Ne morem premakniti %x v Koš - -Both sides have changed since last synchronization! -Obe strani sta se spremenili od zadnje sinhronizacije! - -Cannot determine sync-direction: -Ne morem določiti sinhronizacijske smeri. - -No change since last synchronization! -Ni sprememb od zadnje sinhronizacije! - -The corresponding database entries are not in sync considering current settings. -Ustrezni vnosi v podatkovni bazi niso sinhronizirani pri upoštevanju trenutnih nastavitev. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Nastavljanje privzetih smeri sinhronizacije: Stare datoteke bodo prepisane z novimi datotekami. - -Checking recycle bin availability for folder %x... -Preverjam razpoložljivost koša za mapo %x... - -Moving file %x to recycle bin -Premikam datoteko %x v koš - -Moving folder %x to recycle bin -Premikam mapo %x v koš - -Moving symbolic link %x to recycle bin -Premikam simbolično povezavo %x v koš - -Deleting file %x -Brisanje datoteke %x - -Deleting folder %x -Brisanje mape %x - -Deleting symbolic link %x -Brisanje simboličnih povezav %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Koš ni na voljo za naslednje poti! Namesto tega bodo datoteke trajno izbrisane: - -The corresponding folder will be considered as empty. -Ustrezajoča mapa bo smatrana kot prazna. - -Cannot find the following folders: -Ne morem najti naslednjih map: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -To napako, ki smatra vsako mapo kot prazno, lahko ignorirate. Mape bodo potem samodejno ustvarjene med sinhronizacijo. - -Directories are dependent! Be careful when setting up synchronization rules: -Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila: - -Start comparison -Začni primerjavo - -Calculating sync directions... -Preračunavam sinhronizacijske smeri... - -Conflict detected: -Zaznan spor: - -File %x has an invalid date! -Datoteka %x ima neveljaven datum! - -Files %x have the same date but a different size! -Datoteki %x imata enak datum ampak različno velikost! - -Items differ in attributes only -Elementi se razlikujejo samo v atributih - -Symbolic links %x have the same date but a different target. -Simbolične povezave %x imajo isti datum, vendar različno tarčo. - -Comparing content of files %x -Primerjam vsebino datotek %x - -Comparing files by content failed. -Primerjava datotek po vsebini ni uspela. - -Generating file list... -Ustvarjam seznam datotek... - -Both sides are equal -Obe strani sta enaki - -Copy new item to left -Kopiraj nov element na levo - -Copy new item to right -Kopiraj nov element na desno - -Delete left item -Izbriši levi element - -Delete right item -Izbriše desni element - -Move file on left -Premakni datoteko na levo - -Move file on right -Premakni datoteko na desno - -Overwrite left item -Prepiši levi element - -Overwrite right item -Prepiši desni element - -Do nothing -Ne naredi ničesar - -Update attributes on left -Posodobi atribute na levi - -Update attributes on right -Posodobi atribute na desni - -Multiple... -Večkratno... - -Moving file %x to %y -Premikam datoteko %x v %y - -Moving folder %x to %y -Premikam mapo %x v %y - -Moving symbolic link %x to %y -Premikam simbolično povezavo %x v %y - -Removing old versions... -Odstranjujem stare različice... - -Creating symbolic link %x -Ustvarjam simbolično povezavo %x - -Creating folder %x -Ustvarjam mapo %x - -Overwriting file %x -Prepisujem datoteko %x - -Overwriting symbolic link %x -Prepisujem simbolično povezavo %x - -Verifying file %x -Preverjam datoteko %x - -Updating attributes of %x -Posodabljam atribute od %x - -Cannot find %x. -Ne morem najti %x. - -Target folder %x already existing. -Ciljna mapa %x že obstaja. - -Target folder input field must not be empty. -Vnosno polje za ciljno mapo ne sme biti prazno. - -Folder input field for versioning must not be empty. -Vnosno polje za ustvarjanje različic ne sme biti prazno. +Unable to move %x to the Recycle Bin. +Ne morem premakniti %x v Koš. -Source folder %x not found. -Izvorna mapa %x se ne najde. - -The following items have unresolved conflicts and will not be synchronized: -Naslednji elementi imajo nerešene konflikte in ne bodo sinhronizirani: - -Significant difference detected: -Zaznana je pomembna razlika: - -More than 50% of the total number of files will be copied or deleted! -Več kot 50% od celotnega števila datotek bo kopiranih ali izbrisanih! - -Not enough free disk space available in: -Na voljo ni dovolj prostega prostora na disku v: - -Required: -Zahtevano: - -Available: -Na voljo: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Spremenjena bo mapa, ki je del večkratnih parov map. Prosim preglejte nastavitve sinhronizacije. - -Synchronizing folder pair: -Sinhroniziram par map: +Cannot determine final path for %x. +Ne morem določiti končne poti za %x. -Generating database... -Ustvarjam podatkovno bazo... - -Creating Volume Shadow Copy for %x... -Ustvarjam Senčno kopijo nosilca za %x... - -Data verification error: Source and target file have different content! -Napaka pri preverjanju podatkov: izvorna in ciljna datoteka imata različno vsebino! +Error Code %x: +Koda napake %x: diff --git a/BUILD/Languages/spanish.lng b/BUILD/Languages/spanish.lng index 3a3df962..6f48fdd6 100644 --- a/BUILD/Languages/spanish.lng +++ b/BUILD/Languages/spanish.lng @@ -1,143 +1,164 @@
- Español - Alexis Martínez + Español + I.R.Maturana (irmlab.com) es_ES - spain.png - 2 - n == 1 ? 0 : 1 + flag_spain.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Buscando carpeta %x... +Both sides have changed since last synchronization. +Ambos lados han cambiado desde la última sincronización. -Items processed: -Elementos procesados: +Cannot determine sync-direction: +No se puede determinar la dirección de la sincronización: -Items remaining: -Elementos restantes: +No change since last synchronization. +Ningún cambio desde la última sincronización. -Total time: -Tiempo total: +The database entry is not in sync considering current settings. +La entrada de la base de datos no está sincronizada, de acuerdo con la configuración actual. -Cannot set directory lock for %x. -No se pudo bloquear el directorio %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +Fijando direcciones de sincronización predeterminadas: los archivos nuevos sobrescribirán los archivos antiguos. -Show in Explorer -Mostrar en Explorer +Checking recycle bin availability for folder %x... +Comprobando disponibilidad de la papelera de reciclaje para la carpeta %x… -Open with default application -Abrir con la aplicación por defecto +Moving file %x to recycle bin +Mover archivo %x a la papelera de reciclaje -Browse directory -Examinar directorio +Moving folder %x to recycle bin +Mover carpeta %x a la papelera de reciclaje -Abort requested: Waiting for current operation to finish... -Solicitud de aborto: Esperando a que la operación actual finalice... +Moving symbolic link %x to recycle bin +Mover vínculo simbólico %x a la papelera de reciclaje -Failure to create timestamp for versioning: -Fallo al crear fecha y hora para el versionado: +Deleting file %x +Borrar archivo %x -RealtimeSync - Automated Synchronization -RealtimeSync - Sincronización Automática +Deleting folder %x +Borrar carpeta %x + +Deleting symbolic link %x +Borrar vínculo simbólico %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +La Papelera de reciclaje no está disponible para las carpetas siguientes. Los archivos se borrarán de forma permanente: + +An exception occurred +Ha ocurrido una excepción + +Cannot find file %x. +No se puede encontrar el archivo %x. Error Error -Selected variant: -Seleccionar variante: +File %x does not contain a valid configuration. +El archivo %x no contiene una configuración válida. -Select alternate comparison settings -Seleccionar opciones alternativas de comparación +A folder input field is empty. +Un campo de entrada de la carpeta está vacío. -Select alternate synchronization settings -Seleccione opciones alternativas de sincronización +The corresponding folder will be considered as empty. +La siguiente carpeta será considerada como vacía. -Filter is active -Filtro activo +Cannot find the following folders: +No se pudieron encontrar las siguiente carpetas: -No filter selected -Ningún filtro seleccionado +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Ignore este error si desea tratar cada carpeta como vacía. En tal caso, se crearán estas carpetas automáticamente durante la sincronización. -Remove alternate settings -Eliminar opciones alternativas +The following folders have dependent paths. Be careful when setting up synchronization rules: +Las carpetas siguientes usan rutas dependientes. Tenga cuidado al definir reglas de sincronización: -Clear filter settings -Limpiar opciones del filtrado +File %x has an invalid date. +El archivo %x tiene una fecha inválida. -Copy -Copiar +Date: +Fecha: -Paste -Pegar +Files %x have the same date but a different size. +Los archivos %x tienen la misma fecha pero un tamaño diferente. -Save as batch job -Salvar como tarea batch +Size: +Tamaño: -Comparison settings -Opciones de comparación +Items differ in attributes only +Los elementos sólo se diferencian en los atributos -Synchronization settings -Opciones de sincronización +Resolving symbolic link %x +Resolviendo el vínculo simbólico %x -About -Acerca de +Comparing content of files %x +Comparación del contenido de los archivos %x -Confirm -Confirmar +Generating file list... +Generando lista de archivos… -Configure filter -Configurar filtro +Starting comparison +Iniciando la comparación -Global settings -Opciones globales +Calculating sync directions... +Calculando direcciones de sincronización… -Find -Buscar +Out of memory. +Sin memoria. -Select time span -Seleccionar duración +Item exists on left side only +El elemento existe sólo en el lado izquierdo -Invalid command line: -Línea de comandos errónea: +Item exists on right side only +El elemento existe sólo en el lado derecho -Info -Info +Left side is newer +El lado izquierdo es más nuevo -Warning -Atención +Right side is newer +El lado derecho es más nuevo -Fatal Error -Error fatal +Items have different content +Los elementos tienen contenido distinto -Error Code %x: -Error: %x: +Both sides are equal +Ambos lados son iguales -Cannot resolve symbolic link %x. -No se puede resolver el enlace simbólico %x. +Conflict/item cannot be categorized +Conflicto -Cannot determine final path for %x. - +Copy new item to left +Copiar nuevo elemento a la izquierda -Cannot find system function %x. -No se puede encontrar la función del sistema %x. +Copy new item to right +Copiar nuevo elemento a la derecha - -1 Byte -%x Bytes - - -1 Byte -%x Bytes - +Delete left item +Eliminar elemento izquierdo -%x MB -%x MB +Delete right item +Eliminar elemento derecho -%x KB -%x KB +Move file on left +Mover archivo a la izquierda -%x GB -%x GB +Move file on right +Mover archivo a la derecha + +Overwrite left item +Sobrescribir elemento izquierdo + +Overwrite right item +Sobrescribir elemento derecho + +Do nothing +No hacer nada + +Update attributes on left +Actualizar atributos en la izquierda + +Update attributes on right +Actualizar atributos en la derecha Database file %x is incompatible. El archivo de base de datos %x es incompatible @@ -151,9 +172,6 @@ Database file is corrupt: El archivo de base de datos está dañado: -Out of memory! -¡Sin memoria! - Cannot write file %x. No se puede escribir el archivo %x @@ -163,8 +181,8 @@ Database files do not share a common session. Los archivos de base de datos no comparten una sesión común -An exception occurred! -¡Ha ocurrido una excepción! +Searching for folder %x... +Buscando carpeta %x… Cannot read file attributes of %x. No se puede leer archivo de atributos de %x @@ -173,23 +191,53 @@ No se puede obtener información del proceso. Waiting while directory is locked (%x)... -Esperando mientras el directorio se encuentre bloqueado (%x)... +Esperando mientras el directorio se encuentre bloqueado (%x)… 1 sec %x sec -1 seg -%x segs +1 seg. +%x seg. Creating file %x Creando archivo %x +Items processed: +Elementos procesados: + +Items remaining: +Elementos restantes: + +Total time: +Tiempo total: + + +1 Byte +%x Bytes + + +1 byte +%x bytes + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Error analizando archivo %x, fila %y, columna %z. +Cannot set directory lock for %x. +No se pudo bloquear el directorio %x. + Scanning: Escanear: @@ -198,48 +246,57 @@ [%x Threads] -[1 Hilo] -[%x Hilos] +[1 hilo] +[%x hilos] Encoding extended time information: %x -Información temporal extendida de la codificación: %x +Condificando información de hora extendida: %x /sec /seg -File %x does not contain a valid configuration. -El archivo %x no contiene una configuración válida. - Configuration file %x loaded partially only. Archivo de configuración %x cargado sólo parcialmente. +Show in Explorer +Mostrar en el Explorador + +Open with default application +Abrir con la aplicación predeterminada + +Browse directory +Examinar directorio + Cannot access Volume Shadow Copy Service. -No se puede acceder al servicio de copia Volume Shadow. +No se puede acceder al servicio de Instantánea de volumen. Please use FreeFileSync 64-bit version to create shadow copies on this system. Por favor, use la versión de 64 bits de FreeFileSync para crear copias de Shadow en el sistema. Cannot load file %x. -No se ha podido cargar el archivo %x. +No se puede cargar el archivo %x. -Path %x does not contain a volume name. -La ruta %x no contiene un nombre de volumen. +Cannot determine volume name for %x. +No se puede determinar nombre del volumen de %x. -Volume name %x not part of file name %y! -El nombre del volumen %x no es una parte del nombre de archivo %y +Volume name %x not part of file name %y. +El nombre de volumen %x no es parte del nombre de archivo %y. -Cannot read the following XML elements: -Incapaz de leer los siguientes elementos XML: +Abort requested: Waiting for current operation to finish... +Anulación solicitada: esperando a que la operación actual finalice… -Cannot find file %x. -No se puede encontrar el archivo %x. +Failure to create timestamp for versioning: +Fallo al crear fecha y hora para el versionado: + +Cannot read the following XML elements: +No se pueden leer los siguientes elementos XML: &Open... -&Abrir... +&Abrir… Save &as... -Guardar &como... +Guardar &como… &Quit &Salir @@ -260,16 +317,16 @@ Uso: 1. Select folders to watch. -1. Seleccionar carpetar para ver. +1. Seleccionar carpetas para mostrar. 2. Enter a command line. 2. Introduzca una línea de comandos. 3. Press 'Start'. -3. Presione 'Inicio'. +3. Presione ’Inicio’. To get started just import a .ffs_batch file. -Para empezar, importe un archivo .ffs_batch +Para comenzar, importe un archivo .ffs_batch Folders to watch Carpetas para ver @@ -315,9 +372,18 @@ El comando es disparado si:: Cancel Cancelar +RealtimeSync - Automated Synchronization +RealtimeSync - Sincronización Automática + +Warning +Atención + Build: %x Completado: %x +About +Acerca de + All files Todos los archivos @@ -327,38 +393,134 @@ El comando es disparado si:: &Exit &Salir -Monitoring active... -Visualización activa... - Waiting for missing directories... -Esperando directorios faltantes... +Esperando directorios faltantes… -A folder input field is empty. -Un campo de entrada de la carpeta está vacío. +Invalid command line: +Línea de comandos errónea: -Synchronization aborted! -¡Sincronización abortada! +File content +Contenido del archivo -Synchronization completed with errors! -¡Sincronización completada con errores! +File time and size +Fecha y tamaño del archivo + + Two way + Dos formas -Synchronization completed with warnings. -Sincronización completada con avisos. +Mirror +Espejo -Nothing to synchronize! -¡Nada que sincronizar! +Update +Actualizar -Synchronization completed successfully. -Sincronización completada satisfactoriamente. +Custom +Personalizado + +Multiple... +Múltiple… + +Moving file %x to %y +Mover archivo de %x a %y + +Moving folder %x to %y +Mover carpeta de %x a %y + +Moving symbolic link %x to %y +Mover vínculo simbólico de %x a %y + +Removing old versions... +Eliminando versiones antiguas… + +Creating symbolic link %x +Creando vínculo simbólico %x + +Creating folder %x +Creando carpeta %x + +Overwriting file %x +Sobrescribir archivo %x + +Overwriting symbolic link %x +Sobrescribir vínculo simbólico %x + +Verifying file %x +Verificación del archivo %x + +Updating attributes of %x +Actualizar atributos de %x + +Cannot find %x. +No se pudo encontrar %x. + +Target folder %x already existing. +La carpeta de destino %x ya existe. + +Target folder input field must not be empty. +El campo de entrada de la carpeta de destino no debe estar vacío. + +Folder input field for versioning must not be empty. +El campo de entrada de la carpeta para el control de versiones no debe estar vacío. + +Source folder %x not found. +El archivo de origen %x no ha sido encontrado. + +The following items have unresolved conflicts and will not be synchronized: +Los siguientes elementos tienen conflictos sin resolver y no serán sincronizados: + +Significant difference detected: +Diferencia significante detectada: + +More than 50% of the total number of files will be copied or deleted. +Más del 50% del número total de archivos serán copiados o eliminados. + +Not enough free disk space available in: +Espacio en disco insuficiente en: + +Required: +Requerido: + +Available: +Disponible: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Una carpeta, que es parte de múltiple pares de carpetas, será modificada. Por favor, revise las opciones de sincronización. + +Synchronizing folder pair: +Sincronizando par de carpetas: + +Generating database... +Generando base de datos… + +Creating Volume Shadow Copy for %x... +Creando Instantánea de volumen para %x… + +Data verification error: %x and %y have different content. +Error al comprobar los datos: %x y %y tienen contenidos diferentes. + +Synchronization aborted +Sincronización anulada + +Synchronization completed with errors +Sincronización completada con errores + +Synchronization completed with warnings +Sincronización completada con avisos + +Nothing to synchronize +Nada que sincronizar + +Synchronization completed successfully +Sincronización completada satisfactoriamente Saving log file %x... -Guardando registro %x... +Guardando registro %x… Press "Switch" to resolve issues in FreeFileSync main dialog. Presione "Cambiar" para resolver los problemas en el diálogo principal de FreeFileSync. -Switching to FreeFileSync main dialog... -Cambiando al diálogo principal de FreeFileSync... +Switching to FreeFileSync main dialog +Cambiando a la ventana principal de FreeFileSync A new version of FreeFileSync is available: Una nueva versión de FreeFileSync está disponible: @@ -366,29 +528,29 @@ El comando es disparado si:: Download now? ¿Descargar ahora? -FreeFileSync is up to date! -¡FreeFileSync está actualizado! +New version found +Se encontró una nueva versión -Information -Información +&Download +&Descargar -Unable to connect to sourceforge.net! -¡Incapaz de conectar con sourceforge.net! +FreeFileSync is up to date. +FreeFileSync está actualizado. -Current FreeFileSync version number was not found online! Do you want to check manually? -El numero de versión de FreeFileSync no se encontro en linea! ¿Desea comprobarlo manualmente? +Information +Información -Do you want FreeFileSync to automatically check for updates every week? -¿Quiere que FreeFileSync detecte automáticamente actualizaciones cada semana? +Unable to connect to sourceforge.net. +No se puede conectar con sourceforge.net. -(Requires an Internet connection!) -(¡Conexión a Internet necesaria!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +No se encuentra el número de versión actual de FreeFileSync en línea. ¿Desea comprobarla manualmente? - - +Symlink +Enlace simbólico - - +Folder +Carpeta Full path Ruta completa @@ -411,12 +573,6 @@ El comando es disparado si:: Extension Extensión -Size: -Tamaño: - -Date: -Fecha: - Category Categoría @@ -441,6 +597,33 @@ El comando es disparado si:: Hibernate Hibernar +Selected variant: +Seleccionar variante: + +Select alternate comparison settings +Seleccionar opciones alternativas de comparación + +Select alternate synchronization settings +Seleccione opciones alternativas de sincronización + +Filter is active +Filtro activo + +No filter selected +Ningún filtro seleccionado + +Remove alternate settings +Eliminar opciones alternativas + +Clear filter settings +Limpiar opciones del filtrado + +Copy +Copiar + +Paste +Pegar + &New &Nuevo @@ -448,7 +631,7 @@ El comando es disparado si:: &Guardar Save as &batch job... -Guardar como trabajo &batch ... +Guardar como trabajo &batch … 1. &Compare 1. &Comparar @@ -459,27 +642,33 @@ El comando es disparado si:: &Language &Idioma -&Global settings... -&Opciones globales... - &Export file list... -&Exportar lista de archivos... +&Exportar lista de archivos… -&Advanced -&Avanzado +&Global settings... +&Opciones globales… + +&Tools +Herramien&tas &Check now &Comprobar ahora Check &automatically once a week -Comprobar automáticamente una vez a la semana +Comprobar &automáticamente una vez por semana -Check for new version -Comprobar nueva versión +Check for new &version +Comprobar si hay una nueva &versión Compare Comparar +Comparison settings +Opciones de comparación + +Synchronization settings +Opciones de sincronización + Synchronize Sincronizar @@ -492,6 +681,9 @@ El comando es disparado si:: Swap sides Intercambiar lados +Save as batch job +Salvar como tarea batch + Hide excluded items Ocultar elementos excluidos @@ -502,7 +694,7 @@ El comando es disparado si:: Número de archivos y carpetas que serán creados Number of files that will be overwritten -Número de archivos que serán sobreescritos +Número de archivos que serán sobrescritos Number of files and folders that will be deleted Número de archivos y carpetas que serán eliminados @@ -523,7 +715,7 @@ El comando es disparado si:: Tiempo transcurrido: Synchronizing... -Sincronizando... +Sincronizando… On completion Al completar @@ -534,53 +726,8 @@ El comando es disparado si:: &Pause &Pausa -Batch job -Tarea por lotes - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Crear archivo batch para sincronización automática. Haga doble clic en este archivo o prográmelo en el planificador de tareas del sistema: FreeFileSync.exe .ffs_batch - -Help -Ayuda - -Error handling -Gestión de errores - -Ignore -Ignorar - -Hide all error and warning messages -Ocultar todos los mensajes de error y aviso - -Pop-up -Automático - -Show pop-up on errors or warnings -Mostrar ventana emergente de errores o avisos - -Exit -Salir - -Abort synchronization on first error -Abortar sincronización al primer error - -Show progress dialog -Mostrar diálogo de progreso - -Save log -Guardar registro - -Select folder to save log files -Seleccionar una carpeta para salvar archivos de registro - -Limit -Límite - -Limit maximum number of log files -Limitar el número máximo de archivos de registro - -Select variant -Seleccionar variante +Select a variant +Seleccione una variante Files are found equal if @@ -595,9 +742,6 @@ Los archivos serán considerados iguales si son iguales -File time and size -Fecha y tamaño del archivo - Files are found equal if - file content @@ -607,41 +751,44 @@ is the same Los archivos serán considerados iguales si - el contenido del archivo es el mismo - - -File content -Contenido del archivo + Symbolic Link handling -Gestión de enlaces simbólicos +Gestión de vínculos simbólicos + +Help +Ayuda OK OK -<- Two way -> -<- Dos formas -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. -Identificar y propagar cambios en ambos lados. Eliminaciones, movimientos y conflictos seran detectados automaticamente usando una base de datos. - -Mirror ->> -Espejo ->> +Identificar y propagar cambios en ambos lados. Eliminaciones, movimientos y conflictos serán detectados automáticamente usando una base de datos. Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Copia de seguridad en espejo de la carpeta izquierda. La carpeta derecha es modificada exactamente como la carpeta izquierda después de la sincronización. -Update -> -Actualizar -> - Copy new or updated files to right folder. Copiar archivos nuevos o actualizados a la carpeta de la derecha. -Custom -Personalizado - Configure your own synchronization rules. Configuración de sus propias reglas de sincronización. +Error handling +Gestión de errores + +Ignore +Ignorar + +Hide all error and warning messages +Ocultar todos los mensajes de error y aviso + +Pop-up +Automático + +Show pop-up on errors or warnings +Mostrar ventana emergente de errores o avisos + Deletion handling Gestión de borrado @@ -649,13 +796,13 @@ es el mismo Permanente Delete or overwrite files permanently -Borrar o sobreescribir archivos permanentemente +Borrar o Sobrescribir archivos permanentemente Recycle Bin Papelera de reciclaje Use Recycle Bin for deleted and overwritten files -Utilizar la papelera de reciclaje para archivos eliminados y sobreescritos +Utilizar la papelera de reciclaje para archivos eliminados y sobrescritos Versioning Control de versiones @@ -666,23 +813,32 @@ es el mismo Naming convention: Convención de nomenclatura: -Item exists on left side only -El elemento existe sólo en el lado izquierdo +Batch job +Tarea por lotes -Item exists on right side only -El elemento existe sólo en el lado derecho +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Crear archivo batch para sincronización automática. Haga doble clic en este archivo o prográmelo en el planificador de tareas del sistema: FreeFileSync.exe .ffs_batch -Left side is newer -El lado izquierdo es más nuevo +Exit +Salir -Right side is newer -El lado derecho es más nuevo +Abort synchronization on first error +Anular la sincronización al primer error -Items have different content -Los elementos tienen contenido distinto +Show progress dialog +Mostrar diálogo de progreso -Conflict/item cannot be categorized -Conflicto +Save log +Guardar registro + +Select folder to save log files +Seleccionar una carpeta para salvar archivos de registro + +Limit +Límite + +Limit maximum number of log files +Limitar el número máximo de archivos de registro Source code written in C++ using: Código fuente escrito en C++ utilizando: @@ -702,14 +858,11 @@ es el mismo Homepage Página de inicio -FreeFileSync at Sourceforge -FreeFileSync en Sourceforge - Email Correo electrónico Published under the GNU General Public License -Publicado bajo "GNU General Public License" +Publicado bajo GNU General Public License Delete on both sides Borrar en ambos lados @@ -719,11 +872,11 @@ es el mismo Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Sólo archivos en que coincidan todos los filtros serán sincronizados. -Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! +Aviso: Los nombres de archivos deben ser relativos a los directorios base. Include @@ -747,6 +900,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! &Clear &Borrar +Global settings +Opciones globales + Fail-safe file copy Copia de archivo a prueba de fallos @@ -757,7 +913,7 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! Copiar archivos bloqueados Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights) -Copiar archivos compartidos o bloqueados usando el servicio "Volume Shadow Copy" (Requiere derechos de administrador) +Copiar archivos compartidos o bloqueados usando el servicio "Instantánea de volumen" (Requiere derechos de administrador) Copy file access permissions Copiar permisos de acceso al archivo @@ -775,10 +931,7 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! Descripción &Default -&Configuración por defecto - -Start synchronization -Iniciar sincronización +&Configuración predeterminada Variant Tipo @@ -798,6 +951,21 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! &Find next &Buscar siguiente +Delete +Eliminar + +Configure filter +Configurar filtro + +Start synchronization +Iniciar sincronización + +Find +Buscar + +Select time span +Seleccionar duración + Folder pairs Pares de carpetas @@ -817,7 +985,7 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! Seleccione vista Open... -Abrir... +Abrir… Save Guardar @@ -847,7 +1015,10 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! %y of 1 row in view %y of %x rows in view - + +%y de 1 fila en la vista +%y de %x filas en vista + Set direction: Indicar dirección: @@ -861,11 +1032,8 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! Exclude via filter: Excluir a través del filtro: - - - -Delete -Eliminar +multiple selection +selección múltiple Include all Incluir todo @@ -886,22 +1054,22 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! Grande Select time span... -Seleccionar duración +Seleccionar duración… Default view -Vista por defecto +Vista predeterminada Show "%x" Mostrar "%x" - -<Última sesión> +Last session +Última sesión Folder Comparison and Synchronization -Comparación y Sincronización de Carpetas +Comparación y sincronización de carpetas -Configuration saved! -¡Configuración guardada! +Configuration saved +Configuración guardada FreeFileSync batch Batch de FreeFileSync @@ -910,14 +1078,11 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! ¿Quiere guardar los cambios de %x? Do&n't save -No salvar +&No guardar Never save changes Nunca guardar cambios -Configuration loaded! -¡Configuración cargada! - Show files that exist on left side only Mostrar sólo archivos existentes en la izquierda @@ -952,31 +1117,31 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! Mostrar archivos que serán eliminados en el lado derecho Show files that will be overwritten on left side -Mostrar archivos que serán sobreescritos en el lado izquierdo +Mostrar archivos que serán sobrescritos en el lado izquierdo Show files that will be overwritten on right side -Mostrar archivos que serán sobreescritos en el lado derecho +Mostrar archivos que serán sobrescritos en el lado derecho Show files that won't be copied Mostrar archivos que no serán copiados Set as default -Establecer por defecto +Predeterminado -Operation aborted! -¡Operación abortada! +Operation aborted +Operación anulada -All folders are in sync! -¡Todas las carpetas están sincronizadas! +All folders are in sync +Todas las carpetas están sincronizadas Comma separated list Lista separada por comas -File list exported! -¡Lista de archivos exportada! +File list exported +Lista de archivos exportada Searching for program updates... -Buscando actualizaciones del programa... +Buscando actualizaciones del programa… Ignore further errors Ignorar más errores @@ -984,8 +1149,11 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! &Ignore &Ignorar +Fatal Error +Error fatal + Don't show this warning again -No mostar más este aviso +No volver a mostrar este aviso &Switch &Cambiar @@ -1000,19 +1168,22 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! &No Scanning... -Escaneando... +Escaneando… Comparing content... -Comparando contenido... +Comparando contenido… + +Info +Info Paused Pausado Initializing... -Inicializando... +Inicializando… Aborted -Abortado +Anulado Completed Terminado @@ -1064,15 +1235,18 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! Do you really want to move the following %x items to the Recycle Bin? -¿De verdad quiere mover el siguiente objecto a la papelera de reciclaje? -¿De verdad quiere mover los siguientes objectos %x a la papelera de reciclaje? +¿Realmente desea mover este objeto a la papelera de reciclaje? +¿Realmente desea mover estos %x objetos a la papelera de reciclaje? Do you really want to delete the following item? Do you really want to delete the following %x items? - + +¿Realmente desea eliminar este elemento? +¿Realmente desea eliminar estos %x elementos? + Direct Enviar @@ -1129,7 +1303,7 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! Archivos Items - +Elementos Percentage Porcentaje @@ -1174,7 +1348,10 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! No se puede crear el directorio %x. Cannot create symbolic link %x. - +No se puede crear el vínculo simbólico %x. + +Cannot find system function %x. +No se puede encontrar la función del sistema %x. Cannot copy file %x to %y. No se puede copiar el archivo %x a %y. @@ -1182,15 +1359,15 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! Type of item %x is not supported: El tipo de objeto %x no esta soportado: +Cannot resolve symbolic link %x. +No se puede resolver el vínculo simbólico %x. + Cannot open directory %x. No se puede abrir el directorio %x. Cannot enumerate directory %x. No se puede enumerar el directorio %x. -Detected endless directory recursion. -Detectada recursividad de directorios sin fin. - %x TB %x TB @@ -1224,210 +1401,24 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base! %x días +Failed to register to receive system messages. +Fallo al registrar la recepción de mensajes sistema. + Cannot set privilege %x. No se puede asignar el privilegio %x. Failed to suspend system sleep mode. -Se ha fallado al intentar suspender el sistema. +Fallo al intentar suspender el sistema. Cannot change process I/O priorities. No se pudieron cambiar las priridades de E/S del proceso. -Unable to move %x to the Recycle Bin! -¡Incapaz de mover %x a la Papelera de reciclaje! - -Both sides have changed since last synchronization! -¡Ambos lados han cambiado desde la última sincronizacion! - -Cannot determine sync-direction: -No se puede determinar la dirección de la sincronización: - -No change since last synchronization! -¡Ningún cambio desde la última sincronización! - -The corresponding database entries are not in sync considering current settings. -Las correspondientes entradas de la base de datos no se encuentran en sincronización, considerando la configuración actual. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Fijando direcciones de sincronización por defecto: Los archivos viejos serán sobreescritos por los archivos nuevos. - -Checking recycle bin availability for folder %x... -Comprobando disponibilidad de la papelera de reciclaje para la carpeta %x... - -Moving file %x to recycle bin -Mover archivo %x a la papelera de reciclaje - -Moving folder %x to recycle bin -Mover carpeta %x a la papelera de reciclaje - -Moving symbolic link %x to recycle bin -Mover enlace simbólico %x a la papelera de reciclaje - -Deleting file %x -Borrar archivo %x - -Deleting folder %x -Borrar carpeta %x - -Deleting symbolic link %x -Borrar enlace simbólico %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -¡La papelera de reciclaje no está disponible para las siguientes rutas! Los archivos serán eliminados permanentemente: +Unable to move %x to the Recycle Bin. +No se puede mover %x a la Papelera de reciclaje. -The corresponding folder will be considered as empty. -La siguiente carpeta será considerada como vacia. - -Cannot find the following folders: -No se pudieron encontrar las siguiente carpetas: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. - - -Directories are dependent! Be careful when setting up synchronization rules: -¡Los directorios son dependientes! Tenga cuidado al establecer las reglas de sincronización: - -Conflict detected: -Conflicto detectado: - -File %x has an invalid date! -¡El archivo %x tiene una fecha inválida! - -Files %x have the same date but a different size! -¡Los archivos %x tienen la misma fecha pero un tamaño diferente! - -Items differ in attributes only -Los elementos sólo se diferencian en los atributos - -Resolving symbolic link %x - - -Comparing content of files %x -Comparación del contenido de los archivos %x - -Generating file list... -Generando lista de archivos... - -Start comparison -Empezar comparación - -Calculating sync directions... -Calculando direcciones de sincronización... - -Both sides are equal -Ambos lados son iguales - -Copy new item to left -Copiar nuevo elemento a la izquierda - -Copy new item to right -Copiar nuevo elemento a la derecha - -Delete left item -Eliminar elemento izquierdo - -Delete right item -Eliminar elemento derecho - -Move file on left -Mover archivo a la izquierda - -Move file on right -Mover archivo a la derecha - -Overwrite left item -Sobreescribir elemento izquierdo - -Overwrite right item -Sobreescribir elemento derecho - -Do nothing -No hacer nada - -Update attributes on left -Actualizar atributos en la izquierda - -Update attributes on right -Actualizar atributos en la derecha - -Multiple... -Múltiple... - -Moving file %x to %y -Mover archivo de %x a %y - -Moving folder %x to %y -Mover carpeta de %x a %y - -Moving symbolic link %x to %y -Mover enlace simbólico de %x a %y - -Removing old versions... -Eliminando versiones antiguas... - -Creating symbolic link %x -Creando enlace simbólico %x - -Creating folder %x -Creando carpeta %x - -Overwriting file %x -Sobreescribir archivo %x - -Overwriting symbolic link %x -Sobreescribir enlance simbólico %x - -Verifying file %x -Verificación del archivo %x - -Updating attributes of %x -Actualizar atributos de %x - -Cannot find %x. -No se pudo encontrar %x. - -Target folder %x already existing. -La carpeta de destino %x ya existe. - -Target folder input field must not be empty. -El campo de entrada de la carpeta de destino no debe estar vacío. - -Folder input field for versioning must not be empty. -El campo de entrada de la carpeta para el control de versiones no debe estar vacío. - -Source folder %x not found. -El archivo de origen %x no ha sido encontrado. - -The following items have unresolved conflicts and will not be synchronized: -Los siguientes elementos tienen conflictos sin resolver y no serán sincronizados: - -Significant difference detected: -Diferencia significante detectada: - -More than 50% of the total number of files will be copied or deleted! -¡Más del 50% del número total de archivos serán copiados o eliminados! - -Not enough free disk space available in: -Espacio en disco insuficiente en: - -Required: -Requerido: - -Available: -Disponible: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Una carpeta, que es parte de múltiple pares de carpetas, será modificada. Por favor, revise las opciones de sincronización. - -Synchronizing folder pair: -Sincronizando par de carpetas: - -Generating database... -Generando base de datos... - -Creating Volume Shadow Copy for %x... -Creando copia instantanea para %x... +Cannot determine final path for %x. +No se puede determinar la ruta final de %x. -Data verification error: Source and target file have different content! -Error de verificación de datos: ¡Los archivos de origen y destino tienen un contenido diferente! +Error Code %x: +Error: %x: diff --git a/BUILD/Languages/swedish.lng b/BUILD/Languages/swedish.lng index 0b1e2fe3..8102e92b 100644 --- a/BUILD/Languages/swedish.lng +++ b/BUILD/Languages/swedish.lng @@ -1,137 +1,164 @@
- Svenska + Svenska Åke Engelbrektson sv_SE - sweden.png - 2 - n == 1 ? 0 : 1 + flag_sweden.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -Söker efter mappen %x... +Both sides have changed since last synchronization. +Bägge sidor har ändrats sedan senaste synkroniseringen. -Items processed: -Processade poster +Cannot determine sync-direction: +Kan inte bestämma synkroniseringsriktning: -Items remaining: -Återstående poster: +No change since last synchronization. +Inga ändringar sedan senaste synkronisering. -Total time: -Total tid: +The database entry is not in sync considering current settings. +Databasposten är inte synkroniserad, i förhållande till aktuella inställningar -Cannot set directory lock for %x. -Kan inte låsa %x. +Setting default synchronization directions: Old files will be overwritten with newer files. +Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner. -Show in Explorer -Visa i Utforskaren +Checking recycle bin availability for folder %x... +Kontrollerar papperskorgens tillgänglighet för %x... -Open with default application -Öppna med standardprogram +Moving file %x to recycle bin +Flyttar filen %x till papperskorgen -Browse directory -Sök upp mapp +Moving folder %x to recycle bin +Flyttar mappen %x till papperskorgen -Abort requested: Waiting for current operation to finish... -Avbryter: Väntar på att aktuell process skall slutföras... +Moving symbolic link %x to recycle bin +Flyttar den symboliska länken %x till papperskorgen -Failure to create timestamp for versioning: -Kunde inte skapa tidsstämpel för versionshantering +Deleting file %x +Tar bort filen %x -RealtimeSync - Automated Synchronization -RealtimeSync - Automatiserad synkronisering +Deleting folder %x +Tar bort mappen %x + +Deleting symbolic link %x +Tar bort den symboliska länken %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Papperskorgen är inte tillgänglig för följande mappar. Filerna kommer att tas bort permanent istället: + +An exception occurred +Ett undantag inträffade + +Cannot find file %x. +Filen %x kan inte hittas Error Fel -Selected variant: -Vald variant: +File %x does not contain a valid configuration. +Filen %x innehåller ingen giltig konfiguration. -Select alternate comparison settings -Välj alternativa jämförelseinställningar +A folder input field is empty. +Ett inmatningsfält är tomt -Select alternate synchronization settings -Välj alternativa synkroniseringsinställningar +The corresponding folder will be considered as empty. +Motsvarande mapp kommer att betraktas som tom. -Filter is active -Filter är aktiverat +Cannot find the following folders: +Kan inte hitta följande mappar: -No filter selected -Inga filter aktiverade +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Du kan bortse från detta fel, och betrakta varje mapp som tom. Mapparna kommer då att skapas automatiskt, under synkroniseringen -Remove alternate settings -Ta bort alternativa inställningar +The following folders have dependent paths. Be careful when setting up synchronization rules: +Följande mappar har beroende sökvägar. Var försiktig vid konfigurering av synkroniseringsregler: -Clear filter settings -Rensa filterinställningar +File %x has an invalid date. +Filen %x har ett ogiltigt datum. -Copy -Kopiera +Date: +Datum: -Paste -Klistra in +Files %x have the same date but a different size. +Filerna %x har samma datum men olika storlek. -Save as batch job -Spara som batch-fil +Size: +Storlek: -Comparison settings -Jämförelseinställningar +Items differ in attributes only +Endast attribut skiljer objekten åt -Synchronization settings -Synkroniseringsinställningar +Resolving symbolic link %x +Översätter den symboliska länken %x -About -Om +Comparing content of files %x +Jämför filinnehåll för %x -Confirm -Bekräfta +Generating file list... +Skapar fillista... -Configure filter -Filterinställningar +Starting comparison +Startar jämföelse -Global settings -Allmäna inställningar +Calculating sync directions... +Beräknar synkroniseringsmappar... -Find -Sök +Out of memory. +Minnesbrist. -Select time span -Välj tidsintervall +Item exists on left side only +Objektet finns bara på vänster sida -Invalid command line: -Ogiltig kommandorad: +Item exists on right side only +Objektet finns bara på höger sida -Info -Info +Left side is newer +Vänster sida är nyare -Warning -Varning +Right side is newer +Höger sida är nyare -Fatal Error -Allvarligt fel +Items have different content +Objekten har olika innehåll -Error Code %x: -Felkod %x: +Both sides are equal +Bägge sidor är lika -Cannot resolve symbolic link %x. -Den symboliska länken %x kan inte matchas. +Conflict/item cannot be categorized +Konflikten/Objektet kan inte kategoriseras - -1 Byte -%x Bytes - - -1 Byte -%x Byte - +Copy new item to left +Kopiera nytt objekt åt vänster -%x MB -%x MB +Copy new item to right +Kopiera nytt objekt åt höger -%x KB -%x KB +Delete left item +Ta bort vänster objekt -%x GB -%x GB +Delete right item +Ta bort höger objekt + +Move file on left +Flytta fil på vänster sida + +Move file on right +Flytta fil på höger sida + +Overwrite left item +Skriv över vänster objekt + +Overwrite right item +Skriv över höger objekt + +Do nothing +Gör ingenting + +Update attributes on left +Uppdatera attribut på vänster sida + +Update attributes on right +Uppdatera attribut på höger sida Database file %x is incompatible. Databasfilen %x är inkompatibel @@ -145,9 +172,6 @@ Database file is corrupt: Databafilen är korrupt -Out of memory! -Minnesbrist! - Cannot write file %x. Filen %x kan inte skrivas @@ -157,8 +181,8 @@ Database files do not share a common session. Databasfilerna har ingen gemensam session -An exception occurred! -Ett undantag inträffade! +Searching for folder %x... +Söker efter mappen %x... Cannot read file attributes of %x. Kan inte läsa filattribut för %x @@ -181,9 +205,39 @@ Creating file %x Skapar fil %x +Items processed: +Processade poster + +Items remaining: +Återstående poster: + +Total time: +Total tid: + + +1 Byte +%x Bytes + + +1 Byte +%x Byte + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. Tolkningsfel på filen %x, rad %y, kolumn %z. +Cannot set directory lock for %x. +Kan inte låsa %x. + Scanning: Skannar: @@ -202,12 +256,18 @@ /sec /s -File %x does not contain a valid configuration. -Filen %x innehåller ingen giltig konfiguration. - Configuration file %x loaded partially only. Konfigurationsfilen %x lästes bara delvis in. +Show in Explorer +Visa i Utforskaren + +Open with default application +Öppna med standardprogram + +Browse directory +Sök upp mapp + Cannot access Volume Shadow Copy Service. Kan inte komma åt tjänsten Volume Shadow Copy. @@ -217,18 +277,21 @@ Cannot load file %x. Kan inte läsa in %x -Path %x does not contain a volume name. -Sökvägen %x innehåller inget volymnamn. +Cannot determine volume name for %x. +Kan inte utläsa volymnamn för %x + +Volume name %x not part of file name %y. +Volymnamn %x saknas i filnamn %y. -Volume name %x not part of file name %y! -Volymnamn %x saknas i filnamn %y! +Abort requested: Waiting for current operation to finish... +Avbryter: Väntar på att aktuell process skall slutföras... + +Failure to create timestamp for versioning: +Kunde inte skapa tidsstämpel för versionshantering Cannot read the following XML elements: Kan inte läsa följande XML-element: -Cannot find file %x. -Filen %x kan inte hittas - &Open... &Öppna... @@ -309,9 +372,18 @@ Kommandot triggas om: Cancel Avbryt +RealtimeSync - Automated Synchronization +RealtimeSync - Automatiserad synkronisering + +Warning +Varning + Build: %x Bygge: %x +About +Om + All files Alla filer @@ -321,29 +393,125 @@ Kommandot triggas om: &Exit &Avsluta -Monitoring active... -Övervakning aktiverad... - Waiting for missing directories... Väntar på saknade mappsökvägar... -A folder input field is empty. -Ett inmatningsfält är tomt +Invalid command line: +Ogiltig kommandorad: + +File content +Filinnehåll + +File time and size +Tidsstämpling och storlek + + Two way + Tvåvägs + +Mirror +Spegla + +Update +Uppdatera + +Custom +Anpassat + +Multiple... +Flera... + +Moving file %x to %y +Flyttar filen %x till %y + +Moving folder %x to %y +Flyttar mappen %x till %y + +Moving symbolic link %x to %y +Flyttar den symboliska länken %x till %y + +Removing old versions... +Tar bort gamla versioner... + +Creating symbolic link %x +Skapar den symboliska länken %x + +Creating folder %x +Skapar mappen %x + +Overwriting file %x +Skriver över filen %x + +Overwriting symbolic link %x +Skriver över den symboliska länken %x + +Verifying file %x +Verifierar %x + +Updating attributes of %x +Uppdaterar attribut för %x + +Cannot find %x. +Kan inte hitta %x. + +Target folder %x already existing. +Målmappen %x finns redan. + +Target folder input field must not be empty. +Indatafältet för målmapp får inte vara tomt. + +Folder input field for versioning must not be empty. +Indatafältet för versionshantering får inte vara tomt. + +Source folder %x not found. +Källmappen %x kan inte hittas. + +The following items have unresolved conflicts and will not be synchronized: +Följande objekt har olösta konflikter, och kommer inte att synkroniseras: + +Significant difference detected: +Betydande skillnad upptäckt: + +More than 50% of the total number of files will be copied or deleted. +mer än 50% av totalt filantal kommer att kopieras eller tas bort. + +Not enough free disk space available in: +Ej tillräckligt ledigt diskutrymme på: + +Required: +Utrymmeskrav: + +Available: +Tillgängligt: -Synchronization aborted! -Synkronisering avbruten! +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +En mapp som tillhör flera mapp-par är på väg att ändras. Kontrollera synkroniseringsinställningarna -Synchronization completed with errors! -Synkronisering slutförd med fel! +Synchronizing folder pair: +Synkroniserar mapp-par: + +Generating database... +Skapar databas... + +Creating Volume Shadow Copy for %x... +Skapar Volume Shadow Copy för %x... -Synchronization completed with warnings. -Synkronisering slutförd med varningar. +Data verification error: %x and %y have different content. +Dataverifieringsfel: %x och %y har olika innehåll. -Nothing to synchronize! -Det finns inget att synkronisera! +Synchronization aborted +Synkronisering avbruten -Synchronization completed successfully. -Synkronisering slutförd. +Synchronization completed with errors +Synkronisering slutförd med fel + +Synchronization completed with warnings +Synkronisering slutförd med varningar + +Nothing to synchronize +Det finns inget att synkronisera + +Synchronization completed successfully +Synkronisering slutförd Saving log file %x... Sparar loggfil %x... @@ -351,8 +519,8 @@ Kommandot triggas om: Press "Switch" to resolve issues in FreeFileSync main dialog. Tryck "Växla" för att lösa problem i FreeFileSyncs huvudfönster -Switching to FreeFileSync main dialog... -Växlar till FreeFileSyncs huvudfönster... +Switching to FreeFileSync main dialog +Växlar till FreeFileSyncs huvuddialog A new version of FreeFileSync is available: Det finns en ny version av FreeFileSync @@ -360,28 +528,28 @@ Kommandot triggas om: Download now? Ladda ner nu? -FreeFileSync is up to date! -FreeFileSync är uppdaterad! +New version found +Ny version hittad -Information -Information +&Download +&Ladda ner -Unable to connect to sourceforge.net! -Kan inte ansluta sourceforge.net! +FreeFileSync is up to date. +FreeFileSync är uppdaterad. -Current FreeFileSync version number was not found online! Do you want to check manually? -Aktuellt FreeFileSync versionsnummer kan inte hittas online! Vill du kontrollera manuellt? +Information +Information -Do you want FreeFileSync to automatically check for updates every week? -Vill du att FreeFileSync skall söka efter uppdateringar varje vecka? +Unable to connect to sourceforge.net. +Kan inte ansluta sourceforge.net. -(Requires an Internet connection!) -(Kräver Internetuppkoppling!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Kan inte hitta aktuellt versionsnummer online. Vill du kontrollera manuellt? - - +Symlink +Symboliska länkar - +Folder Mapp Full path @@ -405,18 +573,12 @@ Kommandot triggas om: Extension Filformat -Size: -Storlek: - -Date: -Datum: +Category +Kategori Action Aktivitet -Category -Kategori - Drag && drop Dra && släpp @@ -435,6 +597,33 @@ Kommandot triggas om: Hibernate Viloläge +Selected variant: +Vald variant: + +Select alternate comparison settings +Välj alternativa jämförelseinställningar + +Select alternate synchronization settings +Välj alternativa synkroniseringsinställningar + +Filter is active +Filter är aktiverat + +No filter selected +Inga filter aktiverade + +Remove alternate settings +Ta bort alternativa inställningar + +Clear filter settings +Rensa filterinställningar + +Copy +Kopiera + +Paste +Klistra in + &New &Nytt @@ -453,27 +642,33 @@ Kommandot triggas om: &Language &Språk -&Global settings... -&Allmäna inställningar... - &Export file list... &Exportera fillista... -&Advanced -&Avancerat +&Global settings... +&Allmäna inställningar... + +&Tools +&Verktyg &Check now &Sök nu Check &automatically once a week -Sök automatiskt en gång per vecka +Sök &automatiskt en gång per vecka -Check for new version -Sök efter ny version +Check for new &version +Sök efter ny &version Compare Jämför +Comparison settings +Jämförelseinställningar + +Synchronization settings +Synkroniseringsinställningar + Synchronize Synkronisera @@ -486,6 +681,9 @@ Kommandot triggas om: Swap sides Byt sida +Save as batch job +Spara som batch-fil + Hide excluded items Dölj undantagna objekt @@ -528,53 +726,8 @@ Kommandot triggas om: &Pause &Paus -Batch job -Batch-jobb - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Skapa en batch-fil för att automatisera synkroniseringen. Dubbelklicka på filen, eller använd systemets schemaläggare och schemalägg: FreeFileSync.exe .ffs_batch - -Help -Hjälp - -Error handling -Felhantering - -Ignore -Ignorera - -Hide all error and warning messages -Visa inte fel- och varningsmeddelanden - -Pop-up -Popup - -Show pop-up on errors or warnings -Visa popup vid fel och varningar - -Exit -Avsluta - -Abort synchronization on first error -Avbryt synkronisering vid första felet - -Show progress dialog -Visa förloppsindikator - -Save log -Spara logg - -Select folder to save log files -Väl en mapp att spara loggfiler i - -Limit -Begränsa - -Limit maximum number of log files -Begränsa antalet loggfiler - -Select variant -Välj variant +Select a variant +Välj en variant Files are found equal if @@ -589,9 +742,6 @@ Filer betraktas som likvärdiga om är samma. -File time and size -Tidsstämpling och storlek - Files are found equal if - file content @@ -603,39 +753,42 @@ Filerna betecknas som lika om, är lika -File content -Filinnehåll - Symbolic Link handling Hantering av Symboliska länkar +Help +Hjälp + OK OK -<- Two way -> -<- Tvåvägs -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Identifierar och sprider förändringar på båda sidor. Borttagningar, förflyttningar och konflikter detekteras automatiskt med hjälp av en databas. -Mirror ->> -Spegla ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Speglar säkerhetskopia av vänster mapp. Höger mapp ändras för att exakt matcha vänster efter synkroniseringen. -Update -> -Uppdatera -> - Copy new or updated files to right folder. Kopiera nya och uppdaterade filer till höger mapp. -Custom -Anpassat - Configure your own synchronization rules. Konfigurera dina egna synkroniseringsregler. +Error handling +Felhantering + +Ignore +Ignorera + +Hide all error and warning messages +Visa inte fel- och varningsmeddelanden + +Pop-up +Popup + +Show pop-up on errors or warnings +Visa popup vid fel och varningar + Deletion handling Borttagning @@ -660,23 +813,32 @@ Filerna betecknas som lika om, Naming convention: Regler för namngivning -Item exists on left side only -Objektet finns bara på vänster sida +Batch job +Batch-jobb + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Skapa en batch-fil för att automatisera synkroniseringen. Dubbelklicka på filen, eller använd systemets schemaläggare och schemalägg: FreeFileSync.exe .ffs_batch + +Exit +Avsluta + +Abort synchronization on first error +Avbryt synkronisering vid första felet -Item exists on right side only -Objektet finns bara på höger sida +Show progress dialog +Visa förloppsindikator -Left side is newer -Vänster sida är nyare +Save log +Spara logg -Right side is newer -Höger sida är nyare +Select folder to save log files +Väl en mapp att spara loggfiler i -Items have different content -Objekten har olika innehåll +Limit +Begränsa -Conflict/item cannot be categorized -Konflikten/Objektet kan inte kategoriseras +Limit maximum number of log files +Begränsa antalet loggfiler Source code written in C++ using: Källkod skriven i C++ med hjälp av: @@ -696,9 +858,6 @@ Filerna betecknas som lika om, Homepage Hemsida -FreeFileSync at Sourceforge -FreeFileSync på Sourceforge - Email E-post @@ -713,11 +872,11 @@ Filerna betecknas som lika om, Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. -Endast filer som matchar alla filterinställningar kommer att synkroniseras. -OBS! Filnamnen måste anges relativt till basmappar +Endast filer som matchar alla inställningar, kommer att synkroniseras. +Notera att filnamn måste stå i förhållande till basmappar Include @@ -741,6 +900,9 @@ OBS! Filnamnen måste anges relativt till basmappar &Clear &Rensa +Global settings +Allmäna inställningar + Fail-safe file copy Felsäker filkopiering @@ -771,9 +933,6 @@ OBS! Filnamnen måste anges relativt till basmappar &Default &Standard -Start synchronization -Starta synkronisering - Variant Variant @@ -792,11 +951,20 @@ OBS! Filnamnen måste anges relativt till basmappar &Find next &Sök nästa -Operation aborted! -Processen avbruten! +Delete +Ta bort -Main bar -Huvudfält +Configure filter +Filterinställningar + +Start synchronization +Starta synkronisering + +Find +Sök + +Select time span +Välj tidsintervall Folder pairs Mapp-par @@ -807,6 +975,9 @@ OBS! Filnamnen måste anges relativt till basmappar Configuration Inställningar +Main bar +Huvudfält + Filter files Undantag @@ -861,11 +1032,8 @@ OBS! Filnamnen måste anges relativt till basmappar Exclude via filter: Lägg till i undantag: - - - -Delete -Ta bort +multiple selection +flerval Include all Inkludera alla @@ -894,14 +1062,14 @@ OBS! Filnamnen måste anges relativt till basmappar Show "%x" Visa "%x" - - +Last session +Senaste session Folder Comparison and Synchronization Mappjämförelse och synkronisering -Configuration saved! -Inställningar sparade! +Configuration saved +Inställningar sparade FreeFileSync batch FreeFileSync batch @@ -915,9 +1083,6 @@ OBS! Filnamnen måste anges relativt till basmappar Never save changes Spara aldrig ändringar -Configuration loaded! -Inställningar inlästa! - Show files that exist on left side only Visa filer som endast finns till vänster @@ -963,17 +1128,17 @@ OBS! Filnamnen måste anges relativt till basmappar Set as default Ange som standard -All folders are in sync! -Alla mappar är synkroniserade! +Operation aborted +Processen avbruten + +All folders are in sync +Alla mappar är synkroniserade Comma separated list Komma-separerad lista -Legend -Förklaring - -File list exported! -Fillista exporterad! +File list exported +Fillista exporterad Searching for program updates... Söker efter programuppdateringar... @@ -984,6 +1149,9 @@ OBS! Filnamnen måste anges relativt till basmappar &Ignore &Ignorera +Fatal Error +Allvarligt fel + Don't show this warning again Visa inte denna varning igen. @@ -1005,6 +1173,9 @@ OBS! Filnamnen måste anges relativt till basmappar Comparing content... Jämför innehåll... +Info +Info + Paused Pausad @@ -1107,18 +1278,18 @@ OBS! Filnamnen måste anges relativt till basmappar Leave as unresolved conflict Ignorera konflikt -Time stamp -Tidsstämpel - -Append a timestamp to each file name -Lägg till en tidsstämpel till varje filnamn - Replace Byt ut Move files and replace if existing Flytta filer och byt ut om de redan finns +Time stamp +Tidsstämpel + +Append a timestamp to each file name +Lägg till en tidsstämpel till varje filnamn + Folder Mapp @@ -1161,9 +1332,6 @@ OBS! Filnamnen måste anges relativt till basmappar Cannot write modification time of %x. Kan inte ändra tidsangivelsen för %x. -Cannot find system function %x. -Kan inte hitta systemfunktion %x - Cannot read security context of %x. Kan inte läsa säkerhetskontext för %x. @@ -1179,8 +1347,11 @@ OBS! Filnamnen måste anges relativt till basmappar Cannot create directory %x. Kan inte skapa mappen %x. -Cannot copy symbolic link %x to %y. -Kan inte kopiera den symboliska länken %x till %y. +Cannot create symbolic link %x. +Kan inte skapa den symboliska länken, %x + +Cannot find system function %x. +Kan inte hitta systemfunktion %x Cannot copy file %x to %y. Kan inte kopiera filen %x till %y. @@ -1188,15 +1359,15 @@ OBS! Filnamnen måste anges relativt till basmappar Type of item %x is not supported: Objekttyp %x stöds ej: +Cannot resolve symbolic link %x. +Den symboliska länken %x kan inte matchas. + Cannot open directory %x. Kan inte öppna %x. Cannot enumerate directory %x. Kan inte räkna upp %x. -Detected endless directory recursion. -Upptäckte ändlös mapprekursion - %x TB %x TB @@ -1230,6 +1401,9 @@ OBS! Filnamnen måste anges relativt till basmappar %x dagar +Failed to register to receive system messages. +Kunde inte registrera att ta emot systemmeddelanden + Cannot set privilege %x. Kan inte att ange behörigheten %x. @@ -1239,210 +1413,12 @@ OBS! Filnamnen måste anges relativt till basmappar Cannot change process I/O priorities. Kan inte ändra process I/O-prioritet -Unable to move %x to the Recycle Bin! -Kan inte flytta %x till Papperskorgen - -Both sides have changed since last synchronization! -Bägge sidor har ändrats sedan senaste synkroniseringen! - -Cannot determine sync-direction: -Kan inte bestämma synkroniseringsriktning: - -No change since last synchronization! -Inga ändringar sedan senaste synkronisering! - -The corresponding database entries are not in sync considering current settings. -Aktuella databasposter är inte synkroniserad i förhållande till aktuella inställningar - -Setting default synchronization directions: Old files will be overwritten with newer files. -Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner. - -Checking recycle bin availability for folder %x... -Kontrollerar papperskorgens tillgänglighet för %x... - -Moving file %x to recycle bin -Flyttar filen %x till papperskorgen - -Moving folder %x to recycle bin -Flyttar mappen %x till papperskorgen - -Moving symbolic link %x to recycle bin -Flyttar den symboliska länken %x till papperskorgen - -Deleting file %x -Tar bort filen %x - -Deleting folder %x -Tar bort mappen %x - -Deleting symbolic link %x -Tar bort den symboliska länken %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Papperskorgen är inte tillgänglig för följande sökvägar! Filerna tas i stället bort permanent. - -The corresponding folder will be considered as empty. -Motsvarande mapp kommer att betraktas som tom. - -Cannot find the following folders: -Kan inte hitta följande mappar: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Du kan bortse från detta fel, och betrakta varje mapp som tom. Mapparna kommer då att skapas automatiskt, under synkroniseringen - -Directories are dependent! Be careful when setting up synchronization rules: -Mappar är beroende! Var försiktig när du sätter upp synkroniseringsregler: - -Start comparison -Starta jämförelse - -Calculating sync directions... -Beräknar synkroniseringsmappar... - -Conflict detected: -Konflikt upptäckt: +Unable to move %x to the Recycle Bin. +Kan inte flytta %x till Papperskorgen. -File %x has an invalid date! -Filen %x har ett ogiltigt datum! +Cannot determine final path for %x. +Kan inte utläsa slutlig sökväg för %x. -Files %x have the same date but a different size! -Filerna %x har samma datum men olika storlek! - -Items differ in attributes only -Endast attribut skiljer objekten åt - -Symbolic links %x have the same date but a different target. -De symboliska länkarna %x har samma datumstämpel men olika mål. - -Comparing content of files %x -Jämför filinnehåll för %x - -Comparing files by content failed. -Kunde inte jämföra filinnehåll. - -Generating file list... -Skapar fillista... - -Both sides are equal -Bägge sidor är lika - -Copy new item to left -Kopiera nytt objekt åt vänster - -Copy new item to right -Kopiera nytt objekt åt höger - -Delete left item -Ta bort vänster objekt - -Delete right item -Ta bort höger objekt - -Move file on left -Flytta fil på vänster sida - -Move file on right -Flytta fil på höger sida - -Overwrite left item -Skriv över vänster objekt - -Overwrite right item -Skriv över höger objekt - -Do nothing -Gör ingenting - -Update attributes on left -Uppdatera attribut på vänster sida - -Update attributes on right -Uppdatera attribut på höger sida - -Multiple... -Flera... - -Moving file %x to %y -Flyttar filen %x till %y - -Moving folder %x to %y -Flyttar mappen %x till %y - -Moving symbolic link %x to %y -Flyttar den symboliska länken %x till %y - -Removing old versions... -Tar bort gamla versioner... - -Creating symbolic link %x -Skapar den symboliska länken %x - -Creating folder %x -Skapar mappen %x - -Overwriting file %x -Skriver över filen %x - -Overwriting symbolic link %x -Skriver över den symboliska länken %x - -Verifying file %x -Verifierar %x - -Updating attributes of %x -Uppdaterar attribut för %x - -Cannot find %x. -Kan inte hitta %x. - -Target folder %x already existing. -Målmappen %x finns redan. - -Target folder input field must not be empty. -Indatafältet för målmapp får inte vara tomt. - -Folder input field for versioning must not be empty. -Indatafältet för versionshantering får inte vara tomt. - -Source folder %x not found. -Källmappen %x kan inte hittas. - -The following items have unresolved conflicts and will not be synchronized: -Följande objekt har olösta konflikter, och kommer inte att synkroniseras: - -Significant difference detected: -Betydande skillnad upptäckt: - -More than 50% of the total number of files will be copied or deleted! -mer än 50% av totalt filantal kommer att kopieras eller tas bort! - -Not enough free disk space available in: -Ej tillräckligt ledigt diskutrymme på: - -Required: -Utrymmeskrav: - -Available: -Tillgängligt: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -En mapp som tillhör flera mapp-par är på väg att ändras. Kontrollera synkroniseringsinställningarna - -Left -Vänster - -Right -Höger - -Synchronizing folder pair: -Synkroniserar mapp-par: - -Generating database... -Skapar databas... - -Creating Volume Shadow Copy for %x... -Skapar Volume Shadow Copy för %x... - -Data verification error: Source and target file have different content! -Verifikationsfel: Källfil och målfil har olika innehåll! +Error Code %x: +Felkod %x: diff --git a/BUILD/Languages/turkish.lng b/BUILD/Languages/turkish.lng index 52f44188..1d53f560 100644 --- a/BUILD/Languages/turkish.lng +++ b/BUILD/Languages/turkish.lng @@ -1,137 +1,206 @@
- Türkçe + Türkçe Kaya Zeren tr_TR - turkey.png - 2 - n == 1 ? 0 : 1 + flag_turkey.png + 2 + n == 1 ? 0 : 1
-Searching for folder %x... -%x klasörü aranıyor... +Cannot determine final path for %x. + -Items processed: -İşlenen öge: +Failed to register to receive system messages. + -Items remaining: -Kalan öge: +Cannot create symbolic link %x. + -Total time: -Toplam süre: +Do&n't save + -Cannot set directory lock for %x. -%x için klasör kilidi uygulanamıyor. +Select a variant + -Show in Explorer -Tarayıcıda Görüntüleyin +Check for new &version + -Open with default application -Varsayılan uygulama ile açın +&Tools + -Browse directory -Klasöre gözatın +Cannot find current FreeFileSync version number online. Do you want to check manually? + -Abort requested: Waiting for current operation to finish... -Vazgeçildi: Yürürlükteki işlemin bitmesi bekleniyor... +&Download + -Failure to create timestamp for versioning: -Eski sürüm için zaman damgası oluşturulamadı: +New version found + -RealtimeSync - Automated Synchronization -RealtimeSync - Kendiliğinden Eşleştirme +Retrying operation after error: + + +Switching to FreeFileSync main dialog + + +Data verification error: %x and %y have different content. + + +Cannot determine volume name for %x. + + +Starting comparison + + +Resolving symbolic link %x + + +The following folders have dependent paths. Be careful when setting up synchronization rules: + + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: + + +The database entry is not in sync considering current settings. + + +Both sides have changed since last synchronization. +Son eşleştirmeden bu yana iki tarafın da içeriği değişmiş. + +Cannot determine sync-direction: +Eşleştirme yönü belirlenemedi: + +No change since last synchronization. +Son eşleştirmeden bu yana bir değişiklik olmamış. + +Setting default synchronization directions: Old files will be overwritten with newer files. +Varsayılan eşleştirme yönleri ayarlanıyor: Yeni dosyalar eski dosyaların üzerine yazılacak. + +Checking recycle bin availability for folder %x... +%x klasörü için Geri Dönüşüm Kutusu kullanılabilir mi diye bakılıyor... + +Moving file %x to recycle bin +%x dosyası geri dönüşüm kutusuna atılıyor + +Moving folder %x to recycle bin +%x klasörü geri dönüşüm kutusuna atılıyor + +Moving symbolic link %x to recycle bin +%x sembolik 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 + +An exception occurred +Olağan dışı bir durumla karşılaşıldı + +Cannot find file %x. +%x dosyası bulunamadı. Error Hata -Selected variant: -Seçilmiş çeşit: +File %x does not contain a valid configuration. +%x dosyası geçerli ayar bilgilerini içermiyor. -Select alternate comparison settings -Alternatif karşılaştırma ayarlarını seçin +A folder input field is empty. +Bir klasör giriş alanı boş. -Select alternate synchronization settings -Alternatif eşleştirme ayarlarını seçin +The corresponding folder will be considered as empty. +Karşıdaki klasör boş olarak kabul edilecek. -Filter is active -Süzgeç etkin +Cannot find the following folders: +Aşağıdaki klasörler bulunamadı: -No filter selected -Seçilmiş süzgeç yok +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Bu hatayı yok sayarak karşıdaki klasörleri boş kabul edebilirsiniz. Bu klasörler eşleştirme sırasında kendiliğinden oluşturulur. -Remove alternate settings -Alternatif ayarları silin +File %x has an invalid date. +%x dosyasının tarihi geçersiz. -Clear filter settings -Süzgeç ayarlarını temizleyin +Date: +Tarih: -Copy -Kopyalayın +Files %x have the same date but a different size. +%x dosyalarının tarihleri aynı fakat boyutları farklı. -Paste -Yapıştırın +Size: +Boyut: -Save as batch job -Toplu iş olarak kaydedin +Items differ in attributes only +Yalnız öznitelikleri farklı ögeler -Comparison settings -Karşılaştırma ayarları +Comparing content of files %x +%x dosyalarının içeriği karşılaştırılıyor -Synchronization settings -Eşleştirme ayarları +Generating file list... +Dosya listesi oluşturuluyor... -About -Hakkında +Calculating sync directions... +Eşleştirme yönleri hesaplanıyor... -Confirm -İşlemi onaylayın +Out of memory. +Bellek yetersiz. -Configure filter -Süzgeci ayarlayın +Item exists on left side only +Sol taraftaki ögeler -Global settings -Genel ayarlar +Item exists on right side only +Sağ taraftaki ögeler -Find -Arayın +Left side is newer +Sol taraftaki daha yeni ögeler -Select time span -Zaman aralığı +Right side is newer +Sağ taraftaki daha yeni ögeler -Invalid command line: -Geçersiz komut satırı: +Items have different content +İçeriği farklı ögeler -Info -Bilgi +Both sides are equal +İki taraftada aynı -Warning -Uyarı +Conflict/item cannot be categorized +Uyuşmayan/sınıflanamayan ögeler -Fatal Error -Ölümcül Hata +Copy new item to left +Yeni öge sola kopyalansın -Error Code %x: -Hata Kodu %x: +Copy new item to right +Yeni öge sağa kopyalansın -Cannot resolve symbolic link %x. -%x simge bağlantısı çözümlenemedi +Delete left item +Soldaki öge silinsin - -1 Byte -%x Bytes - - -1 Bayt -%x Bayt - +Delete right item +Sağdaki öge silinsin -%x MB -%x MB +Move file on left +Soldaki dosya taşınsın -%x KB -%x KB +Move file on right +Sağdaki dosya taşınsın -%x GB -%x GB +Overwrite left item +Soldaki ögenin üzerine yazılsın + +Overwrite right item +Sağdaki ögenin üzerine yazılsın + +Do nothing +Hiçbir işlem yapılmasın + +Update attributes on left +Soldaki öznitelikleri güncelle + +Update attributes on right +Sağdaki öznitelikler güncellensin Database file %x is incompatible. %x veritabanı dosyası uyumsuz @@ -145,9 +214,6 @@ Database file is corrupt: Veritabanı dosyası bozulmuş: -Out of memory! -Bellek yetersiz! - Cannot write file %x. %x dosyası yazılamadı. @@ -157,8 +223,8 @@ Database files do not share a common session. Veritabanı dosyaları ortak bir oturumu paylaşamaz. -An exception occurred! -Olağan dışı bir durumla karşılaşıldı! +Searching for folder %x... +%x klasörü aranıyor... Cannot read file attributes of %x. %x dosyasının özellikleri okunamadı. @@ -181,9 +247,39 @@ Creating file %x %x dosyası ekleniyor +Items processed: +İşlenen öge: + +Items remaining: +Kalan öge: + +Total time: +Toplam süre: + + +1 Byte +%x Bytes + + +1 Bayt +%x Bayt + + +%x MB +%x MB + +%x KB +%x KB + +%x GB +%x GB + Error parsing file %x, row %y, column %z. %x dosyası işlenirken hata, satır %y, sütun %z. +Cannot set directory lock for %x. +%x için klasör kilidi uygulanamıyor. + Scanning: Taranıyor: @@ -202,12 +298,18 @@ /sec /saniye -File %x does not contain a valid configuration. -%x dosyası geçerli ayar bilgilerini içermiyor. - Configuration file %x loaded partially only. %x ayarlar dosyası kısmen yüklendi. +Show in Explorer +Tarayıcıda Görüntüleyin + +Open with default application +Varsayılan uygulama ile açın + +Browse directory +Klasöre gözatın + Cannot access Volume Shadow Copy Service. Birim Gölge Kopya hizmetine erişilemedi. @@ -217,18 +319,18 @@ Cannot load file %x. %x dosyası yüklenemedi. -Path %x does not contain a volume name. -%x yolu bir birim adı içermiyor. +Volume name %x not part of file name %y. +%x birim adı, %y dosya adının parçası değil. + +Abort requested: Waiting for current operation to finish... +Vazgeçildi: Yürürlükteki işlemin bitmesi bekleniyor... -Volume name %x not part of file name %y! -%x birim adı, %y dosya adının parçası değil! +Failure to create timestamp for versioning: +Eski sürüm için zaman damgası oluşturulamadı: Cannot read the following XML elements: Şu XML elemanları okunamadı: -Cannot find file %x. -%x dosyası bulunamadı. - &Open... &Açın... @@ -309,9 +411,18 @@ Komut şu durumlarda yürütülür: Cancel İptal Edin +RealtimeSync - Automated Synchronization +RealtimeSync - Kendiliğinden Eşleştirme + +Warning +Uyarı + Build: %x Yapım: %x +About +Hakkında + All files Tüm dosyalar @@ -321,29 +432,122 @@ Komut şu durumlarda yürütülür: &Exit Çı&kın -Monitoring active... -İzleme etkin... - Waiting for missing directories... Kayıp klasörler için bekleniyor... -A folder input field is empty. -Bir klasör giriş alanı boş. +Invalid command line: +Geçersiz komut satırı: + +File content +İçeriğe göre + +File time and size +Tarih ve saate göre + + Two way + Çift yönlü + +Mirror +Yansıtma + +Update +Güncelleme + +Custom +Özel + +Multiple... +Çoklu... + +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 + +Removing old versions... +Eski sürümler siliniyor... + +Creating symbolic link %x +%x sembolik bağlantısı ekleniyor + +Creating folder %x +%x klasörü ekleniyor + +Overwriting file %x +%x dosyasının üzerine yazılıyor + +Overwriting symbolic link %x +%x sembolik bağlantısının üzerine yazılıyor + +Verifying file %x +%x dosyası doğrulanıyor + +Updating attributes of %x +%x öznitelikleri güncelleniyor + +Cannot find %x. +%x bulunamadı. + +Target folder %x already existing. +%x hedef klasörü zaten var. + +Target folder input field must not be empty. +Hedef klasör giriş alanı boş olmamalı. + +Folder input field for versioning must not be empty. +Sürüm için klasör giriş alanı boş olmamalı. + +Source folder %x not found. +%x kaynak klasörü bulunamadı. -Synchronization aborted! -Eşleştirme durduruldu! +The following items have unresolved conflicts and will not be synchronized: +Uyuşmazlığı çözülmemiş şu ögeler eşleştirilmeyecek: -Synchronization completed with errors! -Eşleştirme bazı hatalarla tamamlandı! +Significant difference detected: +Önemli fark saptandı: -Synchronization completed with warnings. -Eşleştirme işlemi bazı uyarılarla tamamlandı. +More than 50% of the total number of files will be copied or deleted. +Dosyaların yarıdan fazlası kopyalanacak ya da silinecek. -Nothing to synchronize! -Eşleştirilecek bir şey yok! +Not enough free disk space available in: +Şurada yeterli disk alanı yok : -Synchronization completed successfully. -Eşleştirme tamamlandı. +Required: +Zorunlu: + +Available: +Kullanılabilir: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Çoklu klasör çiftlerinin parçası olan bir klasör değiştirilecek. Lütfen eşleştirme ayarlarını gözden geçirin. + +Synchronizing folder pair: +Eşleştirilen klasör çifti: + +Generating database... +Veri tabanı oluşturuluyor... + +Creating Volume Shadow Copy for %x... +%x için Birim Gölge Kopyası oluşturuluyor... + +Synchronization aborted +Eşleştirme durduruldu + +Synchronization completed with errors +Eşleştirme bazı hatalarla tamamlandı + +Synchronization completed with warnings +Eşleştirme işlemi bazı uyarılarla tamamlandı + +Nothing to synchronize +Eşleştirilecek bir şey yok + +Synchronization completed successfully +Eşleştirme tamamlandı Saving log file %x... %x günlük dosyası kaydediliyor... @@ -351,38 +555,26 @@ Komut şu durumlarda yürütülür: Press "Switch" to resolve issues in FreeFileSync main dialog. FreeFileSync ana penceresindeki sorunları çözmek için "Değiştirin" düğmesine tıklayın. -Switching to FreeFileSync main dialog... -FreeFileSync ana penceresine geçiliyor... - A new version of FreeFileSync is available: Yeni bir FreeFileSync sürümü yayınlanmış: Download now? İndirilsin mi? -FreeFileSync is up to date! -FreeFileSync güncel! +FreeFileSync is up to date. +FreeFileSync güncel. Information Bilgi -Unable to connect to sourceforge.net! -sourceforge.net sitesine bağlanılamıyor! - -Current FreeFileSync version number was not found online! Do you want to check manually? -FreeFileSync sürüm numarası çevrimiçi olarak bulunamadı! El ile denetlemek ister misiniz? - -Do you want FreeFileSync to automatically check for updates every week? -FreeFileSync güncellemelerinin her hafta denetlenmesini ister misiniz? +Unable to connect to sourceforge.net. +sourceforge.net sitesine bağlanılamıyor. -(Requires an Internet connection!) -(İnternet bağlantısı gereklidir!) +Symlink +Smblkbağlantı - - - - - +Folder +Klasör Full path Tam yol @@ -405,18 +597,12 @@ Komut şu durumlarda yürütülür: Extension Uzantı -Size: -Boyut: - -Date: -Tarih: +Category +Öge tipi Action İşlem -Category -Öge tipi - Drag && drop Klasör ya da dosyaları sürükleyip buraya bırakabilirsiniz @@ -435,6 +621,33 @@ Komut şu durumlarda yürütülür: Hibernate Hazırda bekletilsin +Selected variant: +Seçilmiş çeşit: + +Select alternate comparison settings +Alternatif karşılaştırma ayarlarını seçin + +Select alternate synchronization settings +Alternatif eşleştirme ayarlarını seçin + +Filter is active +Süzgeç etkin + +No filter selected +Seçilmiş süzgeç yok + +Remove alternate settings +Alternatif ayarları silin + +Clear filter settings +Süzgeç ayarlarını temizleyin + +Copy +Kopyalayın + +Paste +Yapıştırın + &New Ye&ni @@ -453,27 +666,27 @@ Komut şu durumlarda yürütülür: &Language Di&l -&Global settings... -&Genel ayarlar... - &Export file list... Dosya list&esini verin... -&Advanced -&Araçlar +&Global settings... +&Genel ayarlar... &Check now Sürümü &Denetleyin Check &automatically once a week -Kendiliğinden haftada bir denetlensin - -Check for new version -Yeni sürüm denetimi +&Kendiliğinden haftada bir denetlensin Compare Karşılaştırın +Comparison settings +Karşılaştırma ayarları + +Synchronization settings +Eşleştirme ayarları + Synchronize Eşleştirin @@ -486,6 +699,9 @@ Komut şu durumlarda yürütülür: Swap sides Sağ ve sol tarafları değiştirin +Save as batch job +Toplu iş olarak kaydedin + Hide excluded items Katılmayan ögeler görüntülensin @@ -528,54 +744,6 @@ Komut şu durumlarda yürütülür: &Pause &Duraklatılsın -Batch job -Toplu iş - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Toplu iş dosyası ile otomatik eşleştirme yapılabilir. Dosyadaki işlemler, çift tıklanarak ya da sisteminizdeki görev zamanlayıcıya; FreeFileSync.exe .ffs_batch şeklinde eklenerek yürütülebilir. - -Help -Yardım - -Error handling -Hata olursa: - -Ignore -Yoksayılsın - -Hide all error and warning messages -Tüm hata ve uyarı iletileri gizlenir - -Pop-up -Görüntülensin - -Show pop-up on errors or warnings -Hata ya da uyarılar açılır pencerede görüntülenir - -Exit -Çıkın - -Abort synchronization on first error -Oluşacak ilk hatada eşleştirme durdurulur - -Show progress dialog -İşlem penceresi görüntülensin - -Save log -Günlüğe kaydedilsin - -Select folder to save log files -Günlük dosyalarının kaydedileceği klasörü seçin - -Limit -Sınırla - -Limit maximum number of log files -Tutulacak en fazla günlük dosyası sayısı - -Select variant -İşlem tipini seçin: - Files are found equal if - last write time and date @@ -589,9 +757,6 @@ Dosyaların aynı sayılması için; aynı olmalıdır -File time and size -Tarih ve saate göre - Files are found equal if - file content @@ -603,39 +768,42 @@ Dosyaların aynı sayılması için; aynı olmalıdır -File content -İçeriğe göre - Symbolic Link handling Sembolik bağlantı işleme: +Help +Yardım + OK Tamam -<- Two way -> -<- Çift yönlü -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. İki taraftaki değişiklikler belirlenir ve kopyalanır. Silme, taşıma ve çakışmalar, veritabanı kullanılarak kendiliğinden algılanır. -Mirror ->> -Yansıtma ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Sol taraftaki klasör sağ tarafa yansıtılır. Eşleştirme sonrası sağ klasör, sol klasörün tamamen aynısı olur. -Update -> -Güncelleme -> - Copy new or updated files to right folder. Sol taraftaki yeni ya da güncellenmiş dosyalar sağ tarafa kopyalanır. -Custom -Özel - Configure your own synchronization rules. Eşleştirme kurallarını istediğiniz şekilde ayarlayabilirsiniz. +Error handling +Hata olursa: + +Ignore +Yoksayılsın + +Hide all error and warning messages +Tüm hata ve uyarı iletileri gizlenir + +Pop-up +Görüntülensin + +Show pop-up on errors or warnings +Hata ya da uyarılar açılır pencerede görüntülenir + Deletion handling Silinen dosyalar: @@ -660,23 +828,32 @@ aynı olmalıdır Naming convention: Adlandırma kuralı: -Item exists on left side only -Sol taraftaki ögeler +Batch job +Toplu iş + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Toplu iş dosyası ile otomatik eşleştirme yapılabilir. Dosyadaki işlemler, çift tıklanarak ya da sisteminizdeki görev zamanlayıcıya; FreeFileSync.exe .ffs_batch şeklinde eklenerek yürütülebilir. + +Exit +Çıkın + +Abort synchronization on first error +Oluşacak ilk hatada eşleştirme durdurulur -Item exists on right side only -Sağ taraftaki ögeler +Show progress dialog +İşlem penceresi görüntülensin -Left side is newer -Sol taraftaki daha yeni ögeler +Save log +Günlüğe kaydedilsin -Right side is newer -Sağ taraftaki daha yeni ögeler +Select folder to save log files +Günlük dosyalarının kaydedileceği klasörü seçin -Items have different content -İçeriği farklı ögeler +Limit +Sınırla -Conflict/item cannot be categorized -Uyuşmayan/sınıflanamayan ögeler +Limit maximum number of log files +Tutulacak en fazla günlük dosyası sayısı Source code written in C++ using: Kaynak kodu C++ kullanılarak yazılmıştır: @@ -696,9 +873,6 @@ aynı olmalıdır Homepage Web sitesi -FreeFileSync at Sourceforge -Sourceforge sitesinde FreeFileSync - Email E-posta @@ -713,11 +887,11 @@ aynı olmalıdır Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Yalnız süzgeç ayarlarına tamamen uyan dosyalar eşleştirilir. -Not: Dosya adları kök klasörlere göre bağıl olmalıdır! +Not: Dosya adları kök klasörlere göre bağıl olmalıdır. Include @@ -741,6 +915,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! &Clear &Temizleyin +Global settings +Genel ayarlar + Fail-safe file copy Dosyalar hatasız kopyalansın @@ -771,9 +948,6 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! &Default &Varsayılan -Start synchronization -Eşleştirmeyi başlatın - Variant İşlem tipi @@ -792,11 +966,20 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! &Find next &Sonrakini bulun -Operation aborted! -İşlemden vazgeçildi! +Delete +Silin -Main bar -Ana çubuk +Configure filter +Süzgeci ayarlayın + +Start synchronization +Eşleştirmeyi başlatın + +Find +Arayın + +Select time span +Zaman aralığı Folder pairs Klasör çiftleri @@ -807,6 +990,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Configuration İşlemler +Main bar +Ana çubuk + Filter files Dosya süzgeci @@ -861,11 +1047,8 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Exclude via filter: Süzerek dışarda bırakılsın: - -<çoklu seçim> - -Delete -Silin +multiple selection +çoklu seçim Include all Tümü katılsın @@ -894,14 +1077,14 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Show "%x" "%x" panelini görüntülensin - -<Önceki oturum> +Last session +Önceki oturum Folder Comparison and Synchronization Klasör Karşılaştırma ve Eşleştirme -Configuration saved! -Ayarlar kaydedildi! +Configuration saved +Ayarlar kaydedildi FreeFileSync batch FreeFileSync toplu işi @@ -909,15 +1092,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Do you want to save changes to %x? Değişiklikleri %x dosyasına kaydetmek istiyor musunuz? -Do&n't save -Kaydedilmesin - Never save changes Değişiklikler asla kaydedilmesin -Configuration loaded! -Ayarlar yüklendi! - Show files that exist on left side only Yalnız sol tarafta bulunan dosyalar görüntülensin @@ -963,17 +1140,17 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Set as default Varsayılan olarak belirleyin -All folders are in sync! -Tüm klasörler eşleştirildi. +Operation aborted +İşlemden vazgeçildi + +All folders are in sync +Tüm klasörler eşleştirildi Comma separated list Virgül ile ayrılmış liste -Legend -Gösterge - -File list exported! -Dosya listesi verildi! +File list exported +Dosya listesi verildi Searching for program updates... Yazılım güncellemesine bakılıyor... @@ -984,6 +1161,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! &Ignore &Yoksayın +Fatal Error +Ölümcül Hata + Don't show this warning again Bu uyarı artık görüntülenmesin @@ -1005,6 +1185,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Comparing content... İçerik karşılaştırılıyor... +Info +Bilgi + Paused Duraklatıldı @@ -1107,18 +1290,18 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Leave as unresolved conflict Uyuşmazlık çözülmeden bırakılsın -Time stamp -Zaman Damgası - -Append a timestamp to each file name -Dosya adlarına zaman damgası eklensin - Replace Değiştirin Move files and replace if existing Dosyalar taşınsın ve varsa üzerine yazılsın +Time stamp +Zaman Damgası + +Append a timestamp to each file name +Dosya adlarına zaman damgası eklensin + Folder Klasör @@ -1161,9 +1344,6 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Cannot write modification time of %x. %x son değişiklik zamanı yazılamadı. -Cannot find system function %x. -%x sistem işlevi bulunamadı. - Cannot read security context of %x. %x için güvenlik bağlamı okunamadı. @@ -1179,8 +1359,8 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Cannot create directory %x. %x klasörü eklenemedi. -Cannot copy symbolic link %x to %y. -%x simgesel bağlantısı %y olarak kopyalanamadı. +Cannot find system function %x. +%x sistem işlevi bulunamadı. Cannot copy file %x to %y. %x dosyası %y olarak kopyalanamadı. @@ -1188,15 +1368,15 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Type of item %x is not supported: %x ögesi tipi desteklenmiyor: +Cannot resolve symbolic link %x. +%x simge bağlantısı çözümlenemedi + Cannot open directory %x. %x klasörü açılamadı. Cannot enumerate directory %x. %x klasörü sayılamadı. -Detected endless directory recursion. -Sonsuz klasör kısayol döngüsü algılandı. - %x TB %x TB @@ -1239,210 +1419,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır! Cannot change process I/O priorities. Giriş/Çıkış işlemi öncelikleri değiştirilemedi -Unable to move %x to the Recycle Bin! -%x Geri Dönüşüm Kutusuna gönderilemedi - -Both sides have changed since last synchronization! -Son eşleştirmeden bu yana iki tarafın da içeriği değişmiş! - -Cannot determine sync-direction: -Eşleştirme yönü belirlenemedi: - -No change since last synchronization! -Son eşleştirmeden bu yana bir değişiklik olmamış! - -The corresponding database entries are not in sync considering current settings. -Geçerli ayarlar ile ilgili veritabanı kayıtları eşleşmiyor. - -Setting default synchronization directions: Old files will be overwritten with newer files. -Varsayılan eşleştirme yönleri ayarlanıyor: Yeni dosyalar eski dosyaların üzerine yazılacak. - -Checking recycle bin availability for folder %x... -%x klasörü için Geri Dönüşüm Kutusu kullanılabilir mi diye bakılıyor... - -Moving file %x to recycle bin -%x dosyası geri dönüşüm kutusuna atılıyor - -Moving folder %x to recycle bin -%x klasörü geri dönüşüm kutusuna atılıyor - -Moving symbolic link %x to recycle bin -%x sembolik 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 - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Aşağıdaki yollar için Geri Dönüşüm Kutusu kullanılamaz! Dosyalar anında ve tamamen silinir: - -The corresponding folder will be considered as empty. -Karşıdaki klasör boş olarak kabul edilecek. - -Cannot find the following folders: -Aşağıdaki klasörler bulunamadı: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Bu hatayı yok sayarak karşıdaki klasörleri boş kabul edebilirsiniz. Bu klasörler eşleştirme sırasında kendiliğinden oluşturulur. - -Directories are dependent! Be careful when setting up synchronization rules: -Klasörler bağımlı! Eşleştirme kurallarını koyarken dikkatli olun: - -Start comparison -Karşılaştırmaya başlayın - -Calculating sync directions... -Eşleştirme yönleri hesaplanıyor... - -Conflict detected: -Uyuşmazlık bulundu: - -File %x has an invalid date! -%x dosyasının tarihi geçersiz! +Unable to move %x to the Recycle Bin. +%x Geri Dönüşüm Kutusuna gönderilemedi. -Files %x have the same date but a different size! -%x dosyalarının tarihleri aynı fakat boyutları farklı! - -Items differ in attributes only -Yalnız öznitelikleri farklı ögeler - -Symbolic links %x have the same date but a different target. -%x simgesel bağlantıları aynı tarihe sahip ancak hedef yolları farklı. - -Comparing content of files %x -%x dosyalarının içeriği karşılaştırılıyor - -Comparing files by content failed. -Dosyaların içerikleri karşılaştırılamadı. - -Generating file list... -Dosya listesi oluşturuluyor... - -Both sides are equal -İki taraftada aynı - -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 - -Overwrite left item -Soldaki ögenin üzerine yazılsın - -Overwrite right item -Sağdaki ögenin üzerine yazılsın - -Do nothing -Hiçbir işlem yapılmasın - -Update attributes on left -Soldaki öznitelikleri güncelle - -Update attributes on right -Sağdaki öznitelikler güncellensin - -Multiple... -Çoklu... - -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 - -Removing old versions... -Eski sürümler siliniyor... - -Creating symbolic link %x -%x sembolik bağlantısı ekleniyor - -Creating folder %x -%x klasörü ekleniyor - -Overwriting file %x -%x dosyasının üzerine yazılıyor - -Overwriting symbolic link %x -%x sembolik bağlantısının üzerine yazılıyor - -Verifying file %x -%x dosyası doğrulanıyor - -Updating attributes of %x -%x öznitelikleri güncelleniyor - -Cannot find %x. -%x bulunamadı. - -Target folder %x already existing. -%x hedef klasörü zaten var. - -Target folder input field must not be empty. -Hedef klasör giriş alanı boş olmamalı. - -Folder input field for versioning must not be empty. -Sürüm için klasör giriş alanı boş olmamalı. - -Source folder %x not found. -%x kaynak klasörü bulunamadı. - -The following items have unresolved conflicts and will not be synchronized: -Uyuşmazlığı çözülmemiş şu ögeler eşleştirilmeyecek: - -Significant difference detected: -Önemli fark saptandı: - -More than 50% of the total number of files will be copied or deleted! -Dosyaların yarıdan fazlası kopyalanacak ya da silinecek! - -Not enough free disk space available in: -Şurada yeterli disk alanı yok : - -Required: -Zorunlu: - -Available: -Kullanılabilir: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Çoklu klasör çiftlerinin parçası olan bir klasör değiştirilecek. Lütfen eşleştirme ayarlarını gözden geçirin. - -Left -Sol - -Right -Sağ - -Synchronizing folder pair: -Eşleştirilen klasör çifti: - -Generating database... -Veri tabanı oluşturuluyor... - -Creating Volume Shadow Copy for %x... -%x için Birim Gölge Kopyası oluşturuluyor... - -Data verification error: Source and target file have different content! -Veri doğrulama hatası: Kaynak ve hedef dosyanın içerikleri farklı! +Error Code %x: +Hata Kodu %x: diff --git a/BUILD/Languages/ukrainian.lng b/BUILD/Languages/ukrainian.lng index 49997d5c..68b045a1 100644 --- a/BUILD/Languages/ukrainian.lng +++ b/BUILD/Languages/ukrainian.lng @@ -1,138 +1,170 @@
- Українська + Українська Roman Ardan uk_UA - ukraine.png - 3 - n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2 + flag_ukraine.png + 3 + n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2
-Searching for folder %x... -Пошук каталогу %x... +Retrying operation after error: + -Items processed: -Елементів оброблено: +Both sides have changed since last synchronization. +З моменту останньої синхронізації з обох сторін відбулися зміни. -Items remaining: -Елементів залишилось: +Cannot determine sync-direction: +Не можна визначити напрям синхронізації: -Total time: -Загальний час: +No change since last synchronization. +Жодних змін з останньої синхронізації. -Cannot set directory lock for %x. -Не вдається замкнути каталога %x. +The database entry is not in sync considering current settings. +Запис бази даних не синхронізований з урахуванням поточних налаштувань. -Show in Explorer -Показати у Провіднику +Setting default synchronization directions: Old files will be overwritten with newer files. + +Налаштування напряму синхронізації за замовчуванням: +Старі файли будуть замінені новішими файлами. + -Open with default application -Відкрити за допомогою програми за замовчуванням +Checking recycle bin availability for folder %x... +Перевірка доступності Корзини для папки %x... -Browse directory -Переглянути каталог +Moving file %x to recycle bin +Переміщення файлу %x у Корзину -Abort requested: Waiting for current operation to finish... -Запит переривання: В очікуванні завершення поточної операції... +Moving folder %x to recycle bin +Переміщення папки %x у Корзину -Failure to create timestamp for versioning: -Не вдається створити часової мітки для версій: +Moving symbolic link %x to recycle bin +Переміщення символьного посилання %x у Корзину -RealtimeSync - Automated Synchronization -RealtimeSync - Автоматична синхронізація +Deleting file %x +Вилучення файлу %x + +Deleting folder %x +Вилучення папки %x + +Deleting symbolic link %x +Вилучення символьного посилання %x + +The Recycle Bin is not available for the following folders. Files will be deleted permanently instead: +Корзина для папок недоступна. Файли будуть вилучені назавжди: + +An exception occurred +Відбулось виключення + +Cannot find file %x. +Не вдається знайти файлу %x. Error Помилка -Selected variant: -Вибраний варіант: +File %x does not contain a valid configuration. +Файл %x не містить правильної конфігурації. -Select alternate comparison settings -Вибрати альтернативні налаштування порівняння +A folder input field is empty. +Порожнє поле папки. -Select alternate synchronization settings -Вибрати альтернативні налаштування синхронізації +The corresponding folder will be considered as empty. +Відповідна папка буде вважатися порожньою. -Filter is active -Фільтр активний +Cannot find the following folders: +Не вдається знайти такі папки: -No filter selected -Не вибрано жодного фільтра +You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. +Ви можете ігнорувати цю помилку, вважаючи кожну папку порожньою. Папки будуть автоматично створені під час синхронізації. -Remove alternate settings -Вилучити альтернативні налаштування +The following folders have dependent paths. Be careful when setting up synchronization rules: +Наступні папки мають залежні шляхи. Будьте обережні при налаштуванні правил синхронізації: -Clear filter settings -Очистити налаштування фільтра +File %x has an invalid date. +Файл %x має неіснуючу дату. -Copy -Копіювати +Date: +Дата: -Paste -Вклеїти +Files %x have the same date but a different size. +Файли %x мають однакову дату, але різні за розміром. -Save as batch job -Зберегти як пакетне завдання +Size: +Розмір: -Comparison settings -Налаштування порівнювання +Items differ in attributes only +Елементи відрізняються тільки атрибутами -Synchronization settings -Налаштування синхронізації +Resolving symbolic link %x +Вирішення символьного посилання %x -About -Про +Comparing content of files %x +Порівнювання вмісту файлів %x -Confirm -Підтвердити +Generating file list... +Створення списку файлів... -Configure filter -Налаштування фільтра +Starting comparison +Початок порівняння -Global settings -Глобальні налаштування +Calculating sync directions... +Встановлення напрямку синхронізації... -Find -Знайти +Out of memory. +Бракує пам'яті. -Select time span -Виберіть часовий інтервал +Item exists on left side only +Елемент існує тільки ліворуч -Invalid command line: -Неправильний командний рядок: +Item exists on right side only +Елемент існує тільки праворуч -Info -Інформація +Left side is newer +Ліва сторона новіша -Warning -Увага +Right side is newer +Права сторона новіша -Fatal Error -Критична помилка +Items have different content +Елементи мають різний вміст -Error Code %x: -Код помилки %x: +Both sides are equal +Сторони ідентичні -Cannot resolve symbolic link %x. -Не вдається вирішити символьне посилання %x. +Conflict/item cannot be categorized +Не вдається категоризувати конфлікт/елемент - -1 Byte -%x Bytes - - -%x байт -%x байти -%x байтів - +Copy new item to left +Копіювати нові елементи ліворуч -%x MB -%x МБ +Copy new item to right +Копіювати нові елементи праворуч -%x KB -%x КБ +Delete left item +Вилучити елемент ліворуч -%x GB -%x ГБ +Delete right item +Вилучити елемент праворуч + +Move file on left +Перемістити файли ліворуч + +Move file on right +Перемістити файли праворуч + +Overwrite left item +Перезаписати елемент ліворуч + +Overwrite right item +Перезаписати елемент праворуч + +Do nothing +Нічого не робити + +Update attributes on left +Оновити атрибути ліворуч + +Update attributes on right +Оновити атрибути праворуч Database file %x is incompatible. Несумісний файл бази даних %x. @@ -146,9 +178,6 @@ Database file is corrupt: Файл бази даних пошкоджений: -Out of memory! -Бракує пам'яті! - Cannot write file %x. Не вдається записати файл %x. @@ -158,8 +187,8 @@ Database files do not share a common session. Файли баз даних не поділяють спільну сесію. -An exception occurred! -Відбулось виключення! +Searching for folder %x... +Пошук каталогу %x... Cannot read file attributes of %x. Не вдається прочитати атрибути файла %x. @@ -183,9 +212,40 @@ Creating file %x Створення файлу %x +Items processed: +Елементів оброблено: + +Items remaining: +Елементів залишилось: + +Total time: +Загальний час: + + +1 Byte +%x Bytes + + +%x байт +%x байти +%x байтів + + +%x MB +%x МБ + +%x KB +%x КБ + +%x GB +%x ГБ + Error parsing file %x, row %y, column %z. Помилка розбору файла %x, рядок %y, колонка %z. +Cannot set directory lock for %x. +Не вдається замкнути каталога %x. + Scanning: Сканую: @@ -205,12 +265,18 @@ /sec /сек -File %x does not contain a valid configuration. -Файл %x не містить правильної конфігурації. - Configuration file %x loaded partially only. Файл конфігурації %x завантажено лише частково. +Show in Explorer +Показати у Провіднику + +Open with default application +Відкрити за допомогою програми за замовчуванням + +Browse directory +Переглянути каталог + Cannot access Volume Shadow Copy Service. Не вдається отримати доступ до послуги тіньового копіювання тому @@ -220,38 +286,41 @@ Cannot load file %x. Не вдається завантажити файл %x. -Path %x does not contain a volume name. -Шлях %x не містить імені тому +Cannot determine volume name for %x. +Не вдалося встановити ім'я тому для %x. -Volume name %x not part of file name %y! -Ім’я тому %x не є частиною імені файлу %y! +Volume name %x not part of file name %y. +Ім’я тому %x не є частиною імені файлу %y. + +Abort requested: Waiting for current operation to finish... +Запит переривання: В очікуванні завершення поточної операції... + +Failure to create timestamp for versioning: +Не вдається створити часової мітки для версій: Cannot read the following XML elements: Не вдається прочитати такі елементи XML: -Cannot find file %x. -Не вдається знайти файлу %x. - &Open... -Відкрити... +&Відкрити... Save &as... -Зберегти як... +Зберегти &як... &Quit -Вихід +&Вихід &Program -Програма +&Програма &Content -Зміст +&Зміст &About -Про програму +&Про програму &Help -Допомога +&Допомога Usage: Використання: @@ -312,9 +381,18 @@ The command is triggered if: Cancel Відмінити +RealtimeSync - Automated Synchronization +RealtimeSync - Автоматична синхронізація + +Warning +Увага + Build: %x компіляція %x +About +Про + All files Всі файли @@ -324,29 +402,125 @@ The command is triggered if: &Exit &Вихід -Monitoring active... -Моніторинг включений... - Waiting for missing directories... Очікування пропущених каталогів... -A folder input field is empty. -Порожнє поле папки. +Invalid command line: +Неправильний командний рядок: + +File content +Вміст файлу -Synchronization aborted! -Синхронізація припинена! +File time and size +Дата та розмір файлу -Synchronization completed with errors! -Синхронізація закінчилася з помилками! + Two way + Обидва напрямки -Synchronization completed with warnings. -Синхронізація завершена з попередженнями. +Mirror +Дзеркало -Nothing to synchronize! -Нічого синхронізувати! +Update +Оновити -Synchronization completed successfully. -Синхронізація успішно завершена. +Custom +Вибірково + +Multiple... +Різні варіанти... + +Moving file %x to %y +Переміщення файлу %x до %y + +Moving folder %x to %y +Переміщення папки %x до %y + +Moving symbolic link %x to %y +Переміщення символьного посилання %x до %y + +Removing old versions... +Видалення старих версій... + +Creating symbolic link %x +Створення символьного посилання %x + +Creating folder %x +Створення папки %x + +Overwriting file %x +Перезапис файлу %x + +Overwriting symbolic link %x +Перезапис символьного посилання %x + +Verifying file %x +Перевірка файлу %x + +Updating attributes of %x +Оновлення атрибутів %x + +Cannot find %x. +Не вдається знайти %x. + +Target folder %x already existing. +Цільова папка %x вже існує. + +Target folder input field must not be empty. +Поле цільової папки не повинно бути порожнім. + +Folder input field for versioning must not be empty. +Назва папки для версій файлів не повинна бути порожньою. + +Source folder %x not found. +Вихідний каталог %x не знайдено. + +The following items have unresolved conflicts and will not be synchronized: +Наступні елементи мають невирішені конфлікти і не будуть синхронізовані: + +Significant difference detected: +Виявлена істотна різниця: + +More than 50% of the total number of files will be copied or deleted. +Понад 50% загальної кількості файлів буде зкопійовано чи вилучено. + +Not enough free disk space available in: +Не достатньо вільного місця в: + +Required: +Потрібно: + +Available: +Доступно: + +A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. +Буде змінена папка, яка є частиною кількох пар папок. Будь ласка, перегляньте налаштування синхронізації. + +Synchronizing folder pair: +Синхронізація пари папок: + +Generating database... +Створення бази даних... + +Creating Volume Shadow Copy for %x... +Створення Тому тіньового копіювання для %x... + +Data verification error: %x and %y have different content. +Помилка перевірки даних: %x та %y мають різний вміст. + +Synchronization aborted +Синхронізація припинена + +Synchronization completed with errors +Синхронізація закінчилася з помилками + +Synchronization completed with warnings +Синхронізація завершена з попередженнями + +Nothing to synchronize +Нічого синхронізувати + +Synchronization completed successfully +Синхронізація успішно завершена Saving log file %x... Збереження файла журналу %x... @@ -354,8 +528,8 @@ The command is triggered if: Press "Switch" to resolve issues in FreeFileSync main dialog. Натисніть "Змінити" для вирішення питань у головному вікні FreeFileSync. -Switching to FreeFileSync main dialog... -Перехід до головного діалогу FreeFileSync... +Switching to FreeFileSync main dialog +Перехід до головного діалогу FreeFileSync A new version of FreeFileSync is available: Доступна нова версія FreeFileSync: @@ -363,29 +537,29 @@ The command is triggered if: Download now? Завантажити зараз? -FreeFileSync is up to date! -У Вас найновіша версія FreeFileSync! +New version found +знайдено нову версію -Information -Інформація +&Download +&Завантажити -Unable to connect to sourceforge.net! -Не можна з’єднатися з sourceforge.net! +FreeFileSync is up to date. +У Вас найновіша версія FreeFileSync. -Current FreeFileSync version number was not found online! Do you want to check manually? -Номер поточної версії FreeFileSync не знайдений онлайн! Хочете перевірити вручну? +Information +Інформація -Do you want FreeFileSync to automatically check for updates every week? -Ви хочете, щоб FreeFileSync автоматично перевіряв наявність оновлень щотижня? +Unable to connect to sourceforge.net. +Не можна з’єднатися з sourceforge.net. -(Requires an Internet connection!) -(Необхідне підключення до Інтернету!) +Cannot find current FreeFileSync version number online. Do you want to check manually? +Не вдається знайти номер поточної версії FreeFileSync онлайн. Бажаєте перевірити вручну? - -<Символьне посилання> +Symlink +Символьне посилання - -<Папка> +Folder +Папка Full path Повний шлях @@ -408,18 +582,12 @@ The command is triggered if: Extension Розширення -Size: -Розмір: - -Date: -Дата: +Category +Категорія Action Дія -Category -Категорія - Drag && drop Drag && drop @@ -438,14 +606,41 @@ The command is triggered if: Hibernate Гібернація +Selected variant: +Вибраний варіант: + +Select alternate comparison settings +Вибрати альтернативні налаштування порівняння + +Select alternate synchronization settings +Вибрати альтернативні налаштування синхронізації + +Filter is active +Фільтр активний + +No filter selected +Не вибрано жодного фільтра + +Remove alternate settings +Вилучити альтернативні налаштування + +Clear filter settings +Очистити налаштування фільтра + +Copy +Копіювати + +Paste +Вклеїти + &New -Нова +&Нова &Save -Зберегти +&Зберегти Save as &batch job... -Зберегти як пакетне завдання +Зберегти як &пакетне завдання 1. &Compare 1. &Порівняти @@ -454,29 +649,35 @@ The command is triggered if: 2. &Синхронізувати &Language -Мова - -&Global settings... -Глобальні налаштування... +&Мова &Export file list... -Експортувати список файлів... +&Експортувати список файлів... -&Advanced -Додатково +&Global settings... +&Глобальні налаштування... + +&Tools +&Інструменти &Check now -Перевірити тепер +&Перевірити тепер Check &automatically once a week -Перевіряти автоматично щотижня +Перевіряти &автоматично щотижня -Check for new version -Перевірити наявність нової версії +Check for new &version +Перевірити наявність нової &версії Compare Порівняти +Comparison settings +Налаштування порівнювання + +Synchronization settings +Налаштування синхронізації + Synchronize Синхронізувати @@ -489,6 +690,9 @@ The command is triggered if: Swap sides Поміняти місцями +Save as batch job +Зберегти як пакетне завдання + Hide excluded items Приховати виключені елементи @@ -531,52 +735,7 @@ The command is triggered if: &Pause &Пауза -Batch job -Пакетне завдання - -Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch -Для автоматизації синхронізації створіть пакетний файл. Двічі клацніть цей файл чи впишіть до системного планувальника завдань: FreeFileSync.exe <назва завдання>.ffs_batch - -Help -Допомога - -Error handling -Обробка помилок - -Ignore -Ігнорувати - -Hide all error and warning messages -Приховати всі помилки і повідомлення з попередженнями - -Pop-up -Виринаючі вікна - -Show pop-up on errors or warnings -Показувати виринаючі вікна при помилках та попередженнях - -Exit -Вихід - -Abort synchronization on first error -Перервати синхронізацію при першій помилці - -Show progress dialog -Показувати вікно прогресу - -Save log -Зберегти журнал - -Select folder to save log files -Виберіть папку для файлів журналу - -Limit -Межа - -Limit maximum number of log files -Обмежити максимальну кількість файлів журналу - -Select variant +Select a variant Виберіть варіант @@ -592,9 +751,6 @@ are the same співпадають -File time and size -Дата та розмір файлу - Files are found equal if - file content @@ -602,39 +758,42 @@ is the same Файли вважаються рівними, якщо вміст файлів однаковий -File content -Вміст файлу - Symbolic Link handling Обробка символьного посилання +Help +Допомога + OK OK -<- Two way -> -<- Обидва напрямки -> - Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database. Виявити та поширити зміни на обидві сторони. Видалення, перейменування та конфлікти визначаються автоматично використовуючи базу даних. -Mirror ->> -Дзеркало ->> - Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization. Дзеркальна (резервна) копія лівої частини. В результаті синхронізації права папка змінюється до повної відповідності лівій. -Update -> -Оновити -> - Copy new or updated files to right folder. Копіювати нові чи оновлювати файли з правої сторони. -Custom -Вибірково - Configure your own synchronization rules. Налаштувати власні правила синхронізації. +Error handling +Обробка помилок + +Ignore +Ігнорувати + +Hide all error and warning messages +Приховати всі помилки і повідомлення з попередженнями + +Pop-up +Виринаючі вікна + +Show pop-up on errors or warnings +Показувати виринаючі вікна при помилках та попередженнях + Deletion handling Налаштування вилучення @@ -659,23 +818,32 @@ is the same Naming convention: Метод іменування: -Item exists on left side only -Елемент існує тільки ліворуч +Batch job +Пакетне завдання + +Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch +Для автоматизації синхронізації створіть пакетний файл. Двічі клацніть цей файл чи впишіть до системного планувальника завдань: FreeFileSync.exe <назва завдання>.ffs_batch + +Exit +Вихід + +Abort synchronization on first error +Перервати синхронізацію при першій помилці -Item exists on right side only -Елемент існує тільки праворуч +Show progress dialog +Показувати вікно прогресу -Left side is newer -Ліва сторона новіша +Save log +Зберегти журнал -Right side is newer -Права сторона новіша +Select folder to save log files +Виберіть папку для файлів журналу -Items have different content -Елементи мають різний вміст +Limit +Межа -Conflict/item cannot be categorized -Не вдається категоризувати конфлікт/елемент +Limit maximum number of log files +Обмежити максимальну кількість файлів журналу Source code written in C++ using: Код програми написаний на C++ з використанням: @@ -695,9 +863,6 @@ is the same Homepage Оф.сайт -FreeFileSync at Sourceforge -FreeFileSync на Sourceforge - Email Почта @@ -712,7 +877,7 @@ is the same Only files that match all filter settings will be synchronized. -Note: File names must be relative to base directories! +Note: File names must be relative to base directories. Тільки файли, які задовільняють всім налаштуванням фільтра будуть синхронізовані. @@ -738,7 +903,10 @@ Note: File names must be relative to base directories! Максимум &Clear -Очистити +&Очистити + +Global settings +Глобальні налаштування Fail-safe file copy Безпечне копіювання файлів @@ -770,9 +938,6 @@ Note: File names must be relative to base directories! &Default &За замовчуванням -Start synchronization -Розпочати синхронізацію - Variant Варіант @@ -791,8 +956,20 @@ Note: File names must be relative to base directories! &Find next &Знайти наступний -Main bar -Головна панель +Delete +Видалити + +Configure filter +Налаштування фільтра + +Start synchronization +Розпочати синхронізацію + +Find +Знайти + +Select time span +Виберіть часовий інтервал Folder pairs Пари папок @@ -803,6 +980,9 @@ Note: File names must be relative to base directories! Configuration Налаштування +Main bar +Головна панель + Filter files Фільтр файлів @@ -860,11 +1040,8 @@ Note: File names must be relative to base directories! Exclude via filter: Виключити через фільтр: - -<груповий вибір> - -Delete -Видалити +multiple selection +груповий вибір Include all Включити все @@ -893,14 +1070,14 @@ Note: File names must be relative to base directories! Show "%x" Показати "%x" - -<Остання сесія> +Last session +Остання сесія Folder Comparison and Synchronization Порівнювання та Синхронізація папок -Configuration saved! -Налаштування синхронізації збережено! +Configuration saved +Налаштування синхронізації збережено FreeFileSync batch Командний файл FreeFileSync @@ -909,14 +1086,11 @@ Note: File names must be relative to base directories! Зберегти зміни в %x? Do&n't save -Не зберігати +&Не зберігати Never save changes Ніколи не зберігати змін -Configuration loaded! -Налаштування синхронізації загружено! - Show files that exist on left side only Показати файли, які є тільки ліворуч @@ -962,20 +1136,17 @@ Note: File names must be relative to base directories! Set as default Встановити за замовчуванням -Operation aborted! -Операція відмінена! +Operation aborted +Операція відмінена -All folders are in sync! -Всі папки синхронізовано! +All folders are in sync +Всі папки синхронізовано Comma separated list Розділений комами список -Legend -Легенда - -File list exported! -Список файлів експортовано! +File list exported +Список файлів експортовано Searching for program updates... Пошук оновлень програми ... @@ -986,6 +1157,9 @@ Note: File names must be relative to base directories! &Ignore &Ігнорувати +Fatal Error +Критична помилка + Don't show this warning again Не показувати більше це попередження @@ -1007,6 +1181,9 @@ Note: File names must be relative to base directories! Comparing content... Порівнювання вмісту... +Info +Інформація + Paused Призупинено @@ -1111,18 +1288,18 @@ Note: File names must be relative to base directories! Leave as unresolved conflict Залишити як невирішений конфлікт -Time stamp -Часова мітка - -Append a timestamp to each file name -Додати часову мітку до кожного імені файлу - Replace Замінити Move files and replace if existing Перемістити файли замінюючи існуючі +Time stamp +Часова мітка + +Append a timestamp to each file name +Додати часову мітку до кожного імені файлу + Folder Папка @@ -1165,9 +1342,6 @@ Note: File names must be relative to base directories! Cannot write modification time of %x. Не вдається записати часу модифікації %x. -Cannot find system function %x. -Не вдається знайти системної функції %x. - Cannot read security context of %x. Не вдається прочитати контексту безпеки %x. @@ -1183,8 +1357,11 @@ Note: File names must be relative to base directories! Cannot create directory %x. Не вдається створити каталогу %x. -Cannot copy symbolic link %x to %y. -Не вдається зкопіювати символьне посилання %x в %y. +Cannot create symbolic link %x. +Не вдається створити символьного посилання %x. + +Cannot find system function %x. +Не вдається знайти системної функції %x. Cannot copy file %x to %y. Не вдається зкопіювати файл %x до %y. @@ -1192,15 +1369,15 @@ Note: File names must be relative to base directories! Type of item %x is not supported: Тип елемента %x не підтримується: +Cannot resolve symbolic link %x. +Не вдається вирішити символьне посилання %x. + Cannot open directory %x. Не вдається відкрити каталогу %x. Cannot enumerate directory %x. Не вдається вчитати каталог %x. -Detected endless directory recursion. -Виявлено нескінченну рекурсію каталогів. - %x TB %x ТБ @@ -1237,6 +1414,9 @@ Note: File names must be relative to base directories! %x днів +Failed to register to receive system messages. +Не вдалося зареєструватися для отримання системних повідомлень. + Cannot set privilege %x. Не вдається встановити привілеї %x. @@ -1246,207 +1426,12 @@ Note: File names must be relative to base directories! Cannot change process I/O priorities. Не вдалося змінити пріоритетів Вх/Вих процесу. -Unable to move %x to the Recycle Bin! -Не вдається перенести %x до Корзини! - -Both sides have changed since last synchronization! -З моменту останньої синхронізації з обох сторін відбулися зміни! - -Cannot determine sync-direction: -Не можна визначити напрям синхронізації: - -No change since last synchronization! -Жодних змін з останньої синхронізації! - -The corresponding database entries are not in sync considering current settings. -Згідно з поточними налаштуваннями відповідні записи в базах даних не синхронізовані. - -Setting default synchronization directions: Old files will be overwritten with newer files. - -Налаштування напряму синхронізації за замовчуванням: -Старі файли будуть замінені новішими файлами. - - -Checking recycle bin availability for folder %x... -Перевірка доступності Корзини для папки %x... - -Moving file %x to recycle bin -Переміщення файлу %x у Корзину - -Moving folder %x to recycle bin -Переміщення папки %x у Корзину - -Moving symbolic link %x to recycle bin -Переміщення символьного посилання %x у Корзину - -Deleting file %x -Вилучення файлу %x - -Deleting folder %x -Вилучення папки %x - -Deleting symbolic link %x -Вилучення символьного посилання %x - -Recycle Bin is not available for the following paths! Files will be deleted permanently instead: -Корзина для цього шляху недоступна. Файли будуть вилучені назавжди: - -The corresponding folder will be considered as empty. -Відповідна папка буде вважатися порожньою. - -Cannot find the following folders: -Не вдається знайти такі папки: - -You can ignore this error to consider each folder as empty. The folders then will be created automatically during synchronization. -Ви можете ігнорувати цю помилку, вважаючи кожну папку порожньою. Папки будуть автоматично створені під час синхронізації. - -Directories are dependent! Be careful when setting up synchronization rules: -Залежні каталоги! Будьте уважні при налаштуванні правил синхронізації: - -Start comparison -Розпочати порівняння - -Calculating sync directions... -Встановлення напрямку синхронізації... - -Conflict detected: -Виявлено конфлікт: - -File %x has an invalid date! -Файл %x має неіснуючу дату! - -Files %x have the same date but a different size! -Файли %x мають однакову дату, але різні за розміром! - -Items differ in attributes only -Елементи відрізняються тільки атрибутами - -Symbolic links %x have the same date but a different target. -Символьні посилання %x мають таку ж дату, але різні цілі. - -Comparing content of files %x -Порівнювання вмісту файлів %x - -Comparing files by content failed. -Порівнювання файлів за вмістом не вдалося. - -Generating file list... -Створення списку файлів... - -Both sides are equal -Сторони ідентичні - -Copy new item to left -Копіювати нові елементи ліворуч - -Copy new item to right -Копіювати нові елементи праворуч - -Delete left item -Вилучити елемент ліворуч - -Delete right item -Вилучити елемент праворуч - -Move file on left -Перемістити файли ліворуч - -Move file on right -Перемістити файли праворуч - -Overwrite left item -Перезаписати елемент ліворуч - -Overwrite right item -Перезаписати елемент праворуч - -Do nothing -Нічого не робити - -Update attributes on left -Оновити атрибути ліворуч - -Update attributes on right -Оновити атрибути праворуч - -Multiple... -Різні варіанти... - -Moving file %x to %y -Переміщення файлу %x до %y - -Moving folder %x to %y -Переміщення папки %x до %y - -Moving symbolic link %x to %y -Переміщення символьного посилання %x до %y - -Removing old versions... -Видалення старих версій... - -Creating symbolic link %x -Створення символьного посилання %x - -Creating folder %x -Створення папки %x - -Overwriting file %x -Перезапис файлу %x - -Overwriting symbolic link %x -Перезапис символьного посилання %x - -Verifying file %x -Перевірка файлу %x - -Updating attributes of %x -Оновлення атрибутів %x - -Cannot find %x. -Не вдається знайти %x. - -Target folder %x already existing. -Цільова папка %x вже існує. - -Target folder input field must not be empty. -Поле цільової папки не повинно бути порожнім. - -Folder input field for versioning must not be empty. -Назва папки для версій файлів не повинна бути порожньою. +Unable to move %x to the Recycle Bin. +Не вдається перенести %x до Корзини. -Source folder %x not found. -Вихідний каталог %x не знайдено. - -The following items have unresolved conflicts and will not be synchronized: -Наступні елементи мають невирішені конфлікти і не будуть синхронізовані: - -Significant difference detected: -Виявлена істотна різниця: - -More than 50% of the total number of files will be copied or deleted! -Понад 50% загальної кількості файлів буде зкопійовано чи вилучено! - -Not enough free disk space available in: -Не достатньо вільного місця в: - -Required: -Потрібно: - -Available: -Доступно: - -A folder will be modified which is part of multiple folder pairs. Please review synchronization settings. -Буде змінена папка, яка є частиною кількох пар папок. Будь ласка, перегляньте налаштування синхронізації. - -Synchronizing folder pair: -Синхронізація пари папок: +Cannot determine final path for %x. +Не вдається визначити кінцевого шляху для %x. -Generating database... -Створення бази даних... - -Creating Volume Shadow Copy for %x... -Створення Тому тіньового копіювання для %x... - -Data verification error: Source and target file have different content! -Помилка перевірки даних: вхідний і вихідний файли мають різний вміст! +Error Code %x: +Код помилки %x: diff --git a/BUILD/Resources.zip b/BUILD/Resources.zip index 00df0a4f..864883e8 100644 Binary files a/BUILD/Resources.zip and b/BUILD/Resources.zip differ diff --git a/FreeFileSync.vcxproj b/FreeFileSync.vcxproj index c46f8749..0bf7114b 100644 --- a/FreeFileSync.vcxproj +++ b/FreeFileSync.vcxproj @@ -68,14 +68,12 @@ - true BUILD\Bin\ OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\ false $(ProjectName)_$(PlatformName) - true BUILD\Bin\ OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\ false @@ -100,7 +98,7 @@ Use Level4 Disabled - _SCL_SECURE_NO_WARNINGS;ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL + _SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions) C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc10_x86_debug_dll\mswud;. wx+/pch.h 4100;4512 @@ -130,7 +128,7 @@ Use Level4 Disabled - _SCL_SECURE_NO_WARNINGS;ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL + _SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions) C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc10_x64_debug_dll\mswud;. wx+/pch.h 4100;4512 @@ -165,7 +163,7 @@ NotUsing MaxSpeed true - _SCL_SECURE_NO_WARNINGS;ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG + _SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions) C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc10_x86_release_lib\mswu;. Speed 4100;4512 @@ -200,7 +198,7 @@ NotUsing MaxSpeed true - _SCL_SECURE_NO_WARNINGS;ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG + _SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions) C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc10_x64_release_lib\mswu;. Speed 4100;4512 diff --git a/Makefile b/Makefile index 0ee491e7..371f90cf 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ SHAREDIR = $(DESTDIR)$(prefix)/share APPSHAREDIR = $(SHAREDIR)/$(APPNAME) DOCSHAREDIR = $(SHAREDIR)/doc/$(APPNAME) -CXXFLAGS = -std=c++11 -Wall -pipe -O3 -DNDEBUG -DwxUSE_UNICODE -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I. -include "zen/i18n.h" -include "zen/warn_static.h" +CXXFLAGS = -std=c++11 -Wall -pipe -O3 -DNDEBUG -DwxUSE_UNICODE -DWXINTL_NO_GETTEXT_MACRO -I. -include "zen/i18n.h" -include "zen/warn_static.h" LINKFLAGS = #distinguish Linux/OSX builds @@ -16,7 +16,7 @@ OPERATING_SYSTEM_NAME := $(shell uname) #################### Linux ############################ ifeq ($(OPERATING_SYSTEM_NAME), Linux) COMPILER_BIN=g++ -pthread -CXXFLAGS += -DFFS_LINUX +CXXFLAGS += -DZEN_LINUX #Gtk - support recycler/icon loading/no button border/grid scrolling CXXFLAGS += `pkg-config --cflags gtk+-2.0` @@ -43,8 +43,8 @@ LINKFLAGS += `wx-config --libs std, aui --debug=no` -lboost_thread -lboost_syste else #static wxWidgets and boost library linkage for precompiled release WX_CONFIG_BIN =$(HOME)/Desktop/wxGTK-2.8.12/lib/release/bin/wx-config -CXXFLAGS += -I$(HOME)/Desktop/boost_1_53_0 -BOOST_LIB_DIR =$(HOME)/Desktop/boost_1_53_0/stage/lib +CXXFLAGS += -I$(HOME)/Desktop/boost_1_54_0 +BOOST_LIB_DIR =$(HOME)/Desktop/boost_1_54_0/stage/lib CXXFLAGS += `$(WX_CONFIG_BIN) --cxxflags --debug=no --static=yes` LINKFLAGS += `$(WX_CONFIG_BIN) --libs std, aui --debug=no --static=yes` $(BOOST_LIB_DIR)/libboost_thread.a $(BOOST_LIB_DIR)/libboost_system.a -lX11 @@ -54,11 +54,11 @@ endif #################### OS X ############################ ifeq ($(OPERATING_SYSTEM_NAME), Darwin) COMPILER_BIN=clang++ -stdlib=libc++ -CXXFLAGS += -DFFS_MAC +CXXFLAGS += -DZEN_MAC WX_CONFIG_BIN =$(HOME)/Desktop/wxWidgets-2.9.4/lib/release/bin/wx-config -CXXFLAGS += -I$(HOME)/Desktop/boost_1_53_0 -BOOST_LIB_DIR =$(HOME)/Desktop/boost_1_53_0/stage/lib +CXXFLAGS += -I$(HOME)/Desktop/boost_1_54_0 +BOOST_LIB_DIR =$(HOME)/Desktop/boost_1_54_0/stage/lib MACOS_SDK =-mmacosx-version-min=10.7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk #-Wl,-Bstatic not supported on OSX! diff --git a/RealtimeSync/RealtimeSync.vcxproj b/RealtimeSync/RealtimeSync.vcxproj index 097f9965..487f2cce 100644 --- a/RealtimeSync/RealtimeSync.vcxproj +++ b/RealtimeSync/RealtimeSync.vcxproj @@ -68,14 +68,12 @@ - true ..\BUILD\Bin\ ..\OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\ false $(ProjectName)_$(PlatformName) - true ..\BUILD\Bin\ ..\OBJ\$(ProjectName)_VCPP_$(PlatformName)_$(Configuration)\ false @@ -100,7 +98,7 @@ Use Level4 Disabled - _SCL_SECURE_NO_WARNINGS;ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL + _SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions) C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc10_x86_debug_dll\mswud;.. wx+/pch.h 4100;4512 @@ -128,7 +126,7 @@ Use Level4 Disabled - _SCL_SECURE_NO_WARNINGS;ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL + _SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;__WXDEBUG__;WXUSINGDLL;_DEBUG;%(PreprocessorDefinitions) C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc10_x64_debug_dll\mswud;.. wx+/pch.h 4100;4512 @@ -161,7 +159,7 @@ NotUsing MaxSpeed true - _SCL_SECURE_NO_WARNINGS;ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG + _SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions) C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc10_x86_release_lib\mswu;.. Speed 4100;4512 @@ -192,7 +190,7 @@ NotUsing MaxSpeed true - _SCL_SECURE_NO_WARNINGS;ZEN_PLATFORM_WINDOWS;wxUSE_UNICODE;__WXMSW__;FFS_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG + _SCL_SECURE_NO_WARNINGS;wxUSE_UNICODE;__WXMSW__;ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;%(PreprocessorDefinitions) C:\Program Files\C++\Boost;C:\Program Files\C++\wxWidgets\include;C:\Program Files\C++\wxWidgets\lib\vc10_x64_release_lib\mswu;.. Speed 4100;4512 diff --git a/RealtimeSync/application.cpp b/RealtimeSync/application.cpp index 61c9ca96..a7aff305 100644 --- a/RealtimeSync/application.cpp +++ b/RealtimeSync/application.cpp @@ -19,13 +19,13 @@ #include "../lib/return_codes.h" #include "lib/error_log.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include -#elif defined FFS_LINUX +#elif defined ZEN_LINUX #include -#elif defined FFS_MAC +#elif defined ZEN_MAC #include #endif @@ -43,9 +43,9 @@ void onTerminationRequested() std::wstring msg = boost::this_thread::get_id() == mainThreadId ? L"Termination requested in main thread!\n\n" : L"Termination requested in worker thread!\n\n"; - msg += L"Please take a screenshot and file a bug report at: http://sourceforge.net/projects/freefilesync"; + msg += L"Please file a bug report at: http://sourceforge.net/projects/freefilesync"; - wxSafeShowMessage(_("An exception occurred!"), msg); + wxSafeShowMessage(_("An exception occurred"), msg); std::abort(); } @@ -61,7 +61,7 @@ bool Application::OnInit() { std::set_terminate(onTerminationRequested); //unlike wxWidgets uncaught exception handling, this works for all worker threads -#ifdef FFS_WIN +#ifdef ZEN_WIN #ifdef _MSC_VER _set_invalid_parameter_handler(crtInvalidParameterHandler); //see comment in #endif @@ -69,10 +69,10 @@ bool Application::OnInit() //SEM_FAILCRITICALERRORS at startup. This is to prevent error mode dialogs from hanging the application." ::SetErrorMode(SEM_FAILCRITICALERRORS); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX ::gtk_rc_parse((zen::getResourceDir() + "styles.gtk_rc").c_str()); //remove inner border from bitmap buttons -#elif defined FFS_MAC +#elif defined ZEN_MAC ProcessSerialNumber psn = { 0, kCurrentProcess }; ::TransformProcessType(&psn, kProcessTransformToForegroundApplication); //behave like an application bundle, even when the app is not packaged (yet) #endif @@ -148,7 +148,7 @@ int Application::OnRun() { //it's not always possible to display a message box, e.g. corrupted stack, however low-level file output works! logError(utfCvrtTo(msg)); - wxSafeShowMessage(_("An exception occurred!") + L" - FFS", msg); + wxSafeShowMessage(_("An exception occurred"), msg); }; try diff --git a/RealtimeSync/gui_generated.cpp b/RealtimeSync/gui_generated.cpp index d388e40d..cf072240 100644 --- a/RealtimeSync/gui_generated.cpp +++ b/RealtimeSync/gui_generated.cpp @@ -291,11 +291,11 @@ ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxS bSizer26 = new wxBoxSizer( wxHORIZONTAL ); m_bitmap10 = new wxStaticBitmap( m_panel3, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer26->Add( m_bitmap10, 0, wxRIGHT|wxLEFT, 5 ); + bSizer26->Add( m_bitmap10, 0, wxRIGHT|wxLEFT, 10 ); m_textCtrl8 = new wxTextCtrl( m_panel3, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,150 ), wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER ); m_textCtrl8->SetMaxLength( 0 ); - bSizer26->Add( m_textCtrl8, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + bSizer26->Add( m_textCtrl8, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); bSizer16->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); @@ -309,18 +309,17 @@ ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxS m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizer24->Add( m_staticline2, 0, wxEXPAND, 5 ); - wxBoxSizer* bSizer13; - bSizer13 = new wxBoxSizer( wxHORIZONTAL ); + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 ); m_buttonRetry->SetDefault(); - bSizer13->Add( m_buttonRetry, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + bSizerStdButtons->Add( m_buttonRetry, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer13->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - bSizer24->Add( bSizer13, 0, wxALIGN_RIGHT, 5 ); + bSizer24->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); this->SetSizer( bSizer24 ); @@ -332,7 +331,7 @@ ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxS // Connect Events this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); m_buttonRetry->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); } ErrorDlgGenerated::~ErrorDlgGenerated() @@ -340,6 +339,6 @@ ErrorDlgGenerated::~ErrorDlgGenerated() // Disconnect Events this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( ErrorDlgGenerated::OnClose ) ); m_buttonRetry->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnRetry ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( ErrorDlgGenerated::OnAbort ), NULL, this ); } diff --git a/RealtimeSync/gui_generated.h b/RealtimeSync/gui_generated.h index 9a19bf63..2b42b271 100644 --- a/RealtimeSync/gui_generated.h +++ b/RealtimeSync/gui_generated.h @@ -128,8 +128,9 @@ protected: wxStaticBitmap* m_bitmap10; wxTextCtrl* m_textCtrl8; wxStaticLine* m_staticline2; + wxBoxSizer* bSizerStdButtons; wxButton* m_buttonRetry; - wxButton* m_buttonAbort; + wxButton* m_buttonCancel; // Virtual event handlers, overide them in your derived class virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } diff --git a/RealtimeSync/main_dlg.cpp b/RealtimeSync/main_dlg.cpp index f0d4d4f7..b750b110 100644 --- a/RealtimeSync/main_dlg.cpp +++ b/RealtimeSync/main_dlg.cpp @@ -47,7 +47,7 @@ private: MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName) : MainDlgGenerated(dlg) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new MouseMoveWindow(*this); //ownership passed to "this" #endif wxWindowUpdateLocker dummy(this); //avoid display distortion @@ -61,7 +61,7 @@ MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName) m_panelMainFolder->Layout(); m_bpButtonAddFolder ->SetBitmapLabel(getResourceImage(L"item_add")); - m_bpButtonRemoveTopFolder->SetBitmapLabel(getResourceImage(L"item_delete")); + m_bpButtonRemoveTopFolder->SetBitmapLabel(getResourceImage(L"item_remove")); m_buttonStart ->setBitmapFront(getResourceImage(L"startRts"), 5); //register key event @@ -376,9 +376,9 @@ void MainDialog::OnRemoveTopFolder(wxCommandEvent& event) } -#ifdef FFS_WIN +#ifdef ZEN_WIN static const size_t MAX_ADD_FOLDERS = 8; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC static const size_t MAX_ADD_FOLDERS = 6; #endif @@ -395,7 +395,7 @@ void MainDialog::addFolder(const std::vector& newFolders, bool addFron { //add new folder pair DirectoryPanel* newFolder = new DirectoryPanel(m_scrolledWinFolders); - newFolder->m_bpButtonRemoveFolder->SetBitmapLabel(getResourceImage(L"item_delete")); + newFolder->m_bpButtonRemoveFolder->SetBitmapLabel(getResourceImage(L"item_remove")); //get size of scrolled window folderHeight = newFolder->GetSize().GetHeight(); diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile index 325578a1..865d73a1 100644 --- a/RealtimeSync/makefile +++ b/RealtimeSync/makefile @@ -4,7 +4,7 @@ APPNAME = RealtimeSync prefix = /usr BINDIR = $(DESTDIR)$(prefix)/bin -CXXFLAGS = -std=c++11 -Wall -pipe -O3 -DNDEBUG -DwxUSE_UNICODE -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I.. -include "zen/i18n.h" -include "zen/warn_static.h" +CXXFLAGS = -std=c++11 -Wall -pipe -O3 -DNDEBUG -DwxUSE_UNICODE -DWXINTL_NO_GETTEXT_MACRO -I.. -include "zen/i18n.h" -include "zen/warn_static.h" LINKFLAGS = #distinguish Linux/Mac builds @@ -13,7 +13,7 @@ OPERATING_SYSTEM_NAME := $(shell uname) #################### Linux ############################ ifeq ($(OPERATING_SYSTEM_NAME), Linux) COMPILER_BIN=g++ -pthread -CXXFLAGS += -DFFS_LINUX +CXXFLAGS += -DZEN_LINUX #Gtk - support "no button border" CXXFLAGS += `pkg-config --cflags gtk+-2.0` @@ -26,8 +26,8 @@ LINKFLAGS += `wx-config --libs --debug=no` -lboost_thread -lboost_system -lz else #static wxWidgets and boost library linkage for precompiled release WX_CONFIG_BIN =$(HOME)/Desktop/wxGTK-2.8.12/lib/release/bin/wx-config -CXXFLAGS += -I$(HOME)/Desktop/boost_1_53_0 -BOOST_LIB_DIR =$(HOME)/Desktop/boost_1_53_0/stage/lib +CXXFLAGS += -I$(HOME)/Desktop/boost_1_54_0 +BOOST_LIB_DIR =$(HOME)/Desktop/boost_1_54_0/stage/lib CXXFLAGS += `$(WX_CONFIG_BIN) --cxxflags --debug=no --static=yes` LINKFLAGS += `$(WX_CONFIG_BIN) --libs --debug=no --static=yes` $(BOOST_LIB_DIR)/libboost_thread.a $(BOOST_LIB_DIR)/libboost_system.a -lX11 @@ -37,11 +37,11 @@ endif #################### OS X ############################ ifeq ($(OPERATING_SYSTEM_NAME), Darwin) COMPILER_BIN=clang++ -stdlib=libc++ -CXXFLAGS += -DFFS_MAC +CXXFLAGS += -DZEN_MAC WX_CONFIG_BIN =$(HOME)/Desktop/wxWidgets-2.9.4/lib/release/bin/wx-config -CXXFLAGS += -I$(HOME)/Desktop/boost_1_53_0 -BOOST_LIB_DIR =$(HOME)/Desktop/boost_1_53_0/stage/lib +CXXFLAGS += -I$(HOME)/Desktop/boost_1_54_0 +BOOST_LIB_DIR =$(HOME)/Desktop/boost_1_54_0/stage/lib MACOS_SDK =-mmacosx-version-min=10.7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk #-Wl,-Bstatic not supported on OSX! diff --git a/RealtimeSync/resources.cpp b/RealtimeSync/resources.cpp index f55887ee..34c9e8dc 100644 --- a/RealtimeSync/resources.cpp +++ b/RealtimeSync/resources.cpp @@ -47,14 +47,14 @@ GlobalResources::GlobalResources() } } -#ifdef FFS_WIN +#ifdef ZEN_WIN //for compatibility it seems we need to stick with a "real" icon programIconRTS = wxIcon(L"A_RTS_ICON"); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX programIconRTS.CopyFromBitmap(getImage(L"RealtimeSync")); -#elif defined FFS_MAC +#elif defined ZEN_MAC assert(getImage(L"RealtimeSync").GetWidth () == getImage(L"RealtimeSync").GetHeight() && getImage(L"RealtimeSync").GetWidth() % 128 == 0); //wxWidgets' bitmap to icon conversion on OS X can only deal with very specific sizes diff --git a/RealtimeSync/tray_menu.cpp b/RealtimeSync/tray_menu.cpp index 8f2dcfde..676904f1 100644 --- a/RealtimeSync/tray_menu.cpp +++ b/RealtimeSync/tray_menu.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -153,25 +154,29 @@ public: void showIconActive() { wxIcon realtimeIcon; -#if defined FFS_WIN || defined FFS_MAC //16x16 seems to be the only size that is shown correctly on OS X +#if defined ZEN_WIN || defined ZEN_MAC //16x16 seems to be the only size that is shown correctly on OS X realtimeIcon.CopyFromBitmap(getResourceImage(L"RTS_tray_16x16")); //use a 16x16 bitmap -#elif defined FFS_LINUX +#elif defined ZEN_LINUX realtimeIcon.CopyFromBitmap(getResourceImage(L"RTS_tray_24x24")); //use a 24x24 bitmap for perfect fit #endif - const wxString postFix = jobName_.empty() ? wxString() : (L"\n\"" + jobName_ + L"\""); - trayMenu->SetIcon(realtimeIcon, _("Monitoring active...") + postFix); + wxString tooltip = L"RealtimeSync"; + if (!jobName_.empty()) + tooltip += L"\n\"" + jobName_ + L"\""; + trayMenu->SetIcon(realtimeIcon, tooltip); } void showIconWaiting() { wxIcon realtimeIcon; -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC realtimeIcon.CopyFromBitmap(greyScale(getResourceImage(L"RTS_tray_16x16"))); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX realtimeIcon.CopyFromBitmap(greyScale(getResourceImage(L"RTS_tray_24x24"))); #endif - const wxString postFix = jobName_.empty() ? wxString() : (L"\n\"" + jobName_ + L"\""); - trayMenu->SetIcon(realtimeIcon, _("Waiting for missing directories...") + postFix); + wxString tooltip = _("Waiting for missing directories..."); + if (!jobName_.empty()) + tooltip += L"\n\"" + jobName_ + L"\""; + trayMenu->SetIcon(realtimeIcon, tooltip); } private: @@ -244,9 +249,11 @@ public: ErrorDlgGenerated(parent), secondsLeft(15) //give user some time to read msg!? { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonRetry).setCancel(m_buttonCancel)); + m_bitmap10->SetBitmap(getResourceImage(L"msg_error")); m_textCtrl8->SetValue(messageText); diff --git a/RealtimeSync/watcher.cpp b/RealtimeSync/watcher.cpp index 4e33bd98..6ef5e924 100644 --- a/RealtimeSync/watcher.cpp +++ b/RealtimeSync/watcher.cpp @@ -171,7 +171,7 @@ void rts::waitForMissingDirs(const std::vector& dirNamesNonFmt, WaitCal const Zstring dirnameFmt = *it; auto ftDirExisting = async([=]() -> bool { -#ifdef FFS_WIN +#ifdef ZEN_WIN //1. login to network share, if necessary -> we probably do NOT want multiple concurrent runs: GUI!? loginNetworkShare(dirnameFmt, false); //login networks shares, no PW prompt -> is this really RTS's job? #endif diff --git a/RealtimeSync/xml_proc.cpp b/RealtimeSync/xml_proc.cpp index 1f4d89cc..db235ecb 100644 --- a/RealtimeSync/xml_proc.cpp +++ b/RealtimeSync/xml_proc.cpp @@ -38,8 +38,7 @@ bool isXmlTypeRTS(const XmlDoc& doc) //throw() void xmlAccess::readRealConfig(const Zstring& filename, XmlRealConfig& config) { - XmlDoc doc; - loadXmlDocument(filename, doc); //throw FfsXmlError + XmlDoc doc = loadXmlDocument(filename); //throw FfsXmlError if (!isXmlTypeRTS(doc)) throw FfsXmlError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filename))); diff --git a/algorithm.cpp b/algorithm.cpp index 0d591206..ab2494e5 100644 --- a/algorithm.cpp +++ b/algorithm.cpp @@ -25,7 +25,7 @@ using namespace std::rel_ops; void zen::swapGrids(const MainConfiguration& config, FolderComparison& folderCmp) { - std::for_each(begin(folderCmp), end(folderCmp), std::mem_fun_ref(&BaseDirMapping::flip)); + std::for_each(begin(folderCmp), end(folderCmp), std::mem_fun_ref(&BaseDirPair::flip)); redetermineSyncDirection(config, folderCmp, [](const std::wstring&) {}); } @@ -46,12 +46,12 @@ private: void recurse(HierarchyObject& hierObj) const { - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); - std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FilePair& fileObj) { (*this)(fileObj); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymlinkPair& linkObj) { (*this)(linkObj); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirPair& dirObj) { (*this)(dirObj); }); } - void operator()(FileMapping& fileObj) const + void operator()(FilePair& fileObj) const { const CompareFilesResult cat = fileObj.getCategory(); @@ -92,7 +92,7 @@ private: } } - void operator()(SymLinkMapping& linkObj) const + void operator()(SymlinkPair& linkObj) const { switch (linkObj.getLinkCategory()) { @@ -124,7 +124,7 @@ private: } } - void operator()(DirMapping& dirObj) const + void operator()(DirPair& dirObj) const { const CompareDirResult cat = dirObj.getDirCategory(); @@ -167,13 +167,13 @@ struct AllEqual //test if non-equal items exist in scanned data bool operator()(const HierarchyObject& hierObj) const { return std::all_of(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), - [](const FileMapping& fileObj) { return fileObj.getCategory() == FILE_EQUAL; })&& //files + [](const FilePair& fileObj) { return fileObj.getCategory() == FILE_EQUAL; })&& //files std::all_of(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), - [](const SymLinkMapping& linkObj) { return linkObj.getLinkCategory() == SYMLINK_EQUAL; })&& //symlinks + [](const SymlinkPair& linkObj) { return linkObj.getLinkCategory() == SYMLINK_EQUAL; })&& //symlinks std::all_of(hierObj.refSubDirs(). begin(), hierObj.refSubDirs(). end(), - [](const DirMapping& dirObj) + [](const DirPair& dirObj) { return dirObj.getDirCategory() == DIR_EQUAL && AllEqual()(dirObj); //short circuit-behavior! }); //directories @@ -191,15 +191,15 @@ bool zen::allElementsEqual(const FolderComparison& folderCmp) namespace { template inline -const FileDescriptor& getDescriptor(const InSyncFile& dbFile) { return dbFile.left; } +const InSyncDescrFile& getDescriptor(const InSyncFile& dbFile) { return dbFile.left; } template <> inline -const FileDescriptor& getDescriptor(const InSyncFile& dbFile) { return dbFile.right; } +const InSyncDescrFile& getDescriptor(const InSyncFile& dbFile) { return dbFile.right; } //check whether database entry and current item match: *irrespective* of current comparison settings template inline -bool isEqual(const FileMapping& fileObj, const InSyncDir::FileList::value_type* dbFile) +bool isEqual(const FilePair& fileObj, const InSyncDir::FileList::value_type* dbFile) { if (fileObj.isEmpty()) return !dbFile; @@ -207,12 +207,12 @@ bool isEqual(const FileMapping& fileObj, const InSyncDir::FileList::value_type* return false; const Zstring& shortNameDb = dbFile->first; - const FileDescriptor& descrDb = getDescriptor(dbFile->second); + const InSyncDescrFile& descrDb = getDescriptor(dbFile->second); return fileObj.getShortName() == shortNameDb && //detect changes in case (windows) //respect 2 second FAT/FAT32 precision! copying a file to a FAT32 drive changes it's modification date by up to 2 seconds sameFileTime(fileObj.getLastWriteTime(), descrDb.lastWriteTimeRaw, 2) && - fileObj.getFileSize() == descrDb.fileSize; + fileObj.getFileSize() == dbFile->second.fileSize; //note: we do *not* consider FileId here, but are only interested in *visual* changes. Consider user moving data to some other medium, this is not a change! } @@ -227,8 +227,8 @@ bool stillInSync(const InSyncFile& dbFile, CompareVariant compareVar, size_t fil if (dbFile.inSyncType == IN_SYNC_BINARY_EQUAL) return true; //special rule: this is already "good enough" for CMP_BY_TIME_SIZE! return //case-sensitive short name match is a database invariant! - CmpFileTime::getResult(dbFile.left.lastWriteTimeRaw, dbFile.right.lastWriteTimeRaw, fileTimeTolerance) == CmpFileTime::TIME_EQUAL && - dbFile.left.fileSize == dbFile.right.fileSize; + CmpFileTime::getResult(dbFile.left.lastWriteTimeRaw, dbFile.right.lastWriteTimeRaw, fileTimeTolerance) == CmpFileTime::TIME_EQUAL; + //dbFile.left.fileSize == dbFile.right.fileSize; case CMP_BY_CONTENT: //case-sensitive short name match is a database invariant! @@ -242,15 +242,15 @@ bool stillInSync(const InSyncFile& dbFile, CompareVariant compareVar, size_t fil //-------------------------------------------------------------------- template inline -const LinkDescriptor& getDescriptor(const InSyncSymlink& dbLink) { return dbLink.left; } +const InSyncDescrLink& getDescriptor(const InSyncSymlink& dbLink) { return dbLink.left; } template <> inline -const LinkDescriptor& getDescriptor(const InSyncSymlink& dbLink) { return dbLink.right; } +const InSyncDescrLink& getDescriptor(const InSyncSymlink& dbLink) { return dbLink.right; } //check whether database entry and current item match: *irrespective* of current comparison settings template inline -bool isEqual(const SymLinkMapping& linkObj, const InSyncDir::LinkList::value_type* dbLink) +bool isEqual(const SymlinkPair& linkObj, const InSyncDir::LinkList::value_type* dbLink) { if (linkObj.isEmpty()) return !dbLink; @@ -258,7 +258,7 @@ bool isEqual(const SymLinkMapping& linkObj, const InSyncDir::LinkList::value_typ return false; const Zstring& shortNameDb = dbLink->first; - const LinkDescriptor& descrDb = getDescriptor(dbLink->second); + const InSyncDescrLink& descrDb = getDescriptor(dbLink->second); return linkObj.getShortName() == shortNameDb && //respect 2 second FAT/FAT32 precision! copying a file to a FAT32 drive changes its modification date by up to 2 seconds @@ -291,11 +291,11 @@ bool stillInSync(const InSyncSymlink& dbLink, CompareVariant compareVar, size_t //check whether database entry and current item match: *irrespective* of current comparison settings template inline -bool isEqual(const DirMapping& dirObj, const InSyncDir::DirList::value_type* dbDir) +bool isEqual(const DirPair& dirObj, const InSyncDir::DirList::value_type* dbDir) { if (dirObj.isEmpty()) - return !dbDir || dbDir->second.status == InSyncDir::STATUS_STRAW_MAN; - else if (!dbDir || dbDir->second.status == InSyncDir::STATUS_STRAW_MAN) + return !dbDir || dbDir->second.status == InSyncDir::DIR_STATUS_STRAW_MAN; + else if (!dbDir || dbDir->second.status == InSyncDir::DIR_STATUS_STRAW_MAN) return false; const Zstring& shortNameDb = dbDir->first; @@ -308,7 +308,7 @@ inline bool stillInSync(const InSyncDir& dbDir) { //case-sensitive short name match is a database invariant! - //InSyncDir::STATUS_STRAW_MAN considered + //InSyncDir::DIR_STATUS_STRAW_MAN considered return true; } @@ -317,16 +317,16 @@ bool stillInSync(const InSyncDir& dbDir) class RedetermineAuto { public: - static void execute(BaseDirMapping& baseDirectory, std::function reportWarning) + static void execute(BaseDirPair& baseDirectory, std::function reportWarning) { RedetermineAuto(baseDirectory, reportWarning); } private: - RedetermineAuto(BaseDirMapping& baseDirectory, std::function reportWarning) : - txtBothSidesChanged(_("Both sides have changed since last synchronization!")), - txtNoSideChanged(_("Cannot determine sync-direction:") + L" \n" + _("No change since last synchronization!")), - txtDbNotInSync(_("Cannot determine sync-direction:") + L" \n" + _("The corresponding database entries are not in sync considering current settings.")), + RedetermineAuto(BaseDirPair& baseDirectory, std::function reportWarning) : + txtBothSidesChanged(_("Both sides have changed since last synchronization.")), + txtNoSideChanged(_("Cannot determine sync-direction:") + L" \n" + _("No change since last synchronization.")), + txtDbNotInSync(_("Cannot determine sync-direction:") + L" \n" + _("The database entry is not in sync considering current settings.")), cmpVar(baseDirectory.getCompVariant()), fileTimeTolerance(baseDirectory.getFileTimeTolerance()), reportWarning_(reportWarning) @@ -355,11 +355,11 @@ private: detectRenamedFiles(*lastSyncState); } - std::shared_ptr loadDBFile(const BaseDirMapping& baseMap) //return nullptr on failure + std::shared_ptr loadDBFile(const BaseDirPair& baseDirObj) //return nullptr on failure { try { - return loadLastSynchronousState(baseMap); //throw FileError, FileErrorDatabaseNotExisting + return loadLastSynchronousState(baseDirObj); //throw FileError, FileErrorDatabaseNotExisting } catch (FileErrorDatabaseNotExisting&) {} //let's ignore this error, it seems there's no value in reporting it other than confuse users catch (FileError& error) //e.g. incompatible database version @@ -372,12 +372,12 @@ private: void recurse(HierarchyObject& hierObj, const InSyncDir* dbContainer) { - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { processFile (fileMap, dbContainer); }); - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { processSymlink(linkMap, dbContainer); }); - std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { processDir (dirMap, dbContainer); }); + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FilePair& fileObj) { processFile (fileObj, dbContainer); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymlinkPair& linkObj) { processSymlink(linkObj, dbContainer); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirPair& dirObj) { processDir (dirObj, dbContainer); }); } - void processFile(FileMapping& fileObj, const InSyncDir* dbContainer) + void processFile(FilePair& fileObj, const InSyncDir* dbContainer) { const CompareFilesResult cat = fileObj.getCategory(); if (cat == FILE_EQUAL) @@ -443,7 +443,7 @@ private: } } - void processSymlink(SymLinkMapping& linkObj, const InSyncDir* dbContainer) + void processSymlink(SymlinkPair& linkObj, const InSyncDir* dbContainer) { const CompareSymlinkResult cat = linkObj.getLinkCategory(); if (cat == SYMLINK_EQUAL) @@ -479,7 +479,7 @@ private: } } - void processDir(DirMapping& dirObj, const InSyncDir* dbContainer) + void processDir(DirPair& dirObj, const InSyncDir* dbContainer) { const CompareDirResult cat = dirObj.getDirCategory(); @@ -529,25 +529,29 @@ private: void detectRenamedFiles(InSyncDir& container) { std::for_each(container.files.begin(), container.files.end(), - [&](std::pair& filePair) { findAndSetMovePair(filePair.second); }); + [&](std::pair& dbFile) { findAndSetMovePair(dbFile.second); }); std::for_each(container.dirs.begin(), container.dirs.end(), - [&](std::pair& dirPair) { detectRenamedFiles(dirPair.second); }); + [&](std::pair& dbDir) { detectRenamedFiles(dbDir.second); }); } - template - static bool sameSizeAndDate(const FileMapping& fsObj, const FileDescriptor& fileDescr) + static bool sameSizeAndDateLeft(const FilePair& fsObj, const InSyncFile& dbEntry) { - return fsObj.getFileSize() == fileDescr.fileSize && - sameFileTime(fsObj.getLastWriteTime(), fileDescr.lastWriteTimeRaw, 2); //respect 2 second FAT/FAT32 precision! + return fsObj.getFileSize() == dbEntry.fileSize && + sameFileTime(fsObj.getLastWriteTime(), dbEntry.left.lastWriteTimeRaw, 2); //respect 2 second FAT/FAT32 precision! //PS: *never* allow 2 sec tolerance as container predicate!! // => no strict weak ordering relation! reason: no transitivity of equivalence! } + static bool sameSizeAndDateRight(const FilePair& fsObj, const InSyncFile& dbEntry) + { + return fsObj.getFileSize() == dbEntry.fileSize && + sameFileTime(fsObj.getLastWriteTime(), dbEntry.right.lastWriteTimeRaw, 2); + } void findAndSetMovePair(const InSyncFile& dbEntry) const { - const FileId idLeft = getFileId(dbEntry.left); - const FileId idRight = getFileId(dbEntry.right); + const FileId idLeft = dbEntry.left .fileId; + const FileId idRight = dbEntry.right.fileId; if (idLeft != FileId() && idRight != FileId() && @@ -555,13 +559,13 @@ private: { auto itL = exLeftOnly.find(idLeft); if (itL != exLeftOnly.end()) - if (FileMapping* fileLeftOnly = itL->second) //= nullptr, if duplicate ID! - if (sameSizeAndDate(*fileLeftOnly, dbEntry.left)) + if (FilePair* fileLeftOnly = itL->second) //= nullptr, if duplicate ID! + if (sameSizeAndDateLeft(*fileLeftOnly, dbEntry)) { auto itR = exRightOnly.find(idRight); if (itR != exRightOnly.end()) - if (FileMapping* fileRightOnly = itR->second) //= nullptr, if duplicate ID! - if (sameSizeAndDate(*fileRightOnly, dbEntry.right)) + if (FilePair* fileRightOnly = itR->second) //= nullptr, if duplicate ID! + if (sameSizeAndDateRight(*fileRightOnly, dbEntry)) if (fileLeftOnly ->getMoveRef() == nullptr && //the db may contain duplicate file ids on left or right side: e.g. consider aliasing through symlinks fileRightOnly->getMoveRef() == nullptr) //=> should not be a problem (same id, size, date => alias!) but don't let a row participate in two move pairs! { @@ -580,8 +584,8 @@ private: const size_t fileTimeTolerance; std::function reportWarning_; - std::map exLeftOnly; //FileMapping* == nullptr for duplicate ids! => consider aliasing through symlinks! - std::map exRightOnly; //=> avoid ambiguity for mixtures of files/symlinks on one side and allow 1-1 mapping only! + std::map exLeftOnly; //FilePair* == nullptr for duplicate ids! => consider aliasing through symlinks! + std::map exRightOnly; //=> avoid ambiguity for mixtures of files/symlinks on one side and allow 1-1 mapping only! /* detect renamed files @@ -618,8 +622,8 @@ private: std::map: FielId |-> DB* rightIdToDbRight 3. collect files on one side during determination of sync directions: - std::vector exLeftOnlyToDbRight -> first try to use file Id, if failed associate via file name instead - std::hash_map dbRightToexRightOnly -> + std::vector exLeftOnlyToDbRight -> first try to use file Id, if failed associate via file name instead + std::hash_map dbRightToexRightOnly -> 4. find renamed pairs */ @@ -648,7 +652,7 @@ std::vector zen::extractDirectionCfg(const MainConfiguration& m } -void zen::redetermineSyncDirection(const DirectionConfig& directConfig, BaseDirMapping& baseDirectory, std::function reportWarning) +void zen::redetermineSyncDirection(const DirectionConfig& directConfig, BaseDirPair& baseDirectory, std::function reportWarning) { if (directConfig.var == DirectionConfig::AUTOMATIC) RedetermineAuto::execute(baseDirectory, reportWarning); @@ -684,19 +688,19 @@ class SetNewDirection public: SetNewDirection(SyncDirection newDirection) : newDirection_(newDirection) {} - void operator()(FileMapping& fileObj) const + void operator()(FilePair& fileObj) const { if (fileObj.getCategory() != FILE_EQUAL) fileObj.setSyncDir(newDirection_); } - void operator()(SymLinkMapping& linkObj) const + void operator()(SymlinkPair& linkObj) const { if (linkObj.getLinkCategory() != SYMLINK_EQUAL) linkObj.setSyncDir(newDirection_); } - void operator()(DirMapping& dirObj) const + void operator()(DirPair& dirObj) const { if (dirObj.getDirCategory() != DIR_EQUAL) dirObj.setSyncDir(newDirection_); @@ -706,9 +710,9 @@ public: private: void execute(HierarchyObject& hierObj) const { - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); - std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FilePair& fileObj) { (*this)(fileObj); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymlinkPair& linkObj) { (*this)(linkObj); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirPair& dirObj) { (*this)(dirObj); }); } const SyncDirection newDirection_; @@ -723,17 +727,17 @@ void zen::setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsOb struct Recurse: public FSObjectVisitor { Recurse(const SetNewDirection& ds) : dirSetter_(ds) {} - virtual void visit(const FileMapping& fileObj) + virtual void visit(const FilePair& fileObj) { - dirSetter_(const_cast(fileObj)); //phyiscal object is not const in this method anyway + dirSetter_(const_cast(fileObj)); //phyiscal object is not const in this method anyway } - virtual void visit(const SymLinkMapping& linkObj) + virtual void visit(const SymlinkPair& linkObj) { - dirSetter_(const_cast(linkObj)); // + dirSetter_(const_cast(linkObj)); // } - virtual void visit(const DirMapping& dirObj) + virtual void visit(const DirPair& dirObj) { - dirSetter_(const_cast(dirObj)); // + dirSetter_(const_cast(dirObj)); // } private: const SetNewDirection& dirSetter_; @@ -747,30 +751,30 @@ template class InOrExcludeAllRows { public: - void operator()(zen::BaseDirMapping& baseDirectory) const //be careful with operator() to no get called by std::for_each! + void operator()(zen::BaseDirPair& baseDirectory) const //be careful with operator() to no get called by std::for_each! { execute(baseDirectory); } void execute(zen::HierarchyObject& hierObj) const //don't create ambiguity by replacing with operator() { - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); - std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FilePair& fileObj) { (*this)(fileObj); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymlinkPair& linkObj) { (*this)(linkObj); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirPair& dirObj) { (*this)(dirObj); }); } private: - void operator()(zen::FileMapping& fileObj) const + void operator()(zen::FilePair& fileObj) const { fileObj.setActive(include); } - void operator()(zen::SymLinkMapping& linkObj) const + void operator()(zen::SymlinkPair& linkObj) const { linkObj.setActive(include); } - void operator()(zen::DirMapping& dirObj) const + void operator()(zen::DirPair& dirObj) const { dirObj.setActive(include); execute(dirObj); //recursion @@ -795,14 +799,14 @@ void zen::setActiveStatus(bool newStatus, zen::FileSystemObject& fsObj) struct Recurse: public FSObjectVisitor { Recurse(bool newStat) : newStatus_(newStat) {} - virtual void visit(const FileMapping& fileObj) {} - virtual void visit(const SymLinkMapping& linkObj) {} - virtual void visit(const DirMapping& dirObj) + virtual void visit(const FilePair& fileObj) {} + virtual void visit(const SymlinkPair& linkObj) {} + virtual void visit(const DirPair& dirObj) { if (newStatus_) - InOrExcludeAllRows().execute(const_cast(dirObj)); //object is not physically const here anyway + InOrExcludeAllRows().execute(const_cast(dirObj)); //object is not physically const here anyway else - InOrExcludeAllRows().execute(const_cast(dirObj)); // + InOrExcludeAllRows().execute(const_cast(dirObj)); // } private: const bool newStatus_; @@ -851,25 +855,25 @@ public: void execute(zen::HierarchyObject& hierObj) const { - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); - std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FilePair& fileObj) { (*this)(fileObj); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymlinkPair& linkObj) { (*this)(linkObj); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirPair& dirObj) { (*this)(dirObj); }); }; private: - void operator()(zen::FileMapping& fileObj) const + void operator()(zen::FilePair& fileObj) const { if (Eval().process(fileObj)) fileObj.setActive(filterProc.passFileFilter(fileObj.getObjRelativeName())); } - void operator()(zen::SymLinkMapping& linkObj) const + void operator()(zen::SymlinkPair& linkObj) const { if (Eval().process(linkObj)) linkObj.setActive(filterProc.passFileFilter(linkObj.getObjRelativeName())); } - void operator()(zen::DirMapping& dirObj) const + void operator()(zen::DirPair& dirObj) const { bool subObjMightMatch = true; const bool filterPassed = filterProc.passDirFilter(dirObj.getObjRelativeName(), &subObjMightMatch); @@ -901,13 +905,13 @@ public: void execute(zen::HierarchyObject& hierObj) const { - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); - std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FilePair& fileObj) { (*this)(fileObj); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymlinkPair& linkObj) { (*this)(linkObj); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirPair& dirObj) { (*this)(dirObj); }); }; private: - void operator()(zen::FileMapping& fileObj) const + void operator()(zen::FilePair& fileObj) const { if (Eval().process(fileObj)) { @@ -942,7 +946,7 @@ private: } } - void operator()(zen::SymLinkMapping& linkObj) const + void operator()(zen::SymlinkPair& linkObj) const { if (Eval().process(linkObj)) { @@ -956,7 +960,7 @@ private: } } - void operator()(zen::DirMapping& dirObj) const + void operator()(zen::DirPair& dirObj) const { if (Eval().process(dirObj)) dirObj.setActive(timeSizeFilter_.matchFolder()); //if date filter is active we deactivate all folders: effectively gets rid of empty folders! @@ -981,16 +985,16 @@ private: } -void zen::addHardFiltering(BaseDirMapping& baseMap, const Zstring& excludeFilter) +void zen::addHardFiltering(BaseDirPair& baseDirObj, const Zstring& excludeFilter) { - ApplyHardFilter(NameFilter(FilterConfig().includeFilter, excludeFilter)).execute(baseMap); + ApplyHardFilter(NameFilter(FilterConfig().includeFilter, excludeFilter)).execute(baseDirObj); } -void zen::addSoftFiltering(BaseDirMapping& baseMap, const SoftFilter& timeSizeFilter) +void zen::addSoftFiltering(BaseDirPair& baseDirObj, const SoftFilter& timeSizeFilter) { if (!timeSizeFilter.isNull()) //since we use STRATEGY_AND, we may skip a "null" filter - ApplySoftFilter(timeSizeFilter).execute(baseMap); + ApplySoftFilter(timeSizeFilter).execute(baseDirObj); } @@ -1010,7 +1014,7 @@ void zen::applyFiltering(FolderComparison& folderCmp, const MainConfiguration& m for (auto it = allPairs.begin(); it != allPairs.end(); ++it) { - BaseDirMapping& baseDirectory = *folderCmp[it - allPairs.begin()]; + BaseDirPair& baseDirectory = *folderCmp[it - allPairs.begin()]; const NormalizedFilter normFilter = normalizeFilters(mainCfg.globalFilter, it->localFilter); @@ -1033,13 +1037,13 @@ public: void execute(zen::HierarchyObject& hierObj) const { - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FileMapping& fileMap) { (*this)(fileMap); }); - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymLinkMapping& linkMap) { (*this)(linkMap); }); - std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirMapping& dirMap) { (*this)(dirMap); }); + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](FilePair& fileObj) { (*this)(fileObj); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](SymlinkPair& linkObj) { (*this)(linkObj); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](DirPair& dirObj) { (*this)(dirObj); }); }; private: - void operator()(zen::FileMapping& fileObj) const + void operator()(zen::FilePair& fileObj) const { if (fileObj.isEmpty()) fileObj.setActive(matchTime(fileObj)); @@ -1050,7 +1054,7 @@ private: matchTime(fileObj)); } - void operator()(zen::SymLinkMapping& linkObj) const + void operator()(zen::SymlinkPair& linkObj) const { if (linkObj.isEmpty()) linkObj.setActive(matchTime(linkObj)); @@ -1061,7 +1065,7 @@ private: matchTime (linkObj)); } - void operator()(zen::DirMapping& dirObj) const + void operator()(zen::DirPair& dirObj) const { dirObj.setActive(false); execute(dirObj); //recursion @@ -1082,8 +1086,7 @@ private: void zen::applyTimeSpanFilter(FolderComparison& folderCmp, const Int64& timeFrom, const Int64& timeTo) { FilterByTimeSpan spanFilter(timeFrom, timeTo); - - std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirMapping& baseMap) { spanFilter.execute(baseMap); }); + std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirPair& baseDirObj) { spanFilter.execute(baseDirObj); }); } @@ -1177,7 +1180,7 @@ bool tryReportingError(Function cmd, DeleteFilesHandler& handler) //return "true } } -#ifdef FFS_WIN +#ifdef ZEN_WIN //recycleBinStatus() blocks seriously if recycle bin is really full and drive is slow StatusRecycler recycleBinStatusUpdating(const Zstring& dirname, DeleteFilesHandler& callback) { @@ -1201,14 +1204,14 @@ void categorize(const std::set& rowsIn, { auto hasRecycler = [&](const FileSystemObject& fsObj) -> bool { -#ifdef FFS_WIN +#ifdef ZEN_WIN const Zstring& baseDirPf = fsObj.root().getBaseDirPf(); auto it = hasRecyclerBuffer.find(baseDirPf); if (it != hasRecyclerBuffer.end()) return it->second; return hasRecyclerBuffer.insert(std::make_pair(baseDirPf, recycleBinStatusUpdating(baseDirPf, callback) == STATUS_REC_EXISTS)).first->second; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC return true; #endif }; @@ -1244,7 +1247,7 @@ struct ItemDeleter : public FSObjectVisitor //throw FileError, but nothrow cons } } - virtual void visit(const FileMapping& fileObj) + virtual void visit(const FilePair& fileObj) { notifyFileDeletion(fileObj.getFullName()); @@ -1254,7 +1257,7 @@ struct ItemDeleter : public FSObjectVisitor //throw FileError, but nothrow cons zen::removeFile(fileObj.getFullName()); //throw FileError } - virtual void visit(const SymLinkMapping& linkObj) + virtual void visit(const SymlinkPair& linkObj) { notifySymlinkDeletion(linkObj.getFullName()); @@ -1274,7 +1277,7 @@ struct ItemDeleter : public FSObjectVisitor //throw FileError, but nothrow cons } } - virtual void visit(const DirMapping& dirObj) + virtual void visit(const DirPair& dirObj) { notifyDirectoryDeletion(dirObj.getFullName()); //notfied twice! see RemoveCallbackImpl -> no big deal @@ -1350,7 +1353,7 @@ void zen::deleteFromGridAndHD(const std::vector& rowsToDelete throw std::logic_error("Programming Error: Contract violation! " + std::string(__FILE__) + ":" + numberTo(__LINE__)); //build up mapping from base directory to corresponding direction config - hash_map baseDirCfgs; + hash_map baseDirCfgs; for (auto it = folderCmp.begin(); it != folderCmp.end(); ++it) baseDirCfgs[&** it] = directCfgs[it - folderCmp.begin()]; @@ -1399,7 +1402,7 @@ void zen::deleteFromGridAndHD(const std::vector& rowsToDelete } //last step: cleanup empty rows: this one invalidates all pointers! - std::for_each(begin(folderCmp), end(folderCmp), BaseDirMapping::removeEmpty); + std::for_each(begin(folderCmp), end(folderCmp), BaseDirPair::removeEmpty); }; ZEN_ON_SCOPE_EXIT(updateDirection()); //MSVC: assert is a macro and it doesn't play nice with ZEN_ON_SCOPE_EXIT, surprise... wasn't there something about macros being "evil"? @@ -1417,7 +1420,7 @@ void zen::deleteFromGridAndHD(const std::vector& rowsToDelete if (useRecycleBin && std::any_of(hasRecyclerBuffer.begin(), hasRecyclerBuffer.end(), [](std::pair item) { return !item.second; })) { - std::wstring msg = _("Recycle Bin is not available for the following paths! Files will be deleted permanently instead:") + L"\n"; + std::wstring msg = _("The Recycle Bin is not available for the following folders. Files will be deleted permanently instead:") + L"\n"; for (auto it = hasRecyclerBuffer.begin(); it != hasRecyclerBuffer.end(); ++it) if (!it->second) diff --git a/algorithm.h b/algorithm.h index 91881d6e..09adb5ec 100644 --- a/algorithm.h +++ b/algorithm.h @@ -17,7 +17,7 @@ void swapGrids(const MainConfiguration& config, FolderComparison& folderCmp); std::vector extractDirectionCfg(const MainConfiguration& mainCfg); -void redetermineSyncDirection(const DirectionConfig& directConfig, BaseDirMapping& baseDirectory, std::function reportWarning); +void redetermineSyncDirection(const DirectionConfig& directConfig, BaseDirPair& baseDirectory, std::function reportWarning); void redetermineSyncDirection(const MainConfiguration& mainCfg, FolderComparison& folderCmp, std::function reportWarning); void setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsObj); //set new direction (recursively) @@ -26,8 +26,8 @@ bool allElementsEqual(const FolderComparison& folderCmp); //filtering void applyFiltering (FolderComparison& folderCmp, const MainConfiguration& mainCfg); //full filter apply -void addHardFiltering(BaseDirMapping& baseMap, const Zstring& excludeFilter); //exclude additional entries only -void addSoftFiltering(BaseDirMapping& baseMap, const SoftFilter& timeSizeFilter); //exclude additional entries only +void addHardFiltering(BaseDirPair& baseDirObj, const Zstring& excludeFilter); //exclude additional entries only +void addSoftFiltering(BaseDirPair& baseDirObj, const SoftFilter& timeSizeFilter); //exclude additional entries only void applyTimeSpanFilter(FolderComparison& folderCmp, const Int64& timeFrom, const Int64& timeTo); //overwrite current active/inactive settings diff --git a/comparison.cpp b/comparison.cpp index 6db6cf03..dff58786 100644 --- a/comparison.cpp +++ b/comparison.cpp @@ -92,10 +92,8 @@ std::set determineExistentDirs(const std::set& folderPairsForm, bo if (!dependentDirs.empty()) { - std::wstring warningMsg = _("Directories are dependent! Be careful when setting up synchronization rules:"); + std::wstring warningMsg = _("The following folders have dependent paths. Be careful when setting up synchronization rules:"); for (auto it = dependentDirs.begin(); it != dependentDirs.end(); ++it) warningMsg += std::wstring(L"\n\n") + it->first + L"\n" + @@ -135,7 +133,6 @@ void checkFolderDependency(const std::vector& folderPairsForm, bo } -//callback implementation class CmpCallbackImpl : public CompareCallback { public: @@ -182,22 +179,19 @@ bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filen class ComparisonBuffer { public: - ComparisonBuffer(const std::set& keysToRead, - size_t fileTimeTol, - ProcessCallback& callback); + ComparisonBuffer(const std::set& keysToRead, size_t fileTimeTol, ProcessCallback& callback); //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedLinks are appended! - void compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output); - void compareByContent(std::vector>& workLoad); + std::shared_ptr compareByTimeSize(const FolderPairCfg& fpConfig) const; + std::list> compareByContent(const std::vector& workLoad) const; private: ComparisonBuffer(const ComparisonBuffer&); ComparisonBuffer& operator=(const ComparisonBuffer&); - void performComparison(const FolderPairCfg& fpCfg, - BaseDirMapping& output, - std::vector& undefinedFiles, - std::vector& undefinedLinks); + std::shared_ptr performComparison(const FolderPairCfg& fpCfg, + std::vector& undefinedFiles, + std::vector& undefinedLinks) const; std::map directoryBuffer; //contains only *existing* directories const size_t fileTimeTolerance; @@ -265,15 +259,15 @@ const wchar_t arrowRight[] = L"-->"; //check for very old dates or date2s in the future std::wstring getConflictInvalidDate(const Zstring& fileNameFull, Int64 utcTime) { - return _("Conflict detected:") + L" " + replaceCpy(_("File %x has an invalid date!"), L"%x", fmtFileName(fileNameFull)) + L"\n" + + return replaceCpy(_("File %x has an invalid date."), L"%x", fmtFileName(fileNameFull)) + L"\n" + _("Date:") + L" " + utcToLocalTimeString(utcTime); } //check for changed files with same modification date -std::wstring getConflictSameDateDiffSize(const FileMapping& fileObj) +std::wstring getConflictSameDateDiffSize(const FilePair& fileObj) { - return _("Conflict detected:") + L" " + replaceCpy(_("Files %x have the same date but a different size!"), L"%x", fmtFileName(fileObj.getObjRelativeName())) + L"\n" + + return replaceCpy(_("Files %x have the same date but a different size."), L"%x", fmtFileName(fileObj.getObjRelativeName())) + L"\n" + arrowLeft + L" " + _("Date:") + L" " + utcToLocalTimeString(fileObj.getLastWriteTime()) + L" " + _("Size:") + L" " + toGuiString(fileObj.getFileSize()) + L"\n" + arrowRight + L" " + _("Date:") + L" " + utcToLocalTimeString(fileObj.getLastWriteTime()) + L" " + _("Size:") + L" " + toGuiString(fileObj.getFileSize()); } @@ -288,8 +282,8 @@ std::wstring getDescrDiffMetaShortnameCase(const FileSystemObject& fsObj) } -template inline -std::wstring getDescrDiffMetaDate(const FileOrLinkMapping& fileObj) +template inline +std::wstring getDescrDiffMetaDate(const FileOrLinkPair& fileObj) { return _("Items differ in attributes only") + L"\n" + arrowLeft + L" " + _("Date:") + L" " + utcToLocalTimeString(fileObj.template getLastWriteTime()) + L"\n" + @@ -298,7 +292,7 @@ std::wstring getDescrDiffMetaDate(const FileOrLinkMapping& fileObj) //----------------------------------------------------------------------------- -void categorizeSymlinkByTime(SymLinkMapping& linkObj, size_t fileTimeTolerance) +void categorizeSymlinkByTime(SymlinkPair& linkObj, size_t fileTimeTolerance) { //categorize symlinks that exist on both sides switch (CmpFileTime::getResult(linkObj.getLastWriteTime(), @@ -334,31 +328,31 @@ void categorizeSymlinkByTime(SymLinkMapping& linkObj, size_t fileTimeTolerance) } -void ComparisonBuffer::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output) +std::shared_ptr ComparisonBuffer::compareByTimeSize(const FolderPairCfg& fpConfig) const { //do basis scan and retrieve files existing on both sides as "compareCandidates" - std::vector uncategorizedFiles; - std::vector uncategorizedLinks; - performComparison(fpConfig, output, uncategorizedFiles, uncategorizedLinks); + std::vector uncategorizedFiles; + std::vector uncategorizedLinks; + std::shared_ptr output = performComparison(fpConfig, uncategorizedFiles, uncategorizedLinks); //finish symlink categorization std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(), - [&](SymLinkMapping* linkMap) { categorizeSymlinkByTime(*linkMap, fileTimeTolerance); }); + [&](SymlinkPair* linkObj) { categorizeSymlinkByTime(*linkObj, fileTimeTolerance); }); //categorize files that exist on both sides std::for_each(uncategorizedFiles.begin(), uncategorizedFiles.end(), - [&](FileMapping* fileObj) + [&](FilePair* fileObj) { switch (CmpFileTime::getResult(fileObj->getLastWriteTime(), fileObj->getLastWriteTime(), fileTimeTolerance)) { case CmpFileTime::TIME_EQUAL: + //Caveat: + //1. FILE_EQUAL may only be set if short names match in case: InSyncDir's mapping tables use short name as a key! see db_file.cpp + //2. FILE_EQUAL is expected to mean identical file sizes! See InSyncFile + //3. harmonize with "bool stillInSync()" in algorithm.cpp, FilePair::syncTo() in file_hierarchy.cpp if (fileObj->getFileSize() == fileObj->getFileSize()) { - //Caveat: - //1. FILE_EQUAL may only be set if short names match in case: InSyncDir's mapping tables use short name as a key! see db_file.cpp - //2. harmonize with "bool stillInSync()" in algorithm.cpp - if (fileObj->getShortName() == fileObj->getShortName()) fileObj->setCategory(); else @@ -385,10 +379,11 @@ void ComparisonBuffer::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirM break; } }); + return output; } -void categorizeSymlinkByContent(SymLinkMapping& linkObj, size_t fileTimeTolerance, ProcessCallback& callback) +void categorizeSymlinkByContent(SymlinkPair& linkObj, size_t fileTimeTolerance, ProcessCallback& callback) { //categorize symlinks that exist on both sides Zstring targetPathRawL; @@ -403,11 +398,11 @@ void categorizeSymlinkByContent(SymLinkMapping& linkObj, size_t fileTimeToleranc }, callback); if (errMsg) - linkObj.setCategoryConflict(_("Conflict detected:") + L" " + *errMsg); + linkObj.setCategoryConflict(*errMsg); else { if (targetPathRawL == targetPathRawR -#ifdef FFS_WIN //type of symbolic link is relevant for Windows only +#ifdef ZEN_WIN //type of symbolic link is relevant for Windows only && getSymlinkType(linkObj.getFullName()) == getSymlinkType(linkObj.getFullName()) @@ -416,7 +411,7 @@ void categorizeSymlinkByContent(SymLinkMapping& linkObj, size_t fileTimeToleranc { //Caveat: //1. SYMLINK_EQUAL may only be set if short names match in case: InSyncDir's mapping tables use short name as a key! see db_file.cpp - //2. harmonize with "bool stillInSync()" in algorithm.cpp + //2. harmonize with "bool stillInSync()" in algorithm.cpp, FilePair::syncTo() in file_hierarchy.cpp //symlinks have same "content" if (linkObj.getShortName() != linkObj.getShortName()) @@ -433,36 +428,38 @@ void categorizeSymlinkByContent(SymLinkMapping& linkObj, size_t fileTimeToleranc } -void ComparisonBuffer::compareByContent(std::vector>& workLoad) +std::list> ComparisonBuffer::compareByContent(const std::vector& workLoad) const { - if (workLoad.empty()) return; + std::list> output; + if (workLoad.empty()) + return output; //PERF_START; - std::vector undefinedFiles; + std::vector undefinedFiles; //process one folder pair after each other - for (auto workItem = workLoad.begin(); workItem != workLoad.end(); ++workItem) + for (auto it = workLoad.begin(); it != workLoad.end(); ++it) { - std::vector uncategorizedLinks; + std::vector uncategorizedLinks; //do basis scan and retrieve candidates for binary comparison (files existing on both sides) - performComparison(workItem->first, *workItem->second, undefinedFiles, uncategorizedLinks); + output.push_back(performComparison(*it, undefinedFiles, uncategorizedLinks)); //finish symlink categorization std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(), - [&](SymLinkMapping* linkMap) { categorizeSymlinkByContent(*linkMap, fileTimeTolerance, callback_); }); + [&](SymlinkPair* linkObj) { categorizeSymlinkByContent(*linkObj, fileTimeTolerance, callback_); }); } //finish categorization... - std::vector filesToCompareBytewise; + std::vector filesToCompareBytewise; //content comparison of file content happens AFTER finding corresponding files //in order to separate into two processes (scanning and comparing) std::for_each(undefinedFiles.begin(), undefinedFiles.end(), - [&](FileMapping* fileObj) + [&](FilePair* fileObj) { - //pre-check: files have different content if they have a different filesize + //pre-check: files have different content if they have a different filesize (must not be FILE_EQUAL: see InSyncFile) if (fileObj->getFileSize() != fileObj->getFileSize()) fileObj->setCategory(); else @@ -472,7 +469,7 @@ void ComparisonBuffer::compareByContent(std::vector(0), - [](UInt64 sum, FileMapping* fsObj) { return sum + fsObj->getFileSize(); }); + [](UInt64 sum, FilePair* fsObj) { return sum + fsObj->getFileSize(); }); callback_.initNewPhase(static_cast(objectsTotal), to(bytesTotal), @@ -482,7 +479,7 @@ void ComparisonBuffer::compareByContent(std::vectorgetObjRelativeName()), false)); @@ -501,14 +498,15 @@ void ComparisonBuffer::compareByContent(std::vectorsetCategoryConflict(_("Conflict detected:") + L" " + *errMsg); + fileObj->setCategoryConflict(*errMsg); else { if (haveSameContent) { //Caveat: //1. FILE_EQUAL may only be set if short names match in case: InSyncDir's mapping tables use short name as a key! see db_file.cpp - //2. harmonize with "bool stillInSync()" in algorithm.cpp + //2. FILE_EQUAL is expected to mean identical file sizes! See InSyncFile + //3. harmonize with "bool stillInSync()" in algorithm.cpp, FilePair::syncTo() in file_hierarchy.cpp if (fileObj->getShortName() != fileObj->getShortName()) fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(*fileObj)); else if (CmpFileTime::getResult(fileObj->getLastWriteTime(), fileObj->getLastWriteTime(), fileTimeTolerance) != CmpFileTime::TIME_EQUAL) @@ -520,14 +518,15 @@ void ComparisonBuffer::compareByContent(std::vectorsetCategory(); } }); + return output; } class MergeSides { public: - MergeSides(std::vector& appendUndefinedFileOut, - std::vector& appendUndefinedLinkOut) : + MergeSides(std::vector& appendUndefinedFileOut, + std::vector& appendUndefinedLinkOut) : appendUndefinedFile(appendUndefinedFileOut), appendUndefinedLink(appendUndefinedLinkOut) {} @@ -537,8 +536,8 @@ private: template void fillOneSide(const DirContainer& dirCont, HierarchyObject& output); - std::vector& appendUndefinedFile; - std::vector& appendUndefinedLink; + std::vector& appendUndefinedFile; + std::vector& appendUndefinedLink; }; @@ -553,7 +552,7 @@ void MergeSides::fillOneSide(const DirContainer& dirCont, HierarchyObject& outpu for (auto it = dirCont.dirs.cbegin(); it != dirCont.dirs.cend(); ++it) { - DirMapping& newDirMap = output.addSubDir(it->first); + DirPair& newDirMap = output.addSubDir(it->first); fillOneSide(it->second, newDirMap); //recurse } } @@ -610,11 +609,11 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right [&](const FileData& fileLeft, const FileData& fileRight) //both sides { - FileMapping& newEntry = output.addSubFile(fileLeft.first, - fileLeft.second, - FILE_EQUAL, //FILE_EQUAL is just a dummy-value here - fileRight.first, - fileRight.second); + FilePair& newEntry = output.addSubFile(fileLeft.first, + fileLeft.second, + FILE_EQUAL, //FILE_EQUAL is just a dummy-value here + fileRight.first, + fileRight.second); appendUndefinedFile.push_back(&newEntry); }); @@ -627,11 +626,11 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right [&](const LinkData& linkLeft, const LinkData& linkRight) //both sides { - SymLinkMapping& newEntry = output.addSubLink(linkLeft.first, - linkLeft.second, - SYMLINK_EQUAL, //SYMLINK_EQUAL is just a dummy-value here - linkRight.first, - linkRight.second); + SymlinkPair& newEntry = output.addSubLink(linkLeft.first, + linkLeft.second, + SYMLINK_EQUAL, //SYMLINK_EQUAL is just a dummy-value here + linkRight.first, + linkRight.second); appendUndefinedLink.push_back(&newEntry); }); @@ -641,18 +640,18 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right linearMerge(leftSide.dirs, rightSide.dirs, [&](const DirData& dirLeft) //left only { - DirMapping& newDirMap = output.addSubDir(dirLeft.first); + DirPair& newDirMap = output.addSubDir(dirLeft.first); this->fillOneSide(dirLeft.second, newDirMap); //recurse into subdirectories }, [&](const DirData& dirRight) //right only { - DirMapping& newDirMap = output.addSubDir(dirRight.first); + DirPair& newDirMap = output.addSubDir(dirRight.first); this->fillOneSide(dirRight.second, newDirMap); //recurse into subdirectories }, [&](const DirData& dirLeft, const DirData& dirRight) //both sides { - DirMapping& newDirMap = output.addSubDir(dirLeft.first, dirRight.first, DIR_EQUAL); + DirPair& newDirMap = output.addSubDir(dirLeft.first, dirRight.first, DIR_EQUAL); if (dirLeft.first != dirRight.first) newDirMap.setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(newDirMap)); @@ -662,21 +661,21 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right //mark excluded directories (see fillBuffer()) + remove superfluous excluded subdirectories //note: this cannot be done while traversing directory, since both sides need to be taken into account, both for filtering AND removing subdirs! -void processFilteredDirs(HierarchyObject& hierObj, const HardFilter& filterProc) +void removeFilteredDirs(HierarchyObject& hierObj, const HardFilter& filterProc) { auto& subDirs = hierObj.refSubDirs(); //process subdirs recursively std::for_each(subDirs.begin(), subDirs.end(), - [&](DirMapping& dirObj) + [&](DirPair& dirObj) { dirObj.setActive(filterProc.passDirFilter(dirObj.getObjRelativeName(), nullptr)); //subObjMightMatch is always true in this context! - processFilteredDirs(dirObj, filterProc); + removeFilteredDirs(dirObj, filterProc); }); - //remove superfluous directories -> note: this does not invalidate "std::vector& undefinedFiles", since we delete folders only - //and there is no side-effect for memory positions of FileMapping and SymlinkMapping thanks to zen::FixedList! - subDirs.remove_if([](DirMapping& dirObj) + //remove superfluous directories -> note: this does not invalidate "std::vector& undefinedFiles", since we delete folders only + //and there is no side-effect for memory positions of FilePair and SymlinkPair thanks to zen::FixedList! + subDirs.remove_if([](DirPair& dirObj) { return !dirObj.isActive() && dirObj.refSubDirs ().empty() && @@ -687,16 +686,12 @@ void processFilteredDirs(HierarchyObject& hierObj, const HardFilter& filterProc) //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedLinks are appended! -void ComparisonBuffer::performComparison(const FolderPairCfg& fpCfg, - BaseDirMapping& output, - std::vector& undefinedFiles, - std::vector& undefinedLinks) +std::shared_ptr ComparisonBuffer::performComparison(const FolderPairCfg& fpCfg, + std::vector& undefinedFiles, + std::vector& undefinedLinks) const { - assert(output.refSubDirs(). empty()); - assert(output.refSubLinks().empty()); - assert(output.refSubFiles().empty()); - - //PERF_START; + callback_.reportStatus(_("Generating file list...")); + callback_.forceUiRefresh(); auto getDirValue = [&](const Zstring& dirnameFmt) -> const DirectoryValue* { @@ -707,43 +702,52 @@ void ComparisonBuffer::performComparison(const FolderPairCfg& fpCfg, const DirectoryValue* bufValueLeft = getDirValue(fpCfg.leftDirectoryFmt); const DirectoryValue* bufValueRight = getDirValue(fpCfg.rightDirectoryFmt); - callback_.reportStatus(_("Generating file list...")); - callback_.forceUiRefresh(); + Zstring filterFailedRead; + auto filterAddFailedDirReads = [&filterFailedRead](const std::set& failedDirReads) //exclude directory child items only! + { + //note: relDirPf is empty for base dir, otherwise postfixed! e.g. "subdir\" + //an empty relDirPf is a pathological case at this point, since determineExistentDirs() already filtered missing base directories! + std::for_each(failedDirReads .begin(), failedDirReads .end(), [&](const Zstring& relDirPf) { filterFailedRead += relDirPf + Zstr("?*\n"); }); + }; + auto filterAddFailedItemReads = [&filterFailedRead](const std::set& failedItemReads) //exclude item AND (potential) child items! + { + std::for_each(failedItemReads.begin(), failedItemReads.end(), [&](const Zstring& relItem ) { filterFailedRead += relItem + Zstr("\n"); }); + }; + + if (bufValueLeft ) filterAddFailedDirReads(bufValueLeft ->failedDirReads); + if (bufValueRight) filterAddFailedDirReads(bufValueRight->failedDirReads); + + if (bufValueLeft ) filterAddFailedItemReads(bufValueLeft ->failedItemReads); + if (bufValueRight) filterAddFailedItemReads(bufValueRight->failedItemReads); + //a pity VC11 screws up on std::make_shared with 7 arguments... + std::shared_ptr output(new BaseDirPair(fpCfg.leftDirectoryFmt, + bufValueLeft != nullptr, //dir existence must be checked only once: available iff buffer entry exists! + fpCfg.rightDirectoryFmt, + bufValueRight != nullptr, + fpCfg.filter.nameFilter, + fpCfg.compareVar, + fileTimeTolerance)); //PERF_START; MergeSides(undefinedFiles, undefinedLinks).execute(bufValueLeft ? bufValueLeft ->dirCont : DirContainer(), - bufValueRight ? bufValueRight->dirCont : DirContainer(), output); + bufValueRight ? bufValueRight->dirCont : DirContainer(), *output); //PERF_STOP; //##################### in/exclude rows according to filtering ##################### //attention: some excluded directories are still in the comparison result! (see include filter handling!) if (!fpCfg.filter.nameFilter->isNull()) - processFilteredDirs(output, *fpCfg.filter.nameFilter); //mark excluded directories (see fillBuffer()) + remove superfluous excluded subdirectories + removeFilteredDirs(*output, *fpCfg.filter.nameFilter); //mark excluded directories (see fillBuffer()) + remove superfluous excluded subdirectories - //apply soft filtering / hard filter already applied - addSoftFiltering(output, fpCfg.filter.timeSizeFilter); + //apply soft filtering (hard filter already applied during traversal!) + addSoftFiltering(*output, fpCfg.filter.timeSizeFilter); - //properly handle (user-ignored) traversing errors: just uncheck them, no need to physically delete them ( mode will be grateful) - auto addToSet = [](std::set& s, const std::set& v) { s.insert(v.begin(), v.end()); }; - std::set failedDirReads; - if (bufValueLeft ) addToSet(failedDirReads, bufValueLeft ->failedDirReads); - if (bufValueRight) addToSet(failedDirReads, bufValueRight->failedDirReads); + //handle (user-ignored) traversing errors: just uncheck them, no need to physically delete them from both sides + if (!filterFailedRead.empty()) + addHardFiltering(*output, filterFailedRead); - std::set failedItemReads; - if (bufValueLeft ) addToSet(failedItemReads, bufValueLeft ->failedItemReads); - if (bufValueRight) addToSet(failedItemReads, bufValueRight->failedItemReads); - - if (!failedDirReads.empty() || !failedItemReads.empty()) - { - Zstring filterFailedRead; - //note: relDirPf is empty for base dir, otherwise postfixed! e.g. "subdir\" - std::for_each(failedDirReads .begin(), failedDirReads .end(), [&](const Zstring& relDirPf) { filterFailedRead += relDirPf + Zstr("?*\n"); }); //exclude child items only! - std::for_each(failedItemReads.begin(), failedItemReads.end(), [&](const Zstring& relItem ) { filterFailedRead += relItem + Zstr("\n"); }); //exclude item AND child items! - - addHardFiltering(output, filterFailedRead); - } //################################################################################## + return output; } } @@ -785,7 +789,7 @@ void zen::compare(size_t fileTimeTolerance, //PERF_START; - callback.reportInfo(_("Start comparison")); //we want some indicator at the very beginning to make sense of "total time" + callback.reportInfo(_("Starting comparison")); //we want some indicator at the very beginning of the log to make sense of "total time" //init process: keep at beginning so that all gui elements are initialized properly callback.initNewPhase(-1, 0, ProcessCallback::PHASE_SCANNING); //it's not known how many files will be scanned => -1 objects @@ -820,59 +824,66 @@ void zen::compare(size_t fileTimeTolerance, dirLocks = make_unique(dirnamesExisting, warnings.warningDirectoryLockFailed, callback); //------------------- fill directory buffer --------------------------------------------------- - std::set keysToRead; + std::set dirsToRead; std::for_each(cfgList.begin(), cfgList.end(), [&](const FolderPairCfg& fpCfg) { if (dirAvailable(fpCfg.leftDirectoryFmt)) //only request *currently existing* directories: at this point user is aware that non-ex + empty string are seen as empty folder! - keysToRead.insert(DirectoryKey(fpCfg.leftDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); + dirsToRead.insert(DirectoryKey(fpCfg.leftDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); if (dirAvailable(fpCfg.rightDirectoryFmt)) - keysToRead.insert(DirectoryKey(fpCfg.rightDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); + dirsToRead.insert(DirectoryKey(fpCfg.rightDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks)); }); - ComparisonBuffer cmpBuff(keysToRead, - fileTimeTolerance, - callback); - - //------------ traverse/read folders ----------------------------------------------------- + FolderComparison outputTmp; //write to output as a transaction! - FolderComparison output_tmp; //write to output not before END of process! + //reduce peak memory by restricting lifetime of ComparisonBuffer to have ended when loading potentially huge InSyncDir instance in redetermineSyncDirection() + { + //------------ traverse/read folders ----------------------------------------------------- + ComparisonBuffer cmpBuff(dirsToRead, fileTimeTolerance, callback); - //buffer "config"/"result of binary comparison" for latter processing as a single block - std::vector> workLoadBinary; + //process binary comparison in one block + std::vector workLoadByContent; + std::for_each(cfgList.begin(), cfgList.end(), [&](const FolderPairCfg& fpCfg) + { + switch (fpCfg.compareVar) + { + case CMP_BY_TIME_SIZE: + break; + case CMP_BY_CONTENT: + workLoadByContent.push_back(fpCfg); + break; + } + }); + std::list> outputByContent = cmpBuff.compareByContent(workLoadByContent); - std::for_each(cfgList.begin(), cfgList.end(), - [&](const FolderPairCfg& fpCfg) - { - //a pity VC11 screws up on std::make_shared with 7 arguments... - output_tmp.push_back(std::shared_ptr(new BaseDirMapping(fpCfg.leftDirectoryFmt, - dirAvailable(fpCfg.leftDirectoryFmt), - fpCfg.rightDirectoryFmt, - dirAvailable(fpCfg.rightDirectoryFmt), - fpCfg.filter.nameFilter, - fpCfg.compareVar, - fileTimeTolerance))); - switch (fpCfg.compareVar) + //write output in order + std::for_each(cfgList.begin(), cfgList.end(), [&](const FolderPairCfg& fpCfg) { - case CMP_BY_TIME_SIZE: - cmpBuff.compareByTimeSize(fpCfg, *output_tmp.back()); - break; - case CMP_BY_CONTENT: - workLoadBinary.push_back(std::make_pair(fpCfg, &*output_tmp.back())); - break; - } - }); - //process binary comparison in one block - cmpBuff.compareByContent(workLoadBinary); + switch (fpCfg.compareVar) + { + case CMP_BY_TIME_SIZE: + outputTmp.push_back(cmpBuff.compareByTimeSize(fpCfg)); + break; + case CMP_BY_CONTENT: + assert(!outputByContent.empty()); + if (!outputByContent.empty()) + { + outputTmp.push_back(outputByContent.front()); + outputByContent.pop_front(); + } + break; + } + }); + } - assert(output_tmp.size() == cfgList.size()); + assert(outputTmp.size() == cfgList.size()); //--------- set initial sync-direction -------------------------------------------------- - for (auto j = begin(output_tmp); j != end(output_tmp); ++j) + for (auto j = begin(outputTmp); j != end(outputTmp); ++j) { - const FolderPairCfg& fpCfg = cfgList[j - output_tmp.begin()]; + const FolderPairCfg& fpCfg = cfgList[j - outputTmp.begin()]; callback.reportStatus(_("Calculating sync directions...")); callback.forceUiRefresh(); @@ -882,11 +893,11 @@ void zen::compare(size_t fileTimeTolerance, //only if everything was processed correctly output is written to! //note: output mustn't change during this process to be in sync with GUI grid view!!! - output_tmp.swap(output); + outputTmp.swap(output); } catch (const std::bad_alloc& e) { - callback.reportFatalError(_("Out of memory!") + L" " + utfCvrtTo(e.what())); + callback.reportFatalError(_("Out of memory.") + L" " + utfCvrtTo(e.what())); } catch (const std::exception& e) { diff --git a/comparison.h b/comparison.h index 2796670a..0b92bade 100644 --- a/comparison.h +++ b/comparison.h @@ -31,7 +31,7 @@ struct FolderPairCfg filter(filterIn), directionCfg(directCfg) {} - Zstring leftDirectoryFmt; //resolved folder pairs!!! + Zstring leftDirectoryFmt; //resolved directory names! Zstring rightDirectoryFmt; // CompareVariant compareVar; diff --git a/file_hierarchy.cpp b/file_hierarchy.cpp index 35abf251..13c73731 100644 --- a/file_hierarchy.cpp +++ b/file_hierarchy.cpp @@ -28,7 +28,7 @@ void HierarchyObject::removeEmptyRec() refSubDirs ().remove_if(isEmpty); if (emptyExisting) //notify if actual deletion happened - notifySyncCfgChanged(); //mustn't call this in ~FileSystemObject(), since parent, usually a DirMapping, is already partially destroyed and existing as a pure HierarchyObject! + notifySyncCfgChanged(); //mustn't call this in ~FileSystemObject(), since parent, usually a DirPair, is already partially destroyed and existing as a pure HierarchyObject! // for (auto& subDir : refSubDirs()) // subDir.removeEmptyRec(); //recurse @@ -130,15 +130,15 @@ SyncOperation FileSystemObject::testSyncOperation(SyncDirection testSyncDir) con SyncOperation FileSystemObject::getSyncOperation() const { - return getIsolatedSyncOperation(getCategory(), selectedForSynchronization, syncDir, syncDirConflict.get() != nullptr); - //no *not* make a virtual call to testSyncOperation()! See FileMapping::testSyncOperation()! <- better not implement one in terms of the other!!! + return getIsolatedSyncOperation(getCategory(), selectedForSynchronization, getSyncDir(), syncDirConflict.get() != nullptr); + //no *not* make a virtual call to testSyncOperation()! See FilePair::testSyncOperation()! <- better not implement one in terms of the other!!! } -//SyncOperation DirMapping::testSyncOperation() const -> no recursion: we do NOT want to consider child elements when testing! +//SyncOperation DirPair::testSyncOperation() const -> no recursion: we do NOT want to consider child elements when testing! -SyncOperation DirMapping::getSyncOperation() const +SyncOperation DirPair::getSyncOperation() const { if (!syncOpUpToDate) { @@ -224,14 +224,14 @@ SyncOperation DirMapping::getSyncOperation() const inline //it's private! -SyncOperation FileMapping::applyMoveOptimization(SyncOperation op) const +SyncOperation FilePair::applyMoveOptimization(SyncOperation op) const { /* check whether we can optimize "create + delete" via "move": note: as long as we consider "create + delete" cases only, detection of renamed files, should be fine even for "binary" comparison variant! */ if (moveFileRef) - if (auto refFile = dynamic_cast(FileSystemObject::retrieve(moveFileRef))) //we expect a "FileMapping", but only need a "FileSystemObject" + if (auto refFile = dynamic_cast(FileSystemObject::retrieve(moveFileRef))) //we expect a "FilePair", but only need a "FileSystemObject" { SyncOperation opRef = refFile->FileSystemObject::getSyncOperation(); //do *not* make a virtual call! @@ -252,13 +252,13 @@ SyncOperation FileMapping::applyMoveOptimization(SyncOperation op) const } -SyncOperation FileMapping::testSyncOperation(SyncDirection testSyncDir) const +SyncOperation FilePair::testSyncOperation(SyncDirection testSyncDir) const { return applyMoveOptimization(FileSystemObject::testSyncOperation(testSyncDir)); } -SyncOperation FileMapping::getSyncOperation() const +SyncOperation FilePair::getSyncOperation() const { return applyMoveOptimization(FileSystemObject::getSyncOperation()); } @@ -360,8 +360,8 @@ std::wstring zen::getSyncOpDescription(const FileSystemObject& fsObj) case SO_MOVE_LEFT_TARGET: case SO_MOVE_RIGHT_SOURCE: case SO_MOVE_RIGHT_TARGET: - if (const FileMapping* sourceFile = dynamic_cast(&fsObj)) - if (const FileMapping* targetFile = dynamic_cast(FileSystemObject::retrieve(sourceFile->getMoveRef()))) + if (const FilePair* sourceFile = dynamic_cast(&fsObj)) + if (const FilePair* targetFile = dynamic_cast(FileSystemObject::retrieve(sourceFile->getMoveRef()))) { const bool onLeft = op == SO_MOVE_LEFT_SOURCE || op == SO_MOVE_LEFT_TARGET; const bool isSource = op == SO_MOVE_LEFT_SOURCE || op == SO_MOVE_RIGHT_SOURCE; diff --git a/file_hierarchy.h b/file_hierarchy.h index eb5cc91e..7710e7ac 100644 --- a/file_hierarchy.h +++ b/file_hierarchy.h @@ -24,19 +24,22 @@ namespace zen { struct FileDescriptor { - FileDescriptor() : fileIdx(), devId() {} - FileDescriptor(Int64 lastWriteTimeRawIn, - UInt64 fileSizeIn, - const FileId& idIn) : + FileDescriptor() : fileIdx(), devId(), isFollowedSymlink() {} + FileDescriptor(const Int64& lastWriteTimeRawIn, + const UInt64& fileSizeIn, + const FileId& idIn, + bool isSymlink) : lastWriteTimeRaw(lastWriteTimeRawIn), fileSize(fileSizeIn), fileIdx(idIn.second), - devId(idIn.first) {} + devId(idIn.first), + isFollowedSymlink(isSymlink) {} Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long) UInt64 fileSize; FileIndex fileIdx; // == file id: optional! (however, always set on Linux, and *generally* available on Windows) - DeviceId devId; //split into file id into components to avoid padding overhead of a struct! + DeviceId devId; //split into file id into components to avoid padding overhead of a std::pair! + bool isFollowedSymlink; }; inline @@ -45,7 +48,7 @@ FileId getFileId(const FileDescriptor& fd) { return FileId(fd.devId, fd.fileIdx) struct LinkDescriptor { LinkDescriptor() {} - explicit LinkDescriptor(Int64 lastWriteTimeRawIn) : lastWriteTimeRaw(lastWriteTimeRawIn) {} + explicit LinkDescriptor(const Int64& lastWriteTimeRawIn) : lastWriteTimeRaw(lastWriteTimeRawIn) {} Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long) }; @@ -67,10 +70,28 @@ template <> struct OtherSide { static const SelectedSide result = LEFT_SIDE; }; -class BaseDirMapping; -class DirMapping; -class FileMapping; -class SymLinkMapping; +template +struct SelectParam; + +template <> +struct SelectParam +{ + template + static T& get(T& left, T& right) { return left; } +}; + +template <> +struct SelectParam +{ + template + static T& get(T& left, T& right) { return right; } +}; + + +class BaseDirPair; +class DirPair; +class FilePair; +class SymlinkPair; class FileSystemObject; //------------------------------------------------------------------ @@ -113,8 +134,8 @@ struct DirContainer } }; -//------------------------------------------------------------------ -/* inheritance diagram: +/*------------------------------------------------------------------ + inheritance diagram: ObjectMgr /|\ @@ -123,47 +144,47 @@ struct DirContainer /|\ /|\ _______________|______________ ______|______ | | | | | -SymLinkMapping FileMapping DirMapping BaseDirMapping -*/ + SymlinkPair FilePair DirPair BaseDirPair + +------------------------------------------------------------------*/ -//------------------------------------------------------------------ class HierarchyObject { - friend class DirMapping; + friend class DirPair; friend class FileSystemObject; public: - typedef zen::FixedList SubFileVec; //MergeSides::execute() requires a structure that doesn't invalidate pointers after push_back() - typedef zen::FixedList SubLinkVec; //Note: deque<> has circular dependency in VCPP! - typedef zen::FixedList SubDirVec; + typedef zen::FixedList SubFileVec; //MergeSides::execute() requires a structure that doesn't invalidate pointers after push_back() + typedef zen::FixedList SubLinkVec; //Note: deque<> has circular dependency in VCPP! + typedef zen::FixedList SubDirVec; - DirMapping& addSubDir(const Zstring& shortNameLeft, - const Zstring& shortNameRight, - CompareDirResult defaultCmpResult); + DirPair& addSubDir(const Zstring& shortNameLeft, + const Zstring& shortNameRight, + CompareDirResult defaultCmpResult); template - DirMapping& addSubDir(const Zstring& shortName); //dir exists on one side only + DirPair& addSubDir(const Zstring& shortName); //dir exists on one side only - FileMapping& addSubFile(const Zstring& shortNameLeft, - const FileDescriptor& left, //file exists on both sides - CompareFilesResult defaultCmpResult, - const Zstring& shortNameRight, - const FileDescriptor& right); + FilePair& addSubFile(const Zstring& shortNameLeft, + const FileDescriptor& left, //file exists on both sides + CompareFilesResult defaultCmpResult, + const Zstring& shortNameRight, + const FileDescriptor& right); template - FileMapping& addSubFile(const Zstring& shortNameRight, //file exists on one side only - const FileDescriptor& right); + FilePair& addSubFile(const Zstring& shortNameRight, //file exists on one side only + const FileDescriptor& right); - SymLinkMapping& addSubLink(const Zstring& shortNameLeft, - const LinkDescriptor& left, //link exists on both sides - CompareSymlinkResult defaultCmpResult, - const Zstring& shortNameRight, - const LinkDescriptor& right); + SymlinkPair& addSubLink(const Zstring& shortNameLeft, + const LinkDescriptor& left, //link exists on both sides + CompareSymlinkResult defaultCmpResult, + const Zstring& shortNameRight, + const LinkDescriptor& right); template - SymLinkMapping& addSubLink(const Zstring& shortName, //link exists on one side only - const LinkDescriptor& descr); + SymlinkPair& addSubLink(const Zstring& shortName, //link exists on one side only + const LinkDescriptor& descr); const SubFileVec& refSubFiles() const { return subFiles; } /**/ SubFileVec& refSubFiles() { return subFiles; } @@ -174,15 +195,15 @@ public: const SubDirVec& refSubDirs() const { return subDirs; } /**/ SubDirVec& refSubDirs() { return subDirs; } - BaseDirMapping& getRoot() { return root_; } + BaseDirPair& getRoot() { return root_; } const Zstring& getObjRelativeNamePf() const { return objRelNamePf; } //postfixed or empty! protected: HierarchyObject(const Zstring& relativeNamePf, - BaseDirMapping& baseMap) : + BaseDirPair& baseDirObj) : objRelNamePf(relativeNamePf), - root_(baseMap) {} + root_(baseDirObj) {} ~HierarchyObject() {} //don't need polymorphic deletion @@ -201,21 +222,21 @@ private: SubDirVec subDirs; //contained directory maps Zstring objRelNamePf; //postfixed or empty - BaseDirMapping& root_; + BaseDirPair& root_; }; //------------------------------------------------------------------ -class BaseDirMapping : public HierarchyObject //synchronization base directory +class BaseDirPair : public HierarchyObject //synchronization base directory { public: - BaseDirMapping(const Zstring& dirPostfixedLeft, - bool dirExistsLeft, - const Zstring& dirPostfixedRight, - bool dirExistsRight, - const HardFilter::FilterRef& filter, - CompareVariant cmpVar, - size_t fileTimeTolerance) : + BaseDirPair(const Zstring& dirPostfixedLeft, + bool dirExistsLeft, + const Zstring& dirPostfixedRight, + bool dirExistsRight, + const HardFilter::FilterRef& filter, + CompareVariant cmpVar, + size_t fileTimeTolerance) : #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4355) //"The this pointer is valid only within nonstatic member functions. It cannot be used in the initializer list for a base class." @@ -231,12 +252,12 @@ public: dirExistsRight_(dirExistsRight) {} template const Zstring& getBaseDirPf() const; //base sync directory postfixed with FILE_NAME_SEPARATOR (or empty!) - static void removeEmpty(BaseDirMapping& baseDir) { baseDir.removeEmptyRec(); }; //physically remove all invalid entries (where both sides are empty) recursively + static void removeEmpty(BaseDirPair& baseDir) { baseDir.removeEmptyRec(); }; //physically remove all invalid entries (where both sides are empty) recursively template bool isExisting() const; //status of directory existence at the time of comparison! template void setExisting(bool value); //update after creating the directory in FFS - //get settings which were used while creating BaseDirMapping + //get settings which were used while creating BaseDirPair const HardFilter& getFilter() const { return *filter_; } CompareVariant getCompVariant() const { return cmpVar_; } size_t getFileTimeTolerance() const { return fileTimeTolerance_; } @@ -244,8 +265,8 @@ public: virtual void flip(); private: - BaseDirMapping(const BaseDirMapping&); //this class is referenced by HierarchyObject => make it non-copyable/movable! - BaseDirMapping& operator=(const BaseDirMapping&); // + BaseDirPair(const BaseDirPair&); //this class is referenced by HierarchyObject => make it non-copyable/movable! + BaseDirPair& operator=(const BaseDirPair&); // HardFilter::FilterRef filter_; //filter used while scanning directory: represents sub-view of actual files! CompareVariant cmpVar_; @@ -260,15 +281,15 @@ private: template <> inline -const Zstring& BaseDirMapping::getBaseDirPf() const { return baseDirPfL; } +const Zstring& BaseDirPair::getBaseDirPf() const { return baseDirPfL; } template <> inline -const Zstring& BaseDirMapping::getBaseDirPf() const { return baseDirPfR; } +const Zstring& BaseDirPair::getBaseDirPf() const { return baseDirPfR; } //get rid of shared_ptr indirection -template < class IterTy, //underlying iterator type - class U > //target object type +template //target object type class DerefIter : public std::iterator { public: @@ -288,22 +309,22 @@ private: IterTy iter; }; -typedef std::vector> FolderComparison; //make sure pointers to sub-elements remain valid -//don't change this back to std::vector too easily: comparison uses push_back to add entries which may result in a full copy! +typedef std::vector> FolderComparison; //make sure pointers to sub-elements remain valid +//don't change this back to std::vector too easily: comparison uses push_back to add entries which may result in a full copy! -DerefIter inline begin(FolderComparison& vect) { return vect.begin(); } -DerefIter inline end (FolderComparison& vect) { return vect.end (); } -DerefIter inline begin(const FolderComparison& vect) { return vect.begin(); } -DerefIter inline end (const FolderComparison& vect) { return vect.end (); } +DerefIter inline begin(FolderComparison& vect) { return vect.begin(); } +DerefIter inline end (FolderComparison& vect) { return vect.end (); } +DerefIter inline begin(const FolderComparison& vect) { return vect.begin(); } +DerefIter inline end (const FolderComparison& vect) { return vect.end (); } //------------------------------------------------------------------ class FSObjectVisitor { public: virtual ~FSObjectVisitor() {} - virtual void visit(const FileMapping& fileObj) = 0; - virtual void visit(const SymLinkMapping& linkObj) = 0; - virtual void visit(const DirMapping& dirObj) = 0; + virtual void visit(const FilePair& fileObj) = 0; + virtual void visit(const SymlinkPair& linkObj) = 0; + virtual void visit(const DirPair& dirObj) = 0; }; //inherit from this class to allow safe random access by id instead of unsafe raw pointer @@ -335,6 +356,7 @@ private: static zen::hash_set& activeObjects() { static zen::hash_set inst; return inst; } //external linkage (even in header file!) }; + //------------------------------------------------------------------ class FileSystemObject : public ObjectMgr @@ -354,27 +376,27 @@ public: CompareFilesResult getCategory() const { return cmpResult; } std::wstring getCatExtraDescription() const; //only filled if getCategory() == FILE_CONFLICT or FILE_DIFFERENT_METADATA - //sync operation - virtual SyncOperation testSyncOperation(SyncDirection testSyncDir) const; //semantics: "what if"! assumes "active, no conflict, no recursion (directory)! - virtual SyncOperation getSyncOperation() const; - std::wstring getSyncOpConflict() const; //return conflict when determining sync direction or (still unresolved) conflict during categorization - //sync settings + SyncDirection getSyncDir() const; void setSyncDir(SyncDirection newDir); void setSyncDirConflict(const std::wstring& description); //set syncDir = SYNC_DIR_NONE + fill conflict description - SyncDirection getSyncDir() const { return syncDir; } bool isActive() const; void setActive(bool active); + //sync operation + virtual SyncOperation testSyncOperation(SyncDirection testSyncDir) const; //semantics: "what if"! assumes "active, no conflict, no recursion (directory)! + virtual SyncOperation getSyncOperation() const; + std::wstring getSyncOpConflict() const; //return conflict when determining sync direction or (still unresolved) conflict during categorization + template void removeObject(); //removes file or directory (recursively!) without physically removing the element: used by manual deletion bool isEmpty() const; //true, if both sides are empty const HierarchyObject& parent() const { return parent_; } /**/ HierarchyObject& parent() { return parent_; } - const BaseDirMapping& root() const { return parent_.getRoot(); } - /**/ BaseDirMapping& root() { return parent_.getRoot(); } + const BaseDirPair& root() const { return parent_.getRoot(); } + /**/ BaseDirPair& root() { return parent_.getRoot(); } //for use during init in "CompareProcess" only: template void setCategory(); @@ -388,7 +410,7 @@ protected: CompareFilesResult defaultCmpResult) : cmpResult(defaultCmpResult), selectedForSynchronization(true), - syncDir(SYNC_DIR_NONE), + syncDir_(static_cast(SYNC_DIR_NONE)), shortNameLeft_(shortNameLeft), shortNameRight_(shortNameRight), //shortNameRight_(shortNameRight == shortNameLeft ? shortNameLeft : shortNameRight), -> strangely doesn't seem to shrink peak memory consumption at all! @@ -403,8 +425,7 @@ protected: virtual void flip(); virtual void notifySyncCfgChanged() { parent().notifySyncCfgChanged(); /*propagate!*/ } - void copyToL(); - void copyToR(); + void setSynced(const Zstring& shortName); private: virtual void removeObjectL() = 0; @@ -412,24 +433,25 @@ private: //categorization std::unique_ptr cmpResultDescr; //only filled if getCategory() == FILE_CONFLICT or FILE_DIFFERENT_METADATA - CompareFilesResult cmpResult; + CompareFilesResult cmpResult; //although this uses 4 bytes there is currently *no* space wasted in class layout! bool selectedForSynchronization; - SyncDirection syncDir; + unsigned char syncDir_; //use "char" instead of "SyncDirection" lacking C++11 custom size enum classes to optimize memory layout! std::unique_ptr syncDirConflict; //non-empty if we have a conflict setting sync-direction //get rid of std::wstring small string optimization (consumes 32/48 byte on VS2010 x86/x64!) //Note: we model *four* states with last two variables => "syncDirConflict is empty or syncDir == NONE" is a class invariant!!! - Zstring shortNameLeft_; //slightly redundant under linux, but on windows the "same" filenames can differ in case - Zstring shortNameRight_; //use as indicator: an empty name means: not existing! + Zstring shortNameLeft_; //slightly redundant under linux, but on windows the "same" filenames can differ in case + Zstring shortNameRight_; //use as indicator: an empty name means: not existing! HierarchyObject& parent_; }; //------------------------------------------------------------------ -class DirMapping : public FileSystemObject, public HierarchyObject + +class DirPair : public FileSystemObject, public HierarchyObject { friend class HierarchyObject; @@ -438,10 +460,10 @@ public: CompareDirResult getDirCategory() const; //returns actually used subset of CompareFilesResult - DirMapping(const Zstring& shortNameLeft, //use empty shortname if "not existing" - const Zstring& shortNameRight, // - HierarchyObject& parentObj, - CompareDirResult defaultCmpResult) : + DirPair(const Zstring& shortNameLeft, //use empty shortname if "not existing" + const Zstring& shortNameRight, // + HierarchyObject& parentObj, + CompareDirResult defaultCmpResult) : FileSystemObject(shortNameLeft, shortNameRight, parentObj, static_cast(defaultCmpResult)), HierarchyObject(getObjRelativeName() + FILE_NAME_SEPARATOR, parentObj.getRoot()), syncOpBuffered(SO_DO_NOTHING), @@ -449,41 +471,42 @@ public: virtual SyncOperation getSyncOperation() const; - template void copyTo(); //copy dir + void setSyncedTo(const Zstring& shortName); //call after sync, sets DIR_EQUAL private: virtual void flip(); virtual void removeObjectL(); virtual void removeObjectR(); virtual void notifySyncCfgChanged() { syncOpUpToDate = false; FileSystemObject::notifySyncCfgChanged(); HierarchyObject::notifySyncCfgChanged(); } - //------------------------------------------------------------------ mutable SyncOperation syncOpBuffered; //determining sync-op for directory may be expensive as it depends on child-objects -> buffer it - mutable bool syncOpUpToDate; // + mutable bool syncOpUpToDate; // }; //------------------------------------------------------------------ -class FileMapping : public FileSystemObject + +class FilePair : public FileSystemObject { friend class HierarchyObject; //construction public: virtual void accept(FSObjectVisitor& visitor) const; - FileMapping(const Zstring& shortNameLeft, //use empty string if "not existing" - const FileDescriptor& left, - CompareFilesResult defaultCmpResult, - const Zstring& shortNameRight, // - const FileDescriptor& right, - HierarchyObject& parentObj) : + FilePair(const Zstring& shortNameLeft, //use empty string if "not existing" + const FileDescriptor& left, + CompareFilesResult defaultCmpResult, + const Zstring& shortNameRight, // + const FileDescriptor& right, + HierarchyObject& parentObj) : FileSystemObject(shortNameLeft, shortNameRight, parentObj, defaultCmpResult), dataLeft(left), dataRight(right), moveFileRef(nullptr) {} - template Int64 getLastWriteTime() const; - template UInt64 getFileSize () const; - template FileId getFileId () const; + template Int64 getLastWriteTime () const; + template UInt64 getFileSize () const; + template FileId getFileId () const; + template bool isFollowedSymlink() const; void setMoveRef(ObjectId refId) { moveFileRef = refId; } //reference to corresponding renamed file ObjectId getMoveRef() const { return moveFileRef; } //may be nullptr @@ -493,7 +516,15 @@ public: virtual SyncOperation testSyncOperation(SyncDirection testSyncDir) const; //semantics: "what if"! assumes "active, no conflict, no recursion (directory)! virtual SyncOperation getSyncOperation() const; - template void syncTo(const FileDescriptor& descrTarget, const FileDescriptor* descrSource = nullptr); //copy + update file attributes (optional) + template + void setSyncedTo(const Zstring& shortName, //call after sync, sets FILE_EQUAL + const UInt64& fileSize, + const Int64& lastWriteTimeTrg, + const Int64& lastWriteTimeSrc, + const FileId& fileIdTrg, + const FileId& fileIdSrc, + bool isSymlinkTrg, + bool isSymlinkSrc); private: SyncOperation applyMoveOptimization(SyncOperation op) const; @@ -501,7 +532,6 @@ private: virtual void flip(); virtual void removeObjectL(); virtual void removeObjectR(); - //------------------------------------------------------------------ FileDescriptor dataLeft; FileDescriptor dataRight; @@ -510,7 +540,8 @@ private: }; //------------------------------------------------------------------ -class SymLinkMapping : public FileSystemObject //this class models a TRUE symbolic link, i.e. one that is NEVER dereferenced: deref-links should be directly placed in class File/DirMapping + +class SymlinkPair : public FileSystemObject //this class models a TRUE symbolic link, i.e. one that is NEVER dereferenced: deref-links should be directly placed in class File/DirPair { friend class HierarchyObject; //construction @@ -521,23 +552,25 @@ public: CompareSymlinkResult getLinkCategory() const; //returns actually used subset of CompareFilesResult - SymLinkMapping(const Zstring& shortNameLeft, //use empty string if "not existing" - const LinkDescriptor& left, - CompareSymlinkResult defaultCmpResult, - const Zstring& shortNameRight, //use empty string if "not existing" - const LinkDescriptor& right, - HierarchyObject& parentObj) : + SymlinkPair(const Zstring& shortNameLeft, //use empty string if "not existing" + const LinkDescriptor& left, + CompareSymlinkResult defaultCmpResult, + const Zstring& shortNameRight, //use empty string if "not existing" + const LinkDescriptor& right, + HierarchyObject& parentObj) : FileSystemObject(shortNameLeft, shortNameRight, parentObj, static_cast(defaultCmpResult)), dataLeft(left), dataRight(right) {} - template void copyTo(); //copy + template + void setSyncedTo(const Zstring& shortName, //call after sync, sets SYMLINK_EQUAL + const Int64& lastWriteTimeTrg, + const Int64& lastWriteTimeSrc); private: virtual void flip(); virtual void removeObjectL(); virtual void removeObjectR(); - //------------------------------------------------------------------ LinkDescriptor dataLeft; LinkDescriptor dataRight; @@ -566,15 +599,6 @@ std::wstring getSyncOpDescription (const FileSystemObject& fsObj); - - - - - - - - - @@ -586,63 +610,55 @@ std::wstring getSyncOpDescription (const FileSystemObject& fsObj); //---------------Inline Implementation--------------------------------------------------- -inline //inline virtual... admittedly its use may be limited -void FileMapping::accept(FSObjectVisitor& visitor) const -{ - visitor.visit(*this); -} +//inline virtual... admittedly its use may be limited +inline void FilePair ::accept(FSObjectVisitor& visitor) const { visitor.visit(*this); } +inline void DirPair ::accept(FSObjectVisitor& visitor) const { visitor.visit(*this); } +inline void SymlinkPair::accept(FSObjectVisitor& visitor) const { visitor.visit(*this); } inline -void DirMapping::accept(FSObjectVisitor& visitor) const +CompareFilesResult FilePair::getFileCategory() const { - visitor.visit(*this); + return getCategory(); } inline -void SymLinkMapping::accept(FSObjectVisitor& visitor) const +CompareDirResult DirPair::getDirCategory() const { - visitor.visit(*this); + return static_cast(getCategory()); } inline -CompareFilesResult FileMapping::getFileCategory() const +std::wstring FileSystemObject::getCatExtraDescription() const { - return getCategory(); + assert(getCategory() == FILE_CONFLICT || getCategory() == FILE_DIFFERENT_METADATA); + return cmpResultDescr ? *cmpResultDescr : std::wstring(); } inline -CompareDirResult DirMapping::getDirCategory() const +SyncDirection FileSystemObject::getSyncDir() const { - return static_cast(getCategory()); + return static_cast(syncDir_); } inline void FileSystemObject::setSyncDir(SyncDirection newDir) { - syncDir = newDir; //should be safe by design + syncDir_ = static_cast(newDir); syncDirConflict.reset(); notifySyncCfgChanged(); } -inline -std::wstring FileSystemObject::getCatExtraDescription() const -{ - assert(getCategory() == FILE_CONFLICT || getCategory() == FILE_DIFFERENT_METADATA); - return cmpResultDescr ? *cmpResultDescr : std::wstring(); -} - - inline void FileSystemObject::setSyncDirConflict(const std::wstring& description) { - syncDir = SYNC_DIR_NONE; + syncDir_ = static_cast(SYNC_DIR_NONE); syncDirConflict.reset(new std::wstring(description)); notifySyncCfgChanged(); @@ -668,22 +684,14 @@ inline void FileSystemObject::setActive(bool active) { selectedForSynchronization = active; - notifySyncCfgChanged(); } -template <> inline -bool FileSystemObject::isEmpty() const -{ - return shortNameLeft_.empty(); -} - - -template <> inline -bool FileSystemObject::isEmpty() const +template inline +bool FileSystemObject::isEmpty() const { - return shortNameRight_.empty(); + return SelectParam::get(shortNameLeft_, shortNameRight_).empty(); } @@ -694,17 +702,10 @@ bool FileSystemObject::isEmpty() const } -template <> inline -const Zstring& FileSystemObject::getShortName() const -{ - return shortNameLeft_; //empty if not existing -} - - -template <> inline -const Zstring& FileSystemObject::getShortName() const +template inline +const Zstring& FileSystemObject::getShortName() const { - return shortNameRight_; //empty if not existing + return SelectParam::get(shortNameLeft_, shortNameRight_); //empty if not existing } @@ -736,17 +737,10 @@ Zstring FileSystemObject::getFullName() const } -template <> inline -const Zstring& FileSystemObject::getBaseDirPf() const -{ - return root().getBaseDirPf(); -} - - -template <> inline -const Zstring& FileSystemObject::getBaseDirPf() const +template inline +const Zstring& FileSystemObject::getBaseDirPf() const { - return root().getBaseDirPf(); + return root().getBaseDirPf(); } @@ -773,20 +767,10 @@ void FileSystemObject::removeObject() inline -void FileSystemObject::copyToL() +void FileSystemObject::setSynced(const Zstring& shortName) { assert(!isEmpty()); - shortNameLeft_ = shortNameRight_; - cmpResult = FILE_EQUAL; - setSyncDir(SYNC_DIR_NONE); -} - - -inline -void FileSystemObject::copyToR() -{ - assert(!isEmpty()); - shortNameRight_ = shortNameLeft_; + shortNameRight_ = shortNameLeft_ = shortName; cmpResult = FILE_EQUAL; setSyncDir(SYNC_DIR_NONE); } @@ -849,16 +833,16 @@ void FileSystemObject::flip() inline void HierarchyObject::flip() { - std::for_each(refSubFiles().begin(), refSubFiles().end(), std::mem_fun_ref(&FileMapping ::flip)); - std::for_each(refSubDirs ().begin(), refSubDirs ().end(), std::mem_fun_ref(&DirMapping ::flip)); - std::for_each(refSubLinks().begin(), refSubLinks().end(), std::mem_fun_ref(&SymLinkMapping::flip)); + std::for_each(refSubFiles().begin(), refSubFiles().end(), std::mem_fun_ref(&FilePair ::flip)); + std::for_each(refSubDirs ().begin(), refSubDirs ().end(), std::mem_fun_ref(&DirPair ::flip)); + std::for_each(refSubLinks().begin(), refSubLinks().end(), std::mem_fun_ref(&SymlinkPair::flip)); } inline -DirMapping& HierarchyObject::addSubDir(const Zstring& shortNameLeft, - const Zstring& shortNameRight, - CompareDirResult defaultCmpResult) +DirPair& HierarchyObject::addSubDir(const Zstring& shortNameLeft, + const Zstring& shortNameRight, + CompareDirResult defaultCmpResult) { subDirs.emplace_back(shortNameLeft, shortNameRight, *this, defaultCmpResult); return subDirs.back(); @@ -866,7 +850,7 @@ DirMapping& HierarchyObject::addSubDir(const Zstring& shortNameLeft, template <> inline -DirMapping& HierarchyObject::addSubDir(const Zstring& shortName) +DirPair& HierarchyObject::addSubDir(const Zstring& shortName) { subDirs.emplace_back(shortName, Zstring(), *this, DIR_LEFT_SIDE_ONLY); return subDirs.back(); @@ -874,7 +858,7 @@ DirMapping& HierarchyObject::addSubDir(const Zstring& shortName) template <> inline -DirMapping& HierarchyObject::addSubDir(const Zstring& shortName) +DirPair& HierarchyObject::addSubDir(const Zstring& shortName) { subDirs.emplace_back(Zstring(), shortName, *this, DIR_RIGHT_SIDE_ONLY); return subDirs.back(); @@ -882,12 +866,11 @@ DirMapping& HierarchyObject::addSubDir(const Zstring& shortName) inline -FileMapping& HierarchyObject::addSubFile( - const Zstring& shortNameLeft, - const FileDescriptor& left, //file exists on both sides - CompareFilesResult defaultCmpResult, - const Zstring& shortNameRight, - const FileDescriptor& right) +FilePair& HierarchyObject::addSubFile(const Zstring& shortNameLeft, + const FileDescriptor& left, //file exists on both sides + CompareFilesResult defaultCmpResult, + const Zstring& shortNameRight, + const FileDescriptor& right) { subFiles.emplace_back(shortNameLeft, left, defaultCmpResult, shortNameRight, right, *this); return subFiles.back(); @@ -895,7 +878,7 @@ FileMapping& HierarchyObject::addSubFile( template <> inline -FileMapping& HierarchyObject::addSubFile(const Zstring& shortName, const FileDescriptor& descr) +FilePair& HierarchyObject::addSubFile(const Zstring& shortName, const FileDescriptor& descr) { subFiles.emplace_back(shortName, descr, FILE_LEFT_SIDE_ONLY, Zstring(), FileDescriptor(), *this); return subFiles.back(); @@ -903,7 +886,7 @@ FileMapping& HierarchyObject::addSubFile(const Zstring& shortName, co template <> inline -FileMapping& HierarchyObject::addSubFile(const Zstring& shortName, const FileDescriptor& descr) +FilePair& HierarchyObject::addSubFile(const Zstring& shortName, const FileDescriptor& descr) { subFiles.emplace_back(Zstring(), FileDescriptor(), FILE_RIGHT_SIDE_ONLY, shortName, descr, *this); return subFiles.back(); @@ -911,7 +894,7 @@ FileMapping& HierarchyObject::addSubFile(const Zstring& shortName, c inline -SymLinkMapping& HierarchyObject::addSubLink( +SymlinkPair& HierarchyObject::addSubLink( const Zstring& shortNameLeft, const LinkDescriptor& left, //link exists on both sides CompareSymlinkResult defaultCmpResult, @@ -924,7 +907,7 @@ SymLinkMapping& HierarchyObject::addSubLink( template <> inline -SymLinkMapping& HierarchyObject::addSubLink(const Zstring& shortName, const LinkDescriptor& descr) +SymlinkPair& HierarchyObject::addSubLink(const Zstring& shortName, const LinkDescriptor& descr) { subLinks.emplace_back(shortName, descr, SYMLINK_LEFT_SIDE_ONLY, Zstring(), LinkDescriptor(), *this); return subLinks.back(); @@ -932,7 +915,7 @@ SymLinkMapping& HierarchyObject::addSubLink(const Zstring& shortName, template <> inline -SymLinkMapping& HierarchyObject::addSubLink(const Zstring& shortName, const LinkDescriptor& descr) +SymlinkPair& HierarchyObject::addSubLink(const Zstring& shortName, const LinkDescriptor& descr) { subLinks.emplace_back(Zstring(), LinkDescriptor(), SYMLINK_RIGHT_SIDE_ONLY, shortName, descr, *this); return subLinks.back(); @@ -940,7 +923,7 @@ SymLinkMapping& HierarchyObject::addSubLink(const Zstring& shortName inline -void BaseDirMapping::flip() +void BaseDirPair::flip() { HierarchyObject::flip(); std::swap(baseDirPfL, baseDirPfR); @@ -949,7 +932,7 @@ void BaseDirMapping::flip() inline -void DirMapping::flip() +void DirPair::flip() { HierarchyObject ::flip(); //call base class versions FileSystemObject::flip(); // @@ -957,7 +940,7 @@ void DirMapping::flip() inline -void DirMapping::removeObjectL() +void DirPair::removeObjectL() { std::for_each(refSubFiles().begin(), refSubFiles().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); std::for_each(refSubLinks().begin(), refSubLinks().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); @@ -966,7 +949,7 @@ void DirMapping::removeObjectL() inline -void DirMapping::removeObjectR() +void DirPair::removeObjectR() { std::for_each(refSubFiles().begin(), refSubFiles().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); std::for_each(refSubLinks().begin(), refSubLinks().end(), std::mem_fun_ref(&FileSystemObject::removeObject)); @@ -974,33 +957,22 @@ void DirMapping::removeObjectR() } -template <> inline -bool BaseDirMapping::isExisting() const -{ - return dirExistsLeft_; -} - -template <> inline -bool BaseDirMapping::isExisting() const +template inline +bool BaseDirPair::isExisting() const { - return dirExistsRight_; + return SelectParam::get(dirExistsLeft_, dirExistsRight_); } -template <> inline -void BaseDirMapping::setExisting(bool value) -{ - dirExistsLeft_ = value; -} -template <> inline -void BaseDirMapping::setExisting(bool value) +template inline +void BaseDirPair::setExisting(bool value) { - dirExistsRight_ = value; + SelectParam::get(dirExistsLeft_, dirExistsRight_) = value; } inline -void FileMapping::flip() +void FilePair::flip() { FileSystemObject::flip(); //call base class version std::swap(dataLeft, dataRight); @@ -1008,138 +980,106 @@ void FileMapping::flip() inline -void FileMapping::removeObjectL() +void FilePair::removeObjectL() { - dataLeft = FileDescriptor(); + dataLeft = FileDescriptor(); } inline -void FileMapping::removeObjectR() +void FilePair::removeObjectR() { dataRight = FileDescriptor(); } -template <> inline -zen::Int64 FileMapping::getLastWriteTime() const -{ - return dataLeft.lastWriteTimeRaw; -} - - -template <> inline -zen::Int64 FileMapping::getLastWriteTime() const -{ - return dataRight.lastWriteTimeRaw; -} - - -template <> inline -zen::UInt64 FileMapping::getFileSize() const +template inline +zen::Int64 FilePair::getLastWriteTime() const { - return dataLeft.fileSize; + return SelectParam::get(dataLeft, dataRight).lastWriteTimeRaw; } -template <> inline -zen::UInt64 FileMapping::getFileSize() const +template inline +zen::UInt64 FilePair::getFileSize() const { - return dataRight.fileSize; + return SelectParam::get(dataLeft, dataRight).fileSize; } -template <> inline -FileId FileMapping::getFileId() const +template inline +FileId FilePair::getFileId() const { - return FileId(dataLeft.devId, dataLeft.fileIdx); + return FileId(SelectParam::get(dataLeft, dataRight).devId, + SelectParam::get(dataLeft, dataRight).fileIdx); } -template <> inline -FileId FileMapping::getFileId() const +template inline +bool FilePair::isFollowedSymlink() const { - return FileId(dataRight.devId, dataRight.fileIdx); + return SelectParam::get(dataLeft, dataRight).isFollowedSymlink; } -template <> inline -void FileMapping::syncTo(const FileDescriptor& descrTarget, const FileDescriptor* descrSource) //copy + update file attributes +template inline +void FilePair::setSyncedTo(const Zstring& shortName, + const UInt64& fileSize, + const Int64& lastWriteTimeTrg, + const Int64& lastWriteTimeSrc, + const FileId& fileIdTrg, + const FileId& fileIdSrc, + bool isSymlinkTrg, + bool isSymlinkSrc) { - dataLeft = descrTarget; - if (descrSource) - dataRight = *descrSource; + //FILE_EQUAL is only allowed for same short name and file size: enforced by this method! + static const SelectedSide sideSrc = OtherSide::result; - moveFileRef = nullptr; - copyToL(); //copy FileSystemObject specific part -} - - -template <> inline -void FileMapping::syncTo(const FileDescriptor& descrTarget, const FileDescriptor* descrSource) //copy + update file attributes -{ - dataRight = descrTarget; - if (descrSource) - dataLeft = *descrSource; + SelectParam::get(dataLeft, dataRight) = FileDescriptor(lastWriteTimeTrg, fileSize, fileIdTrg, isSymlinkTrg); + SelectParam::get(dataLeft, dataRight) = FileDescriptor(lastWriteTimeSrc, fileSize, fileIdSrc, isSymlinkSrc); moveFileRef = nullptr; - copyToR(); //copy FileSystemObject specific part + FileSystemObject::setSynced(shortName); //set FileSystemObject specific part } -template <> inline -void SymLinkMapping::copyTo() //copy + update link attributes -{ - dataLeft = dataRight; - copyToL(); //copy FileSystemObject specific part -} - - -template <> inline -void SymLinkMapping::copyTo() //copy + update link attributes -{ - dataRight = dataLeft; - copyToR(); //copy FileSystemObject specific part -} - - -template <> inline -void DirMapping::copyTo() +template inline +void SymlinkPair::setSyncedTo(const Zstring& shortName, + const Int64& lastWriteTimeTrg, + const Int64& lastWriteTimeSrc) { - copyToL(); //copy FileSystemObject specific part -} + static const SelectedSide sideSrc = OtherSide::result; + SelectParam::get(dataLeft, dataRight) = LinkDescriptor(lastWriteTimeTrg); + SelectParam::get(dataLeft, dataRight) = LinkDescriptor(lastWriteTimeSrc); -template <> inline -void DirMapping::copyTo() -{ - copyToR(); //copy FileSystemObject specific part + FileSystemObject::setSynced(shortName); //set FileSystemObject specific part } -template <> inline -zen::Int64 SymLinkMapping::getLastWriteTime() const +inline +void DirPair::setSyncedTo(const Zstring& shortName) { - return dataLeft.lastWriteTimeRaw; + FileSystemObject::setSynced(shortName); //set FileSystemObject specific part } -template <> inline -zen::Int64 SymLinkMapping::getLastWriteTime() const +template inline +zen::Int64 SymlinkPair::getLastWriteTime() const { - return dataRight.lastWriteTimeRaw; + return SelectParam::get(dataLeft, dataRight).lastWriteTimeRaw; } inline -CompareSymlinkResult SymLinkMapping::getLinkCategory() const +CompareSymlinkResult SymlinkPair::getLinkCategory() const { return static_cast(getCategory()); } inline -void SymLinkMapping::flip() +void SymlinkPair::flip() { FileSystemObject::flip(); //call base class versions std::swap(dataLeft, dataRight); @@ -1147,14 +1087,14 @@ void SymLinkMapping::flip() inline -void SymLinkMapping::removeObjectL() +void SymlinkPair::removeObjectL() { - dataLeft = LinkDescriptor(); + dataLeft = LinkDescriptor(); } inline -void SymLinkMapping::removeObjectR() +void SymlinkPair::removeObjectR() { dataRight = LinkDescriptor(); } diff --git a/lib/ShadowCopy/Shadow_Server2003.vcxproj b/lib/ShadowCopy/Shadow_Server2003.vcxproj index 4622c246..520a4d6d 100644 --- a/lib/ShadowCopy/Shadow_Server2003.vcxproj +++ b/lib/ShadowCopy/Shadow_Server2003.vcxproj @@ -68,10 +68,8 @@ <_ProjectFileVersion>10.0.30319.1 OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ false diff --git a/lib/ShadowCopy/Shadow_Windows7.vcxproj b/lib/ShadowCopy/Shadow_Windows7.vcxproj index c735371b..1fe769d0 100644 --- a/lib/ShadowCopy/Shadow_Windows7.vcxproj +++ b/lib/ShadowCopy/Shadow_Windows7.vcxproj @@ -68,10 +68,8 @@ <_ProjectFileVersion>10.0.30319.1 OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ false diff --git a/lib/ShadowCopy/Shadow_XP.vcxproj b/lib/ShadowCopy/Shadow_XP.vcxproj index a5d07786..0d231f3d 100644 --- a/lib/ShadowCopy/Shadow_XP.vcxproj +++ b/lib/ShadowCopy/Shadow_XP.vcxproj @@ -67,10 +67,8 @@ <_ProjectFileVersion>10.0.30319.1 OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ false diff --git a/lib/ShadowCopy/shadow.cpp b/lib/ShadowCopy/shadow.cpp index 4f6881ad..e915663f 100644 --- a/lib/ShadowCopy/shadow.cpp +++ b/lib/ShadowCopy/shadow.cpp @@ -75,7 +75,7 @@ std::wstring formatVssError(HRESULT hr) //at least the one's from IVssBackupComp } -shadow::ShadowData createShadowCopy(const wchar_t* volumeName) //throw ComError +shadow::ShadowData createShadowCopy(const wchar_t* volumeName) //throw SysError { ComPtr backupComp; { @@ -83,13 +83,13 @@ shadow::ShadowData createShadowCopy(const wchar_t* volumeName) //throw ComError if (FAILED(hr)) { if (hr == E_ACCESSDENIED) - throw ComError(L"The caller does not have sufficient backup privileges or is not an administrator.", hr); - throw ComError(L"Error calling \"CreateVssBackupComponents\".", hr); + throw SysError(formatComError(L"The caller does not have sufficient backup privileges or is not an administrator.", hr)); + throw SysError(formatComError(L"Error calling \"CreateVssBackupComponents\".", hr)); } } - ZEN_COM_CHECK(backupComp->InitializeForBackup()); //throw ComError - ZEN_COM_CHECK(backupComp->SetBackupState(false, false, VSS_BT_FULL)); //throw ComError + ZEN_COM_CHECK(backupComp->InitializeForBackup()); //throw SysError + ZEN_COM_CHECK(backupComp->SetBackupState(false, false, VSS_BT_FULL)); //throw SysError auto waitForComFuture = [](IVssAsync& fut) { @@ -98,7 +98,7 @@ shadow::ShadowData createShadowCopy(const wchar_t* volumeName) //throw ComError HRESULT hr = S_OK; ZEN_COM_CHECK(fut.QueryStatus(&hr, nullptr)); //check if the async operation succeeded... if (FAILED(hr)) - throw ComError(L"Error calling \"fut->QueryStatus\".", hr); + throw SysError(formatComError(L"Error calling \"fut->QueryStatus\".", hr)); }; ComPtr gatherAsync; @@ -117,12 +117,12 @@ shadow::ShadowData createShadowCopy(const wchar_t* volumeName) //throw ComError if (FAILED(hr)) { if (hr == VSS_E_VOLUME_NOT_SUPPORTED) - throw ComError(L"Volume Shadow Copy Service is not supported on this volume!"); + throw SysError(L"Volume Shadow Copy Service is not supported on this volume!"); const std::wstring vssError = formatVssError(hr); if (!vssError.empty()) - throw ComError(L"Error calling \"backupComp->AddToSnapshotSet\": " + vssError); + throw SysError(L"Error calling \"backupComp->AddToSnapshotSet\": " + vssError); else - throw ComError(L"Error calling \"backupComp->AddToSnapshotSet\".", hr); + throw SysError(formatComError(L"Error calling \"backupComp->AddToSnapshotSet\".", hr)); } } @@ -151,10 +151,10 @@ shadow::ShadowHandle shadow::createShadowCopy(const wchar_t* volumeName) { try { - ShadowData result = ::createShadowCopy(volumeName); //throw ComError + ShadowData result = ::createShadowCopy(volumeName); //throw SysError return new ShadowData(result); //shadow handle owned by caller! std::bad_alloc? } - catch (const zen::ComError& e) + catch (const zen::SysError& e) { lastErrorMessage.reset(new std::wstring(e.toString())); return nullptr; diff --git a/lib/Thumbnail/Thumbnail.vcxproj b/lib/Thumbnail/Thumbnail.vcxproj index 2045f10e..87fb152b 100644 --- a/lib/Thumbnail/Thumbnail.vcxproj +++ b/lib/Thumbnail/Thumbnail.vcxproj @@ -66,10 +66,8 @@ <_ProjectFileVersion>10.0.30319.1 .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ false @@ -87,7 +85,7 @@ Disabled - FFS_WIN;FFS_WIN;_DEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions) + ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;_DEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -122,7 +120,7 @@ Disabled - FFS_WIN;_DEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions) + ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -155,7 +153,7 @@ MaxSpeed true - FFS_WIN;FFS_WIN;NDEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions) + ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true @@ -192,7 +190,7 @@ MaxSpeed true - FFS_WIN;NDEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions) + ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;THUMBNAIL_DLL_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true diff --git a/lib/Thumbnail/thumbnail.cpp b/lib/Thumbnail/thumbnail.cpp index b00ce81d..53c30bc3 100644 --- a/lib/Thumbnail/thumbnail.cpp +++ b/lib/Thumbnail/thumbnail.cpp @@ -11,6 +11,7 @@ #define WIN32_LEAN_AND_MEAN #include #include +#include #define STRICT_TYPED_ITEMIDS //better type safety for IDLists #include @@ -30,9 +31,9 @@ using namespace zen; namespace { -thumb::ImageData* allocImageData(int width, int height) //throw ComError; return value always bound! +thumb::ImageData* allocImageData(int width, int height) //throw SysError; return value always bound! { - ZEN_COM_ASSERT(width >= 0 && height >= 0); //throw ComError + ZEN_COM_ASSERT(width >= 0 && height >= 0); //throw SysError std::unique_ptr idata = make_unique(); @@ -55,7 +56,7 @@ void releaseImageData_impl(const thumb::ImageData* id) //caller takes ownership! -HICON createIconFromBitmap(HBITMAP bitmap) //throw ComError +HICON createIconFromBitmap(HBITMAP bitmap) //throw SysError { BITMAP bmpInfo = {}; ZEN_COM_ASSERT(::GetObject(bitmap, //__in HGDIOBJ hgdiobj, @@ -77,13 +78,13 @@ HICON createIconFromBitmap(HBITMAP bitmap) //throw ComError iconInfo.hbmMask = bitmapMask; HICON result = ::CreateIconIndirect(&iconInfo); - if (!result) throw ComError(L"Error calling \"CreateIconIndirect\".", GetLastError()); + if (!result) throw SysError(formatSystemError(L"CreateIconIndirect", getLastError())); return result; } //caller takes ownership! -thumb::ImageData* convertToImageData(HBITMAP bmp) //throw ComError +thumb::ImageData* convertToImageData(HBITMAP bmp) //throw SysError { //GetDIBits ???? @@ -145,13 +146,13 @@ thumb::ImageData* convertToImageData(HBITMAP bmp) //throw ComError 0, //_In_ int nXSrc, 0, //_In_ int nYSrc, SRCCOPY)) //_In_ DWORD dwRop - throw ComError(L"Error calling \"BitBlt\".", GetLastError()); + throw SysError(formatSystemError(L"BitBlt", getLastError())); //CreateDIBSection: "Access to the bitmap must be synchronized. [...]. This applies to any use of the pointer to the bitmap bit values." /*bool rv = */ ::GdiFlush(); - thumb::ImageData* imgOut = allocImageData(bmpInfo.bmWidth, bmpInfo.bmHeight); //throw ComError + thumb::ImageData* imgOut = allocImageData(bmpInfo.bmWidth, bmpInfo.bmHeight); //throw SysError ScopeGuard guardImgData = zen::makeGuard([&] { releaseImageData_impl(imgOut); }); unsigned char* rgbPtr = imgOut->rgb; @@ -176,13 +177,13 @@ thumb::ImageData* convertToImageData(HBITMAP bmp) //throw ComError //caller takes ownership! -const thumb::ImageData* getThumbnail_impl(const wchar_t* filename, int requestedSize) //throw ComError +const thumb::ImageData* getThumbnail_impl(const wchar_t* filename, int requestedSize) //throw SysError { const std::wstring filenameStr(filename); ComPtr desktopFolder; - ZEN_COM_CHECK(::SHGetDesktopFolder(desktopFolder.init())); //throw ComError - ZEN_COM_ASSERT(desktopFolder); //throw ComError -> better safe than sorry? + ZEN_COM_CHECK(::SHGetDesktopFolder(desktopFolder.init())); //throw SysError + ZEN_COM_ASSERT(desktopFolder); //throw SysError -> better safe than sorry? PIDLIST_RELATIVE pidlFolder = nullptr; { @@ -246,14 +247,14 @@ const thumb::ImageData* getThumbnail_impl(const wchar_t* filename, int requested ZEN_COM_ASSERT(bitmap); ZEN_ON_SCOPE_EXIT(::DeleteObject(bitmap)); - return convertToImageData(bitmap); //throw ComError, pass ownership + return convertToImageData(bitmap); //throw SysError, pass ownership } const bool wereVistaOrLater = vistaOrLater(); //thread-safety: init at startup //caller takes ownership! -const thumb::ImageData* getIconByIndex_impl(int iconIndex, thumb::IconSizeType st) //throw ComError +const thumb::ImageData* getIconByIndex_impl(int iconIndex, thumb::IconSizeType st) //throw SysError { //Note: //- using IExtractIcon::Extract is *no* alternative, just as ::SHGetFileInfo(), it only supports small (16x16) and large (32x32) icons @@ -413,7 +414,7 @@ const thumb::ImageData* getIconByIndex_impl(int iconIndex, thumb::IconSizeType s /*bool rv = */ ::GdiFlush(); - ImageData* imgOut = allocImageData(targetWidth, targetHeight); //throw ComError + ImageData* imgOut = allocImageData(targetWidth, targetHeight); //throw SysError ScopeGuard guardImgData = zen::makeGuard([&] { releaseImageData_impl(imgOut); }); unsigned char* rgbPtr = imgOut->rgb; @@ -457,9 +458,9 @@ const thumb::ImageData* thumb::getThumbnail(const wchar_t* filename, int request { try { - return getThumbnail_impl(filename, requestedSize); //throw ComError + return getThumbnail_impl(filename, requestedSize); //throw SysError } - catch (const ComError&) + catch (const SysError&) { return nullptr; } @@ -470,9 +471,9 @@ const thumb::ImageData* thumb::getIconByIndex(int iconIndex, thumb::IconSizeType { try { - return getIconByIndex_impl(iconIndex, st); //throw ComError + return getIconByIndex_impl(iconIndex, st); //throw SysError } - catch (const ComError&) + catch (const SysError&) { return nullptr; } diff --git a/lib/binary.cpp b/lib/binary.cpp index 4ef30c15..0e41f7a6 100644 --- a/lib/binary.cpp +++ b/lib/binary.cpp @@ -95,7 +95,7 @@ bool zen::filesHaveSameContent(const Zstring& filename1, const Zstring& filename const TickVal startTime = getTicks(); - const size_t length1 = file1.read(&memory1[0], bufferSize); //throw FileError() + const size_t length1 = file1.read(&memory1[0], bufferSize); //throw FileError const size_t length2 = file2.read(&memory2[0], bufferSize); //returns actual number of bytes read //send progress updates immediately after reading to reliably allow speed calculations for our clients! callback.updateCompareStatus(to(std::max(length1, length2))); diff --git a/lib/db_file.cpp b/lib/db_file.cpp index e4e3d748..2f699e3a 100644 --- a/lib/db_file.cpp +++ b/lib/db_file.cpp @@ -12,7 +12,7 @@ #include #include -#ifdef FFS_WIN +#ifdef ZEN_WIN #include //includes "windows.h" #include #endif @@ -25,6 +25,11 @@ namespace //------------------------------------------------------------------------------------------------------------------------------- const char FILE_FORMAT_DESCR[] = "FreeFileSync"; const int DB_FILE_FORMAT_VER = 9; + +warn_static("wee need two version ids!") +//const int DB_FILE_FORMAT_CONTAINER = 10; +//const int DB_FILE_FORMAT_STREAM = 1; + //------------------------------------------------------------------------------------------------------------------------------- typedef std::string UniqueId; @@ -34,22 +39,21 @@ typedef std::map StreamMapping; //list of streams ordere //| ensure 32/64 bit portability: use fixed size data types only e.g. std::uint32_t | //----------------------------------------------------------------------------------- - template inline -Zstring getDBFilename(const BaseDirMapping& baseMap, bool tempfile = false) +Zstring getDBFilename(const BaseDirPair& baseDirObj, bool tempfile = false) { //Linux and Windows builds are binary incompatible: different file id?, problem with case sensitivity? are UTC file times really compatible? //what about endianess!? //however 32 and 64 bit db files *are* designed to be binary compatible! //Give db files different names. //make sure they end with ".ffs_db". These files will be excluded from comparison -#ifdef FFS_WIN +#ifdef ZEN_WIN Zstring dbname = Zstring(Zstr("sync")) + (tempfile ? Zstr(".tmp") : Zstr("")) + SYNC_DB_FILE_ENDING; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC //files beginning with dots are hidden e.g. in Nautilus Zstring dbname = Zstring(Zstr(".sync")) + (tempfile ? Zstr(".tmp") : Zstr("")) + SYNC_DB_FILE_ENDING; #endif - return baseMap.getBaseDirPf() + dbname; + return baseDirObj.getBaseDirPf() + dbname; } //####################################################################################################################################### @@ -76,7 +80,7 @@ void saveStreams(const StreamMapping& streamList, const Zstring& filename) //thr assert(!somethingExists(filename)); //orphan tmp files should be cleaned up already at this point! saveBinStream(filename, streamOut.get()); //throw FileError -#ifdef FFS_WIN +#ifdef ZEN_WIN //be careful to avoid CreateFile() + CREATE_ALWAYS on a hidden file -> see file_io.cpp ::SetFileAttributes(applyLongPathPrefix(filename).c_str(), FILE_ATTRIBUTE_HIDDEN); //(try to) hide database file #endif @@ -125,8 +129,8 @@ StreamMapping loadStreams(const Zstring& filename) //throw FileError, FileErrorD } catch (const std::bad_alloc& e) //still required? { - throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(filename) + L"\n\n" + - _("Out of memory!") + L" " + utfCvrtTo(e.what())); + throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(filename), + _("Out of memory.") + L" " + utfCvrtTo(e.what())); } } @@ -167,7 +171,7 @@ public: } catch (ZlibInternalError&) { - throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filename)) + L" (zlib error)"); + throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filename)), L"zlib internal error"); } }; @@ -201,31 +205,31 @@ public: private: void recurse(const InSyncDir& container) { - // for (const auto& filePair : container.files) { processFile(filePair); }); ! + // for (const auto& dbFile : container.files) { processFile(dbFile); }); ! writeNumber(outputBoth, static_cast(container.files.size())); - std::for_each(container.files.begin(), container.files.end(), [&](const std::pair& filePair) { this->process(filePair); }); + std::for_each(container.files.begin(), container.files.end(), [&](const std::pair& dbFile) { this->process(dbFile); }); writeNumber(outputBoth, static_cast(container.symlinks.size())); - std::for_each(container.symlinks.begin(), container.symlinks.end(), [&](const std::pair& symlinkPair) { this->process(symlinkPair); }); + std::for_each(container.symlinks.begin(), container.symlinks.end(), [&](const std::pair& dbSymlink) { this->process(dbSymlink); }); writeNumber(outputBoth, static_cast(container.dirs.size())); - std::for_each(container.dirs.begin(), container.dirs.end(), [&](const std::pair& dirPair) { this->process(dirPair); }); + std::for_each(container.dirs.begin(), container.dirs.end(), [&](const std::pair& dbDir) { this->process(dbDir); }); } static void writeUtf8(BinStreamOut& output, const Zstring& str) { writeContainer(output, utfCvrtTo>(str)); } - static void write(BinStreamOut& output, const FileDescriptor& descr) + static void writeFile(BinStreamOut& output, const InSyncDescrFile& descr, const UInt64& fileSize) { writeNumber(output, to(descr.lastWriteTimeRaw)); - writeNumber(output, to(descr.fileSize)); - writeNumber(output, descr.devId); - writeNumber(output, descr.fileIdx); - assert_static(sizeof(descr.devId ) <= sizeof(std::uint64_t)); - assert_static(sizeof(descr.fileIdx) <= sizeof(std::uint64_t)); + writeNumber(output, to(fileSize)); + writeNumber(output, descr.fileId.first); + writeNumber(output, descr.fileId.second); + assert_static(sizeof(descr.fileId.first ) <= sizeof(std::uint64_t)); + assert_static(sizeof(descr.fileId.second) <= sizeof(std::uint64_t)); } - static void write(BinStreamOut& output, const LinkDescriptor& descr) + static void writeLink(BinStreamOut& output, const InSyncDescrLink& descr) { writeNumber(output, to(descr.lastWriteTimeRaw)); @@ -236,37 +240,39 @@ private: writeNumber(output, 0); } - static void write(BinStreamOut& output, const InSyncDir::InSyncStatus& status) + static void writeDir(BinStreamOut& output, const InSyncDir::InSyncStatus& status) { writeNumber(output, status); } - void process(const std::pair& filePair) + void process(const std::pair& dbFile) { - writeUtf8(outputBoth, filePair.first); - writeNumber(outputBoth, filePair.second.inSyncType); + writeUtf8(outputBoth, dbFile.first); + writeNumber(outputBoth, dbFile.second.inSyncType); - write(outputLeft, filePair.second.left); - write(outputRight, filePair.second.right); + warn_static("implement proper migration: get rid of duplicate fileSize!") + + writeFile(outputLeft, dbFile.second.left, dbFile.second.fileSize); + writeFile(outputRight, dbFile.second.right, dbFile.second.fileSize); } - void process(const std::pair& symlinkPair) + void process(const std::pair& dbSymlink) { - writeUtf8(outputBoth, symlinkPair.first); + writeUtf8(outputBoth, dbSymlink.first); warn_static("new parameter: imp proper migration!") - //writeNumber(outputBoth, symlinkPair.second.inSyncType); + //writeNumber(outputBoth, dbSymlink.second.inSyncType); - write(outputLeft, symlinkPair.second.left); - write(outputRight, symlinkPair.second.right); + writeLink(outputLeft, dbSymlink.second.left); + writeLink(outputRight, dbSymlink.second.right); } - void process(const std::pair& dirPair) + void process(const std::pair& dbDir) { - writeUtf8(outputBoth, dirPair.first); - write(outputBoth, dirPair.second.status); + writeUtf8(outputBoth, dbDir.first); + writeDir(outputBoth, dbDir.second.status); - recurse(dirPair.second); + recurse(dbDir.second); } BinStreamOut outputLeft; //data related to one side only @@ -291,7 +297,7 @@ public: } catch (ZlibInternalError&) { - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename)) + L" (zlib error)"); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename)), L"zlib internal error"); } }; @@ -319,11 +325,11 @@ public: const BinaryStream tmpL = readContainer(inL); const BinaryStream tmpR = readContainer(inR); - auto output = std::make_shared(InSyncDir::STATUS_IN_SYNC); - StreamParser(decompStream(tmpL, filenameL), - decompStream(tmpR, filenameR), - decompStream(tmpB, filenameL + Zstr("/") + filenameR), - *output); //throw UnexpectedEndOfStreamError + auto output = std::make_shared(InSyncDir::DIR_STATUS_IN_SYNC); + StreamParser parser(decompStream(tmpL, filenameL), + decompStream(tmpR, filenameR), + decompStream(tmpB, filenameL + Zstr("/") + filenameR)); + parser.recurse(*output); //throw UnexpectedEndOfStreamError return output; } catch (const UnexpectedEndOfStreamError&) @@ -332,43 +338,46 @@ public: } catch (const std::bad_alloc& e) //still required? { - throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(filenameL) + L"\n" + fmtFileName(filenameR) + L"\n\n" + - _("Out of memory!") + L" " + utfCvrtTo(e.what())); + throw FileError(_("Database file is corrupt:") + L"\n" + fmtFileName(filenameL) + L"\n" + fmtFileName(filenameR), + _("Out of memory.") + L" " + utfCvrtTo(e.what())); } } private: StreamParser(const BinaryStream& bufferL, const BinaryStream& bufferR, - const BinaryStream& bufferB, - InSyncDir& container) : + const BinaryStream& bufferB) : inputLeft (bufferL), inputRight(bufferR), - inputBoth (bufferB) { recurse(container); } + inputBoth (bufferB) {} static Zstring readUtf8(BinStreamIn& input) { return utfCvrtTo(readContainer>(input)); } //throw UnexpectedEndOfStreamError - static void read(BinStreamIn& input, FileDescriptor& descr) + static InSyncDescrFile readFile(BinStreamIn& input, UInt64& fileSize) { //attention: order of function argument evaluation is undefined! So do it one after the other... - descr.lastWriteTimeRaw = readNumber(input); //throw UnexpectedEndOfStreamError - descr.fileSize = readNumber(input); - descr.devId = static_cast(readNumber(input)); // - descr.fileIdx = static_cast(readNumber(input)); //silence "loss of precision" compiler warnings + auto lastWriteTimeRaw = readNumber(input); //throw UnexpectedEndOfStreamError + warn_static("implement proper migration!") + fileSize = readNumber(input); + auto devId = static_cast(readNumber(input)); // + auto fileIdx = static_cast(readNumber(input)); //silence "loss of precision" compiler warnings + return InSyncDescrFile(lastWriteTimeRaw, FileId(devId, fileIdx)); } - static void read(BinStreamIn& input, LinkDescriptor& descr) + static InSyncDescrLink readLink(BinStreamIn& input) { - descr.lastWriteTimeRaw = readNumber(input); + auto lastWriteTimeRaw = readNumber(input); warn_static("implement proper migration!") //descr.targetPath = readUtf8(input); readUtf8(input); //descr.type = static_cast(readNumber(input)); readNumber(input); + + return InSyncDescrLink(lastWriteTimeRaw); } - static void read(BinStreamIn& input, InSyncDir::InSyncStatus& status) + static void readDir(BinStreamIn& input, InSyncDir::InSyncStatus& status) { status = static_cast(readNumber(input)); } @@ -378,15 +387,16 @@ private: size_t fileCount = readNumber(inputBoth); while (fileCount-- != 0) { + warn_static("migrate from InSyncType to CompareVariant!!!") const Zstring shortName = readUtf8(inputBoth); const auto inSyncType = static_cast(readNumber(inputBoth)); - FileDescriptor dataL; - FileDescriptor dataR; - read(inputLeft, dataL); - read(inputRight, dataR); + warn_static("implement proper migration: get rid of duplicate fileSize!") - container.addFile(shortName, dataL, dataR, inSyncType); + UInt64 fileSize; + const InSyncDescrFile dataL = readFile(inputLeft, fileSize); + const InSyncDescrFile dataR = readFile(inputRight, fileSize); + container.addFile(shortName, dataL, dataR, inSyncType, fileSize); } size_t linkCount = readNumber(inputBoth); @@ -395,14 +405,11 @@ private: const Zstring shortName = readUtf8(inputBoth); warn_static("new parameter: imp proper migration!") - const auto inSyncType = IN_SYNC_BINARY_EQUAL; + const auto inSyncType = IN_SYNC_BINARY_EQUAL; //const auto inSyncType = static_cast(readNumber(inputBoth)); - LinkDescriptor dataL; - LinkDescriptor dataR; - read(inputLeft, dataL); - read(inputRight, dataR); - + InSyncDescrLink dataL = readLink(inputLeft); + InSyncDescrLink dataR = readLink(inputRight); container.addSymlink(shortName, dataL, dataR, inSyncType); } @@ -411,8 +418,8 @@ private: { const Zstring shortName = readUtf8(inputBoth); - InSyncDir::InSyncStatus status = InSyncDir::STATUS_STRAW_MAN; - read(inputBoth, status); + InSyncDir::InSyncStatus status = InSyncDir::DIR_STATUS_STRAW_MAN; + readDir(inputBoth, status); InSyncDir& subDir = container.addDir(shortName, status); recurse(subDir); @@ -435,10 +442,10 @@ class UpdateLastSynchronousState => update all database entries! */ public: - static void execute(const BaseDirMapping& baseMapping, InSyncDir& dir) + static void execute(const BaseDirPair& baseDirObj, InSyncDir& dir) { bool binaryComparison = false; - switch (baseMapping.getCompVariant()) + switch (baseDirObj.getCompVariant()) { case CMP_BY_TIME_SIZE: break; @@ -447,8 +454,8 @@ public: break; } - UpdateLastSynchronousState updater(baseMapping.getFilter(), binaryComparison); - updater.recurse(baseMapping, dir); + UpdateLastSynchronousState updater(baseDirObj.getFilter(), binaryComparison); + updater.recurse(baseDirObj, dir); } private: @@ -469,7 +476,7 @@ private: auto rv = map.insert(typename M::value_type(key, value)); if (!rv.second) { -#if defined FFS_WIN || defined FFS_MAC //caveat: key must be updated, if there is a change in short name case!!! +#if defined ZEN_WIN || defined ZEN_MAC //caveat: key must be updated, if there is a change in short name case!!! if (rv.first->first != key) { map.erase(rv.first); @@ -490,7 +497,7 @@ private: auto it = map.lower_bound(key); if (it != map.end() && !(map.key_comp()(key, it->first))) { - #if defined FFS_WIN || defined FFS_MAC //caveat: key might need to be updated, too, if there is a change in short name case!!! + #if defined ZEN_WIN || defined ZEN_MAC //caveat: key might need to be updated, too, if there is a change in short name case!!! if (it->first != key) { map.erase(it); //don't fiddle with decrementing "it"! - you might lose while optimizing pointlessly @@ -507,38 +514,40 @@ private: void process(const HierarchyObject::SubFileVec& currentFiles, const Zstring& parentRelativeNamePf, InSyncDir::FileList& dbFiles) { hash_set toPreserve; //referencing fixed-in-memory std::map elements - std::for_each(currentFiles.begin(), currentFiles.end(), [&](const FileMapping& fileMap) + std::for_each(currentFiles.begin(), currentFiles.end(), [&](const FilePair& fileObj) { - if (!fileMap.isEmpty()) + if (!fileObj.isEmpty()) { - if (fileMap.getCategory() == FILE_EQUAL) //data in sync: write current state + if (fileObj.getCategory() == FILE_EQUAL) //data in sync: write current state { //Caveat: If FILE_EQUAL, we *implicitly* assume equal left and right short names matching case: InSyncDir's mapping tables use short name as a key! //This makes us silently dependent from code in algorithm.h!!! - assert(fileMap.getShortName() == fileMap.getShortName()); + assert(fileObj.getShortName() == fileObj.getShortName()); + //this should be taken for granted: + assert(fileObj.getFileSize() == fileObj.getFileSize()); //create or update new "in-sync" state - InSyncFile& file = updateItem(dbFiles, fileMap.getObjShortName(), - InSyncFile(FileDescriptor(fileMap.getLastWriteTime(), - fileMap.getFileSize (), - fileMap.getFileId ()), - FileDescriptor(fileMap.getLastWriteTime(), - fileMap.getFileSize (), - fileMap.getFileId ()), + InSyncFile& file = updateItem(dbFiles, fileObj.getObjShortName(), + InSyncFile(InSyncDescrFile(fileObj.getLastWriteTime(), + fileObj.getFileId ()), + InSyncDescrFile(fileObj.getLastWriteTime(), + fileObj.getFileId ()), binaryComparison_ ? IN_SYNC_BINARY_EQUAL : - IN_SYNC_ATTRIBUTES_EQUAL)); + IN_SYNC_ATTRIBUTES_EQUAL, + fileObj.getFileSize())); toPreserve.insert(&file); } else //not in sync: preserve last synchronous state { - auto it = dbFiles.find(fileMap.getObjShortName()); + auto it = dbFiles.find(fileObj.getObjShortName()); if (it != dbFiles.end()) toPreserve.insert(&it->second); } } }); + warn_static("consider temporarily excluded items due to traveral error just like a fixed file filter here!?") //delete removed items (= "in-sync") from database map_remove_if(dbFiles, [&](const InSyncDir::FileList::value_type& v) -> bool { @@ -553,18 +562,18 @@ private: void process(const HierarchyObject::SubLinkVec& currentLinks, const Zstring& parentRelativeNamePf, InSyncDir::LinkList& dbLinks) { hash_set toPreserve; - std::for_each(currentLinks.begin(), currentLinks.end(), [&](const SymLinkMapping& linkMap) + std::for_each(currentLinks.begin(), currentLinks.end(), [&](const SymlinkPair& linkObj) { - if (!linkMap.isEmpty()) + if (!linkObj.isEmpty()) { - if (linkMap.getLinkCategory() == SYMLINK_EQUAL) //data in sync: write current state + if (linkObj.getLinkCategory() == SYMLINK_EQUAL) //data in sync: write current state { - assert(linkMap.getShortName() == linkMap.getShortName()); + assert(linkObj.getShortName() == linkObj.getShortName()); //create or update new "in-sync" state - InSyncSymlink& link = updateItem(dbLinks, linkMap.getObjShortName(), - InSyncSymlink(LinkDescriptor(linkMap.getLastWriteTime()), - LinkDescriptor(linkMap.getLastWriteTime()), + InSyncSymlink& link = updateItem(dbLinks, linkObj.getObjShortName(), + InSyncSymlink(InSyncDescrLink(linkObj.getLastWriteTime()), + InSyncDescrLink(linkObj.getLastWriteTime()), binaryComparison_ ? IN_SYNC_BINARY_EQUAL : IN_SYNC_ATTRIBUTES_EQUAL)); @@ -572,7 +581,7 @@ private: } else //not in sync: preserve last synchronous state { - auto it = dbLinks.find(linkMap.getObjShortName()); + auto it = dbLinks.find(linkObj.getObjShortName()); if (it != dbLinks.end()) toPreserve.insert(&it->second); } @@ -593,22 +602,21 @@ private: void process(const HierarchyObject::SubDirVec& currentDirs, const Zstring& parentRelativeNamePf, InSyncDir::DirList& dbDirs) { hash_set toPreserve; - std::for_each(currentDirs.begin(), currentDirs.end(), [&](const DirMapping& dirMap) + std::for_each(currentDirs.begin(), currentDirs.end(), [&](const DirPair& dirObj) { - if (!dirMap.isEmpty()) - { - switch (dirMap.getDirCategory()) + if (!dirObj.isEmpty()) + switch (dirObj.getDirCategory()) { case DIR_EQUAL: { - assert(dirMap.getShortName() == dirMap.getShortName()); + assert(dirObj.getShortName() == dirObj.getShortName()); //update directory entry only (shallow), but do *not touch* exising child elements!!! - const Zstring& key = dirMap.getObjShortName(); - auto insertResult = dbDirs.insert(std::make_pair(key, InSyncDir(InSyncDir::STATUS_IN_SYNC))); //get or create + const Zstring& key = dirObj.getObjShortName(); + auto insertResult = dbDirs.insert(std::make_pair(key, InSyncDir(InSyncDir::DIR_STATUS_IN_SYNC))); //get or create auto it = insertResult.first; -#if defined FFS_WIN || defined FFS_MAC //caveat: key might need to be updated, too, if there is a change in short name case!!! +#if defined ZEN_WIN || defined ZEN_MAC //caveat: key might need to be updated, too, if there is a change in short name case!!! const bool alreadyExisting = !insertResult.second; if (alreadyExisting && it->first != key) { @@ -618,9 +626,9 @@ private: } #endif InSyncDir& dir = it->second; - dir.status = InSyncDir::STATUS_IN_SYNC; //update immediate directory entry + dir.status = InSyncDir::DIR_STATUS_IN_SYNC; //update immediate directory entry toPreserve.insert(&dir); - recurse(dirMap, dir); + recurse(dirObj, dir); } break; @@ -630,9 +638,9 @@ private: //Example: directories on left and right differ in case while sub-files are equal { //reuse last "in-sync" if available or insert strawman entry (do not try to update thereby removing child elements!!!) - InSyncDir& dir = dbDirs.insert(std::make_pair(dirMap.getObjShortName(), InSyncDir(InSyncDir::STATUS_STRAW_MAN))).first->second; + InSyncDir& dir = dbDirs.insert(std::make_pair(dirObj.getObjShortName(), InSyncDir(InSyncDir::DIR_STATUS_STRAW_MAN))).first->second; toPreserve.insert(&dir); - recurse(dirMap, dir); + recurse(dirObj, dir); } break; @@ -640,16 +648,15 @@ private: case DIR_LEFT_SIDE_ONLY: case DIR_RIGHT_SIDE_ONLY: { - auto it = dbDirs.find(dirMap.getObjShortName()); + auto it = dbDirs.find(dirObj.getObjShortName()); if (it != dbDirs.end()) { toPreserve.insert(&it->second); - recurse(dirMap, it->second); //although existing sub-items cannot be in sync, items deleted on both sides *are* in-sync!!! + recurse(dirObj, it->second); //although existing sub-items cannot be in sync, items deleted on both sides *are* in-sync!!! } } break; } - } }); //delete removed items (= "in-sync") from database @@ -657,13 +664,12 @@ private: { if (toPreserve.find(&v.second) != toPreserve.end()) return false; - //all items not existing in "currentDirs" have either been deleted meanwhile or been excluded via filter: const Zstring& shortName = v.first; return filter_.passDirFilter(parentRelativeNamePf + shortName, nullptr); //if directory is not included in "currentDirs", it is either not existing anymore, in which case it should be deleted from database - //or it was excluded via filter, in which case the database entry should be preserved - //-> we can't tell and need to preserve the old db entry -> all child db elements are preserved since they are not recursed in the loop above!!! - //-> no problem with filter logic of excluding complete directory subtrees, if top folder is excluded directly! + //or it was excluded via filter, in which case the database entry should be preserved: + //=> all child db elements are also preserved since they are not recursed in the loop above!!! + //=> no problem with filter logic of excluding complete directory subtrees, if top folder is excluded directly! }); } @@ -674,17 +680,17 @@ private: //####################################################################################################################################### -std::shared_ptr zen::loadLastSynchronousState(const BaseDirMapping& baseMapping) //throw FileError, FileErrorDatabaseNotExisting -> return value always bound! +std::shared_ptr zen::loadLastSynchronousState(const BaseDirPair& baseDirObj) //throw FileError, FileErrorDatabaseNotExisting -> return value always bound! { - const Zstring fileNameLeft = getDBFilename(baseMapping); - const Zstring fileNameRight = getDBFilename(baseMapping); + const Zstring fileNameLeft = getDBFilename(baseDirObj); + const Zstring fileNameRight = getDBFilename(baseDirObj); - if (!baseMapping.isExisting() || - !baseMapping.isExisting()) + if (!baseDirObj.isExisting() || + !baseDirObj.isExisting()) { //avoid race condition with directory existence check: reading sync.ffs_db may succeed although first dir check had failed => conflicts! //https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3531351&group_id=234430 - const Zstring filename = !baseMapping.isExisting() ? fileNameLeft : fileNameRight; + const Zstring filename = !baseDirObj.isExisting() ? fileNameLeft : fileNameRight; throw FileErrorDatabaseNotExisting(_("Initial synchronization:") + L" \n" + //it could be due to a to-be-created target directory not yet existing => FileErrorDatabaseNotExisting replaceCpy(_("Database file %x does not yet exist."), L"%x", fmtFileName(filename))); } @@ -710,14 +716,14 @@ std::shared_ptr zen::loadLastSynchronousState(const BaseDirMapping& b } -void zen::saveLastSynchronousState(const BaseDirMapping& baseMapping) //throw FileError +void zen::saveLastSynchronousState(const BaseDirPair& baseDirObj) //throw FileError { //transactional behaviour! write to tmp files first - const Zstring dbNameLeftTmp = getDBFilename(baseMapping, true); - const Zstring dbNameRightTmp = getDBFilename(baseMapping, true); + const Zstring dbNameLeftTmp = getDBFilename(baseDirObj, true); + const Zstring dbNameRightTmp = getDBFilename(baseDirObj, true); - const Zstring dbNameLeft = getDBFilename(baseMapping); - const Zstring dbNameRight = getDBFilename(baseMapping); + const Zstring dbNameLeft = getDBFilename(baseDirObj); + const Zstring dbNameRight = getDBFilename(baseDirObj); //delete old tmp file, if necessary -> throws if deletion fails! removeFile(dbNameLeftTmp); // @@ -749,7 +755,7 @@ void zen::saveLastSynchronousState(const BaseDirMapping& baseMapping) //throw Fi } //load last synchrounous state - std::shared_ptr lastSyncState = std::make_shared(InSyncDir::STATUS_IN_SYNC); + std::shared_ptr lastSyncState = std::make_shared(InSyncDir::DIR_STATUS_IN_SYNC); if (streamIterLeftOld != streamListLeft .end() && streamIterRightOld != streamListRight.end()) try @@ -762,7 +768,7 @@ void zen::saveLastSynchronousState(const BaseDirMapping& baseMapping) //throw Fi catch (FileError&) {} //if error occurs: just overwrite old file! User is already informed about issues right after comparing! //update last synchrounous state - UpdateLastSynchronousState::execute(baseMapping, *lastSyncState); + UpdateLastSynchronousState::execute(baseDirObj, *lastSyncState); //serialize again BinaryStream updatedStreamLeft; diff --git a/lib/db_file.h b/lib/db_file.h index 181a433e..b352ba5d 100644 --- a/lib/db_file.h +++ b/lib/db_file.h @@ -4,8 +4,8 @@ // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** -#ifndef DBFILE_H_INCLUDED -#define DBFILE_H_INCLUDED +#ifndef DBFILE_H_834275398588021574 +#define DBFILE_H_834275398588021574 #include #include "../file_hierarchy.h" @@ -20,31 +20,50 @@ enum InSyncType IN_SYNC_ATTRIBUTES_EQUAL, //only "looks" like they're equal }; +struct InSyncDescrFile //subset of FileDescriptor +{ + InSyncDescrFile(const Int64& lastWriteTimeRawIn, + const FileId& idIn) : + lastWriteTimeRaw(lastWriteTimeRawIn), + fileId(idIn) {} + + Int64 lastWriteTimeRaw; + FileId fileId; // == file id: optional! (however, always set on Linux, and *generally* available on Windows) +}; + +struct InSyncDescrLink +{ + explicit InSyncDescrLink(const Int64& lastWriteTimeRawIn) : lastWriteTimeRaw(lastWriteTimeRawIn) {} + Int64 lastWriteTimeRaw; +}; + + //artificial hierarchy of last synchronous state: struct InSyncFile { - InSyncFile(const FileDescriptor& l, const FileDescriptor& r, InSyncType type) : left(l), right(r), inSyncType(type) {} - FileDescriptor left; - FileDescriptor right; + InSyncFile(const InSyncDescrFile& l, const InSyncDescrFile& r, InSyncType type, const UInt64& fileSizeIn) : left(l), right(r), inSyncType(type), fileSize(fileSizeIn) {} + InSyncDescrFile left; + InSyncDescrFile right; InSyncType inSyncType; + UInt64 fileSize; //file size must be identical on both sides! }; struct InSyncSymlink { - InSyncSymlink(const LinkDescriptor& l, const LinkDescriptor& r, InSyncType type) : left(l), right(r), inSyncType(type) {} - LinkDescriptor left; - LinkDescriptor right; + InSyncSymlink(const InSyncDescrLink& l, const InSyncDescrLink& r, InSyncType type) : left(l), right(r), inSyncType(type) {} + InSyncDescrLink left; + InSyncDescrLink right; InSyncType inSyncType; }; struct InSyncDir { - //for directories we have a logical problem: we cannot have "not existent" as an indicator for "no last synchronous state" since this precludes - //child elements that may be in sync! + //for directories we have a logical problem: we cannot have "not existent" as an indicator for + //"no last synchronous state" since this precludes child elements that may be in sync! enum InSyncStatus { - STATUS_IN_SYNC, - STATUS_STRAW_MAN //there is no last synchronous state, but used as container only + DIR_STATUS_IN_SYNC, + DIR_STATUS_STRAW_MAN //there is no last synchronous state, but used as container only }; InSyncDir(InSyncStatus statusIn) : status(statusIn) {} @@ -61,18 +80,18 @@ struct InSyncDir LinkList symlinks; //non-followed symlinks //convenience - InSyncDir& addDir(const Zstring& shortName, InSyncStatus statusIn) + InSyncDir& addDir(const Zstring& shortName, InSyncStatus st) { //use C++11 emplace when available - return dirs.insert(std::make_pair(shortName, InSyncDir(statusIn))).first->second; + return dirs.insert(std::make_pair(shortName, InSyncDir(st))).first->second; } - void addFile(const Zstring& shortName, const FileDescriptor& dataL, const FileDescriptor& dataR, InSyncType type) + void addFile(const Zstring& shortName, const InSyncDescrFile& dataL, const InSyncDescrFile& dataR, InSyncType type, const UInt64& fileSize) { - files.insert(std::make_pair(shortName, InSyncFile(dataL, dataR, type))); + files.insert(std::make_pair(shortName, InSyncFile(dataL, dataR, type, fileSize))); } - void addSymlink(const Zstring& shortName, const LinkDescriptor& dataL, const LinkDescriptor& dataR, InSyncType type) + void addSymlink(const Zstring& shortName, const InSyncDescrLink& dataL, const InSyncDescrLink& dataR, InSyncType type) { symlinks.insert(std::make_pair(shortName, InSyncSymlink(dataL, dataR, type))); } @@ -81,9 +100,9 @@ struct InSyncDir DEFINE_NEW_FILE_ERROR(FileErrorDatabaseNotExisting); -std::shared_ptr loadLastSynchronousState(const BaseDirMapping& baseMapping); //throw FileError, FileErrorDatabaseNotExisting -> return value always bound! +std::shared_ptr loadLastSynchronousState(const BaseDirPair& baseDirObj); //throw FileError, FileErrorDatabaseNotExisting -> return value always bound! -void saveLastSynchronousState(const BaseDirMapping& baseMapping); //throw FileError +void saveLastSynchronousState(const BaseDirPair& baseDirObj); //throw FileError } -#endif //DBFILE_H_INCLUDED +#endif //DBFILE_H_834275398588021574 diff --git a/lib/dir_exist_async.h b/lib/dir_exist_async.h index b96dc7e1..dd77a36a 100644 --- a/lib/dir_exist_async.h +++ b/lib/dir_exist_async.h @@ -34,7 +34,7 @@ std::set getExistingDirsUpdating(const std::set #include #include -#include +#include #include //includes #include #include @@ -18,14 +18,14 @@ #include #include -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include //includes "windows.h" #include #include //login sid #include //UNLEN -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include //open() #include // #include //getsid() @@ -68,14 +68,14 @@ public: } catch (const std::exception& e) //exceptions must be catched per thread { - wxSafeShowMessage(_("An exception occurred!") + L" (Dirlock)", utfCvrtTo(e.what())); //simple wxMessageBox won't do for threads + wxSafeShowMessage(_("An exception occurred"), utfCvrtTo(e.what()) + L" (Dirlock)"); //simple wxMessageBox won't do for threads } } void emitLifeSign() const //try to append one byte...; throw() { const char buffer[1] = {' '}; -#ifdef FFS_WIN +#ifdef ZEN_WIN //ATTENTION: setting file pointer IS required! => use CreateFile/GENERIC_WRITE + SetFilePointerEx! //although CreateFile/FILE_APPEND_DATA without SetFilePointerEx works locally, it MAY NOT work on some network shares creating a 4 gig file!!! @@ -105,7 +105,7 @@ public: nullptr)) //_Inout_opt_ LPOVERLAPPED lpOverlapped return; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC const int fileHandle = ::open(lockfilename_.c_str(), O_WRONLY | O_APPEND); if (fileHandle == -1) return; @@ -125,7 +125,7 @@ namespace { UInt64 getLockFileSize(const Zstring& filename) //throw FileError, ErrorNotExisting { -#ifdef FFS_WIN +#ifdef ZEN_WIN WIN32_FIND_DATA fileInfo = {}; const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileInfo); if (searchHandle != INVALID_HANDLE_VALUE) @@ -133,20 +133,22 @@ UInt64 getLockFileSize(const Zstring& filename) //throw FileError, ErrorNotExist ::FindClose(searchHandle); return UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); } - -#elif defined FFS_LINUX || defined FFS_MAC + const wchar_t functionName[] = L"FindFirstFile"; +#elif defined ZEN_LINUX || defined ZEN_MAC struct ::stat fileInfo = {}; if (::stat(filename.c_str(), &fileInfo) == 0) //follow symbolic links return UInt64(fileInfo.st_size); + const wchar_t functionName[] = L"stat"; #endif const ErrorCode lastError = getLastError(); - const std::wstring errorMessage = replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted(lastError); + const std::wstring errorMsg = replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)); + const std::wstring errorDescr = formatSystemError(functionName, lastError); if (errorCodeForNotExisting(lastError)) - throw ErrorNotExisting(errorMessage); + throw ErrorNotExisting(errorMsg, errorDescr); else - throw FileError(errorMessage); + throw FileError(errorMsg, errorDescr); } @@ -160,14 +162,14 @@ Zstring deleteAbandonedLockName(const Zstring& lockfilename) //make sure to NOT } -#ifdef FFS_WIN +#ifdef ZEN_WIN Zstring getLoginSid() //throw FileError { HANDLE hToken = 0; if (!::OpenProcessToken(::GetCurrentProcess(), //__in HANDLE ProcessHandle, TOKEN_ALL_ACCESS, //__in DWORD DesiredAccess, &hToken)) //__out PHANDLE TokenHandle - throw FileError(_("Cannot get process information.") + L" (OpenProcessToken)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"OpenProcessToken", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hToken)); DWORD bufferSize = 0; @@ -179,7 +181,7 @@ Zstring getLoginSid() //throw FileError &buffer[0], //__out_opt LPVOID TokenInformation, bufferSize, //__in DWORD TokenInformationLength, &bufferSize)) //__out PDWORD ReturnLength - throw FileError(_("Cannot get process information.") + L" (GetTokenInformation)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"GetTokenInformation", getLastError())); auto groups = reinterpret_cast(&buffer[0]); @@ -189,20 +191,19 @@ Zstring getLoginSid() //throw FileError LPTSTR sidStr = nullptr; if (!::ConvertSidToStringSid(groups->Groups[i].Sid, //__in PSID Sid, &sidStr)) //__out LPTSTR *StringSid - throw FileError(_("Cannot get process information.") + L" (ConvertSidToStringSid)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"ConvertSidToStringSid", getLastError())); ZEN_ON_SCOPE_EXIT(::LocalFree(sidStr)); - return sidStr; } - throw FileError(_("Cannot get process information.") + L" (no login found)" + L"\n\n" + getLastErrorFormatted()); //shouldn't happen + throw FileError(_("Cannot get process information."), L"no login found"); //shouldn't happen } #endif -#ifdef FFS_WIN +#ifdef ZEN_WIN typedef DWORD ProcessId; typedef DWORD SessionId; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC typedef pid_t ProcessId; typedef pid_t SessionId; #endif @@ -210,12 +211,12 @@ typedef pid_t SessionId; //return ppid on Windows, sid on Linux/Mac, "no value" if process corresponding to "processId" is not existing Opt getSessionId(ProcessId processId) //throw FileError { -#ifdef FFS_WIN +#ifdef ZEN_WIN //note: ::OpenProcess() is no alternative as it may successfully return for crashed processes! -> remark: "WaitForSingleObject" may identify this case! HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, //__in DWORD dwFlags, 0); //__in DWORD th32ProcessID if (snapshot == INVALID_HANDLE_VALUE) - throw FileError(_("Cannot get process information.") + L" (CreateToolhelp32Snapshot)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"CreateToolhelp32Snapshot", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(snapshot)); PROCESSENTRY32 processEntry = {}; @@ -223,7 +224,7 @@ Opt getSessionId(ProcessId processId) //throw FileError if (!::Process32First(snapshot, //__in HANDLE hSnapshot, &processEntry)) //__inout LPPROCESSENTRY32 lppe - throw FileError(_("Cannot get process information.") + L" (Process32First)" + L"\n\n" + getLastErrorFormatted()); //ERROR_NO_MORE_FILES not possible + throw FileError(_("Cannot get process information."), formatSystemError(L"Process32First", getLastError())); //ERROR_NO_MORE_FILES not possible do { if (processEntry.th32ProcessID == processId) //yes, MSDN says this is the way: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684868(v=vs.85).aspx @@ -231,17 +232,17 @@ Opt getSessionId(ProcessId processId) //throw FileError } while (::Process32Next(snapshot, &processEntry)); if (::GetLastError() != ERROR_NO_MORE_FILES) //yes, they call it "files" - throw FileError(_("Cannot get process information.") + L" (Process32Next)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"Process32Next", getLastError())); return NoValue(); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC if (::kill(processId, 0) != 0) //sig == 0: no signal sent, just existence check return NoValue(); pid_t procSid = ::getsid(processId); //NOT to be confused with "login session", e.g. not stable on OS X!!! if (procSid == -1) - throw FileError(_("Cannot get process information.") + L" (getsid)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"getsid", getLastError())); return procSid; #endif @@ -255,7 +256,7 @@ struct LockInformation //throw FileError explicit LockInformation(FromCurrentProcess) : lockId(zen::generateGUID()), sessionId(), //dummy value -#ifdef FFS_WIN +#ifdef ZEN_WIN processId(::GetCurrentProcessId()) //never fails { DWORD bufferSize = 0; @@ -265,28 +266,29 @@ struct LockInformation //throw FileError if (!::GetComputerNameEx(ComputerNameDnsFullyQualified, //__in COMPUTER_NAME_FORMAT NameType, &buffer[0], //__out LPTSTR lpBuffer, &bufferSize)) //__inout LPDWORD lpnSize - throw FileError(_("Cannot get process information.") + L" (GetComputerNameEx)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"GetComputerNameEx", getLastError())); + computerName = "Windows." + utfCvrtTo(&buffer[0]); bufferSize = UNLEN + 1; buffer.resize(bufferSize); if (!::GetUserName(&buffer[0], //__out LPTSTR lpBuffer, &bufferSize)) //__inout LPDWORD lpnSize - throw FileError(_("Cannot get process information.") + L" (GetUserName)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"GetUserName", getLastError())); userId = utfCvrtTo(&buffer[0]); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC processId(::getpid()) //never fails { std::vector buffer(10000); if (::gethostname(&buffer[0], buffer.size()) != 0) - throw FileError(_("Cannot get process information.") + L" (gethostname)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"gethostname", getLastError())); computerName += "Linux."; //distinguish linux/windows lock files computerName += &buffer[0]; if (::getdomainname(&buffer[0], buffer.size()) != 0) - throw FileError(_("Cannot get process information.") + L" (getdomainname)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"getdomainname", getLastError())); computerName += "."; computerName += &buffer[0]; @@ -298,15 +300,15 @@ struct LockInformation //throw FileError struct passwd buffer2 = {}; struct passwd* pwsEntry = nullptr; if (::getpwuid_r(userIdNo, &buffer2, &buffer[0], buffer.size(), &pwsEntry) != 0) //getlogin() is deprecated and not working on Ubuntu at all!!! - throw FileError(_("Cannot get process information.") + L" (getpwuid_r)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), formatSystemError(L"getpwuid_r", getLastError())); if (!pwsEntry) - throw FileError(_("Cannot get process information.") + L" (no login found)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), L"no login found"); //should not happen? userId += pwsEntry->pw_name; #endif Opt sessionIdTmp = getSessionId(processId); //throw FileError if (!sessionIdTmp) - throw FileError(_("Cannot get process information.") + L" (getSessionId)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot get process information."), L"no session id found"); //should not happen? sessionId = *sessionIdTmp; } @@ -357,14 +359,6 @@ struct LockInformation //throw FileError //wxGetFullHostName() is a performance killer for some users, so don't touch! -void writeLockInfo(const Zstring& lockfilename) //throw FileError -{ - BinStreamOut streamOut; - LockInformation(FromCurrentProcess()).toStream(streamOut); - saveBinStream(lockfilename, streamOut.get()); //throw FileError -} - - LockInformation retrieveLockInfo(const Zstring& lockfilename) //throw FileError, ErrorNotExisting { BinStreamIn streamIn = loadBinStream(lockfilename); //throw FileError, ErrorNotExisting @@ -374,7 +368,7 @@ LockInformation retrieveLockInfo(const Zstring& lockfilename) //throw FileError, } catch (UnexpectedEndOfStreamError&) { - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(lockfilename)) + L" (unexpected end of stream)"); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(lockfilename)), L"unexpected end of stream"); } } @@ -519,7 +513,7 @@ void releaseLock(const Zstring& lockfilename) //throw () bool tryLock(const Zstring& lockfilename) //throw FileError { -#ifdef FFS_WIN +#ifdef ZEN_WIN const HANDLE fileHandle = ::CreateFile(applyLongPathPrefix(lockfilename).c_str(), GENERIC_READ | GENERIC_WRITE, //use both when writing over network, see comment in file_io.cpp FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, @@ -534,7 +528,7 @@ bool tryLock(const Zstring& lockfilename) //throw FileError lastError == ERROR_ALREADY_EXISTS) //comment on msdn claims, this one is used on Windows Mobile 6 return false; else - throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(lockfilename)) + L"\n\n" + zen::getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(lockfilename)), formatSystemError(L"CreateFile", getLastError())); } ScopeGuard guardLockFile = zen::makeGuard([&] { removeFile(lockfilename); }); FileOutput fileOut(fileHandle, lockfilename); //pass handle ownership @@ -542,7 +536,7 @@ bool tryLock(const Zstring& lockfilename) //throw FileError //be careful to avoid CreateFile() + CREATE_ALWAYS on a hidden file -> see file_io.cpp //=> we don't need it that badly //::SetFileAttributes(applyLongPathPrefix(lockfilename).c_str(), FILE_ATTRIBUTE_HIDDEN); //(try to) hide it -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC ::umask(0); //important! -> why? //O_EXCL contains a race condition on NFS file systems: http://linux.die.net/man/2/open const int fileHandle = ::open(lockfilename.c_str(), O_CREAT | O_WRONLY | O_EXCL, S_IRWXU | S_IRWXG | S_IRWXO); @@ -551,7 +545,7 @@ bool tryLock(const Zstring& lockfilename) //throw FileError if (errno == EEXIST) return false; else - throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(lockfilename)) + L"\n\n" + zen::getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(lockfilename)), formatSystemError(L"open", getLastError())); } ScopeGuard guardLockFile = zen::makeGuard([&] { removeFile(lockfilename); }); FileOutputUnbuffered fileOut(fileHandle, lockfilename); //pass handle ownership @@ -675,7 +669,7 @@ DirLock::DirLock(const Zstring& lockfilename, DirLockCallback* callback) //throw if (callback) callback->reportStatus(replaceCpy(_("Creating file %x"), L"%x", fmtFileName(lockfilename))); -#ifdef FFS_WIN +#ifdef ZEN_WIN const DWORD bufferSize = 10000; std::vector volName(bufferSize); if (::GetVolumePathName(lockfilename.c_str(), //__in LPCTSTR lpszFileName, diff --git a/lib/ffs_paths.cpp b/lib/ffs_paths.cpp index 5ee4a3eb..0f01b8d1 100644 --- a/lib/ffs_paths.cpp +++ b/lib/ffs_paths.cpp @@ -9,7 +9,7 @@ #include #include -#ifdef FFS_MAC +#ifdef ZEN_MAC #include #include #include @@ -22,7 +22,7 @@ using namespace zen; namespace { -#if defined FFS_WIN || defined FFS_LINUX +#if defined ZEN_WIN || defined ZEN_LINUX inline Zstring getExecutableDir() //directory containing executable WITH path separator at end { @@ -30,7 +30,7 @@ Zstring getExecutableDir() //directory containing executable WITH path separator } #endif -#ifdef FFS_WIN +#ifdef ZEN_WIN inline Zstring getInstallDir() //root install directory WITH path separator at end { @@ -39,10 +39,10 @@ Zstring getInstallDir() //root install directory WITH path separator at end #endif -#ifdef FFS_WIN +#ifdef ZEN_WIN inline bool isPortableVersion() { return !fileExists(getInstallDir() + L"uninstall.exe"); } //this check is a bit lame... -#elif defined FFS_LINUX +#elif defined ZEN_LINUX inline bool isPortableVersion() { return !endsWith(getExecutableDir(), "/bin/"); } //this check is a bit lame... #endif @@ -51,9 +51,9 @@ bool isPortableVersion() { return !endsWith(getExecutableDir(), "/bin/"); } //th bool zen::manualProgramUpdateRequired() { -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC return true; -#elif defined FFS_LINUX +#elif defined ZEN_LINUX return isPortableVersion(); //locally installed version is updated by system #endif } @@ -61,14 +61,14 @@ bool zen::manualProgramUpdateRequired() Zstring zen::getResourceDir() { -#ifdef FFS_WIN +#ifdef ZEN_WIN return getInstallDir(); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX if (isPortableVersion()) return getExecutableDir(); else //use OS' standard paths return appendSeparator(toZ(wxStandardPathsBase::Get().GetResourcesDir())); -#elif defined FFS_MAC +#elif defined ZEN_MAC return appendSeparator(toZ(wxStandardPathsBase::Get().GetResourcesDir())); //if packaged, used "Contents/Resources", else the executable directory #endif } @@ -76,13 +76,13 @@ Zstring zen::getResourceDir() Zstring zen::getConfigDir() { -#ifdef FFS_WIN +#ifdef ZEN_WIN if (isPortableVersion()) return getInstallDir(); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX if (isPortableVersion()) return getExecutableDir(); -#elif defined FFS_MAC +#elif defined ZEN_MAC //portable apps do not seem common on OS - fine with me: http://theocacao.com/document.page/319 #endif //use OS' standard paths @@ -102,13 +102,13 @@ Zstring zen::getConfigDir() //this function is called by RealtimeSync!!! Zstring zen::getFreeFileSyncLauncher() { -#ifdef FFS_WIN +#ifdef ZEN_WIN return getInstallDir() + Zstr("FreeFileSync.exe"); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX return getExecutableDir() + Zstr("FreeFileSync"); -#elif defined FFS_MAC +#elif defined ZEN_MAC CFURLRef appURL = nullptr; ZEN_ON_SCOPE_EXIT(if (appURL) ::CFRelease(appURL)); diff --git a/lib/hard_filter.cpp b/lib/hard_filter.cpp index bb94b25d..39cb07f6 100644 --- a/lib/hard_filter.cpp +++ b/lib/hard_filter.cpp @@ -69,10 +69,10 @@ void addFilterEntry(const Zstring& filtername, std::vector& fileFilter, { Zstring filterFormatted = filtername; -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC //Windows does NOT distinguish between upper/lower-case makeUpper(filterFormatted); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX //Linux DOES distinguish between upper/lower-case: nothing to do here #endif if (startsWith(filterFormatted, FILE_NAME_SEPARATOR)) // \abc @@ -289,10 +289,10 @@ NameFilter::NameFilter(const Zstring& includeFilter, const Zstring& excludeFilte bool NameFilter::passFileFilter(const Zstring& relFilename) const { -#if defined FFS_WIN || defined FFS_MAC //Windows does NOT distinguish between upper/lower-case +#if defined ZEN_WIN || defined ZEN_MAC //Windows does NOT distinguish between upper/lower-case Zstring nameFormatted = relFilename; makeUpper(nameFormatted); -#elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case +#elif defined ZEN_LINUX //Linux DOES distinguish between upper/lower-case const Zstring& nameFormatted = relFilename; //nothing to do here #endif @@ -305,10 +305,10 @@ bool NameFilter::passDirFilter(const Zstring& relDirname, bool* subObjMightMatch { assert(!subObjMightMatch || *subObjMightMatch == true); //check correct usage -#if defined FFS_WIN || defined FFS_MAC //Windows does NOT distinguish between upper/lower-case +#if defined ZEN_WIN || defined ZEN_MAC //Windows does NOT distinguish between upper/lower-case Zstring nameFormatted = relDirname; makeUpper(nameFormatted); -#elif defined FFS_LINUX //Linux DOES distinguish between upper/lower-case +#elif defined ZEN_LINUX //Linux DOES distinguish between upper/lower-case const Zstring& nameFormatted = relDirname; //nothing to do here #endif diff --git a/lib/help_provider.h b/lib/help_provider.h index 040eb33c..8ddc34c7 100644 --- a/lib/help_provider.h +++ b/lib/help_provider.h @@ -7,11 +7,11 @@ #ifndef HELPPROVIDER_H_INCLUDED #define HELPPROVIDER_H_INCLUDED -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include #endif @@ -35,7 +35,7 @@ void displayHelpEntry(const wxString& section, wxWindow* parent); namespace impl { //finish wxWidgets' job -#ifdef FFS_WIN +#ifdef ZEN_WIN class FfsHelpController { public: @@ -55,7 +55,7 @@ private: wxCHMHelpController chmHlp; }; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC class FfsHelpController { public: diff --git a/lib/icon_buffer.cpp b/lib/icon_buffer.cpp index 04364b32..cf916174 100644 --- a/lib/icon_buffer.cpp +++ b/lib/icon_buffer.cpp @@ -10,16 +10,16 @@ #include //includes #include -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include #include #include "Thumbnail/thumbnail.h" -#elif defined FFS_LINUX +#elif defined ZEN_LINUX #include -#elif defined FFS_MAC +#elif defined ZEN_MAC #include "osx_file_icon.h" #endif @@ -34,7 +34,7 @@ const size_t BUFFER_SIZE_MAX = 600; //maximum number of icons to hold in buffer boost::thread::id mainThreadId = boost::this_thread::get_id(); #endif -#ifdef FFS_WIN +#ifdef ZEN_WIN const bool isXpOrLater = winXpOrLater(); //VS2010 compiled DLLs are not supported on Win 2000: Popup dialog "DecodePointer not found" #define DEF_DLL_FUN(name) const auto name = isXpOrLater ? DllFun(thumb::getDllName(), thumb::funName_##name) : DllFun(); @@ -46,11 +46,11 @@ DEF_DLL_FUN(releaseImageData); // class IconHolder //handle HICON/GdkPixbuf ownership supporting thread-safe usage (in contrast to wxIcon/wxBitmap) { public: -#ifdef FFS_WIN +#ifdef ZEN_WIN typedef const thumb::ImageData* HandleType; -#elif defined FFS_LINUX +#elif defined ZEN_LINUX typedef GdkPixbuf* HandleType; -#elif defined FFS_MAC +#elif defined ZEN_MAC typedef osx::ImageData* HandleType; #endif @@ -67,11 +67,11 @@ public: ~IconHolder() { if (handle_ != nullptr) -#ifdef FFS_WIN +#ifdef ZEN_WIN releaseImageData(handle_); //should be checked already before creating IconHolder! -#elif defined FFS_LINUX +#elif defined ZEN_LINUX ::g_object_unref(handle_); //superseedes "::gdk_pixbuf_unref"! -#elif defined FFS_MAC +#elif defined ZEN_MAC delete handle_; #endif } @@ -93,7 +93,7 @@ public: if (!handle_) return wxNullBitmap; -#ifdef FFS_WIN +#ifdef ZEN_WIN ZEN_ON_SCOPE_EXIT(IconHolder().swap(*this)); //destroy after extraction //let wxImage reference data without taking ownership: @@ -101,7 +101,7 @@ public: fileIcon.SetAlpha(handle_->alpha, true); return wxBitmap(fileIcon); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX #if wxCHECK_VERSION(2, 9, 4) return wxBitmap(release()); //ownership passed! #else @@ -110,7 +110,7 @@ public: return newIcon; #endif -#elif defined FFS_MAC +#elif defined ZEN_MAC ZEN_ON_SCOPE_EXIT(IconHolder().swap(*this)); //destroy after extraction //let wxImage reference data without taking ownership: @@ -137,7 +137,7 @@ public: }; -#ifdef FFS_WIN +#ifdef ZEN_WIN Zstring getFileExtension(const Zstring& filename) { const Zstring shortName = afterLast(filename, Zchar('\\')); //warning: using windows file name separator! @@ -217,7 +217,7 @@ IconHolder getAssociatedIconByExt(const Zstring& extension, IconBuffer::IconSize return getIconByAttribute((L"dummy." + extension).c_str(), FILE_ATTRIBUTE_NORMAL, sz); } -#elif defined FFS_LINUX +#elif defined ZEN_LINUX IconHolder iconHolderFromGicon(GIcon* gicon, IconBuffer::IconSize sz) { if (gicon) @@ -237,11 +237,11 @@ IconHolder iconHolderFromGicon(GIcon* gicon, IconBuffer::IconSize sz) IconHolder getThumbnailIcon(const Zstring& filename, int requestedSize) //return 0 on failure { -#ifdef FFS_WIN +#ifdef ZEN_WIN if (getThumbnail && releaseImageData) return IconHolder(getThumbnail(filename.c_str(), requestedSize)); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX gint width = 0; gint height = 0; if (GdkPixbufFormat* fmt = ::gdk_pixbuf_get_file_info(filename.c_str(), &width, &height)) @@ -263,12 +263,12 @@ IconHolder getThumbnailIcon(const Zstring& filename, int requestedSize) //return } } -#elif defined FFS_MAC +#elif defined ZEN_MAC try { - return IconHolder(new osx::ImageData(osx::getThumbnail(filename.c_str(), requestedSize))); //throw OsxError + return IconHolder(new osx::ImageData(osx::getThumbnail(filename.c_str(), requestedSize))); //throw SysError } - catch (osx::OsxError&) {} + catch (zen::SysError&) {} #endif return IconHolder(); } @@ -277,10 +277,10 @@ IconHolder getThumbnailIcon(const Zstring& filename, int requestedSize) //return IconHolder getGenericFileIcon(IconBuffer::IconSize sz) { //we're called by getAssociatedIcon()! -> avoid endless recursion! -#ifdef FFS_WIN +#ifdef ZEN_WIN return getIconByAttribute(L"dummy", FILE_ATTRIBUTE_NORMAL, sz); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX const char* mimeFileIcons[] = { "application-x-zerosize", //Kubuntu: /usr/share/icons/oxygen/48x48/mimetypes @@ -296,12 +296,12 @@ IconHolder getGenericFileIcon(IconBuffer::IconSize sz) return IconHolder(pixBuf); //pass ownership return IconHolder(); -#elif defined FFS_MAC +#elif defined ZEN_MAC try { - return IconHolder(new osx::ImageData(osx::getDefaultFileIcon(IconBuffer::getSize(sz)))); //throw OsxError + return IconHolder(new osx::ImageData(osx::getDefaultFileIcon(IconBuffer::getSize(sz)))); //throw SysError } - catch (osx::OsxError&) {} + catch (zen::SysError&) {} return IconHolder(); #endif } @@ -309,20 +309,20 @@ IconHolder getGenericFileIcon(IconBuffer::IconSize sz) IconHolder getGenericDirectoryIcon(IconBuffer::IconSize sz) { -#ifdef FFS_WIN +#ifdef ZEN_WIN return getIconByAttribute(L"dummy", //Windows 7 doesn't like this parameter to be an empty string! FILE_ATTRIBUTE_DIRECTORY, sz); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX if (GIcon* dirIcon = ::g_content_type_get_icon("inode/directory")) //should contain fallback to GTK_STOCK_DIRECTORY ("gtk-directory") return iconHolderFromGicon(dirIcon, sz); return IconHolder(); -#elif defined FFS_MAC +#elif defined ZEN_MAC try { - return IconHolder(new osx::ImageData(osx::getDefaultFolderIcon(IconBuffer::getSize(sz)))); //throw OsxError + return IconHolder(new osx::ImageData(osx::getDefaultFolderIcon(IconBuffer::getSize(sz)))); //throw SysError } - catch (osx::OsxError&) { return IconHolder(); } + catch (zen::SysError&) { return IconHolder(); } #endif } @@ -345,7 +345,7 @@ IconHolder getAssociatedIcon(const Zstring& filename, IconBuffer::IconSize sz) warn_static("problem: fr folder links ist getThumbnail erfolgreich => SFGAO_LINK nicht gecheckt!") //2. retrieve file icons -#ifdef FFS_WIN +#ifdef ZEN_WIN //perf: optimize fallback case for SIZE_MEDIUM and SIZE_LARGE: const Zstring& extension = getFileExtension(filename); if (isCheapExtension(extension)) //"pricey" extensions are stored with fullnames and are read from disk, while cheap ones require just the extension @@ -381,7 +381,7 @@ IconHolder getAssociatedIcon(const Zstring& filename, IconBuffer::IconSize sz) return IconHolder(imgData); } -#elif defined FFS_LINUX +#elif defined ZEN_LINUX GFile* file = ::g_file_new_for_path(filename.c_str()); //documented to "never fail" ZEN_ON_SCOPE_EXIT(::g_object_unref(file);) @@ -393,12 +393,12 @@ IconHolder getAssociatedIcon(const Zstring& filename, IconBuffer::IconSize sz) } //need fallback: icon lookup may fail because some icons are currently not present on system -#elif defined FFS_MAC +#elif defined ZEN_MAC try { - return IconHolder(new osx::ImageData(osx::getFileIcon(filename.c_str(), IconBuffer::getSize(sz)))); //throw OsxError + return IconHolder(new osx::ImageData(osx::getFileIcon(filename.c_str(), IconBuffer::getSize(sz)))); //throw SysError } - catch (osx::OsxError&) {} + catch (zen::SysError&) {} #endif return ::getGenericFileIcon(sz); //make sure this does not internally call getAssociatedIcon("someDefaultFile.txt")!!! => endless recursion! } @@ -548,7 +548,7 @@ private: void WorkerThread::operator()() //thread entry { //failure to initialize COM for each thread is a source of hard to reproduce bugs: https://sourceforge.net/tracker/?func=detail&aid=3160472&group_id=234430&atid=1093080 -#ifdef FFS_WIN +#ifdef ZEN_WIN //Prerequisites, see thumbnail.h //1. Initialize COM @@ -611,13 +611,13 @@ int IconBuffer::getSize(IconSize icoSize) switch (icoSize) { case IconBuffer::SIZE_SMALL: -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC return 16; -#elif defined FFS_LINUX +#elif defined ZEN_LINUX return 24; #endif case IconBuffer::SIZE_MEDIUM: -#ifdef FFS_WIN +#ifdef ZEN_WIN if (!wereVistaOrLater) return 32; //48x48 doesn't look sharp on XP #endif return 48; @@ -632,7 +632,7 @@ int IconBuffer::getSize(IconSize icoSize) bool IconBuffer::readyForRetrieval(const Zstring& filename) { -#ifdef FFS_WIN +#ifdef ZEN_WIN if (iconSizeType == IconBuffer::SIZE_SMALL) if (isCheapExtension(getFileExtension(filename))) return true; @@ -643,7 +643,7 @@ bool IconBuffer::readyForRetrieval(const Zstring& filename) Opt IconBuffer::retrieveFileIcon(const Zstring& filename) { -#ifdef FFS_WIN +#ifdef ZEN_WIN //perf: let's read icons which don't need file access right away! No async delay justified! if (iconSizeType == IconBuffer::SIZE_SMALL) //non-thumbnail view, we need file type icons only! { diff --git a/lib/localization.cpp b/lib/localization.cpp index f050e255..5526cdce 100644 --- a/lib/localization.cpp +++ b/lib/localization.cpp @@ -10,18 +10,19 @@ #include #include #include -#include +#include #include #include #include +#include #include "parse_plural.h" #include "parse_lng.h" #include "ffs_paths.h" -#ifdef FFS_LINUX +#ifdef ZEN_LINUX #include //wcscasecmp -#elif defined FFS_MAC +#elif defined ZEN_MAC #include #endif @@ -33,7 +34,7 @@ namespace class FFSTranslation : public TranslationHandler { public: - FFSTranslation(const std::wstring& filename, wxLanguage languageId); //throw lngfile::ParsingError, parse_plural::ParsingError + FFSTranslation(const Zstring& filename, wxLanguage languageId); //throw lngfile::ParsingError, parse_plural::ParsingError wxLanguage langId() const { return langId_; } @@ -69,16 +70,16 @@ private: }; -FFSTranslation::FFSTranslation(const std::wstring& filename, wxLanguage languageId) : langId_(languageId) //throw lngfile::ParsingError, parse_plural::ParsingError +FFSTranslation::FFSTranslation(const Zstring& filename, wxLanguage languageId) : langId_(languageId) //throw lngfile::ParsingError, parse_plural::ParsingError { std::string inputStream; try { - inputStream = loadStream(filename); //throw XmlFileError + inputStream = loadBinStream(filename); //throw FileError } - catch (const XmlFileError&) + catch (const FileError& e) { - throw lngfile::ParsingError(0, 0); + throw lngfile::ParsingError(e.toString(), 0, 0); //passing FileError is too high a level for Parsing error, OTOH user is unlikely to see this since file I/O issues are sorted out by ExistingTranslations()! } lngfile::TransHeader header; @@ -122,7 +123,7 @@ public: } virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) { return LINK_SKIP; } - virtual std::shared_ptr onDir(const Zchar* shortName, const Zstring& fullName) { return nullptr; } + virtual TraverseCallback* onDir(const Zchar* shortName, const Zstring& fullName) { return nullptr; } virtual HandleError reportDirError (const std::wstring& msg) { assert(false); return ON_ERROR_IGNORE; } //errors are not really critical in this context virtual HandleError reportItemError(const std::wstring& msg, const Zchar* shortName) { assert(false); return ON_ERROR_IGNORE; } // @@ -136,7 +137,7 @@ struct LessTranslation : public std::binary_function CFStringRef //output not owned! { return ::CFStringCreateWithCString(nullptr, //CFAllocatorRef alloc, @@ -182,7 +183,7 @@ ExistingTranslations::ExistingTranslations() newEntry.languageName = L"English (US)"; newEntry.languageFile = L""; newEntry.translatorName = L"Zenju"; - newEntry.languageFlag = L"usa.png"; + newEntry.languageFlag = L"flag_usa.png"; locMapping.push_back(newEntry); } @@ -196,30 +197,33 @@ ExistingTranslations::ExistingTranslations() for (auto it = lngFiles.begin(); it != lngFiles.end(); ++it) try { - std::string stream = loadStream(*it); //throw XmlFileError - try + const std::string stream = loadBinStream(utfCvrtTo(*it)); //throw FileError + + lngfile::TransHeader lngHeader; + lngfile::parseHeader(stream, lngHeader); //throw ParsingError + + assert(!lngHeader.languageName .empty()); + assert(!lngHeader.translatorName.empty()); + assert(!lngHeader.localeName .empty()); + assert(!lngHeader.flagFile .empty()); + /* + There is some buggy behavior in wxWidgets which maps "zh_TW" to simplified chinese. + Fortunately locales can be also entered as description. I changed to "Chinese (Traditional)" which works fine. + */ + if (const wxLanguageInfo* locInfo = wxLocale::FindLanguageInfo(utfCvrtTo(lngHeader.localeName))) { - lngfile::TransHeader lngHeader; - lngfile::parseHeader(stream, lngHeader); //throw ParsingError - - /* - There is some buggy behavior in wxWidgets which maps "zh_TW" to simplified chinese. - Fortunately locales can be also entered as description. I changed to "Chinese (Traditional)" which works fine. - */ - if (const wxLanguageInfo* locInfo = wxLocale::FindLanguageInfo(utfCvrtTo(lngHeader.localeName))) - { - ExistingTranslations::Entry newEntry; - newEntry.languageID = locInfo->Language; - newEntry.languageName = utfCvrtTo(lngHeader.languageName); - newEntry.languageFile = utfCvrtTo(*it); - newEntry.translatorName = utfCvrtTo(lngHeader.translatorName); - newEntry.languageFlag = utfCvrtTo(lngHeader.flagFile); - locMapping.push_back(newEntry); - } + ExistingTranslations::Entry newEntry; + newEntry.languageID = locInfo->Language; + newEntry.languageName = utfCvrtTo(lngHeader.languageName); + newEntry.languageFile = utfCvrtTo(*it); + newEntry.translatorName = utfCvrtTo(lngHeader.translatorName); + newEntry.languageFlag = utfCvrtTo(lngHeader.flagFile); + locMapping.push_back(newEntry); } - catch (lngfile::ParsingError&) { assert(false); } //better not show an error message here; scenario: batch jobs + else assert(false); } - catch (...) { assert(false); } + catch (FileError&) { assert(false); } + catch (lngfile::ParsingError&) { assert(false); } //better not show an error message here; scenario: batch jobs std::sort(locMapping.begin(), locMapping.end(), LessTranslation()); } @@ -397,6 +401,9 @@ public: const bool sysLangIsRTL = sysLngInfo ? sysLngInfo->LayoutDirection == wxLayout_RightToLeft : false; const bool selectedLangIsRTL = selLngInfo ? selLngInfo->LayoutDirection == wxLayout_RightToLeft : false; +#ifdef NDEBUG + 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! +#endif if (sysLangIsRTL == selectedLangIsRTL) locale->Init(wxLANGUAGE_DEFAULT); //use sys-lang to preserve sub-language specific rules (e.g. german swiss number punctation) else @@ -444,18 +451,19 @@ void zen::setLanguage(int language) //throw FileError else try { - zen::setTranslator(new FFSTranslation(languageFile, static_cast(language))); //throw lngfile::ParsingError, parse_plural::ParsingError + zen::setTranslator(new FFSTranslation(utfCvrtTo(languageFile), static_cast(language))); //throw lngfile::ParsingError, parse_plural::ParsingError } catch (lngfile::ParsingError& e) { throw FileError(replaceCpy(replaceCpy(replaceCpy(_("Error parsing file %x, row %y, column %z."), L"%x", fmtFileName(utfCvrtTo(languageFile))), - L"%y", numberTo(e.row + 1)), - L"%z", numberTo(e.col + 1))); + L"%y", numberTo(e.row_ + 1)), + L"%z", numberTo(e.col_ + 1)) + + L"\n\n" + e.msg_); } catch (parse_plural::ParsingError&) { - throw FileError(L"Invalid Plural Form"); + throw FileError(L"Invalid plural form definition"); //user should never see this! } //handle RTL swapping: we need wxWidgets to do this diff --git a/lib/osx_file_icon.h b/lib/osx_file_icon.h index e9b17988..5edfd740 100644 --- a/lib/osx_file_icon.h +++ b/lib/osx_file_icon.h @@ -8,7 +8,7 @@ #define OSX_FILE_ICON_8427508422345342 #include -#include +#include namespace osx { @@ -27,10 +27,10 @@ private: ImageData& operator=(const ImageData&); }; -ImageData getThumbnail(const char* filename, int requestedSize); //throw OsxError -ImageData getFileIcon (const char* filename, int requestedSize); //throw OsxError -ImageData getDefaultFileIcon (int requestedSize); //throw OsxError -ImageData getDefaultFolderIcon(int requestedSize); //throw OsxError +ImageData getThumbnail(const char* filename, int requestedSize); //throw SysError +ImageData getFileIcon (const char* filename, int requestedSize); //throw SysError +ImageData getDefaultFileIcon (int requestedSize); //throw SysError +ImageData getDefaultFolderIcon(int requestedSize); //throw SysError } #endif //OSX_FILE_ICON_8427508422345342 diff --git a/lib/osx_file_icon.mm b/lib/osx_file_icon.mm index 11fb053f..4db6642a 100644 --- a/lib/osx_file_icon.mm +++ b/lib/osx_file_icon.mm @@ -11,7 +11,7 @@ namespace { -osx::ImageData extractBytes(NSImage* nsImg, int requestedSize) //throw OsxError; NSException? +osx::ImageData extractBytes(NSImage* nsImg, int requestedSize) //throw SysError; NSException? { /* wxBitmap(NSImage*) is not good enough: it calls "[NSBitmapImageRep imageRepWithData:[img TIFFRepresentation]]" @@ -93,53 +93,53 @@ osx::ImageData extractBytes(NSImage* nsImg, int requestedSize) //throw OsxError; } -osx::ImageData osx::getThumbnail(const char* filename, int requestedSize) //throw OsxError +osx::ImageData osx::getThumbnail(const char* filename, int requestedSize) //throw SysError { @try { @autoreleasepool { NSString* nsFile = [NSString stringWithCString:filename encoding:NSUTF8StringEncoding]; - ZEN_OSX_ASSERT(nsFile != nil); //throw OsxError; can this fail? not documented + ZEN_OSX_ASSERT(nsFile != nil); //throw SysError; can this fail? not documented //stringWithCString returns string which is already set to autorelease! NSImage* nsImg = [[[NSImage alloc] initWithContentsOfFile:nsFile] autorelease]; ZEN_OSX_ASSERT(nsImg != nil); //may fail - return extractBytes(nsImg, requestedSize); //throw OsxError + return extractBytes(nsImg, requestedSize); //throw SysError } } - @catch (NSException* e) + @catch(NSException* e) { - throwOsxError(e); //throw OsxError + throwSysError(e); //throw SysError } } -osx::ImageData osx::getFileIcon(const char* filename, int requestedSize) //throw OsxError +osx::ImageData osx::getFileIcon(const char* filename, int requestedSize) //throw SysError { @try { @autoreleasepool { NSString* nsFile = [NSString stringWithCString:filename encoding:NSUTF8StringEncoding]; - ZEN_OSX_ASSERT(nsFile != nil); //throw OsxError; can this fail? not documented + ZEN_OSX_ASSERT(nsFile != nil); //throw SysError; can this fail? not documented //stringWithCString returns string which is already set to autorelease! NSImage* nsImg = [[NSWorkspace sharedWorkspace] iconForFile:nsFile]; ZEN_OSX_ASSERT(nsImg != nil); //can this fail? not documented - return extractBytes(nsImg, requestedSize); //throw OsxError + return extractBytes(nsImg, requestedSize); //throw SysError } } @catch (NSException* e) { - throwOsxError(e); //throw OsxError + throwSysError(e); //throw SysError } } -osx::ImageData osx::getDefaultFileIcon(int requestedSize) //throw OsxError +osx::ImageData osx::getDefaultFileIcon(int requestedSize) //throw SysError { @try { @@ -149,17 +149,17 @@ osx::ImageData osx::getDefaultFileIcon(int requestedSize) //throw OsxError //NSImage* nsImg = [[NSWorkspace sharedWorkspace] iconForFileType:@"dat"]; ZEN_OSX_ASSERT(nsImg != nil); //can this fail? not documented - return extractBytes(nsImg, requestedSize); //throw OsxError + return extractBytes(nsImg, requestedSize); //throw SysError } } @catch (NSException* e) { - throwOsxError(e); //throw OsxError + throwSysError(e); //throw SysError } } -osx::ImageData osx::getDefaultFolderIcon(int requestedSize) //throw OsxError +osx::ImageData osx::getDefaultFolderIcon(int requestedSize) //throw SysError { @try { @@ -169,11 +169,11 @@ osx::ImageData osx::getDefaultFolderIcon(int requestedSize) //throw OsxError //NSImage* nsImg = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericFolderIcon)]; ZEN_OSX_ASSERT(nsImg != nil); //may fail - return extractBytes(nsImg, requestedSize); //throw OsxError + return extractBytes(nsImg, requestedSize); //throw SysError } } @catch (NSException* e) { - throwOsxError(e); //throw OsxError + throwSysError(e); //throw SysError } } diff --git a/lib/parallel_scan.cpp b/lib/parallel_scan.cpp index 33d8174f..df8ff095 100644 --- a/lib/parallel_scan.cpp +++ b/lib/parallel_scan.cpp @@ -20,7 +20,7 @@ using namespace zen; namespace { /* -#ifdef FFS_WIN +#ifdef ZEN_WIN struct DiskInfo { @@ -288,7 +288,7 @@ public: handleSymlinks_(handleSymlinks), filterInstance(filter), failedDirReads_(failedDirReads), - failedItemReads_(failedItemReads), + failedItemReads_(failedItemReads), acb_(acb), threadID_(threadID) {} @@ -296,7 +296,7 @@ public: const HardFilter::FilterRef filterInstance; //always bound! std::set& failedDirReads_; - std::set& failedItemReads_; + std::set& failedItemReads_; AsyncCallback& acb_; const long threadID_; @@ -313,10 +313,11 @@ public: relNameParentPf_(relNameParentPf), output_(output) {} - virtual std::shared_ptr - onDir (const Zchar* shortName, const Zstring& fullName); virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details); virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details); + virtual TraverseCallback* onDir(const Zchar* shortName, const Zstring& fullName); + virtual void releaseDirTraverser(TraverseCallback* trav); + virtual HandleError reportDirError (const std::wstring& msg); virtual HandleError reportItemError(const std::wstring& msg, const Zchar* shortName); @@ -357,7 +358,7 @@ void DirCallback::onFile(const Zchar* shortName, const Zstring& fullName, const Linux: retrieveFileID takes about 50% longer in VM! (avoidable because of redundant stat() call!) */ - output_.addSubFile(fileNameShort, FileDescriptor(details.lastWriteTime, details.fileSize, details.id)); + output_.addSubFile(fileNameShort, FileDescriptor(details.lastWriteTime, details.fileSize, details.id, details.symlinkInfo != nullptr)); cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator } @@ -398,7 +399,7 @@ DirCallback::HandleLink DirCallback::onSymlink(const Zchar* shortName, const Zst } -std::shared_ptr DirCallback::onDir(const Zchar* shortName, const Zstring& fullName) +TraverseCallback* DirCallback::onDir(const Zchar* shortName, const Zstring& fullName) { boost::this_thread::interruption_point(); @@ -419,7 +420,14 @@ std::shared_ptr DirCallback::onDir(const Zchar* shortName, con if (passFilter) cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator - return std::make_shared(cfg, relName + FILE_NAME_SEPARATOR, subDir); + return new DirCallback(cfg, relName + FILE_NAME_SEPARATOR, subDir); //releaseDirTraverser() is guaranteed to be called in any case +} + + +void DirCallback::releaseDirTraverser(TraverseCallback* trav) +{ + TraverseCallback::releaseDirTraverser(trav); //no-op, introduce compile-time coupling + delete trav; } @@ -428,7 +436,7 @@ DirCallback::HandleError DirCallback::reportDirError(const std::wstring& msg) switch (cfg.acb_.reportError(msg)) { case FillBufferCallback::ON_ERROR_IGNORE: - cfg.failedDirReads_.insert(relNameParentPf_); + cfg.failedDirReads_.insert(relNameParentPf_); return ON_ERROR_IGNORE; case FillBufferCallback::ON_ERROR_RETRY: @@ -444,7 +452,7 @@ DirCallback::HandleError DirCallback::reportItemError(const std::wstring& msg, c switch (cfg.acb_.reportError(msg)) { case FillBufferCallback::ON_ERROR_IGNORE: - cfg.failedItemReads_.insert(relNameParentPf_ + shortName); + cfg.failedItemReads_.insert(relNameParentPf_ + shortName); return ON_ERROR_IGNORE; case FillBufferCallback::ON_ERROR_RETRY: @@ -455,7 +463,7 @@ DirCallback::HandleError DirCallback::reportItemError(const std::wstring& msg, c } -#ifdef FFS_WIN +#ifdef ZEN_WIN class DstHackCallbackImpl : public DstHackCallback { public: @@ -501,7 +509,7 @@ public: dirKey_.handleSymlinks_, //shared by all(!) instances of DirCallback while traversing a folder hierarchy dirKey_.filter_, dirOutput_.failedDirReads, - dirOutput_.failedItemReads, + dirOutput_.failedItemReads, *acb_); DirCallback traverser(travCfg, @@ -509,7 +517,7 @@ public: dirOutput_.dirCont); DstHackCallback* dstCallbackPtr = nullptr; -#ifdef FFS_WIN +#ifdef ZEN_WIN DstHackCallbackImpl dstCallback(*acb_, threadID_); dstCallbackPtr = &dstCallback; #endif diff --git a/lib/parallel_scan.h b/lib/parallel_scan.h index b7518428..c3806373 100644 --- a/lib/parallel_scan.h +++ b/lib/parallel_scan.h @@ -47,7 +47,7 @@ struct DirectoryValue { DirContainer dirCont; std::set failedDirReads; //relative postfixed names (or empty string for root) for directories that could not be read (completely), e.g. access denied, or temporal network drop - std::set failedItemReads; //relative postfixed names (never empty) for failure to read single file/dir/symlink + std::set failedItemReads; //relative postfixed names (never empty) for failure to read single file/dir/symlink }; diff --git a/lib/parse_lng.h b/lib/parse_lng.h index 48c7044b..8cd8e943 100644 --- a/lib/parse_lng.h +++ b/lib/parse_lng.h @@ -10,7 +10,6 @@ #include #include #include -//#include #include #include #include @@ -18,6 +17,7 @@ #include #include #include +#include #include #include #include "parse_plural.h" @@ -47,15 +47,16 @@ struct TransHeader struct ParsingError { - ParsingError(size_t rowNo, size_t colNo) : row(rowNo), col(colNo) {} - size_t row; //starting with 0 - size_t col; // + ParsingError(const std::wstring& msg, size_t row, size_t col) : msg_(msg), row_(row), col_(col) {} + std::wstring msg_; //parser error message + size_t row_; //starting with 0 + size_t col_; // }; void parseLng(const std::string& fileStream, TransHeader& header, TranslationMap& out, TranslationPluralMap& pluralOut); //throw ParsingError void parseHeader(const std::string& fileStream, TransHeader& header); //throw ParsingError -class TranslationList; //unordered list of unique translation items -std::string generateLng(const TranslationList& in, const TransHeader& header); +class TranslationUnorderedList; //unordered list of unique translation items +std::string generateLng(const TranslationUnorderedList& in, const TransHeader& header); @@ -76,45 +77,56 @@ std::string generateLng(const TranslationList& in, const TransHeader& header); //--------------------------- implementation --------------------------- -class TranslationList //unordered list of unique translation items +class TranslationUnorderedList //unordered list of unique translation items { public: - void addItem(const std::string& orig, const std::string& trans) + TranslationUnorderedList(TranslationMap&& transOld, TranslationPluralMap&& transPluralOld) : transOld_(std::move(transOld)), transPluralOld_(std::move(transPluralOld)) {} + + void addItem(const std::string& orig) { if (!transUnique.insert(orig).second) return; - sequence.push_back(std::make_shared(std::make_pair(orig, trans))); + auto it = transOld_.find(orig); + if (it != transOld_.end() && !it->second.empty()) //preserve old translation from .lng file if existing + sequence.push_back(std::make_shared(std::make_pair(orig, it->second))); + else + sequence.push_front(std::make_shared(std::make_pair(orig, std::string()))); //put untranslated items to the front of the .lng file } - void addPluralItem(const SingularPluralPair& orig, const PluralForms& trans) + + void addItem(const SingularPluralPair& orig) { if (!pluralUnique.insert(orig).second) return; - sequence.push_back(std::make_shared(std::make_pair(orig, trans))); + auto it = transPluralOld_.find(orig); + if (it != transPluralOld_.end() && !it->second.empty()) //preserve old translation from .lng file if existing + sequence.push_back(std::make_shared(std::make_pair(orig, it->second))); + else + sequence.push_front(std::make_shared(std::make_pair(orig, PluralForms()))); //put untranslated items to the front of the .lng file } - bool untranslatedTextExists() const + bool untranslatedTextExists() const { return std::any_of(sequence.begin(), sequence.end(), [](const std::shared_ptr& item) { return !item->hasTranslation(); }); } + + template + void visitItems(Function onTrans, Function2 onPluralTrans) const //onTrans takes (const TranslationMap::value_type&), onPluralTrans takes (const TranslationPluralMap::value_type&) { for (auto it = sequence.begin(); it != sequence.end(); ++it) - if (const TranslationList::RegularItem* regular = dynamic_cast(it->get())) - { - if (regular->value.second.empty()) - return true; - } - else if (const TranslationList::PluralItem* plural = dynamic_cast(it->get())) - if (plural->value.second.empty()) - return true; - return false; + if (auto regular = dynamic_cast(it->get())) + onTrans(regular->value); + else if (auto plural = dynamic_cast(it->get())) + onPluralTrans(plural->value); + else assert(false); } private: - friend std::string generateLng(const TranslationList& in, const TransHeader& header); + struct Item { virtual ~Item() {} virtual bool hasTranslation() const = 0; }; + struct RegularItem : public Item { RegularItem(const TranslationMap ::value_type& val) : value(val) {} virtual bool hasTranslation() const { return !value.second.empty(); } TranslationMap ::value_type value; }; + struct PluralItem : public Item { PluralItem (const TranslationPluralMap::value_type& val) : value(val) {} virtual bool hasTranslation() const { return !value.second.empty(); } TranslationPluralMap::value_type value; }; - struct Item { virtual ~Item() {} }; - struct RegularItem : public Item { RegularItem(const TranslationMap ::value_type& val) : value(val) {} TranslationMap ::value_type value; }; - struct PluralItem : public Item { PluralItem (const TranslationPluralMap::value_type& val) : value(val) {} TranslationPluralMap::value_type value; }; - - std::vector> sequence; //ordered list of translation elements + std::list> sequence; //ordered list of translation elements std::set transUnique; //check uniqueness std::set pluralUnique; // + + const TranslationMap transOld_; //reuse existing translation + const TranslationPluralMap transPluralOld_; // }; @@ -179,18 +191,18 @@ private: //header information tokens.insert(std::make_pair(Token::TK_HEADER_BEGIN, "
")); tokens.insert(std::make_pair(Token::TK_HEADER_END, "
")); - tokens.insert(std::make_pair(Token::TK_LANG_NAME_BEGIN, "")); - tokens.insert(std::make_pair(Token::TK_LANG_NAME_END, "")); + tokens.insert(std::make_pair(Token::TK_LANG_NAME_BEGIN, "")); + tokens.insert(std::make_pair(Token::TK_LANG_NAME_END, "")); tokens.insert(std::make_pair(Token::TK_TRANS_NAME_BEGIN, "")); tokens.insert(std::make_pair(Token::TK_TRANS_NAME_END, "")); tokens.insert(std::make_pair(Token::TK_LOCALE_NAME_BEGIN, "")); tokens.insert(std::make_pair(Token::TK_LOCALE_NAME_END, "")); - tokens.insert(std::make_pair(Token::TK_FLAG_FILE_BEGIN, "")); - tokens.insert(std::make_pair(Token::TK_FLAG_FILE_END, "")); - tokens.insert(std::make_pair(Token::TK_PLURAL_COUNT_BEGIN, "")); - tokens.insert(std::make_pair(Token::TK_PLURAL_COUNT_END, "")); - tokens.insert(std::make_pair(Token::TK_PLURAL_DEF_BEGIN, "")); - tokens.insert(std::make_pair(Token::TK_PLURAL_DEF_END, "")); + tokens.insert(std::make_pair(Token::TK_FLAG_FILE_BEGIN, "")); + tokens.insert(std::make_pair(Token::TK_FLAG_FILE_END, "")); + tokens.insert(std::make_pair(Token::TK_PLURAL_COUNT_BEGIN, "")); + tokens.insert(std::make_pair(Token::TK_PLURAL_COUNT_END, "")); + tokens.insert(std::make_pair(Token::TK_PLURAL_DEF_BEGIN, "")); + tokens.insert(std::make_pair(Token::TK_PLURAL_DEF_END, "")); //item level tokens.insert(std::make_pair(Token::TK_SRC_BEGIN, "")); @@ -317,7 +329,7 @@ public: } catch (const parse_plural::InvalidPluralForm&) { - throw ParsingError(scn.posRow(), scn.posCol()); + throw ParsingError(L"Invalid plural form definition", scn.posRow(), scn.posCol()); } } @@ -421,7 +433,7 @@ private: void validateTranslation(const std::string& original, const std::string& translation) //throw ParsingError { if (original.empty()) - throw ParsingError(scn.posRow(), scn.posCol()); + throw ParsingError(L"Source translation is empty", scn.posRow(), scn.posCol()); if (!translation.empty()) { @@ -430,31 +442,36 @@ private: { if (zen::contains(original, placeholder) && !zen::contains(translation, placeholder)) - throw ParsingError(scn.posRow(), scn.posCol()); + throw ParsingError(zen::replaceCpy(L"Placeholder %x missing in translation", L"%x", zen::utfCvrtTo(placeholder)), scn.posRow(), scn.posCol()); }; checkPlaceholder("%x"); checkPlaceholder("%y"); checkPlaceholder("%z"); + + //if source contains ampersand to mark menu accellerator key, so must translation + if (hasSingleAmpersand(original) && !hasSingleAmpersand(translation)) + throw ParsingError(L"Translation is missing the & character to mark an access key for the menu item", scn.posRow(), scn.posCol()); } } void validateTranslation(const SingularPluralPair& original, const PluralForms& translation, const parse_plural::PluralFormInfo& pluralInfo) //throw ParsingError { + using namespace zen; //check the primary placeholder is existing at least for the second english text - if (!zen::contains(original.second, "%x")) - throw ParsingError(scn.posRow(), scn.posCol()); + if (!contains(original.second, "%x")) + throw ParsingError(L"Plural form source does not contain %x placeholder", scn.posRow(), scn.posCol()); if (!translation.empty()) { //check for invalid number of plural forms if (pluralInfo.getCount() != static_cast(translation.size())) - throw ParsingError(scn.posRow(), scn.posCol()); + throw ParsingError(replaceCpy(replaceCpy(L"Invalid number of plural forms; actual: %x, expected: %y", L"%x", numberTo(translation.size())), L"%y", numberTo(pluralInfo.getCount())), scn.posRow(), scn.posCol()); //ensure the placeholder is used when needed int pos = 0; for (auto it = translation.begin(); it != translation.end(); ++it, ++pos) - if (!pluralInfo.isSingleNumberForm(pos) && !zen::contains(*it, "%x")) - throw ParsingError(scn.posRow(), scn.posCol()); + if (!pluralInfo.isSingleNumberForm(pos) && !contains(*it, "%x")) + throw ParsingError(replaceCpy(L"Plural form at index position %y is missing the %x placeholder", L"%y", numberTo(pos)), scn.posRow(), scn.posCol()); auto checkSecondaryPlaceholder = [&](const std::string& placeholder) { @@ -464,11 +481,11 @@ private: { if (!zen::contains(original.first, placeholder) || !zen::contains(original.second, placeholder)) - throw ParsingError(scn.posRow(), scn.posCol()); + throw ParsingError(zen::replaceCpy(L"Placeholder %x missing in plural form source", L"%x", zen::utfCvrtTo(placeholder)), scn.posRow(), scn.posCol()); //secondary placeholder is required for all plural forms if (!std::all_of(translation.begin(), translation.end(), [&](const std::string& pform) { return zen::contains(pform, placeholder); })) - throw ParsingError(scn.posRow(), scn.posCol()); + throw ParsingError(zen::replaceCpy(L"Placeholder %x missing in plural form translation", L"%x", zen::utfCvrtTo(placeholder)), scn.posRow(), scn.posCol()); } }; @@ -477,6 +494,24 @@ private: } } + static bool hasSingleAmpersand(const std::string& str) + { + size_t pos = 0; + for (;;) + { + pos = str.find('&', pos); + if (pos == std::string::npos) + return false; + + bool freeBefore = pos == 0 || str[pos - 1] != '&'; + bool freeAfter = pos >= str.size() - 1 || str[pos + 1] != '&'; //str.size() > 0 here! + + if (freeBefore && freeAfter) //make sure to not catch && which windows resolves as just one & for display! + return true; + ++pos; + } + } + void nextToken() { tk = scn.nextToken(); } const Token& token() const { return tk; } @@ -489,7 +524,7 @@ private: void expectToken(Token::Type t) //throw ParsingError { if (token().type != t) - throw ParsingError(scn.posRow(), scn.posCol()); + throw ParsingError(L"Unexpected token", scn.posRow(), scn.posCol()); } Scanner scn; @@ -529,7 +564,7 @@ void formatMultiLineText(std::string& text) } -std::string generateLng(const TranslationList& in, const TransHeader& header) +std::string generateLng(const TranslationUnorderedList& in, const TransHeader& header) { std::string out; //header @@ -564,66 +599,55 @@ std::string generateLng(const TranslationList& in, const TransHeader& header) out += '\n'; - //items - for (auto it = in.sequence.begin(); it != in.sequence.end(); ++it) + in.visitItems([&](const TranslationMap::value_type& trans) { - const TranslationList::RegularItem* regular = dynamic_cast(it->get()); - const TranslationList::PluralItem* plural = dynamic_cast(it->get()); + std::string original = trans.first; + std::string translation = trans.second; - if (regular) - { - std::string original = regular->value.first; - std::string translation = regular->value.second; + formatMultiLineText(original); + formatMultiLineText(translation); - formatMultiLineText(original); - formatMultiLineText(translation); + out += KnownTokens::text(Token::TK_SRC_BEGIN); + out += original; + out += KnownTokens::text(Token::TK_SRC_END) + '\n'; - out += KnownTokens::text(Token::TK_SRC_BEGIN); - out += original; - out += KnownTokens::text(Token::TK_SRC_END) + '\n'; - - out += KnownTokens::text(Token::TK_TRG_BEGIN); - out += translation; - out += KnownTokens::text(Token::TK_TRG_END) + '\n' + '\n'; - - } - else if (plural) + out += KnownTokens::text(Token::TK_TRG_BEGIN); + out += translation; + out += KnownTokens::text(Token::TK_TRG_END) + '\n' + '\n'; + }, + [&](const TranslationPluralMap::value_type& transPlural) + { + std::string engSingular = transPlural.first.first; + std::string engPlural = transPlural.first.second; + const PluralForms& forms = transPlural.second; + + formatMultiLineText(engSingular); + formatMultiLineText(engPlural); + + out += KnownTokens::text(Token::TK_SRC_BEGIN) + '\n'; + out += KnownTokens::text(Token::TK_PLURAL_BEGIN); + out += engSingular; + out += KnownTokens::text(Token::TK_PLURAL_END) + '\n'; + out += KnownTokens::text(Token::TK_PLURAL_BEGIN); + out += engPlural; + out += KnownTokens::text(Token::TK_PLURAL_END) + '\n'; + out += KnownTokens::text(Token::TK_SRC_END) + '\n'; + + out += KnownTokens::text(Token::TK_TRG_BEGIN); + if (!forms.empty()) out += '\n'; + + for (PluralForms::const_iterator j = forms.begin(); j != forms.end(); ++j) { - std::string engSingular = plural->value.first.first; - std::string engPlural = plural->value.first.second; - const PluralForms& forms = plural->value.second; - - formatMultiLineText(engSingular); - formatMultiLineText(engPlural); + std::string plForm = *j; + formatMultiLineText(plForm); - out += KnownTokens::text(Token::TK_SRC_BEGIN) + '\n'; out += KnownTokens::text(Token::TK_PLURAL_BEGIN); - out += engSingular; + out += plForm; out += KnownTokens::text(Token::TK_PLURAL_END) + '\n'; - out += KnownTokens::text(Token::TK_PLURAL_BEGIN); - out += engPlural; - out += KnownTokens::text(Token::TK_PLURAL_END) + '\n'; - out += KnownTokens::text(Token::TK_SRC_END) + '\n'; - - out += KnownTokens::text(Token::TK_TRG_BEGIN); - if (!forms.empty()) out += '\n'; - - for (PluralForms::const_iterator j = forms.begin(); j != forms.end(); ++j) - { - std::string plForm = *j; - formatMultiLineText(plForm); - - out += KnownTokens::text(Token::TK_PLURAL_BEGIN); - out += plForm; - out += KnownTokens::text(Token::TK_PLURAL_END) + '\n'; - } - out += KnownTokens::text(Token::TK_TRG_END) + '\n' + '\n'; - } - else - { - throw std::logic_error("that's what you get for brittle design ;)"); } - } + out += KnownTokens::text(Token::TK_TRG_END) + '\n' + '\n'; + }); + assert(!zen::contains(out, "\r\n") && !zen::contains(out, "\r")); return zen::replaceCpy(out, '\n', "\r\n"); //back to win line endings } diff --git a/lib/parse_plural.h b/lib/parse_plural.h index bb32f81f..e9e04dbc 100644 --- a/lib/parse_plural.h +++ b/lib/parse_plural.h @@ -460,7 +460,7 @@ PluralFormInfo::PluralFormInfo(const std::string& definition, int pluralCount) / inline -PluralForm::PluralForm(const std::string& stream) : expr(implementation::Parser(stream, n_).parse()) {} //throw ParsingError +PluralForm::PluralForm(const std::string& stream) : expr(implementation::Parser(stream, n_).parse()) {} //throw ParsingError } #endif // PARSE_PLURAL_H_INCLUDED \ No newline at end of file diff --git a/lib/process_xml.cpp b/lib/process_xml.cpp index 78a40159..2422b2ef 100644 --- a/lib/process_xml.cpp +++ b/lib/process_xml.cpp @@ -47,17 +47,16 @@ XmlType getXmlType(const zen::XmlDoc& doc) //throw() XmlType xmlAccess::getXmlType(const Zstring& filename) //throw() { - XmlDoc doc; try { //do NOT use zen::loadStream as it will superfluously load even huge files! - loadXmlDocument(filename, doc); //throw FfsXmlError, quick exit if file is not an FFS XML + XmlDoc doc = loadXmlDocument(filename); //throw FfsXmlError, quick exit if file is not an FFS XML + return ::getXmlType(doc); } catch (const FfsXmlError&) { return XML_TYPE_OTHER; } - return ::getXmlType(doc); } @@ -1122,8 +1121,7 @@ bool needsMigration(const XmlDoc& doc, int currentXmlFormatVer) template void readConfig(const Zstring& filename, XmlType type, ConfigType& cfg, int currentXmlFormatVer, bool& needMigration) //throw FfsXmlError { - XmlDoc doc; - loadXmlDocument(filename, doc); //throw FfsXmlError + XmlDoc doc = loadXmlDocument(filename); //throw FfsXmlError if (getXmlType(doc) != type) //throw() throw FfsXmlError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filename))); @@ -1209,8 +1207,7 @@ void xmlAccess::readAnyConfig(const std::vector& filenames, XmlGuiConfi const Zstring& filename = *it; const bool firstItem = it == filenames.begin(); //init all non-"mainCfg" settings with first config file - XmlDoc doc; - loadXmlDocument(filename, doc); //throw FfsXmlError + XmlDoc doc = loadXmlDocument(filename); //throw FfsXmlError //do NOT use zen::loadStream as it will superfluously load even huge files! switch (::getXmlType(doc)) @@ -1220,8 +1217,7 @@ void xmlAccess::readAnyConfig(const std::vector& filenames, XmlGuiConfi XmlGuiConfig guiCfg = parseConfig(doc, filename, XML_FORMAT_VER_FFS_GUI, warning); //nothrow if (firstItem) config = guiCfg; - else - mainCfgs.push_back(guiCfg.mainCfg); + mainCfgs.push_back(guiCfg.mainCfg); } break; @@ -1230,8 +1226,7 @@ void xmlAccess::readAnyConfig(const std::vector& filenames, XmlGuiConfi XmlBatchConfig batchCfg = parseConfig(doc, filename, XML_FORMAT_VER_FFS_BATCH, warning); //nothrow if (firstItem) config = convertBatchToGui(batchCfg); - else - mainCfgs.push_back(batchCfg.mainCfg); + mainCfgs.push_back(batchCfg.mainCfg); } break; @@ -1240,7 +1235,6 @@ void xmlAccess::readAnyConfig(const std::vector& filenames, XmlGuiConfi throw FfsXmlError(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(filename))); } } - mainCfgs.push_back(config.mainCfg); //save cfg from first line config.mainCfg = merge(mainCfgs); diff --git a/lib/process_xml.h b/lib/process_xml.h index 626fafe0..95fa644d 100644 --- a/lib/process_xml.h +++ b/lib/process_xml.h @@ -175,17 +175,17 @@ struct XmlGlobalSettings cfgFileHistMax(30), folderHistMax(15), onCompletionHistoryMax(8), -#ifdef FFS_WIN +#ifdef ZEN_WIN defaultExclusionFilter(Zstr("\\System Volume Information\\") Zstr("\n") Zstr("\\$Recycle.Bin\\") Zstr("\n") Zstr("\\RECYCLER\\") Zstr("\n") Zstr("\\RECYCLED\\") Zstr("\n") Zstr("*\\desktop.ini") Zstr("\n") Zstr("*\\thumbs.db")), -#elif defined FFS_LINUX +#elif defined ZEN_LINUX defaultExclusionFilter(Zstr("/.Trash-*/") Zstr("\n") Zstr("/.recycle/")), -#elif defined FFS_MAC +#elif defined ZEN_MAC defaultExclusionFilter(Zstr("/.fseventsd/") Zstr("\n") Zstr("/.Spotlight-V100/") Zstr("\n") Zstr("/.Trashes/") Zstr("\n") @@ -194,9 +194,9 @@ struct XmlGlobalSettings #endif //deleteOnBothSides(false), useRecyclerForManualDeletion(true), //enable if OS supports it; else user will have to activate first and then get an error message -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC textSearchRespectCase(false), -#elif defined FFS_LINUX +#elif defined ZEN_LINUX textSearchRespectCase(true), #endif showIcons(true), @@ -204,16 +204,16 @@ struct XmlGlobalSettings lastUpdateCheck(0) { //default external apps will be translated "on the fly"!!! First entry will be used for [Enter] or mouse double-click! -#ifdef FFS_WIN +#ifdef ZEN_WIN externelApplications.push_back(std::make_pair(L"Show in Explorer", L"explorer /select, \"%item_path%\"")); externelApplications.push_back(std::make_pair(L"Open with default application", L"\"%item_path%\"")); //mark for extraction: _("Show in Explorer") //mark for extraction: _("Open with default application") -#elif defined FFS_LINUX +#elif defined ZEN_LINUX externelApplications.push_back(std::make_pair(L"Browse directory", L"xdg-open \"%item_folder%\"")); externelApplications.push_back(std::make_pair(L"Open with default application", L"xdg-open \"%item_path%\"")); //mark for extraction: _("Browse directory") Linux doesn't use the term "folder" -#elif defined FFS_MAC +#elif defined ZEN_MAC externelApplications.push_back(std::make_pair(L"Browse directory", L"open -R \"%item_path%\"")); externelApplications.push_back(std::make_pair(L"Open with default application", L"open \"%item_path%\"")); #endif diff --git a/lib/resolve_path.cpp b/lib/resolve_path.cpp index bf6f99a2..035e1d77 100644 --- a/lib/resolve_path.cpp +++ b/lib/resolve_path.cpp @@ -4,9 +4,10 @@ #include #include #include +#include #include //wxGetEnv -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include #include //includes "windows.h" @@ -16,8 +17,9 @@ #pragma comment(lib, "Mpr.lib") #endif -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include //getenv() +#include //getcwd #endif using namespace zen; @@ -25,24 +27,25 @@ using namespace zen; namespace { -#ifdef FFS_WIN +#ifdef ZEN_WIN Zstring resolveRelativePath(const Zstring& relativeName) //note: ::GetFullPathName() is documented not threadsafe! { - const DWORD bufferSize = 10000; - std::vector buffer(bufferSize); - //don't use long path prefix! does not work with relative paths "." and ".." - const DWORD charsWritten = ::GetFullPathName(relativeName.c_str(), //__in LPCTSTR lpFileName, - bufferSize, //__in DWORD nBufferLength, - &buffer[0], //__out LPTSTR lpBuffer, - nullptr); //__out LPTSTR *lpFilePart - if (charsWritten == 0 || charsWritten >= bufferSize) //theoretically, charsWritten cannot be == "bufferSize" - return relativeName; //ERROR! Don't do anything - - return Zstring(&buffer[0], charsWritten); + const DWORD bufferSize = ::GetFullPathName(relativeName.c_str(), 0, nullptr, nullptr); + if (bufferSize > 0) + { + std::vector buffer(bufferSize); + const DWORD charsWritten = ::GetFullPathName(relativeName.c_str(), //__in LPCTSTR lpFileName, + bufferSize, //__in DWORD nBufferLength, + &buffer[0], //__out LPTSTR lpBuffer, + nullptr); //__out LPTSTR *lpFilePart + if (0 < charsWritten && charsWritten < bufferSize) //theoretically, charsWritten can never be == "bufferSize" + return Zstring(&buffer[0], charsWritten); + } + return relativeName; //ERROR! Don't do anything } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC Zstring resolveRelativePath(const Zstring& relativeName) { //http://linux.die.net/man/2/path_resolution @@ -69,16 +72,18 @@ Zstring resolveRelativePath(const Zstring& relativeName) } //we cannot use ::realpath() since it resolves *existing* relative paths only! - std::vector buffer(10000); - if (::getcwd(&buffer[0], buffer.size()) != nullptr) - return appendSeparator(&buffer[0]) + relativeName; + if (char* dirpath = ::getcwd(nullptr, 0)) + { + ZEN_ON_SCOPE_EXIT(::free(dirpath)); + return appendSeparator(dirpath) + relativeName; + } } return relativeName; } #endif -#ifdef FFS_WIN +#ifdef ZEN_WIN class CsidlConstants { public: @@ -273,7 +278,7 @@ std::unique_ptr resolveMacro(const Zstring& macro, //macro without %-ch if (std::unique_ptr value = getEnvironmentVar(macro)) return value; -#ifdef FFS_WIN +#ifdef ZEN_WIN //try to resolve as CSIDL value { const auto& csidlMap = CsidlConstants::get(); @@ -316,8 +321,8 @@ Zstring zen::expandMacros(const Zstring& text) { return ::expandMacros(text, std namespace { -#ifdef FFS_WIN -//networks and cdrom excluded - this should not block +#ifdef ZEN_WIN +//networks and cdrom excluded - may still block for slow USB sticks! Zstring getPathByVolumenName(const Zstring& volumeName) //return empty string on error { //FindFirstVolume(): traverses volumes on local hard disks only! @@ -412,11 +417,11 @@ Zstring expandVolumeName(const Zstring& text) // [volname]:\folder [volna rest = afterFirst(rest, Zstr(':')); if (startsWith(rest, FILE_NAME_SEPARATOR)) rest = afterFirst(rest, FILE_NAME_SEPARATOR); -#ifdef FFS_WIN +#ifdef ZEN_WIN //[.*] pattern was found... if (!volname.empty()) { - Zstring volPath = getPathByVolumenName(volname); //should not block?! + Zstring volPath = getPathByVolumenName(volname); //may block for slow USB sticks! if (!volPath.empty()) return appendSeparator(volPath) + rest; //successfully replaced pattern } @@ -430,7 +435,7 @@ Zstring expandVolumeName(const Zstring& text) // [volname]:\folder [volna C:\Program Files\FreeFileSync\[FFS USB]\FreeFileSync\ */ return L"?:\\[" + volname + L"]\\" + rest; -#elif defined FFS_LINUX || defined FFS_MAC //neither supported nor needed +#elif defined ZEN_LINUX || defined ZEN_MAC //neither supported nor needed return "/.../[" + volname + "]/" + rest; #endif } @@ -442,8 +447,8 @@ Zstring expandVolumeName(const Zstring& text) // [volname]:\folder [volna void getDirectoryAliasesRecursive(const Zstring& dirname, std::set& output) { -#ifdef FFS_WIN - //1. replace volume path by volume name: c:\dirname -> [SYSTEM]\dirname +#ifdef ZEN_WIN + //1. replace volume path by volume name: c:\dirname -> [SYSTEM]\dirname if (dirname.size() >= 3 && std::iswalpha(dirname[0]) && dirname[1] == L':' && @@ -473,7 +478,7 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set value = getEnvironmentVar(envName)) envToDir.insert(std::make_pair(envName, *value)); }; -#ifdef FFS_WIN +#ifdef ZEN_WIN addEnvVar(L"AllUsersProfile"); // C:\ProgramData addEnvVar(L"AppData"); // C:\Users\\AppData\Roaming addEnvVar(L"LocalAppData"); // C:\Users\\AppData\Local @@ -491,19 +496,19 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set Mac: /Users/ #endif //substitute paths by symbolic names auto pathStartsWith = [](const Zstring& path, const Zstring& prefix) -> bool { -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC Zstring tmp = path; Zstring tmp2 = prefix; ::makeUpper(tmp); ::makeUpper(tmp2); return startsWith(tmp, tmp2); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX return startsWith(path, prefix); #endif }; @@ -557,7 +562,7 @@ Zstring zen::getFormattedDirectoryName(const Zstring& dirString) // throw() return Zstring(); dirname = expandMacros(dirname); - dirname = expandVolumeName(dirname); //should not block + dirname = expandVolumeName(dirname); //may block for slow USB sticks! /* need to resolve relative paths: @@ -575,7 +580,7 @@ Zstring zen::getFormattedDirectoryName(const Zstring& dirString) // throw() } -#ifdef FFS_WIN +#ifdef ZEN_WIN void zen::loginNetworkShare(const Zstring& dirnameOrig, bool allowUserInteraction) //throw() - user interaction: show OS password prompt { /* diff --git a/lib/resolve_path.h b/lib/resolve_path.h index 4e85c8ee..b9c7196f 100644 --- a/lib/resolve_path.h +++ b/lib/resolve_path.h @@ -19,14 +19,14 @@ FULL directory format: - convert relative paths into absolute - trim whitespace and append file name separator */ -Zstring getFormattedDirectoryName(const Zstring& dirString); //throw() - non-blocking! no I/O! not thread-safe!!!(see ::GetFullPathName()) +Zstring getFormattedDirectoryName(const Zstring& dirString); //throw() - may still block for slow USB sticks! not thread-safe!!!(see ::GetFullPathName()) //macro substitution only Zstring expandMacros(const Zstring& text); -std::vector getDirectoryAliases(const Zstring& dirString); +std::vector getDirectoryAliases(const Zstring& dirString); //may block for slow USB sticks when resolving [] -#ifdef FFS_WIN +#ifdef ZEN_WIN //*blocks* if network is not reachable or when showing login prompt dialog! void loginNetworkShare(const Zstring& dirname, bool allowUserInteraction); //throw() - user interaction: show OS password prompt #endif diff --git a/lib/resources.cpp b/lib/resources.cpp index 6f48e2e1..6deaf0ec 100644 --- a/lib/resources.cpp +++ b/lib/resources.cpp @@ -69,19 +69,19 @@ GlobalResources::GlobalResources() else if (name == L"wink.gif") loadAnimFromZip(resourceFile, aniWink); else if (name == L"working.gif") - loadAnimFromZip(resourceFile, aniSync); + loadAnimFromZip(resourceFile, aniWorking); } } -#ifdef FFS_WIN +#ifdef ZEN_WIN //for compatibility it seems we need to stick with a "real" icon programIconFFS = wxIcon(L"A_FFS_ICON"); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX //attention: make sure to not implicitly call "instance()" again => deadlock on Linux programIconFFS.CopyFromBitmap(getImage(L"FreeFileSync")); //use big logo bitmap for better quality -#elif defined FFS_MAC +#elif defined ZEN_MAC assert(getImage(L"FreeFileSync").GetWidth () == getImage(L"FreeFileSync").GetHeight() && getImage(L"FreeFileSync").GetWidth() % 128 == 0); //wxWidgets' bitmap to icon conversion on OS X can only deal with very specific sizes diff --git a/lib/resources.h b/lib/resources.h index df651eaa..1cb05f20 100644 --- a/lib/resources.h +++ b/lib/resources.h @@ -22,7 +22,7 @@ public: //global image resource objects wxAnimation aniWink; - wxAnimation aniSync; + wxAnimation aniWorking; wxIcon programIconFFS; private: diff --git a/lib/shadow.cpp b/lib/shadow.cpp index 4bb299ac..1161646e 100644 --- a/lib/shadow.cpp +++ b/lib/shadow.cpp @@ -53,20 +53,20 @@ public: //VSS does not support running under WOW64 except for Windows XP and Windows Server 2003 //reference: http://msdn.microsoft.com/en-us/library/aa384627(VS.85).aspx if (runningWOW64()) - throw FileError(_("Cannot access Volume Shadow Copy Service.") + L"\n" + + throw FileError(_("Cannot access Volume Shadow Copy Service."), _("Please use FreeFileSync 64-bit version to create shadow copies on this system.")); //check if shadow copy dll was loaded correctly if (!createShadowCopy || !releaseShadowCopy || !getShadowVolume || !getLastError) - throw FileError(_("Cannot access Volume Shadow Copy Service.") + L"\n" + + throw FileError(_("Cannot access Volume Shadow Copy Service."), replaceCpy(_("Cannot load file %x."), L"%x", fmtFileName(getDllName()))); //--------------------------------------------------------------------------------------------------------- //start volume shadow copy service: backupHandle = createShadowCopy(volumeNamePf.c_str()); if (!backupHandle) - throw FileError(_("Cannot access Volume Shadow Copy Service.") + L"\n" + - getLastError() + L" Volume: " + fmtFileName(volumeNamePf)); + throw FileError(_("Cannot access Volume Shadow Copy Service."), + getLastError() + std::wstring(L" Volume: ") + fmtFileName(volumeNamePf)); shadowVolPf = appendSeparator(getShadowVolume(backupHandle)); //shadowVolName NEVER has a trailing backslash } @@ -96,7 +96,7 @@ Zstring ShadowCopy::makeShadowCopy(const Zstring& inputFile, const std::function //try to resolve symlinks and junctions: //1. symlinks: we need to retrieve the target path, else we would just return a symlink on a VSS volume while the target outside were still locked! - //2. junctions: C:\Users\ is a junction that may link to e.g. D:\Users\, so GetVolumePathName() returns "D:\" => "Volume name %x not part of file name %y!" + //2. junctions: C:\Users\ is a junction that may link to e.g. D:\Users\, so GetVolumePathName() returns "D:\" => "Volume name %x not part of file name %y." if (wereVistaOrLater) filenameFinal = getResolvedFilePath(inputFile); //throw FileError; requires Vista or later! //-> returns paths with \\?\ prefix! => make sure to avoid duplicate shadow copies for volume paths with/without prefix @@ -106,7 +106,7 @@ Zstring ShadowCopy::makeShadowCopy(const Zstring& inputFile, const std::function if (!::GetVolumePathName(filenameFinal.c_str(), //__in LPCTSTR lpszFileName, &volBuffer[0], //__out LPTSTR lpszVolumePathName, bufferSize)) //__in DWORD cchBufferLength - throw FileError(replaceCpy(_("Path %x does not contain a volume name."), L"%x", fmtFileName(filenameFinal))); + throw FileError(replaceCpy(_("Cannot determine volume name for %x."), L"%x", fmtFileName(filenameFinal)), formatSystemError(L"GetVolumePathName", ::GetLastError())); const Zstring volumeNamePf = appendSeparator(&volBuffer[0]); //msdn: if buffer is 1 char too short, GetVolumePathName() may skip last separator without error! @@ -114,7 +114,7 @@ Zstring ShadowCopy::makeShadowCopy(const Zstring& inputFile, const std::function const size_t pos = filenameFinal.find(volumeNamePf); //filenameFinal needs NOT to begin with volumeNamePf: consider for example \\?\ prefix! if (pos == Zstring::npos) { - std::wstring msg = _("Volume name %x not part of file name %y!"); + std::wstring msg = _("Volume name %x not part of file name %y."); replace(msg, L"%x", fmtFileName(volumeNamePf), false); replace(msg, L"%y", fmtFileName(filenameFinal), false); throw FileError(msg); diff --git a/lib/shadow.h b/lib/shadow.h index f59d7753..36c72c25 100644 --- a/lib/shadow.h +++ b/lib/shadow.h @@ -13,7 +13,6 @@ #include #include - namespace shadow { class ShadowCopy //take and buffer Windows Volume Shadow Copy snapshots as needed diff --git a/lib/versioning.cpp b/lib/versioning.cpp index a5bd17be..1bf5a65e 100644 --- a/lib/versioning.cpp +++ b/lib/versioning.cpp @@ -73,7 +73,7 @@ namespace - create target super directories if missing */ template -void moveItemToVersioning(const Zstring& sourceObj, //throw FileError +void moveItemToVersioning(const Zstring& fullName, //throw FileError const Zstring& relativeName, const Zstring& versioningDirectory, const Zstring& timestamp, @@ -82,37 +82,36 @@ void moveItemToVersioning(const Zstring& sourceObj, //throw FileError { assert(!startsWith(relativeName, FILE_NAME_SEPARATOR)); assert(!endsWith (relativeName, FILE_NAME_SEPARATOR)); - assert(endsWith(sourceObj, relativeName)); //usually, yes, but we might relax this in the future - Zstring targetObj; + Zstring targetName; switch (versioningStyle) { case VER_STYLE_REPLACE: - targetObj = appendSeparator(versioningDirectory) + relativeName; + targetName = appendSeparator(versioningDirectory) + relativeName; break; case VER_STYLE_ADD_TIMESTAMP: //assemble time-stamped version name - targetObj = appendSeparator(versioningDirectory) + relativeName + Zstr(' ') + timestamp + getExtension(relativeName); - assert(impl::isMatchingVersion(afterLast(relativeName, FILE_NAME_SEPARATOR), afterLast(targetObj, FILE_NAME_SEPARATOR))); //paranoid? no! + targetName = appendSeparator(versioningDirectory) + relativeName + Zstr(' ') + timestamp + getExtension(relativeName); + assert(impl::isMatchingVersion(afterLast(relativeName, FILE_NAME_SEPARATOR), afterLast(targetName, FILE_NAME_SEPARATOR))); //paranoid? no! break; } try { - moveObj(sourceObj, targetObj); //throw FileError + moveObj(fullName, targetName); //throw FileError } catch (FileError&) //expected to fail if target directory is not yet existing! { - if (!somethingExists(sourceObj)) //no source at all is not an error (however a directory as source when a file is expected, *is* an error!) + if (!somethingExists(fullName)) //no source at all is not an error (however a directory as source when a file is expected, *is* an error!) return; //object *not* processed //create intermediate directories if missing - const Zstring targetDir = beforeLast(targetObj, FILE_NAME_SEPARATOR); + const Zstring targetDir = beforeLast(targetName, FILE_NAME_SEPARATOR); if (!dirExists(targetDir)) //->(minor) file system race condition! { makeDirectory(targetDir); //throw FileError - moveObj(sourceObj, targetObj); //throw FileError -> this should work now! + moveObj(fullName, targetName); //throw FileError -> this should work now! } else throw; @@ -126,36 +125,45 @@ void moveItemToVersioning(const Zstring& sourceObj, //throw FileError template void moveObject(const Zstring& sourceFile, //throw FileError const Zstring& targetFile, - Function copyDelete) //fallback if move failed; may throw FileError + Function copyDelete) //throw FileError; fallback if move failed { assert(!dirExists(sourceFile) || symlinkExists(sourceFile)); //we process files and symlinks only + auto removeTarget = [&]() + { + //remove target object + if (fileExists(targetFile)) //file or symlink + removeFile(targetFile); //throw FileError + else if (dirExists(targetFile)) //directory or symlink + removeDirectory(targetFile); //throw FileError + //we do not expect targetFile to be a directory in general => no callback required + else assert(false); + }; + //first try to move directly without copying - bool targetExisting = false; try { renameFile(sourceFile, targetFile); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting return; //great, we get away cheaply! } //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the file) - catch (const ErrorDifferentVolume&) {} - catch (const ErrorTargetExisting&) { targetExisting = true; } - - if (!targetExisting) - targetExisting = somethingExists(targetFile); - - //remove target object - if (targetExisting) + catch (const ErrorDifferentVolume&) { - if (fileExists(targetFile)) //file or symlink - removeFile(targetFile); //throw FileError - else if (dirExists(targetFile)) //directory or symlink - removeDirectory(targetFile); //throw FileError - //we do not expect targetFile to be a directory in general => no callback required - else assert(false); + removeTarget(); //throw FileError + copyDelete(); // + } + catch (const ErrorTargetExisting&) + { + removeTarget(); //throw FileError + try + { + renameFile(sourceFile, targetFile); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting + } + catch (const ErrorDifferentVolume&) + { + copyDelete(); //throw FileError + } } - - copyDelete(); } @@ -219,7 +227,7 @@ private: return LINK_SKIP; } - virtual std::shared_ptr onDir(const Zchar* shortName, const Zstring& fullName) + virtual TraverseCallback* onDir(const Zchar* shortName, const Zstring& fullName) { dirs_.push_back(shortName); return nullptr; //DON'T traverse into subdirs; moveDirectory works recursively! @@ -234,7 +242,7 @@ private: } -bool FileVersioner::revisionFile(const Zstring& sourceFile, const Zstring& relativeName, CallbackMoveFile& callback) //throw FileError +bool FileVersioner::revisionFile(const Zstring& fullName, const Zstring& relativeName, CallbackMoveFile& callback) //throw FileError { struct CallbackMoveFileImpl : public CallbackMoveDir { @@ -246,15 +254,15 @@ bool FileVersioner::revisionFile(const Zstring& sourceFile, const Zstring& relat CallbackMoveFile& callback_; } cb(callback); - return revisionFileImpl(sourceFile, relativeName, cb); //throw FileError + return revisionFileImpl(fullName, relativeName, cb); //throw FileError } -bool FileVersioner::revisionFileImpl(const Zstring& sourceFile, const Zstring& relativeName, CallbackMoveDir& callback) //throw FileError +bool FileVersioner::revisionFileImpl(const Zstring& fullName, const Zstring& relativeName, CallbackMoveDir& callback) //throw FileError { bool moveSuccessful = false; - moveItemToVersioning(sourceFile, //throw FileError + moveItemToVersioning(fullName, //throw FileError relativeName, versioningDirectory_, timeStamp_, @@ -280,23 +288,23 @@ bool FileVersioner::revisionFileImpl(const Zstring& sourceFile, const Zstring& r } -void FileVersioner::revisionDir(const Zstring& sourceDir, const Zstring& relativeName, CallbackMoveDir& callback) //throw FileError +void FileVersioner::revisionDir(const Zstring& fullName, const Zstring& relativeName, CallbackMoveDir& callback) //throw FileError { //no error situation if directory is not existing! manual deletion relies on it! - if (!somethingExists(sourceDir)) + if (!somethingExists(fullName)) return; //neither directory nor any other object (e.g. broken symlink) with that name existing - revisionDirImpl(sourceDir, relativeName, callback); //throw FileError + revisionDirImpl(fullName, relativeName, callback); //throw FileError } -void FileVersioner::revisionDirImpl(const Zstring& sourceDir, const Zstring& relativeName, CallbackMoveDir& callback) //throw FileError +void FileVersioner::revisionDirImpl(const Zstring& fullName, const Zstring& relativeName, CallbackMoveDir& callback) //throw FileError { - assert(somethingExists(sourceDir)); //[!] + assert(somethingExists(fullName)); //[!] //create target - if (symlinkExists(sourceDir)) //on Linux there is just one type of symlink, and since we do revision file symlinks, we should revision dir symlinks as well! + if (symlinkExists(fullName)) //on Linux there is just one type of symlink, and since we do revision file symlinks, we should revision dir symlinks as well! { - moveItemToVersioning(sourceDir, //throw FileError + moveItemToVersioning(fullName, //throw FileError relativeName, versioningDirectory_, timeStamp_, @@ -310,7 +318,7 @@ void FileVersioner::revisionDirImpl(const Zstring& sourceDir, const Zstring& rel else { assert(!startsWith(relativeName, FILE_NAME_SEPARATOR)); - assert(endsWith(sourceDir, relativeName)); //usually, yes, but we might relax this in the future + assert(endsWith(fullName, relativeName)); //usually, yes, but we might relax this in the future const Zstring targetDir = appendSeparator(versioningDirectory_) + relativeName; //makeDirectory(targetDir); //FileError -> create only when needed in moveFileToVersioning(); avoids empty directories @@ -320,17 +328,17 @@ void FileVersioner::revisionDirImpl(const Zstring& sourceDir, const Zstring& rel std::vector dirList; // { TraverseFilesOneLevel tol(fileList, dirList); //throw FileError - traverseFolder(sourceDir, tol); // + traverseFolder(fullName, tol); // } - const Zstring sourceDirPf = appendSeparator(sourceDir); + const Zstring fullNamePf = appendSeparator(fullName); const Zstring relnamePf = appendSeparator(relativeName); //move files std::for_each(fileList.begin(), fileList.end(), [&](const Zstring& shortname) { - revisionFileImpl(sourceDirPf + shortname, //throw FileError + revisionFileImpl(fullNamePf + shortname, //throw FileError relnamePf + shortname, callback); }); @@ -339,14 +347,14 @@ void FileVersioner::revisionDirImpl(const Zstring& sourceDir, const Zstring& rel std::for_each(dirList.begin(), dirList.end(), [&](const Zstring& shortname) { - revisionDirImpl(sourceDirPf + shortname, //throw FileError + revisionDirImpl(fullNamePf + shortname, //throw FileError relnamePf + shortname, callback); }); //delete source - callback.onBeforeDirMove(sourceDir, targetDir); - removeDirectory(sourceDir); //throw FileError + callback.onBeforeDirMove(fullName, targetDir); + removeDirectory(fullName); //throw FileError } } @@ -427,7 +435,7 @@ void FileVersioner::limitVersions(std::function updateUI) //throw FileEr } catch (FileError&) { -#ifdef FFS_WIN //if it's a directory symlink: +#ifdef ZEN_WIN //if it's a directory symlink: if (symlinkExists(fullnameVer) && dirExists(fullnameVer)) removeDirectory(fullnameVer); //throw FileError else diff --git a/lib/versioning.h b/lib/versioning.h index faa96359..33dc31c4 100644 --- a/lib/versioning.h +++ b/lib/versioning.h @@ -46,14 +46,14 @@ public: throw FileError(_("Failure to create timestamp for versioning:") + L" \'" + timeStamp_ + L"\'"); } - bool revisionFile(const Zstring& sourceFile, const Zstring& relativeName, CallbackMoveFile& callback); //throw FileError; return "false" if file is not existing - void revisionDir (const Zstring& sourceDir, const Zstring& relativeName, CallbackMoveDir& callback); //throw FileError + bool revisionFile(const Zstring& fullName, const Zstring& relativeName, CallbackMoveFile& callback); //throw FileError; return "false" if file is not existing + void revisionDir (const Zstring& fullName, const Zstring& relativeName, CallbackMoveDir& callback); //throw FileError //void limitVersions(std::function updateUI); //throw FileError; call when done revisioning! private: - bool revisionFileImpl(const Zstring& sourceFile, const Zstring& relativeName, CallbackMoveDir& callback); //throw FileError - void revisionDirImpl (const Zstring& sourceDir, const Zstring& relativeName, CallbackMoveDir& callback); //throw FileError + bool revisionFileImpl(const Zstring& fullName, const Zstring& relativeName, CallbackMoveDir& callback); //throw FileError + void revisionDirImpl (const Zstring& fullName, const Zstring& relativeName, CallbackMoveDir& callback); //throw FileError const VersioningStyle versioningStyle_; const Zstring versioningDirectory_; diff --git a/lib/xml_base.cpp b/lib/xml_base.cpp index f5091cd6..123060f4 100644 --- a/lib/xml_base.cpp +++ b/lib/xml_base.cpp @@ -14,7 +14,7 @@ using namespace zen; //loadXmlDocument vs loadStream: //1. better error reporting //2. quick exit if (potentially large) input file is not an XML -void xmlAccess::loadXmlDocument(const Zstring& filename, XmlDoc& doc) //throw FfsXmlError +XmlDoc xmlAccess::loadXmlDocument(const Zstring& filename) //throw FfsXmlError { std::string stream; try @@ -51,7 +51,7 @@ void xmlAccess::loadXmlDocument(const Zstring& filename, XmlDoc& doc) //throw Ff try { - zen::parse(stream, doc); //throw XmlParsingError + return zen::parse(stream); //throw XmlParsingError } catch (const XmlParsingError& e) { diff --git a/lib/xml_base.h b/lib/xml_base.h index ceaf609b..85d4dfa1 100644 --- a/lib/xml_base.h +++ b/lib/xml_base.h @@ -11,7 +11,7 @@ #include #include -//bind zenxml and zen file handling together +//bind zen::Xml and zen file handling together namespace xmlAccess { @@ -34,7 +34,7 @@ private: }; void saveXmlDocument(const zen::XmlDoc& doc, const Zstring& filename); //throw FfsXmlError -void loadXmlDocument(const Zstring& filename, zen::XmlDoc& doc); //throw FfsXmlError +zen::XmlDoc loadXmlDocument(const Zstring& filename); //throw FfsXmlError const std::wstring getErrorMessageFormatted(const std::vector& failedElements); } diff --git a/structures.cpp b/structures.cpp index e94793d6..1bcfd580 100644 --- a/structures.cpp +++ b/structures.cpp @@ -33,11 +33,11 @@ std::wstring zen::getVariantName(DirectionConfig::Variant var) switch (var) { case DirectionConfig::AUTOMATIC: - return _("<- Two way ->"); + return L"<- " + _("Two way") + L" ->"; case DirectionConfig::MIRROR: - return _("Mirror ->>"); + return _("Mirror") + L" ->>"; case DirectionConfig::UPDATE: - return _("Update ->"); + return _("Update") + L" ->"; case DirectionConfig::CUSTOM: return _("Custom"); } @@ -207,7 +207,7 @@ assert_static(std::numeric_limits::is_specialized); int daysSinceBeginOfWeek(int dayOfWeek) //0-6, 0=Monday, 6=Sunday { assert(0 <= dayOfWeek && dayOfWeek <= 6); -#ifdef FFS_WIN +#ifdef ZEN_WIN DWORD firstDayOfWeek = 0; if (::GetLocaleInfo(LOCALE_USER_DEFAULT, //__in LCID Locale, LOCALE_IFIRSTDAYOFWEEK | // first day of week specifier, 0-6, 0=Monday, 6=Sunday diff --git a/synchronization.cpp b/synchronization.cpp index f03da9f0..783f1e7f 100644 --- a/synchronization.cpp +++ b/synchronization.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "lib/resolve_path.h" #include "lib/db_file.h" #include "lib/dir_exist_async.h" @@ -25,7 +26,7 @@ #include "lib/status_handler_impl.h" #include "lib/versioning.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include #include "lib/shadow.h" @@ -60,7 +61,7 @@ void SyncStatistics::init() SyncStatistics::SyncStatistics(const FolderComparison& folderCmp) { init(); - std::for_each(begin(folderCmp), end(folderCmp), [&](const BaseDirMapping& baseMap) { recurse(baseMap); }); + std::for_each(begin(folderCmp), end(folderCmp), [&](const BaseDirPair& baseDirObj) { recurse(baseDirObj); }); } @@ -71,7 +72,7 @@ SyncStatistics::SyncStatistics(const HierarchyObject& hierObj) } -SyncStatistics::SyncStatistics(const FileMapping& fileObj) +SyncStatistics::SyncStatistics(const FilePair& fileObj) { init(); calcStats(fileObj); @@ -82,9 +83,9 @@ SyncStatistics::SyncStatistics(const FileMapping& fileObj) inline void SyncStatistics::recurse(const HierarchyObject& hierObj) { - std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](const DirMapping& dirObj ) { calcStats(dirObj ); }); - std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](const FileMapping& fileObj) { calcStats(fileObj); }); - std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](const SymLinkMapping& linkObj) { calcStats(linkObj); }); + std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](const DirPair& dirObj ) { calcStats(dirObj ); }); + std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](const FilePair& fileObj) { calcStats(fileObj); }); + std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](const SymlinkPair& linkObj) { calcStats(linkObj); }); rowsTotal += hierObj.refSubDirs(). size(); rowsTotal += hierObj.refSubFiles().size(); @@ -93,7 +94,7 @@ void SyncStatistics::recurse(const HierarchyObject& hierObj) inline -void SyncStatistics::calcStats(const FileMapping& fileObj) +void SyncStatistics::calcStats(const FilePair& fileObj) { switch (fileObj.getSyncOperation()) //evaluate comparison result and sync direction { @@ -157,7 +158,7 @@ void SyncStatistics::calcStats(const FileMapping& fileObj) inline -void SyncStatistics::calcStats(const SymLinkMapping& linkObj) +void SyncStatistics::calcStats(const SymlinkPair& linkObj) { switch (linkObj.getSyncOperation()) //evaluate comparison result and sync direction { @@ -204,7 +205,7 @@ void SyncStatistics::calcStats(const SymLinkMapping& linkObj) inline -void SyncStatistics::calcStats(const DirMapping& dirObj) +void SyncStatistics::calcStats(const DirPair& dirObj) { switch (dirObj.getSyncOperation()) //evaluate comparison result and sync direction { @@ -324,26 +325,18 @@ public: //clean-up temporary directory (recycle bin optimization) void tryCleanup(bool allowUserCallback = true); //throw FileError -> call this in non-exceptional coding, i.e. somewhere after sync! - template void removeFileUpdating(const Zstring& relativeName, Int64 bytesExpected, Function notifyItemDeletion); //throw FileError - template void removeDirUpdating (const Zstring& relativeName, Int64 bytesExpected, Function notifyItemDeletion); //reports ONLY data delta via updateProcessedData()! - template void removeLinkUpdating(const Zstring& relativeName, Int64 bytesExpected, Function notifyItemDeletion); // + template void removeFileUpdating(const Zstring& fullName, const Zstring& relativeName, const Int64& bytesExpected, Function notifyItemDeletion); //throw FileError + template void removeDirUpdating (const Zstring& fullName, const Zstring& relativeName, const Int64& bytesExpected, Function notifyItemDeletion); //reports ONLY data delta via updateProcessedData()! + template void removeLinkUpdating(const Zstring& fullName, const Zstring& relativeName, const Int64& bytesExpected, Function notifyItemDeletion); // const std::wstring& getTxtRemovingFile () const { return txtRemovingFile; } // const std::wstring& getTxtRemovingSymLink() const { return txtRemovingSymlink; } //buffered status texts const std::wstring& getTxtRemovingDir () const { return txtRemovingDirectory; } // - //evaluate whether a deletion will actually free space within a volume - bool deletionFreesSpace() const; -#ifdef FFS_WIN - bool recyclerFallbackOnDelete() const { return recFallbackDelPermantently; } -#endif - private: DeletionHandling(const DeletionHandling&); DeletionHandling& operator=(const DeletionHandling&); - void setDeletionPolicy(DeletionPolicy newPolicy); - FileVersioner& getOrCreateVersioner() //throw FileError! => dont create in DeletionHandling()!!! { if (!versioner.get()) @@ -357,16 +350,14 @@ private: const VersioningStyle versioningStyle_; const TimeComp timeStamp_; -#ifdef FFS_WIN +#ifdef ZEN_WIN Zstring getOrCreateRecyclerTempDirPf(); //throw FileError Zstring recyclerTmpDir; //temporary folder holding files/folders for *deferred* recycling std::vector toBeRecycled; //full path of files located in temporary folder, waiting for batch-recycling - - bool recFallbackDelPermantently; #endif //magage three states: allow dynamic fallback from recycler to permanent deletion - DeletionPolicy deletionPolicy_; + const DeletionPolicy deletionPolicy_; std::unique_ptr versioner; //used for DELETE_TO_VERSIONING; throw FileError in constructor => create on demand! //buffer status texts: @@ -377,23 +368,6 @@ private: bool cleanedUp; }; -namespace -{ -#ifdef FFS_WIN -//recycleBinStatus() blocks seriously if recycle bin is really full and drive is slow -StatusRecycler recycleBinStatusUpdating(const Zstring& dirname, ProcessCallback& procCallback) -{ - procCallback.reportStatus(replaceCpy(_("Checking recycle bin availability for folder %x..."), L"%x", fmtFileName(dirname), false)); - - auto ft = async([=] { return recycleBinStatus(dirname); }); - - while (!ft.timed_wait(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL / 2))) - procCallback.requestUiRefresh(); //may throw! - return ft.get(); -} -#endif -} - DeletionHandling::DeletionHandling(DeletionPolicy handleDel, //nothrow! const Zstring& versioningDir, @@ -406,29 +380,9 @@ DeletionHandling::DeletionHandling(DeletionPolicy handleDel, //nothrow! versioningDir_(versioningDir), versioningStyle_(versioningStyle), timeStamp_(timeStamp), -#ifdef FFS_WIN - recFallbackDelPermantently(false), -#endif - deletionPolicy_(DELETE_TO_RECYCLER), + deletionPolicy_(handleDel), cleanedUp(false) { -#ifdef FFS_WIN - if (!baseDirPf.empty()) - if (handleDel == DELETE_TO_RECYCLER && recycleBinStatusUpdating(baseDirPf, procCallback_) != STATUS_REC_EXISTS) - { - handleDel = DELETE_PERMANENTLY; //Windows' ::SHFileOperation() will do this anyway, but we have a better and faster deletion routine (e.g. on networks) - recFallbackDelPermantently = true; - } -#endif - - setDeletionPolicy(handleDel); -} - - -void DeletionHandling::setDeletionPolicy(DeletionPolicy newPolicy) -{ - deletionPolicy_ = newPolicy; - switch (deletionPolicy_) { case DELETE_PERMANENTLY: @@ -451,7 +405,8 @@ void DeletionHandling::setDeletionPolicy(DeletionPolicy newPolicy) } } -#ifdef FFS_WIN + +#ifdef ZEN_WIN namespace { class CallbackMassRecycling : public CallbackRecycling @@ -533,7 +488,7 @@ void DeletionHandling::tryCleanup(bool allowUserCallback) //throw FileError break; case DELETE_TO_RECYCLER: -#ifdef FFS_WIN +#ifdef ZEN_WIN if (!recyclerTmpDir.empty()) { //move content of temporary directory to recycle bin in a single call @@ -636,11 +591,10 @@ private: template -void DeletionHandling::removeDirUpdating(const Zstring& relativeName, Int64 bytesExpected, Function notifyItemDeletion) //throw FileError +void DeletionHandling::removeDirUpdating(const Zstring& fullName, + const Zstring& relativeName, + const Int64& bytesExpected, Function notifyItemDeletion) //throw FileError { - assert(!baseDirPf_.empty()); - const Zstring fullName = baseDirPf_ + relativeName; - Int64 bytesReported; ScopeGuard guardStatistics = makeGuard([&] { procCallback_.updateTotalData(0, bytesReported); }); //error = unexpected increase of total workload @@ -655,22 +609,29 @@ void DeletionHandling::removeDirUpdating(const Zstring& relativeName, Int64 byte case DELETE_TO_RECYCLER: { -#ifdef FFS_WIN +#ifdef ZEN_WIN const Zstring targetDir = getOrCreateRecyclerTempDirPf() + relativeName; //throw FileError bool deleted = false; auto moveToTempDir = [&] { - //performance optimization: Instead of moving each object into recycle bin separately, - //we rename them one by one into a temporary directory and batch-recycle this directory after sync - renameFile(fullName, targetDir); //throw FileError - this->toBeRecycled.push_back(targetDir); - deleted = true; + try + { + //performance optimization: Instead of moving each object into recycle bin separately, + //we rename them one by one into a temporary directory and batch-recycle this directory after sync + renameFile(fullName, targetDir); //throw FileError, ErrorDifferentVolume + this->toBeRecycled.push_back(targetDir); + deleted = true; + } + catch (ErrorDifferentVolume&) //MoveFileEx() returns ERROR_PATH_NOT_FOUND *before* considering ERROR_NOT_SAME_DEVICE! => we have to create targetDir in any case! + { + deleted = recycleOrDelete(fullName); //throw FileError + } }; try { - moveToTempDir(); //throw FileError + moveToTempDir(); //throw FileError, ErrorDifferentVolume } catch (FileError&) { @@ -686,7 +647,7 @@ void DeletionHandling::removeDirUpdating(const Zstring& relativeName, Int64 byte throw; } } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC const bool deleted = recycleOrDelete(fullName); //throw FileError #endif if (deleted) @@ -710,11 +671,10 @@ void DeletionHandling::removeDirUpdating(const Zstring& relativeName, Int64 byte template -void DeletionHandling::removeFileUpdating(const Zstring& relativeName, Int64 bytesExpected, Function notifyItemDeletion) //throw FileError +void DeletionHandling::removeFileUpdating(const Zstring& fullName, + const Zstring& relativeName, + const Int64& bytesExpected, Function notifyItemDeletion) //throw FileError { - assert(!baseDirPf_.empty()); - const Zstring fullName = baseDirPf_ + relativeName; - Int64 bytesReported; auto guardStatistics = makeGuard([&] { procCallback_.updateTotalData(0, bytesReported); }); //error = unexpected increase of total workload bool deleted = false; @@ -726,22 +686,29 @@ void DeletionHandling::removeFileUpdating(const Zstring& relativeName, Int64 byt break; case DELETE_TO_RECYCLER: -#ifdef FFS_WIN +#ifdef ZEN_WIN { const Zstring targetFile = getOrCreateRecyclerTempDirPf() + relativeName; //throw FileError auto moveToTempDir = [&] { - //performance optimization: Instead of moving each object into recycle bin separately, - //we rename them one by one into a temporary directory and batch-recycle this directory after sync - renameFile(fullName, targetFile); //throw FileError - this->toBeRecycled.push_back(targetFile); - deleted = true; + try + { + //performance optimization: Instead of moving each object into recycle bin separately, + //we rename them one by one into a temporary directory and batch-recycle this directory after sync + renameFile(fullName, targetFile); //throw FileError, ErrorDifferentVolume + this->toBeRecycled.push_back(targetFile); + deleted = true; + } + catch (ErrorDifferentVolume&) //MoveFileEx() returns ERROR_PATH_NOT_FOUND *before* considering ERROR_NOT_SAME_DEVICE! => we have to create targetDir in any case! + { + deleted = recycleOrDelete(fullName); //throw FileError + } }; try { - moveToTempDir(); //throw FileError + moveToTempDir(); //throw FileError, ErrorDifferentVolume } catch (FileError&) { @@ -758,7 +725,7 @@ void DeletionHandling::removeFileUpdating(const Zstring& relativeName, Int64 byt } } } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC deleted = recycleOrDelete(fullName); //throw FileError #endif break; @@ -794,66 +761,46 @@ void DeletionHandling::removeFileUpdating(const Zstring& relativeName, Int64 byt procCallback_.updateTotalData(0, bytesReported - bytesExpected); //noexcept! } + template inline -void DeletionHandling::removeLinkUpdating(const Zstring& relativeName, Int64 bytesExpected, Function notifyItemDeletion) //throw FileError +void DeletionHandling::removeLinkUpdating(const Zstring& fullName, const Zstring& relativeName, const Int64& bytesExpected, Function notifyItemDeletion) //throw FileError { - const Zstring fullName = baseDirPf_ + relativeName; switch (getSymlinkType(fullName)) { case SYMLINK_TYPE_DIR: - return removeDirUpdating(relativeName, bytesExpected, notifyItemDeletion); //throw FileError + return removeDirUpdating(fullName, relativeName, bytesExpected, notifyItemDeletion); //throw FileError case SYMLINK_TYPE_FILE: case SYMLINK_TYPE_UNKNOWN: - return removeFileUpdating(relativeName, bytesExpected, notifyItemDeletion); //throw FileError - } -} - - -//evaluate whether a deletion will actually free space within a volume -bool DeletionHandling::deletionFreesSpace() const -{ - switch (deletionPolicy_) - { - case DELETE_PERMANENTLY: - return true; - case DELETE_TO_RECYCLER: - return false; //in general... (unless Recycle Bin is full) - case DELETE_TO_VERSIONING: - switch (zen::onSameVolume(baseDirPf_, versioningDir_)) - { - case IS_SAME_YES: - return false; - case IS_SAME_NO: - return true; //but other volume (versioningDir) may become full... - case IS_SAME_CANT_SAY: - return true; //a rough guess! - } + return removeFileUpdating(fullName, relativeName, bytesExpected, notifyItemDeletion); //throw FileError } - assert(false); - return true; } //------------------------------------------------------------------------------------------------------------ namespace { -class DiskSpaceNeeded +/* + DELETE_PERMANENTLY: deletion frees space + DELETE_TO_RECYCLER: won't free space until recycler is full, but then frees space + DELETE_TO_VERSIONING: depends on whether versioning folder is on a different volume +-> if deleted item is a followed symlink, no space is freed +-> created/updated/deleted item may be on a different volume than base directory: consider symlinks, junctions! + +=> generally assume deletion frees space; may avoid false positive disk space warnings for recycler and versioning +*/ +class MinimumDiskSpaceNeeded { public: - static std::pair calculate(const BaseDirMapping& baseObj, bool freeSpaceDelLeft, bool freeSpaceDelRight) + static std::pair calculate(const BaseDirPair& baseObj) { - DiskSpaceNeeded inst(baseObj, freeSpaceDelLeft, freeSpaceDelRight); + MinimumDiskSpaceNeeded inst; + inst.recurse(baseObj); return std::make_pair(inst.spaceNeededLeft, inst.spaceNeededRight); } private: - DiskSpaceNeeded(const BaseDirMapping& baseObj, bool freeSpaceDelLeft, bool freeSpaceDelRight) : - freeSpaceDelLeft_(freeSpaceDelLeft), - freeSpaceDelRight_(freeSpaceDelRight) - { - recurse(baseObj); - } + MinimumDiskSpaceNeeded() {} void recurse(const HierarchyObject& hierObj) { @@ -872,24 +819,24 @@ private: break; case SO_DELETE_LEFT: - if (freeSpaceDelLeft_) - spaceNeededLeft -= to(it->getFileSize()); + //if (freeSpaceDelLeft_) + spaceNeededLeft -= to(it->getFileSize()); break; case SO_DELETE_RIGHT: - if (freeSpaceDelRight_) - spaceNeededRight -= to(it->getFileSize()); + //if (freeSpaceDelRight_) + spaceNeededRight -= to(it->getFileSize()); break; case SO_OVERWRITE_LEFT: - if (freeSpaceDelLeft_) - spaceNeededLeft -= to(it->getFileSize()); + //if (freeSpaceDelLeft_) + spaceNeededLeft -= to(it->getFileSize()); spaceNeededLeft += to(it->getFileSize()); break; case SO_OVERWRITE_RIGHT: - if (freeSpaceDelRight_) - spaceNeededRight -= to(it->getFileSize()); + //if (freeSpaceDelRight_) + spaceNeededRight -= to(it->getFileSize()); spaceNeededRight += to(it->getFileSize()); break; @@ -914,9 +861,6 @@ private: // recurse(subDir); } - const bool freeSpaceDelLeft_; - const bool freeSpaceDelRight_; - Int64 spaceNeededLeft; Int64 spaceNeededRight; }; @@ -930,13 +874,13 @@ public: bool verifyCopiedFiles, bool copyFilePermissions, bool transactionalFileCopy, -#ifdef FFS_WIN +#ifdef ZEN_WIN shadow::ShadowCopy* shadowCopyHandler, #endif DeletionHandling& delHandlingLeft, DeletionHandling& delHandlingRight) : procCallback_(procCallback), -#ifdef FFS_WIN +#ifdef ZEN_WIN shadowCopyHandler_(shadowCopyHandler), #endif delHandlingLeft_(delHandlingLeft), @@ -954,11 +898,11 @@ public: txtMovingFile (_("Moving file %x to %y")) {} - void startSync(BaseDirMapping& baseMap) + void startSync(BaseDirPair& baseDirObj) { - runZeroPass(baseMap); //first process file moves - runPass(baseMap); //delete files (or overwrite big ones with smaller ones) - runPass(baseMap); //copy rest + runZeroPass(baseDirObj); //first process file moves + runPass(baseDirObj); //delete files (or overwrite big ones with smaller ones) + runPass(baseDirObj); //copy rest } private: @@ -969,28 +913,28 @@ private: PASS_NEVER //skip }; - static PassId getPass(const FileMapping& fileObj); - static PassId getPass(const SymLinkMapping& linkObj); - static PassId getPass(const DirMapping& dirObj); + static PassId getPass(const FilePair& fileObj); + static PassId getPass(const SymlinkPair& linkObj); + static PassId getPass(const DirPair& dirObj); template - void prepare2StepMove(FileMapping& sourceObj, FileMapping& targetObj); //throw FileError + void prepare2StepMove(FilePair& sourceObj, FilePair& targetObj); //throw FileError bool createParentDir(FileSystemObject& fsObj); //throw FileError template - void manageFileMove(FileMapping& sourceObj, FileMapping& targetObj); //throw FileError + void manageFileMove(FilePair& sourceObj, FilePair& targetObj); //throw FileError void runZeroPass(HierarchyObject& hierObj); template void runPass(HierarchyObject& hierObj); - void synchronizeFile(FileMapping& fileObj); - template void synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp); + void synchronizeFile(FilePair& fileObj); + template void synchronizeFileInt(FilePair& fileObj, SyncOperation syncOp); - void synchronizeLink(SymLinkMapping& linkObj); - template void synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp); + void synchronizeLink(SymlinkPair& linkObj); + template void synchronizeLinkInt(SymlinkPair& linkObj, SyncOperation syncOp); - void synchronizeFolder(DirMapping& dirObj); - template void synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp); + void synchronizeFolder(DirPair& dirObj); + template void synchronizeFolderInt(DirPair& dirObj, SyncOperation syncOp); void reportStatus(const std::wstring& rawText, const Zstring& objname) const { procCallback_.reportStatus(replaceCpy(rawText, L"%x", fmtFileName(objname))); }; void reportInfo (const std::wstring& rawText, const Zstring& objname) const { procCallback_.reportInfo (replaceCpy(rawText, L"%x", fmtFileName(objname))); }; @@ -1001,15 +945,15 @@ private: procCallback_.reportInfo(replaceCpy(replaceCpy(rawText, L"%x", L"\n" + fmtFileName(objname1)), L"%y", L"\n" + fmtFileName(objname2))); }; - template - FileAttrib copyFileUpdatingTo(const FileMapping& fileObj, Function delTargetCommand) const; //throw FileError; reports data delta via updateProcessedData() + template + FileAttrib copyFileUpdating(const Zstring& sourceFile, const Zstring& targetFile, const Int64& bytesExpected, Function delTargetCommand) const; //throw FileError; reports data delta via updateProcessedData() void verifyFileCopy(const Zstring& source, const Zstring& target) const; template DeletionHandling& getDelHandling(); ProcessCallback& procCallback_; -#ifdef FFS_WIN +#ifdef ZEN_WIN shadow::ShadowCopy* shadowCopyHandler_; //optional! #endif DeletionHandling& delHandlingLeft_; @@ -1070,11 +1014,11 @@ III) c -> d caveat: move-sequence needs to be processed in correct order! namespace { -template inline -bool haveNameClash(const Zstring& shortname, Mapping& m) +template inline +bool haveNameClash(const Zstring& shortname, List& m) { return std::any_of(m.begin(), m.end(), - [&](const typename Mapping::value_type& obj) { return EqualFilename()(obj.getObjShortName(), shortname); }); + [&](const typename List::value_type& obj) { return EqualFilename()(obj.getObjShortName(), shortname); }); } @@ -1092,8 +1036,8 @@ Zstring findUnusedTempName(const Zstring& filename) template -void SynchronizeFolderPair::prepare2StepMove(FileMapping& sourceObj, - FileMapping& targetObj) //throw FileError +void SynchronizeFolderPair::prepare2StepMove(FilePair& sourceObj, + FilePair& targetObj) //throw FileError { const Zstring& source = sourceObj.getFullName(); const Zstring& tmpTarget = findUnusedTempName(sourceObj.getBaseDirPf() + sourceObj.getShortName()); @@ -1103,20 +1047,20 @@ void SynchronizeFolderPair::prepare2StepMove(FileMapping& sourceObj, reportInfo(txtMovingFile, source, tmpTarget); - warn_static("was wenn diff volume: symlink aliasing!") //throw FileError, ErrorDifferentVolume, ErrorTargetExisting + warn_static("was wenn diff volume: symlink aliasing!") //throw FileError, ErrorDifferentVolume, ErrorTargetExisting renameFile(source, tmpTarget); //throw FileError //update file hierarchy - const FileDescriptor descrSource(sourceObj.getLastWriteTime(), - sourceObj.getFileSize (), - sourceObj.getFileId ()); - - sourceObj.removeObject(); + const FileDescriptor descrSource(sourceObj.getLastWriteTime (), + sourceObj.getFileSize (), + sourceObj.getFileId (), + sourceObj.isFollowedSymlink()); - FileMapping& tempFile = sourceObj.root().addSubFile(afterLast(tmpTarget, FILE_NAME_SEPARATOR), descrSource); - static_assert(IsSameType, HierarchyObject::SubFileVec>::value, - "ATTENTION: we're adding to the file list WHILE looping over it! This is only working because FixedList iterators are not invalidated by this!"); + FilePair& tempFile = sourceObj.root().addSubFile(afterLast(tmpTarget, FILE_NAME_SEPARATOR), descrSource); + static_assert(IsSameType, HierarchyObject::SubFileVec>::value, + "ATTENTION: we're adding to the file list WHILE looping over it! This is only working because FixedList iterators are not invalidated by insertion!"); + sourceObj.removeObject(); //remove only *after* evaluating "sourceObj, side"! //prepare move in second pass tempFile.setSyncDir(side == LEFT_SIDE ? SYNC_DIR_LEFT : SYNC_DIR_RIGHT); @@ -1131,7 +1075,7 @@ void SynchronizeFolderPair::prepare2StepMove(FileMapping& sourceObj, bool SynchronizeFolderPair::createParentDir(FileSystemObject& fsObj) //throw FileError, "false" on name clash { - if (DirMapping* parentDir = dynamic_cast(&fsObj.parent())) + if (DirPair* parentDir = dynamic_cast(&fsObj.parent())) { if (!createParentDir(*parentDir)) return false; @@ -1154,15 +1098,15 @@ bool SynchronizeFolderPair::createParentDir(FileSystemObject& fsObj) //throw Fil template -void SynchronizeFolderPair::manageFileMove(FileMapping& sourceObj, - FileMapping& targetObj) //throw FileError +void SynchronizeFolderPair::manageFileMove(FilePair& sourceObj, + FilePair& targetObj) //throw FileError { assert((sourceObj.getSyncOperation() == SO_MOVE_LEFT_SOURCE && targetObj.getSyncOperation() == SO_MOVE_LEFT_TARGET && side == LEFT_SIDE) || (sourceObj.getSyncOperation() == SO_MOVE_RIGHT_SOURCE && targetObj.getSyncOperation() == SO_MOVE_RIGHT_TARGET && side == RIGHT_SIDE)); const bool sourceWillBeDeleted = [&]() -> bool { - if (DirMapping* parentDir = dynamic_cast(&sourceObj.parent())) + if (DirPair* parentDir = dynamic_cast(&sourceObj.parent())) { switch (parentDir->getSyncOperation()) //evaluate comparison result and sync direction { @@ -1188,7 +1132,7 @@ void SynchronizeFolderPair::manageFileMove(FileMapping& sourceObj, return false; }(); - auto haveNameClash = [](const FileMapping& fileObj) + auto haveNameClash = [](const FilePair& fileObj) { return ::haveNameClash(fileObj.getObjShortName(), fileObj.parent().refSubLinks()) || ::haveNameClash(fileObj.getObjShortName(), fileObj.parent().refSubDirs()); @@ -1209,12 +1153,12 @@ void SynchronizeFolderPair::manageFileMove(FileMapping& sourceObj, } - //search for file move-operations +//search for file move-operations void SynchronizeFolderPair::runZeroPass(HierarchyObject& hierObj) { for (auto it = hierObj.refSubFiles().begin(); it != hierObj.refSubFiles().end(); ++it) //VS 2010 crashes if we use for_each + lambda here... { - FileMapping& fileObj = *it; + FilePair& fileObj = *it; const SyncOperation syncOp = fileObj.getSyncOperation(); switch (syncOp) //evaluate comparison result and sync direction @@ -1222,8 +1166,8 @@ void SynchronizeFolderPair::runZeroPass(HierarchyObject& hierObj) case SO_MOVE_LEFT_SOURCE: case SO_MOVE_RIGHT_SOURCE: { - FileMapping* sourceObj = &fileObj; - if (FileMapping* targetObj = dynamic_cast(FileSystemObject::retrieve(fileObj.getMoveRef()))) + FilePair* sourceObj = &fileObj; + if (FilePair* targetObj = dynamic_cast(FileSystemObject::retrieve(fileObj.getMoveRef()))) { zen::Opt errMsg = tryReportingError2([&] { @@ -1275,7 +1219,7 @@ void SynchronizeFolderPair::runZeroPass(HierarchyObject& hierObj) } std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), - [&](DirMapping& dirObj) { this->runZeroPass(dirObj); /*recurse */ }); + [&](DirPair& dirObj) { this->runZeroPass(dirObj); /*recurse */ }); } //--------------------------------------------------------------------------------------------------------------- @@ -1285,7 +1229,7 @@ void SynchronizeFolderPair::runZeroPass(HierarchyObject& hierObj) // - support change in type: overwrite file by directory, symlink by file, ect. inline -SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const FileMapping& fileObj) +SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const FilePair& fileObj) { switch (fileObj.getSyncOperation()) //evaluate comparison result and sync direction { @@ -1308,12 +1252,14 @@ SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const FileMapping& case SO_CREATE_NEW_LEFT: case SO_CREATE_NEW_RIGHT: - case SO_DO_NOTHING: - case SO_EQUAL: - case SO_UNRESOLVED_CONFLICT: case SO_COPY_METADATA_TO_LEFT: case SO_COPY_METADATA_TO_RIGHT: return PASS_TWO; + + case SO_DO_NOTHING: + case SO_EQUAL: + case SO_UNRESOLVED_CONFLICT: + return PASS_NEVER; } assert(false); return PASS_TWO; //dummy @@ -1321,7 +1267,7 @@ SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const FileMapping& inline -SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const SymLinkMapping& linkObj) +SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const SymlinkPair& linkObj) { switch (linkObj.getSyncOperation()) //evaluate comparison result and sync direction { @@ -1329,21 +1275,23 @@ SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const SymLinkMappin case SO_DELETE_RIGHT: return PASS_ONE; //make sure to delete symlinks in first pass, and equally named file or dir in second pass: usecase "overwrite symlink with regular file"! + case SO_OVERWRITE_LEFT: + case SO_OVERWRITE_RIGHT: + case SO_CREATE_NEW_LEFT: + case SO_CREATE_NEW_RIGHT: + case SO_COPY_METADATA_TO_LEFT: + case SO_COPY_METADATA_TO_RIGHT: + return PASS_TWO; + case SO_MOVE_LEFT_SOURCE: case SO_MOVE_RIGHT_SOURCE: case SO_MOVE_LEFT_TARGET: case SO_MOVE_RIGHT_TARGET: assert(false); - case SO_OVERWRITE_LEFT: - case SO_OVERWRITE_RIGHT: - case SO_CREATE_NEW_LEFT: - case SO_CREATE_NEW_RIGHT: case SO_DO_NOTHING: case SO_EQUAL: case SO_UNRESOLVED_CONFLICT: - case SO_COPY_METADATA_TO_LEFT: - case SO_COPY_METADATA_TO_RIGHT: - return PASS_TWO; + return PASS_NEVER; } assert(false); return PASS_TWO; //dummy @@ -1351,7 +1299,7 @@ SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const SymLinkMappin inline -SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const DirMapping& dirObj) +SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const DirPair& dirObj) { switch (dirObj.getSyncOperation()) //evaluate comparison result and sync direction { @@ -1359,6 +1307,12 @@ SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const DirMapping& d case SO_DELETE_RIGHT: return PASS_ONE; + case SO_CREATE_NEW_LEFT: + case SO_CREATE_NEW_RIGHT: + case SO_COPY_METADATA_TO_LEFT: + case SO_COPY_METADATA_TO_RIGHT: + return PASS_TWO; + case SO_OVERWRITE_LEFT: case SO_OVERWRITE_RIGHT: case SO_MOVE_LEFT_SOURCE: @@ -1366,14 +1320,10 @@ SynchronizeFolderPair::PassId SynchronizeFolderPair::getPass(const DirMapping& d case SO_MOVE_LEFT_TARGET: case SO_MOVE_RIGHT_TARGET: assert(false); - case SO_CREATE_NEW_LEFT: - case SO_CREATE_NEW_RIGHT: case SO_DO_NOTHING: case SO_EQUAL: case SO_UNRESOLVED_CONFLICT: - case SO_COPY_METADATA_TO_LEFT: - case SO_COPY_METADATA_TO_RIGHT: - return PASS_TWO; + return PASS_NEVER; } assert(false); return PASS_TWO; //dummy @@ -1385,7 +1335,7 @@ void SynchronizeFolderPair::runPass(HierarchyObject& hierObj) { //synchronize files: std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), - [&](FileMapping& fileObj) + [&](FilePair& fileObj) { if (pass == this->getPass(fileObj)) //"this->" required by two-pass lookup as enforced by GCC 4.7 tryReportingError2([&] { synchronizeFile(fileObj); }, procCallback_); @@ -1393,7 +1343,7 @@ void SynchronizeFolderPair::runPass(HierarchyObject& hierObj) //synchronize symbolic links: std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), - [&](SymLinkMapping& linkObj) + [&](SymlinkPair& linkObj) { if (pass == this->getPass(linkObj)) tryReportingError2([&] { synchronizeLink(linkObj); }, procCallback_); @@ -1401,7 +1351,7 @@ void SynchronizeFolderPair::runPass(HierarchyObject& hierObj) //synchronize folders: std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), - [&](DirMapping& dirObj) + [&](DirPair& dirObj) { if (pass == this->getPass(dirObj)) tryReportingError2([&] { synchronizeFolder(dirObj); }, procCallback_); @@ -1446,7 +1396,7 @@ Opt getTargetDirection(SyncOperation syncOp) inline -void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) +void SynchronizeFolderPair::synchronizeFile(FilePair& fileObj) { const SyncOperation syncOp = fileObj.getSyncOperation(); @@ -1461,7 +1411,7 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) template -void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp) +void SynchronizeFolderPair::synchronizeFileInt(FilePair& fileObj, SyncOperation syncOp) { static const SelectedSide sideSrc = OtherSide::result; @@ -1470,8 +1420,8 @@ void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperati case SO_CREATE_NEW_LEFT: case SO_CREATE_NEW_RIGHT: { - if (const DirMapping* parentDir = dynamic_cast(&fileObj.parent())) - if (parentDir->isEmpty()) //BaseDirMapping OTOH is always non-empty and existing in this context => else: fatal error in zen::synchronize() + if (const DirPair* parentDir = dynamic_cast(&fileObj.parent())) + if (parentDir->isEmpty()) //BaseDirPair OTOH is always non-empty and existing in this context => else: fatal error in zen::synchronize() return; //if parent directory creation failed, there's no reason to show more errors! const Zstring& target = fileObj.getBaseDirPf() + fileObj.getRelativeName(); //can't use "getFullName" as target is not yet existing @@ -1479,21 +1429,26 @@ void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperati try { - const FileAttrib newAttr = copyFileUpdatingTo(fileObj, [] {} /*no target to delete*/); //throw FileError - - const FileDescriptor descrSource(newAttr.modificationTime, newAttr.fileSize, newAttr.sourceFileId); - const FileDescriptor descrTarget(newAttr.modificationTime, newAttr.fileSize, newAttr.targetFileId); - fileObj.syncTo(descrTarget, &descrSource); //update FileMapping - - procCallback_.updateProcessedData(1, 0); //processed bytes are reported in copyFileUpdatingTo()! + const FileAttrib newAttr = copyFileUpdating(fileObj.getFullName(), + target, + to(fileObj.getFileSize()), [] {} /*no target to delete*/); //throw FileError + //update FilePair + fileObj.setSyncedTo(fileObj.getShortName(), newAttr.fileSize, + newAttr.modificationTime, //target time set from source + newAttr.modificationTime, + newAttr.targetFileId, + newAttr.sourceFileId, + false, fileObj.isFollowedSymlink()); + + procCallback_.updateProcessedData(1, 0); //processed bytes are reported in copyFileUpdating()! } catch (FileError&) { if (somethingExists(fileObj.getFullName())) //do not check on type (symlink, file, folder) -> if there is a type change, FFS should error out! throw; //source deleted meanwhile...nothing was done (logical point of view!) - fileObj.removeObject(); procCallback_.updateTotalData(-1, -to(fileObj.getFileSize())); + fileObj.removeObject(); //remove only *after* evaluating "fileObj, sideSrc"! } } break; @@ -1507,7 +1462,7 @@ void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperati const int objectsExpected = 1; const Int64 bytesExpected = 0; - getDelHandling().removeFileUpdating(fileObj.getObjRelativeName(), bytesExpected, [&] //throw FileError + getDelHandling().removeFileUpdating(fileObj.getFullName(), fileObj.getObjRelativeName(), bytesExpected, [&] //throw FileError { procCallback_.updateProcessedData(1, 0); //noexcept ++objectsReported; @@ -1517,37 +1472,35 @@ void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperati if (objectsReported != objectsExpected) procCallback_.updateTotalData(objectsReported - objectsExpected, 0); //noexcept! } - fileObj.removeObject(); //update FileMapping + fileObj.removeObject(); //update FilePair break; - case SO_MOVE_LEFT_SOURCE: case SO_MOVE_LEFT_TARGET: - case SO_MOVE_RIGHT_SOURCE: case SO_MOVE_RIGHT_TARGET: - if (FileMapping* targetObj = dynamic_cast(FileSystemObject::retrieve(fileObj.getMoveRef()))) + if (FilePair* moveSource = dynamic_cast(FileSystemObject::retrieve(fileObj.getMoveRef()))) { - FileMapping* sourceObj = &fileObj; - - if (syncOp != SO_MOVE_LEFT_SOURCE && - syncOp != SO_MOVE_RIGHT_SOURCE) - std::swap(sourceObj, targetObj); - - assert((sourceObj->getSyncOperation() == SO_MOVE_LEFT_SOURCE && targetObj->getSyncOperation() == SO_MOVE_LEFT_TARGET && sideTrg == LEFT_SIDE) || - (sourceObj->getSyncOperation() == SO_MOVE_RIGHT_SOURCE && targetObj->getSyncOperation() == SO_MOVE_RIGHT_TARGET && sideTrg == RIGHT_SIDE)); + FilePair* moveTarget = &fileObj; - const Zstring& source = sourceObj->getFullName(); - const Zstring& target = targetObj->getBaseDirPf() + targetObj->getRelativeName(); + assert((moveSource->getSyncOperation() == SO_MOVE_LEFT_SOURCE && moveTarget->getSyncOperation() == SO_MOVE_LEFT_TARGET && sideTrg == LEFT_SIDE) || + (moveSource->getSyncOperation() == SO_MOVE_RIGHT_SOURCE && moveTarget->getSyncOperation() == SO_MOVE_RIGHT_TARGET && sideTrg == RIGHT_SIDE)); - reportInfo(txtMovingFile, source, target); - warn_static("was wenn diff volume: symlink aliasing!") //throw FileError, ErrorDifferentVolume, ErrorTargetExisting - renameFile(source, target); //throw FileError + const Zstring& oldName = moveSource->getFullName(); + const Zstring& newName = moveSource->getBaseDirPf() + moveTarget->getRelativeName(); - const FileDescriptor descrTarget(sourceObj->getLastWriteTime(), - sourceObj->getFileSize (), - sourceObj->getFileId ()); + reportInfo(txtMovingFile, oldName, newName); + warn_static("was wenn diff volume: symlink aliasing!") //throw FileError, ErrorDifferentVolume, ErrorTargetExisting + renameFile(oldName, newName); //throw FileError - sourceObj->removeObject(); //update FileMapping - targetObj->syncTo(descrTarget); // + //update FilePair + assert(moveSource->getFileSize() == moveTarget->getFileSize()); + moveTarget->setSyncedTo(moveTarget->getShortName(), moveTarget->getFileSize(), + moveSource->getLastWriteTime(), //awkward naming! moveSource is renamed on "sideTrg" side! + moveTarget->getLastWriteTime(), + moveSource->getFileId(), + moveTarget->getFileId(), + moveSource->isFollowedSymlink(), + moveTarget->isFollowedSymlink()); + moveSource->removeObject(); //remove only *after* evaluating "moveSource, sideTrg"! procCallback_.updateProcessedData(1, 0); } @@ -1556,23 +1509,40 @@ void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperati case SO_OVERWRITE_LEFT: case SO_OVERWRITE_RIGHT: { - const Zstring& target = fileObj.getBaseDirPf() + fileObj.getRelativeName(); //respect differences in case of source object - reportInfo(txtOverwritingFile, target); + const Zstring targetFile = fileObj.isFollowedSymlink() ? //follow link when updating file rather than delete it and replace with regular file!!! + zen::getResolvedFilePath(fileObj.getFullName()) : //throw FileError + fileObj.getBaseDirPf() + fileObj.getRelativeName(); //respect differences in case of source object - const FileAttrib newAttr = copyFileUpdatingTo(fileObj, [&] //delete target at appropriate time + reportInfo(txtOverwritingFile, targetFile); + + if (fileObj.isFollowedSymlink()) //since we follow the link, we need to handle case sensitivity of the link manually! + if (fileObj.getShortName() != fileObj.getShortName()) //adapt difference in case (windows only) + renameFile(fileObj.getFullName(), + beforeLast(fileObj.getFullName(), FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + fileObj.getShortName()); //throw FileError + + const FileAttrib newAttr = copyFileUpdating(fileObj.getFullName(), + targetFile, + to(fileObj.getFileSize()), + [&] //delete target at appropriate time { - reportStatus(this->getDelHandling().getTxtRemovingFile(), fileObj.getFullName()); + reportStatus(this->getDelHandling().getTxtRemovingFile(), targetFile); - this->getDelHandling().removeFileUpdating(fileObj.getObjRelativeName(), 0, []{}); //throw FileError; + this->getDelHandling().removeFileUpdating(targetFile, fileObj.getObjRelativeName(), 0, [] {}); //throw FileError; //no (logical) item count update desired - but total byte count may change, e.g. move(copy) deleted file to versioning dir - fileObj.removeObject(); //update FileMapping - reportStatus(txtOverwritingFile, target); //restore status text copy file - }); + //fileObj.removeObject(); -> doesn't make sense for isFollowedSymlink(); "fileObj, sideTrg" evaluated below! - const FileDescriptor descrSource(newAttr.modificationTime, newAttr.fileSize, newAttr.sourceFileId); - const FileDescriptor descrTarget(newAttr.modificationTime, newAttr.fileSize, newAttr.targetFileId); - fileObj.syncTo(descrTarget, &descrSource); //update FileMapping + reportStatus(txtOverwritingFile, targetFile); //restore status text copy file + }); //throw FileError + + //update FilePair + fileObj.setSyncedTo(fileObj.getShortName(), newAttr.fileSize, + newAttr.modificationTime, //target time set from source + newAttr.modificationTime, + newAttr.targetFileId, + newAttr.sourceFileId, + fileObj.isFollowedSymlink(), + fileObj.isFollowedSymlink()); procCallback_.updateProcessedData(1, 0); //we model "delete + copy" as ONE logical operation } @@ -1591,18 +1561,26 @@ void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperati setFileTime(fileObj.getFullName(), fileObj.getLastWriteTime(), SYMLINK_FOLLOW); //throw FileError //do NOT read *current* source file time, but use buffered value which corresponds to time of comparison! - const FileDescriptor descrTarget(fileObj.getLastWriteTime(), - fileObj.getFileSize (), - fileObj.getFileId ()); - fileObj.syncTo(descrTarget); //-> both sides *should* be completely equal now... + //-> both sides *should* be completely equal now... + assert(fileObj.getFileSize() == fileObj.getFileSize()); + fileObj.setSyncedTo(fileObj.getShortName(), fileObj.getFileSize(), + fileObj.getLastWriteTime(), //target time set from source + fileObj.getLastWriteTime(), + fileObj.getFileId (), + fileObj.getFileId (), + fileObj.isFollowedSymlink(), + fileObj.isFollowedSymlink()); procCallback_.updateProcessedData(1, 0); } break; + case SO_MOVE_LEFT_SOURCE: + case SO_MOVE_RIGHT_SOURCE: case SO_DO_NOTHING: case SO_EQUAL: case SO_UNRESOLVED_CONFLICT: + assert(false); //should have been filtered out by SynchronizeFolderPair::getPass() return; //no update on processed data! } @@ -1611,7 +1589,7 @@ void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperati inline -void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) +void SynchronizeFolderPair::synchronizeLink(SymlinkPair& linkObj) { const SyncOperation syncOp = linkObj.getSyncOperation(); @@ -1626,7 +1604,7 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) template -void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp) +void SynchronizeFolderPair::synchronizeLinkInt(SymlinkPair& linkObj, SyncOperation syncOp) { static const SelectedSide sideSrc = OtherSide::result; @@ -1635,8 +1613,8 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper case SO_CREATE_NEW_LEFT: case SO_CREATE_NEW_RIGHT: { - if (const DirMapping* parentDir = dynamic_cast(&linkObj.parent())) - if (parentDir->isEmpty()) //BaseDirMapping OTOH is always non-empty and existing in this context => else: fatal error in zen::synchronize() + if (const DirPair* parentDir = dynamic_cast(&linkObj.parent())) + if (parentDir->isEmpty()) //BaseDirPair OTOH is always non-empty and existing in this context => else: fatal error in zen::synchronize() return; //if parent directory creation failed, there's no reason to show more errors! const Zstring& target = linkObj.getBaseDirPf() + linkObj.getRelativeName(); @@ -1646,7 +1624,10 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper try { zen::copySymlink(linkObj.getFullName(), target, copyFilePermissions_); //throw FileError - linkObj.copyTo(); //update SymLinkMapping + //update SymlinkPair + linkObj.setSyncedTo(linkObj.getShortName(), + linkObj.getLastWriteTime(), //target time set from source + linkObj.getLastWriteTime()); procCallback_.updateProcessedData(1, 0); } @@ -1655,8 +1636,8 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper if (somethingExists(linkObj.getFullName())) //do not check on type (symlink, file, folder) -> if there is a type change, FFS should not be quiet about it! throw; //source deleted meanwhile...nothing was done (logical point of view!) - linkObj.removeObject(); procCallback_.updateTotalData(-1, 0); + linkObj.removeObject(); } } break; @@ -1670,7 +1651,7 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper const int objectsExpected = 1; const Int64 bytesExpected = 0; - getDelHandling().removeLinkUpdating(linkObj.getObjRelativeName(), bytesExpected, [&] //throw FileError + getDelHandling().removeLinkUpdating(linkObj.getFullName(), linkObj.getObjRelativeName(), bytesExpected, [&] //throw FileError { procCallback_.updateProcessedData(1, 0); //noexcept ++objectsReported; @@ -1680,27 +1661,30 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper if (objectsReported != objectsExpected) procCallback_.updateTotalData(objectsReported - objectsExpected, 0); //noexcept! } - linkObj.removeObject(); //update SymLinkMapping + linkObj.removeObject(); //update SymlinkPair break; case SO_OVERWRITE_LEFT: case SO_OVERWRITE_RIGHT: - { - const Zstring& target = linkObj.getBaseDirPf() + linkObj.getRelativeName(); //respect differences in case of source object - - reportInfo(txtOverwritingLink, target); + reportInfo(txtOverwritingLink, linkObj.getFullName()); reportStatus(getDelHandling().getTxtRemovingSymLink(), linkObj.getFullName()); - getDelHandling().removeLinkUpdating(linkObj.getObjRelativeName(), 0, [] {}); //throw FileError - linkObj.removeObject(); //remove file from FileMapping, to keep in sync (if subsequent copying fails!!) + getDelHandling().removeLinkUpdating(linkObj.getFullName(), linkObj.getObjRelativeName(), 0, [] {}); //throw FileError + + //linkObj.removeObject(); -> "linkObj, sideTrg" evaluated below! - reportStatus(txtOverwritingLink, target); //restore status text - zen::copySymlink(linkObj.getFullName(), target, copyFilePermissions_); //throw FileError - linkObj.copyTo(); //update SymLinkMapping + reportStatus(txtOverwritingLink, linkObj.getFullName()); //restore status text + zen::copySymlink(linkObj.getFullName(), + linkObj.getBaseDirPf() + linkObj.getRelativeName(), //respect differences in case of source object + copyFilePermissions_); //throw FileError + + //update SymlinkPair + linkObj.setSyncedTo(linkObj.getShortName(), + linkObj.getLastWriteTime(), //target time set from source + linkObj.getLastWriteTime()); procCallback_.updateProcessedData(1, 0); //we model "delete + copy" as ONE logical operation - } - break; + break; case SO_COPY_METADATA_TO_LEFT: case SO_COPY_METADATA_TO_RIGHT: @@ -1712,7 +1696,11 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper if (!sameFileTime(linkObj.getLastWriteTime(), linkObj.getLastWriteTime(), 2)) //respect 2 second FAT/FAT32 precision setFileTime(linkObj.getFullName(), linkObj.getLastWriteTime(), SYMLINK_DIRECT); //throw FileError - linkObj.copyTo(); //-> both sides *should* be completely equal now... + + //-> both sides *should* be completely equal now... + linkObj.setSyncedTo(linkObj.getShortName(), + linkObj.getLastWriteTime(), //target time set from source + linkObj.getLastWriteTime()); procCallback_.updateProcessedData(1, 0); break; @@ -1721,10 +1709,10 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper case SO_MOVE_RIGHT_SOURCE: case SO_MOVE_LEFT_TARGET: case SO_MOVE_RIGHT_TARGET: - assert(false); case SO_DO_NOTHING: case SO_EQUAL: case SO_UNRESOLVED_CONFLICT: + assert(false); //should have been filtered out by SynchronizeFolderPair::getPass() return; //no update on processed data! } @@ -1733,7 +1721,7 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper inline -void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) +void SynchronizeFolderPair::synchronizeFolder(DirPair& dirObj) { const SyncOperation syncOp = dirObj.getSyncOperation(); @@ -1748,7 +1736,7 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) template -void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp) +void SynchronizeFolderPair::synchronizeFolderInt(DirPair& dirObj, SyncOperation syncOp) { static const SelectedSide sideSrc = OtherSide::result; @@ -1756,8 +1744,8 @@ void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperati { case SO_CREATE_NEW_LEFT: case SO_CREATE_NEW_RIGHT: - if (const DirMapping* parentDir = dynamic_cast(&dirObj.parent())) - if (parentDir->isEmpty()) //BaseDirMapping OTOH is always non-empty and existing in this context => else: fatal error in zen::synchronize() + if (const DirPair* parentDir = dynamic_cast(&dirObj.parent())) + if (parentDir->isEmpty()) //BaseDirPair OTOH is always non-empty and existing in this context => else: fatal error in zen::synchronize() return; //if parent directory creation failed, there's no reason to show more errors! if (somethingExists(dirObj.getFullName())) //do not check on type (symlink, file, folder) -> if there is a type change, FFS should error out! @@ -1770,19 +1758,22 @@ void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperati makeDirectoryPlain(target, dirObj.getFullName(), copyFilePermissions_); //throw FileError, ErrorTargetExisting, (ErrorTargetPathMissing) } catch (const ErrorTargetExisting&) { if (!dirExists(target)) throw; } //detect clash with file (dir-symlink OTOH is okay) - dirObj.copyTo(); //update DirMapping + + //update DirPair + dirObj.setSyncedTo(dirObj.getShortName()); procCallback_.updateProcessedData(1, 0); } else //source deleted meanwhile...nothing was done (logical point of view!) -> uh....what about a temporary network drop??? { + const SyncStatistics subStats(dirObj); + procCallback_.updateTotalData(-getCUD(subStats) - 1, -subStats.getDataToProcess()); + + //remove only *after* evaluating dirObj!! dirObj.refSubFiles().clear(); // - dirObj.refSubLinks().clear(); //update DirMapping + dirObj.refSubLinks().clear(); //update DirPair dirObj.refSubDirs ().clear(); // dirObj.removeObject(); // - - const SyncStatistics subStats(dirObj); - procCallback_.updateTotalData(-getCUD(subStats) - 1, -subStats.getDataToProcess()); } break; @@ -1797,7 +1788,7 @@ void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperati const Int64 bytesExpected = subStats.getDataToProcess(); assert(bytesExpected == 0); - getDelHandling().removeDirUpdating(dirObj.getObjRelativeName(), bytesExpected, [&] //throw FileError + getDelHandling().removeDirUpdating(dirObj.getFullName(), dirObj.getObjRelativeName(), bytesExpected, [&] //throw FileError { procCallback_.updateProcessedData(1, 0); //noexcept ++objectsReported; @@ -1808,7 +1799,7 @@ void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperati procCallback_.updateTotalData(objectsReported - objectsExpected, 0); //noexcept! } dirObj.refSubFiles().clear(); // - dirObj.refSubLinks().clear(); //update DirMapping + dirObj.refSubLinks().clear(); //update DirPair dirObj.refSubDirs ().clear(); // dirObj.removeObject(); // break; @@ -1821,21 +1812,23 @@ void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperati renameFile(dirObj.getFullName(), beforeLast(dirObj.getFullName(), FILE_NAME_SEPARATOR) + FILE_NAME_SEPARATOR + dirObj.getShortName()); //throw FileError //copyFileTimes -> useless: modification time changes with each child-object creation/deletion - dirObj.copyTo(); //-> both sides *should* be completely equal now... + + //-> both sides *should* be completely equal now... + dirObj.setSyncedTo(dirObj.getShortName()); procCallback_.updateProcessedData(1, 0); break; - case SO_OVERWRITE_RIGHT: case SO_OVERWRITE_LEFT: + case SO_OVERWRITE_RIGHT: case SO_MOVE_LEFT_SOURCE: case SO_MOVE_RIGHT_SOURCE: case SO_MOVE_LEFT_TARGET: case SO_MOVE_RIGHT_TARGET: - assert(false); - case SO_UNRESOLVED_CONFLICT: case SO_DO_NOTHING: case SO_EQUAL: + case SO_UNRESOLVED_CONFLICT: + assert(false); //should have been filtered out by SynchronizeFolderPair::getPass() return; //no update on processed data! } @@ -1845,6 +1838,21 @@ void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperati namespace { +#ifdef ZEN_WIN +//recycleBinStatus() blocks seriously if recycle bin is really full and drive is slow +StatusRecycler recycleBinStatusUpdating(const Zstring& dirname, ProcessCallback& procCallback) +{ + procCallback.reportStatus(replaceCpy(_("Checking recycle bin availability for folder %x..."), L"%x", fmtFileName(dirname), false)); + + auto ft = async([=] { return recycleBinStatus(dirname); }); + + while (!ft.timed_wait(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL / 2))) + procCallback.requestUiRefresh(); //may throw! + return ft.get(); +} +#endif + + /* struct LessDependentDirectory : public std::binary_function { @@ -1859,13 +1867,13 @@ struct LessDependentDirectory : public std::binary_function //create base directories first (if not yet existing) -> no symlink or attribute copying! -bool createBaseDirectory(BaseDirMapping& baseMap, ProcessCallback& callback) //nothrow; return false if fatal error occurred +bool createBaseDirectory(BaseDirPair& baseDirObj, ProcessCallback& callback) //nothrow; return false if fatal error occurred { - const Zstring dirname = beforeLast(baseMap.getBaseDirPf(), FILE_NAME_SEPARATOR); //what about C:\ ??? + const Zstring dirname = beforeLast(baseDirObj.getBaseDirPf(), FILE_NAME_SEPARATOR); //what about C:\ ??? if (dirname.empty()) return true; - if (baseMap.isExisting()) //atomicity: do NOT check directory existence again! + if (baseDirObj.isExisting()) //atomicity: do NOT check directory existence again! { //just convenience: exit sync right here instead of showing tons of error messages during file copy zen::Opt errMsg = tryReportingError2([&] @@ -1885,7 +1893,7 @@ bool createBaseDirectory(BaseDirMapping& baseMap, ProcessCallback& callback) //n { //a nice race-free check and set operation: makeDirectory(dirname, /*bool failIfExists*/ true); //throw FileError, ErrorTargetExisting - baseMap.setExisting(true); //update our model! + baseDirObj.setExisting(true); //update our model! } catch (const ErrorTargetExisting&) { @@ -1958,30 +1966,6 @@ void zen::synchronize(const TimeComp& timeStamp, std::deque skipFolderPair(folderCmp.size()); //folder pairs may be skipped after fatal errors were found - - //initialize deletion handling: already required when checking for warnings - FixedList delHandlerL; //we can't use a FixedList> because DeletionHandling is not copy-constructable - FixedList delHandlerR; - for (auto j = begin(folderCmp); j != end(folderCmp); ++j) - { - const size_t folderIndex = j - folderCmp.begin(); - const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex]; - - delHandlerL.emplace_back(folderPairCfg.handleDeletion, - folderPairCfg.versioningFolder, - folderPairCfg.versioningStyle_, - timeStamp, - j->getBaseDirPf(), - callback); - - delHandlerR.emplace_back(folderPairCfg.handleDeletion, - folderPairCfg.versioningFolder, - folderPairCfg.versioningStyle_, - timeStamp, - j->getBaseDirPf(), - callback); - } - //-------------------execute basic checks all at once before starting sync-------------------------------------- auto dependentDir = [](const Zstring& lhs, const Zstring& rhs) //note: this is NOT an equivalence relation! @@ -2019,156 +2003,156 @@ void zen::synchronize(const TimeComp& timeStamp, typedef std::vector>> DirSpaceRequAvailList; //dirname / space required / space available DirSpaceRequAvailList diskSpaceMissing; -#ifdef FFS_WIN - std::set recyclMissing; +#ifdef ZEN_WIN + //status of base directories which are set to DELETE_TO_RECYCLER (and contain actual items to be deleted) + std::map baseDirHasRecycler; //might be expensive to determine => buffer + check recycle bin existence only once per base directory! #endif //start checking folder pairs + for (auto j = begin(folderCmp); j != end(folderCmp); ++j) { - auto iterDelHandlerL = delHandlerL.cbegin(); - auto iterDelHandlerR = delHandlerR.cbegin(); - for (auto j = begin(folderCmp); j != end(folderCmp); ++j, ++iterDelHandlerL, ++iterDelHandlerR) - { - const size_t folderIndex = j - begin(folderCmp); + const size_t folderIndex = j - begin(folderCmp); - //exclude some pathological case (leftdir, rightdir are empty) - if (EqualFilename()(j->getBaseDirPf(), j->getBaseDirPf())) - continue; + //exclude some pathological case (leftdir, rightdir are empty) + if (EqualFilename()(j->getBaseDirPf(), j->getBaseDirPf())) + continue; - const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex]; + const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex]; - const SyncStatistics folderPairStat(*j); + const SyncStatistics folderPairStat(*j); - //aggregate basic information - const bool writeLeft = folderPairStat.getCreate() + - folderPairStat.getUpdate() + - folderPairStat.getDelete() > 0; + //aggregate basic information + const bool writeLeft = folderPairStat.getCreate() + + folderPairStat.getUpdate() + + folderPairStat.getDelete() > 0; - const bool writeRight = folderPairStat.getCreate() + - folderPairStat.getUpdate() + - folderPairStat.getDelete() > 0; + const bool writeRight = folderPairStat.getCreate() + + folderPairStat.getUpdate() + + folderPairStat.getDelete() > 0; - //skip folder pair if there is nothing to do (except for automatic mode, where data base needs to be written even in this case) - if (!writeLeft && !writeRight && - !folderPairCfg.inAutomaticMode) - { - skipFolderPair[folderIndex] = true; //skip creating (not yet existing) base directories in particular if there's no need - continue; - } + //skip folder pair if there is nothing to do (except for automatic mode, where data base needs to be written even in this case) + if (!writeLeft && !writeRight && + !folderPairCfg.inAutomaticMode) + { + skipFolderPair[folderIndex] = true; //skip creating (not yet existing) base directories in particular if there's no need + continue; + } - //check empty input fields: basically this only makes sense if empty field is not target (and not automatic mode: because of db file creation) - if ((j->getBaseDirPf().empty() && (writeLeft || folderPairCfg.inAutomaticMode)) || - (j->getBaseDirPf().empty() && (writeRight || folderPairCfg.inAutomaticMode))) + //check empty input fields: basically this only makes sense if empty field is not target (and not automatic mode: because of db file creation) + if ((j->getBaseDirPf().empty() && (writeLeft || folderPairCfg.inAutomaticMode)) || + (j->getBaseDirPf().empty() && (writeRight || folderPairCfg.inAutomaticMode))) + { + callback.reportFatalError(_("Target folder input field must not be empty.")); + skipFolderPair[folderIndex] = true; + continue; + } + + //aggregate information of folders used by multiple pairs in read/write access + if (!dependentDir(j->getBaseDirPf(), j->getBaseDirPf())) //true in general + { + if (writeLeft && writeRight) { - callback.reportFatalError(_("Target folder input field must not be empty.")); - skipFolderPair[folderIndex] = true; - continue; + incWriteCount(j->getBaseDirPf()); + incWriteCount(j->getBaseDirPf()); } - - //aggregate information of folders used by multiple pairs in read/write access - if (!dependentDir(j->getBaseDirPf(), j->getBaseDirPf())) //true in general + else if (writeLeft) { - if (writeLeft && writeRight) - { - incWriteCount(j->getBaseDirPf()); - incWriteCount(j->getBaseDirPf()); - } - else if (writeLeft) - { - incWriteCount(j->getBaseDirPf()); - incReadCount (j->getBaseDirPf()); - } - else if (writeRight) - { - incReadCount (j->getBaseDirPf()); - incWriteCount(j->getBaseDirPf()); - } + incWriteCount(j->getBaseDirPf()); + incReadCount (j->getBaseDirPf()); } - else //if folder pair contains two dependent folders, a warning was already issued after comparison; in this context treat as one write access at most + else if (writeRight) { - if (writeLeft || writeRight) - incWriteCount(j->getBaseDirPf()); + incReadCount (j->getBaseDirPf()); + incWriteCount(j->getBaseDirPf()); } + } + else //if folder pair contains two dependent folders, a warning was already issued after comparison; in this context treat as one write access at most + { + if (writeLeft || writeRight) + incWriteCount(j->getBaseDirPf()); + } - if (folderPairStat.getUpdate() + folderPairStat.getDelete() > 0 && - folderPairCfg.handleDeletion == zen::DELETE_TO_VERSIONING) + if (folderPairStat.getUpdate() + folderPairStat.getDelete() > 0 && + folderPairCfg.handleDeletion == zen::DELETE_TO_VERSIONING) + { + //check if user-defined directory for deletion was specified + if (folderPairCfg.versioningFolder.empty()) //already trimmed by getFormattedDirectoryName() { - //check if user-defined directory for deletion was specified - if (folderPairCfg.versioningFolder.empty()) //already trimmed by getFormattedDirectoryName() - { - callback.reportFatalError(_("Folder input field for versioning must not be empty.")); - skipFolderPair[folderIndex] = true; - continue; - } + callback.reportFatalError(_("Folder input field for versioning must not be empty.")); + skipFolderPair[folderIndex] = true; + continue; } + } - //the following scenario is covered by base directory creation below in case source directory exists (accessible or not), but latter doesn't cover source created after comparison, but before sync!!! - auto checkSourceMissing = [&](const Zstring& baseDirPf, bool wasExisting) -> bool //avoid race-condition: we need to evaluate existence status from time of comparison! + //the following scenario is covered by base directory creation below in case source directory exists (accessible or not), but latter doesn't cover source created after comparison, but before sync!!! + auto checkSourceMissing = [&](const Zstring& baseDirPf, bool wasExisting) -> bool //avoid race-condition: we need to evaluate existence status from time of comparison! + { + if (!baseDirPf.empty()) { - if (!baseDirPf.empty()) + //PERMANENT network drop: avoid data loss when source directory is not found AND user chose to ignore errors (else we wouldn't arrive here) + if (folderPairStat.getCreate() + + folderPairStat.getUpdate() == 0 && + folderPairStat.getDelete() > 0) //deletions only... (respect filtered items!) + //folderPairStat.getConflict() == 0 && -> there COULD be conflicts for if directory existence check fails, but loading sync.ffs_db succeeds + //https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3531351&group_id=234430 -> fixed, but still better not consider conflicts { - //PERMANENT network drop: avoid data loss when source directory is not found AND user chose to ignore errors (else we wouldn't arrive here) - if (folderPairStat.getCreate() + - folderPairStat.getUpdate() == 0 && - folderPairStat.getDelete() > 0) //deletions only... (respect filtered items!) - //folderPairStat.getConflict() == 0 && -> there COULD be conflicts for if directory existence check fails, but loading sync.ffs_db succeeds - //https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3531351&group_id=234430 -> fixed, but still better not consider conflicts + if (!wasExisting) //avoid race-condition: we need to evaluate existence status from time of comparison! { - if (!wasExisting) //avoid race-condition: we need to evaluate existence status from time of comparison! - { - callback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtFileName(baseDirPf))); - skipFolderPair[folderIndex] = true; - return false; - } + callback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtFileName(baseDirPf))); + skipFolderPair[folderIndex] = true; + return false; } } - return true; - }; - if (!checkSourceMissing(j->getBaseDirPf(), j->isExisting()) || - !checkSourceMissing(j->getBaseDirPf(), j->isExisting())) - continue; + } + return true; + }; + if (!checkSourceMissing(j->getBaseDirPf(), j->isExisting()) || + !checkSourceMissing(j->getBaseDirPf(), j->isExisting())) + continue; - //check if more than 50% of total number of files/dirs are to be created/overwritten/deleted - if (significantDifferenceDetected(folderPairStat)) - significantDiff.push_back(std::make_pair(j->getBaseDirPf(), j->getBaseDirPf())); + //check if more than 50% of total number of files/dirs are to be created/overwritten/deleted + if (significantDifferenceDetected(folderPairStat)) + significantDiff.push_back(std::make_pair(j->getBaseDirPf(), j->getBaseDirPf())); - //check for sufficient free diskspace - auto checkSpace = [&](const Zstring& baseDirPf, const Int64& spaceRequired) + //check for sufficient free diskspace + auto checkSpace = [&](const Zstring& baseDirPf, const Int64& minSpaceNeeded) + { + try { - try - { - Int64 freeSpace = to(getFreeDiskSpace(baseDirPf)); //throw FileError + const Int64 freeSpace = to(getFreeDiskSpace(baseDirPf)); //throw FileError - if (0 < freeSpace && //zero disk space is either an error or not: in both cases this warning message is obsolete (WebDav seems to report 0) - freeSpace < spaceRequired) - diskSpaceMissing.push_back(std::make_pair(baseDirPf, std::make_pair(spaceRequired, freeSpace))); - } - catch (FileError&) {} - }; - const std::pair spaceNeeded = DiskSpaceNeeded::calculate(*j, - iterDelHandlerL->deletionFreesSpace(), - iterDelHandlerR->deletionFreesSpace()); - checkSpace(j->getBaseDirPf(), spaceNeeded.first); - checkSpace(j->getBaseDirPf(), spaceNeeded.second); - -#ifdef FFS_WIN - //windows: check if recycle bin really exists; if not, Windows will silently delete, which is wrong - if (folderPairCfg.handleDeletion == DELETE_TO_RECYCLER) - { - if (folderPairStat.getUpdate() + - folderPairStat.getDelete() > 0 && - iterDelHandlerL->recyclerFallbackOnDelete()) - recyclMissing.insert(j->getBaseDirPf()); - - if (folderPairStat.getUpdate() + - folderPairStat.getDelete() > 0 && - iterDelHandlerR->recyclerFallbackOnDelete()) - recyclMissing.insert(j->getBaseDirPf()); + if (0 < freeSpace && //zero disk space probably means "request not supported" (e.g. see WebDav) + freeSpace < minSpaceNeeded) + diskSpaceMissing.push_back(std::make_pair(baseDirPf, std::make_pair(minSpaceNeeded, freeSpace))); } -#endif + catch (FileError&) {} + }; + const std::pair spaceNeeded = MinimumDiskSpaceNeeded::calculate(*j); + checkSpace(j->getBaseDirPf(), spaceNeeded.first); + checkSpace(j->getBaseDirPf(), spaceNeeded.second); + +#ifdef ZEN_WIN + //windows: check if recycle bin really exists; if not, Windows will silently delete, which is wrong + auto checkRecycler = [&](const Zstring& baseDirPf) + { + if (!baseDirPf.empty()) //should be + if (baseDirHasRecycler.find(baseDirPf) == baseDirHasRecycler.end()) //perf: avoid duplicate checks! + baseDirHasRecycler[baseDirPf] = recycleBinStatusUpdating(baseDirPf, callback) == STATUS_REC_EXISTS; + }; + + if (folderPairCfg.handleDeletion == DELETE_TO_RECYCLER) + { + if (folderPairStat.getUpdate() + + folderPairStat.getDelete() > 0) + checkRecycler(j->getBaseDirPf()); + + if (folderPairStat.getUpdate() + + folderPairStat.getDelete() > 0) + checkRecycler(j->getBaseDirPf()); } +#endif } //check if unresolved conflicts exist @@ -2195,7 +2179,7 @@ void zen::synchronize(const TimeComp& timeStamp, it->first + L" <-> " + L"\n" + it->second; msg += L"\n\n"; - msg += _("More than 50% of the total number of files will be copied or deleted!"); + msg += _("More than 50% of the total number of files will be copied or deleted."); callback.reportWarning(msg, warnings.warningSignificantDifference); } @@ -2215,15 +2199,16 @@ void zen::synchronize(const TimeComp& timeStamp, callback.reportWarning(msg, warnings.warningNotEnoughDiskSpace); } -#ifdef FFS_WIN +#ifdef ZEN_WIN //windows: check if recycle bin really exists; if not, Windows will silently delete, which is wrong - if (!recyclMissing.empty()) { - std::wstring msg = _("Recycle Bin is not available for the following paths! Files will be deleted permanently instead:") + L"\n"; - std::for_each(recyclMissing.begin(), recyclMissing.end(), - [&](const Zstring& path) { msg += std::wstring(L"\n") + path; }); + std::wstring dirListMissingRecycler; + for (auto it = baseDirHasRecycler.begin(); it != baseDirHasRecycler.end(); ++it) + if (!it->second) + dirListMissingRecycler += std::wstring(L"\n") + it->first; - callback.reportWarning(msg, warnings.warningRecyclerMissing); + if (!dirListMissingRecycler.empty()) + callback.reportWarning(_("The Recycle Bin is not available for the following folders. Files will be deleted permanently instead:") + L"\n" + dirListMissingRecycler, warnings.warningRecyclerMissing); } #endif @@ -2248,7 +2233,7 @@ void zen::synchronize(const TimeComp& timeStamp, //-------------------end of basic checks------------------------------------------ -#ifdef FFS_WIN +#ifdef ZEN_WIN //shadow copy buffer: per sync-instance, not folder pair std::unique_ptr shadowCopyHandler; if (copyLockedFiles) @@ -2258,9 +2243,7 @@ void zen::synchronize(const TimeComp& timeStamp, try { //loop through all directory pairs - auto iterDelHandlerL = delHandlerL.begin(); - auto iterDelHandlerR = delHandlerR.begin(); - for (auto j = begin(folderCmp); j != end(folderCmp); ++j, ++iterDelHandlerL, ++iterDelHandlerR) + for (auto j = begin(folderCmp); j != end(folderCmp); ++j) { //exclude some pathological case (leftdir, rightdir are empty) if (EqualFilename()(j->getBaseDirPf(), j->getBaseDirPf())) @@ -2296,7 +2279,7 @@ void zen::synchronize(const TimeComp& timeStamp, }); //guarantee removal of invalid entries (where element on both sides is empty) - ZEN_ON_SCOPE_EXIT(BaseDirMapping::removeEmpty(*j);); + ZEN_ON_SCOPE_EXIT(BaseDirPair::removeEmpty(*j);); bool copyPermissionsFp = false; tryReportingError2([&] @@ -2308,16 +2291,47 @@ void zen::synchronize(const TimeComp& timeStamp, supportsPermissions(beforeLast(j->getBaseDirPf(), FILE_NAME_SEPARATOR)); }, callback); //show error dialog if necessary + + auto getEffectiveDeletionPolicy = [&](const Zstring& baseDirPf) -> DeletionPolicy + { +#ifdef ZEN_WIN + if (folderPairCfg.handleDeletion == DELETE_TO_RECYCLER) + { + auto it = baseDirHasRecycler.find(baseDirPf); + if (it != baseDirHasRecycler.end()) + if (!it->second) + return DELETE_PERMANENTLY; //Windows' ::SHFileOperation() will do this anyway, but we have a better and faster deletion routine (e.g. on networks) + } +#endif + return folderPairCfg.handleDeletion; + }; + + + DeletionHandling delHandlerL(getEffectiveDeletionPolicy(j->getBaseDirPf()), + folderPairCfg.versioningFolder, + folderPairCfg.versioningStyle_, + timeStamp, + j->getBaseDirPf(), + callback); + + DeletionHandling delHandlerR(getEffectiveDeletionPolicy(j->getBaseDirPf()), + folderPairCfg.versioningFolder, + folderPairCfg.versioningStyle_, + timeStamp, + j->getBaseDirPf(), + callback); + + SynchronizeFolderPair syncFP(callback, verifyCopiedFiles, copyPermissionsFp, transactionalFileCopy, -#ifdef FFS_WIN +#ifdef ZEN_WIN shadowCopyHandler.get(), #endif - *iterDelHandlerL, *iterDelHandlerR); + delHandlerL, delHandlerR); syncFP.startSync(*j); //(try to gracefully) cleanup temporary Recycle bin folders and versioning -> will be done in ~DeletionHandling anyway... - tryReportingError2([&] { iterDelHandlerL->tryCleanup(); }, callback); //show error dialog if necessary - tryReportingError2([&] { iterDelHandlerR->tryCleanup(); }, callback); // + tryReportingError2([&] { delHandlerL.tryCleanup(); }, callback); //show error dialog if necessary + tryReportingError2([&] { delHandlerR.tryCleanup(); }, callback); // //(try to gracefully) write database file (will be done in ~EnforceUpdateDatabase anyway...) if (folderPairCfg.inAutomaticMode) @@ -2367,16 +2381,12 @@ private: //throw FileError; reports data delta via updateProcessedData() -template -FileAttrib SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, Function delTargetCommand) const //returns current attributes of source file +template +FileAttrib SynchronizeFolderPair::copyFileUpdating(const Zstring& sourceFile, + const Zstring& targetFile, const Int64& bytesExpected, Function delTargetCommand) const //returns current attributes of source file { - static const SelectedSide sideSrc = OtherSide::result; - + Zstring source = sourceFile; FileAttrib newAttr; - const Int64 bytesExpected = to(fileObj.getFileSize()); - Zstring source = fileObj.getFullName(); - const Zstring& target = fileObj.getBaseDirPf() + fileObj.getRelativeName(); - Int64 bytesReported; auto copyOperation = [&] @@ -2390,7 +2400,7 @@ FileAttrib SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, WhileCopying callback(bytesReported, procCallback_, delTargetCommand); copyFile(source, //type File implicitly means symlinks need to be dereferenced! - target, + targetFile, copyFilePermissions_, transactionalFileCopy_, &callback, @@ -2399,8 +2409,8 @@ FileAttrib SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, //#################### Verification ############################# if (verifyCopiedFiles_) { - auto guardTarget = makeGuard([&] { removeFile(target); }); //delete target if verification fails - verifyFileCopy(source, target); //throw FileError + auto guardTarget = makeGuard([&] { removeFile(targetFile); }); //delete target if verification fails + verifyFileCopy(source, targetFile); //throw FileError guardTarget.dismiss(); } //#################### /Verification ############################# @@ -2413,7 +2423,7 @@ FileAttrib SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, guardStatistics.dismiss(); }; -#ifdef FFS_WIN +#ifdef ZEN_WIN try { copyOperation(); @@ -2435,7 +2445,7 @@ FileAttrib SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, } catch (const FileError& e2) { - throw FileError(e1.toString() + L"\n\n" + e2.toString()); + throw FileError(e1.toString(), e2.toString()); } //now try again @@ -2456,46 +2466,46 @@ struct VerifyCallback virtual void updateStatus() = 0; }; -void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback& callback) // throw (FileError) +void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback& callback) //throw FileError { static std::vector memory1(1024 * 1024); //1024 kb seems to be a reasonable buffer size static std::vector memory2(1024 * 1024); -#ifdef FFS_WIN +#ifdef ZEN_WIN wxFile file1(applyLongPathPrefix(source).c_str(), wxFile::read); //don't use buffered file input for verification! -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC wxFile file1(::open(source.c_str(), O_RDONLY)); //utilize UTF-8 filename #endif if (!file1.IsOpened()) - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(source))); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(source)) + L" (open)"); -#ifdef FFS_WIN +#ifdef ZEN_WIN wxFile file2(applyLongPathPrefix(target).c_str(), wxFile::read); //don't use buffered file input for verification! -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC wxFile file2(::open(target.c_str(), O_RDONLY)); //utilize UTF-8 filename #endif if (!file2.IsOpened()) //NO cleanup necessary for (wxFile) file1 - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(target))); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(target)) + L" (open)"); do { const size_t length1 = file1.Read(&memory1[0], memory1.size()); if (file1.Error()) - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(source)) + L" (r)"); - callback.updateStatus(); //send progress updates + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(source))); + callback.updateStatus(); const size_t length2 = file2.Read(&memory2[0], memory2.size()); if (file2.Error()) - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(target)) + L" (r)"); - callback.updateStatus(); //send progress updates + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(target))); + callback.updateStatus(); if (length1 != length2 || ::memcmp(&memory1[0], &memory2[0], length1) != 0) - throw FileError(_("Data verification error: Source and target file have different content!") + L"\n" + fmtFileName(source) + L" -> \n" + fmtFileName(target)); + throw FileError(replaceCpy(replaceCpy(_("Data verification error: %x and %y have different content."), L"%x", L"\n" + fmtFileName(source)), L"%y", L"\n" + fmtFileName(target))); } while (!file1.Eof()); if (!file2.Eof()) - throw FileError(_("Data verification error: Source and target file have different content!") + L"\n" + fmtFileName(source) + L" -> \n" + fmtFileName(target)); + throw FileError(replaceCpy(replaceCpy(_("Data verification error: %x and %y have different content."), L"%x", L"\n" + fmtFileName(source)), L"%y", L"\n" + fmtFileName(target))); } diff --git a/synchronization.h b/synchronization.h index e9d15e29..9fb0ef06 100644 --- a/synchronization.h +++ b/synchronization.h @@ -21,7 +21,7 @@ class SyncStatistics //this class counts *logical* operations, (create, update, public: SyncStatistics(const HierarchyObject& hierObj); SyncStatistics(const FolderComparison& folderCmp); - SyncStatistics(const FileMapping& fileObj); + SyncStatistics(const FilePair& fileObj); int getCreate() const; template int getCreate() const; @@ -45,9 +45,9 @@ private: void recurse(const HierarchyObject& hierObj); - void calcStats(const FileMapping& fileObj); - void calcStats(const SymLinkMapping& linkObj); - void calcStats(const DirMapping& dirObj); + void calcStats(const FilePair& fileObj); + void calcStats(const SymlinkPair& linkObj); + void calcStats(const DirPair& dirObj); int createLeft, createRight; int updateLeft, updateRight; diff --git a/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj b/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj index 1b84eade..31c87839 100644 --- a/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj +++ b/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj @@ -20,7 +20,6 @@ - @@ -74,10 +73,8 @@ <_ProjectFileVersion>10.0.30319.1 OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ false @@ -95,7 +92,7 @@ Disabled - _DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions) + ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -106,6 +103,7 @@ EditAndContinue 4100 ../.. + true $(OutDir)$(TargetName)$(TargetExt) @@ -130,7 +128,7 @@ Disabled - _DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions) + ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;_DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -141,6 +139,7 @@ ProgramDatabase 4100 ../.. + true $(OutDir)$(TargetName)$(TargetExt) @@ -164,7 +163,7 @@ MaxSpeed true - NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions) + ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true @@ -175,7 +174,7 @@ 4100 Speed ../.. - true + false $(OutDir)$(TargetName)$(TargetExt) @@ -203,7 +202,7 @@ MaxSpeed true - NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions) + ZEN_WIN;WXINTL_NO_GETTEXT_MACRO;NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true @@ -214,7 +213,7 @@ 4100 Speed ../.. - true + false $(OutDir)$(TargetName)$(TargetExt) diff --git a/ui/IFileDialog_Vista/ifile_dialog.cpp b/ui/IFileDialog_Vista/ifile_dialog.cpp index 19dcbc5d..f56df9e7 100644 --- a/ui/IFileDialog_Vista/ifile_dialog.cpp +++ b/ui/IFileDialog_Vista/ifile_dialog.cpp @@ -17,13 +17,13 @@ using namespace zen; namespace { -bool showFolderPickerImpl(HWND ownerWindow, //throw ComError; return "false" if cancelled by user +bool showFolderPickerImpl(HWND ownerWindow, //throw SysError; return "false" if cancelled by user const wchar_t* defaultFolder, //optional! const GUID* persistenceGuid, // std::wstring& selectedFolder) { ComPtr fileDlg; - ZEN_COM_CHECK(::CoCreateInstance(CLSID_FileOpenDialog, //throw ComError + ZEN_COM_CHECK(::CoCreateInstance(CLSID_FileOpenDialog, //throw SysError nullptr, CLSCTX_ALL, IID_PPV_ARGS(fileDlg.init()))); @@ -32,7 +32,7 @@ bool showFolderPickerImpl(HWND ownerWindow, //throw ComError; return "false" if ZEN_COM_CHECK(fileDlg->SetClientGuid(*persistenceGuid)); FILEOPENDIALOGOPTIONS dlgOptions = 0; - ZEN_COM_CHECK(fileDlg->GetOptions(&dlgOptions)); //throw ComError + ZEN_COM_CHECK(fileDlg->GetOptions(&dlgOptions)); //throw SysError ZEN_COM_CHECK(fileDlg->SetOptions(dlgOptions | FOS_PICKFOLDERS | FOS_NOVALIDATE | FOS_FORCEFILESYSTEM)); if (defaultFolder) //show last selection instead of top level if no default available @@ -48,7 +48,7 @@ bool showFolderPickerImpl(HWND ownerWindow, //throw ComError; return "false" if { ZEN_COM_CHECK(fileDlg->Show(ownerWindow)); //may fail with: HRESULT_FROM_WIN32(ERROR_CANCELLED) } - catch (const ComError&) { return false; } + catch (const SysError&) { return false; } ComPtr folderItem; ZEN_COM_CHECK(fileDlg->GetResult(folderItem.init())); @@ -90,12 +90,12 @@ void ifile::showFolderPicker(void* ownerWindow, ::memcpy(&winGuid, guid, sizeof(GUID)); std::wstring folderPath; - if (showFolderPickerImpl(static_cast(ownerWindow), defaultFolder, guid ? &winGuid : nullptr, folderPath)) //throw ComError + if (showFolderPickerImpl(static_cast(ownerWindow), defaultFolder, guid ? &winGuid : nullptr, folderPath)) //throw SysError selectedFolder = allocString(folderPath); else cancelled = true; } - catch (const ComError& e) + catch (const SysError& e) { errorMsg = allocString(e.toString()); //std::bad_alloc ? } diff --git a/ui/Taskbar_Seven/Taskbar_Seven.vcxproj b/ui/Taskbar_Seven/Taskbar_Seven.vcxproj index a979a1a2..8b8ab5ce 100644 --- a/ui/Taskbar_Seven/Taskbar_Seven.vcxproj +++ b/ui/Taskbar_Seven/Taskbar_Seven.vcxproj @@ -66,10 +66,8 @@ <_ProjectFileVersion>10.0.30319.1 OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ false @@ -96,7 +94,7 @@ Level4 true EditAndContinue - 4100,4996 + 4100;4996 ../.. true
@@ -131,7 +129,7 @@ Level4 true ProgramDatabase - 4100,4996 + 4100;4996 ../.. true
@@ -163,7 +161,7 @@ Level4 true ProgramDatabase - 4100,4996 + 4100;4996 Speed ../..
@@ -200,7 +198,7 @@ Level4 true ProgramDatabase - 4100,4996 + 4100;4996 Speed ../..
@@ -221,20 +219,6 @@ - - - - false - - - false - - - false - - - false - diff --git a/ui/Taskbar_Seven/taskbar.cpp b/ui/Taskbar_Seven/taskbar.cpp index 6b34fc1a..72be7016 100644 --- a/ui/Taskbar_Seven/taskbar.cpp +++ b/ui/Taskbar_Seven/taskbar.cpp @@ -31,7 +31,10 @@ ComPtr getInstance() CLSCTX_ALL, IID_PPV_ARGS(taskbarlist.init())); if (FAILED(hr)) - lastErrorMessage = generateErrorMsg(L"Error calling \"CoCreateInstance\".", hr); + { + lastErrorMessage = formatComError(L"Error calling \"CoCreateInstance\".", hr); + return ComPtr(); + } return taskbarlist; } @@ -70,7 +73,7 @@ bool tbseven::setStatus(void* hwnd, //HWND: window assciated to the taskbar icon flag); //[in] TBPFLAG tbpFlags if (FAILED(hr)) { - lastErrorMessage = generateErrorMsg(L"Error calling \"SetProgressState\".", hr); + lastErrorMessage = formatComError(L"Error calling \"SetProgressState\".", hr); return false; } @@ -92,7 +95,7 @@ bool tbseven::setProgress(void* hwnd, //HWND: window assciated to the taskbar ic total); //[in] ULONGLONG ullTotal if (FAILED(hr)) { - lastErrorMessage = generateErrorMsg(L"Error calling \"SetProgressValue\".", hr); + lastErrorMessage = formatComError(L"Error calling \"SetProgressValue\".", hr); return false; } diff --git a/ui/batch_config.cpp b/ui/batch_config.cpp index bd82194d..bf3436f1 100644 --- a/ui/batch_config.cpp +++ b/ui/batch_config.cpp @@ -7,6 +7,7 @@ #include "batch_config.h" #include #include +#include #include #include "gui_generated.h" #include "dir_name.h" @@ -67,9 +68,11 @@ BatchDialog::BatchDialog(wxWindow* parent, BatchDlgGenerated(parent), batchCfgOutRef(batchCfg) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonSaveAs).setCancel(m_buttonCancel)); + wxWindowUpdateLocker dummy(this); //avoid display distortion setRelativeFontSize(*m_staticTextHeader, 1.25); @@ -85,7 +88,7 @@ BatchDialog::BatchDialog(wxWindow* parent, Fit(); //child-element widths have changed: image was set Layout(); - m_buttonSave->SetFocus(); + m_buttonSaveAs->SetFocus(); } diff --git a/ui/batch_status_handler.cpp b/ui/batch_status_handler.cpp index e06a0000..0dfd6957 100644 --- a/ui/batch_status_handler.cpp +++ b/ui/batch_status_handler.cpp @@ -35,8 +35,7 @@ private: logfiles_.push_back(fullName); } - virtual std::shared_ptr - onDir (const Zchar* shortName, const Zstring& fullName) { return nullptr; } //DON'T traverse into subdirs + virtual TraverseCallback* onDir (const Zchar* shortName, const Zstring& fullName) { return nullptr; } //DON'T traverse into subdirs virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) { return LINK_SKIP; } virtual HandleError reportDirError (const std::wstring& msg) { assert(false); return ON_ERROR_IGNORE; } //errors are not really critical in this context virtual HandleError reportItemError(const std::wstring& msg, const Zchar* shortName) { assert(false); return ON_ERROR_IGNORE; } // @@ -147,28 +146,28 @@ BatchStatusHandler::~BatchStatusHandler() if (abortIsRequested()) { raiseReturnCode(returnCode_, FFS_RC_ABORTED); - finalStatus = _("Synchronization aborted!"); + finalStatus = _("Synchronization aborted"); errorLog.logMsg(finalStatus, TYPE_ERROR); } else if (totalErrors > 0) { raiseReturnCode(returnCode_, FFS_RC_FINISHED_WITH_ERRORS); - finalStatus = _("Synchronization completed with errors!"); + finalStatus = _("Synchronization completed with errors"); errorLog.logMsg(finalStatus, TYPE_ERROR); } else if (totalWarnings > 0) { raiseReturnCode(returnCode_, FFS_RC_FINISHED_WITH_WARNINGS); - finalStatus = _("Synchronization completed with warnings."); + finalStatus = _("Synchronization completed with warnings"); errorLog.logMsg(finalStatus, TYPE_WARNING); } else { if (getObjectsTotal(PHASE_SYNCHRONIZING) == 0 && //we're past "initNewPhase(PHASE_SYNCHRONIZING)" at this point! getDataTotal (PHASE_SYNCHRONIZING) == 0) - finalStatus = _("Nothing to synchronize!"); //even if "ignored conflicts" occurred! + finalStatus = _("Nothing to synchronize"); //even if "ignored conflicts" occurred! else - finalStatus = _("Synchronization completed successfully."); + finalStatus = _("Synchronization completed successfully"); errorLog.logMsg(finalStatus, TYPE_INFO); } @@ -258,8 +257,8 @@ BatchStatusHandler::~BatchStatusHandler() //-> nicely manages dialog lifetime while (progressDlg) { + updateUiNow(); //*first* refresh GUI (removing flicker) before sleeping! boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL)); - updateUiNow(); } } } @@ -317,7 +316,7 @@ void BatchStatusHandler::reportWarning(const std::wstring& warningMessage, bool& break; case ReturnWarningDlg::BUTTON_SWITCH: - errorLog.logMsg(_("Switching to FreeFileSync main dialog..."), TYPE_INFO); + errorLog.logMsg(_("Switching to FreeFileSync main dialog"), TYPE_INFO); switchToGuiRequested = true; abortThisProcess(); break; @@ -341,7 +340,8 @@ void BatchStatusHandler::reportWarning(const std::wstring& warningMessage, bool& ProcessCallback::Response BatchStatusHandler::reportError(const std::wstring& errorMessage) { - errorLog.logMsg(errorMessage, TYPE_ERROR); //always, even for "retry" + //always, except for "retry": + zen::ScopeGuard guardWriteLog = zen::makeGuard([&] { errorLog.logMsg(errorMessage, TYPE_ERROR); }); switch (handleError_) { @@ -362,6 +362,8 @@ ProcessCallback::Response BatchStatusHandler::reportError(const std::wstring& er return ProcessCallback::IGNORE_ERROR; case ReturnErrorDlg::BUTTON_RETRY: + guardWriteLog.dismiss(); + errorLog.logMsg(_("Retrying operation after error:") + L" " + errorMessage, TYPE_INFO); return ProcessCallback::RETRY; case ReturnErrorDlg::BUTTON_CANCEL: diff --git a/ui/check_version.cpp b/ui/check_version.cpp index b736b361..2e4c387a 100644 --- a/ui/check_version.cpp +++ b/ui/check_version.cpp @@ -17,11 +17,11 @@ ////#include "../lib/ffs_paths.h" #include -#ifdef FFS_WIN +#ifdef ZEN_WIN #include //tame wininet include #include -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include #include #endif @@ -31,7 +31,7 @@ using namespace zen; namespace { -#ifdef FFS_WIN +#ifdef ZEN_WIN class InternetConnectionError {}; class WinInetAccess //using IE proxy settings! :) @@ -138,7 +138,7 @@ enum GetVerResult GetVerResult getOnlineVersion(wxString& version) //empty string on error; { -#ifdef FFS_WIN +#ifdef ZEN_WIN //internet access supporting proxy connections std::vector output; try @@ -154,7 +154,7 @@ GetVerResult getOnlineVersion(wxString& version) //empty string on error; version = utfCvrtTo(&output[0]); return GET_VER_SUCCESS; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC wxWindowDisabler dummy; auto getStringFromUrl = [](const wxString& server, const wxString& page, int timeout, wxString* output) -> bool //true on successful connection @@ -228,21 +228,23 @@ void zen::checkForUpdateNow(wxWindow* parent) if (haveNewerVersion(onlineVersion)) { if (showQuestionDlg(parent, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL, - _("A new version of FreeFileSync is available:") + L" " + onlineVersion + L"\n\n" + _("Download now?")) == ReturnQuestionDlg::BUTTON_YES) - wxLaunchDefaultBrowser(L"http://sourceforge.net/projects/freefilesync/files/freefilesync/v" + onlineVersion + L"/"); + _("A new version of FreeFileSync is available:") + L" " + onlineVersion + L"\n\n" + _("Download now?"), + QuestConfig().setCaption(_("New version found")).setLabelYes(_("&Download"))) == ReturnQuestionDlg::BUTTON_YES) + wxLaunchDefaultBrowser(L"http://freefilesync.sourceforge.net/get_latest.php"); } else - wxMessageBox(_("FreeFileSync is up to date!"), _("Information"), wxICON_INFORMATION, parent); + wxMessageBox(_("FreeFileSync is up to date."), _("Information"), wxOK | wxICON_INFORMATION, parent); break; case GET_VER_NO_CONNECTION: - wxMessageBox(_("Unable to connect to sourceforge.net!"), _("Error"), wxOK | wxICON_ERROR, parent); + wxMessageBox(_("Unable to connect to sourceforge.net."), _("Error"), wxOK | wxICON_ERROR, parent); break; case GET_VER_PAGE_NOT_FOUND: if (showQuestionDlg(parent, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL, - _("Current FreeFileSync version number was not found online! Do you want to check manually?")) == ReturnQuestionDlg::BUTTON_YES) - wxLaunchDefaultBrowser(L"http://sourceforge.net/projects/freefilesync/"); + _("Cannot find current FreeFileSync version number online. Do you want to check manually?"), + QuestConfig().setCaption(_("Error"))) == ReturnQuestionDlg::BUTTON_YES) + wxLaunchDefaultBrowser(L"http://freefilesync.sourceforge.net/"); break; } } @@ -255,8 +257,8 @@ void zen::checkForUpdatePeriodically(wxWindow* parent, long& lastUpdateCheck, co //if (lastUpdateCheck == 0) //{ // switch (showQuestionDlg(parent, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_NO | ReturnQuestionDlg::BUTTON_CANCEL, - // _("Do you want FreeFileSync to automatically check for updates every week?") + L"\n" + - // _("(Requires an Internet connection!)"))) + // ("Do you want FreeFileSync to automatically check for updates every week?") + L"\n" + + // ("(Requires an Internet connection!)"))) // { // case ReturnQuestionDlg::BUTTON_YES: // lastUpdateCheck = 123; //some old date (few seconds after 1970) different from 0 and -1 @@ -284,9 +286,9 @@ void zen::checkForUpdatePeriodically(wxWindow* parent, long& lastUpdateCheck, co if (haveNewerVersion(onlineVersion)) { if (showQuestionDlg(parent, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL, - _("A new version of FreeFileSync is available:") + L" " + onlineVersion + L"\n\n" + - _("Download now?")) == ReturnQuestionDlg::BUTTON_YES) - wxLaunchDefaultBrowser(L"http://sourceforge.net/projects/freefilesync/files/freefilesync/v" + onlineVersion + L"/"); + _("A new version of FreeFileSync is available:") + L" " + onlineVersion + L"\n\n" + _("Download now?"), + QuestConfig().setCaption(_("New version found")).setLabelYes(_("&Download"))) == ReturnQuestionDlg::BUTTON_YES) + wxLaunchDefaultBrowser(L"http://freefilesync.sourceforge.net/get_latest.php"); } break; @@ -295,8 +297,9 @@ void zen::checkForUpdatePeriodically(wxWindow* parent, long& lastUpdateCheck, co case GET_VER_PAGE_NOT_FOUND: if (showQuestionDlg(parent, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL, - _("Current FreeFileSync version number was not found online! Do you want to check manually?")) == ReturnQuestionDlg::BUTTON_YES) - wxLaunchDefaultBrowser(L"http://sourceforge.net/projects/freefilesync/"); + _("Cannot find current FreeFileSync version number online. Do you want to check manually?"), + QuestConfig().setCaption(_("Error"))) == ReturnQuestionDlg::BUTTON_YES) + wxLaunchDefaultBrowser(L"http://freefilesync.sourceforge.net/"); break; } } diff --git a/ui/custom_grid.cpp b/ui/custom_grid.cpp index c1a39a0c..58e7a7e4 100644 --- a/ui/custom_grid.cpp +++ b/ui/custom_grid.cpp @@ -332,12 +332,12 @@ private: { GetRowType(DisplayType& result) : result_(result) {} - virtual void visit(const FileMapping& fileObj) {} - virtual void visit(const SymLinkMapping& linkObj) + virtual void visit(const FilePair& fileObj) {} + virtual void visit(const SymlinkPair& linkObj) { result_ = DISP_TYPE_SYMLINK; } - virtual void visit(const DirMapping& dirObj) + virtual void visit(const DirPair& dirObj) { result_ = DISP_TYPE_FOLDER; } @@ -356,7 +356,7 @@ private: { GetTextValue(ColumnTypeRim colType, const FileSystemObject& fso) : colType_(colType), fsObj_(fso) {} - virtual void visit(const FileMapping& fileObj) + virtual void visit(const FilePair& fileObj) { switch (colType_) { @@ -390,7 +390,7 @@ private: } } - virtual void visit(const SymLinkMapping& linkObj) + virtual void visit(const SymlinkPair& linkObj) { switch (colType_) { @@ -408,7 +408,7 @@ private: break; case COL_TYPE_SIZE: //file size if (!fsObj_.isEmpty()) - value = _(""); + value = L"<" + _("Symlink") + L">"; break; case COL_TYPE_DATE: //date if (!fsObj_.isEmpty()) @@ -420,7 +420,7 @@ private: } } - virtual void visit(const DirMapping& dirObj) + virtual void visit(const DirPair& dirObj) { switch (colType_) { @@ -438,7 +438,7 @@ private: break; case COL_TYPE_SIZE: //file size if (!fsObj_.isEmpty()) - value = _(""); + value = L"<" + _("Folder") + L">"; break; case COL_TYPE_DATE: //date if (!fsObj_.isEmpty()) @@ -468,8 +468,9 @@ private: wxRect rectTmp = rect; //draw horizontal border if required - auto dispTp = getRowDisplayType(row); - if (dispTp == getRowDisplayType(row + 1) && dispTp != DISP_TYPE_NORMAL) + DisplayType dispTp = getRowDisplayType(row); + if (dispTp != DISP_TYPE_NORMAL && + dispTp == getRowDisplayType(row + 1)) { const wxColor colorGridLine = wxColour(192, 192, 192); //light grey wxDCPenChanger dummy2(dc, wxPen(colorGridLine, 1, wxSOLID)); @@ -628,15 +629,15 @@ private: { struct GetIcon : public FSObjectVisitor { - virtual void visit(const FileMapping& fileObj) + virtual void visit(const FilePair& fileObj) { iconName = fileObj.getFullName(); } - virtual void visit(const SymLinkMapping& linkObj) + virtual void visit(const SymlinkPair& linkObj) { iconName = linkObj.getFullName(); } - virtual void visit(const DirMapping& dirObj) + virtual void visit(const DirPair& dirObj) { iconName = ICON_FILE_FOLDER; } @@ -664,20 +665,20 @@ private: { AssembleTooltip(wxString& tipMsg) : tipMsg_(tipMsg) {} - virtual void visit(const FileMapping& fileObj) + virtual void visit(const FilePair& fileObj) { tipMsg_ += L"\n" + _("Size:") + L" " + zen::filesizeToShortString(to(fileObj.getFileSize())) + L"\n" + _("Date:") + L" " + zen::utcToLocalTimeString(fileObj.getLastWriteTime()); } - virtual void visit(const SymLinkMapping& linkObj) + virtual void visit(const SymlinkPair& linkObj) { tipMsg_ += L"\n" + _("Date:") + L" " + zen::utcToLocalTimeString(linkObj.getLastWriteTime()); } - virtual void visit(const DirMapping& dirObj) {} + virtual void visit(const DirPair& dirObj) {} wxString& tipMsg_; } assembler(toolTip); @@ -719,7 +720,7 @@ private: if (markedFilesAndLinks_.find(fsObj) != markedFilesAndLinks_.end()) //mark files/links directly return true; - if (auto dirObj = dynamic_cast(fsObj)) + if (auto dirObj = dynamic_cast(fsObj)) { if (markedContainer_.find(dirObj) != markedContainer_.end()) //mark directories which *are* the given HierarchyObject* return true; @@ -732,7 +733,7 @@ private: if (markedContainer_.find(parent) != markedContainer_.end()) return true; - if (auto dirObj = dynamic_cast(parent)) + if (auto dirObj = dynamic_cast(parent)) parent = &(dirObj->parent()); else break; @@ -910,6 +911,14 @@ private: virtual void renderCell(Grid& grid, wxDC& dc, const wxRect& rect, size_t row, ColumnType colType) { + auto drawInactiveColumBackground = [&](const FileSystemObject& fsObj) + { + if (fsObj.isActive()) + fillBackgroundDefaultColorAlternating(dc, rect, row % 2 == 0); + else + clearArea(dc, rect, COLOR_NOT_ACTIVE); + }; + switch (static_cast(colType)) { case COL_TYPE_CHECKBOX: @@ -949,10 +958,12 @@ private: if (const FileSystemObject* fsObj = getRawData(row)) { if (highlightSyncAction_) - fillBackgroundDefaultColorAlternating(dc, rect, row % 2 == 0); + drawInactiveColumBackground(*fsObj); - const wxBitmap& cmpImg = getCmpResultImage(fsObj->getCategory()); - drawBitmapRtlMirror(dc, highlightSyncAction_ ? greyScale(cmpImg) : cmpImg, rect, wxALIGN_CENTER, buffer); + if (!highlightSyncAction_) + drawBitmapRtlMirror(dc, getCmpResultImage(fsObj->getCategory()), rect, wxALIGN_CENTER, buffer); + else if (fsObj->getCategory() != FILE_EQUAL) //don't show = in both middle columns + drawBitmapRtlMirror(dc, greyScale(getCmpResultImage(fsObj->getCategory())), rect, wxALIGN_CENTER, buffer); } break; @@ -960,7 +971,7 @@ private: if (const FileSystemObject* fsObj = getRawData(row)) { if (!highlightSyncAction_) - fillBackgroundDefaultColorAlternating(dc, rect, row % 2 == 0); + drawInactiveColumBackground(*fsObj); const bool rowHighlighted = dragSelection ? row == dragSelection->first : highlight ? row == highlight->row_ : false; const BlockPosition highlightBlock = dragSelection ? dragSelection->second : highlight ? highlight->blockPos_ : BLOCKPOS_CHECK_BOX; @@ -983,8 +994,10 @@ private: } else //default { - const wxBitmap& opImg = getSyncOpImage(fsObj->getSyncOperation()); - drawBitmapRtlMirror(dc, highlightSyncAction_ ? opImg : greyScale(opImg), rect, wxALIGN_CENTER, buffer); + if (highlightSyncAction_) + drawBitmapRtlMirror(dc, getSyncOpImage(fsObj->getSyncOperation()), rect, wxALIGN_CENTER, buffer); + else if (fsObj->getSyncOperation() != SO_EQUAL) //don't show = in both middle columns + drawBitmapRtlMirror(dc, greyScale(getSyncOpImage(fsObj->getSyncOperation())), rect, wxALIGN_CENTER, buffer); } } break; @@ -1020,7 +1033,7 @@ private: wxRect rectInside = drawColumnLabelBorder(dc, rect); drawColumnLabelBackground(dc, rectInside, highlighted); - const wxBitmap& cmpIcon = getResourceImage(L"compareSmall"); + const wxBitmap& cmpIcon = getResourceImage(L"compare_small"); drawBitmapRtlNoMirror(dc, highlightSyncAction_ ? greyScale(cmpIcon) : cmpIcon, rectInside, wxALIGN_CENTER, buffer); } break; @@ -1030,7 +1043,7 @@ private: wxRect rectInside = drawColumnLabelBorder(dc, rect); drawColumnLabelBackground(dc, rectInside, highlighted); - const wxBitmap& syncIcon = getResourceImage(L"syncSmall"); + const wxBitmap& syncIcon = getResourceImage(L"sync_small"); drawBitmapRtlNoMirror(dc, highlightSyncAction_ ? syncIcon : greyScale(syncIcon), rectInside, wxALIGN_CENTER, buffer); } break; @@ -1173,35 +1186,35 @@ private: switch (syncOp) { case SO_CREATE_NEW_LEFT: - return L"createLeft"; + return L"so_create_left"; case SO_CREATE_NEW_RIGHT: - return L"createRight"; + return L"so_create_right"; case SO_DELETE_LEFT: - return L"deleteLeft"; + return L"so_delete_left"; case SO_DELETE_RIGHT: - return L"deleteRight"; + return L"so_delete_right"; case SO_MOVE_LEFT_SOURCE: - return L"moveLeftSource"; + return L"so_move_left_source"; case SO_MOVE_LEFT_TARGET: - return L"moveLeftTarget"; + return L"so_move_left_target"; case SO_MOVE_RIGHT_SOURCE: - return L"moveRightSource"; + return L"so_move_right_source"; case SO_MOVE_RIGHT_TARGET: - return L"moveRightTarget"; + return L"so_move_right_target"; case SO_OVERWRITE_LEFT: - return L"updateLeft"; - case SO_COPY_METADATA_TO_LEFT: - return L"moveLeft"; + return L"so_update_left"; case SO_OVERWRITE_RIGHT: - return L"updateRight"; + return L"so_update_right"; + case SO_COPY_METADATA_TO_LEFT: + return L"so_move_left"; case SO_COPY_METADATA_TO_RIGHT: - return L"moveRight"; + return L"so_move_right"; case SO_DO_NOTHING: - return L"none"; + return L"so_none"; case SO_EQUAL: - return L"equal"; + return L"cat_equal"; case SO_UNRESOLVED_CONFLICT: - return L"conflict"; + return L"cat_conflict"; }; assert(false); return L""; @@ -1217,20 +1230,20 @@ private: switch (cmpRes) { case FILE_LEFT_SIDE_ONLY: - return L"leftOnly"; + return L"cat_left_only"; case FILE_RIGHT_SIDE_ONLY: - return L"rightOnly"; + return L"cat_right_only"; case FILE_LEFT_NEWER: - return L"leftNewer"; + return L"cat_left_newer"; case FILE_RIGHT_NEWER: - return L"rightNewer"; + return L"cat_right_newer"; case FILE_DIFFERENT: - return L"different"; + return L"cat_different"; case FILE_EQUAL: case FILE_DIFFERENT_METADATA: //= sub-category of equal - return L"equal"; + return L"cat_equal"; case FILE_CONFLICT: - return L"conflict"; + return L"cat_conflict"; } assert(false); return L""; @@ -1313,9 +1326,9 @@ public: grid.getMainWin().Connect(wxEVT_KEY_UP, func, nullptr, this); grid.getMainWin().Connect(wxEVT_KEY_DOWN, func, nullptr, this); }; - connectGridAccess(gridL_, wxEventHandler(GridEventManager::onGridAccessL)); - connectGridAccess(gridC_, wxEventHandler(GridEventManager::onGridAccessC)); - connectGridAccess(gridR_, wxEventHandler(GridEventManager::onGridAccessR)); + connectGridAccess(gridL_, wxEventHandler(GridEventManager::onGridAccessL)); // + connectGridAccess(gridC_, wxEventHandler(GridEventManager::onGridAccessC)); //connect *after* onKeyDown() in order to receive callback *before*!!! + connectGridAccess(gridR_, wxEventHandler(GridEventManager::onGridAccessR)); // Connect(EVENT_ALIGN_SCROLLBARS, wxEventHandler(GridEventManager::onAlignScrollBars), NULL, this); } @@ -1391,12 +1404,15 @@ private: case WXK_NUMPAD_LEFT: gridL_.setGridCursor(row); gridL_.SetFocus(); + //since key event is likely originating from right grid, we need to set scrollMaster manually! + scrollMaster = &gridL_; //onKeyDown is called *after* onGridAccessL()! return; //swallow event case WXK_RIGHT: case WXK_NUMPAD_RIGHT: gridR_.setGridCursor(row); gridR_.SetFocus(); + scrollMaster = &gridR_; return; //swallow event } @@ -1715,35 +1731,35 @@ wxBitmap zen::getSyncOpImage(SyncOperation syncOp) switch (syncOp) //evaluate comparison result and sync direction { case SO_CREATE_NEW_LEFT: - return getResourceImage(L"createLeftSmall"); + return getResourceImage(L"so_create_left_small"); case SO_CREATE_NEW_RIGHT: - return getResourceImage(L"createRightSmall"); + return getResourceImage(L"so_create_right_small"); case SO_DELETE_LEFT: - return getResourceImage(L"deleteLeftSmall"); + return getResourceImage(L"so_delete_left_small"); case SO_DELETE_RIGHT: - return getResourceImage(L"deleteRightSmall"); + return getResourceImage(L"so_delete_right_small"); case SO_MOVE_LEFT_SOURCE: - return getResourceImage(L"moveLeftSourceSmall"); + return getResourceImage(L"so_move_left_source_small"); case SO_MOVE_LEFT_TARGET: - return getResourceImage(L"moveLeftTargetSmall"); + return getResourceImage(L"so_move_left_target_small"); case SO_MOVE_RIGHT_SOURCE: - return getResourceImage(L"moveRightSourceSmall"); + return getResourceImage(L"so_move_right_source_small"); case SO_MOVE_RIGHT_TARGET: - return getResourceImage(L"moveRightTargetSmall"); - case SO_OVERWRITE_RIGHT: - return getResourceImage(L"updateRightSmall"); - case SO_COPY_METADATA_TO_RIGHT: - return getResourceImage(L"moveRightSmall"); + return getResourceImage(L"so_move_right_target_small"); case SO_OVERWRITE_LEFT: - return getResourceImage(L"updateLeftSmall"); + return getResourceImage(L"so_update_left_small"); + case SO_OVERWRITE_RIGHT: + return getResourceImage(L"so_update_right_small"); case SO_COPY_METADATA_TO_LEFT: - return getResourceImage(L"moveLeftSmall"); + return getResourceImage(L"so_move_left_small"); + case SO_COPY_METADATA_TO_RIGHT: + return getResourceImage(L"so_move_right_small"); case SO_DO_NOTHING: - return getResourceImage(L"noneSmall"); + return getResourceImage(L"so_none_small"); case SO_EQUAL: - return getResourceImage(L"equalSmall"); + return getResourceImage(L"cat_equal_small"); case SO_UNRESOLVED_CONFLICT: - return getResourceImage(L"conflictSmall"); + return getResourceImage(L"cat_conflict_small"); } return wxNullBitmap; } @@ -1754,20 +1770,20 @@ wxBitmap zen::getCmpResultImage(CompareFilesResult cmpResult) switch (cmpResult) { case FILE_LEFT_SIDE_ONLY: - return getResourceImage(L"leftOnlySmall"); + return getResourceImage(L"cat_left_only_small"); case FILE_RIGHT_SIDE_ONLY: - return getResourceImage(L"rightOnlySmall"); + return getResourceImage(L"cat_right_only_small"); case FILE_LEFT_NEWER: - return getResourceImage(L"leftNewerSmall"); + return getResourceImage(L"cat_left_newer_small"); case FILE_RIGHT_NEWER: - return getResourceImage(L"rightNewerSmall"); + return getResourceImage(L"cat_right_newer_small"); case FILE_DIFFERENT: - return getResourceImage(L"differentSmall"); + return getResourceImage(L"cat_different_small"); case FILE_EQUAL: case FILE_DIFFERENT_METADATA: //= sub-category of equal - return getResourceImage(L"equalSmall"); + return getResourceImage(L"cat_equal_small"); case FILE_CONFLICT: - return getResourceImage(L"conflictSmall"); + return getResourceImage(L"cat_conflict_small"); } return wxNullBitmap; } diff --git a/ui/dir_name.cpp b/ui/dir_name.cpp index 2cfc8a3d..4a3939e9 100644 --- a/ui/dir_name.cpp +++ b/ui/dir_name.cpp @@ -18,7 +18,7 @@ #include "../lib/resolve_path.h" #include "folder_history_box.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include #include "IFileDialog_Vista\ifile_dialog.h" @@ -34,7 +34,7 @@ namespace { void setDirectoryNameImpl(const wxString& dirname, wxWindow& tooltipWnd, wxStaticText* staticText) { - const wxString dirFormatted = utfCvrtTo(getFormattedDirectoryName(toZ(dirname))); + const wxString dirFormatted = utfCvrtTo(getFormattedDirectoryName(toZ(dirname))); //may block when resolving [] tooltipWnd.SetToolTip(nullptr); //workaround wxComboBox bug http://trac.wxwidgets.org/ticket/10512 / http://trac.wxwidgets.org/ticket/12659 tooltipWnd.SetToolTip(dirFormatted); //who knows when the real bugfix reaches mere mortals via an official release... @@ -153,7 +153,7 @@ void DirectoryName::onFilesDropped(FileDropEvent& event) else { wxString parentName = beforeLast(fileName, utfCvrtTo(FILE_NAME_SEPARATOR)); //returns empty string if ch not found -#ifdef FFS_WIN +#ifdef ZEN_WIN if (endsWith(parentName, L":")) //volume name parentName += FILE_NAME_SEPARATOR; #endif @@ -201,7 +201,7 @@ void DirectoryName::onSelectDir(wxCommandEvent& event) //wxDirDialog internally uses lame-looking SHBrowseForFolder(); we better use IFileDialog() instead! (remembers size and position!) std::unique_ptr newFolder; -#ifdef FFS_WIN +#ifdef ZEN_WIN if (vistaOrLater()) { using namespace ifile; diff --git a/ui/exec_finished_box.cpp b/ui/exec_finished_box.cpp index b063ca59..cbbfa17d 100644 --- a/ui/exec_finished_box.cpp +++ b/ui/exec_finished_box.cpp @@ -9,7 +9,7 @@ #include #include #include -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #endif @@ -28,7 +28,7 @@ std::vector> getDefaultCommands() //(gui n auto addEntry = [&](const std::wstring& name, const std::wstring& value) { output.push_back(std::make_pair(name, value)); }; -#ifdef FFS_WIN +#ifdef ZEN_WIN if (zen::vistaOrLater()) { addEntry(_("Standby" ), L"rundll32.exe powrprof.dll,SetSuspendState Sleep"); //suspend/Suspend to RAM/sleep @@ -44,7 +44,7 @@ std::vector> getDefaultCommands() //(gui n //no suspend on XP? } -#elif defined FFS_LINUX +#elif defined ZEN_LINUX addEntry(_("Standby" ), L"sudo pm-suspend"); addEntry(_("Log off" ), L"gnome-session-quit"); //alternative requiring admin: sudo killall Xorg addEntry(_("Shut down"), L"dbus-send --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown"); @@ -52,7 +52,7 @@ std::vector> getDefaultCommands() //(gui n //addEntry(_("Hibernate"), L"sudo pm-hibernate"); //alternative: "pmi action suspend" and "pmi action hibernate", require "sudo apt-get install powermanagement-interaface" -#elif defined FFS_MAC +#elif defined ZEN_MAC addEntry(_("Standby" ), L"osascript -e \'tell application \"System Events\" to sleep\'"); addEntry(_("Log off" ), L"osascript -e \'tell application \"System Events\" to log out\'"); addEntry(_("Shut down"), L"osascript -e \'tell application \"System Events\" to shut down\'"); diff --git a/ui/folder_history_box.cpp b/ui/folder_history_box.cpp index c5400272..89832a98 100644 --- a/ui/folder_history_box.cpp +++ b/ui/folder_history_box.cpp @@ -35,11 +35,11 @@ FolderHistoryBox::FolderHistoryBox(wxWindow* parent, warn_static("mac") warn_static("linux") -#if defined FFS_WIN +#if defined ZEN_WIN //on Win, this mouse click event only fires, when clicking on the small down arrow, NOT when clicking on the text field //thanks to wxWidgets' non-portability it's exactly the converse on Linux! Connect(wxEVT_LEFT_DOWN, wxEventHandler(FolderHistoryBox::OnRequireHistoryUpdate), nullptr, this); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC /* we can't attach to wxEVT_COMMAND_TEXT_UPDATED, since setValueAndUpdateList() will implicitly emit wxEVT_COMMAND_TEXT_UPDATED again when calling Clear()! => Crash on Suse/X11/wxWidgets 2.9.4 on startup (setting a flag to guard against recursion does not work, still crash) @@ -63,7 +63,7 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& dirname) std::vector dirList; { //add some aliases to allow user changing to volume name and back, if possible - std::vector aliases = getDirectoryAliases(toZ(dirname)); + std::vector aliases = getDirectoryAliases(toZ(dirname)); //may block when resolving [] std::transform(aliases.begin(), aliases.end(), std::back_inserter(dirList), [](const Zstring& str) { return utfCvrtTo(str); }); } if (sharedHistory_.get()) diff --git a/ui/folder_history_box.h b/ui/folder_history_box.h index 210f89c0..9ffa2d74 100644 --- a/ui/folder_history_box.h +++ b/ui/folder_history_box.h @@ -42,11 +42,11 @@ public: zen::trim(nameTmp); //insert new folder or put it to the front if already existing - auto iter = std::find_if(dirnames_.begin(), dirnames_.end(), + auto it = std::find_if(dirnames_.begin(), dirnames_.end(), [&](const Zstring& entry) { return ::EqualFilename()(entry, nameTmp); }); - if (iter != dirnames_.end()) - dirnames_.erase(iter); + if (it != dirnames_.end()) + dirnames_.erase(it); dirnames_.insert(dirnames_.begin(), nameTmp); if (dirnames_.size() > maxSize_) //keep maximal size of history list diff --git a/ui/folder_pair.h b/ui/folder_pair.h index 801cd606..11be1e8c 100644 --- a/ui/folder_pair.h +++ b/ui/folder_pair.h @@ -55,7 +55,7 @@ public: basicPanel_.m_bpButtonAltSyncCfg-> Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderPairPanelBasic::OnAltSyncCfg ), nullptr, this); basicPanel_.m_bpButtonLocalFilter->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(FolderPairPanelBasic::OnLocalFilterCfg), nullptr, this); - basicPanel_.m_bpButtonRemovePair->SetBitmapLabel(getResourceImage(L"item_delete")); + basicPanel_.m_bpButtonRemovePair->SetBitmapLabel(getResourceImage(L"item_remove")); } private: @@ -63,23 +63,23 @@ private: { if (altCompConfig.get()) { - setImage(*basicPanel_.m_bpButtonAltCompCfg, getResourceImage(L"cmpConfigSmall")); + setImage(*basicPanel_.m_bpButtonAltCompCfg, getResourceImage(L"cfg_compare_small")); basicPanel_.m_bpButtonAltCompCfg->SetToolTip(_("Selected variant:") + L" " + getVariantName(altCompConfig->compareVar)); } else { - setImage(*basicPanel_.m_bpButtonAltCompCfg, greyScale(getResourceImage(L"cmpConfigSmall"))); + setImage(*basicPanel_.m_bpButtonAltCompCfg, greyScale(getResourceImage(L"cfg_compare_small"))); basicPanel_.m_bpButtonAltCompCfg->SetToolTip(_("Select alternate comparison settings")); } if (altSyncConfig.get()) { - setImage(*basicPanel_.m_bpButtonAltSyncCfg, getResourceImage(L"syncConfigSmall")); + setImage(*basicPanel_.m_bpButtonAltSyncCfg, getResourceImage(L"cfg_sync_small")); basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(_("Selected variant:") + L" " + getVariantName(altSyncConfig->directionCfg.var)); } else { - setImage(*basicPanel_.m_bpButtonAltSyncCfg, greyScale(getResourceImage(L"syncConfigSmall"))); + setImage(*basicPanel_.m_bpButtonAltSyncCfg, greyScale(getResourceImage(L"cfg_sync_small"))); basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(_("Select alternate synchronization settings")); } diff --git a/ui/grid_view.cpp b/ui/grid_view.cpp index a28a7ea4..fa1e9915 100644 --- a/ui/grid_view.cpp +++ b/ui/grid_view.cpp @@ -20,7 +20,7 @@ void getNumbers(const FileSystemObject& fsObj, StatusResult& result) { GetValues(StatusResult& res) : result_(res) {} - virtual void visit(const FileMapping& fileObj) + virtual void visit(const FilePair& fileObj) { if (!fileObj.isEmpty()) { @@ -34,7 +34,7 @@ void getNumbers(const FileSystemObject& fsObj, StatusResult& result) } } - virtual void visit(const SymLinkMapping& linkObj) + virtual void visit(const SymlinkPair& linkObj) { if (!linkObj.isEmpty()) ++result_.filesOnLeftView; @@ -43,7 +43,7 @@ void getNumbers(const FileSystemObject& fsObj, StatusResult& result) ++result_.filesOnRightView; } - virtual void visit(const DirMapping& dirObj) + virtual void visit(const DirPair& dirObj) { if (!dirObj.isEmpty()) ++result_.foldersOnLeftView; @@ -70,11 +70,11 @@ void GridView::updateView(Predicate pred) if (const FileSystemObject* fsObj = FileSystemObject::retrieve(ref.objId)) if (pred(*fsObj)) { - //save row position for direct random access to FileMapping or DirMapping + //save row position for direct random access to FilePair or DirPair this->rowPositions.insert(std::make_pair(ref.objId, viewRef.size())); //costs: 0.28 s per call - MSVC based on std::set //"this->" required by two-pass lookup as enforced by GCC 4.7 - //save row position to identify first child *on sorted subview* of DirMapping or BaseDirMapping in case latter are filtered out + //save row position to identify first child *on sorted subview* of DirPair or BaseDirPair in case latter are filtered out const HierarchyObject* parent = &fsObj->parent(); for (;;) //map all yet unassociated parents to this row { @@ -82,7 +82,7 @@ void GridView::updateView(Predicate pred) if (!rv.second) break; - if (auto dirObj = dynamic_cast(parent)) + if (auto dirObj = dynamic_cast(parent)) parent = &(dirObj->parent()); else break; @@ -216,32 +216,32 @@ GridView::StatusSyncPreview GridView::updateSyncPreview(bool hideFiltered, //map switch (fsObj.getSyncOperation()) //evaluate comparison result and sync direction { case SO_CREATE_NEW_LEFT: - case SO_MOVE_LEFT_TARGET: output.existsSyncCreateLeft = true; if (!syncCreateLeftActive) return false; break; case SO_CREATE_NEW_RIGHT: - case SO_MOVE_RIGHT_TARGET: output.existsSyncCreateRight = true; if (!syncCreateRightActive) return false; break; case SO_DELETE_LEFT: - case SO_MOVE_LEFT_SOURCE: output.existsSyncDeleteLeft = true; if (!syncDeleteLeftActive) return false; break; case SO_DELETE_RIGHT: - case SO_MOVE_RIGHT_SOURCE: output.existsSyncDeleteRight = true; if (!syncDeleteRightActive) return false; break; case SO_OVERWRITE_RIGHT: case SO_COPY_METADATA_TO_RIGHT: //no extra button on screen + case SO_MOVE_RIGHT_SOURCE: + case SO_MOVE_RIGHT_TARGET: output.existsSyncDirRight = true; if (!syncDirOverwRightActive) return false; break; case SO_OVERWRITE_LEFT: case SO_COPY_METADATA_TO_LEFT: //no extra button on screen + case SO_MOVE_LEFT_TARGET: + case SO_MOVE_LEFT_SOURCE: output.existsSyncDirLeft = true; if (!syncDirOverwLeftActive) return false; break; @@ -308,17 +308,17 @@ public: std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), *this); } - void operator()(FileMapping& fileObj) + void operator()(FilePair& fileObj) { sortedRef_.push_back(RefIndex(index_, fileObj.getId())); } - void operator()(SymLinkMapping& linkObj) + void operator()(SymlinkPair& linkObj) { sortedRef_.push_back(RefIndex(index_, linkObj.getId())); } - void operator()(DirMapping& dirObj) + void operator()(DirPair& dirObj) { sortedRef_.push_back(RefIndex(index_, dirObj.getId())); execute(dirObj); //add recursion here to list sub-objects directly below parent! @@ -338,7 +338,7 @@ void GridView::setData(FolderComparison& folderCmp) currentSort.reset(); folderPairCount = std::count_if(begin(folderCmp), end(folderCmp), - [](const BaseDirMapping& baseObj) //count non-empty pairs to distinguish single/multiple folder pair cases + [](const BaseDirPair& baseObj) //count non-empty pairs to distinguish single/multiple folder pair cases { return !baseObj.getBaseDirPf().empty() || !baseObj.getBaseDirPf().empty(); diff --git a/ui/grid_view.h b/ui/grid_view.h index 15f248a3..0cef5dea 100644 --- a/ui/grid_view.h +++ b/ui/grid_view.h @@ -114,7 +114,7 @@ public: const SortInfo* getSortInfo() const { return currentSort.get(); } //return nullptr if currently not sorted ptrdiff_t findRowDirect(FileSystemObject::ObjectIdConst objId) const; // find an object's row position on view list directly, return < 0 if not found - ptrdiff_t findRowFirstChild(const HierarchyObject* hierObj) const; // find first child of DirMapping or BaseDirMapping *on sorted sub view* + ptrdiff_t findRowFirstChild(const HierarchyObject* hierObj) const; // find first child of DirPair or BaseDirPair *on sorted sub view* //"hierObj" may be invalid, it is NOT dereferenced, return < 0 if not found size_t getFolderPairCount() const { return folderPairCount; } //count non-empty pairs to distinguish single/multiple folder pair cases @@ -123,9 +123,9 @@ private: struct RefIndex { RefIndex(size_t folderInd, FileSystemObject::ObjectId id) : - folderIndex(static_cast(folderInd)), + folderIndex(folderInd), objId(id) {} - unsigned int folderIndex; + size_t folderIndex; //because of alignment there's no benefit in using "unsigned int" in 64-bit code here! FileSystemObject::ObjectId objId; }; diff --git a/ui/gui_generated.cpp b/ui/gui_generated.cpp index d2c886d8..3549519c 100644 --- a/ui/gui_generated.cpp +++ b/ui/gui_generated.cpp @@ -20,3359 +20,3389 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxSize( 640,400 ), wxDefaultSize ); - - m_menubar1 = new wxMenuBar( 0 ); - m_menuFile = new wxMenu(); - m_menuItemNew = new wxMenuItem( m_menuFile, wxID_NEW, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL ); -#ifdef __WXMSW__ - m_menuItemNew->SetBitmaps( wxNullBitmap ); -#elif defined( __WXGTK__ ) - m_menuItemNew->SetBitmap( wxNullBitmap ); -#endif - m_menuFile->Append( m_menuItemNew ); - - m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemLoad ); - - m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemSave ); - - m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItemSaveAs ); - - m_menuItem7 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItem7 ); - - m_menuFile->AppendSeparator(); - - m_menuItem10 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL ); -#ifdef __WXMSW__ - m_menuItem10->SetBitmaps( wxNullBitmap ); -#elif defined( __WXGTK__ ) - m_menuItem10->SetBitmap( wxNullBitmap ); -#endif - m_menuFile->Append( m_menuItem10 ); - - m_menuItem11 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("2. &Synchronize") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL ); -#ifdef __WXMSW__ - m_menuItem11->SetBitmaps( wxNullBitmap ); -#elif defined( __WXGTK__ ) - m_menuItem11->SetBitmap( wxNullBitmap ); -#endif - m_menuFile->Append( m_menuItem11 ); - - m_menuFile->AppendSeparator(); - - wxMenuItem* m_menuItem4; - m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuFile->Append( m_menuItem4 ); - - m_menubar1->Append( m_menuFile, _("&Program") ); - - m_menuAdvanced = new wxMenu(); - m_menuLanguages = new wxMenu(); - m_menuAdvanced->Append( -1, _("&Language"), m_menuLanguages ); - - m_menuAdvanced->AppendSeparator(); - - m_menuItemGlobSett = new wxMenuItem( m_menuAdvanced, wxID_PREFERENCES, wxString( _("&Global settings...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuAdvanced->Append( m_menuItemGlobSett ); - - wxMenuItem* m_menuItem5; - m_menuItem5 = new wxMenuItem( m_menuAdvanced, wxID_ANY, wxString( _("&Export file list...") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuAdvanced->Append( m_menuItem5 ); - - m_menubar1->Append( m_menuAdvanced, _("&Advanced") ); - - m_menuHelp = new wxMenu(); - m_menuItemManual = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&Content") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); - m_menuHelp->Append( m_menuItemManual ); - - m_menuCheckVersion = new wxMenu(); - m_menuItemCheckVersionNow = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("&Check now") ) , wxEmptyString, wxITEM_NORMAL ); - m_menuCheckVersion->Append( m_menuItemCheckVersionNow ); - - m_menuItemCheckVersionAuto = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("Check &automatically once a week") ) , wxEmptyString, wxITEM_CHECK ); - m_menuCheckVersion->Append( m_menuItemCheckVersionAuto ); - m_menuItemCheckVersionAuto->Check( true ); - - m_menuHelp->Append( -1, _("Check for new version"), m_menuCheckVersion ); - - m_menuHelp->AppendSeparator(); - - m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL ); - m_menuHelp->Append( m_menuItemAbout ); - - m_menubar1->Append( m_menuHelp, _("&Help") ); - - this->SetMenuBar( m_menubar1 ); - - bSizerPanelHolder = new wxBoxSizer( wxVERTICAL ); - - m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL ); - bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL ); - - - bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - wxFlexGridSizer* fgSizer121; - fgSizer121 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer121->SetFlexibleDirection( wxBOTH ); - fgSizer121->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticTextCmpVariant = new wxStaticText( m_panelTopButtons, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCmpVariant->Wrap( -1 ); - m_staticTextCmpVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - m_staticTextCmpVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - fgSizer121->Add( m_staticTextCmpVariant, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxTOP, 1 ); - - - fgSizer121->Add( 0, 0, 1, 0, 5 ); - - wxBoxSizer* bSizer30; - bSizer30 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonCompare = new zen::BitmapButton( m_panelTopButtons, wxID_OK, _("Compare"), wxDefaultPosition, wxSize( 180,-1 ), 0 ); - m_buttonCompare->SetDefault(); - m_buttonCompare->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - m_buttonCompare->SetToolTip( _("dummy") ); - - bSizer30->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_buttonCancel = new zen::BitmapButton( m_panelTopButtons, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( 180,-1 ), 0 ); - m_buttonCancel->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - m_buttonCancel->Enable( false ); - m_buttonCancel->Hide(); - - bSizer30->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - fgSizer121->Add( bSizer30, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); - m_bpButtonCmpConfig->SetToolTip( _("Comparison settings") ); - - fgSizer121->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 3 ); - - - bSizerTopButtons->Add( fgSizer121, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); - - - bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - wxFlexGridSizer* fgSizer12; - fgSizer12 = new wxFlexGridSizer( 2, 2, 0, 0 ); - fgSizer12->SetFlexibleDirection( wxBOTH ); - fgSizer12->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - - fgSizer12->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextSyncVariant = new wxStaticText( m_panelTopButtons, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSyncVariant->Wrap( -1 ); - m_staticTextSyncVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - m_staticTextSyncVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - fgSizer12->Add( m_staticTextSyncVariant, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP, 1 ); - - m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); - m_bpButtonSyncConfig->SetToolTip( _("Synchronization settings") ); - - fgSizer12->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 ); - - m_buttonSync = new zen::BitmapButton( m_panelTopButtons, wxID_ANY, _("Synchronize"), wxDefaultPosition, wxSize( 180,-1 ), 0 ); - m_buttonSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - m_buttonSync->SetToolTip( _("dummy") ); - - fgSizer12->Add( m_buttonSync, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizerTopButtons->Add( fgSizer12, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); - - - bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - m_panelTopButtons->SetSizer( bSizerTopButtons ); - m_panelTopButtons->Layout(); - bSizerTopButtons->Fit( m_panelTopButtons ); - bSizerPanelHolder->Add( m_panelTopButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1601; - bSizer1601 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer91; - bSizer91 = new wxBoxSizer( wxHORIZONTAL ); - - m_panelTopLeft = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelTopLeft->SetMinSize( wxSize( 1,-1 ) ); - - wxFlexGridSizer* fgSizer8; - fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 ); - fgSizer8->AddGrowableCol( 1 ); - fgSizer8->SetFlexibleDirection( wxBOTH ); - fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL ); - - - fgSizer8->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextResolvedPathL = new wxStaticText( m_panelTopLeft, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextResolvedPathL->Wrap( -1 ); - fgSizer8->Add( m_staticTextResolvedPathL, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 ); - - wxBoxSizer* bSizer159; - bSizer159 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); - - bSizer159->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - bSizer159->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - fgSizer8->Add( bSizer159, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer182; - bSizer182 = new wxBoxSizer( wxHORIZONTAL ); - - m_directoryLeft = new FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer182->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonSelectDirLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectDirLeft->SetToolTip( _("Select a folder") ); - - bSizer182->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - fgSizer8->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - m_panelTopLeft->SetSizer( fgSizer8 ); - m_panelTopLeft->Layout(); - fgSizer8->Fit( m_panelTopLeft ); - bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelTopMiddle = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1771; - bSizer1771 = new wxBoxSizer( wxVERTICAL ); - - - bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonSwapSides = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW ); - m_bpButtonSwapSides->SetToolTip( _("Swap sides") ); - - bSizer1771->Add( m_bpButtonSwapSides, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer160; - bSizer160 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonAltCompCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - bSizer160->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 ); - - m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer1771->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 ); - - - m_panelTopMiddle->SetSizer( bSizer1771 ); - m_panelTopMiddle->Layout(); - bSizer1771->Fit( m_panelTopMiddle ); - bSizer91->Add( m_panelTopMiddle, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelTopRight->SetMinSize( wxSize( 1,-1 ) ); - - wxBoxSizer* bSizer183; - bSizer183 = new wxBoxSizer( wxVERTICAL ); - - m_staticTextResolvedPathR = new wxStaticText( m_panelTopRight, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextResolvedPathR->Wrap( -1 ); - bSizer183->Add( m_staticTextResolvedPathR, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 ); - - wxBoxSizer* bSizer179; - bSizer179 = new wxBoxSizer( wxHORIZONTAL ); - - m_directoryRight = new FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer179->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonSelectDirRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectDirRight->SetToolTip( _("Select a folder") ); - - bSizer179->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer183->Add( bSizer179, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - m_panelTopRight->SetSizer( bSizer183 ); - m_panelTopRight->Layout(); - bSizer183->Fit( m_panelTopRight ); - bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - - bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 ); - - m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); - m_scrolledWindowFolderPairs->SetScrollRate( 10, 10 ); - m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) ); - - bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL ); - - - m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs ); - m_scrolledWindowFolderPairs->Layout(); - bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs ); - bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - m_panelDirectoryPairs->SetSizer( bSizer1601 ); - m_panelDirectoryPairs->Layout(); - bSizer1601->Fit( m_panelDirectoryPairs ); - bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_gridNavi = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridNavi->SetScrollRate( 5, 5 ); - bSizerPanelHolder->Add( m_gridNavi, 1, wxEXPAND, 5 ); - - m_panelCenter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1711; - bSizer1711 = new wxBoxSizer( wxVERTICAL ); - - m_splitterMain = new zen::TripleSplitter( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1781; - bSizer1781 = new wxBoxSizer( wxHORIZONTAL ); - - m_gridMainL = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridMainL->SetScrollRate( 5, 5 ); - bSizer1781->Add( m_gridMainL, 1, wxEXPAND, 5 ); - - m_gridMainC = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridMainC->SetScrollRate( 5, 5 ); - bSizer1781->Add( m_gridMainC, 0, wxEXPAND, 5 ); - - m_gridMainR = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridMainR->SetScrollRate( 5, 5 ); - bSizer1781->Add( m_gridMainR, 1, wxEXPAND, 5 ); - - - m_splitterMain->SetSizer( bSizer1781 ); - m_splitterMain->Layout(); - bSizer1781->Fit( m_splitterMain ); - bSizer1711->Add( m_splitterMain, 1, wxEXPAND, 5 ); - - m_panelStatusBar = new wxPanel( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer451; - bSizer451 = new wxBoxSizer( wxHORIZONTAL ); - - bSizer451->SetMinSize( wxSize( -1,22 ) ); - bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL ); - - bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer53; - bSizer53 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 ); - - m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusLeftDirs->Wrap( -1 ); - bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL ); - - - bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 ); - - m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 ); - - m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusLeftFiles->Wrap( -1 ); - bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 ); - - m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusLeftBytes->Wrap( -1 ); - bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatusLeft->Add( bSizer53, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizerStatusLeft->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 2 ); - - - bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusMiddle->Wrap( -1 ); - m_staticTextStatusMiddle->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizerFileStatus->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL ); - - m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizerStatusRight->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 ); - - wxBoxSizer* bSizer52; - bSizer52 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 ); - - m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusRightDirs->Wrap( -1 ); - bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL ); - - - bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 ); - - m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 ); - - m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusRightFiles->Wrap( -1 ); - bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 ); - - m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatusRightBytes->Wrap( -1 ); - bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatusRight->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerFileStatus->Add( bSizerStatusRight, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer451->Add( bSizerFileStatus, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticTextFullStatus = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextFullStatus->Wrap( -1 ); - m_staticTextFullStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer451->Add( m_staticTextFullStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - m_panelStatusBar->SetSizer( bSizer451 ); - m_panelStatusBar->Layout(); - bSizer451->Fit( m_panelStatusBar ); - bSizer1711->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - m_panelCenter->SetSizer( bSizer1711 ); - m_panelCenter->Layout(); - bSizer1711->Fit( m_panelCenter ); - bSizerPanelHolder->Add( m_panelCenter, 1, wxEXPAND, 5 ); - - m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - bSizerConfig = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer151; - bSizer151 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - m_bpButtonOpen->SetToolTip( _("dummy") ); - - bSizer151->Add( m_bpButtonOpen, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - m_bpButtonSave->SetToolTip( _("dummy") ); - - bSizer151->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonBatchJob = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - m_bpButtonBatchJob->SetToolTip( _("Save as batch job") ); - - bSizer151->Add( m_bpButtonBatchJob, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerConfig->Add( bSizer151, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_listBoxHistory = new wxListBox( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB|wxLB_SORT ); - m_listBoxHistory->SetMinSize( wxSize( -1,40 ) ); - - bSizerConfig->Add( m_listBoxHistory, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - - m_panelConfig->SetSizer( bSizerConfig ); - m_panelConfig->Layout(); - bSizerConfig->Fit( m_panelConfig ); - bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 ); - - m_panelFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer171; - bSizer171 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonFilter = new wxBitmapButton( m_panelFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); - bSizer171->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_checkBoxHideExcluded = new wxCheckBox( m_panelFilter, wxID_ANY, _("Hide excluded items"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxHideExcluded->SetToolTip( _("Show filtered or temporarily excluded files") ); - - bSizer171->Add( m_checkBoxHideExcluded, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - m_panelFilter->SetSizer( bSizer171 ); - m_panelFilter->Layout(); - bSizer171->Fit( m_panelFilter ); - bSizerPanelHolder->Add( m_panelFilter, 0, 0, 5 ); - - m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - bSizer1801 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizerStatistics = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer1712; - bSizer1712 = new wxBoxSizer( wxVERTICAL ); - - m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); - - bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer1712->Add( 5, 2, 0, 0, 5 ); - - - bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCreateLeft->Wrap( -1 ); - m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); - - bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizerStatistics->Add( bSizer1712, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - - wxBoxSizer* bSizer172; - bSizer172 = new wxBoxSizer( wxVERTICAL ); - - m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") ); - - bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer172->Add( 5, 2, 0, 0, 5 ); - - - bSizer172->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextUpdateLeft->Wrap( -1 ); - m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") ); - - bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizerStatistics->Add( bSizer172, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - - wxBoxSizer* bSizer173; - bSizer173 = new wxBoxSizer( wxVERTICAL ); - - m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); - - bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer173->Add( 5, 2, 0, 0, 5 ); - - - bSizer173->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDeleteLeft->Wrap( -1 ); - m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); - - bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatistics->Add( bSizer173, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - - bSizerData = new wxBoxSizer( wxVERTICAL ); - - m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapData->SetToolTip( _("Total bytes to copy") ); - - bSizerData->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizerData->Add( 5, 2, 0, 0, 5 ); - - - bSizerData->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextData->Wrap( -1 ); - m_staticTextData->SetToolTip( _("Total bytes to copy") ); - - bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatistics->Add( bSizerData, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - - wxBoxSizer* bSizer176; - bSizer176 = new wxBoxSizer( wxVERTICAL ); - - m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); - - bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer176->Add( 5, 2, 0, 0, 5 ); - - - bSizer176->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDeleteRight->Wrap( -1 ); - m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); - - bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatistics->Add( bSizer176, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - - wxBoxSizer* bSizer177; - bSizer177 = new wxBoxSizer( wxVERTICAL ); - - m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") ); - - bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer177->Add( 5, 2, 0, 0, 5 ); - - - bSizer177->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextUpdateRight->Wrap( -1 ); - m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") ); - - bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatistics->Add( bSizer177, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizerStatistics->Add( 5, 5, 0, 0, 5 ); - - wxBoxSizer* bSizer178; - bSizer178 = new wxBoxSizer( wxVERTICAL ); - - m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") ); - - bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer178->Add( 5, 2, 0, 0, 5 ); - - - bSizer178->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCreateRight->Wrap( -1 ); - m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") ); - - bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerStatistics->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer1801->Add( bSizerStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 ); - - - m_panelStatistics->SetSizer( bSizer1801 ); - m_panelStatistics->Layout(); - bSizer1801->Fit( m_panelStatistics ); - bSizerPanelHolder->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonViewTypeSyncAction = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonShowCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowUpdateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowDoNothing = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowUpdateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonShowConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); - - - m_panelViewFilter->SetSizer( bSizerViewFilter ); - m_panelViewFilter->Layout(); - bSizerViewFilter->Fit( m_panelViewFilter ); - bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - this->SetSizer( bSizerPanelHolder ); - this->Layout(); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); - this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) ); - this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) ); - this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) ); - this->Connect( m_menuItemSaveAs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) ); - this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) ); - this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); - this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) ); - this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); - this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); - this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); - this->Connect( m_menuItemManual->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) ); - this->Connect( m_menuItemCheckVersionNow->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); - this->Connect( m_menuItemCheckVersionAuto->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) ); - this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); - m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); - m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this ); - m_bpButtonCmpConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this ); - m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this ); - m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this ); - m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); - m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); - m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); - m_bpButtonOpen->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this ); - m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ), NULL, this ); - m_bpButtonBatchJob->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ), NULL, this ); - m_listBoxHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); - m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); - m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistoryDoubleClick ), NULL, this ); - m_listBoxHistory->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCfgHistoryRightClick ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this ); - m_checkBoxHideExcluded->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this ); - m_bpButtonViewTypeSyncAction->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this ); - m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowCreateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowUpdateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowDeleteLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowLeftOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowLeftNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowEqual->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowDifferent->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowRightNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowRightOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowDeleteRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowUpdateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowCreateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowConflict->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); -} - -MainDialogGenerated::~MainDialogGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); - this->Disconnect( wxID_NEW, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) ); - this->Disconnect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) ); - this->Disconnect( wxID_SAVE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) ); - this->Disconnect( wxID_SAVEAS, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) ); - this->Disconnect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); - this->Disconnect( wxID_PREFERENCES, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); - this->Disconnect( wxID_HELP, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); - this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) ); - this->Disconnect( wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); - m_buttonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); - m_bpButtonCmpConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this ); - m_bpButtonCmpConfig->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this ); - m_bpButtonSyncConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this ); - m_bpButtonSyncConfig->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this ); - m_buttonSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); - m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); - m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); - m_bpButtonSwapSides->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); - m_bpButtonOpen->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this ); - m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ), NULL, this ); - m_bpButtonBatchJob->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ), NULL, this ); - m_listBoxHistory->Disconnect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); - m_listBoxHistory->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); - m_listBoxHistory->Disconnect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistoryDoubleClick ), NULL, this ); - m_listBoxHistory->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCfgHistoryRightClick ), NULL, this ); - m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); - m_bpButtonFilter->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this ); - m_checkBoxHideExcluded->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this ); - m_bpButtonViewTypeSyncAction->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this ); - m_bpButtonShowCreateLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowCreateLeft->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowUpdateLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowUpdateLeft->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowDeleteLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowDeleteLeft->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowLeftOnly->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowLeftNewer->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowEqual->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowDifferent->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowDoNothing->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowDoNothing->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowRightNewer->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowRightOnly->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowDeleteRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowDeleteRight->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowUpdateRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowUpdateRight->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowCreateRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowCreateRight->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - m_bpButtonShowConflict->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); - m_bpButtonShowConflict->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); - -} - -FolderPairGenerated::FolderPairGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) -{ - wxBoxSizer* bSizer74; - bSizer74 = new wxBoxSizer( wxHORIZONTAL ); - - m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelLeft->SetMinSize( wxSize( 1,-1 ) ); - - wxBoxSizer* bSizer134; - bSizer134 = new wxBoxSizer( wxHORIZONTAL ); - - m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); - - bSizer134->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectDirLeft->SetToolTip( _("Select a folder") ); - - bSizer134->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - m_panelLeft->SetSizer( bSizer134 ); - m_panelLeft->Layout(); - bSizer134->Fit( m_panelLeft ); - bSizer74->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxEXPAND, 5 ); - - m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonAltCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - bSizer95->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 ); - - m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - bSizer95->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); - - - m_panel20->SetSizer( bSizer95 ); - m_panel20->Layout(); - bSizer95->Fit( m_panel20 ); - bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelRight->SetMinSize( wxSize( 1,-1 ) ); - - wxBoxSizer* bSizer135; - bSizer135 = new wxBoxSizer( wxHORIZONTAL ); - - m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectDirRight->SetToolTip( _("Select a folder") ); - - bSizer135->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - m_panelRight->SetSizer( bSizer135 ); - m_panelRight->Layout(); - bSizer135->Fit( m_panelRight ); - bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 ); - - - this->SetSizer( bSizer74 ); - this->Layout(); - bSizer74->Fit( this ); -} - -FolderPairGenerated::~FolderPairGenerated() -{ -} - -CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) -{ - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer40; - bSizer40 = new wxBoxSizer( wxVERTICAL ); - - - bSizer40->Add( 0, 0, 1, wxEXPAND, 5 ); - - wxBoxSizer* bSizer182; - bSizer182 = new wxBoxSizer( wxVERTICAL ); - - m_textCtrlStatus = new wxTextCtrl( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); - m_textCtrlStatus->SetMaxLength( 0 ); - m_textCtrlStatus->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer182->Add( m_textCtrlStatus, 0, wxEXPAND, 5 ); - - - bSizer40->Add( bSizer182, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL|wxGA_SMOOTH ); - bSizer40->Add( m_gauge2, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); - - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer157; - bSizer157 = new wxBoxSizer( wxVERTICAL ); - - bSizerFilesFound = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText321 = new wxStaticText( this, wxID_ANY, _("Items found:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText321->Wrap( -1 ); - bSizerFilesFound->Add( m_staticText321, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextScanned->Wrap( -1 ); - m_staticTextScanned->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizerFilesFound->Add( m_staticTextScanned, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); - - - bSizer157->Add( bSizerFilesFound, 0, 0, 5 ); - - bSizerFilesRemaining = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText46 = new wxStaticText( this, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText46->Wrap( -1 ); - bSizerFilesRemaining->Add( m_staticText46, 0, wxALIGN_BOTTOM, 5 ); - - wxBoxSizer* bSizer154; - bSizer154 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticTextFilesRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextFilesRemaining->Wrap( -1 ); - m_staticTextFilesRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer154->Add( m_staticTextFilesRemaining, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDataRemaining->Wrap( -1 ); - bSizer154->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); - - - bSizerFilesRemaining->Add( bSizer154, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); - - - bSizer157->Add( bSizerFilesRemaining, 0, 0, 5 ); - - - bSizer42->Add( bSizer157, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - sSizerSpeed = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText104 = new wxStaticText( this, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText104->Wrap( -1 ); - sSizerSpeed->Add( m_staticText104, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSpeed->Wrap( -1 ); - m_staticTextSpeed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - sSizerSpeed->Add( m_staticTextSpeed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - - bSizer42->Add( sSizerSpeed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer42->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - sSizerTimeRemaining = new wxBoxSizer( wxHORIZONTAL ); - - m_staticTextTimeRemFixed = new wxStaticText( this, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeRemFixed->Wrap( -1 ); - sSizerTimeRemaining->Add( m_staticTextTimeRemFixed, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextRemTime = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextRemTime->Wrap( -1 ); - m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - sSizerTimeRemaining->Add( m_staticTextRemTime, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - - bSizer42->Add( sSizerTimeRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); - - sSizerTimeElapsed = new wxBoxSizer( wxHORIZONTAL ); - - wxStaticText* m_staticText37; - m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText37->Wrap( -1 ); - sSizerTimeElapsed->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - sSizerTimeElapsed->Add( m_staticTextTimeElapsed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); - - - bSizer42->Add( sSizerTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); - - - bSizer40->Add( 0, 0, 1, wxEXPAND, 5 ); - - - this->SetSizer( bSizer40 ); - this->Layout(); - bSizer40->Fit( this ); -} - -CompareProgressDlgGenerated::~CompareProgressDlgGenerated() -{ -} - -SyncProgressDlgGenerated::SyncProgressDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxSize( 470,260 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - bSizerRoot = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer42; - bSizer42 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 ); - bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticTextPhase = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextPhase->Wrap( -1 ); - m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); - - m_animationControl1 = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxDefaultSize, wxAC_DEFAULT_STYLE ); - m_animationControl1->SetMinSize( wxSize( 45,45 ) ); - - bSizer42->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - - bSizerRoot->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); - - m_staticlineHeader = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerRoot->Add( m_staticlineHeader, 0, wxEXPAND, 5 ); - - m_panelProgress = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelProgress->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer173; - bSizer173 = new wxBoxSizer( wxVERTICAL ); - - m_staticTextStatus = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextStatus->Wrap( -1 ); - bSizer173->Add( m_staticTextStatus, 0, wxALL|wxEXPAND, 5 ); - - m_gauge1 = new wxGauge( m_panelProgress, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL ); - bSizer173->Add( m_gauge1, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); - - - bSizer173->Add( 0, 10, 0, 0, 5 ); - - bSizer171 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer171->Add( 10, 0, 0, 0, 5 ); - - wxFlexGridSizer* fgSizer10; - fgSizer10 = new wxFlexGridSizer( 0, 2, 2, 5 ); - fgSizer10->SetFlexibleDirection( wxBOTH ); - fgSizer10->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_staticTextLabelItemsProc = new wxStaticText( m_panelProgress, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextLabelItemsProc->Wrap( -1 ); - fgSizer10->Add( m_staticTextLabelItemsProc, 0, wxALIGN_BOTTOM, 5 ); - - bSizerItemsProc = new wxBoxSizer( wxHORIZONTAL ); - - m_staticTextProcessedObj = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_staticTextProcessedObj->Wrap( -1 ); - m_staticTextProcessedObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizerItemsProc->Add( m_staticTextProcessedObj, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextDataProcessed = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDataProcessed->Wrap( -1 ); - bSizerItemsProc->Add( m_staticTextDataProcessed, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); - - - fgSizer10->Add( bSizerItemsProc, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextLabelItemsRem = new wxStaticText( m_panelProgress, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextLabelItemsRem->Wrap( -1 ); - fgSizer10->Add( m_staticTextLabelItemsRem, 0, wxALIGN_BOTTOM, 5 ); - - bSizerItemsRem = new wxBoxSizer( wxHORIZONTAL ); - - m_staticTextRemainingObj = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_staticTextRemainingObj->Wrap( -1 ); - m_staticTextRemainingObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizerItemsRem->Add( m_staticTextRemainingObj, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextDataRemaining = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDataRemaining->Wrap( -1 ); - bSizerItemsRem->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); - - - fgSizer10->Add( bSizerItemsRem, 0, wxALIGN_BOTTOM, 5 ); - - m_staticText84 = new wxStaticText( m_panelProgress, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText84->Wrap( -1 ); - fgSizer10->Add( m_staticText84, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextSpeed = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextSpeed->Wrap( -1 ); - m_staticTextSpeed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - fgSizer10->Add( m_staticTextSpeed, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextLabelRemTime = new wxStaticText( m_panelProgress, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextLabelRemTime->Wrap( -1 ); - fgSizer10->Add( m_staticTextLabelRemTime, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextRemTime = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextRemTime->Wrap( -1 ); - m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - fgSizer10->Add( m_staticTextRemTime, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextLabelElapsedTime = new wxStaticText( m_panelProgress, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextLabelElapsedTime->Wrap( -1 ); - fgSizer10->Add( m_staticTextLabelElapsedTime, 0, wxALIGN_BOTTOM, 5 ); - - m_staticTextTimeElapsed = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextTimeElapsed->Wrap( -1 ); - m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - fgSizer10->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 ); - - - bSizer171->Add( fgSizer10, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer171->Add( 10, 0, 0, 0, 5 ); - - m_panelGraph = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( 340,150 ), wxTAB_TRAVERSAL ); - m_panelGraph->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer171->Add( m_panelGraph, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer173->Add( bSizer171, 1, wxEXPAND, 5 ); - - - m_panelProgress->SetSizer( bSizer173 ); - m_panelProgress->Layout(); - bSizer173->Fit( m_panelProgress ); - bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 ); - - m_listbookResult = new wxListbook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLB_TOP ); - wxSize m_listbookResultImageSize = wxSize( 170,1 ); - int m_listbookResultIndex = 0; - wxImageList* m_listbookResultImages = new wxImageList( m_listbookResultImageSize.GetWidth(), m_listbookResultImageSize.GetHeight() ); - m_listbookResult->AssignImageList( m_listbookResultImages ); - wxBitmap m_listbookResultBitmap; - wxImage m_listbookResultImage; - m_listbookResult->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - - bSizerRoot->Add( m_listbookResult, 1, wxEXPAND, 5 ); - - m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerRoot->Add( m_staticline12, 0, wxEXPAND, 5 ); - - bSizerExecFinished = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText87 = new wxStaticText( this, wxID_ANY, _("On completion"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText87->Wrap( -1 ); - bSizerExecFinished->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_comboBoxExecFinished = new ExecFinishedBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerRoot->Add( bSizerExecFinished, 0, wxTOP|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - bSizer28 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonClose->SetDefault(); - m_buttonClose->Enable( false ); - - bSizer28->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer28->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - - m_buttonAbort = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer28->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - - - bSizerRoot->Add( bSizer28, 0, wxALIGN_RIGHT, 5 ); - - - this->SetSizer( bSizerRoot ); - this->Layout(); - bSizerRoot->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncProgressDlgGenerated::OnClose ) ); - this->Connect( wxEVT_ICONIZE, wxIconizeEventHandler( SyncProgressDlgGenerated::OnIconize ) ); - m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnOkay ), NULL, this ); - m_buttonPause->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnPause ), NULL, this ); - m_buttonAbort->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnAbort ), NULL, this ); -} - -SyncProgressDlgGenerated::~SyncProgressDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncProgressDlgGenerated::OnClose ) ); - this->Disconnect( wxEVT_ICONIZE, wxIconizeEventHandler( SyncProgressDlgGenerated::OnIconize ) ); - m_buttonClose->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnOkay ), NULL, this ); - m_buttonPause->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnPause ), NULL, this ); - m_buttonAbort->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnAbort ), NULL, this ); - -} - -BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxSize( 400,260 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer54; - bSizer54 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapBatchJob = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer72->Add( m_bitmapBatchJob, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Batch job"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - m_staticTextHeader->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_staticText44 = new wxStaticText( this, wxID_ANY, _("Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText44->Wrap( 520 ); - bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer72->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - m_bpButtonHelp->SetToolTip( _("Help") ); - - bSizer72->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer54->Add( bSizer72, 0, wxEXPAND, 5 ); - - m_staticline18 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer54->Add( m_staticline18, 0, wxEXPAND, 5 ); - - m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer172; - bSizer172 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer180; - bSizer180 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer171; - bSizer171 = new wxBoxSizer( wxVERTICAL ); - - m_staticText82 = new wxStaticText( m_panel35, wxID_ANY, _("Error handling"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText82->Wrap( -1 ); - bSizer171->Add( m_staticText82, 0, wxBOTTOM, 5 ); - - wxBoxSizer* bSizer169; - bSizer169 = new wxBoxSizer( wxHORIZONTAL ); - - m_toggleBtnErrorIgnore = new wxToggleButton( m_panel35, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") ); - - bSizer169->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_toggleBtnErrorPopup = new wxToggleButton( m_panel35, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") ); - - bSizer169->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_toggleBtnErrorExit = new wxToggleButton( m_panel35, wxID_ANY, _("Exit"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnErrorExit->SetToolTip( _("Abort synchronization on first error") ); - - bSizer169->Add( m_toggleBtnErrorExit, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer171->Add( bSizer169, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer180->Add( bSizer171, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticline26 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer180->Add( m_staticline26, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer170; - bSizer170 = new wxBoxSizer( wxVERTICAL ); - - m_staticText81 = new wxStaticText( m_panel35, wxID_ANY, _("On completion"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText81->Wrap( -1 ); - bSizer170->Add( m_staticText81, 0, wxBOTTOM, 5 ); - - m_comboBoxExecFinished = new ExecFinishedBox( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer170->Add( m_comboBoxExecFinished, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer180->Add( bSizer170, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer172->Add( bSizer180, 0, wxEXPAND, 5 ); - - m_staticline25 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer172->Add( m_staticline25, 0, wxEXPAND, 5 ); - - m_checkBoxShowProgress = new wxCheckBox( m_panel35, wxID_ANY, _("Show progress dialog"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer172->Add( m_checkBoxShowProgress, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); - - m_checkBoxGenerateLogfile = new wxCheckBox( m_panel35, wxID_ANY, _("Save log"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer172->Add( m_checkBoxGenerateLogfile, 0, wxEXPAND|wxALL, 5 ); - - m_panelLogfile = new wxPanel( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer1721; - bSizer1721 = new wxBoxSizer( wxHORIZONTAL ); - - m_logfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer1721->Add( m_logfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonSelectLogfileDir = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectLogfileDir->SetToolTip( _("Select folder to save log files") ); - - bSizer1721->Add( m_buttonSelectLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_checkBoxLogfilesLimit = new wxCheckBox( m_panelLogfile, wxID_ANY, _("Limit"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") ); - - bSizer1721->Add( m_checkBoxLogfilesLimit, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); - m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") ); - - bSizer1721->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - m_panelLogfile->SetSizer( bSizer1721 ); - m_panelLogfile->Layout(); - bSizer1721->Fit( m_panelLogfile ); - bSizer172->Add( m_panelLogfile, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - - m_panel35->SetSizer( bSizer172 ); - m_panel35->Layout(); - bSizer172->Fit( m_panel35 ); - bSizer54->Add( m_panel35, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer68; - bSizer68 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonSave = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonSave->SetDefault(); - m_buttonSave->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer68->Add( m_buttonSave, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_button6 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer68->Add( m_button6, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer54->Add( bSizer68, 0, wxALIGN_RIGHT, 5 ); - - - this->SetSizer( bSizer54 ); - this->Layout(); - bSizer54->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); - m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); - m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this ); - m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this ); - m_toggleBtnErrorExit->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorExit ), NULL, this ); - m_checkBoxGenerateLogfile->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this ); - m_checkBoxLogfilesLimit->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this ); - m_buttonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); -} - -BatchDlgGenerated::~BatchDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); - m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); - m_toggleBtnErrorIgnore->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this ); - m_toggleBtnErrorPopup->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this ); - m_toggleBtnErrorExit->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorExit ), NULL, this ); - m_checkBoxGenerateLogfile->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this ); - m_checkBoxLogfilesLimit->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this ); - m_buttonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); - -} - -CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer136; - bSizer136 = new wxBoxSizer( wxVERTICAL ); - - m_panel36 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel36->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer159; - bSizer159 = new wxBoxSizer( wxVERTICAL ); - - m_staticText91 = new wxStaticText( m_panel36, wxID_ANY, _("Select variant"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText91->Wrap( -1 ); - bSizer159->Add( m_staticText91, 0, wxALL, 5 ); - - wxFlexGridSizer* fgSizer16; - fgSizer16 = new wxFlexGridSizer( 2, 2, 8, 5 ); - fgSizer16->SetFlexibleDirection( wxBOTH ); - fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_bitmapByTime = new wxStaticBitmap( m_panel36, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapByTime->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); - - fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_toggleBtnTimeSize = new wxToggleButton( m_panel36, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_toggleBtnTimeSize->SetValue( true ); - m_toggleBtnTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - m_toggleBtnTimeSize->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); - - fgSizer16->Add( m_toggleBtnTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_bitmapByContent = new wxStaticBitmap( m_panel36, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapByContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); - - fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_toggleBtnContent = new wxToggleButton( m_panel36, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_toggleBtnContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - m_toggleBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); - - fgSizer16->Add( m_toggleBtnContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer159->Add( fgSizer16, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticline33 = new wxStaticLine( m_panel36, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer159->Add( m_staticline33, 0, wxEXPAND, 5 ); - - m_staticText92 = new wxStaticText( m_panel36, wxID_ANY, _("Symbolic Link handling"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText92->Wrap( -1 ); - bSizer159->Add( m_staticText92, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer177; - bSizer177 = new wxBoxSizer( wxHORIZONTAL ); - - wxArrayString m_choiceHandleSymlinksChoices; - m_choiceHandleSymlinks = new wxChoice( m_panel36, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 ); - m_choiceHandleSymlinks->SetSelection( -1 ); - bSizer177->Add( m_choiceHandleSymlinks, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonHelp = new wxBitmapButton( m_panel36, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - m_bpButtonHelp->SetToolTip( _("Help") ); - - bSizer177->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer159->Add( bSizer177, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - - m_panel36->SetSizer( bSizer159 ); - m_panel36->Layout(); - bSizer159->Fit( m_panel36 ); - bSizer136->Add( m_panel36, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticline14 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer136->Add( m_staticline14, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer22; - bSizer22 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer22->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_button6 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer22->Add( m_button6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer136->Add( bSizer22, 0, wxALIGN_RIGHT, 5 ); - - - this->SetSizer( bSizer136 ); - this->Layout(); - bSizer136->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); - m_toggleBtnTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); - m_toggleBtnTimeSize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_toggleBtnContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); - m_toggleBtnContent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_choiceHandleSymlinks->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); - m_button6->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); -} - -CmpCfgDlgGenerated::~CmpCfgDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); - m_toggleBtnTimeSize->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); - m_toggleBtnTimeSize->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); - m_toggleBtnContent->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); - m_toggleBtnContent->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); - m_choiceHandleSymlinks->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); - m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); - m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); - m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); - -} - -SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer7; - bSizer7 = new wxBoxSizer( wxVERTICAL ); - - m_panel37 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel37->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer181; - bSizer181 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer29; - bSizer29 = new wxBoxSizer( wxVERTICAL ); - - m_staticText86 = new wxStaticText( m_panel37, wxID_ANY, _("Select variant"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText86->Wrap( -1 ); - bSizer29->Add( m_staticText86, 0, wxALL, 5 ); - - wxFlexGridSizer* fgSizer1; - fgSizer1 = new wxFlexGridSizer( 4, 2, 6, 8 ); - fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); - fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_toggleBtnAutomatic = new wxToggleButton( m_panel37, wxID_ANY, _("<- Two way ->"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnAutomatic->SetValue( true ); - m_toggleBtnAutomatic->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_toggleBtnAutomatic, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticTextAutomatic = new wxStaticText( m_panel37, wxID_ANY, _("Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextAutomatic->Wrap( 450 ); - fgSizer1->Add( m_staticTextAutomatic, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_toggleBtnMirror = new wxToggleButton( m_panel37, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_toggleBtnMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticTextMirror = new wxStaticText( m_panel37, wxID_ANY, _("Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMirror->Wrap( 450 ); - fgSizer1->Add( m_staticTextMirror, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_toggleBtnUpdate = new wxToggleButton( m_panel37, wxID_ANY, _("Update ->"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_toggleBtnUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticTextUpdate = new wxStaticText( m_panel37, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextUpdate->Wrap( 450 ); - fgSizer1->Add( m_staticTextUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_toggleBtnCustom = new wxToggleButton( m_panel37, wxID_ANY, _("Custom"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - fgSizer1->Add( m_toggleBtnCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticTextCustom = new wxStaticText( m_panel37, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCustom->Wrap( 450 ); - fgSizer1->Add( m_staticTextCustom, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer29->Add( fgSizer1, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - bSizerExtraConfig = new wxBoxSizer( wxVERTICAL ); - - m_staticline321 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizerExtraConfig->Add( m_staticline321, 0, wxEXPAND, 5 ); - - bSizer179 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer174; - bSizer174 = new wxBoxSizer( wxVERTICAL ); - - m_staticText88 = new wxStaticText( m_panel37, wxID_ANY, _("Error handling"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText88->Wrap( -1 ); - bSizer174->Add( m_staticText88, 0, wxBOTTOM, 5 ); - - wxBoxSizer* bSizer175; - bSizer175 = new wxBoxSizer( wxHORIZONTAL ); - - m_toggleBtnErrorIgnore = new wxToggleButton( m_panel37, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") ); - - bSizer175->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_toggleBtnErrorPopup = new wxToggleButton( m_panel37, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") ); - - bSizer175->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer174->Add( bSizer175, 0, 0, 5 ); - - - bSizer179->Add( bSizer174, 0, wxALL, 5 ); - - m_staticline36 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer179->Add( m_staticline36, 0, wxEXPAND, 5 ); - - bSizerOnCompletion = new wxBoxSizer( wxVERTICAL ); - - m_staticText89 = new wxStaticText( m_panel37, wxID_ANY, _("On completion"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText89->Wrap( -1 ); - bSizerOnCompletion->Add( m_staticText89, 0, wxBOTTOM, 5 ); - - m_comboBoxExecFinished = new ExecFinishedBox( m_panel37, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizerOnCompletion->Add( m_comboBoxExecFinished, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer179->Add( bSizerOnCompletion, 1, wxALL, 5 ); - - - bSizerExtraConfig->Add( bSizer179, 0, wxEXPAND, 5 ); - - - bSizer29->Add( bSizerExtraConfig, 0, wxEXPAND, 5 ); - - m_staticline32 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer29->Add( m_staticline32, 0, wxEXPAND, 5 ); - - bSizerNamingConvention = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText87 = new wxStaticText( m_panel37, wxID_ANY, _("Deletion handling"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText87->Wrap( -1 ); - bSizerNamingConvention->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); - - - bSizerNamingConvention->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizerVersioningNamingConvention = new wxBoxSizer( wxHORIZONTAL ); - - m_staticTextNamingCvtPart1 = new wxStaticText( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextNamingCvtPart1->Wrap( -1 ); - m_staticTextNamingCvtPart1->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - bSizerVersioningNamingConvention->Add( m_staticTextNamingCvtPart1, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextNamingCvtPart2Bold = new wxStaticText( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextNamingCvtPart2Bold->Wrap( -1 ); - m_staticTextNamingCvtPart2Bold->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - m_staticTextNamingCvtPart2Bold->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - bSizerVersioningNamingConvention->Add( m_staticTextNamingCvtPart2Bold, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextNamingCvtPart3 = new wxStaticText( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextNamingCvtPart3->Wrap( -1 ); - m_staticTextNamingCvtPart3->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - bSizerVersioningNamingConvention->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerNamingConvention->Add( bSizerVersioningNamingConvention, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer29->Add( bSizerNamingConvention, 0, wxTOP|wxEXPAND, 5 ); - - wxBoxSizer* bSizer180; - bSizer180 = new wxBoxSizer( wxHORIZONTAL ); - - m_toggleBtnPermanent = new wxToggleButton( m_panel37, wxID_ANY, _("Permanent"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnPermanent->SetToolTip( _("Delete or overwrite files permanently") ); - - bSizer180->Add( m_toggleBtnPermanent, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_toggleBtnRecycler = new wxToggleButton( m_panel37, wxID_ANY, _("Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnRecycler->SetToolTip( _("Use Recycle Bin for deleted and overwritten files") ); - - bSizer180->Add( m_toggleBtnRecycler, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_toggleBtnVersioning = new wxToggleButton( m_panel37, wxID_ANY, _("Versioning"), wxDefaultPosition, wxDefaultSize, 0 ); - m_toggleBtnVersioning->SetToolTip( _("Move files to user-defined folder") ); - - bSizer180->Add( m_toggleBtnVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer180->Add( 0, 0, 1, wxEXPAND, 5 ); - - bSizerVersioningStyle = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText93 = new wxStaticText( m_panel37, wxID_ANY, _("Naming convention:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText93->Wrap( -1 ); - bSizerVersioningStyle->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - wxArrayString m_choiceVersioningStyleChoices; - m_choiceVersioningStyle = new wxChoice( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVersioningStyleChoices, 0 ); - m_choiceVersioningStyle->SetSelection( 0 ); - bSizerVersioningStyle->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer180->Add( bSizerVersioningStyle, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer29->Add( bSizer180, 0, wxEXPAND|wxALL, 5 ); - - m_panelVersioning = new wxPanel( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - wxBoxSizer* bSizer156; - bSizer156 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer1151; - bSizer1151 = new wxBoxSizer( wxHORIZONTAL ); - - m_versioningFolder = new FolderHistoryBox( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); - bSizer1151->Add( m_versioningFolder, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonSelectDirVersioning = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonSelectDirVersioning->SetToolTip( _("Select a folder") ); - - bSizer1151->Add( m_buttonSelectDirVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer156->Add( bSizer1151, 0, wxEXPAND, 5 ); - - - m_panelVersioning->SetSizer( bSizer156 ); - m_panelVersioning->Layout(); - bSizer156->Fit( m_panelVersioning ); - bSizer29->Add( m_panelVersioning, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - - bSizer181->Add( bSizer29, 0, wxEXPAND, 5 ); - - m_staticline31 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer181->Add( m_staticline31, 0, wxEXPAND, 5 ); - - bSizerConfig = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer18011; - bSizer18011 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticTextHeaderCategory1 = new wxStaticText( m_panel37, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); - m_staticTextHeaderCategory1->Wrap( -1 ); - bSizer18011->Add( m_staticTextHeaderCategory1, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer18011->Add( 5, 0, 0, 0, 5 ); - - m_staticTextHeaderAction1 = new wxStaticText( m_panel37, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT ); - m_staticTextHeaderAction1->Wrap( -1 ); - bSizer18011->Add( m_staticTextHeaderAction1, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizerConfig->Add( bSizer18011, 0, wxEXPAND, 5 ); - - - bSizerConfig->Add( 0, 5, 0, 0, 5 ); - - m_bitmapDatabase = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizerConfig->Add( m_bitmapDatabase, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 ); - - wxBoxSizer* sbSizerKeepWidthStableIfSyncDirsNotShown; - sbSizerKeepWidthStableIfSyncDirsNotShown = new wxBoxSizer( wxHORIZONTAL ); - - - sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 45, 0, 0, 0, 5 ); - - - sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 5, 0, 0, 0, 5 ); - - - sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 46, 0, 0, 0, 5 ); - - - bSizerConfig->Add( sbSizerKeepWidthStableIfSyncDirsNotShown, 0, 0, 5 ); - - sbSizerSyncDirections = new wxBoxSizer( wxVERTICAL ); - - bSizerLeftOnly = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapLeftOnly = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") ); - - bSizerLeftOnly->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerLeftOnly->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bpButtonLeftOnly = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); - bSizerLeftOnly->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizerSyncDirections->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerRightOnly = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapRightOnly = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") ); - - bSizerRightOnly->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerRightOnly->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonRightOnly = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); - bSizerRightOnly->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizerSyncDirections->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerLeftNewer = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapLeftNewer = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapLeftNewer->SetToolTip( _("Left side is newer") ); - - bSizerLeftNewer->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerLeftNewer->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonLeftNewer = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); - bSizerLeftNewer->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizerSyncDirections->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerRightNewer = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapRightNewer = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapRightNewer->SetToolTip( _("Right side is newer") ); - - bSizerRightNewer->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerRightNewer->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonRightNewer = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); - bSizerRightNewer->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizerSyncDirections->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerDifferent = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapDifferent = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapDifferent->SetToolTip( _("Items have different content") ); - - bSizerDifferent->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerDifferent->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonDifferent = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); - bSizerDifferent->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizerSyncDirections->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - bSizerConflict = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapConflict = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); - m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") ); - - bSizerConflict->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizerConflict->Add( 5, 0, 0, 0, 5 ); - - m_bpButtonConflict = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); - bSizerConflict->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - sbSizerSyncDirections->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizerConfig->Add( sbSizerSyncDirections, 0, wxEXPAND, 5 ); - - - bSizer181->Add( bSizerConfig, 0, wxALL|wxEXPAND, 5 ); - - - m_panel37->SetSizer( bSizer181 ); - m_panel37->Layout(); - bSizer181->Fit( m_panel37 ); - bSizer7->Add( m_panel37, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticline15 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer7->Add( m_staticline15, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer291; - bSizer291 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOK->SetDefault(); - m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer291->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - m_button16 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer291->Add( m_button16, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer7->Add( bSizer291, 0, wxALIGN_RIGHT, 5 ); - - - this->SetSizer( bSizer7 ); - this->Layout(); - bSizer7->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); - m_toggleBtnAutomatic->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); - m_toggleBtnAutomatic->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_toggleBtnMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); - m_toggleBtnMirror->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_toggleBtnUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); - m_toggleBtnUpdate->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_toggleBtnCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); - m_toggleBtnCustom->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorIgnore ), NULL, this ); - m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorPopup ), NULL, this ); - m_toggleBtnPermanent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionPermanent ), NULL, this ); - m_toggleBtnRecycler->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionRecycler ), NULL, this ); - m_toggleBtnVersioning->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionVersioning ), NULL, this ); - m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnParameterChange ), NULL, this ); - m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this ); - m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); - m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); -} - -SyncCfgDlgGenerated::~SyncCfgDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); - m_toggleBtnAutomatic->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this ); - m_toggleBtnAutomatic->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this ); - m_toggleBtnMirror->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); - m_toggleBtnMirror->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); - m_toggleBtnUpdate->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); - m_toggleBtnUpdate->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); - m_toggleBtnCustom->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); - m_toggleBtnCustom->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); - m_toggleBtnErrorIgnore->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorIgnore ), NULL, this ); - m_toggleBtnErrorPopup->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorPopup ), NULL, this ); - m_toggleBtnPermanent->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionPermanent ), NULL, this ); - m_toggleBtnRecycler->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionRecycler ), NULL, this ); - m_toggleBtnVersioning->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionVersioning ), NULL, this ); - m_choiceVersioningStyle->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnParameterChange ), NULL, this ); - m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); - m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); - m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); - m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this ); - m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this ); - m_bpButtonConflict->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); - m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); - -} - -LogControlGenerated::LogControlGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) -{ - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer179; - bSizer179 = new wxBoxSizer( wxVERTICAL ); - - m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer179->Add( m_staticline12, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer153; - bSizer153 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer154; - bSizer154 = new wxBoxSizer( wxVERTICAL ); - - m_bpButtonErrors = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); - bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonWarnings = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); - bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bpButtonInfo = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); - bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer153->Add( m_staticline13, 0, wxEXPAND, 5 ); - - m_gridMessages = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); - m_gridMessages->SetScrollRate( 5, 5 ); - bSizer153->Add( m_gridMessages, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer179->Add( bSizer153, 1, wxEXPAND, 5 ); - - - this->SetSizer( bSizer179 ); - this->Layout(); - bSizer179->Fit( this ); - - // Connect Events - m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnErrors ), NULL, this ); - m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnWarnings ), NULL, this ); - m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnInfo ), NULL, this ); -} - -LogControlGenerated::~LogControlGenerated() -{ - // Disconnect Events - m_bpButtonErrors->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnErrors ), NULL, this ); - m_bpButtonWarnings->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnWarnings ), NULL, this ); - m_bpButtonInfo->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogControlGenerated::OnInfo ), NULL, this ); - -} - -AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer31; - bSizer31 = new wxBoxSizer( wxVERTICAL ); - - m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer162; - bSizer162 = new wxBoxSizer( wxVERTICAL ); - - m_bitmapLogo = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer162->Add( m_bitmapLogo, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticline341 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer162->Add( m_staticline341, 0, wxEXPAND, 5 ); - - m_build = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_build->Wrap( -1 ); - bSizer162->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticline3411 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer162->Add( m_staticline3411, 0, wxEXPAND, 5 ); - - m_staticText72 = new wxStaticText( m_panel41, wxID_ANY, _("Source code written in C++ using:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText72->Wrap( -1 ); - m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer162->Add( m_staticText72, 0, wxALL, 5 ); - - wxBoxSizer* bSizer171; - bSizer171 = new wxBoxSizer( wxHORIZONTAL ); - - m_hyperlink11 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MS Visual C++"), wxT("http://msdn.microsoft.com/library/60k1461a.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink11->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink9 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink9->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink10 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink7 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink7->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink14 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink14->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer162->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer172; - bSizer172 = new wxBoxSizer( wxHORIZONTAL ); - - m_hyperlink15 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zenXML"), wxT("http://zenxml.sourceforge.net/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink15->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink13 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink13->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer172->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink16 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink16->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer172->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink12 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink12->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer162->Add( bSizer172, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_panel40 = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel40->SetBackgroundColour( wxColour( 153, 170, 187 ) ); - - wxBoxSizer* bSizer183; - bSizer183 = new wxBoxSizer( wxVERTICAL ); - - m_panel39 = new wxPanel( m_panel40, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel39->SetBackgroundColour( wxColour( 221, 221, 255 ) ); - - wxBoxSizer* bSizer184; - bSizer184 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer178; - bSizer178 = new wxBoxSizer( wxVERTICAL ); - - m_staticText83 = new wxStaticText( m_panel39, wxID_ANY, _("If you like FreeFileSync"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText83->Wrap( -1 ); - m_staticText83->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 93, 92, false, wxEmptyString ) ); - m_staticText83->SetForegroundColour( wxColour( 0, 0, 0 ) ); - - bSizer178->Add( m_staticText83, 0, wxALL, 5 ); - - m_buttonDonate = new wxButton( m_panel39, wxID_ANY, _("Donate with PayPal"), wxDefaultPosition, wxDefaultSize, 0 ); - m_buttonDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) ); - m_buttonDonate->SetToolTip( _("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zenju@gmx.de&no_shipping=1&lc=US¤cy_code=EUR") ); - - bSizer178->Add( m_buttonDonate, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_RIGHT, 5 ); - - - bSizer184->Add( bSizer178, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - m_animCtrlWink = new wxAnimationCtrl( m_panel39, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( -1,-1 ), wxAC_DEFAULT_STYLE ); - bSizer184->Add( m_animCtrlWink, 0, 0, 5 ); - - - m_panel39->SetSizer( bSizer184 ); - m_panel39->Layout(); - bSizer184->Fit( m_panel39 ); - bSizer183->Add( m_panel39, 0, wxEXPAND|wxALL, 5 ); - - - m_panel40->SetSizer( bSizer183 ); - m_panel40->Layout(); - bSizer183->Fit( m_panel40 ); - bSizer162->Add( m_panel40, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_scrolledWindowTranslators = new wxScrolledWindow( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); - m_scrolledWindowTranslators->SetScrollRate( 10, 10 ); - m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - m_scrolledWindowTranslators->SetMinSize( wxSize( -1,180 ) ); - - bSizerTranslators = new wxBoxSizer( wxVERTICAL ); - - m_staticText54 = new wxStaticText( m_scrolledWindowTranslators, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText54->Wrap( -1 ); - m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizerTranslators->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); - - - bSizerTranslators->Add( 0, 5, 0, 0, 5 ); - - fgSizerTranslators = new wxFlexGridSizer( 50, 3, 2, 20 ); - fgSizerTranslators->SetFlexibleDirection( wxBOTH ); - fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - - bSizerTranslators->Add( fgSizerTranslators, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); - - - m_scrolledWindowTranslators->SetSizer( bSizerTranslators ); - m_scrolledWindowTranslators->Layout(); - bSizerTranslators->Fit( m_scrolledWindowTranslators ); - bSizer162->Add( m_scrolledWindowTranslators, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticline43 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer162->Add( m_staticline43, 0, wxEXPAND, 5 ); - - m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Feedback and suggestions are welcome"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText94->Wrap( -1 ); - bSizer162->Add( m_staticText94, 0, wxALL, 5 ); - - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer170; - bSizer170 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer170->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_hyperlink1 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Homepage"), wxT("http://freefilesync.sourceforge.net/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) ); - m_hyperlink1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - m_hyperlink1->SetToolTip( _("http://sourceforge.net/projects/freefilesync/") ); - - bSizer170->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap9 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_bitmap9->SetToolTip( _("FreeFileSync at Sourceforge") ); - - bSizer170->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer170->Add( 0, 0, 1, wxEXPAND, 5 ); - - - bSizer166->Add( bSizer170, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer1711; - bSizer1711 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer1711->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_hyperlink2 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Email"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) ); - m_hyperlink2->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - m_hyperlink2->SetToolTip( _("zenju@gmx.de") ); - - bSizer1711->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap10 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_bitmap10->SetToolTip( _("Email") ); - - bSizer1711->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer1711->Add( 0, 0, 1, wxEXPAND, 5 ); - - - bSizer166->Add( bSizer1711, 1, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer162->Add( bSizer166, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - m_staticline34 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer162->Add( m_staticline34, 0, wxEXPAND, 5 ); - - m_staticText93 = new wxStaticText( m_panel41, wxID_ANY, _("Published under the GNU General Public License"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText93->Wrap( -1 ); - bSizer162->Add( m_staticText93, 0, wxALL, 5 ); - - wxBoxSizer* bSizer1671; - bSizer1671 = new wxBoxSizer( wxHORIZONTAL ); - - - bSizer1671->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmap13 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer1671->Add( m_bitmap13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_hyperlink5 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); - m_hyperlink5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - bSizer1671->Add( m_hyperlink5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer1671->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer162->Add( bSizer1671, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - - m_panel41->SetSizer( bSizer162 ); - m_panel41->Layout(); - bSizer162->Fit( m_panel41 ); - bSizer31->Add( m_panel41, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer31->Add( m_staticline36, 0, wxEXPAND, 5 ); - - m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonClose->SetDefault(); - bSizer31->Add( m_buttonClose, 0, wxALL|wxALIGN_RIGHT, 5 ); - - - this->SetSizer( bSizer31 ); - this->Layout(); - bSizer31->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); - m_buttonDonate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this ); - m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); -} - -AboutDlgGenerated::~AboutDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); - m_buttonDonate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this ); - m_buttonClose->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); - -} - -MessageDlgGenerated::MessageDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxSize( 300,160 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel33->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer165; - bSizer165 = new wxBoxSizer( wxVERTICAL ); - - - bSizer165->Add( 0, 10, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer26; - bSizer26 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapMsgType = new wxStaticBitmap( m_panel33, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer26->Add( m_bitmapMsgType, 0, wxRIGHT|wxLEFT, 5 ); - - m_textCtrlMessage = new wxTextCtrl( m_panel33, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 420,150 ), wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER ); - m_textCtrlMessage->SetMaxLength( 0 ); - bSizer26->Add( m_textCtrlMessage, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer165->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - m_panel33->SetSizer( bSizer165 ); - m_panel33->Layout(); - bSizer165->Fit( m_panel33 ); - bSizer24->Add( m_panel33, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticline6 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer24->Add( m_staticline6, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - wxBoxSizer* bSizer177; - bSizer177 = new wxBoxSizer( wxVERTICAL ); - - m_checkBoxCustom = new wxCheckBox( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer177->Add( m_checkBoxCustom, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonCustom1 = new wxButton( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer25->Add( m_buttonCustom1, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonCustom2 = new wxButton( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer25->Add( m_buttonCustom2, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer25->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer177->Add( bSizer25, 0, wxALIGN_RIGHT, 5 ); - - - bSizer24->Add( bSizer177, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - this->SetSizer( bSizer24 ); - this->Layout(); - bSizer24->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MessageDlgGenerated::OnClose ) ); - m_checkBoxCustom->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnCheckBoxClick ), NULL, this ); - m_buttonCustom1->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnButton1 ), NULL, this ); - m_buttonCustom2->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnButton2 ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnCancel ), NULL, this ); -} - -MessageDlgGenerated::~MessageDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MessageDlgGenerated::OnClose ) ); - m_checkBoxCustom->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnCheckBoxClick ), NULL, this ); - m_buttonCustom1->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnButton1 ), NULL, this ); - m_buttonCustom2->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnButton2 ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnCancel ), NULL, this ); - -} - -DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxSize( 300,180 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer24; - bSizer24 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer41; - bSizer41 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapDeleteType = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer41->Add( m_bitmapDeleteType, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - bSizer41->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer24->Add( bSizer41, 0, 0, 5 ); - - m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer24->Add( m_staticline91, 0, wxEXPAND, 5 ); - - m_textCtrlFileList = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 550,200 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER ); - m_textCtrlFileList->SetMaxLength( 0 ); - bSizer24->Add( m_textCtrlFileList, 1, wxEXPAND, 5 ); - - m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer180; - bSizer180 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer99; - bSizer99 = new wxBoxSizer( wxVERTICAL ); - - m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer99->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 ); - - m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 ); - m_checkBoxDeleteBothSides->Hide(); - m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") ); - - bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - - bSizer180->Add( bSizer99, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - wxBoxSizer* bSizer25; - bSizer25 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOK->SetDefault(); - m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer25->Add( m_buttonOK, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer25->Add( m_buttonCancel, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer180->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer24->Add( bSizer180, 0, wxEXPAND, 5 ); - - - this->SetSizer( bSizer24 ); - this->Layout(); - bSizer24->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); - m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); - m_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); - m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); - m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); -} - -DeleteDlgGenerated::~DeleteDlgGenerated() -{ - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); - m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); - m_checkBoxDeleteBothSides->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); - m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); - m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); - -} - -FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) -{ - this->SetSizeHints( wxSize( 500,300 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer21; - bSizer21 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmap26 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer72->Add( m_bitmap26, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - m_staticTextHeader->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); - - m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files that match all filter settings will be synchronized.\nNote: File names must be relative to base directories!"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_staticText44->Wrap( 480 ); - bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); - - - bSizer72->Add( 0, 0, 1, wxEXPAND, 5 ); - - m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); - m_bpButtonHelp->SetToolTip( _("Help") ); - - bSizer72->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer21->Add( bSizer72, 0, wxEXPAND, 5 ); - - m_staticline17 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer21->Add( m_staticline17, 0, wxEXPAND, 5 ); - - m_panel38 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel38->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer159; - bSizer159 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); - - m_staticText78 = new wxStaticText( m_panel38, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText78->Wrap( -1 ); - bSizer166->Add( m_staticText78, 0, wxALL, 5 ); - - wxBoxSizer* bSizer1661; - bSizer1661 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapInclude = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - - m_textCtrlInclude = new wxTextCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); - m_textCtrlInclude->SetMaxLength( 0 ); - bSizer1661->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - bSizer166->Add( bSizer1661, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 ); - - m_staticline22 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer166->Add( m_staticline22, 0, wxEXPAND, 5 ); - - m_staticText77 = new wxStaticText( m_panel38, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText77->Wrap( -1 ); - bSizer166->Add( m_staticText77, 0, wxALL, 5 ); - - wxBoxSizer* bSizer1651; - bSizer1651 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapExclude = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); - bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlExclude = new wxTextCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); - m_textCtrlExclude->SetMaxLength( 0 ); - bSizer1651->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - bSizer166->Add( bSizer1651, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 ); - - - bSizer159->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - m_staticline24 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer159->Add( m_staticline24, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer160; - bSizer160 = new wxBoxSizer( wxVERTICAL ); - - m_staticText79 = new wxStaticText( m_panel38, wxID_ANY, _("Time span"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText79->Wrap( -1 ); - bSizer160->Add( m_staticText79, 0, wxALL, 5 ); - - wxBoxSizer* bSizer167; - bSizer167 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapFilterDate = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 ); - bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 ); - - wxBoxSizer* bSizer165; - bSizer165 = new wxBoxSizer( wxVERTICAL ); - - m_spinCtrlTimespan = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer165->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxArrayString m_choiceUnitTimespanChoices; - m_choiceUnitTimespan = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 ); - m_choiceUnitTimespan->SetSelection( 0 ); - bSizer165->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); - - - bSizer160->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); - - m_staticline23 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 ); - - m_staticText80 = new wxStaticText( m_panel38, wxID_ANY, _("File size"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText80->Wrap( -1 ); - bSizer160->Add( m_staticText80, 0, wxALL, 5 ); - - wxBoxSizer* bSizer168; - bSizer168 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapFilterSize = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 ); - bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); - - wxBoxSizer* bSizer158; - bSizer158 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer162; - bSizer162 = new wxBoxSizer( wxVERTICAL ); - - m_staticText101 = new wxStaticText( m_panel38, wxID_ANY, _("Minimum"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText101->Wrap( -1 ); - bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 ); - - m_spinCtrlMinSize = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxArrayString m_choiceUnitMinSizeChoices; - m_choiceUnitMinSize = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 ); - m_choiceUnitMinSize->SetSelection( 0 ); - bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer158->Add( bSizer162, 0, wxBOTTOM|wxEXPAND, 5 ); - - wxBoxSizer* bSizer163; - bSizer163 = new wxBoxSizer( wxVERTICAL ); - - m_staticText102 = new wxStaticText( m_panel38, wxID_ANY, _("Maximum"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText102->Wrap( -1 ); - bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 ); - - m_spinCtrlMaxSize = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); - bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxArrayString m_choiceUnitMaxSizeChoices; - m_choiceUnitMaxSize = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 ); - m_choiceUnitMaxSize->SetSelection( 0 ); - bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer158->Add( bSizer163, 0, wxEXPAND, 5 ); + this->SetSizeHints( wxSize( 640,400 ), wxDefaultSize ); + + m_menubar1 = new wxMenuBar( 0 ); + m_menuFile = new wxMenu(); + m_menuItemNew = new wxMenuItem( m_menuFile, wxID_NEW, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL ); + #ifdef __WXMSW__ + m_menuItemNew->SetBitmaps( wxNullBitmap ); + #elif defined( __WXGTK__ ) + m_menuItemNew->SetBitmap( wxNullBitmap ); + #endif + m_menuFile->Append( m_menuItemNew ); + + m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemLoad ); + + m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemSave ); + + m_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItemSaveAs ); + + m_menuItem7 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("Save as &batch job...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItem7 ); + + m_menuFile->AppendSeparator(); + + m_menuItem10 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("1. &Compare") ) + wxT('\t') + wxT("F5"), wxEmptyString, wxITEM_NORMAL ); + #ifdef __WXMSW__ + m_menuItem10->SetBitmaps( wxNullBitmap ); + #elif defined( __WXGTK__ ) + m_menuItem10->SetBitmap( wxNullBitmap ); + #endif + m_menuFile->Append( m_menuItem10 ); + + m_menuItem11 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("2. &Synchronize") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL ); + #ifdef __WXMSW__ + m_menuItem11->SetBitmaps( wxNullBitmap ); + #elif defined( __WXGTK__ ) + m_menuItem11->SetBitmap( wxNullBitmap ); + #endif + m_menuFile->Append( m_menuItem11 ); + + m_menuFile->AppendSeparator(); + + wxMenuItem* m_menuItem4; + m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuFile->Append( m_menuItem4 ); + + m_menubar1->Append( m_menuFile, _("&Program") ); + + m_menuTools = new wxMenu(); + m_menuLanguages = new wxMenu(); + m_menuTools->Append( -1, _("&Language"), m_menuLanguages ); + + m_menuTools->AppendSeparator(); + + wxMenuItem* m_menuItem5; + m_menuItem5 = new wxMenuItem( m_menuTools, wxID_ANY, wxString( _("&Export file list...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItem5 ); + + m_menuItemGlobSett = new wxMenuItem( m_menuTools, wxID_PREFERENCES, wxString( _("&Global settings...") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuTools->Append( m_menuItemGlobSett ); + + m_menubar1->Append( m_menuTools, _("&Tools") ); + + m_menuHelp = new wxMenu(); + m_menuItemManual = new wxMenuItem( m_menuHelp, wxID_HELP, wxString( _("&Content") ) + wxT('\t') + wxT("F1"), wxEmptyString, wxITEM_NORMAL ); + m_menuHelp->Append( m_menuItemManual ); + + m_menuCheckVersion = new wxMenu(); + m_menuItemCheckVersionNow = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("&Check now") ) , wxEmptyString, wxITEM_NORMAL ); + m_menuCheckVersion->Append( m_menuItemCheckVersionNow ); + + m_menuItemCheckVersionAuto = new wxMenuItem( m_menuCheckVersion, wxID_ANY, wxString( _("Check &automatically once a week") ) , wxEmptyString, wxITEM_CHECK ); + m_menuCheckVersion->Append( m_menuItemCheckVersionAuto ); + m_menuItemCheckVersionAuto->Check( true ); + + m_menuHelp->Append( -1, _("Check for new &version"), m_menuCheckVersion ); + + m_menuHelp->AppendSeparator(); + + m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL ); + m_menuHelp->Append( m_menuItemAbout ); + + m_menubar1->Append( m_menuHelp, _("&Help") ); + + this->SetMenuBar( m_menubar1 ); + + bSizerPanelHolder = new wxBoxSizer( wxVERTICAL ); + + m_panelTopButtons = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRAISED_BORDER|wxTAB_TRAVERSAL ); + bSizerTopButtons = new wxBoxSizer( wxHORIZONTAL ); + + + bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer* fgSizer121; + fgSizer121 = new wxFlexGridSizer( 2, 2, 0, 0 ); + fgSizer121->SetFlexibleDirection( wxBOTH ); + fgSizer121->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticTextCmpVariant = new wxStaticText( m_panelTopButtons, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCmpVariant->Wrap( -1 ); + m_staticTextCmpVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + m_staticTextCmpVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + fgSizer121->Add( m_staticTextCmpVariant, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxTOP, 1 ); + + + fgSizer121->Add( 0, 0, 1, 0, 5 ); + + wxBoxSizer* bSizer30; + bSizer30 = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonCompare = new zen::BitmapButton( m_panelTopButtons, wxID_OK, _("Compare"), wxDefaultPosition, wxSize( 180,-1 ), 0 ); + m_buttonCompare->SetDefault(); + m_buttonCompare->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + m_buttonCompare->SetToolTip( _("dummy") ); + + bSizer30->Add( m_buttonCompare, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_buttonCancel = new zen::BitmapButton( m_panelTopButtons, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( 180,-1 ), 0 ); + m_buttonCancel->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + m_buttonCancel->Enable( false ); + m_buttonCancel->Hide(); + + bSizer30->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + fgSizer121->Add( bSizer30, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_bpButtonCmpConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); + m_bpButtonCmpConfig->SetToolTip( _("Comparison settings") ); + + fgSizer121->Add( m_bpButtonCmpConfig, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 3 ); + + + bSizerTopButtons->Add( fgSizer121, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + + bSizerTopButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + wxFlexGridSizer* fgSizer12; + fgSizer12 = new wxFlexGridSizer( 2, 2, 0, 0 ); + fgSizer12->SetFlexibleDirection( wxBOTH ); + fgSizer12->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + + fgSizer12->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextSyncVariant = new wxStaticText( m_panelTopButtons, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSyncVariant->Wrap( -1 ); + m_staticTextSyncVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + m_staticTextSyncVariant->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + fgSizer12->Add( m_staticTextSyncVariant, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP, 1 ); + + m_bpButtonSyncConfig = new wxBitmapButton( m_panelTopButtons, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); + m_bpButtonSyncConfig->SetToolTip( _("Synchronization settings") ); + + fgSizer12->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 ); + + m_buttonSync = new zen::BitmapButton( m_panelTopButtons, wxID_ANY, _("Synchronize"), wxDefaultPosition, wxSize( 180,-1 ), 0 ); + m_buttonSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + m_buttonSync->SetToolTip( _("dummy") ); + + fgSizer12->Add( m_buttonSync, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizerTopButtons->Add( fgSizer12, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + + bSizerTopButtons->Add( 15, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + m_panelTopButtons->SetSizer( bSizerTopButtons ); + m_panelTopButtons->Layout(); + bSizerTopButtons->Fit( m_panelTopButtons ); + bSizerPanelHolder->Add( m_panelTopButtons, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_panelDirectoryPairs = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1601; + bSizer1601 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer91; + bSizer91 = new wxBoxSizer( wxHORIZONTAL ); + + m_panelTopLeft = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelTopLeft->SetMinSize( wxSize( 1,-1 ) ); + + wxFlexGridSizer* fgSizer8; + fgSizer8 = new wxFlexGridSizer( 0, 2, 0, 0 ); + fgSizer8->AddGrowableCol( 1 ); + fgSizer8->SetFlexibleDirection( wxBOTH ); + fgSizer8->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_ALL ); + + + fgSizer8->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextResolvedPathL = new wxStaticText( m_panelTopLeft, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextResolvedPathL->Wrap( -1 ); + fgSizer8->Add( m_staticTextResolvedPathL, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 ); + + wxBoxSizer* bSizer159; + bSizer159 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonAddPair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + m_bpButtonAddPair->SetToolTip( _("Add folder pair") ); + + bSizer159->Add( m_bpButtonAddPair, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonRemovePair = new wxBitmapButton( m_panelTopLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + bSizer159->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + fgSizer8->Add( bSizer159, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer182; + bSizer182 = new wxBoxSizer( wxHORIZONTAL ); + + m_directoryLeft = new FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer182->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSelectDirLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirLeft->SetToolTip( _("Select a folder") ); + + bSizer182->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + fgSizer8->Add( bSizer182, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + m_panelTopLeft->SetSizer( fgSizer8 ); + m_panelTopLeft->Layout(); + fgSizer8->Fit( m_panelTopLeft ); + bSizer91->Add( m_panelTopLeft, 1, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelTopMiddle = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1771; + bSizer1771 = new wxBoxSizer( wxVERTICAL ); + + + bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonSwapSides = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), wxBU_AUTODRAW ); + m_bpButtonSwapSides->SetToolTip( _("Swap sides") ); + + bSizer1771->Add( m_bpButtonSwapSides, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonAltCompCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + bSizer160->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLocalFilter = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + bSizer160->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 ); + + m_bpButtonAltSyncCfg = new wxBitmapButton( m_panelTopMiddle, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + bSizer160->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer1771->Add( bSizer160, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer1771->Add( 0, 0, 1, wxEXPAND, 5 ); + + + m_panelTopMiddle->SetSizer( bSizer1771 ); + m_panelTopMiddle->Layout(); + bSizer1771->Fit( m_panelTopMiddle ); + bSizer91->Add( m_panelTopMiddle, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_panelTopRight = new wxPanel( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelTopRight->SetMinSize( wxSize( 1,-1 ) ); + + wxBoxSizer* bSizer183; + bSizer183 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextResolvedPathR = new wxStaticText( m_panelTopRight, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextResolvedPathR->Wrap( -1 ); + bSizer183->Add( m_staticTextResolvedPathR, 0, wxALIGN_CENTER_VERTICAL|wxALL, 2 ); + + wxBoxSizer* bSizer179; + bSizer179 = new wxBoxSizer( wxHORIZONTAL ); + + m_directoryRight = new FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer179->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSelectDirRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirRight->SetToolTip( _("Select a folder") ); + + bSizer179->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer183->Add( bSizer179, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + m_panelTopRight->SetSizer( bSizer183 ); + m_panelTopRight->Layout(); + bSizer183->Fit( m_panelTopRight ); + bSizer91->Add( m_panelTopRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + + bSizer1601->Add( bSizer91, 0, wxEXPAND, 5 ); + + m_scrolledWindowFolderPairs = new wxScrolledWindow( m_panelDirectoryPairs, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); + m_scrolledWindowFolderPairs->SetScrollRate( 10, 10 ); + m_scrolledWindowFolderPairs->SetMinSize( wxSize( -1,0 ) ); + + bSizerAddFolderPairs = new wxBoxSizer( wxVERTICAL ); + + + m_scrolledWindowFolderPairs->SetSizer( bSizerAddFolderPairs ); + m_scrolledWindowFolderPairs->Layout(); + bSizerAddFolderPairs->Fit( m_scrolledWindowFolderPairs ); + bSizer1601->Add( m_scrolledWindowFolderPairs, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + m_panelDirectoryPairs->SetSizer( bSizer1601 ); + m_panelDirectoryPairs->Layout(); + bSizer1601->Fit( m_panelDirectoryPairs ); + bSizerPanelHolder->Add( m_panelDirectoryPairs, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_gridNavi = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridNavi->SetScrollRate( 5, 5 ); + bSizerPanelHolder->Add( m_gridNavi, 1, wxEXPAND, 5 ); + + m_panelCenter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1711; + bSizer1711 = new wxBoxSizer( wxVERTICAL ); + + m_splitterMain = new zen::TripleSplitter( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer1781; + bSizer1781 = new wxBoxSizer( wxHORIZONTAL ); + + m_gridMainL = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridMainL->SetScrollRate( 5, 5 ); + bSizer1781->Add( m_gridMainL, 1, wxEXPAND, 5 ); + + m_gridMainC = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridMainC->SetScrollRate( 5, 5 ); + bSizer1781->Add( m_gridMainC, 0, wxEXPAND, 5 ); + + m_gridMainR = new zen::Grid( m_splitterMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridMainR->SetScrollRate( 5, 5 ); + bSizer1781->Add( m_gridMainR, 1, wxEXPAND, 5 ); + + + m_splitterMain->SetSizer( bSizer1781 ); + m_splitterMain->Layout(); + bSizer1781->Fit( m_splitterMain ); + bSizer1711->Add( m_splitterMain, 1, wxEXPAND, 5 ); + + m_panelStatusBar = new wxPanel( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer451; + bSizer451 = new wxBoxSizer( wxHORIZONTAL ); + + bSizer451->SetMinSize( wxSize( -1,22 ) ); + bSizerFileStatus = new wxBoxSizer( wxHORIZONTAL ); + + bSizerStatusLeft = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer53; + bSizer53 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 ); + + m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeftDirs->Wrap( -1 ); + bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL ); + + + bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 ); + + m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 ); + + m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeftFiles->Wrap( -1 ); + bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 ); + + m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusLeftBytes->Wrap( -1 ); + bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatusLeft->Add( bSizer53, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizerStatusLeft->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 2 ); + + + bSizerFileStatus->Add( bSizerStatusLeft, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusMiddle->Wrap( -1 ); + m_staticTextStatusMiddle->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerFileStatus->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerFileStatus->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerStatusRight = new wxBoxSizer( wxHORIZONTAL ); + + m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizerStatusRight->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 ); + + wxBoxSizer* bSizer52; + bSizer52 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 ); + + m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRightDirs->Wrap( -1 ); + bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL ); + + + bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 ); + + m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 ); + + m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRightFiles->Wrap( -1 ); + bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 ); + + m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatusRightBytes->Wrap( -1 ); + bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatusRight->Add( bSizer52, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerFileStatus->Add( bSizerStatusRight, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer451->Add( bSizerFileStatus, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticTextFullStatus = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextFullStatus->Wrap( -1 ); + m_staticTextFullStatus->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizer451->Add( m_staticTextFullStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + m_panelStatusBar->SetSizer( bSizer451 ); + m_panelStatusBar->Layout(); + bSizer451->Fit( m_panelStatusBar ); + bSizer1711->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + m_panelCenter->SetSizer( bSizer1711 ); + m_panelCenter->Layout(); + bSizer1711->Fit( m_panelCenter ); + bSizerPanelHolder->Add( m_panelCenter, 1, wxEXPAND, 5 ); + + m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + bSizerConfig = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer151; + bSizer151 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonOpen = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + m_bpButtonOpen->SetToolTip( _("dummy") ); + + bSizer151->Add( m_bpButtonOpen, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + m_bpButtonSave->SetToolTip( _("dummy") ); + + bSizer151->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonBatchJob = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + m_bpButtonBatchJob->SetToolTip( _("Save as batch job") ); + + bSizer151->Add( m_bpButtonBatchJob, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerConfig->Add( bSizer151, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_listBoxHistory = new wxListBox( m_panelConfig, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_EXTENDED|wxLB_NEEDED_SB|wxLB_SORT ); + m_listBoxHistory->SetMinSize( wxSize( -1,40 ) ); + + bSizerConfig->Add( m_listBoxHistory, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + + m_panelConfig->SetSizer( bSizerConfig ); + m_panelConfig->Layout(); + bSizerConfig->Fit( m_panelConfig ); + bSizerPanelHolder->Add( m_panelConfig, 0, 0, 5 ); + + m_panelFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer171; + bSizer171 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonFilter = new wxBitmapButton( m_panelFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE ); + bSizer171->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_checkBoxHideExcluded = new wxCheckBox( m_panelFilter, wxID_ANY, _("Hide excluded items"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxHideExcluded->SetToolTip( _("Show filtered or temporarily excluded files") ); + + bSizer171->Add( m_checkBoxHideExcluded, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + m_panelFilter->SetSizer( bSizer171 ); + m_panelFilter->Layout(); + bSizer171->Fit( m_panelFilter ); + bSizerPanelHolder->Add( m_panelFilter, 0, 0, 5 ); + + m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + bSizer1801 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizerStatistics = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer1712; + bSizer1712 = new wxBoxSizer( wxVERTICAL ); + + m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); + + bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer1712->Add( 5, 2, 0, 0, 5 ); + + + bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCreateLeft->Wrap( -1 ); + m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); + + bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizerStatistics->Add( bSizer1712, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxVERTICAL ); + + m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") ); + + bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer172->Add( 5, 2, 0, 0, 5 ); + + + bSizer172->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextUpdateLeft->Wrap( -1 ); + m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") ); + + bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizerStatistics->Add( bSizer172, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + + wxBoxSizer* bSizer173; + bSizer173 = new wxBoxSizer( wxVERTICAL ); + + m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); + + bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer173->Add( 5, 2, 0, 0, 5 ); + + + bSizer173->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDeleteLeft->Wrap( -1 ); + m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); + + bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatistics->Add( bSizer173, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + + bSizerData = new wxBoxSizer( wxVERTICAL ); + + m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapData->SetToolTip( _("Total bytes to copy") ); + + bSizerData->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizerData->Add( 5, 2, 0, 0, 5 ); + + + bSizerData->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextData->Wrap( -1 ); + m_staticTextData->SetToolTip( _("Total bytes to copy") ); + + bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatistics->Add( bSizerData, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + + wxBoxSizer* bSizer176; + bSizer176 = new wxBoxSizer( wxVERTICAL ); + + m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); + + bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer176->Add( 5, 2, 0, 0, 5 ); + + + bSizer176->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDeleteRight->Wrap( -1 ); + m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); + + bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatistics->Add( bSizer176, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + + wxBoxSizer* bSizer177; + bSizer177 = new wxBoxSizer( wxVERTICAL ); + + m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") ); + + bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer177->Add( 5, 2, 0, 0, 5 ); + + + bSizer177->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextUpdateRight->Wrap( -1 ); + m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") ); + + bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatistics->Add( bSizer177, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizerStatistics->Add( 5, 5, 0, 0, 5 ); + + wxBoxSizer* bSizer178; + bSizer178 = new wxBoxSizer( wxVERTICAL ); + + m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") ); + + bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer178->Add( 5, 2, 0, 0, 5 ); + + + bSizer178->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCreateRight->Wrap( -1 ); + m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") ); + + bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStatistics->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer1801->Add( bSizerStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 ); + + + m_panelStatistics->SetSizer( bSizer1801 ); + m_panelStatistics->Layout(); + bSizer1801->Fit( m_panelStatistics ); + bSizerPanelHolder->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonViewTypeSyncAction = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonViewTypeSyncAction, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonShowCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowUpdateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowDoNothing = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowDoNothing, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowUpdateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonShowConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + bSizerViewFilter->Add( m_bpButtonShowConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 ); + + + m_panelViewFilter->SetSizer( bSizerViewFilter ); + m_panelViewFilter->Layout(); + bSizerViewFilter->Fit( m_panelViewFilter ); + bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + this->SetSizer( bSizerPanelHolder ); + this->Layout(); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); + this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) ); + this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) ); + this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) ); + this->Connect( m_menuItemSaveAs->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) ); + this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) ); + this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); + this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) ); + this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); + this->Connect( m_menuItem5->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); + this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); + this->Connect( m_menuItemManual->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) ); + this->Connect( m_menuItemCheckVersionNow->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); + this->Connect( m_menuItemCheckVersionAuto->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) ); + this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); + m_buttonCompare->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); + m_bpButtonCmpConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this ); + m_bpButtonCmpConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this ); + m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this ); + m_bpButtonSyncConfig->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this ); + m_buttonSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); + m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); + m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); + m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); + m_bpButtonOpen->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this ); + m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ), NULL, this ); + m_bpButtonBatchJob->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ), NULL, this ); + m_listBoxHistory->Connect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); + m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); + m_listBoxHistory->Connect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistoryDoubleClick ), NULL, this ); + m_listBoxHistory->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCfgHistoryRightClick ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); + m_bpButtonFilter->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this ); + m_checkBoxHideExcluded->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this ); + m_bpButtonViewTypeSyncAction->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this ); + m_bpButtonShowCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowCreateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowUpdateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowUpdateLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowDeleteLeft->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowLeftOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowLeftNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowEqual->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowEqual->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowDifferent->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowDoNothing->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowDoNothing->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowRightNewer->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowRightOnly->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowDeleteRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowDeleteRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowUpdateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowUpdateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowCreateRight->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowCreateRight->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowConflict->Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); +} +MainDialogGenerated::~MainDialogGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) ); + this->Disconnect( wxID_NEW, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigNew ) ); + this->Disconnect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ) ); + this->Disconnect( wxID_SAVE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ) ); + this->Disconnect( wxID_SAVEAS, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) ); + this->Disconnect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuExportFileList ) ); + this->Disconnect( wxID_PREFERENCES, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) ); + this->Disconnect( wxID_HELP, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnShowHelp ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersion ) ); + this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuCheckVersionAutomatically ) ); + this->Disconnect( wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuAbout ) ); + m_buttonCompare->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCompare ), NULL, this ); + m_bpButtonCmpConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnCmpSettings ), NULL, this ); + m_bpButtonCmpConfig->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCompSettingsContext ), NULL, this ); + m_bpButtonSyncConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncSettings ), NULL, this ); + m_bpButtonSyncConfig->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnSyncSettingsContext ), NULL, this ); + m_buttonSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ), NULL, this ); + m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnAddFolderPair ), NULL, this ); + m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnRemoveTopFolderPair ), NULL, this ); + m_bpButtonSwapSides->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this ); + m_bpButtonOpen->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this ); + m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSave ), NULL, this ); + m_bpButtonBatchJob->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveAsBatchJob ), NULL, this ); + m_listBoxHistory->Disconnect( wxEVT_CHAR, wxKeyEventHandler( MainDialogGenerated::OnCfgHistoryKeyEvent ), NULL, this ); + m_listBoxHistory->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistory ), NULL, this ); + m_listBoxHistory->Disconnect( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadFromHistoryDoubleClick ), NULL, this ); + m_listBoxHistory->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnCfgHistoryRightClick ), NULL, this ); + m_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this ); + m_bpButtonFilter->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnGlobalFilterContext ), NULL, this ); + m_checkBoxHideExcluded->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this ); + m_bpButtonViewTypeSyncAction->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewType ), NULL, this ); + m_bpButtonShowCreateLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowCreateLeft->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowUpdateLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowUpdateLeft->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowDeleteLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowDeleteLeft->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowLeftOnly->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowLeftNewer->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowEqual->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowEqual->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowDifferent->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowDoNothing->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowDoNothing->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowRightNewer->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowRightOnly->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowDeleteRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowDeleteRight->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowUpdateRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowUpdateRight->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowCreateRight->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowCreateRight->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + m_bpButtonShowConflict->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnToggleViewButton ), NULL, this ); + m_bpButtonShowConflict->Disconnect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( MainDialogGenerated::OnViewButtonRightClick ), NULL, this ); + +} - bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); +FolderPairPanelGenerated::FolderPairPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) +{ + wxBoxSizer* bSizer74; + bSizer74 = new wxBoxSizer( wxHORIZONTAL ); + + m_panelLeft = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelLeft->SetMinSize( wxSize( 1,-1 ) ); + + wxBoxSizer* bSizer134; + bSizer134 = new wxBoxSizer( wxHORIZONTAL ); + + m_bpButtonRemovePair = new wxBitmapButton( m_panelLeft, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + m_bpButtonRemovePair->SetToolTip( _("Remove folder pair") ); + + bSizer134->Add( m_bpButtonRemovePair, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirLeft->SetToolTip( _("Select a folder") ); + + bSizer134->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + m_panelLeft->SetSizer( bSizer134 ); + m_panelLeft->Layout(); + bSizer134->Fit( m_panelLeft ); + bSizer74->Add( m_panelLeft, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxEXPAND, 5 ); + + m_panel20 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonAltCompCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + bSizer95->Add( m_bpButtonAltCompCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLocalFilter = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + bSizer95->Add( m_bpButtonLocalFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 2 ); + + m_bpButtonAltSyncCfg = new wxBitmapButton( m_panel20, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + bSizer95->Add( m_bpButtonAltSyncCfg, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer95->Add( 0, 0, 1, wxEXPAND, 5 ); + + + m_panel20->SetSizer( bSizer95 ); + m_panel20->Layout(); + bSizer95->Fit( m_panel20 ); + bSizer74->Add( m_panel20, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_panelRight = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelRight->SetMinSize( wxSize( 1,-1 ) ); + + wxBoxSizer* bSizer135; + bSizer135 = new wxBoxSizer( wxHORIZONTAL ); + + m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirRight->SetToolTip( _("Select a folder") ); + + bSizer135->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + m_panelRight->SetSizer( bSizer135 ); + m_panelRight->Layout(); + bSizer135->Fit( m_panelRight ); + bSizer74->Add( m_panelRight, 1, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 ); + + + this->SetSizer( bSizer74 ); + this->Layout(); + bSizer74->Fit( this ); +} +FolderPairPanelGenerated::~FolderPairPanelGenerated() +{ +} - bSizer160->Add( bSizer168, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); +CompareProgressDlgGenerated::CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) +{ + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer40; + bSizer40 = new wxBoxSizer( wxVERTICAL ); + + + bSizer40->Add( 0, 0, 1, wxEXPAND, 5 ); + + wxBoxSizer* bSizer182; + bSizer182 = new wxBoxSizer( wxVERTICAL ); + + m_textCtrlStatus = new wxTextCtrl( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); + m_textCtrlStatus->SetMaxLength( 0 ); + m_textCtrlStatus->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + bSizer182->Add( m_textCtrlStatus, 0, wxEXPAND, 5 ); + + + bSizer40->Add( bSizer182, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL|wxGA_SMOOTH ); + bSizer40->Add( m_gauge2, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer157; + bSizer157 = new wxBoxSizer( wxVERTICAL ); + + bSizerFilesFound = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText321 = new wxStaticText( this, wxID_ANY, _("Items found:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText321->Wrap( -1 ); + bSizerFilesFound->Add( m_staticText321, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextScanned = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextScanned->Wrap( -1 ); + m_staticTextScanned->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerFilesFound->Add( m_staticTextScanned, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); + + + bSizer157->Add( bSizerFilesFound, 0, 0, 5 ); + + bSizerFilesRemaining = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText46 = new wxStaticText( this, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText46->Wrap( -1 ); + bSizerFilesRemaining->Add( m_staticText46, 0, wxALIGN_BOTTOM, 5 ); + + wxBoxSizer* bSizer154; + bSizer154 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextFilesRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextFilesRemaining->Wrap( -1 ); + m_staticTextFilesRemaining->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizer154->Add( m_staticTextFilesRemaining, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextDataRemaining = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataRemaining->Wrap( -1 ); + bSizer154->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); + + + bSizerFilesRemaining->Add( bSizer154, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); + + + bSizer157->Add( bSizerFilesRemaining, 0, 0, 5 ); + + + bSizer42->Add( bSizer157, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + sSizerSpeed = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText104 = new wxStaticText( this, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText104->Wrap( -1 ); + sSizerSpeed->Add( m_staticText104, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextSpeed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSpeed->Wrap( -1 ); + m_staticTextSpeed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + sSizerSpeed->Add( m_staticTextSpeed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + + bSizer42->Add( sSizerSpeed, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer42->Add( 10, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + sSizerTimeRemaining = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextTimeRemFixed = new wxStaticText( this, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeRemFixed->Wrap( -1 ); + sSizerTimeRemaining->Add( m_staticTextTimeRemFixed, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextRemTime = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRemTime->Wrap( -1 ); + m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + sSizerTimeRemaining->Add( m_staticTextRemTime, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + + bSizer42->Add( sSizerTimeRemaining, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer42->Add( 0, 0, 1, wxEXPAND, 5 ); + + sSizerTimeElapsed = new wxBoxSizer( wxHORIZONTAL ); + + wxStaticText* m_staticText37; + m_staticText37 = new wxStaticText( this, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText37->Wrap( -1 ); + sSizerTimeElapsed->Add( m_staticText37, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextTimeElapsed = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + sSizerTimeElapsed->Add( m_staticTextTimeElapsed, 0, wxLEFT|wxALIGN_BOTTOM, 5 ); + + + bSizer42->Add( sSizerTimeElapsed, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer40->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + + + bSizer40->Add( 0, 0, 1, wxEXPAND, 5 ); + + + this->SetSizer( bSizer40 ); + this->Layout(); + bSizer40->Fit( this ); +} +CompareProgressDlgGenerated::~CompareProgressDlgGenerated() +{ +} - bSizer159->Add( bSizer160, 0, wxEXPAND, 5 ); +SyncProgressDlgGenerated::SyncProgressDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( 470,260 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + bSizerRoot = new wxBoxSizer( wxVERTICAL ); + + bSizer42 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapStatus = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 ); + bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_staticTextPhase = new wxStaticText( this, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextPhase->Wrap( -1 ); + m_staticTextPhase->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizer42->Add( m_staticTextPhase, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 ); + + m_animCtrlSyncing = new wxAnimationCtrl( this, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( 32,32 ), wxAC_DEFAULT_STYLE ); + m_animCtrlSyncing->SetMinSize( wxSize( 32,32 ) ); + + bSizer42->Add( m_animCtrlSyncing, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizerRoot->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); + + m_staticlineHeader = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerRoot->Add( m_staticlineHeader, 0, wxEXPAND, 5 ); + + m_panelProgress = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelProgress->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer173; + bSizer173 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextStatus = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextStatus->Wrap( -1 ); + bSizer173->Add( m_staticTextStatus, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_gauge1 = new wxGauge( m_panelProgress, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL ); + bSizer173->Add( m_gauge1, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + + bSizer171 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer171->Add( 10, 0, 0, 0, 5 ); + + wxFlexGridSizer* fgSizer10; + fgSizer10 = new wxFlexGridSizer( 0, 2, 2, 5 ); + fgSizer10->SetFlexibleDirection( wxBOTH ); + fgSizer10->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_staticTextLabelItemsProc = new wxStaticText( m_panelProgress, wxID_ANY, _("Items processed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLabelItemsProc->Wrap( -1 ); + fgSizer10->Add( m_staticTextLabelItemsProc, 0, wxALIGN_BOTTOM, 5 ); + + bSizerItemsProc = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextProcessedObj = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextProcessedObj->Wrap( -1 ); + m_staticTextProcessedObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerItemsProc->Add( m_staticTextProcessedObj, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextDataProcessed = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataProcessed->Wrap( -1 ); + bSizerItemsProc->Add( m_staticTextDataProcessed, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); + + + fgSizer10->Add( bSizerItemsProc, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextLabelItemsRem = new wxStaticText( m_panelProgress, wxID_ANY, _("Items remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLabelItemsRem->Wrap( -1 ); + fgSizer10->Add( m_staticTextLabelItemsRem, 0, wxALIGN_BOTTOM, 5 ); + + bSizerItemsRem = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextRemainingObj = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticTextRemainingObj->Wrap( -1 ); + m_staticTextRemainingObj->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerItemsRem->Add( m_staticTextRemainingObj, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextDataRemaining = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDataRemaining->Wrap( -1 ); + bSizerItemsRem->Add( m_staticTextDataRemaining, 0, wxALIGN_BOTTOM|wxLEFT, 5 ); + + + fgSizer10->Add( bSizerItemsRem, 0, wxALIGN_BOTTOM, 5 ); + + m_staticText84 = new wxStaticText( m_panelProgress, wxID_ANY, _("Speed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText84->Wrap( -1 ); + fgSizer10->Add( m_staticText84, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextSpeed = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextSpeed->Wrap( -1 ); + m_staticTextSpeed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + fgSizer10->Add( m_staticTextSpeed, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextLabelRemTime = new wxStaticText( m_panelProgress, wxID_ANY, _("Time remaining:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLabelRemTime->Wrap( -1 ); + fgSizer10->Add( m_staticTextLabelRemTime, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextRemTime = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextRemTime->Wrap( -1 ); + m_staticTextRemTime->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + fgSizer10->Add( m_staticTextRemTime, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextLabelElapsedTime = new wxStaticText( m_panelProgress, wxID_ANY, _("Time elapsed:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextLabelElapsedTime->Wrap( -1 ); + fgSizer10->Add( m_staticTextLabelElapsedTime, 0, wxALIGN_BOTTOM, 5 ); + + m_staticTextTimeElapsed = new wxStaticText( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextTimeElapsed->Wrap( -1 ); + m_staticTextTimeElapsed->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + fgSizer10->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 ); + + + bSizer171->Add( fgSizer10, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer171->Add( 10, 0, 0, 0, 5 ); + + m_panelGraph = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( 340,150 ), wxTAB_TRAVERSAL ); + m_panelGraph->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + bSizer171->Add( m_panelGraph, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 10 ); + + + bSizer173->Add( bSizer171, 1, wxEXPAND, 5 ); + + + m_panelProgress->SetSizer( bSizer173 ); + m_panelProgress->Layout(); + bSizer173->Fit( m_panelProgress ); + bSizerRoot->Add( m_panelProgress, 1, wxEXPAND, 5 ); + + m_notebookResult = new wxNotebook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_FIXEDWIDTH ); + + bSizerRoot->Add( m_notebookResult, 1, wxEXPAND, 5 ); + + m_staticlineFooter = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerRoot->Add( m_staticlineFooter, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxHORIZONTAL ); + + bSizerExecFinished = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText87 = new wxStaticText( this, wxID_ANY, _("On completion"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText87->Wrap( -1 ); + bSizerExecFinished->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_comboBoxExecFinished = new ExecFinishedBox( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer160->Add( bSizerExecFinished, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer160->Add( 0, 0, 0, 0, 5 ); + + + bSizerStdButtons->Add( bSizer160, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonClose->SetDefault(); + m_buttonClose->Enable( false ); + + bSizerStdButtons->Add( m_buttonClose, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonPause = new wxButton( this, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizerRoot->Add( bSizerStdButtons, 0, wxALIGN_RIGHT|wxEXPAND, 5 ); + + + this->SetSizer( bSizerRoot ); + this->Layout(); + bSizerRoot->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncProgressDlgGenerated::OnClose ) ); + this->Connect( wxEVT_ICONIZE, wxIconizeEventHandler( SyncProgressDlgGenerated::OnIconize ) ); + m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnOkay ), NULL, this ); + m_buttonPause->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnPause ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnCancel ), NULL, this ); +} +SyncProgressDlgGenerated::~SyncProgressDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncProgressDlgGenerated::OnClose ) ); + this->Disconnect( wxEVT_ICONIZE, wxIconizeEventHandler( SyncProgressDlgGenerated::OnIconize ) ); + m_buttonClose->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnOkay ), NULL, this ); + m_buttonPause->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnPause ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncProgressDlgGenerated::OnCancel ), NULL, this ); + +} - m_panel38->SetSizer( bSizer159 ); - m_panel38->Layout(); - bSizer159->Fit( m_panel38 ); - bSizer21->Add( m_panel38, 1, wxEXPAND, 5 ); +LogPanelGenerated::LogPanelGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style ) +{ + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer179; + bSizer179 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer153; + bSizer153 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer154; + bSizer154 = new wxBoxSizer( wxVERTICAL ); + + m_bpButtonErrors = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); + bSizer154->Add( m_bpButtonErrors, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonWarnings = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); + bSizer154->Add( m_bpButtonWarnings, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bpButtonInfo = new ToggleButton( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), wxBU_AUTODRAW ); + bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer153->Add( m_staticline13, 0, wxEXPAND, 5 ); + + m_gridMessages = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL ); + m_gridMessages->SetScrollRate( 5, 5 ); + bSizer153->Add( m_gridMessages, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer179->Add( bSizer153, 1, wxEXPAND, 5 ); + + + this->SetSizer( bSizer179 ); + this->Layout(); + bSizer179->Fit( this ); + + // Connect Events + m_bpButtonErrors->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnErrors ), NULL, this ); + m_bpButtonWarnings->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnWarnings ), NULL, this ); + m_bpButtonInfo->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnInfo ), NULL, this ); +} - m_staticline16 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer21->Add( m_staticline16, 0, wxEXPAND, 5 ); +LogPanelGenerated::~LogPanelGenerated() +{ + // Disconnect Events + m_bpButtonErrors->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnErrors ), NULL, this ); + m_bpButtonWarnings->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnWarnings ), NULL, this ); + m_bpButtonInfo->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( LogPanelGenerated::OnInfo ), NULL, this ); + +} - wxBoxSizer* bSizer22; - bSizer22 = new wxBoxSizer( wxHORIZONTAL ); +CmpCfgDlgGenerated::CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer136; + bSizer136 = new wxBoxSizer( wxVERTICAL ); + + m_panel36 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel36->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer159; + bSizer159 = new wxBoxSizer( wxVERTICAL ); + + m_staticText91 = new wxStaticText( m_panel36, wxID_ANY, _("Select a variant"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText91->Wrap( -1 ); + bSizer159->Add( m_staticText91, 0, wxALL, 5 ); + + wxFlexGridSizer* fgSizer16; + fgSizer16 = new wxFlexGridSizer( 2, 2, 8, 5 ); + fgSizer16->SetFlexibleDirection( wxBOTH ); + fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_bitmapByTime = new wxStaticBitmap( m_panel36, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapByTime->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); + + fgSizer16->Add( m_bitmapByTime, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_toggleBtnTimeSize = new wxToggleButton( m_panel36, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_toggleBtnTimeSize->SetValue( true ); + m_toggleBtnTimeSize->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + m_toggleBtnTimeSize->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") ); + + fgSizer16->Add( m_toggleBtnTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_bitmapByContent = new wxStaticBitmap( m_panel36, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapByContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); + + fgSizer16->Add( m_bitmapByContent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_toggleBtnContent = new wxToggleButton( m_panel36, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_toggleBtnContent->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + m_toggleBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") ); + + fgSizer16->Add( m_toggleBtnContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer159->Add( fgSizer16, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticline33 = new wxStaticLine( m_panel36, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer159->Add( m_staticline33, 0, wxEXPAND, 5 ); + + m_staticText92 = new wxStaticText( m_panel36, wxID_ANY, _("Symbolic Link handling"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText92->Wrap( -1 ); + bSizer159->Add( m_staticText92, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizer177; + bSizer177 = new wxBoxSizer( wxHORIZONTAL ); + + wxArrayString m_choiceHandleSymlinksChoices; + m_choiceHandleSymlinks = new wxChoice( m_panel36, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 ); + m_choiceHandleSymlinks->SetSelection( -1 ); + bSizer177->Add( m_choiceHandleSymlinks, 1, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonHelp = new wxBitmapButton( m_panel36, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer177->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer159->Add( bSizer177, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + + m_panel36->SetSizer( bSizer159 ); + m_panel36->Layout(); + bSizer159->Fit( m_panel36 ); + bSizer136->Add( m_panel36, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticline14 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer136->Add( m_staticline14, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer136->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + + + this->SetSizer( bSizer136 ); + this->Layout(); + bSizer136->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); + m_toggleBtnTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); + m_toggleBtnTimeSize->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); + m_toggleBtnContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); + m_toggleBtnContent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); + m_choiceHandleSymlinks->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); +} - m_buttonClear = new wxButton( this, wxID_DEFAULT, _("&Clear"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer22->Add( m_buttonClear, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); +CmpCfgDlgGenerated::~CmpCfgDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) ); + m_toggleBtnTimeSize->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this ); + m_toggleBtnTimeSize->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this ); + m_toggleBtnContent->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), NULL, this ); + m_toggleBtnContent->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this ); + m_choiceHandleSymlinks->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnChangeErrorHandling ), NULL, this ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnShowHelp ), NULL, this ); + m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this ); + +} +SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer7; + bSizer7 = new wxBoxSizer( wxVERTICAL ); + + m_panel37 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel37->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer181; + bSizer181 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer29; + bSizer29 = new wxBoxSizer( wxVERTICAL ); + + m_staticText86 = new wxStaticText( m_panel37, wxID_ANY, _("Select a variant"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText86->Wrap( -1 ); + bSizer29->Add( m_staticText86, 0, wxALL, 5 ); + + wxFlexGridSizer* fgSizer1; + fgSizer1 = new wxFlexGridSizer( 4, 2, 6, 8 ); + fgSizer1->SetFlexibleDirection( wxHORIZONTAL ); + fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_toggleBtnTwoWay = new wxToggleButton( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnTwoWay->SetValue( true ); + m_toggleBtnTwoWay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_toggleBtnTwoWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticTextAutomatic = new wxStaticText( m_panel37, wxID_ANY, _("Identify and propagate changes on both sides. Deletions, moves and conflicts are detected automatically using a database."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextAutomatic->Wrap( 480 ); + fgSizer1->Add( m_staticTextAutomatic, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_toggleBtnMirror = new wxToggleButton( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnMirror->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_toggleBtnMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticTextMirror = new wxStaticText( m_panel37, wxID_ANY, _("Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMirror->Wrap( 480 ); + fgSizer1->Add( m_staticTextMirror, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_toggleBtnUpdate = new wxToggleButton( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnUpdate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_toggleBtnUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticTextUpdate = new wxStaticText( m_panel37, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextUpdate->Wrap( 480 ); + fgSizer1->Add( m_staticTextUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_toggleBtnCustom = new wxToggleButton( m_panel37, wxID_ANY, _("Custom"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnCustom->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + fgSizer1->Add( m_toggleBtnCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticTextCustom = new wxStaticText( m_panel37, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCustom->Wrap( 480 ); + fgSizer1->Add( m_staticTextCustom, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer29->Add( fgSizer1, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + bSizerExtraConfig = new wxBoxSizer( wxVERTICAL ); + + m_staticline321 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizerExtraConfig->Add( m_staticline321, 0, wxEXPAND, 5 ); + + bSizer179 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer174; + bSizer174 = new wxBoxSizer( wxVERTICAL ); + + m_staticText88 = new wxStaticText( m_panel37, wxID_ANY, _("Error handling"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText88->Wrap( -1 ); + bSizer174->Add( m_staticText88, 0, wxBOTTOM, 5 ); + + wxBoxSizer* bSizer175; + bSizer175 = new wxBoxSizer( wxHORIZONTAL ); + + m_toggleBtnErrorIgnore = new wxToggleButton( m_panel37, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") ); + + bSizer175->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_toggleBtnErrorPopup = new wxToggleButton( m_panel37, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") ); + + bSizer175->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer174->Add( bSizer175, 0, 0, 5 ); + + + bSizer179->Add( bSizer174, 0, wxALL, 5 ); + + m_staticline36 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer179->Add( m_staticline36, 0, wxEXPAND, 5 ); + + bSizerOnCompletion = new wxBoxSizer( wxVERTICAL ); + + m_staticText89 = new wxStaticText( m_panel37, wxID_ANY, _("On completion"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText89->Wrap( -1 ); + bSizerOnCompletion->Add( m_staticText89, 0, wxBOTTOM, 5 ); + + m_comboBoxExecFinished = new ExecFinishedBox( m_panel37, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizerOnCompletion->Add( m_comboBoxExecFinished, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer179->Add( bSizerOnCompletion, 1, wxALL, 5 ); + + + bSizerExtraConfig->Add( bSizer179, 0, wxEXPAND, 5 ); + + + bSizer29->Add( bSizerExtraConfig, 0, wxEXPAND, 5 ); + + m_staticline32 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer29->Add( m_staticline32, 0, wxEXPAND, 5 ); + + bSizerNamingConvention = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText87 = new wxStaticText( m_panel37, wxID_ANY, _("Deletion handling"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText87->Wrap( -1 ); + bSizerNamingConvention->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + + bSizerNamingConvention->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizerVersioningNamingConvention = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextNamingCvtPart1 = new wxStaticText( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextNamingCvtPart1->Wrap( -1 ); + m_staticTextNamingCvtPart1->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + bSizerVersioningNamingConvention->Add( m_staticTextNamingCvtPart1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextNamingCvtPart2Bold = new wxStaticText( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextNamingCvtPart2Bold->Wrap( -1 ); + m_staticTextNamingCvtPart2Bold->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + m_staticTextNamingCvtPart2Bold->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + bSizerVersioningNamingConvention->Add( m_staticTextNamingCvtPart2Bold, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextNamingCvtPart3 = new wxStaticText( m_panel37, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextNamingCvtPart3->Wrap( -1 ); + m_staticTextNamingCvtPart3->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + bSizerVersioningNamingConvention->Add( m_staticTextNamingCvtPart3, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerNamingConvention->Add( bSizerVersioningNamingConvention, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer29->Add( bSizerNamingConvention, 0, wxTOP|wxEXPAND, 5 ); + + wxBoxSizer* bSizer180; + bSizer180 = new wxBoxSizer( wxHORIZONTAL ); + + m_toggleBtnPermanent = new wxToggleButton( m_panel37, wxID_ANY, _("Permanent"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnPermanent->SetToolTip( _("Delete or overwrite files permanently") ); + + bSizer180->Add( m_toggleBtnPermanent, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_toggleBtnRecycler = new wxToggleButton( m_panel37, wxID_ANY, _("Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnRecycler->SetToolTip( _("Use Recycle Bin for deleted and overwritten files") ); + + bSizer180->Add( m_toggleBtnRecycler, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_toggleBtnVersioning = new wxToggleButton( m_panel37, wxID_ANY, _("Versioning"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnVersioning->SetToolTip( _("Move files to user-defined folder") ); + + bSizer180->Add( m_toggleBtnVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer180->Add( 0, 0, 1, wxEXPAND, 5 ); + + bSizerVersioningStyle = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText93 = new wxStaticText( m_panel37, wxID_ANY, _("Naming convention:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText93->Wrap( -1 ); + bSizerVersioningStyle->Add( m_staticText93, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + wxArrayString m_choiceVersioningStyleChoices; + m_choiceVersioningStyle = new wxChoice( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVersioningStyleChoices, 0 ); + m_choiceVersioningStyle->SetSelection( 0 ); + bSizerVersioningStyle->Add( m_choiceVersioningStyle, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer180->Add( bSizerVersioningStyle, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer29->Add( bSizer180, 0, wxEXPAND|wxALL, 5 ); + + m_panelVersioning = new wxPanel( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelVersioning->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer156; + bSizer156 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer1151; + bSizer1151 = new wxBoxSizer( wxHORIZONTAL ); + + m_versioningFolder = new FolderHistoryBox( m_panelVersioning, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer1151->Add( m_versioningFolder, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSelectDirVersioning = new wxButton( m_panelVersioning, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectDirVersioning->SetToolTip( _("Select a folder") ); + + bSizer1151->Add( m_buttonSelectDirVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer156->Add( bSizer1151, 0, wxEXPAND, 5 ); + + + m_panelVersioning->SetSizer( bSizer156 ); + m_panelVersioning->Layout(); + bSizer156->Fit( m_panelVersioning ); + bSizer29->Add( m_panelVersioning, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizer181->Add( bSizer29, 0, wxEXPAND, 5 ); + + m_staticline31 = new wxStaticLine( m_panel37, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer181->Add( m_staticline31, 0, wxEXPAND, 5 ); + + bSizerConfig = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer18011; + bSizer18011 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticTextHeaderCategory1 = new wxStaticText( m_panel37, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT ); + m_staticTextHeaderCategory1->Wrap( -1 ); + bSizer18011->Add( m_staticTextHeaderCategory1, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer18011->Add( 5, 0, 0, 0, 5 ); + + m_staticTextHeaderAction1 = new wxStaticText( m_panel37, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT ); + m_staticTextHeaderAction1->Wrap( -1 ); + bSizer18011->Add( m_staticTextHeaderAction1, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizerConfig->Add( bSizer18011, 0, wxEXPAND, 5 ); + + + bSizerConfig->Add( 0, 5, 0, 0, 5 ); + + m_bitmapDatabase = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizerConfig->Add( m_bitmapDatabase, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 10 ); + + wxBoxSizer* sbSizerKeepWidthStableIfSyncDirsNotShown; + sbSizerKeepWidthStableIfSyncDirsNotShown = new wxBoxSizer( wxHORIZONTAL ); + + + sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 45, 0, 0, 0, 5 ); + + + sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 5, 0, 0, 0, 5 ); + + + sbSizerKeepWidthStableIfSyncDirsNotShown->Add( 46, 0, 0, 0, 5 ); + + + bSizerConfig->Add( sbSizerKeepWidthStableIfSyncDirsNotShown, 0, 0, 5 ); + + sbSizerSyncDirections = new wxBoxSizer( wxVERTICAL ); + + bSizerLeftOnly = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapLeftOnly = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") ); + + bSizerLeftOnly->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerLeftOnly->Add( 5, 0, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bpButtonLeftOnly = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); + bSizerLeftOnly->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizerSyncDirections->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerRightOnly = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapRightOnly = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") ); + + bSizerRightOnly->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerRightOnly->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonRightOnly = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); + bSizerRightOnly->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizerSyncDirections->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerLeftNewer = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapLeftNewer = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapLeftNewer->SetToolTip( _("Left side is newer") ); + + bSizerLeftNewer->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerLeftNewer->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonLeftNewer = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); + bSizerLeftNewer->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizerSyncDirections->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerRightNewer = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapRightNewer = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapRightNewer->SetToolTip( _("Right side is newer") ); + + bSizerRightNewer->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerRightNewer->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonRightNewer = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); + bSizerRightNewer->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizerSyncDirections->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerDifferent = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapDifferent = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapDifferent->SetToolTip( _("Items have different content") ); + + bSizerDifferent->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerDifferent->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonDifferent = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); + bSizerDifferent->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizerSyncDirections->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerConflict = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapConflict = new wxStaticBitmap( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 ); + m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") ); + + bSizerConflict->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerConflict->Add( 5, 0, 0, 0, 5 ); + + m_bpButtonConflict = new wxBitmapButton( m_panel37, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 46,46 ), wxBU_AUTODRAW ); + bSizerConflict->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + sbSizerSyncDirections->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizerConfig->Add( sbSizerSyncDirections, 0, wxEXPAND, 5 ); + + + bSizer181->Add( bSizerConfig, 0, wxALL|wxEXPAND, 5 ); + + + m_panel37->SetSizer( bSizer181 ); + m_panel37->Layout(); + bSizer181->Fit( m_panel37 ); + bSizer7->Add( m_panel37, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticline15 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer7->Add( m_staticline15, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer7->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + + + this->SetSizer( bSizer7 ); + this->Layout(); + bSizer7->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); + m_toggleBtnTwoWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncTwoWayDouble ), NULL, this ); + m_toggleBtnTwoWay->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncTwoWay ), NULL, this ); + m_toggleBtnMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); + m_toggleBtnMirror->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_toggleBtnUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); + m_toggleBtnUpdate->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); + m_toggleBtnCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); + m_toggleBtnCustom->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorIgnore ), NULL, this ); + m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorPopup ), NULL, this ); + m_toggleBtnPermanent->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionPermanent ), NULL, this ); + m_toggleBtnRecycler->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionRecycler ), NULL, this ); + m_toggleBtnVersioning->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionVersioning ), NULL, this ); + m_choiceVersioningStyle->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnParameterChange ), NULL, this ); + m_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButtonRightOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButtonLeftNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButtonRightNewer->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButtonDifferent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this ); + m_bpButtonConflict->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); +} - bSizer22->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); +SyncCfgDlgGenerated::~SyncCfgDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) ); + m_toggleBtnTwoWay->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncTwoWayDouble ), NULL, this ); + m_toggleBtnTwoWay->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncTwoWay ), NULL, this ); + m_toggleBtnMirror->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this ); + m_toggleBtnMirror->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this ); + m_toggleBtnUpdate->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this ); + m_toggleBtnUpdate->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this ); + m_toggleBtnCustom->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this ); + m_toggleBtnCustom->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this ); + m_toggleBtnErrorIgnore->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorIgnore ), NULL, this ); + m_toggleBtnErrorPopup->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnErrorPopup ), NULL, this ); + m_toggleBtnPermanent->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionPermanent ), NULL, this ); + m_toggleBtnRecycler->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionRecycler ), NULL, this ); + m_toggleBtnVersioning->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDeletionVersioning ), NULL, this ); + m_choiceVersioningStyle->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnParameterChange ), NULL, this ); + m_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this ); + m_bpButtonRightOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExRightSideOnly ), NULL, this ); + m_bpButtonLeftNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnLeftNewer ), NULL, this ); + m_bpButtonRightNewer->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnRightNewer ), NULL, this ); + m_bpButtonDifferent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnDifferent ), NULL, this ); + m_bpButtonConflict->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnConflict ), NULL, this ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnApply ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnCancel ), NULL, this ); + +} - m_buttonOk = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOk->SetDefault(); - m_buttonOk->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); +BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( 400,260 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer54; + bSizer54 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapBatchJob = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer72->Add( m_bitmapBatchJob, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Batch job"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + m_staticTextHeader->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_staticText44 = new wxStaticText( this, wxID_ANY, _("Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe .ffs_batch"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText44->Wrap( 520 ); + bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer72->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer72->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer54->Add( bSizer72, 0, wxEXPAND, 5 ); + + m_staticline18 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer54->Add( m_staticline18, 0, wxEXPAND, 5 ); + + m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer180; + bSizer180 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer171; + bSizer171 = new wxBoxSizer( wxVERTICAL ); + + m_staticText82 = new wxStaticText( m_panel35, wxID_ANY, _("Error handling"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText82->Wrap( -1 ); + bSizer171->Add( m_staticText82, 0, wxBOTTOM, 5 ); + + wxBoxSizer* bSizer169; + bSizer169 = new wxBoxSizer( wxHORIZONTAL ); + + m_toggleBtnErrorIgnore = new wxToggleButton( m_panel35, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") ); + + bSizer169->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_toggleBtnErrorPopup = new wxToggleButton( m_panel35, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") ); + + bSizer169->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_toggleBtnErrorExit = new wxToggleButton( m_panel35, wxID_ANY, _("Exit"), wxDefaultPosition, wxDefaultSize, 0 ); + m_toggleBtnErrorExit->SetToolTip( _("Abort synchronization on first error") ); + + bSizer169->Add( m_toggleBtnErrorExit, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer171->Add( bSizer169, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer180->Add( bSizer171, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_staticline26 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer180->Add( m_staticline26, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer170; + bSizer170 = new wxBoxSizer( wxVERTICAL ); + + m_staticText81 = new wxStaticText( m_panel35, wxID_ANY, _("On completion"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText81->Wrap( -1 ); + bSizer170->Add( m_staticText81, 0, wxBOTTOM, 5 ); + + m_comboBoxExecFinished = new ExecFinishedBox( m_panel35, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer170->Add( m_comboBoxExecFinished, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer180->Add( bSizer170, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + + bSizer172->Add( bSizer180, 0, wxEXPAND, 5 ); + + m_staticline25 = new wxStaticLine( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer172->Add( m_staticline25, 0, wxEXPAND, 5 ); + + m_checkBoxShowProgress = new wxCheckBox( m_panel35, wxID_ANY, _("Show progress dialog"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer172->Add( m_checkBoxShowProgress, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 ); + + m_checkBoxGenerateLogfile = new wxCheckBox( m_panel35, wxID_ANY, _("Save log"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer172->Add( m_checkBoxGenerateLogfile, 0, wxEXPAND|wxALL, 5 ); + + m_panelLogfile = new wxPanel( m_panel35, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelLogfile->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer1721; + bSizer1721 = new wxBoxSizer( wxHORIZONTAL ); + + m_logfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 ); + bSizer1721->Add( m_logfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonSelectLogfileDir = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonSelectLogfileDir->SetToolTip( _("Select folder to save log files") ); + + bSizer1721->Add( m_buttonSelectLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_checkBoxLogfilesLimit = new wxCheckBox( m_panelLogfile, wxID_ANY, _("Limit"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") ); + + bSizer1721->Add( m_checkBoxLogfilesLimit, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 60,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 ); + m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") ); + + bSizer1721->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + m_panelLogfile->SetSizer( bSizer1721 ); + m_panelLogfile->Layout(); + bSizer1721->Fit( m_panelLogfile ); + bSizer172->Add( m_panelLogfile, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + m_panel35->SetSizer( bSizer172 ); + m_panel35->Layout(); + bSizer172->Fit( m_panel35 ); + bSizer54->Add( m_panel35, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer54->Add( m_staticline13, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonSaveAs = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonSaveAs->SetDefault(); + m_buttonSaveAs->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerStdButtons->Add( m_buttonSaveAs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer54->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + + + this->SetSizer( bSizer54 ); + this->Layout(); + bSizer54->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); + m_toggleBtnErrorIgnore->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this ); + m_toggleBtnErrorPopup->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this ); + m_toggleBtnErrorExit->Connect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorExit ), NULL, this ); + m_checkBoxGenerateLogfile->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this ); + m_checkBoxLogfilesLimit->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this ); + m_buttonSaveAs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); +} - bSizer22->Add( m_buttonOk, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); +BatchDlgGenerated::~BatchDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( BatchDlgGenerated::OnClose ) ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnHelp ), NULL, this ); + m_toggleBtnErrorIgnore->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorIgnore ), NULL, this ); + m_toggleBtnErrorPopup->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorPopup ), NULL, this ); + m_toggleBtnErrorExit->Disconnect( wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnErrorExit ), NULL, this ); + m_checkBoxGenerateLogfile->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleGenerateLogfile ), NULL, this ); + m_checkBoxLogfilesLimit->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnToggleLogfilesLimit ), NULL, this ); + m_buttonSaveAs->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSaveBatchJob ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnCancel ), NULL, this ); + +} - m_button17 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer22->Add( m_button17, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); +AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer31; + bSizer31 = new wxBoxSizer( wxVERTICAL ); + + m_panel41 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel41->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxVERTICAL ); + + m_bitmapLogo = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer162->Add( m_bitmapLogo, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticline341 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer162->Add( m_staticline341, 0, wxEXPAND, 5 ); + + m_build = new wxStaticText( m_panel41, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_build->Wrap( -1 ); + bSizer162->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_staticline3411 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer162->Add( m_staticline3411, 0, wxEXPAND, 5 ); + + m_staticText72 = new wxStaticText( m_panel41, wxID_ANY, _("Source code written in C++ using:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText72->Wrap( -1 ); + m_staticText72->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizer162->Add( m_staticText72, 0, wxALL, 5 ); + + wxBoxSizer* bSizer171; + bSizer171 = new wxBoxSizer( wxHORIZONTAL ); + + m_hyperlink11 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MS Visual C++"), wxT("http://msdn.microsoft.com/library/60k1461a.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink11->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink11->SetToolTip( _("http://msdn.microsoft.com/library/60k1461a.aspx") ); + + bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink9 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink9->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink9->SetToolTip( _("http://www.mingw.org") ); + + bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink10 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink10->SetToolTip( _("http://www.codeblocks.org") ); + + bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink7 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink7->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink7->SetToolTip( _("http://www.wxwidgets.org") ); + + bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink14 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink14->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink14->SetToolTip( _("http://wxformbuilder.org") ); + + bSizer171->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer162->Add( bSizer171, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxHORIZONTAL ); + + m_hyperlink15 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("zen::Xml"), wxT("http://zenxml.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink15->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink15->SetToolTip( _("http://zenxml.sourceforge.net") ); + + bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink13 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink13->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink13->SetToolTip( _("http://www.boost.org") ); + + bSizer172->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink16 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink16->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink16->SetToolTip( _("http://astyle.sourceforge.net") ); + + bSizer172->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink12 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink12->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink12->SetToolTip( _("http://code.google.com/p/googletest") ); + + bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink18 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink18->SetToolTip( _("http://www.scratchpaper.com") ); + + bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer162->Add( bSizer172, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_panel40 = new wxPanel( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel40->SetBackgroundColour( wxColour( 153, 170, 187 ) ); + + wxBoxSizer* bSizer183; + bSizer183 = new wxBoxSizer( wxVERTICAL ); + + m_panel39 = new wxPanel( m_panel40, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel39->SetBackgroundColour( wxColour( 221, 221, 255 ) ); + + wxBoxSizer* bSizer184; + bSizer184 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer178; + bSizer178 = new wxBoxSizer( wxVERTICAL ); + + m_staticText83 = new wxStaticText( m_panel39, wxID_ANY, _("If you like FreeFileSync"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText83->Wrap( -1 ); + m_staticText83->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 93, 92, false, wxEmptyString ) ); + m_staticText83->SetForegroundColour( wxColour( 0, 0, 0 ) ); + + bSizer178->Add( m_staticText83, 0, wxALL, 5 ); + + m_buttonDonate = new wxButton( m_panel39, wxID_ANY, _("Donate with PayPal"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonDonate->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) ); + m_buttonDonate->SetToolTip( _("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zenju@gmx.de&no_shipping=1&lc=US¤cy_code=EUR") ); + + bSizer178->Add( m_buttonDonate, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_RIGHT, 5 ); + + + bSizer184->Add( bSizer178, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_animCtrlWink = new wxAnimationCtrl( m_panel39, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxSize( -1,-1 ), wxAC_DEFAULT_STYLE ); + bSizer184->Add( m_animCtrlWink, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + m_panel39->SetSizer( bSizer184 ); + m_panel39->Layout(); + bSizer184->Fit( m_panel39 ); + bSizer183->Add( m_panel39, 0, wxEXPAND|wxALL, 5 ); + + + m_panel40->SetSizer( bSizer183 ); + m_panel40->Layout(); + bSizer183->Fit( m_panel40 ); + bSizer162->Add( m_panel40, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_scrolledWindowTranslators = new wxScrolledWindow( m_panel41, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxHSCROLL|wxVSCROLL ); + m_scrolledWindowTranslators->SetScrollRate( 10, 10 ); + m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_scrolledWindowTranslators->SetMinSize( wxSize( -1,180 ) ); + + bSizerTranslators = new wxBoxSizer( wxVERTICAL ); + + m_staticText54 = new wxStaticText( m_scrolledWindowTranslators, wxID_ANY, _("Many thanks for localization:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText54->Wrap( -1 ); + m_staticText54->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerTranslators->Add( m_staticText54, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM, 5 ); + + + bSizerTranslators->Add( 0, 5, 0, 0, 5 ); + + fgSizerTranslators = new wxFlexGridSizer( 50, 3, 2, 20 ); + fgSizerTranslators->SetFlexibleDirection( wxBOTH ); + fgSizerTranslators->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + + bSizerTranslators->Add( fgSizerTranslators, 0, wxALIGN_CENTER_HORIZONTAL, 5 ); + + + m_scrolledWindowTranslators->SetSizer( bSizerTranslators ); + m_scrolledWindowTranslators->Layout(); + bSizerTranslators->Fit( m_scrolledWindowTranslators ); + bSizer162->Add( m_scrolledWindowTranslators, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticline43 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer162->Add( m_staticline43, 0, wxEXPAND, 5 ); + + m_staticText94 = new wxStaticText( m_panel41, wxID_ANY, _("Feedback and suggestions are welcome"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText94->Wrap( -1 ); + bSizer162->Add( m_staticText94, 0, wxALL, 5 ); + + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer170; + bSizer170 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer170->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_hyperlink1 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Homepage"), wxT("http://freefilesync.sourceforge.net/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink1->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) ); + m_hyperlink1->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink1->SetToolTip( _("http://freefilesync.sourceforge.net/") ); + + bSizer170->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap9 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer170->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer170->Add( 0, 0, 1, wxEXPAND, 5 ); + + + bSizer166->Add( bSizer170, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + wxBoxSizer* bSizer1711; + bSizer1711 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer1711->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_hyperlink2 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("Email"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink2->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, true, wxEmptyString ) ); + m_hyperlink2->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + m_hyperlink2->SetToolTip( _("zenju@gmx.de") ); + + bSizer1711->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap10 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer1711->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer1711->Add( 0, 0, 1, wxEXPAND, 5 ); + + + bSizer166->Add( bSizer1711, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer162->Add( bSizer166, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + m_staticline34 = new wxStaticLine( m_panel41, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer162->Add( m_staticline34, 0, wxEXPAND, 5 ); + + m_staticText93 = new wxStaticText( m_panel41, wxID_ANY, _("Published under the GNU General Public License"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText93->Wrap( -1 ); + bSizer162->Add( m_staticText93, 0, wxALL, 5 ); + + wxBoxSizer* bSizer1671; + bSizer1671 = new wxBoxSizer( wxHORIZONTAL ); + + + bSizer1671->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmap13 = new wxStaticBitmap( m_panel41, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer1671->Add( m_bitmap13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_hyperlink5 = new wxHyperlinkCtrl( m_panel41, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE ); + m_hyperlink5->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + bSizer1671->Add( m_hyperlink5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer1671->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer162->Add( bSizer1671, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + m_panel41->SetSizer( bSizer162 ); + m_panel41->Layout(); + bSizer162->Fit( m_panel41 ); + bSizer31->Add( m_panel41, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticline36 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer31->Add( m_staticline36, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonClose = new wxButton( this, wxID_OK, _("Close"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonClose->SetDefault(); + bSizerStdButtons->Add( m_buttonClose, 0, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer31->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + + + this->SetSizer( bSizer31 ); + this->Layout(); + bSizer31->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); + m_buttonDonate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this ); + m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); +} +AboutDlgGenerated::~AboutDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( AboutDlgGenerated::OnClose ) ); + m_buttonDonate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnDonate ), NULL, this ); + m_buttonClose->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( AboutDlgGenerated::OnOK ), NULL, this ); + +} - bSizer21->Add( bSizer22, 0, wxEXPAND, 5 ); +MessageDlgGenerated::MessageDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( 300,160 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel33->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer165; + bSizer165 = new wxBoxSizer( wxVERTICAL ); + + + bSizer165->Add( 0, 10, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer26; + bSizer26 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapMsgType = new wxStaticBitmap( m_panel33, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer26->Add( m_bitmapMsgType, 0, wxRIGHT|wxLEFT, 10 ); + + m_textCtrlMessage = new wxTextCtrl( m_panel33, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 420,150 ), wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER ); + m_textCtrlMessage->SetMaxLength( 0 ); + bSizer26->Add( m_textCtrlMessage, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 5 ); + + + bSizer165->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + m_panel33->SetSizer( bSizer165 ); + m_panel33->Layout(); + bSizer165->Fit( m_panel33 ); + bSizer24->Add( m_panel33, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticline6 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer24->Add( m_staticline6, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + wxBoxSizer* bSizer25; + bSizer25 = new wxBoxSizer( wxVERTICAL ); + + m_checkBoxCustom = new wxCheckBox( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer25->Add( m_checkBoxCustom, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonAffirmative = new wxButton( this, wxID_YES, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonAffirmative, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonNegative = new wxButton( this, wxID_NO, _("dummy"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonNegative, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer25->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + + + bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + this->SetSizer( bSizer24 ); + this->Layout(); + bSizer24->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MessageDlgGenerated::OnClose ) ); + m_checkBoxCustom->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnCheckBoxClick ), NULL, this ); + m_buttonAffirmative->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnButtonAffirmative ), NULL, this ); + m_buttonNegative->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnButtonNegative ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnCancel ), NULL, this ); +} +MessageDlgGenerated::~MessageDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MessageDlgGenerated::OnClose ) ); + m_checkBoxCustom->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnCheckBoxClick ), NULL, this ); + m_buttonAffirmative->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnButtonAffirmative ), NULL, this ); + m_buttonNegative->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnButtonNegative ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MessageDlgGenerated::OnCancel ), NULL, this ); + +} - this->SetSizer( bSizer21 ); - this->Layout(); - bSizer21->Fit( this ); +DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( 300,180 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer24; + bSizer24 = new wxBoxSizer( wxVERTICAL ); + + m_panel31 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel31->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer158; + bSizer158 = new wxBoxSizer( wxVERTICAL ); + + + bSizer158->Add( 0, 10, 0, 0, 5 ); + + wxBoxSizer* bSizer159; + bSizer159 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapDeleteType = new wxStaticBitmap( m_panel31, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer159->Add( m_bitmapDeleteType, 0, wxRIGHT|wxLEFT, 10 ); + + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxVERTICAL ); + + m_staticTextHeader = new wxStaticText( m_panel31, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + bSizer160->Add( m_staticTextHeader, 0, wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); + + + bSizer160->Add( 0, 10, 0, 0, 5 ); + + m_textCtrlFileList = new wxTextCtrl( m_panel31, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 520,200 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxSTATIC_BORDER ); + m_textCtrlFileList->SetMaxLength( 0 ); + bSizer160->Add( m_textCtrlFileList, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer159->Add( bSizer160, 1, wxEXPAND, 5 ); + + + bSizer158->Add( bSizer159, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + m_panel31->SetSizer( bSizer158 ); + m_panel31->Layout(); + bSizer158->Fit( m_panel31 ); + bSizer24->Add( m_panel31, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer24->Add( m_staticline9, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer99; + bSizer99 = new wxBoxSizer( wxVERTICAL ); + + m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer99->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + m_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 ); + m_checkBoxDeleteBothSides->Hide(); + m_checkBoxDeleteBothSides->SetToolTip( _("Delete on both sides even if the file is selected on one side only") ); + + bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxLEFT, 5 ); + + + bSizerStdButtons->Add( bSizer99, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOK->SetDefault(); + m_buttonOK->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerStdButtons->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer24->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + + + this->SetSizer( bSizer24 ); + this->Layout(); + bSizer24->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); + m_checkBoxUseRecycler->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); + m_checkBoxDeleteBothSides->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); + m_buttonOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); +} - this->Centre( wxBOTH ); +DeleteDlgGenerated::~DeleteDlgGenerated() +{ + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DeleteDlgGenerated::OnClose ) ); + m_checkBoxUseRecycler->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnUseRecycler ), NULL, this ); + m_checkBoxDeleteBothSides->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnDelOnBothSides ), NULL, this ); + m_buttonOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnOK ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DeleteDlgGenerated::OnCancel ), NULL, this ); + +} - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); - m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); - m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); - m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); - m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnClear ), NULL, this ); - m_buttonOk->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); - m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); +FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +{ + this->SetSizeHints( wxSize( 500,300 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer21; + bSizer21 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmap26 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer72->Add( m_bitmap26, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + m_staticTextHeader->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_staticText44 = new wxStaticText( this, wxID_ANY, _("Only files that match all filter settings will be synchronized.\nNote: File names must be relative to base directories."), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + m_staticText44->Wrap( 500 ); + bSizer72->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + + + bSizer72->Add( 0, 0, 1, wxEXPAND, 5 ); + + m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 42,42 ), wxBU_AUTODRAW ); + m_bpButtonHelp->SetToolTip( _("Help") ); + + bSizer72->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer21->Add( bSizer72, 0, wxEXPAND, 5 ); + + m_staticline17 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer21->Add( m_staticline17, 0, wxEXPAND, 5 ); + + m_panel38 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel38->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer159; + bSizer159 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); + + m_staticText78 = new wxStaticText( m_panel38, wxID_ANY, _("Include"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText78->Wrap( -1 ); + bSizer166->Add( m_staticText78, 0, wxALL, 5 ); + + wxBoxSizer* bSizer1661; + bSizer1661 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapInclude = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + bSizer1661->Add( m_bitmapInclude, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + m_textCtrlInclude = new wxTextCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); + m_textCtrlInclude->SetMaxLength( 0 ); + bSizer1661->Add( m_textCtrlInclude, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + bSizer166->Add( bSizer1661, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 ); + + m_staticline22 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer166->Add( m_staticline22, 0, wxEXPAND, 5 ); + + m_staticText77 = new wxStaticText( m_panel38, wxID_ANY, _("Exclude"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText77->Wrap( -1 ); + bSizer166->Add( m_staticText77, 0, wxALL, 5 ); + + wxBoxSizer* bSizer1651; + bSizer1651 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapExclude = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 30,30 ), 0 ); + bSizer1651->Add( m_bitmapExclude, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlExclude = new wxTextCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE ); + m_textCtrlExclude->SetMaxLength( 0 ); + bSizer1651->Add( m_textCtrlExclude, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + bSizer166->Add( bSizer1651, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxLEFT, 5 ); + + + bSizer159->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticline24 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer159->Add( m_staticline24, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxVERTICAL ); + + m_staticText79 = new wxStaticText( m_panel38, wxID_ANY, _("Time span"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText79->Wrap( -1 ); + bSizer160->Add( m_staticText79, 0, wxALL, 5 ); + + wxBoxSizer* bSizer167; + bSizer167 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapFilterDate = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 34,34 ), 0 ); + bSizer167->Add( m_bitmapFilterDate, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT, 5 ); + + wxBoxSizer* bSizer165; + bSizer165 = new wxBoxSizer( wxVERTICAL ); + + m_spinCtrlTimespan = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer165->Add( m_spinCtrlTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxArrayString m_choiceUnitTimespanChoices; + m_choiceUnitTimespan = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitTimespanChoices, 0 ); + m_choiceUnitTimespan->SetSelection( 0 ); + bSizer165->Add( m_choiceUnitTimespan, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer167->Add( bSizer165, 1, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); + + + bSizer160->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT|wxEXPAND, 5 ); + + m_staticline23 = new wxStaticLine( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer160->Add( m_staticline23, 0, wxEXPAND, 5 ); + + m_staticText80 = new wxStaticText( m_panel38, wxID_ANY, _("File size"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText80->Wrap( -1 ); + bSizer160->Add( m_staticText80, 0, wxALL, 5 ); + + wxBoxSizer* bSizer168; + bSizer168 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapFilterSize = new wxStaticBitmap( m_panel38, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 32,32 ), 0 ); + bSizer168->Add( m_bitmapFilterSize, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + wxBoxSizer* bSizer158; + bSizer158 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxVERTICAL ); + + m_staticText101 = new wxStaticText( m_panel38, wxID_ANY, _("Minimum"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( -1 ); + bSizer162->Add( m_staticText101, 0, wxBOTTOM, 2 ); + + m_spinCtrlMinSize = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer162->Add( m_spinCtrlMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxArrayString m_choiceUnitMinSizeChoices; + m_choiceUnitMinSize = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMinSizeChoices, 0 ); + m_choiceUnitMinSize->SetSelection( 0 ); + bSizer162->Add( m_choiceUnitMinSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer158->Add( bSizer162, 0, wxBOTTOM|wxEXPAND, 5 ); + + wxBoxSizer* bSizer163; + bSizer163 = new wxBoxSizer( wxVERTICAL ); + + m_staticText102 = new wxStaticText( m_panel38, wxID_ANY, _("Maximum"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText102->Wrap( -1 ); + bSizer163->Add( m_staticText102, 0, wxBOTTOM, 2 ); + + m_spinCtrlMaxSize = new wxSpinCtrl( m_panel38, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 ); + bSizer163->Add( m_spinCtrlMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxArrayString m_choiceUnitMaxSizeChoices; + m_choiceUnitMaxSize = new wxChoice( m_panel38, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceUnitMaxSizeChoices, 0 ); + m_choiceUnitMaxSize->SetSelection( 0 ); + bSizer163->Add( m_choiceUnitMaxSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer158->Add( bSizer163, 0, wxEXPAND, 5 ); + + + bSizer168->Add( bSizer158, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer160->Add( bSizer168, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizer159->Add( bSizer160, 0, wxEXPAND, 5 ); + + + m_panel38->SetSizer( bSizer159 ); + m_panel38->Layout(); + bSizer159->Fit( m_panel38 ); + bSizer21->Add( m_panel38, 1, wxEXPAND, 5 ); + + m_staticline16 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer21->Add( m_staticline16, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonClear = new wxButton( this, wxID_DEFAULT, _("&Clear"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonClear, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + + bSizerStdButtons->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 ); + + m_buttonOk = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOk->SetDefault(); + m_buttonOk->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerStdButtons->Add( m_buttonOk, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer21->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + + + this->SetSizer( bSizer21 ); + this->Layout(); + bSizer21->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); + m_bpButtonHelp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_textCtrlInclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_textCtrlExclude->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_choiceUnitTimespan->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_buttonClear->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnClear ), NULL, this ); + m_buttonOk->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); } FilterDlgGenerated::~FilterDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); - m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); - m_textCtrlInclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); - m_textCtrlExclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); - m_choiceUnitTimespan->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_choiceUnitMinSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_choiceUnitMaxSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); - m_buttonClear->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnClear ), NULL, this ); - m_buttonOk->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); - m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( FilterDlgGenerated::OnClose ) ); + m_bpButtonHelp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnHelp ), NULL, this ); + m_textCtrlInclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_textCtrlExclude->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateNameFilter ), NULL, this ); + m_choiceUnitTimespan->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMinSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_choiceUnitMaxSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this ); + m_buttonClear->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnClear ), NULL, this ); + m_buttonOk->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this ); + } GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxSize( 320,360 ), wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer95; - bSizer95 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer72; - bSizer72 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer72->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Global settings"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextHeader->Wrap( -1 ); - m_staticTextHeader->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer95->Add( bSizer72, 0, 0, 5 ); - - m_staticline19 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer95->Add( m_staticline19, 0, wxEXPAND, 5 ); - - m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer160; - bSizer160 = new wxBoxSizer( wxVERTICAL ); - - m_checkBoxTransCopy = new wxCheckBox( m_panel39, wxID_ANY, _("Fail-safe file copy"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer160->Add( m_checkBoxTransCopy, 0, wxALL|wxEXPAND, 5 ); - - m_staticText82 = new wxStaticText( m_panel39, wxID_ANY, _("Write to a temporary file (*.ffs_tmp) first then rename it. This guarantees a consistent state even in case of fatal error."), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText82->Wrap( 460 ); - m_staticText82->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - bSizer160->Add( m_staticText82, 0, wxRIGHT|wxLEFT|wxEXPAND, 20 ); - - m_checkBoxCopyLocked = new wxCheckBox( m_panel39, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer160->Add( m_checkBoxCopyLocked, 0, wxALL|wxEXPAND, 5 ); - - m_staticTextCopyLocked = new wxStaticText( m_panel39, wxID_ANY, _("Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCopyLocked->Wrap( 460 ); - m_staticTextCopyLocked->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - bSizer160->Add( m_staticTextCopyLocked, 0, wxEXPAND|wxRIGHT|wxLEFT, 20 ); - - m_checkBoxCopyPermissions = new wxCheckBox( m_panel39, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer160->Add( m_checkBoxCopyPermissions, 0, wxALL|wxEXPAND, 5 ); - - m_staticText8211 = new wxStaticText( m_panel39, wxID_ANY, _("Transfer file and folder permissions (Requires Administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText8211->Wrap( 460 ); - m_staticText8211->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); - - bSizer160->Add( m_staticText8211, 0, wxEXPAND|wxRIGHT|wxLEFT, 20 ); - - - bSizer166->Add( bSizer160, 0, wxALL|wxEXPAND, 5 ); - - m_staticline191 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer166->Add( m_staticline191, 0, wxEXPAND|wxTOP, 5 ); - - m_buttonResetDialogs = new zen::BitmapButton( m_panel39, wxID_ANY, _("Restore hidden dialogs"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - bSizer166->Add( m_buttonResetDialogs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - m_staticline192 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer166->Add( m_staticline192, 0, wxEXPAND, 5 ); - - m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("External applications"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText85->Wrap( -1 ); - bSizer166->Add( m_staticText85, 0, wxALL, 5 ); - - wxBoxSizer* bSizer173; - bSizer173 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer157; - bSizer157 = new wxBoxSizer( wxVERTICAL ); - - m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - bSizer157->Add( m_bpButtonAddRow, 0, 0, 5 ); - - m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); - bSizer157->Add( m_bpButtonRemoveRow, 0, 0, 5 ); - - - bSizer173->Add( bSizer157, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); - - m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); - - // Grid - m_gridCustomCommand->CreateGrid( 5, 2 ); - m_gridCustomCommand->EnableEditing( true ); - m_gridCustomCommand->EnableGridLines( true ); - m_gridCustomCommand->EnableDragGridSize( false ); - m_gridCustomCommand->SetMargins( 0, 0 ); - - // Columns - m_gridCustomCommand->SetColSize( 0, 165 ); - m_gridCustomCommand->SetColSize( 1, 196 ); - m_gridCustomCommand->EnableDragColMove( false ); - m_gridCustomCommand->EnableDragColSize( true ); - m_gridCustomCommand->SetColLabelSize( 20 ); - m_gridCustomCommand->SetColLabelValue( 0, _("Description") ); - m_gridCustomCommand->SetColLabelValue( 1, _("Command line") ); - m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); - - // Rows - m_gridCustomCommand->EnableDragRowSize( false ); - m_gridCustomCommand->SetRowLabelSize( 1 ); - m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); - - // Label Appearance - - // Cell Defaults - m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); - bSizer173->Add( m_gridCustomCommand, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - - bSizer166->Add( bSizer173, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - m_panel39->SetSizer( bSizer166 ); - m_panel39->Layout(); - bSizer166->Fit( m_panel39 ); - bSizer95->Add( m_panel39, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); - - m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - - m_button9 = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer97->Add( m_button9, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer97->Add( 0, 0, 1, 0, 5 ); - - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer97->Add( m_buttonOkay, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer97->Add( m_button29, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer95->Add( bSizer97, 0, wxEXPAND, 5 ); - - - this->SetSizer( bSizer95 ); - this->Layout(); - bSizer95->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); - m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); - m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); - m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); - m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxSize( 320,360 ), wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer95; + bSizer95 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer72; + bSizer72 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapSettings = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer72->Add( m_bitmapSettings, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("Global settings"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextHeader->Wrap( -1 ); + m_staticTextHeader->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizer72->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer95->Add( bSizer72, 0, 0, 5 ); + + m_staticline19 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer95->Add( m_staticline19, 0, wxEXPAND, 5 ); + + m_panel39 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel39->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer160; + bSizer160 = new wxBoxSizer( wxVERTICAL ); + + m_checkBoxTransCopy = new wxCheckBox( m_panel39, wxID_ANY, _("Fail-safe file copy"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer160->Add( m_checkBoxTransCopy, 0, wxALL|wxEXPAND, 5 ); + + m_staticText82 = new wxStaticText( m_panel39, wxID_ANY, _("Write to a temporary file (*.ffs_tmp) first then rename it. This guarantees a consistent state even in case of fatal error."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText82->Wrap( 460 ); + m_staticText82->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + bSizer160->Add( m_staticText82, 0, wxRIGHT|wxLEFT|wxEXPAND, 20 ); + + m_checkBoxCopyLocked = new wxCheckBox( m_panel39, wxID_ANY, _("Copy locked files"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer160->Add( m_checkBoxCopyLocked, 0, wxALL|wxEXPAND, 5 ); + + m_staticTextCopyLocked = new wxStaticText( m_panel39, wxID_ANY, _("Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCopyLocked->Wrap( 460 ); + m_staticTextCopyLocked->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + bSizer160->Add( m_staticTextCopyLocked, 0, wxEXPAND|wxRIGHT|wxLEFT, 20 ); + + m_checkBoxCopyPermissions = new wxCheckBox( m_panel39, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer160->Add( m_checkBoxCopyPermissions, 0, wxALL|wxEXPAND, 5 ); + + m_staticText8211 = new wxStaticText( m_panel39, wxID_ANY, _("Transfer file and folder permissions (Requires Administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText8211->Wrap( 460 ); + m_staticText8211->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) ); + + bSizer160->Add( m_staticText8211, 0, wxEXPAND|wxRIGHT|wxLEFT, 20 ); + + + bSizer166->Add( bSizer160, 0, wxALL|wxEXPAND, 5 ); + + m_staticline191 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer166->Add( m_staticline191, 0, wxEXPAND|wxTOP, 5 ); + + m_buttonResetDialogs = new zen::BitmapButton( m_panel39, wxID_ANY, _("Restore hidden dialogs"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); + bSizer166->Add( m_buttonResetDialogs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); + + m_staticline192 = new wxStaticLine( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer166->Add( m_staticline192, 0, wxEXPAND, 5 ); + + m_staticText85 = new wxStaticText( m_panel39, wxID_ANY, _("External applications"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText85->Wrap( -1 ); + bSizer166->Add( m_staticText85, 0, wxALL, 5 ); + + wxBoxSizer* bSizer173; + bSizer173 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer157; + bSizer157 = new wxBoxSizer( wxVERTICAL ); + + m_bpButtonAddRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + bSizer157->Add( m_bpButtonAddRow, 0, 0, 5 ); + + m_bpButtonRemoveRow = new wxBitmapButton( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 25,25 ), wxBU_AUTODRAW ); + bSizer157->Add( m_bpButtonRemoveRow, 0, 0, 5 ); + + + bSizer173->Add( bSizer157, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); + + m_gridCustomCommand = new wxGrid( m_panel39, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); + + // Grid + m_gridCustomCommand->CreateGrid( 5, 2 ); + m_gridCustomCommand->EnableEditing( true ); + m_gridCustomCommand->EnableGridLines( true ); + m_gridCustomCommand->EnableDragGridSize( false ); + m_gridCustomCommand->SetMargins( 0, 0 ); + + // Columns + m_gridCustomCommand->SetColSize( 0, 165 ); + m_gridCustomCommand->SetColSize( 1, 196 ); + m_gridCustomCommand->EnableDragColMove( false ); + m_gridCustomCommand->EnableDragColSize( true ); + m_gridCustomCommand->SetColLabelSize( 20 ); + m_gridCustomCommand->SetColLabelValue( 0, _("Description") ); + m_gridCustomCommand->SetColLabelValue( 1, _("Command line") ); + m_gridCustomCommand->SetColLabelAlignment( wxALIGN_CENTRE, wxALIGN_CENTRE ); + + // Rows + m_gridCustomCommand->EnableDragRowSize( false ); + m_gridCustomCommand->SetRowLabelSize( 1 ); + m_gridCustomCommand->SetRowLabelAlignment( wxALIGN_LEFT, wxALIGN_CENTRE ); + + // Label Appearance + + // Cell Defaults + m_gridCustomCommand->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP ); + bSizer173->Add( m_gridCustomCommand, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + + bSizer166->Add( bSizer173, 1, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + + m_panel39->SetSizer( bSizer166 ); + m_panel39->Layout(); + bSizer166->Fit( m_panel39 ); + bSizer95->Add( m_panel39, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 ); + + m_staticline20 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer95->Add( m_staticline20, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonDefault = new wxButton( this, wxID_DEFAULT, _("&Default"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonDefault, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizerStdButtons->Add( 0, 0, 1, 0, 5 ); + + m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer95->Add( bSizerStdButtons, 0, wxEXPAND, 5 ); + + + this->SetSizer( bSizer95 ); + this->Layout(); + bSizer95->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); + m_buttonResetDialogs->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); + m_bpButtonAddRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); + m_bpButtonRemoveRow->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); + m_buttonDefault->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); } GlobalSettingsDlgGenerated::~GlobalSettingsDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); - m_buttonResetDialogs->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); - m_bpButtonAddRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); - m_bpButtonRemoveRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); - m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); - m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( GlobalSettingsDlgGenerated::OnClose ) ); + m_buttonResetDialogs->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnResetDialogs ), NULL, this ); + m_bpButtonAddRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnAddRow ), NULL, this ); + m_bpButtonRemoveRow->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnRemoveRow ), NULL, this ); + m_buttonDefault->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnDefault ), NULL, this ); + m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnOkay ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( GlobalSettingsDlgGenerated::OnCancel ), NULL, this ); + } -SyncPreviewDlgGenerated::SyncPreviewDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) +SyncConfirmationDlgGenerated::SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer134; - bSizer134 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer158; - bSizer158 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonStartSync = new zen::BitmapButton( this, wxID_OK, _("Start"), wxDefaultPosition, wxSize( -1,-1 ), 0 ); - m_buttonStartSync->SetDefault(); - m_buttonStartSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - m_buttonStartSync->SetToolTip( _("Start synchronization") ); - - bSizer158->Add( m_buttonStartSync, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - m_staticline16 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); - bSizer158->Add( m_staticline16, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer172; - bSizer172 = new wxBoxSizer( wxVERTICAL ); - - m_staticText84 = new wxStaticText( this, wxID_ANY, _("Variant"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText84->Wrap( -1 ); - bSizer172->Add( m_staticText84, 0, wxALL, 5 ); - - m_staticTextVariant = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextVariant->Wrap( -1 ); - m_staticTextVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer172->Add( m_staticTextVariant, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); - - - bSizer158->Add( bSizer172, 1, 0, 5 ); - - - bSizer134->Add( bSizer158, 0, wxEXPAND, 5 ); - - m_staticline14 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline14, 0, wxEXPAND, 5 ); - - m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer169; - bSizer169 = new wxBoxSizer( wxVERTICAL ); - - m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText83->Wrap( -1 ); - bSizer169->Add( m_staticText83, 0, wxALL, 5 ); - - wxFlexGridSizer* fgSizer11; - fgSizer11 = new wxFlexGridSizer( 2, 7, 2, 5 ); - fgSizer11->SetFlexibleDirection( wxBOTH ); - fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); - - m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); - - fgSizer11->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer11->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); - - fgSizer11->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapData->SetToolTip( _("Total bytes to copy") ); - - fgSizer11->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); - - fgSizer11->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer11->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") ); - - fgSizer11->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCreateLeft->Wrap( -1 ); - m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); - - fgSizer11->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextUpdateLeft->Wrap( -1 ); - m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer11->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDeleteLeft->Wrap( -1 ); - m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); - - fgSizer11->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextData->Wrap( -1 ); - m_staticTextData->SetToolTip( _("Total bytes to copy") ); - - fgSizer11->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextDeleteRight->Wrap( -1 ); - m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); - - fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextUpdateRight->Wrap( -1 ); - m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") ); - - fgSizer11->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextCreateRight->Wrap( -1 ); - m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") ); - - fgSizer11->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - bSizer169->Add( fgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL, 5 ); - - - m_panelStatistics->SetSizer( bSizer169 ); - m_panelStatistics->Layout(); - bSizer169->Fit( m_panelStatistics ); - bSizer134->Add( m_panelStatistics, 0, wxEXPAND, 5 ); - - m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer142; - bSizer142 = new wxBoxSizer( wxHORIZONTAL ); - - m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer142->Add( m_checkBoxDontShowAgain, 1, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_button16 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer142->Add( m_button16, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 ); - - - bSizer134->Add( bSizer142, 0, wxEXPAND, 5 ); - - - this->SetSizer( bSizer134 ); - this->Layout(); - bSizer134->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncPreviewDlgGenerated::OnClose ) ); - m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnStartSync ), NULL, this ); - m_button16->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer134; + bSizer134 = new wxBoxSizer( wxVERTICAL ); + + m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panelStatistics->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer169; + bSizer169 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapSync = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer169->Add( m_bitmapSync, 0, wxALL, 10 ); + + m_staticline39 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL ); + bSizer169->Add( m_staticline39, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer172; + bSizer172 = new wxBoxSizer( wxVERTICAL ); + + m_staticText84 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Variant"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText84->Wrap( -1 ); + bSizer172->Add( m_staticText84, 0, wxALL, 5 ); + + m_staticTextVariant = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextVariant->Wrap( -1 ); + m_staticTextVariant->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizer172->Add( m_staticTextVariant, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); + + + bSizer172->Add( 0, 10, 0, 0, 5 ); + + + bSizer162->Add( bSizer172, 0, wxEXPAND, 5 ); + + m_staticline14 = new wxStaticLine( m_panelStatistics, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer162->Add( m_staticline14, 0, wxEXPAND, 5 ); + + m_staticText83 = new wxStaticText( m_panelStatistics, wxID_ANY, _("Statistics"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText83->Wrap( -1 ); + bSizer162->Add( m_staticText83, 0, wxALL, 5 ); + + wxFlexGridSizer* fgSizer11; + fgSizer11 = new wxFlexGridSizer( 2, 7, 2, 5 ); + fgSizer11->SetFlexibleDirection( wxBOTH ); + fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); + + m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); + + fgSizer11->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer11->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); + + fgSizer11->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapData->SetToolTip( _("Total bytes to copy") ); + + fgSizer11->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); + + fgSizer11->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer11->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") ); + + fgSizer11->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCreateLeft->Wrap( -1 ); + m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") ); + + fgSizer11->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextUpdateLeft->Wrap( -1 ); + m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer11->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDeleteLeft->Wrap( -1 ); + m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") ); + + fgSizer11->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextData->Wrap( -1 ); + m_staticTextData->SetToolTip( _("Total bytes to copy") ); + + fgSizer11->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDeleteRight->Wrap( -1 ); + m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") ); + + fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextUpdateRight->Wrap( -1 ); + m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") ); + + fgSizer11->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextCreateRight->Wrap( -1 ); + m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") ); + + fgSizer11->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + bSizer162->Add( fgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 25 ); + + + bSizer162->Add( 0, 5, 0, 0, 5 ); + + + bSizer169->Add( bSizer162, 0, 0, 5 ); + + + m_panelStatistics->SetSizer( bSizer169 ); + m_panelStatistics->Layout(); + bSizer169->Fit( m_panelStatistics ); + bSizer134->Add( m_panelStatistics, 0, wxEXPAND, 5 ); + + m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer134->Add( m_staticline12, 0, wxEXPAND, 5 ); + + wxBoxSizer* bSizer164; + bSizer164 = new wxBoxSizer( wxVERTICAL ); + + m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer164->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonStartSync = new wxButton( this, wxID_OK, _("Start"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonStartSync->SetDefault(); + m_buttonStartSync->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerStdButtons->Add( m_buttonStartSync, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer164->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + + + bSizer134->Add( bSizer164, 1, wxEXPAND, 5 ); + + + this->SetSizer( bSizer134 ); + this->Layout(); + bSizer134->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncConfirmationDlgGenerated::OnClose ) ); + m_buttonStartSync->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnStartSync ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnCancel ), NULL, this ); } -SyncPreviewDlgGenerated::~SyncPreviewDlgGenerated() +SyncConfirmationDlgGenerated::~SyncConfirmationDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncPreviewDlgGenerated::OnClose ) ); - m_buttonStartSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnStartSync ), NULL, this ); - m_button16->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncPreviewDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncConfirmationDlgGenerated::OnClose ) ); + m_buttonStartSync->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnStartSync ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncConfirmationDlgGenerated::OnCancel ), NULL, this ); + } PopupDialogGenerated::PopupDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer158; - bSizer158 = new wxBoxSizer( wxHORIZONTAL ); - - m_bitmapLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); - bSizer158->Add( m_bitmapLeft, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_staticTextMain = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticTextMain->Wrap( 600 ); - bSizer158->Add( m_staticTextMain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); - - - this->SetSizer( bSizer158 ); - this->Layout(); - bSizer158->Fit( this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer158; + bSizer158 = new wxBoxSizer( wxHORIZONTAL ); + + m_bitmapLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 ); + bSizer158->Add( m_bitmapLeft, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextMain = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextMain->Wrap( 600 ); + bSizer158->Add( m_staticTextMain, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 ); + + + this->SetSizer( bSizer158 ); + this->Layout(); + bSizer158->Fit( this ); } PopupDialogGenerated::~PopupDialogGenerated() @@ -3381,142 +3411,141 @@ PopupDialogGenerated::~PopupDialogGenerated() SearchDialogGenerated::SearchDialogGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - - wxBoxSizer* bSizer161; - bSizer161 = new wxBoxSizer( wxHORIZONTAL ); - - wxBoxSizer* bSizer166; - bSizer166 = new wxBoxSizer( wxVERTICAL ); - - wxBoxSizer* bSizer162; - bSizer162 = new wxBoxSizer( wxHORIZONTAL ); - - m_staticText101 = new wxStaticText( this, wxID_ANY, _("Find what:"), wxDefaultPosition, wxDefaultSize, 0 ); - m_staticText101->Wrap( -1 ); - bSizer162->Add( m_staticText101, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); - - m_textCtrlSearchTxt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220,-1 ), 0 ); - m_textCtrlSearchTxt->SetMaxLength( 0 ); - bSizer162->Add( m_textCtrlSearchTxt, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); - - - bSizer166->Add( bSizer162, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - - bSizer166->Add( 0, 5, 0, 0, 5 ); - - m_checkBoxMatchCase = new wxCheckBox( this, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer166->Add( m_checkBoxMatchCase, 0, wxEXPAND|wxALL, 5 ); - - - bSizer161->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxVERTICAL ); - - m_buttonFindNext = new wxButton( this, wxID_OK, _("&Find next"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonFindNext->SetDefault(); - m_buttonFindNext->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer97->Add( m_buttonFindNext, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer97->Add( m_button29, 0, wxEXPAND|wxALL, 5 ); - - - bSizer161->Add( bSizer97, 0, 0, 5 ); - - - this->SetSizer( bSizer161 ); - this->Layout(); - bSizer161->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); - m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); - m_buttonFindNext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + + wxBoxSizer* bSizer161; + bSizer161 = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer* bSizer166; + bSizer166 = new wxBoxSizer( wxVERTICAL ); + + wxBoxSizer* bSizer162; + bSizer162 = new wxBoxSizer( wxHORIZONTAL ); + + m_staticText101 = new wxStaticText( this, wxID_ANY, _("Find what:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticText101->Wrap( -1 ); + bSizer162->Add( m_staticText101, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); + + m_textCtrlSearchTxt = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 220,-1 ), 0 ); + m_textCtrlSearchTxt->SetMaxLength( 0 ); + bSizer162->Add( m_textCtrlSearchTxt, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 ); + + + bSizer166->Add( bSizer162, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + + bSizer166->Add( 0, 5, 0, 0, 5 ); + + m_checkBoxMatchCase = new wxCheckBox( this, wxID_ANY, _("Match case"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer166->Add( m_checkBoxMatchCase, 0, wxEXPAND|wxALL, 5 ); + + + bSizer161->Add( bSizer166, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + wxBoxSizer* bSizer97; + bSizer97 = new wxBoxSizer( wxVERTICAL ); + + m_buttonFindNext = new wxButton( this, wxID_OK, _("&Find next"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonFindNext->SetDefault(); + m_buttonFindNext->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizer97->Add( m_buttonFindNext, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); + + m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizer97->Add( m_button29, 0, wxEXPAND|wxALL, 5 ); + + + bSizer161->Add( bSizer97, 0, 0, 5 ); + + + this->SetSizer( bSizer161 ); + this->Layout(); + bSizer161->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); + m_textCtrlSearchTxt->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); + m_buttonFindNext->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); + m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); } SearchDialogGenerated::~SearchDialogGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); - m_textCtrlSearchTxt->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); - m_buttonFindNext->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SearchDialogGenerated::OnClose ) ); + m_textCtrlSearchTxt->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( SearchDialogGenerated::OnText ), NULL, this ); + m_buttonFindNext->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnFindNext ), NULL, this ); + m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SearchDialogGenerated::OnCancel ), NULL, this ); + } SelectTimespanDlgGenerated::SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style ) { - this->SetSizeHints( wxDefaultSize, wxDefaultSize ); - this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); - - wxBoxSizer* bSizer96; - bSizer96 = new wxBoxSizer( wxVERTICAL ); - - m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); - m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); - - wxBoxSizer* bSizer98; - bSizer98 = new wxBoxSizer( wxHORIZONTAL ); - - m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS ); - bSizer98->Add( m_calendarFrom, 0, wxALL, 5 ); - - m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS ); - bSizer98->Add( m_calendarTo, 0, wxALL, 5 ); - - - m_panel35->SetSizer( bSizer98 ); - m_panel35->Layout(); - bSizer98->Fit( m_panel35 ); - bSizer96->Add( m_panel35, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); - - m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); - bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 ); - - wxBoxSizer* bSizer97; - bSizer97 = new wxBoxSizer( wxHORIZONTAL ); - - m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - m_buttonOkay->SetDefault(); - m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); - - bSizer97->Add( m_buttonOkay, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); - - m_button29 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); - bSizer97->Add( m_button29, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - - - bSizer96->Add( bSizer97, 0, wxALIGN_RIGHT, 5 ); - - - this->SetSizer( bSizer96 ); - this->Layout(); - bSizer96->Fit( this ); - - this->Centre( wxBOTH ); - - // Connect Events - this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) ); - m_calendarFrom->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this ); - m_calendarTo->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this ); - m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this ); - m_button29->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this ); + this->SetSizeHints( wxDefaultSize, wxDefaultSize ); + this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) ); + + wxBoxSizer* bSizer96; + bSizer96 = new wxBoxSizer( wxVERTICAL ); + + m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ); + m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) ); + + wxBoxSizer* bSizer98; + bSizer98 = new wxBoxSizer( wxHORIZONTAL ); + + m_calendarFrom = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS ); + bSizer98->Add( m_calendarFrom, 0, wxALL, 5 ); + + m_calendarTo = new wxCalendarCtrl( m_panel35, wxID_ANY, wxDefaultDateTime, wxDefaultPosition, wxDefaultSize, wxCAL_SHOW_HOLIDAYS ); + bSizer98->Add( m_calendarTo, 0, wxALL, 5 ); + + + m_panel35->SetSizer( bSizer98 ); + m_panel35->Layout(); + bSizer98->Fit( m_panel35 ); + bSizer96->Add( m_panel35, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5 ); + + m_staticline21 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); + bSizer96->Add( m_staticline21, 0, wxEXPAND, 5 ); + + bSizerStdButtons = new wxBoxSizer( wxHORIZONTAL ); + + m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + m_buttonOkay->SetDefault(); + m_buttonOkay->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 92, false, wxEmptyString ) ); + + bSizerStdButtons->Add( m_buttonOkay, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); + + m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 ); + bSizerStdButtons->Add( m_buttonCancel, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 ); + + + bSizer96->Add( bSizerStdButtons, 0, wxALIGN_RIGHT, 5 ); + + + this->SetSizer( bSizer96 ); + this->Layout(); + bSizer96->Fit( this ); + + this->Centre( wxBOTH ); + + // Connect Events + this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) ); + m_calendarFrom->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this ); + m_calendarTo->Connect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this ); + m_buttonOkay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this ); + m_buttonCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this ); } SelectTimespanDlgGenerated::~SelectTimespanDlgGenerated() { - // Disconnect Events - this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) ); - m_calendarFrom->Disconnect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this ); - m_calendarTo->Disconnect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this ); - m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this ); - m_button29->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this ); - + // Disconnect Events + this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SelectTimespanDlgGenerated::OnClose ) ); + m_calendarFrom->Disconnect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionFrom ), NULL, this ); + m_calendarTo->Disconnect( wxEVT_CALENDAR_SEL_CHANGED, wxCalendarEventHandler( SelectTimespanDlgGenerated::OnChangeSelectionTo ), NULL, this ); + m_buttonOkay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnOkay ), NULL, this ); + m_buttonCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SelectTimespanDlgGenerated::OnCancel ), NULL, this ); + } diff --git a/ui/gui_generated.h b/ui/gui_generated.h index 4a7857fa..27395e33 100644 --- a/ui/gui_generated.h +++ b/ui/gui_generated.h @@ -15,10 +15,10 @@ class ExecFinishedBox; class FolderHistoryBox; class ToggleButton; class wxStaticText; -namespace zen { class BitmapButton; } -namespace zen { class Graph2D; } -namespace zen { class Grid; } -namespace zen { class TripleSplitter; } +namespace zen{ class BitmapButton; } +namespace zen{ class Graph2D; } +namespace zen{ class Grid; } +namespace zen{ class TripleSplitter; } #include #include @@ -44,13 +44,11 @@ namespace zen { class TripleSplitter; } #include #include #include -#include -#include -#include +#include #include -#include -#include #include +#include +#include #include #include #include @@ -63,866 +61,877 @@ namespace zen { class TripleSplitter; } /////////////////////////////////////////////////////////////////////////////// /// Class MainDialogGenerated /////////////////////////////////////////////////////////////////////////////// -class MainDialogGenerated : public wxFrame +class MainDialogGenerated : public wxFrame { -private: - -protected: - wxMenuBar* m_menubar1; - wxMenu* m_menuFile; - wxMenuItem* m_menuItemNew; - wxMenuItem* m_menuItemLoad; - wxMenuItem* m_menuItemSave; - wxMenuItem* m_menuItemSaveAs; - wxMenuItem* m_menuItem7; - wxMenuItem* m_menuItem10; - wxMenuItem* m_menuItem11; - wxMenu* m_menuAdvanced; - wxMenu* m_menuLanguages; - wxMenuItem* m_menuItemGlobSett; - wxMenu* m_menuHelp; - wxMenuItem* m_menuItemManual; - wxMenu* m_menuCheckVersion; - wxMenuItem* m_menuItemCheckVersionNow; - wxMenuItem* m_menuItemCheckVersionAuto; - wxMenuItem* m_menuItemAbout; - wxBoxSizer* bSizerPanelHolder; - wxPanel* m_panelTopButtons; - wxBoxSizer* bSizerTopButtons; - wxStaticText* m_staticTextCmpVariant; - zen::BitmapButton* m_buttonCompare; - zen::BitmapButton* m_buttonCancel; - wxBitmapButton* m_bpButtonCmpConfig; - wxStaticText* m_staticTextSyncVariant; - wxBitmapButton* m_bpButtonSyncConfig; - zen::BitmapButton* m_buttonSync; - wxPanel* m_panelDirectoryPairs; - wxStaticText* m_staticTextResolvedPathL; - wxBitmapButton* m_bpButtonAddPair; - wxButton* m_buttonSelectDirLeft; - wxPanel* m_panelTopMiddle; - wxBitmapButton* m_bpButtonSwapSides; - wxStaticText* m_staticTextResolvedPathR; - wxButton* m_buttonSelectDirRight; - wxScrolledWindow* m_scrolledWindowFolderPairs; - wxBoxSizer* bSizerAddFolderPairs; - zen::Grid* m_gridNavi; - wxPanel* m_panelCenter; - zen::TripleSplitter* m_splitterMain; - zen::Grid* m_gridMainL; - zen::Grid* m_gridMainC; - zen::Grid* m_gridMainR; - wxPanel* m_panelStatusBar; - wxBoxSizer* bSizerFileStatus; - wxBoxSizer* bSizerStatusLeft; - wxBoxSizer* bSizerStatusLeftDirectories; - wxStaticBitmap* m_bitmapSmallDirectoryLeft; - wxStaticText* m_staticTextStatusLeftDirs; - wxBoxSizer* bSizerStatusLeftFiles; - wxStaticBitmap* m_bitmapSmallFileLeft; - wxStaticText* m_staticTextStatusLeftFiles; - wxStaticText* m_staticTextStatusLeftBytes; - wxStaticLine* m_staticline9; - wxStaticText* m_staticTextStatusMiddle; - wxBoxSizer* bSizerStatusRight; - wxStaticLine* m_staticline10; - wxBoxSizer* bSizerStatusRightDirectories; - wxStaticBitmap* m_bitmapSmallDirectoryRight; - wxStaticText* m_staticTextStatusRightDirs; - wxBoxSizer* bSizerStatusRightFiles; - wxStaticBitmap* m_bitmapSmallFileRight; - wxStaticText* m_staticTextStatusRightFiles; - wxStaticText* m_staticTextStatusRightBytes; - wxStaticText* m_staticTextFullStatus; - wxPanel* m_panelConfig; - wxBoxSizer* bSizerConfig; - wxBitmapButton* m_bpButtonOpen; - wxBitmapButton* m_bpButtonSave; - wxBitmapButton* m_bpButtonBatchJob; - wxListBox* m_listBoxHistory; - wxPanel* m_panelFilter; - wxBitmapButton* m_bpButtonFilter; - wxCheckBox* m_checkBoxHideExcluded; - wxPanel* m_panelStatistics; - wxBoxSizer* bSizer1801; - wxStaticBitmap* m_bitmapCreateLeft; - wxStaticText* m_staticTextCreateLeft; - wxStaticBitmap* m_bitmapUpdateLeft; - wxStaticText* m_staticTextUpdateLeft; - wxStaticBitmap* m_bitmapDeleteLeft; - wxStaticText* m_staticTextDeleteLeft; - wxStaticBitmap* m_bitmapData; - wxStaticText* m_staticTextData; - wxStaticBitmap* m_bitmapDeleteRight; - wxStaticText* m_staticTextDeleteRight; - wxStaticBitmap* m_bitmapUpdateRight; - wxStaticText* m_staticTextUpdateRight; - wxStaticBitmap* m_bitmapCreateRight; - wxStaticText* m_staticTextCreateRight; - wxPanel* m_panelViewFilter; - wxBoxSizer* bSizerViewFilter; - ToggleButton* m_bpButtonViewTypeSyncAction; - ToggleButton* m_bpButtonShowCreateLeft; - ToggleButton* m_bpButtonShowUpdateLeft; - ToggleButton* m_bpButtonShowDeleteLeft; - ToggleButton* m_bpButtonShowLeftOnly; - ToggleButton* m_bpButtonShowLeftNewer; - ToggleButton* m_bpButtonShowEqual; - ToggleButton* m_bpButtonShowDifferent; - ToggleButton* m_bpButtonShowDoNothing; - ToggleButton* m_bpButtonShowRightNewer; - ToggleButton* m_bpButtonShowRightOnly; - ToggleButton* m_bpButtonShowDeleteRight; - ToggleButton* m_bpButtonShowUpdateRight; - ToggleButton* m_bpButtonShowCreateRight; - ToggleButton* m_bpButtonShowConflict; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnConfigNew( wxCommandEvent& event ) { event.Skip(); } - virtual void OnConfigLoad( wxCommandEvent& event ) { event.Skip(); } - virtual void OnConfigSave( wxCommandEvent& event ) { event.Skip(); } - virtual void OnConfigSaveAs( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSaveAsBatchJob( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCompare( wxCommandEvent& event ) { event.Skip(); } - virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuQuit( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuGlobalSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuExportFileList( wxCommandEvent& event ) { event.Skip(); } - virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuCheckVersionAutomatically( wxCommandEvent& event ) { event.Skip(); } - virtual void OnMenuAbout( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCmpSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCompSettingsContext( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncSettingsContext( wxMouseEvent& event ) { event.Skip(); } - virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSwapSides( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ) { event.Skip(); } - virtual void OnLoadFromHistory( wxCommandEvent& event ) { event.Skip(); } - virtual void OnLoadFromHistoryDoubleClick( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCfgHistoryRightClick( wxMouseEvent& event ) { event.Skip(); } - virtual void OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); } - virtual void OnGlobalFilterContext( wxMouseEvent& event ) { event.Skip(); } - virtual void OnShowExcluded( wxCommandEvent& event ) { event.Skip(); } - virtual void OnToggleViewType( wxCommandEvent& event ) { event.Skip(); } - virtual void OnToggleViewButton( wxCommandEvent& event ) { event.Skip(); } - virtual void OnViewButtonRightClick( wxMouseEvent& event ) { event.Skip(); } - - -public: - wxPanel* m_panelTopLeft; - wxBitmapButton* m_bpButtonRemovePair; - FolderHistoryBox* m_directoryLeft; - wxBitmapButton* m_bpButtonAltCompCfg; - wxBitmapButton* m_bpButtonLocalFilter; - wxBitmapButton* m_bpButtonAltSyncCfg; - wxPanel* m_panelTopRight; - FolderHistoryBox* m_directoryRight; - wxBoxSizer* bSizerStatistics; - wxBoxSizer* bSizerData; - - MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 702,522 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); - - ~MainDialogGenerated(); - + private: + + protected: + wxMenuBar* m_menubar1; + wxMenu* m_menuFile; + wxMenuItem* m_menuItemNew; + wxMenuItem* m_menuItemLoad; + wxMenuItem* m_menuItemSave; + wxMenuItem* m_menuItemSaveAs; + wxMenuItem* m_menuItem7; + wxMenuItem* m_menuItem10; + wxMenuItem* m_menuItem11; + wxMenu* m_menuTools; + wxMenu* m_menuLanguages; + wxMenuItem* m_menuItemGlobSett; + wxMenu* m_menuHelp; + wxMenuItem* m_menuItemManual; + wxMenu* m_menuCheckVersion; + wxMenuItem* m_menuItemCheckVersionNow; + wxMenuItem* m_menuItemCheckVersionAuto; + wxMenuItem* m_menuItemAbout; + wxBoxSizer* bSizerPanelHolder; + wxPanel* m_panelTopButtons; + wxBoxSizer* bSizerTopButtons; + wxStaticText* m_staticTextCmpVariant; + zen::BitmapButton* m_buttonCompare; + zen::BitmapButton* m_buttonCancel; + wxBitmapButton* m_bpButtonCmpConfig; + wxStaticText* m_staticTextSyncVariant; + wxBitmapButton* m_bpButtonSyncConfig; + zen::BitmapButton* m_buttonSync; + wxPanel* m_panelDirectoryPairs; + wxStaticText* m_staticTextResolvedPathL; + wxBitmapButton* m_bpButtonAddPair; + wxButton* m_buttonSelectDirLeft; + wxPanel* m_panelTopMiddle; + wxBitmapButton* m_bpButtonSwapSides; + wxStaticText* m_staticTextResolvedPathR; + wxButton* m_buttonSelectDirRight; + wxScrolledWindow* m_scrolledWindowFolderPairs; + wxBoxSizer* bSizerAddFolderPairs; + zen::Grid* m_gridNavi; + wxPanel* m_panelCenter; + zen::TripleSplitter* m_splitterMain; + zen::Grid* m_gridMainL; + zen::Grid* m_gridMainC; + zen::Grid* m_gridMainR; + wxPanel* m_panelStatusBar; + wxBoxSizer* bSizerFileStatus; + wxBoxSizer* bSizerStatusLeft; + wxBoxSizer* bSizerStatusLeftDirectories; + wxStaticBitmap* m_bitmapSmallDirectoryLeft; + wxStaticText* m_staticTextStatusLeftDirs; + wxBoxSizer* bSizerStatusLeftFiles; + wxStaticBitmap* m_bitmapSmallFileLeft; + wxStaticText* m_staticTextStatusLeftFiles; + wxStaticText* m_staticTextStatusLeftBytes; + wxStaticLine* m_staticline9; + wxStaticText* m_staticTextStatusMiddle; + wxBoxSizer* bSizerStatusRight; + wxStaticLine* m_staticline10; + wxBoxSizer* bSizerStatusRightDirectories; + wxStaticBitmap* m_bitmapSmallDirectoryRight; + wxStaticText* m_staticTextStatusRightDirs; + wxBoxSizer* bSizerStatusRightFiles; + wxStaticBitmap* m_bitmapSmallFileRight; + wxStaticText* m_staticTextStatusRightFiles; + wxStaticText* m_staticTextStatusRightBytes; + wxStaticText* m_staticTextFullStatus; + wxPanel* m_panelConfig; + wxBoxSizer* bSizerConfig; + wxBitmapButton* m_bpButtonOpen; + wxBitmapButton* m_bpButtonSave; + wxBitmapButton* m_bpButtonBatchJob; + wxListBox* m_listBoxHistory; + wxPanel* m_panelFilter; + wxBitmapButton* m_bpButtonFilter; + wxCheckBox* m_checkBoxHideExcluded; + wxPanel* m_panelStatistics; + wxBoxSizer* bSizer1801; + wxStaticBitmap* m_bitmapCreateLeft; + wxStaticText* m_staticTextCreateLeft; + wxStaticBitmap* m_bitmapUpdateLeft; + wxStaticText* m_staticTextUpdateLeft; + wxStaticBitmap* m_bitmapDeleteLeft; + wxStaticText* m_staticTextDeleteLeft; + wxStaticBitmap* m_bitmapData; + wxStaticText* m_staticTextData; + wxStaticBitmap* m_bitmapDeleteRight; + wxStaticText* m_staticTextDeleteRight; + wxStaticBitmap* m_bitmapUpdateRight; + wxStaticText* m_staticTextUpdateRight; + wxStaticBitmap* m_bitmapCreateRight; + wxStaticText* m_staticTextCreateRight; + wxPanel* m_panelViewFilter; + wxBoxSizer* bSizerViewFilter; + ToggleButton* m_bpButtonViewTypeSyncAction; + ToggleButton* m_bpButtonShowCreateLeft; + ToggleButton* m_bpButtonShowUpdateLeft; + ToggleButton* m_bpButtonShowDeleteLeft; + ToggleButton* m_bpButtonShowLeftOnly; + ToggleButton* m_bpButtonShowLeftNewer; + ToggleButton* m_bpButtonShowEqual; + ToggleButton* m_bpButtonShowDifferent; + ToggleButton* m_bpButtonShowDoNothing; + ToggleButton* m_bpButtonShowRightNewer; + ToggleButton* m_bpButtonShowRightOnly; + ToggleButton* m_bpButtonShowDeleteRight; + ToggleButton* m_bpButtonShowUpdateRight; + ToggleButton* m_bpButtonShowCreateRight; + ToggleButton* m_bpButtonShowConflict; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnConfigNew( wxCommandEvent& event ) { event.Skip(); } + virtual void OnConfigLoad( wxCommandEvent& event ) { event.Skip(); } + virtual void OnConfigSave( wxCommandEvent& event ) { event.Skip(); } + virtual void OnConfigSaveAs( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSaveAsBatchJob( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCompare( wxCommandEvent& event ) { event.Skip(); } + virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuQuit( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuExportFileList( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuGlobalSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuCheckVersion( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuCheckVersionAutomatically( wxCommandEvent& event ) { event.Skip(); } + virtual void OnMenuAbout( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCmpSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCompSettingsContext( wxMouseEvent& event ) { event.Skip(); } + virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncSettingsContext( wxMouseEvent& event ) { event.Skip(); } + virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSwapSides( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCfgHistoryKeyEvent( wxKeyEvent& event ) { event.Skip(); } + virtual void OnLoadFromHistory( wxCommandEvent& event ) { event.Skip(); } + virtual void OnLoadFromHistoryDoubleClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCfgHistoryRightClick( wxMouseEvent& event ) { event.Skip(); } + virtual void OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); } + virtual void OnGlobalFilterContext( wxMouseEvent& event ) { event.Skip(); } + virtual void OnShowExcluded( wxCommandEvent& event ) { event.Skip(); } + virtual void OnToggleViewType( wxCommandEvent& event ) { event.Skip(); } + virtual void OnToggleViewButton( wxCommandEvent& event ) { event.Skip(); } + virtual void OnViewButtonRightClick( wxMouseEvent& event ) { event.Skip(); } + + + public: + wxPanel* m_panelTopLeft; + wxBitmapButton* m_bpButtonRemovePair; + FolderHistoryBox* m_directoryLeft; + wxBitmapButton* m_bpButtonAltCompCfg; + wxBitmapButton* m_bpButtonLocalFilter; + wxBitmapButton* m_bpButtonAltSyncCfg; + wxPanel* m_panelTopRight; + FolderHistoryBox* m_directoryRight; + wxBoxSizer* bSizerStatistics; + wxBoxSizer* bSizerData; + + MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 900,600 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + + ~MainDialogGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// -/// Class FolderPairGenerated +/// Class FolderPairPanelGenerated /////////////////////////////////////////////////////////////////////////////// -class FolderPairGenerated : public wxPanel +class FolderPairPanelGenerated : public wxPanel { -private: - -protected: - wxButton* m_buttonSelectDirLeft; - wxButton* m_buttonSelectDirRight; - -public: - wxPanel* m_panelLeft; - wxBitmapButton* m_bpButtonRemovePair; - FolderHistoryBox* m_directoryLeft; - wxPanel* m_panel20; - wxBitmapButton* m_bpButtonAltCompCfg; - wxBitmapButton* m_bpButtonLocalFilter; - wxBitmapButton* m_bpButtonAltSyncCfg; - wxPanel* m_panelRight; - FolderHistoryBox* m_directoryRight; - - FolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 ); - ~FolderPairGenerated(); - + private: + + protected: + wxButton* m_buttonSelectDirLeft; + wxButton* m_buttonSelectDirRight; + + public: + wxPanel* m_panelLeft; + wxBitmapButton* m_bpButtonRemovePair; + FolderHistoryBox* m_directoryLeft; + wxPanel* m_panel20; + wxBitmapButton* m_bpButtonAltCompCfg; + wxBitmapButton* m_bpButtonLocalFilter; + wxBitmapButton* m_bpButtonAltSyncCfg; + wxPanel* m_panelRight; + FolderHistoryBox* m_directoryRight; + + FolderPairPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0 ); + ~FolderPairPanelGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class CompareProgressDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class CompareProgressDlgGenerated : public wxPanel +class CompareProgressDlgGenerated : public wxPanel { -private: - -protected: - wxTextCtrl* m_textCtrlStatus; - wxGauge* m_gauge2; - wxBoxSizer* bSizer42; - wxBoxSizer* bSizerFilesFound; - wxStaticText* m_staticText321; - wxStaticText* m_staticTextScanned; - wxBoxSizer* bSizerFilesRemaining; - wxStaticText* m_staticText46; - wxStaticText* m_staticTextFilesRemaining; - wxStaticText* m_staticTextDataRemaining; - wxBoxSizer* sSizerSpeed; - wxStaticText* m_staticText104; - wxStaticText* m_staticTextSpeed; - wxBoxSizer* sSizerTimeRemaining; - wxStaticText* m_staticTextTimeRemFixed; - wxStaticText* m_staticTextRemTime; - wxBoxSizer* sSizerTimeElapsed; - wxStaticText* m_staticTextTimeElapsed; - -public: - - CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxRAISED_BORDER ); - ~CompareProgressDlgGenerated(); - + private: + + protected: + wxTextCtrl* m_textCtrlStatus; + wxGauge* m_gauge2; + wxBoxSizer* bSizer42; + wxBoxSizer* bSizerFilesFound; + wxStaticText* m_staticText321; + wxStaticText* m_staticTextScanned; + wxBoxSizer* bSizerFilesRemaining; + wxStaticText* m_staticText46; + wxStaticText* m_staticTextFilesRemaining; + wxStaticText* m_staticTextDataRemaining; + wxBoxSizer* sSizerSpeed; + wxStaticText* m_staticText104; + wxStaticText* m_staticTextSpeed; + wxBoxSizer* sSizerTimeRemaining; + wxStaticText* m_staticTextTimeRemFixed; + wxStaticText* m_staticTextRemTime; + wxBoxSizer* sSizerTimeElapsed; + wxStaticText* m_staticTextTimeElapsed; + + public: + + CompareProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxRAISED_BORDER ); + ~CompareProgressDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SyncProgressDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncProgressDlgGenerated : public wxFrame +class SyncProgressDlgGenerated : public wxFrame { -private: - -protected: - wxBoxSizer* bSizerRoot; - wxStaticBitmap* m_bitmapStatus; - wxStaticText* m_staticTextPhase; - wxAnimationCtrl* m_animationControl1; - wxStaticLine* m_staticlineHeader; - wxPanel* m_panelProgress; - wxStaticText* m_staticTextStatus; - wxBoxSizer* bSizer171; - wxStaticText* m_staticTextLabelItemsProc; - wxBoxSizer* bSizerItemsProc; - wxStaticText* m_staticTextProcessedObj; - wxStaticText* m_staticTextDataProcessed; - wxStaticText* m_staticTextLabelItemsRem; - wxBoxSizer* bSizerItemsRem; - wxStaticText* m_staticTextRemainingObj; - wxStaticText* m_staticTextDataRemaining; - wxStaticText* m_staticText84; - wxStaticText* m_staticTextSpeed; - wxStaticText* m_staticTextLabelRemTime; - wxStaticText* m_staticTextRemTime; - wxStaticText* m_staticTextLabelElapsedTime; - wxStaticText* m_staticTextTimeElapsed; - zen::Graph2D* m_panelGraph; - wxListbook* m_listbookResult; - wxStaticLine* m_staticline12; - wxBoxSizer* bSizerExecFinished; - wxStaticText* m_staticText87; - ExecFinishedBox* m_comboBoxExecFinished; - wxBoxSizer* bSizer28; - wxButton* m_buttonClose; - wxButton* m_buttonPause; - wxButton* m_buttonAbort; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnIconize( wxIconizeEvent& event ) { event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void OnPause( wxCommandEvent& event ) { event.Skip(); } - virtual void OnAbort( wxCommandEvent& event ) { event.Skip(); } - - -public: - wxGauge* m_gauge1; - - SyncProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); - - ~SyncProgressDlgGenerated(); - + private: + + protected: + wxBoxSizer* bSizerRoot; + wxBoxSizer* bSizer42; + wxStaticBitmap* m_bitmapStatus; + wxStaticText* m_staticTextPhase; + wxAnimationCtrl* m_animCtrlSyncing; + wxStaticLine* m_staticlineHeader; + wxPanel* m_panelProgress; + wxStaticText* m_staticTextStatus; + wxBoxSizer* bSizer171; + wxStaticText* m_staticTextLabelItemsProc; + wxBoxSizer* bSizerItemsProc; + wxStaticText* m_staticTextProcessedObj; + wxStaticText* m_staticTextDataProcessed; + wxStaticText* m_staticTextLabelItemsRem; + wxBoxSizer* bSizerItemsRem; + wxStaticText* m_staticTextRemainingObj; + wxStaticText* m_staticTextDataRemaining; + wxStaticText* m_staticText84; + wxStaticText* m_staticTextSpeed; + wxStaticText* m_staticTextLabelRemTime; + wxStaticText* m_staticTextRemTime; + wxStaticText* m_staticTextLabelElapsedTime; + wxStaticText* m_staticTextTimeElapsed; + zen::Graph2D* m_panelGraph; + wxNotebook* m_notebookResult; + wxStaticLine* m_staticlineFooter; + wxBoxSizer* bSizerStdButtons; + wxBoxSizer* bSizerExecFinished; + wxStaticText* m_staticText87; + ExecFinishedBox* m_comboBoxExecFinished; + wxButton* m_buttonClose; + wxButton* m_buttonPause; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnIconize( wxIconizeEvent& event ) { event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnPause( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + wxGauge* m_gauge1; + + SyncProgressDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL ); + + ~SyncProgressDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// -/// Class BatchDlgGenerated +/// Class LogPanelGenerated /////////////////////////////////////////////////////////////////////////////// -class BatchDlgGenerated : public wxDialog +class LogPanelGenerated : public wxPanel { -private: - -protected: - wxStaticBitmap* m_bitmapBatchJob; - wxStaticText* m_staticTextHeader; - wxStaticText* m_staticText44; - wxBitmapButton* m_bpButtonHelp; - wxStaticLine* m_staticline18; - wxPanel* m_panel35; - wxStaticText* m_staticText82; - wxToggleButton* m_toggleBtnErrorIgnore; - wxToggleButton* m_toggleBtnErrorPopup; - wxToggleButton* m_toggleBtnErrorExit; - wxStaticLine* m_staticline26; - wxStaticText* m_staticText81; - ExecFinishedBox* m_comboBoxExecFinished; - wxStaticLine* m_staticline25; - wxCheckBox* m_checkBoxShowProgress; - wxCheckBox* m_checkBoxGenerateLogfile; - wxPanel* m_panelLogfile; - wxButton* m_buttonSelectLogfileDir; - wxCheckBox* m_checkBoxLogfilesLimit; - wxSpinCtrl* m_spinCtrlLogfileLimit; - wxStaticLine* m_staticline13; - wxButton* m_buttonSave; - wxButton* m_button6; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); } - virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); } - virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); } - virtual void OnErrorExit( wxCommandEvent& event ) { event.Skip(); } - virtual void OnToggleGenerateLogfile( wxCommandEvent& event ) { event.Skip(); } - virtual void OnToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - FolderHistoryBox* m_logfileDir; - - BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Save as batch job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); - ~BatchDlgGenerated(); - + private: + + protected: + ToggleButton* m_bpButtonErrors; + ToggleButton* m_bpButtonWarnings; + ToggleButton* m_bpButtonInfo; + wxStaticLine* m_staticline13; + zen::Grid* m_gridMessages; + + // Virtual event handlers, overide them in your derived class + virtual void OnErrors( wxCommandEvent& event ) { event.Skip(); } + virtual void OnWarnings( wxCommandEvent& event ) { event.Skip(); } + virtual void OnInfo( wxCommandEvent& event ) { event.Skip(); } + + + public: + + LogPanelGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL ); + ~LogPanelGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class CmpCfgDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class CmpCfgDlgGenerated : public wxDialog +class CmpCfgDlgGenerated : public wxDialog { -private: - -protected: - wxPanel* m_panel36; - wxStaticText* m_staticText91; - wxStaticBitmap* m_bitmapByTime; - wxToggleButton* m_toggleBtnTimeSize; - wxStaticBitmap* m_bitmapByContent; - wxToggleButton* m_toggleBtnContent; - wxStaticLine* m_staticline33; - wxStaticText* m_staticText92; - wxChoice* m_choiceHandleSymlinks; - wxBitmapButton* m_bpButtonHelp; - wxStaticLine* m_staticline14; - wxButton* m_buttonOkay; - wxButton* m_button6; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); } - virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnContent( wxCommandEvent& event ) { event.Skip(); } - virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } - virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Comparison settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~CmpCfgDlgGenerated(); - + private: + + protected: + wxPanel* m_panel36; + wxStaticText* m_staticText91; + wxStaticBitmap* m_bitmapByTime; + wxToggleButton* m_toggleBtnTimeSize; + wxStaticBitmap* m_bitmapByContent; + wxToggleButton* m_toggleBtnContent; + wxStaticLine* m_staticline33; + wxStaticText* m_staticText92; + wxChoice* m_choiceHandleSymlinks; + wxBitmapButton* m_bpButtonHelp; + wxStaticLine* m_staticline14; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); } + virtual void OnContentDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnContent( wxCommandEvent& event ) { event.Skip(); } + virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); } + virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + CmpCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Comparison settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~CmpCfgDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SyncCfgDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncCfgDlgGenerated : public wxDialog +class SyncCfgDlgGenerated : public wxDialog { -private: - -protected: - wxPanel* m_panel37; - wxStaticText* m_staticText86; - wxToggleButton* m_toggleBtnAutomatic; - wxStaticText* m_staticTextAutomatic; - wxToggleButton* m_toggleBtnMirror; - wxStaticText* m_staticTextMirror; - wxToggleButton* m_toggleBtnUpdate; - wxStaticText* m_staticTextUpdate; - wxToggleButton* m_toggleBtnCustom; - wxStaticText* m_staticTextCustom; - wxBoxSizer* bSizerExtraConfig; - wxStaticLine* m_staticline321; - wxBoxSizer* bSizer179; - wxStaticText* m_staticText88; - wxToggleButton* m_toggleBtnErrorIgnore; - wxToggleButton* m_toggleBtnErrorPopup; - wxStaticLine* m_staticline36; - wxBoxSizer* bSizerOnCompletion; - wxStaticText* m_staticText89; - ExecFinishedBox* m_comboBoxExecFinished; - wxStaticLine* m_staticline32; - wxStaticText* m_staticText87; - wxBoxSizer* bSizerVersioningNamingConvention; - wxStaticText* m_staticTextNamingCvtPart1; - wxStaticText* m_staticTextNamingCvtPart2Bold; - wxStaticText* m_staticTextNamingCvtPart3; - wxToggleButton* m_toggleBtnPermanent; - wxToggleButton* m_toggleBtnRecycler; - wxToggleButton* m_toggleBtnVersioning; - wxBoxSizer* bSizerVersioningStyle; - wxStaticText* m_staticText93; - wxChoice* m_choiceVersioningStyle; - wxPanel* m_panelVersioning; - FolderHistoryBox* m_versioningFolder; - wxButton* m_buttonSelectDirVersioning; - wxStaticLine* m_staticline31; - wxBoxSizer* bSizerConfig; - wxStaticText* m_staticTextHeaderCategory1; - wxStaticText* m_staticTextHeaderAction1; - wxStaticBitmap* m_bitmapDatabase; - wxBoxSizer* sbSizerSyncDirections; - wxBoxSizer* bSizerLeftOnly; - wxStaticBitmap* m_bitmapLeftOnly; - wxBitmapButton* m_bpButtonLeftOnly; - wxBoxSizer* bSizerRightOnly; - wxStaticBitmap* m_bitmapRightOnly; - wxBitmapButton* m_bpButtonRightOnly; - wxBoxSizer* bSizerLeftNewer; - wxStaticBitmap* m_bitmapLeftNewer; - wxBitmapButton* m_bpButtonLeftNewer; - wxBoxSizer* bSizerRightNewer; - wxStaticBitmap* m_bitmapRightNewer; - wxBitmapButton* m_bpButtonRightNewer; - wxBoxSizer* bSizerDifferent; - wxStaticBitmap* m_bitmapDifferent; - wxBitmapButton* m_bpButtonDifferent; - wxBoxSizer* bSizerConflict; - wxStaticBitmap* m_bitmapConflict; - wxBitmapButton* m_bpButtonConflict; - wxStaticLine* m_staticline15; - wxButton* m_buttonOK; - wxButton* m_button16; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnSyncAutomaticDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncAutomatic( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); } - virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); } - virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); } - virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); } - virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDeletionPermanent( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDeletionRecycler( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDeletionVersioning( wxCommandEvent& event ) { event.Skip(); } - virtual void OnParameterChange( wxCommandEvent& event ) { event.Skip(); } - virtual void OnExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); } - virtual void OnExRightSideOnly( wxCommandEvent& event ) { event.Skip(); } - virtual void OnLeftNewer( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRightNewer( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDifferent( wxCommandEvent& event ) { event.Skip(); } - virtual void OnConflict( wxCommandEvent& event ) { event.Skip(); } - virtual void OnApply( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - wxBoxSizer* bSizerNamingConvention; - - SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~SyncCfgDlgGenerated(); - + private: + + protected: + wxPanel* m_panel37; + wxStaticText* m_staticText86; + wxToggleButton* m_toggleBtnTwoWay; + wxStaticText* m_staticTextAutomatic; + wxToggleButton* m_toggleBtnMirror; + wxStaticText* m_staticTextMirror; + wxToggleButton* m_toggleBtnUpdate; + wxStaticText* m_staticTextUpdate; + wxToggleButton* m_toggleBtnCustom; + wxStaticText* m_staticTextCustom; + wxBoxSizer* bSizerExtraConfig; + wxStaticLine* m_staticline321; + wxBoxSizer* bSizer179; + wxStaticText* m_staticText88; + wxToggleButton* m_toggleBtnErrorIgnore; + wxToggleButton* m_toggleBtnErrorPopup; + wxStaticLine* m_staticline36; + wxBoxSizer* bSizerOnCompletion; + wxStaticText* m_staticText89; + ExecFinishedBox* m_comboBoxExecFinished; + wxStaticLine* m_staticline32; + wxStaticText* m_staticText87; + wxBoxSizer* bSizerVersioningNamingConvention; + wxStaticText* m_staticTextNamingCvtPart1; + wxStaticText* m_staticTextNamingCvtPart2Bold; + wxStaticText* m_staticTextNamingCvtPart3; + wxToggleButton* m_toggleBtnPermanent; + wxToggleButton* m_toggleBtnRecycler; + wxToggleButton* m_toggleBtnVersioning; + wxBoxSizer* bSizerVersioningStyle; + wxStaticText* m_staticText93; + wxChoice* m_choiceVersioningStyle; + wxPanel* m_panelVersioning; + FolderHistoryBox* m_versioningFolder; + wxButton* m_buttonSelectDirVersioning; + wxStaticLine* m_staticline31; + wxBoxSizer* bSizerConfig; + wxStaticText* m_staticTextHeaderCategory1; + wxStaticText* m_staticTextHeaderAction1; + wxStaticBitmap* m_bitmapDatabase; + wxBoxSizer* sbSizerSyncDirections; + wxBoxSizer* bSizerLeftOnly; + wxStaticBitmap* m_bitmapLeftOnly; + wxBitmapButton* m_bpButtonLeftOnly; + wxBoxSizer* bSizerRightOnly; + wxStaticBitmap* m_bitmapRightOnly; + wxBitmapButton* m_bpButtonRightOnly; + wxBoxSizer* bSizerLeftNewer; + wxStaticBitmap* m_bitmapLeftNewer; + wxBitmapButton* m_bpButtonLeftNewer; + wxBoxSizer* bSizerRightNewer; + wxStaticBitmap* m_bitmapRightNewer; + wxBitmapButton* m_bpButtonRightNewer; + wxBoxSizer* bSizerDifferent; + wxStaticBitmap* m_bitmapDifferent; + wxBitmapButton* m_bpButtonDifferent; + wxBoxSizer* bSizerConflict; + wxStaticBitmap* m_bitmapConflict; + wxBitmapButton* m_bpButtonConflict; + wxStaticLine* m_staticline15; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonOK; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnSyncTwoWayDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnSyncTwoWay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); } + virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDeletionPermanent( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDeletionRecycler( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDeletionVersioning( wxCommandEvent& event ) { event.Skip(); } + virtual void OnParameterChange( wxCommandEvent& event ) { event.Skip(); } + virtual void OnExLeftSideOnly( wxCommandEvent& event ) { event.Skip(); } + virtual void OnExRightSideOnly( wxCommandEvent& event ) { event.Skip(); } + virtual void OnLeftNewer( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRightNewer( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDifferent( wxCommandEvent& event ) { event.Skip(); } + virtual void OnConflict( wxCommandEvent& event ) { event.Skip(); } + virtual void OnApply( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + wxBoxSizer* bSizerNamingConvention; + + SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~SyncCfgDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// -/// Class LogControlGenerated +/// Class BatchDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class LogControlGenerated : public wxPanel +class BatchDlgGenerated : public wxDialog { -private: - -protected: - wxStaticLine* m_staticline12; - ToggleButton* m_bpButtonErrors; - ToggleButton* m_bpButtonWarnings; - ToggleButton* m_bpButtonInfo; - wxStaticLine* m_staticline13; - zen::Grid* m_gridMessages; - - // Virtual event handlers, overide them in your derived class - virtual void OnErrors( wxCommandEvent& event ) { event.Skip(); } - virtual void OnWarnings( wxCommandEvent& event ) { event.Skip(); } - virtual void OnInfo( wxCommandEvent& event ) { event.Skip(); } - - -public: - - LogControlGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL ); - ~LogControlGenerated(); - + private: + + protected: + wxStaticBitmap* m_bitmapBatchJob; + wxStaticText* m_staticTextHeader; + wxStaticText* m_staticText44; + wxBitmapButton* m_bpButtonHelp; + wxStaticLine* m_staticline18; + wxPanel* m_panel35; + wxStaticText* m_staticText82; + wxToggleButton* m_toggleBtnErrorIgnore; + wxToggleButton* m_toggleBtnErrorPopup; + wxToggleButton* m_toggleBtnErrorExit; + wxStaticLine* m_staticline26; + wxStaticText* m_staticText81; + ExecFinishedBox* m_comboBoxExecFinished; + wxStaticLine* m_staticline25; + wxCheckBox* m_checkBoxShowProgress; + wxCheckBox* m_checkBoxGenerateLogfile; + wxPanel* m_panelLogfile; + wxButton* m_buttonSelectLogfileDir; + wxCheckBox* m_checkBoxLogfilesLimit; + wxSpinCtrl* m_spinCtrlLogfileLimit; + wxStaticLine* m_staticline13; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonSaveAs; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorPopup( wxCommandEvent& event ) { event.Skip(); } + virtual void OnErrorExit( wxCommandEvent& event ) { event.Skip(); } + virtual void OnToggleGenerateLogfile( wxCommandEvent& event ) { event.Skip(); } + virtual void OnToggleLogfilesLimit( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + FolderHistoryBox* m_logfileDir; + + BatchDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Save as batch job"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); + ~BatchDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class AboutDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class AboutDlgGenerated : public wxDialog +class AboutDlgGenerated : public wxDialog { -private: - -protected: - wxPanel* m_panel41; - wxStaticBitmap* m_bitmapLogo; - wxStaticLine* m_staticline341; - wxStaticText* m_build; - wxStaticLine* m_staticline3411; - wxStaticText* m_staticText72; - wxHyperlinkCtrl* m_hyperlink11; - wxHyperlinkCtrl* m_hyperlink9; - wxHyperlinkCtrl* m_hyperlink10; - wxHyperlinkCtrl* m_hyperlink7; - wxHyperlinkCtrl* m_hyperlink14; - wxHyperlinkCtrl* m_hyperlink15; - wxHyperlinkCtrl* m_hyperlink13; - wxHyperlinkCtrl* m_hyperlink16; - wxHyperlinkCtrl* m_hyperlink12; - wxHyperlinkCtrl* m_hyperlink18; - wxPanel* m_panel40; - wxPanel* m_panel39; - wxStaticText* m_staticText83; - wxButton* m_buttonDonate; - wxAnimationCtrl* m_animCtrlWink; - wxScrolledWindow* m_scrolledWindowTranslators; - wxBoxSizer* bSizerTranslators; - wxStaticText* m_staticText54; - wxFlexGridSizer* fgSizerTranslators; - wxStaticLine* m_staticline43; - wxStaticText* m_staticText94; - wxHyperlinkCtrl* m_hyperlink1; - wxStaticBitmap* m_bitmap9; - wxHyperlinkCtrl* m_hyperlink2; - wxStaticBitmap* m_bitmap10; - wxStaticLine* m_staticline34; - wxStaticText* m_staticText93; - wxStaticBitmap* m_bitmap13; - wxHyperlinkCtrl* m_hyperlink5; - wxStaticLine* m_staticline36; - wxButton* m_buttonClose; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnDonate( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } - - -public: - - AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~AboutDlgGenerated(); - + private: + + protected: + wxPanel* m_panel41; + wxStaticBitmap* m_bitmapLogo; + wxStaticLine* m_staticline341; + wxStaticText* m_build; + wxStaticLine* m_staticline3411; + wxStaticText* m_staticText72; + wxHyperlinkCtrl* m_hyperlink11; + wxHyperlinkCtrl* m_hyperlink9; + wxHyperlinkCtrl* m_hyperlink10; + wxHyperlinkCtrl* m_hyperlink7; + wxHyperlinkCtrl* m_hyperlink14; + wxHyperlinkCtrl* m_hyperlink15; + wxHyperlinkCtrl* m_hyperlink13; + wxHyperlinkCtrl* m_hyperlink16; + wxHyperlinkCtrl* m_hyperlink12; + wxHyperlinkCtrl* m_hyperlink18; + wxPanel* m_panel40; + wxPanel* m_panel39; + wxStaticText* m_staticText83; + wxButton* m_buttonDonate; + wxAnimationCtrl* m_animCtrlWink; + wxScrolledWindow* m_scrolledWindowTranslators; + wxBoxSizer* bSizerTranslators; + wxStaticText* m_staticText54; + wxFlexGridSizer* fgSizerTranslators; + wxStaticLine* m_staticline43; + wxStaticText* m_staticText94; + wxHyperlinkCtrl* m_hyperlink1; + wxStaticBitmap* m_bitmap9; + wxHyperlinkCtrl* m_hyperlink2; + wxStaticBitmap* m_bitmap10; + wxStaticLine* m_staticline34; + wxStaticText* m_staticText93; + wxStaticBitmap* m_bitmap13; + wxHyperlinkCtrl* m_hyperlink5; + wxStaticLine* m_staticline36; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonClose; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnDonate( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } + + + public: + + AboutDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("About"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~AboutDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class MessageDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class MessageDlgGenerated : public wxDialog +class MessageDlgGenerated : public wxDialog { -private: - -protected: - wxPanel* m_panel33; - wxStaticBitmap* m_bitmapMsgType; - wxTextCtrl* m_textCtrlMessage; - wxStaticLine* m_staticline6; - wxCheckBox* m_checkBoxCustom; - wxButton* m_buttonCustom1; - wxButton* m_buttonCustom2; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnCheckBoxClick( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButton1( wxCommandEvent& event ) { event.Skip(); } - virtual void OnButton2( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - MessageDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); - ~MessageDlgGenerated(); - + private: + + protected: + wxPanel* m_panel33; + wxStaticBitmap* m_bitmapMsgType; + wxTextCtrl* m_textCtrlMessage; + wxStaticLine* m_staticline6; + wxCheckBox* m_checkBoxCustom; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonAffirmative; + wxButton* m_buttonNegative; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnCheckBoxClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnButtonAffirmative( wxCommandEvent& event ) { event.Skip(); } + virtual void OnButtonNegative( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + MessageDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("dummy"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); + ~MessageDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class DeleteDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class DeleteDlgGenerated : public wxDialog +class DeleteDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmapDeleteType; - wxStaticText* m_staticTextHeader; - wxStaticLine* m_staticline91; - wxTextCtrl* m_textCtrlFileList; - wxStaticLine* m_staticline9; - wxCheckBox* m_checkBoxUseRecycler; - wxCheckBox* m_checkBoxDeleteBothSides; - wxButton* m_buttonOK; - wxButton* m_buttonCancel; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDelOnBothSides( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); - ~DeleteDlgGenerated(); - + private: + + protected: + wxPanel* m_panel31; + wxStaticBitmap* m_bitmapDeleteType; + wxStaticText* m_staticTextHeader; + wxTextCtrl* m_textCtrlFileList; + wxStaticLine* m_staticline9; + wxBoxSizer* bSizerStdButtons; + wxCheckBox* m_checkBoxUseRecycler; + wxCheckBox* m_checkBoxDeleteBothSides; + wxButton* m_buttonOK; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnUseRecycler( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDelOnBothSides( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOK( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Delete"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); + ~DeleteDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class FilterDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class FilterDlgGenerated : public wxDialog +class FilterDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmap26; - wxStaticText* m_staticTextHeader; - wxStaticText* m_staticText44; - wxBitmapButton* m_bpButtonHelp; - wxStaticLine* m_staticline17; - wxPanel* m_panel38; - wxStaticText* m_staticText78; - wxStaticBitmap* m_bitmapInclude; - wxTextCtrl* m_textCtrlInclude; - wxStaticLine* m_staticline22; - wxStaticText* m_staticText77; - wxStaticBitmap* m_bitmapExclude; - wxTextCtrl* m_textCtrlExclude; - wxStaticLine* m_staticline24; - wxStaticText* m_staticText79; - wxStaticBitmap* m_bitmapFilterDate; - wxSpinCtrl* m_spinCtrlTimespan; - wxChoice* m_choiceUnitTimespan; - wxStaticLine* m_staticline23; - wxStaticText* m_staticText80; - wxStaticBitmap* m_bitmapFilterSize; - wxStaticText* m_staticText101; - wxSpinCtrl* m_spinCtrlMinSize; - wxChoice* m_choiceUnitMinSize; - wxStaticText* m_staticText102; - wxSpinCtrl* m_spinCtrlMaxSize; - wxChoice* m_choiceUnitMaxSize; - wxStaticLine* m_staticline16; - wxButton* m_buttonClear; - wxButton* m_buttonOk; - wxButton* m_button17; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); } - virtual void OnUpdateNameFilter( wxCommandEvent& event ) { event.Skip(); } - virtual void OnUpdateChoice( wxCommandEvent& event ) { event.Skip(); } - virtual void OnClear( wxCommandEvent& event ) { event.Skip(); } - virtual void OnApply( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Configure filter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); - ~FilterDlgGenerated(); - + private: + + protected: + wxStaticBitmap* m_bitmap26; + wxStaticText* m_staticTextHeader; + wxStaticText* m_staticText44; + wxBitmapButton* m_bpButtonHelp; + wxStaticLine* m_staticline17; + wxPanel* m_panel38; + wxStaticText* m_staticText78; + wxStaticBitmap* m_bitmapInclude; + wxTextCtrl* m_textCtrlInclude; + wxStaticLine* m_staticline22; + wxStaticText* m_staticText77; + wxStaticBitmap* m_bitmapExclude; + wxTextCtrl* m_textCtrlExclude; + wxStaticLine* m_staticline24; + wxStaticText* m_staticText79; + wxStaticBitmap* m_bitmapFilterDate; + wxSpinCtrl* m_spinCtrlTimespan; + wxChoice* m_choiceUnitTimespan; + wxStaticLine* m_staticline23; + wxStaticText* m_staticText80; + wxStaticBitmap* m_bitmapFilterSize; + wxStaticText* m_staticText101; + wxSpinCtrl* m_spinCtrlMinSize; + wxChoice* m_choiceUnitMinSize; + wxStaticText* m_staticText102; + wxSpinCtrl* m_spinCtrlMaxSize; + wxChoice* m_choiceUnitMaxSize; + wxStaticLine* m_staticline16; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonClear; + wxButton* m_buttonOk; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnHelp( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUpdateNameFilter( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUpdateChoice( wxCommandEvent& event ) { event.Skip(); } + virtual void OnClear( wxCommandEvent& event ) { event.Skip(); } + virtual void OnApply( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + FilterDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Configure filter"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER ); + ~FilterDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class GlobalSettingsDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class GlobalSettingsDlgGenerated : public wxDialog +class GlobalSettingsDlgGenerated : public wxDialog { -private: - -protected: - wxStaticBitmap* m_bitmapSettings; - wxStaticText* m_staticTextHeader; - wxStaticLine* m_staticline19; - wxPanel* m_panel39; - wxCheckBox* m_checkBoxTransCopy; - wxStaticText* m_staticText82; - wxCheckBox* m_checkBoxCopyLocked; - wxStaticText* m_staticTextCopyLocked; - wxCheckBox* m_checkBoxCopyPermissions; - wxStaticText* m_staticText8211; - wxStaticLine* m_staticline191; - zen::BitmapButton* m_buttonResetDialogs; - wxStaticLine* m_staticline192; - wxStaticText* m_staticText85; - wxBitmapButton* m_bpButtonAddRow; - wxBitmapButton* m_bpButtonRemoveRow; - wxGrid* m_gridCustomCommand; - wxStaticLine* m_staticline20; - wxButton* m_button9; - wxButton* m_buttonOkay; - wxButton* m_button29; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); } - virtual void OnAddRow( wxCommandEvent& event ) { event.Skip(); } - virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); } - virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); - ~GlobalSettingsDlgGenerated(); - + private: + + protected: + wxStaticBitmap* m_bitmapSettings; + wxStaticText* m_staticTextHeader; + wxStaticLine* m_staticline19; + wxPanel* m_panel39; + wxCheckBox* m_checkBoxTransCopy; + wxStaticText* m_staticText82; + wxCheckBox* m_checkBoxCopyLocked; + wxStaticText* m_staticTextCopyLocked; + wxCheckBox* m_checkBoxCopyPermissions; + wxStaticText* m_staticText8211; + wxStaticLine* m_staticline191; + zen::BitmapButton* m_buttonResetDialogs; + wxStaticLine* m_staticline192; + wxStaticText* m_staticText85; + wxBitmapButton* m_bpButtonAddRow; + wxBitmapButton* m_bpButtonRemoveRow; + wxGrid* m_gridCustomCommand; + wxStaticLine* m_staticline20; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonDefault; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnResetDialogs( wxCommandEvent& event ) { event.Skip(); } + virtual void OnAddRow( wxCommandEvent& event ) { event.Skip(); } + virtual void OnRemoveRow( wxCommandEvent& event ) { event.Skip(); } + virtual void OnDefault( wxCommandEvent& event ) { event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Global settings"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); + ~GlobalSettingsDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// -/// Class SyncPreviewDlgGenerated +/// Class SyncConfirmationDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SyncPreviewDlgGenerated : public wxDialog +class SyncConfirmationDlgGenerated : public wxDialog { -private: - -protected: - zen::BitmapButton* m_buttonStartSync; - wxStaticLine* m_staticline16; - wxStaticText* m_staticText84; - wxStaticText* m_staticTextVariant; - wxStaticLine* m_staticline14; - wxPanel* m_panelStatistics; - wxStaticText* m_staticText83; - wxStaticBitmap* m_bitmapCreateLeft; - wxStaticBitmap* m_bitmapUpdateLeft; - wxStaticBitmap* m_bitmapDeleteLeft; - wxStaticBitmap* m_bitmapData; - wxStaticBitmap* m_bitmapDeleteRight; - wxStaticBitmap* m_bitmapUpdateRight; - wxStaticBitmap* m_bitmapCreateRight; - wxStaticText* m_staticTextCreateLeft; - wxStaticText* m_staticTextUpdateLeft; - wxStaticText* m_staticTextDeleteLeft; - wxStaticText* m_staticTextData; - wxStaticText* m_staticTextDeleteRight; - wxStaticText* m_staticTextUpdateRight; - wxStaticText* m_staticTextCreateRight; - wxStaticLine* m_staticline12; - wxCheckBox* m_checkBoxDontShowAgain; - wxButton* m_button16; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - SyncPreviewDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~SyncPreviewDlgGenerated(); - + private: + + protected: + wxPanel* m_panelStatistics; + wxStaticBitmap* m_bitmapSync; + wxStaticLine* m_staticline39; + wxStaticText* m_staticText84; + wxStaticText* m_staticTextVariant; + wxStaticLine* m_staticline14; + wxStaticText* m_staticText83; + wxStaticBitmap* m_bitmapCreateLeft; + wxStaticBitmap* m_bitmapUpdateLeft; + wxStaticBitmap* m_bitmapDeleteLeft; + wxStaticBitmap* m_bitmapData; + wxStaticBitmap* m_bitmapDeleteRight; + wxStaticBitmap* m_bitmapUpdateRight; + wxStaticBitmap* m_bitmapCreateRight; + wxStaticText* m_staticTextCreateLeft; + wxStaticText* m_staticTextUpdateLeft; + wxStaticText* m_staticTextDeleteLeft; + wxStaticText* m_staticTextData; + wxStaticText* m_staticTextDeleteRight; + wxStaticText* m_staticTextUpdateRight; + wxStaticText* m_staticTextCreateRight; + wxStaticLine* m_staticline12; + wxCheckBox* m_checkBoxDontShowAgain; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonStartSync; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + SyncConfirmationDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Start synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~SyncConfirmationDlgGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class PopupDialogGenerated /////////////////////////////////////////////////////////////////////////////// -class PopupDialogGenerated : public wxDialog +class PopupDialogGenerated : public wxDialog { -private: - -protected: - -public: - wxStaticBitmap* m_bitmapLeft; - wxStaticText* m_staticTextMain; - - PopupDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~PopupDialogGenerated(); - + private: + + protected: + + public: + wxStaticBitmap* m_bitmapLeft; + wxStaticText* m_staticTextMain; + + PopupDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~PopupDialogGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SearchDialogGenerated /////////////////////////////////////////////////////////////////////////////// -class SearchDialogGenerated : public wxDialog +class SearchDialogGenerated : public wxDialog { -private: - -protected: - wxStaticText* m_staticText101; - wxTextCtrl* m_textCtrlSearchTxt; - wxCheckBox* m_checkBoxMatchCase; - wxButton* m_buttonFindNext; - wxButton* m_button29; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnText( wxCommandEvent& event ) { event.Skip(); } - virtual void OnFindNext( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - SearchDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Find"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~SearchDialogGenerated(); - + private: + + protected: + wxStaticText* m_staticText101; + wxTextCtrl* m_textCtrlSearchTxt; + wxCheckBox* m_checkBoxMatchCase; + wxButton* m_buttonFindNext; + wxButton* m_button29; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnText( wxCommandEvent& event ) { event.Skip(); } + virtual void OnFindNext( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + SearchDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Find"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~SearchDialogGenerated(); + }; /////////////////////////////////////////////////////////////////////////////// /// Class SelectTimespanDlgGenerated /////////////////////////////////////////////////////////////////////////////// -class SelectTimespanDlgGenerated : public wxDialog +class SelectTimespanDlgGenerated : public wxDialog { -private: - -protected: - wxPanel* m_panel35; - wxCalendarCtrl* m_calendarFrom; - wxCalendarCtrl* m_calendarTo; - wxStaticLine* m_staticline21; - wxButton* m_buttonOkay; - wxButton* m_button29; - - // Virtual event handlers, overide them in your derived class - virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } - virtual void OnChangeSelectionFrom( wxCalendarEvent& event ) { event.Skip(); } - virtual void OnChangeSelectionTo( wxCalendarEvent& event ) { event.Skip(); } - virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } - virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } - - -public: - - SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select time span"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); - ~SelectTimespanDlgGenerated(); - + private: + + protected: + wxPanel* m_panel35; + wxCalendarCtrl* m_calendarFrom; + wxCalendarCtrl* m_calendarTo; + wxStaticLine* m_staticline21; + wxBoxSizer* bSizerStdButtons; + wxButton* m_buttonOkay; + wxButton* m_buttonCancel; + + // Virtual event handlers, overide them in your derived class + virtual void OnClose( wxCloseEvent& event ) { event.Skip(); } + virtual void OnChangeSelectionFrom( wxCalendarEvent& event ) { event.Skip(); } + virtual void OnChangeSelectionTo( wxCalendarEvent& event ) { event.Skip(); } + virtual void OnOkay( wxCommandEvent& event ) { event.Skip(); } + virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); } + + + public: + + SelectTimespanDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Select time span"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE ); + ~SelectTimespanDlgGenerated(); + }; #endif //__GUI_GENERATED_H__ diff --git a/ui/gui_status_handler.cpp b/ui/gui_status_handler.cpp index c740bd09..db92c24c 100644 --- a/ui/gui_status_handler.cpp +++ b/ui/gui_status_handler.cpp @@ -194,26 +194,26 @@ SyncStatusHandler::~SyncStatusHandler() std::wstring finalStatus; if (abortIsRequested()) { - finalStatus = _("Synchronization aborted!"); + finalStatus = _("Synchronization aborted"); errorLog.logMsg(finalStatus, TYPE_ERROR); } else if (totalErrors > 0) { - finalStatus = _("Synchronization completed with errors!"); + finalStatus = _("Synchronization completed with errors"); errorLog.logMsg(finalStatus, TYPE_ERROR); } else if (totalWarnings > 0) { - finalStatus = _("Synchronization completed with warnings."); + finalStatus = _("Synchronization completed with warnings"); errorLog.logMsg(finalStatus, TYPE_WARNING); //give status code same warning priority as display category! } else { if (getObjectsTotal(PHASE_SYNCHRONIZING) == 0 && //we're past "initNewPhase(PHASE_SYNCHRONIZING)" at this point! getDataTotal (PHASE_SYNCHRONIZING) == 0) - finalStatus = _("Nothing to synchronize!"); //even if "ignored conflicts" occurred! + finalStatus = _("Nothing to synchronize"); //even if "ignored conflicts" occurred! else - finalStatus = _("Synchronization completed successfully."); + finalStatus = _("Synchronization completed successfully"); errorLog.logMsg(finalStatus, TYPE_INFO); } @@ -267,8 +267,8 @@ SyncStatusHandler::~SyncStatusHandler() //-> nicely manages dialog lifetime while (progressDlg) { + updateUiNow(); //*first* refresh GUI (removing flicker) before sleeping! boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL)); - updateUiNow(); } } } @@ -301,7 +301,8 @@ void SyncStatusHandler::reportInfo(const std::wstring& text) ProcessCallback::Response SyncStatusHandler::reportError(const std::wstring& errorMessage) { - errorLog.logMsg(errorMessage, TYPE_ERROR); //always, even for "retry" + //always, except for "retry": + zen::ScopeGuard guardWriteLog = zen::makeGuard([&] { errorLog.logMsg(errorMessage, TYPE_ERROR); }); switch (handleError_) { @@ -323,6 +324,8 @@ ProcessCallback::Response SyncStatusHandler::reportError(const std::wstring& err return ProcessCallback::IGNORE_ERROR; case ReturnErrorDlg::BUTTON_RETRY: + guardWriteLog.dismiss(); + errorLog.logMsg(_("Retrying operation after error:") + L" " + errorMessage, TYPE_INFO); //explain why there are duplicate "doing operation X" info messages in the log! return ProcessCallback::RETRY; case ReturnErrorDlg::BUTTON_CANCEL: diff --git a/ui/main_dlg.cpp b/ui/main_dlg.cpp index bb1e0c86..ead99c6a 100644 --- a/ui/main_dlg.cpp +++ b/ui/main_dlg.cpp @@ -132,11 +132,11 @@ private: /|\ | template<> - FolderPairCallback FolderPairGenerated + FolderPairCallback FolderPairPanelGenerated /|\ /|\ _________|________ ________| | | | - DirectoryPairFirst DirectoryPair + FolderPairFirst FolderPairPanel */ template @@ -144,7 +144,7 @@ class FolderPairCallback : public FolderPairPanelBasic //implements ca { public: FolderPairCallback(GuiPanel& basicPanel, MainDialog& mainDialog) : - FolderPairPanelBasic(basicPanel), //pass FolderPairGenerated part... + FolderPairPanelBasic(basicPanel), //pass FolderPairPanelGenerated part... mainDlg(mainDialog) {} private: @@ -160,14 +160,14 @@ private: }; -class DirectoryPair : - public FolderPairGenerated, //DirectoryPair "owns" FolderPairGenerated! - public FolderPairCallback +class FolderPairPanel : + public FolderPairPanelGenerated, //FolderPairPanel "owns" FolderPairPanelGenerated! + public FolderPairCallback { public: - DirectoryPair(wxWindow* parent, MainDialog& mainDialog) : - FolderPairGenerated(parent), - FolderPairCallback(static_cast(*this), mainDialog), //pass FolderPairGenerated part... + FolderPairPanel(wxWindow* parent, MainDialog& mainDialog) : + FolderPairPanelGenerated(parent), + FolderPairCallback(static_cast(*this), mainDialog), //pass FolderPairPanelGenerated part... dirNameLeft (*m_panelLeft, *m_buttonSelectDirLeft, *m_directoryLeft), dirNameRight(*m_panelRight, *m_buttonSelectDirRight, *m_directoryRight) { @@ -198,10 +198,10 @@ private: }; -class DirectoryPairFirst : public FolderPairCallback +class FolderPairFirst : public FolderPairCallback { public: - DirectoryPairFirst(MainDialog& mainDialog) : + FolderPairFirst(MainDialog& mainDialog) : FolderPairCallback(mainDialog, mainDialog), //prepare drag & drop @@ -245,7 +245,7 @@ private: }; -#ifdef FFS_WIN +#ifdef ZEN_WIN class PanelMoveWindow : public MouseMoveWindow { public: @@ -480,10 +480,10 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, wxAuiPaneInfo().Name(L"Panel2").Layer(2).Top().Caption(_("Folder pairs")).CaptionVisible(false).PaneBorder(false).Gripper()); auiMgr.AddPane(m_gridNavi, - wxAuiPaneInfo().Name(L"Panel10").Layer(3).Left().Caption(_("Overview")).MinSize(300, m_gridNavi->GetSize().GetHeight())); //MinSize(): just default size, see comment below + wxAuiPaneInfo().Name(L"Panel10").Layer(3).Left().Position(1).Caption(_("Overview")).MinSize(300, m_gridNavi->GetSize().GetHeight())); //MinSize(): just default size, see comment below auiMgr.AddPane(m_panelConfig, - wxAuiPaneInfo().Name(L"Panel4").Layer(3).Left().Caption(_("Configuration")).MinSize(m_listBoxHistory->GetSize().GetWidth(), m_panelConfig->GetSize().GetHeight())); + wxAuiPaneInfo().Name(L"Panel4").Layer(3).Left().Position(2).Caption(_("Configuration")).MinSize(m_listBoxHistory->GetSize().GetWidth(), m_panelConfig->GetSize().GetHeight())); auiMgr.AddPane(m_panelTopButtons, wxAuiPaneInfo().Name(L"Panel1").Layer(4).Top().Row(1).Caption(_("Main bar")).CaptionVisible(false).PaneBorder(false).Gripper().MinSize(-1, m_panelTopButtons->GetSize().GetHeight())); @@ -561,7 +561,7 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, cleanedUp = false; processingGlobalKeyEvent = false; -#ifdef FFS_WIN +#ifdef ZEN_WIN new PanelMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere... //ownership passed to "this" #endif @@ -571,7 +571,7 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, zen::setMainWindow(this); //init handling of first folder pair - firstFolderPair = make_unique(*this); + firstFolderPair = make_unique(*this); initViewFilterButtons(); @@ -585,8 +585,8 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, //set icons for this dialog m_buttonCompare ->setBitmapFront(getResourceImage(L"compare"), 5); - m_bpButtonSyncConfig->SetBitmapLabel(getResourceImage(L"syncConfig")); - m_bpButtonCmpConfig ->SetBitmapLabel(getResourceImage(L"cmpConfig")); + m_bpButtonSyncConfig->SetBitmapLabel(getResourceImage(L"cfg_sync")); + m_bpButtonCmpConfig ->SetBitmapLabel(getResourceImage(L"cfg_compare")); m_bpButtonOpen ->SetBitmapLabel(getResourceImage(L"load")); m_bpButtonBatchJob ->SetBitmapLabel(getResourceImage(L"batch")); m_bpButtonAddPair ->SetBitmapLabel(getResourceImage(L"item_add")); @@ -610,19 +610,19 @@ MainDialog::MainDialog(const xmlAccess::XmlGuiConfig& guiCfg, std::fill(dummyImg.GetAlpha(), dummyImg.GetAlpha() + dummySize * dummySize, wxIMAGE_ALPHA_TRANSPARENT); //menu icons: workaround for wxWidgets: small hack to update menu items: actually this is a wxWidgets bug (affects Windows- and Linux-build) - setMenuItemImage(m_menuItem10, getResourceImage(L"compareSmall")); - setMenuItemImage(m_menuItem11, getResourceImage(L"syncSmall")); + setMenuItemImage(m_menuItem10, getResourceImage(L"compare_small")); + setMenuItemImage(m_menuItem11, getResourceImage(L"sync_small")); setMenuItemImage(m_menuItemNew, dummyImg); //it's ridiculous, but wxWidgets screws up aligning short-cut label texts if we don't set an image! setMenuItemImage(m_menuItemSaveAs, dummyImg); - setMenuItemImage(m_menuItemLoad, getResourceImage(L"loadSmall")); - setMenuItemImage(m_menuItemSave, getResourceImage(L"saveSmall")); + setMenuItemImage(m_menuItemLoad, getResourceImage(L"load_small")); + setMenuItemImage(m_menuItemSave, getResourceImage(L"save_small")); - setMenuItemImage(m_menuItemGlobSett, getResourceImage(L"settingsSmall")); - setMenuItemImage(m_menuItem7, getResourceImage(L"batchSmall")); + setMenuItemImage(m_menuItemGlobSett, getResourceImage(L"settings_small")); + setMenuItemImage(m_menuItem7, getResourceImage(L"batch_small")); - setMenuItemImage(m_menuItemManual, getResourceImage(L"helpSmall")); - setMenuItemImage(m_menuItemAbout, getResourceImage(L"aboutSmall")); + setMenuItemImage(m_menuItemManual, getResourceImage(L"help_small")); + setMenuItemImage(m_menuItemAbout, getResourceImage(L"about_small")); if (!manualProgramUpdateRequired()) { @@ -771,7 +771,7 @@ MainDialog::~MainDialog() wxTheApp->Disconnect(wxEVT_KEY_DOWN, wxKeyEventHandler(MainDialog::OnGlobalKeyEvent), nullptr, this); wxTheApp->Disconnect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::OnGlobalKeyEvent), nullptr, this); -#ifdef FFS_MAC +#ifdef ZEN_MAC //more (non-portable) wxWidgets crap: wxListBox leaks wxClientData, both of the following functions fail to clean up: // src/common/ctrlsub.cpp:: wxItemContainer::~wxItemContainer() -> empty function body!!! // src/osx/listbox_osx.cpp: wxListBox::~wxListBox() @@ -1026,7 +1026,7 @@ void MainDialog::copySelectionToClipboard(const std::vector& gridRe } catch (const std::bad_alloc& e) { - wxMessageBox(_("Out of memory!") + L" " + utfCvrtTo(e.what()), _("Error"), wxOK | wxICON_ERROR, this); + wxMessageBox(_("Out of memory.") + L" " + utfCvrtTo(e.what()), _("Error"), wxOK | wxICON_ERROR, this); } } @@ -1064,10 +1064,10 @@ std::vector MainDialog::getTreeSelection() const if (auto root = dynamic_cast(node.get())) { //select first level of child elements - std::transform(root->baseMap_.refSubDirs ().begin(), root->baseMap_.refSubDirs ().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; }); - std::transform(root->baseMap_.refSubFiles().begin(), root->baseMap_.refSubFiles().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; }); - std::transform(root->baseMap_.refSubLinks().begin(), root->baseMap_.refSubLinks().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; }); - //for (auto& fsObj : root->baseMap_.refSubLinks()) output.push_back(&fsObj); -> seriously MSVC, stop this disgrace and implement "range for"! + std::transform(root->baseDirObj_.refSubDirs ().begin(), root->baseDirObj_.refSubDirs ().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; }); + std::transform(root->baseDirObj_.refSubFiles().begin(), root->baseDirObj_.refSubFiles().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; }); + std::transform(root->baseDirObj_.refSubLinks().begin(), root->baseDirObj_.refSubLinks().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; }); + //for (auto& fsObj : root->baseDirObj_.refSubLinks()) output.push_back(&fsObj); -> seriously MSVC, stop this disgrace and implement "range for"! } else if (auto dir = dynamic_cast(node.get())) output.push_back(&(dir->dirObj_)); @@ -1203,63 +1203,68 @@ private: void MainDialog::deleteSelectedFiles(const std::vector& selectionLeft, const std::vector& selectionRight) { - if (!selectionLeft.empty() || !selectionRight.empty()) - { - wxBusyCursor dummy; //show hourglass cursor + bool deleteOnBothSides = false; //let's keep this disabled by default -> don't save + //=> clenup empty selection on either side: + std::vector selectionLeftTmp; + std::vector selectionRightTmp; + std::copy_if(selectionLeft .begin(), selectionLeft .end(), std::back_inserter(selectionLeftTmp ), [](const FileSystemObject* fsObj) { return !fsObj->isEmpty(); }); + std::copy_if(selectionRight.begin(), selectionRight.end(), std::back_inserter(selectionRightTmp), [](const FileSystemObject* fsObj) { return !fsObj->isEmpty(); }); + if (!selectionLeftTmp.empty() || !selectionRightTmp.empty()) + { wxWindow* oldFocus = wxWindow::FindFocus(); ZEN_ON_SCOPE_EXIT(if (oldFocus) oldFocus->SetFocus();) - bool deleteOnBothSides = false; //let's keep this disabled by default -> don't save - - if (zen::showDeleteDialog(this, - selectionLeft, - selectionRight, - deleteOnBothSides, - globalCfg.gui.useRecyclerForManualDeletion) == ReturnSmallDlg::BUTTON_OKAY) - { - try + if (zen::showDeleteDialog(this, + selectionLeftTmp, + selectionRightTmp, + deleteOnBothSides, + globalCfg.gui.useRecyclerForManualDeletion) == ReturnSmallDlg::BUTTON_OKAY) { - //handle errors when deleting files/folders - ManualDeletionHandler statusHandler(*this); - - zen::deleteFromGridAndHD(selectionLeft, - selectionRight, - folderCmp, - extractDirectionCfg(getConfig().mainCfg), - deleteOnBothSides, - globalCfg.gui.useRecyclerForManualDeletion, - statusHandler, - globalCfg.optDialogs.warningRecyclerMissing); - - gridview::clearSelection(*m_gridMainL, *m_gridMainC, *m_gridMainR); //do not clear, if aborted! - } - catch (AbortDeleteProcess&) {} + wxBusyCursor dummy; //show hourglass cursor + try + { + //handle errors when deleting files/folders + ManualDeletionHandler statusHandler(*this); + + zen::deleteFromGridAndHD(selectionLeftTmp, + selectionRightTmp, + folderCmp, + extractDirectionCfg(getConfig().mainCfg), + deleteOnBothSides, + globalCfg.gui.useRecyclerForManualDeletion, + statusHandler, + globalCfg.optDialogs.warningRecyclerMissing); + + gridview::clearSelection(*m_gridMainL, *m_gridMainC, *m_gridMainR); //do not clear, if aborted! + } + catch (AbortDeleteProcess&) {} - //remove rows that are empty: just a beautification, invalid rows shouldn't cause issues - gridDataView->removeInvalidRows(); + //remove rows that are empty: just a beautification, invalid rows shouldn't cause issues + gridDataView->removeInvalidRows(); - //redraw grid neccessary to update new dimensions and for UI-Backend data linkage - updateGui(); //call immediately after deleteFromGridAndHD!!! - } + //redraw grid neccessary to update new dimensions and for UI-Backend data linkage + updateGui(); //call immediately after deleteFromGridAndHD!!! + } } } + namespace { template Zstring getExistingParentFolder(const FileSystemObject& fsObj) { - const DirMapping* dirObj = dynamic_cast(&fsObj); + const DirPair* dirObj = dynamic_cast(&fsObj); if (!dirObj) - dirObj = dynamic_cast(&fsObj.parent()); + dirObj = dynamic_cast(&fsObj.parent()); while (dirObj) { if (!dirObj->isEmpty()) return dirObj->getFullName(); - dirObj = dynamic_cast(&dirObj->parent()); + dirObj = dynamic_cast(&dirObj->parent()); } return fsObj.getBaseDirPf(); } @@ -1298,11 +1303,11 @@ void MainDialog::openExternalApplication(const wxString& commandline, const std: fallbackDir = leftSide ? getExistingParentFolder(*selectionTmp[0]) : getExistingParentFolder(*selectionTmp[0]); -#ifdef FFS_WIN +#ifdef ZEN_WIN zen::shellExecute(L"\"" + fallbackDir + L"\""); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX zen::shellExecute("xdg-open \"" + fallbackDir + "\""); -#elif defined FFS_MAC +#elif defined ZEN_MAC zen::shellExecute("open \"" + fallbackDir + "\""); #endif return; @@ -1517,9 +1522,9 @@ void MainDialog::enableAllElements() namespace { -void updateSizerOrientation(wxBoxSizer& sizer, wxWindow& window) +void updateSizerOrientation(wxBoxSizer& sizer, wxWindow& window, double horizontalWeight) { - const int newOrientation = window.GetSize().GetWidth() > window.GetSize().GetHeight() ? wxHORIZONTAL : wxVERTICAL; //check window NOT sizer width! + const int newOrientation = window.GetSize().GetWidth() * horizontalWeight > window.GetSize().GetHeight() ? wxHORIZONTAL : wxVERTICAL; //check window NOT sizer width! if (sizer.GetOrientation() != newOrientation) { sizer.SetOrientation(newOrientation); @@ -1531,13 +1536,13 @@ void updateSizerOrientation(wxBoxSizer& sizer, wxWindow& window) void MainDialog::OnResizeConfigPanel(wxEvent& event) { - updateSizerOrientation(*bSizerConfig, *m_panelConfig); + updateSizerOrientation(*bSizerConfig, *m_panelConfig, 0.5); event.Skip(); } void MainDialog::OnResizeViewPanel(wxEvent& event) { - updateSizerOrientation(*bSizerViewFilter, *m_panelViewFilter); + updateSizerOrientation(*bSizerViewFilter, *m_panelViewFilter, 1.0); event.Skip(); } @@ -1573,9 +1578,9 @@ void MainDialog::OnResizeLeftFolderWidth(wxEvent& event) //adapt left-shift display distortion caused by scrollbars for multiple folder pairs const int width = m_panelTopLeft->GetSize().GetWidth(); std::for_each(additionalFolderPairs.begin(), additionalFolderPairs.end(), - [&](DirectoryPair* dirPair) + [&](FolderPairPanel* panel) { - dirPair->m_panelLeft->SetMinSize(wxSize(width, -1)); + panel->m_panelLeft->SetMinSize(wxSize(width, -1)); }); event.Skip(); @@ -1849,7 +1854,7 @@ void MainDialog::onNaviSelection(GridRangeSelectEvent& event) if (std::unique_ptr node = treeDataView->getLine(event.rowFirst_)) { if (const TreeView::RootNode* root = dynamic_cast(node.get())) - leadRow = gridDataView->findRowFirstChild(&(root->baseMap_)); + leadRow = gridDataView->findRowFirstChild(&(root->baseDirObj_)); else if (const TreeView::DirNode* dir = dynamic_cast(node.get())) { leadRow = gridDataView->findRowDirect(&(dir->dirObj_)); @@ -1887,7 +1892,7 @@ void MainDialog::onNaviSelection(GridRangeSelectEvent& event) if (std::unique_ptr node = treeDataView->getLine(row)) { if (const TreeView::RootNode* root = dynamic_cast(node.get())) - markedContainer.insert(&(root->baseMap_)); + markedContainer.insert(&(root->baseDirObj_)); else if (const TreeView::DirNode* dir = dynamic_cast(node.get())) markedContainer.insert(&(dir->dirObj_)); else if (const TreeView::FilesNode* files = dynamic_cast(node.get())) @@ -1953,7 +1958,7 @@ void MainDialog::onNaviGridContext(GridClickEvent& event) else if (selection.size() > 1) { //by relative path - menu.addItem(_("Exclude via filter:") + L" " + _(""), + menu.addItem(_("Exclude via filter:") + L" <" + _("multiple selection") + L">", [this, &selection] { excludeItems(selection); }, &getResourceImage(L"filterSmall")); } @@ -2041,7 +2046,7 @@ void MainDialog::onMainGridContextRim(bool leftSide) ContextMenu submenu; //by extension - if (dynamic_cast(selection[0]) == nullptr) //non empty && no directory + if (dynamic_cast(selection[0]) == nullptr) //non empty && no directory { const Zstring filename = afterLast(selection[0]->getObjRelativeName(), FILE_NAME_SEPARATOR); if (contains(filename, Zchar('.'))) //be careful: AfterLast would return the whole string if '.' were not found! @@ -2066,7 +2071,7 @@ void MainDialog::onMainGridContextRim(bool leftSide) else if (selection.size() > 1) { //by relative path - menu.addItem(_("Exclude via filter:") + L" " + _(""), + menu.addItem(_("Exclude via filter:") + L" <" + _("multiple selection") + L">", [this, &selection] { excludeItems(selection); }, &getResourceImage(L"filterSmall")); } @@ -2123,7 +2128,7 @@ void MainDialog::excludeExtension(const Zstring& extension) updateGlobalFilterButton(); //do not fully apply filter, just exclude new items - std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirMapping& baseMap) { addHardFiltering(baseMap, newExclude); }); + std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirPair& baseDirObj) { addHardFiltering(baseDirObj, newExclude); }); updateGui(); } @@ -2131,7 +2136,7 @@ void MainDialog::excludeExtension(const Zstring& extension) void MainDialog::excludeShortname(const FileSystemObject& fsObj) { Zstring newExclude = Zstring(Zstr("*")) + FILE_NAME_SEPARATOR + fsObj.getObjShortName(); - const bool isDir = dynamic_cast(&fsObj) != nullptr; + const bool isDir = dynamic_cast(&fsObj) != nullptr; if (isDir) newExclude += FILE_NAME_SEPARATOR; @@ -2144,7 +2149,7 @@ void MainDialog::excludeShortname(const FileSystemObject& fsObj) updateGlobalFilterButton(); //do not fully apply filter, just exclude new items - std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirMapping& baseMap) { addHardFiltering(baseMap, newExclude); }); + std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirPair& baseDirObj) { addHardFiltering(baseDirObj, newExclude); }); updateGui(); } @@ -2164,7 +2169,7 @@ void MainDialog::excludeItems(const std::vector& selection) //#pragma warning(suppress: 6011) -> fsObj bound in this context! newExclude += FILE_NAME_SEPARATOR + fsObj->getObjRelativeName(); - const bool isDir = dynamic_cast(fsObj) != nullptr; + const bool isDir = dynamic_cast(fsObj) != nullptr; if (isDir) newExclude += FILE_NAME_SEPARATOR; } @@ -2178,7 +2183,7 @@ void MainDialog::excludeItems(const std::vector& selection) updateGlobalFilterButton(); //do not fully apply filter, just exclude new items - std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirMapping& baseMap) { addHardFiltering(baseMap, newExclude); }); + std::for_each(begin(folderCmp), end(folderCmp), [&](BaseDirPair& baseDirObj) { addHardFiltering(baseDirObj, newExclude); }); updateGui(); } } @@ -2192,8 +2197,8 @@ void MainDialog::onGridLabelContextC(GridClickEvent& event) menu.addRadio(_("Category") + (actionView ? L"\tF8" : L""), [&] { setViewTypeSyncAction(false); }, !actionView); menu.addRadio(_("Action") + (!actionView ? L"\tF8" : L""), [&] { setViewTypeSyncAction(true ); }, actionView); - //menu.addItem(_("Category") + L"\tF8", [&] { setViewTypeSyncAction(false); }, m_bpButtonViewTypeSyncAction->isActive() ? nullptr : &getResourceImage(L"compareSmall")); - //menu.addItem(_("Action"), [&] { setViewTypeSyncAction(true ); }, m_bpButtonViewTypeSyncAction->isActive() ? &getResourceImage(L"syncSmall") : nullptr); + //menu.addItem(_("Category") + L"\tF8", [&] { setViewTypeSyncAction(false); }, m_bpButtonViewTypeSyncAction->isActive() ? nullptr : &getResourceImage(L"compare_small")); + //menu.addItem(_("Action"), [&] { setViewTypeSyncAction(true ); }, m_bpButtonViewTypeSyncAction->isActive() ? &getResourceImage(L"sync_small") : nullptr); menu.popup(*this); } @@ -2357,10 +2362,10 @@ void MainDialog::OnSyncSettingsContext(wxMouseEvent& event) const auto currentVar = getConfig().mainCfg.syncCfg.directionCfg.var; - menu.addRadio(_("<- Two way ->"), [&] { setVariant(DirectionConfig::AUTOMATIC); }, currentVar == DirectionConfig::AUTOMATIC); - menu.addRadio(_("Mirror ->>") , [&] { setVariant(DirectionConfig::MIRROR); }, currentVar == DirectionConfig::MIRROR); - menu.addRadio(_("Update ->") , [&] { setVariant(DirectionConfig::UPDATE); }, currentVar == DirectionConfig::UPDATE); - menu.addRadio(_("Custom") , [&] { setVariant(DirectionConfig::CUSTOM); }, currentVar == DirectionConfig::CUSTOM); + menu.addRadio(L"<- " + _("Two way") + L" ->" , [&] { setVariant(DirectionConfig::AUTOMATIC); }, currentVar == DirectionConfig::AUTOMATIC); + menu.addRadio( _("Mirror") + L" ->>", [&] { setVariant(DirectionConfig::MIRROR); }, currentVar == DirectionConfig::MIRROR); + menu.addRadio( _("Update") + L" ->" , [&] { setVariant(DirectionConfig::UPDATE); }, currentVar == DirectionConfig::UPDATE); + menu.addRadio( _("Custom") , [&] { setVariant(DirectionConfig::CUSTOM); }, currentVar == DirectionConfig::CUSTOM); menu.popup(*this); } @@ -2433,7 +2438,7 @@ void MainDialog::addFileToCfgHistory(const std::vector& filenames) else //insert { const wxString label = EqualFilename()(filename, lastRunConfigName()) ? //give default config file a different name - _("") : getFormattedHistoryElement(filename); + L"<" + _("Last session") + L">" : getFormattedHistoryElement(filename); const int newPos = m_listBoxHistory->Append(label, new wxClientHistoryData(filename, ++lastUseIndexMax)); //*insert* into sorted list selections.insert(selections.begin() + newPos, true); } @@ -2624,7 +2629,7 @@ bool MainDialog::trySaveConfig(const Zstring* fileNameGui) //return true if save xmlAccess::writeConfig(guiCfg, targetFilename); //throw FfsXmlError setLastUsedConfig(targetFilename, guiCfg); - flashStatusInformation(_("Configuration saved!")); + flashStatusInformation(_("Configuration saved")); return true; } catch (const xmlAccess::FfsXmlError& e) @@ -2683,7 +2688,7 @@ bool MainDialog::trySaveBatchConfig(const Zstring* fileNameBatch) xmlAccess::writeConfig(batchCfg, targetFilename); //throw FfsXmlError setLastUsedConfig(targetFilename, guiCfg); //[!] behave as if we had saved guiCfg - flashStatusInformation(_("Configuration saved!")); + flashStatusInformation(_("Configuration saved")); return true; } catch (const xmlAccess::FfsXmlError& e) @@ -2854,7 +2859,7 @@ bool MainDialog::loadConfiguration(const std::vector& filenames) xmlAccess::readAnyConfig(filenames, newGuiCfg); //throw FfsXmlError setConfig(newGuiCfg, filenames); - //flashStatusInformation(_("Configuration loaded!")); -> irrelevant!? + //flashStatusInformation(("Configuration loaded")); -> irrelevant!? return true; } catch (const xmlAccess::FfsXmlError& error) @@ -3032,7 +3037,7 @@ void MainDialog::setConfig(const xmlAccess::XmlGuiConfig& newGuiCfg, const std:: inline -FolderPairEnh getEnhancedPair(const DirectoryPair* panel) +FolderPairEnh getEnhancedPair(const FolderPairPanel* panel) { return FolderPairEnh(panel->getLeftDir(), panel->getRightDir(), @@ -3185,28 +3190,28 @@ wxBitmap buttonReleased(const std::string& name) void MainDialog::initViewFilterButtons() { - m_bpButtonViewTypeSyncAction->init(getResourceImage(L"viewTypeSyncAction"), getResourceImage(L"viewTypeCmpResult")); + m_bpButtonViewTypeSyncAction->init(getResourceImage(L"viewtype_sync_action"), getResourceImage(L"viewtype_cmp_result")); //tooltip is updated dynamically in setViewTypeSyncAction() auto initButton = [](ToggleButton& btn, const char* imgName, const wxString& tooltip) { btn.init(buttonPressed(imgName), buttonReleased(imgName)); btn.SetToolTip(tooltip); }; //compare result buttons - initButton(*m_bpButtonShowLeftOnly, "leftOnly", _("Show files that exist on left side only")); - initButton(*m_bpButtonShowRightOnly, "rightOnly", _("Show files that exist on right side only")); - initButton(*m_bpButtonShowLeftNewer, "leftNewer", _("Show files that are newer on left")); - initButton(*m_bpButtonShowRightNewer, "rightNewer", _("Show files that are newer on right")); - initButton(*m_bpButtonShowEqual, "equal", _("Show files that are equal")); - initButton(*m_bpButtonShowDifferent, "different", _("Show files that are different")); - initButton(*m_bpButtonShowConflict, "conflict", _("Show conflicts")); + initButton(*m_bpButtonShowLeftOnly, "cat_left_only", _("Show files that exist on left side only")); + initButton(*m_bpButtonShowRightOnly, "cat_right_only", _("Show files that exist on right side only")); + initButton(*m_bpButtonShowLeftNewer, "cat_left_newer", _("Show files that are newer on left")); + initButton(*m_bpButtonShowRightNewer, "cat_right_newer", _("Show files that are newer on right")); + initButton(*m_bpButtonShowEqual, "cat_equal", _("Show files that are equal")); + initButton(*m_bpButtonShowDifferent, "cat_different", _("Show files that are different")); + initButton(*m_bpButtonShowConflict, "cat_conflict", _("Show conflicts")); //sync preview buttons - initButton(*m_bpButtonShowCreateLeft, "createLeft", _("Show files that will be created on the left side")); - initButton(*m_bpButtonShowCreateRight, "createRight", _("Show files that will be created on the right side")); - initButton(*m_bpButtonShowDeleteLeft, "deleteLeft", _("Show files that will be deleted on the left side")); - initButton(*m_bpButtonShowDeleteRight, "deleteRight", _("Show files that will be deleted on the right side")); - initButton(*m_bpButtonShowUpdateLeft, "updateLeft", _("Show files that will be overwritten on left side")); - initButton(*m_bpButtonShowUpdateRight, "updateRight", _("Show files that will be overwritten on right side")); - initButton(*m_bpButtonShowDoNothing, "none", _("Show files that won't be copied")); + initButton(*m_bpButtonShowCreateLeft, "so_create_left", _("Show files that will be created on the left side")); + initButton(*m_bpButtonShowCreateRight, "so_create_right", _("Show files that will be created on the right side")); + initButton(*m_bpButtonShowDeleteLeft, "so_delete_left", _("Show files that will be deleted on the left side")); + initButton(*m_bpButtonShowDeleteRight, "so_delete_right", _("Show files that will be deleted on the right side")); + initButton(*m_bpButtonShowUpdateLeft, "so_update_left", _("Show files that will be overwritten on left side")); + initButton(*m_bpButtonShowUpdateRight, "so_update_right", _("Show files that will be overwritten on right side")); + initButton(*m_bpButtonShowDoNothing, "so_none", _("Show files that won't be copied")); } @@ -3328,7 +3333,7 @@ void MainDialog::OnCompare(wxCommandEvent& event) } catch (GuiAbortProcess&) { - flashStatusInformation(_("Operation aborted!")); + flashStatusInformation(_("Operation aborted")); // if (m_buttonCompare->IsShownOnScreen()) m_buttonCompare->SetFocus(); updateGui(); //refresh grid in ANY case! (also on abort) return; @@ -3354,7 +3359,7 @@ void MainDialog::OnCompare(wxCommandEvent& event) //prepare status information if (allElementsEqual(folderCmp)) - flashStatusInformation(_("All folders are in sync!")); + flashStatusInformation(_("All folders are in sync")); } @@ -3419,12 +3424,12 @@ void MainDialog::updateStatistics() bmpControl.SetBitmap(mirrorIfRtl(getResourceImage(bmpName))); }; - setValue(*m_staticTextCreateLeft, st.getCreate(), *m_bitmapCreateLeft, L"createLeftSmall"); - setValue(*m_staticTextUpdateLeft, st.getUpdate(), *m_bitmapUpdateLeft, L"updateLeftSmall"); - setValue(*m_staticTextDeleteLeft, st.getDelete(), *m_bitmapDeleteLeft, L"deleteLeftSmall"); - setValue(*m_staticTextCreateRight, st.getCreate(), *m_bitmapCreateRight, L"createRightSmall"); - setValue(*m_staticTextUpdateRight, st.getUpdate(), *m_bitmapUpdateRight, L"updateRightSmall"); - setValue(*m_staticTextDeleteRight, st.getDelete(), *m_bitmapDeleteRight, L"deleteRightSmall"); + setValue(*m_staticTextCreateLeft, st.getCreate(), *m_bitmapCreateLeft, L"so_create_left_small"); + setValue(*m_staticTextUpdateLeft, st.getUpdate(), *m_bitmapUpdateLeft, L"so_update_left_small"); + setValue(*m_staticTextDeleteLeft, st.getDelete(), *m_bitmapDeleteLeft, L"so_delete_left_small"); + setValue(*m_staticTextCreateRight, st.getCreate(), *m_bitmapCreateRight, L"so_create_right_small"); + setValue(*m_staticTextUpdateRight, st.getUpdate(), *m_bitmapUpdateRight, L"so_update_right_small"); + setValue(*m_staticTextDeleteRight, st.getDelete(), *m_bitmapDeleteRight, L"so_delete_right_small"); m_panelStatistics->Layout(); m_panelStatistics->Refresh(); //fix small mess up on RTL layout @@ -3513,8 +3518,6 @@ void MainDialog::OnStartSync(wxCommandEvent& event) globalCfg.optDialogs.confirmSyncStart = !dontShowAgain; } - wxBusyCursor dummy; //show hourglass cursor - try { //PERF_START; @@ -3533,6 +3536,8 @@ void MainDialog::OnStartSync(wxCommandEvent& event) guiCfg.mainCfg.onCompletion, globalCfg.gui.onCompletionHistory); + wxBusyCursor dummy; //show hourglass cursor -> lifetime must end *before* showing results dialog in ~SyncStatusHandler()! + //GUI mode: place directory locks on directories isolated(!) during both comparison and synchronization std::unique_ptr dirLocks; if (globalCfg.createLockFile) @@ -3642,12 +3647,12 @@ void MainDialog::OnSwapSides(wxCommandEvent& event) //additional pairs for (auto it = additionalFolderPairs.begin(); it != additionalFolderPairs.end(); ++it) { - DirectoryPair* dirPair = *it; - dirPair->setValues(dirPair->getRightDir(), // swap directories - dirPair->getLeftDir(), // - dirPair->getAltCompConfig(), - dirPair->getAltSyncConfig(), - dirPair->getAltFilterConfig()); + FolderPairPanel* panel = *it; + panel->setValues(panel->getRightDir(), // swap directories + panel->getLeftDir(), // + panel->getAltCompConfig(), + panel->getAltSyncConfig(), + panel->getAltFilterConfig()); } //swap view filter @@ -3935,7 +3940,7 @@ void MainDialog::updateGuiForFolderPair() m_bpButtonAltCompCfg ->Show(showLocalCfgFirstPair); m_bpButtonAltSyncCfg ->Show(showLocalCfgFirstPair); m_bpButtonLocalFilter->Show(showLocalCfgFirstPair); - setImage(*m_bpButtonSwapSides, getResourceImage(showLocalCfgFirstPair ? L"swapSlim" : L"swap")); + setImage(*m_bpButtonSwapSides, getResourceImage(showLocalCfgFirstPair ? L"swap_slim" : L"swap")); m_panelTopMiddle->Layout(); //both required to update button size for calculations below!!! m_panelDirectoryPairs->Layout(); // -> updates size of stretched m_panelTopLeft! @@ -3981,13 +3986,13 @@ void MainDialog::addFolderPair(const std::vector& newPairs, bool wxWindowUpdateLocker dummy(m_panelDirectoryPairs); //avoid display distortion //wxWindowUpdateLocker dummy2(m_panelGrids); // - std::vector newEntries; + std::vector newEntries; std::for_each(newPairs.begin(), newPairs.end(), [&](const FolderPairEnh& enhPair) { //add new folder pair - DirectoryPair* newPair = new DirectoryPair(m_scrolledWindowFolderPairs, *this); + FolderPairPanel* newPair = new FolderPairPanel(m_scrolledWindowFolderPairs, *this); //init dropdown history newPair->m_directoryLeft ->init(folderHistoryLeft); @@ -4035,16 +4040,16 @@ void MainDialog::removeAddFolderPair(size_t pos) if (pos < additionalFolderPairs.size()) { //remove folder pairs from window - DirectoryPair* pairToDelete = additionalFolderPairs[pos]; - //const int pairHeight = pairToDelete->GetSize().GetHeight(); + FolderPairPanel* panel = additionalFolderPairs[pos]; + //const int pairHeight = panel->GetSize().GetHeight(); - bSizerAddFolderPairs->Detach(pairToDelete); //Remove() does not work on Window*, so do it manually + bSizerAddFolderPairs->Detach(panel); //Remove() does not work on Window*, so do it manually additionalFolderPairs.erase(additionalFolderPairs.begin() + pos); //remove element from vector //more (non-portable) wxWidgets bullshit: on OS X wxWindow::Destroy() screws up and calls "operator delete" directly rather than //the deferred deletion it is expected to do (and which is implemented correctly on Windows and Linux) //http://bb10.com/python-wxpython-devel/2012-09/msg00004.html - //=> since we're in a mouse button callback of a sub-component of "pairToDelete" we need to delay deletion ourselves: - processAsync2([] {}, [pairToDelete] { pairToDelete->Destroy(); }); + //=> since we're in a mouse button callback of a sub-component of "panel" we need to delay deletion ourselves: + processAsync2([] {}, [panel] { panel->Destroy(); }); //set size of scrolled window //const size_t additionalRows = additionalFolderPairs.size(); @@ -4122,10 +4127,10 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) //base folders header += fmtValue(_("Folder pairs")) + '\n' ; std::for_each(begin(folderCmp), end(folderCmp), - [&](BaseDirMapping& baseMap) + [&](BaseDirPair& baseDirObj) { - header += utfCvrtTo(baseMap.getBaseDirPf()) + CSV_SEP; - header += utfCvrtTo(baseMap.getBaseDirPf()) + '\n'; + header += utfCvrtTo(baseDirObj.getBaseDirPf()) + CSV_SEP; + header += utfCvrtTo(baseDirObj.getBaseDirPf()) + '\n'; }); header += '\n'; @@ -4211,7 +4216,7 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event) fileOut.write(&*tmp.begin(), tmp.size()); //throw FileError } - flashStatusInformation(_("File list exported!")); + flashStatusInformation(_("File list exported")); } catch (const FileError& e) { @@ -4254,7 +4259,7 @@ void MainDialog::OnLayoutWindowAsync(wxIdleEvent& event) //adjust folder pair distortion on startup std::for_each(additionalFolderPairs.begin(), additionalFolderPairs.end(), - [](DirectoryPair* dirPair) { dirPair->Layout(); }); + [](FolderPairPanel* panel) { panel->Layout(); }); m_panelTopButtons->Layout(); Layout(); //strangely this layout call works if called in next idle event only @@ -4306,7 +4311,7 @@ void MainDialog::setViewTypeSyncAction(bool value) //if (m_bpButtonViewTypeSyncAction->isActive() == value) return; support polling -> what about initialization? m_bpButtonViewTypeSyncAction->setActive(value); - m_bpButtonViewTypeSyncAction->SetToolTip((value ? _("Action") : _("Category")) + L" (F8)"); + m_bpButtonViewTypeSyncAction->SetToolTip((value ? _("Action") : _("Category")) + L" (F8)"); //toggle display of sync preview in middle grid gridview::highlightSyncAction(*m_gridMainC, value); diff --git a/ui/main_dlg.h b/ui/main_dlg.h index 2d132814..5575cefb 100644 --- a/ui/main_dlg.h +++ b/ui/main_dlg.h @@ -21,10 +21,9 @@ #include "folder_history_box.h" #include "../lib/process_xml.h" -//class FolderHistory; -class DirectoryPair; +class FolderPairFirst; +class FolderPairPanel; class CompareProgressDialog; -class DirectoryPairFirst; class MainDialog : public MainDialogGenerated @@ -62,8 +61,8 @@ private: friend class CompareStatusHandler; friend class SyncStatusHandler; friend class ManualDeletionHandler; - friend class DirectoryPairFirst; - friend class DirectoryPair; + friend class FolderPairFirst; + friend class FolderPairPanel; friend class DirectoryNameMainImpl; template friend class FolderPairCallback; @@ -269,8 +268,8 @@ private: xmlAccess::XmlGuiConfig currentCfg; //folder pairs: - std::unique_ptr firstFolderPair; //always bound!!! - std::vector additionalFolderPairs; //additional pairs to the first pair + std::unique_ptr firstFolderPair; //always bound!!! + std::vector additionalFolderPairs; //additional pairs to the first pair //------------------------------------- //*********************************************** diff --git a/ui/msg_popup.cpp b/ui/msg_popup.cpp index 59908cf9..0d08768c 100644 --- a/ui/msg_popup.cpp +++ b/ui/msg_popup.cpp @@ -5,9 +5,10 @@ // ************************************************************************** #include "msg_popup.h" -#include "../lib/resources.h" #include +#include #include "gui_generated.h" +#include "../lib/resources.h" using namespace zen; @@ -31,11 +32,11 @@ public: bool* ignoreNextErrors); private: - void OnClose (wxCloseEvent& event) { EndModal(ReturnErrorDlg::BUTTON_CANCEL); } - void OnCancel(wxCommandEvent& event) { EndModal(ReturnErrorDlg::BUTTON_CANCEL); } - void OnButton1(wxCommandEvent& event); - void OnButton2(wxCommandEvent& event); - void OnCheckBoxClick(wxCommandEvent& event) { updateGui(); event.Skip(); } + virtual void OnClose (wxCloseEvent& event) { EndModal(ReturnErrorDlg::BUTTON_CANCEL); } + virtual void OnCancel(wxCommandEvent& event) { EndModal(ReturnErrorDlg::BUTTON_CANCEL); } + virtual void OnButtonAffirmative(wxCommandEvent& event); + virtual void OnButtonNegative (wxCommandEvent& event); + virtual void OnCheckBoxClick(wxCommandEvent& event) { updateGui(); event.Skip(); } void updateGui(); bool* ignoreErrors; @@ -48,13 +49,14 @@ private: ErrorDlg::ErrorDlg(wxWindow* parent, int activeButtons, const wxString& messageText, const wxString& caption, bool* ignoreNextErrors) : MessageDlgGenerated(parent), ignoreErrors(ignoreNextErrors), - buttonRetry (*m_buttonCustom1), - buttonIgnore(*m_buttonCustom2), + buttonRetry (*m_buttonAffirmative), + buttonIgnore(*m_buttonNegative), checkBoxIgnoreErrors(*m_checkBoxCustom) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + SetTitle(!caption.empty() ? caption : _("Error")); m_bitmapMsgType->SetBitmap(getResourceImage(L"msg_error")); m_textCtrlMessage->SetValue(messageText); @@ -89,10 +91,14 @@ ErrorDlg::ErrorDlg(wxWindow* parent, int activeButtons, const wxString& messageT else if (activeButtons & ReturnErrorDlg::BUTTON_CANCEL) setAsStandard(*m_buttonCancel); + //set std order after button visibility was set + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(&buttonRetry).setNegative(&buttonIgnore).setCancel(m_buttonCancel)); + updateGui(); Fit(); //child-element widths have changed: image was set } + void ErrorDlg::updateGui() { //button doesn't make sense when checkbox is set! @@ -100,7 +106,7 @@ void ErrorDlg::updateGui() } -void ErrorDlg::OnButton1(wxCommandEvent& event) //retry +void ErrorDlg::OnButtonAffirmative(wxCommandEvent& event) //retry { if (ignoreErrors) *ignoreErrors = checkBoxIgnoreErrors.GetValue(); @@ -108,7 +114,7 @@ void ErrorDlg::OnButton1(wxCommandEvent& event) //retry } -void ErrorDlg::OnButton2(wxCommandEvent& event) //ignore +void ErrorDlg::OnButtonNegative(wxCommandEvent& event) //ignore { if (ignoreErrors) *ignoreErrors = checkBoxIgnoreErrors.GetValue(); @@ -140,16 +146,16 @@ public: WarningDlg(wxWindow* parent, int activeButtons, const wxString& messageText, bool& dontShowAgain); private: - void OnClose (wxCloseEvent& event) { EndModal(ReturnWarningDlg::BUTTON_CANCEL); } - void OnCancel(wxCommandEvent& event) { EndModal(ReturnWarningDlg::BUTTON_CANCEL); } - void OnButton1(wxCommandEvent& event); - void OnButton2(wxCommandEvent& event); - void OnCheckBoxClick(wxCommandEvent& event) { updateGui(); event.Skip(); } + virtual void OnClose (wxCloseEvent& event) { EndModal(ReturnWarningDlg::BUTTON_CANCEL); } + virtual void OnCancel(wxCommandEvent& event) { EndModal(ReturnWarningDlg::BUTTON_CANCEL); } + virtual void OnButtonAffirmative(wxCommandEvent& event); + virtual void OnButtonNegative (wxCommandEvent& event); + virtual void OnCheckBoxClick(wxCommandEvent& event) { updateGui(); event.Skip(); } void updateGui(); bool& dontShowAgain; - wxButton& buttonIgnore; // - wxButton& buttonSwitch; // map generic controls + wxButton& buttonSwitch; // + wxButton& buttonIgnore; //map generic controls wxCheckBox& checkBoxDontShowAgain; // }; @@ -157,13 +163,14 @@ private: WarningDlg::WarningDlg(wxWindow* parent, int activeButtons, const wxString& messageText, bool& dontShowDlgAgain) : MessageDlgGenerated(parent), dontShowAgain(dontShowDlgAgain), - buttonIgnore(*m_buttonCustom1), - buttonSwitch(*m_buttonCustom2), + buttonSwitch(*m_buttonAffirmative), + buttonIgnore(*m_buttonNegative), checkBoxDontShowAgain(*m_checkBoxCustom) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + SetTitle(_("Warning")); m_bitmapMsgType->SetBitmap(getResourceImage(L"msg_warning")); m_textCtrlMessage->SetValue(messageText); @@ -193,6 +200,9 @@ WarningDlg::WarningDlg(wxWindow* parent, int activeButtons, const wxString& mes else if (activeButtons & ReturnWarningDlg::BUTTON_CANCEL) setAsStandard(*m_buttonCancel); + //set std order after button visibility was set + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(&buttonSwitch).setNegative(&buttonIgnore).setCancel(m_buttonCancel)); + updateGui(); Fit(); //child-element widths have changed: image was set } @@ -205,17 +215,17 @@ void WarningDlg::updateGui() } -void WarningDlg::OnButton1(wxCommandEvent& event) //ignore +void WarningDlg::OnButtonAffirmative(wxCommandEvent& event) //switch { dontShowAgain = checkBoxDontShowAgain.GetValue(); - EndModal(ReturnWarningDlg::BUTTON_IGNORE); + EndModal(ReturnWarningDlg::BUTTON_SWITCH); } -void WarningDlg::OnButton2(wxCommandEvent& event) //switch +void WarningDlg::OnButtonNegative(wxCommandEvent& event) //ignore { dontShowAgain = checkBoxDontShowAgain.GetValue(); - EndModal(ReturnWarningDlg::BUTTON_SWITCH); + EndModal(ReturnWarningDlg::BUTTON_IGNORE); } @@ -234,11 +244,11 @@ public: QuestionDlg(wxWindow* parent, int activeButtons, const wxString& messageText, const QuestConfig& cfg); private: - void OnClose (wxCloseEvent& event) { EndModal(ReturnQuestionDlg::BUTTON_CANCEL); } - void OnCancel(wxCommandEvent& event) { EndModal(ReturnQuestionDlg::BUTTON_CANCEL); } - void OnButton1(wxCommandEvent& event); - void OnButton2(wxCommandEvent& event); - void OnCheckBoxClick(wxCommandEvent& event) { updateGui(); event.Skip(); } + virtual void OnClose (wxCloseEvent& event) { EndModal(ReturnQuestionDlg::BUTTON_CANCEL); } + virtual void OnCancel(wxCommandEvent& event) { EndModal(ReturnQuestionDlg::BUTTON_CANCEL); } + virtual void OnButtonAffirmative(wxCommandEvent& event); + virtual void OnButtonNegative (wxCommandEvent& event); + virtual void OnCheckBoxClick(wxCommandEvent& event) { updateGui(); event.Skip(); } void updateGui(); wxButton& buttonYes; // map generic controls @@ -254,14 +264,15 @@ QuestionDlg::QuestionDlg(wxWindow* parent, const wxString& messageText, const QuestConfig& cfg) : MessageDlgGenerated(parent), - buttonYes(*m_buttonCustom1), - buttonNo (*m_buttonCustom2), + buttonYes(*m_buttonAffirmative), + buttonNo (*m_buttonNegative), checkBoxValue_(cfg.checkBoxValue), disabledButtonsWhenChecked_(cfg.disabledButtonsWhenChecked_) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + assert(!cfg.caption.empty()); //"Question" is not a good caption! SetTitle(!cfg.caption.empty()? cfg.caption : _("Question")); m_bitmapMsgType->SetBitmap(getResourceImage(L"msg_question")); m_textCtrlMessage->SetValue(messageText); @@ -295,6 +306,9 @@ QuestionDlg::QuestionDlg(wxWindow* parent, else if (activeButtons & ReturnQuestionDlg::BUTTON_CANCEL) setAsStandard(*m_buttonCancel); + //set std order after button visibility was set + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(&buttonYes).setNegative(&buttonNo).setCancel(m_buttonCancel)); + updateGui(); Fit(); //child-element widths have changed: image was set } @@ -313,14 +327,15 @@ void QuestionDlg::updateGui() } -void QuestionDlg::OnButton1(wxCommandEvent& event) //yes +void QuestionDlg::OnButtonAffirmative(wxCommandEvent& event) //yes { if (checkBoxValue_) *checkBoxValue_ = m_checkBoxCustom->GetValue(); EndModal(ReturnQuestionDlg::BUTTON_YES); } -void QuestionDlg::OnButton2(wxCommandEvent& event) //no + +void QuestionDlg::OnButtonNegative(wxCommandEvent& event) //no { if (checkBoxValue_) *checkBoxValue_ = m_checkBoxCustom->GetValue(); diff --git a/ui/osx_dock.h b/ui/osx_dock.h index f2765780..62237524 100644 --- a/ui/osx_dock.h +++ b/ui/osx_dock.h @@ -7,11 +7,11 @@ #ifndef OSX_DOCK_837210847312534 #define OSX_DOCK_837210847312534 -#include +#include namespace osx { -void dockIconSetText(const char* str); //throw OsxError +void dockIconSetText(const char* str); //throw SysError } #endif //OSX_DOCK_837210847312534 diff --git a/ui/osx_dock.mm b/ui/osx_dock.mm index a7161f60..8f42ae88 100644 --- a/ui/osx_dock.mm +++ b/ui/osx_dock.mm @@ -5,11 +5,11 @@ // ************************************************************************** #include "osx_dock.h" -#include #include +#include -void osx::dockIconSetText(const char* str) //throw OsxError +void osx::dockIconSetText(const char* str) //throw SysError { @try { @@ -19,6 +19,6 @@ void osx::dockIconSetText(const char* str) //throw OsxError } @catch (NSException* e) { - throwOsxError(e); //throw OsxError + throwSysError(e); //throw SysError } } diff --git a/ui/progress_indicator.cpp b/ui/progress_indicator.cpp index 37237861..732b21c7 100644 --- a/ui/progress_indicator.cpp +++ b/ui/progress_indicator.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include "gui_generated.h" #include "../lib/ffs_paths.h" @@ -32,6 +33,7 @@ #include "tray_icon.h" #include "taskbar.h" #include "exec_finished_box.h" +//#include using namespace zen; @@ -480,14 +482,14 @@ public: switch (entry.type) { case TYPE_INFO: - dc.DrawLabel(wxString(), getResourceImage(L"msg_small_info"), rectTmp, wxALIGN_CENTER); + dc.DrawLabel(wxString(), getResourceImage(L"msg_info_small"), rectTmp, wxALIGN_CENTER); break; case TYPE_WARNING: - dc.DrawLabel(wxString(), getResourceImage(L"msg_small_warning"), rectTmp, wxALIGN_CENTER); + dc.DrawLabel(wxString(), getResourceImage(L"msg_warning_small"), rectTmp, wxALIGN_CENTER); break; case TYPE_ERROR: case TYPE_FATAL_ERROR: - dc.DrawLabel(wxString(), getResourceImage(L"msg_small_error"), rectTmp, wxALIGN_CENTER); + dc.DrawLabel(wxString(), getResourceImage(L"msg_error_small"), rectTmp, wxALIGN_CENTER); break; } break; @@ -514,7 +516,7 @@ public: return 2 * COLUMN_BORDER_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth(); case COL_TYPE_MSG_CATEGORY: - return getResourceImage(L"msg_small_info").GetWidth(); + return getResourceImage(L"msg_info_small").GetWidth(); case COL_TYPE_MSG_TEXT: return COLUMN_BORDER_LEFT + dc.GetTextExtent(getValue(row, colType)).GetWidth(); @@ -531,12 +533,12 @@ public: static int getColumnCategoryDefaultWidth() { - return getResourceImage(L"msg_small_info").GetWidth(); + return getResourceImage(L"msg_info_small").GetWidth(); } static int getRowDefaultHeight(const Grid& grid) { - return std::max(getResourceImage(L"msg_small_info").GetHeight(), grid.getMainWin().GetCharHeight() + 2) + 1; //+ some space + bottom border + return std::max(getResourceImage(L"msg_info_small").GetHeight(), grid.getMainWin().GetCharHeight() + 2) + 1; //+ some space + bottom border } virtual wxString getToolTip(size_t row, ColumnType colType) const @@ -563,10 +565,10 @@ private: } -class LogControl : public LogControlGenerated +class LogPanel : public LogPanelGenerated { public: - LogControl(wxWindow* parent, const ErrorLog& log) : LogControlGenerated(parent), + LogPanel(wxWindow* parent, const ErrorLog& log) : LogPanelGenerated(parent), msgView(std::make_shared(log)) { const int errorCount = log.getItemCount(TYPE_ERROR | TYPE_FATAL_ERROR); @@ -603,9 +605,9 @@ public: m_gridMessages->setColumnConfig(attr); //support for CTRL + C - m_gridMessages->getMainWin().Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(LogControl::onGridButtonEvent), nullptr, this); + m_gridMessages->getMainWin().Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(LogPanel::onGridButtonEvent), nullptr, this); - m_gridMessages->Connect(EVENT_GRID_MOUSE_RIGHT_UP, GridClickEventHandler(LogControl::onMsgGridContext), nullptr, this); + m_gridMessages->Connect(EVENT_GRID_MOUSE_RIGHT_UP, GridClickEventHandler(LogPanel::onMsgGridContext), nullptr, this); updateGrid(); } @@ -713,7 +715,7 @@ private: } catch (const std::bad_alloc& e) { - wxMessageBox(_("Out of memory!") + L" " + utfCvrtTo(e.what()), _("Error"), wxOK | wxICON_ERROR); + wxMessageBox(_("Out of memory.") + L" " + utfCvrtTo(e.what()), _("Error"), wxOK | wxICON_ERROR); } } @@ -868,12 +870,12 @@ public: virtual void stopTimer() //halt all internal counters! { - m_animationControl1->Stop(); + m_animCtrlSyncing->Stop(); timeElapsed.Pause (); } virtual void resumeTimer() { - m_animationControl1->Play(); + m_animCtrlSyncing->Play(); timeElapsed.Resume(); } @@ -884,7 +886,7 @@ private: void OnKeyPressed(wxKeyEvent& event); virtual void OnOkay (wxCommandEvent& event); virtual void OnPause (wxCommandEvent& event); - virtual void OnAbort (wxCommandEvent& event); + virtual void OnCancel (wxCommandEvent& event); virtual void OnClose (wxCloseEvent& event); virtual void OnIconize(wxIconizeEvent& event); @@ -951,7 +953,7 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(AbortCallback& abortCb, lastStatCallSpeed(-1000000), //some big number phaseStartMs(0) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif @@ -962,8 +964,8 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(AbortCallback& abortCb, if (mainDialog) titelTextBackup = mainDialog->GetTitle(); //save old title (will be used as progress indicator) - m_animationControl1->SetAnimation(GlobalResources::instance().aniSync); - m_animationControl1->Play(); + m_animCtrlSyncing->SetAnimation(GlobalResources::instance().aniWorking); + m_animCtrlSyncing->Play(); SetIcon(GlobalResources::instance().programIconFFS); @@ -974,7 +976,7 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(AbortCallback& abortCb, EnableCloseButton(false); //this is NOT honored on OS X or during system shutdown on Windows! if (IsShown()) //don't steal focus when starting in sys-tray! - m_buttonAbort->SetFocus(); + m_buttonCancel->SetFocus(); timeElapsed.Start(); //measure total time @@ -985,11 +987,12 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(AbortCallback& abortCb, catch (const TaskbarNotAvailable&) {} //hide "processed" statistics until end of process - m_listbookResult ->Hide(); + m_notebookResult ->Hide(); m_staticTextLabelItemsProc->Show(false); bSizerItemsProc ->Show(false); m_buttonClose ->Show(false); - Layout(); + //set std order after button visibility was set + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonPause).setCancel(m_buttonCancel)); //register key event Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SyncProgressDialogImpl::OnKeyPressed), nullptr, this); @@ -1017,6 +1020,7 @@ SyncProgressDialogImpl::SyncProgressDialogImpl(AbortCallback& abortCb, updateDialogStatus(); //null-status will be shown while waiting for dir locks (if at all) Fit(); + Layout(); if (showProgress) { @@ -1042,7 +1046,7 @@ SyncProgressDialogImpl::~SyncProgressDialogImpl() mainDialog->Show(); } - //our client is NOT expecting a second call vianotifyWindowTerminate_()! + //our client is NOT expecting a second call via notifyWindowTerminate_()! } @@ -1054,9 +1058,9 @@ void SyncProgressDialogImpl::OnKeyPressed(wxKeyEvent& event) wxCommandEvent dummy(wxEVT_COMMAND_BUTTON_CLICKED); //simulate click on abort button - if (m_buttonAbort->IsShown()) //delegate to "abort" button if available + if (m_buttonCancel->IsShown()) //delegate to "cancel" button if available { - if (wxEvtHandler* handler = m_buttonAbort->GetEventHandler()) + if (wxEvtHandler* handler = m_buttonCancel->GetEventHandler()) handler->ProcessEvent(dummy); return; } @@ -1118,7 +1122,7 @@ void SyncProgressDialogImpl::notifyProgressChange() //noexcept! namespace { -#ifdef FFS_WIN +#ifdef ZEN_WIN enum Zorder { ZORDER_CORRECT, @@ -1319,7 +1323,7 @@ void SyncProgressDialogImpl::updateGuiInt(bool allowYield) //-> it seems this layout is not required, and even harmful: resets m_comboBoxExecFinished dropdown while user is selecting! } -#ifdef FFS_WIN +#ifdef ZEN_WIN //workaround Windows 7 bug messing up z-order after temporary application hangs: https://sourceforge.net/tracker/index.php?func=detail&aid=3376523&group_id=234430&atid=1093080 if (mainDialog) if (evaluateZorder(*this, *mainDialog) == ZORDER_WRONG) @@ -1373,52 +1377,69 @@ void SyncProgressDialogImpl::updateDialogStatus() //depends on "syncStat_, pause //status bitmap if (syncStat_) //sync running { + auto setStatusBitmap = [&](const wchar_t* bmpName) + { + m_animCtrlSyncing->Hide(); + m_bitmapStatus->SetBitmap(getResourceImage(bmpName)); + m_bitmapStatus->SetToolTip(dlgStatusTxt); + m_bitmapStatus->Show(); + }; + if (paused_) - m_bitmapStatus->SetBitmap(getResourceImage(L"statusPause")); + setStatusBitmap(L"status_pause"); else switch (syncStat_->currentPhase()) { case ProcessCallback::PHASE_NONE: + m_animCtrlSyncing->Hide(); + m_bitmapStatus->Hide(); break; case ProcessCallback::PHASE_SCANNING: - m_bitmapStatus->SetBitmap(getResourceImage(L"statusScanning")); + setStatusBitmap(L"status_scanning"); break; case ProcessCallback::PHASE_COMPARING_CONTENT: - m_bitmapStatus->SetBitmap(getResourceImage(L"statusBinaryCompare")); + setStatusBitmap(L"status_binary_compare"); break; case ProcessCallback::PHASE_SYNCHRONIZING: - m_bitmapStatus->SetBitmap(getResourceImage(L"statusSyncing")); + m_bitmapStatus->SetBitmap(getResourceImage(L"status_syncing")); + m_bitmapStatus->SetToolTip(dlgStatusTxt); + m_bitmapStatus->Show(); + m_animCtrlSyncing->Show(); + m_animCtrlSyncing->SetToolTip(dlgStatusTxt); break; } - - m_bitmapStatus->SetToolTip(dlgStatusTxt); } else //sync finished + { + auto setStatusBitmap = [&](const wchar_t* bmpName, const std::wstring& tooltip) + { + m_animCtrlSyncing->Hide(); + m_bitmapStatus->SetBitmap(getResourceImage(bmpName)); + m_bitmapStatus->Show(); + m_bitmapStatus->SetToolTip(tooltip); + }; switch (finalResult) { case RESULT_ABORTED: - m_bitmapStatus->SetBitmap(getResourceImage(L"statusAborted")); - m_bitmapStatus->SetToolTip(_("Synchronization aborted!")); + setStatusBitmap(L"status_aborted", _("Synchronization aborted")); break; case RESULT_FINISHED_WITH_ERROR: - m_bitmapStatus->SetBitmap(getResourceImage(L"statusFinishedErrors")); - m_bitmapStatus->SetToolTip(_("Synchronization completed with errors!")); + setStatusBitmap(L"status_finished_errors", _("Synchronization completed with errors")); break; case RESULT_FINISHED_WITH_WARNINGS: - m_bitmapStatus->SetBitmap(getResourceImage(L"statusFinishedWarnings")); - m_bitmapStatus->SetToolTip(_("Synchronization completed with warnings.")); + setStatusBitmap(L"status_finished_warnings", _("Synchronization completed with warnings")); break; case RESULT_FINISHED_WITH_SUCCESS: - m_bitmapStatus->SetBitmap(getResourceImage(L"statusFinishedSuccess")); - m_bitmapStatus->SetToolTip(_("Synchronization completed successfully.")); + setStatusBitmap(L"status_finished_success", _("Synchronization completed successfully")); break; } + } //show status on Windows 7 taskbar if (taskbar_.get()) @@ -1466,6 +1487,7 @@ void SyncProgressDialogImpl::updateDialogStatus() //depends on "syncStat_, pause } Layout(); + Refresh(); //a few pixels below the status text need refreshing } warn_static("osx: minimize to systray?") @@ -1556,29 +1578,32 @@ void SyncProgressDialogImpl::processHasFinished(SyncResult resultId, const Error EnableCloseButton(true); - m_buttonAbort->Disable(); - m_buttonAbort->Hide(); + m_buttonCancel->Disable(); + m_buttonCancel->Hide(); m_buttonPause->Disable(); m_buttonPause->Hide(); m_buttonClose->Show(); m_buttonClose->Enable(); + bSizerExecFinished->Show(false); + + //set std order after button visibility was set + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonClose)); + if (IsShown()) //don't steal focus when residing in sys-tray! m_buttonClose->SetFocus(); - m_animationControl1->Stop(); - m_animationControl1->Hide(); + //m_animCtrlSyncing->Stop(); + //m_animCtrlSyncing->Hide(); //hide current operation status m_staticTextStatus->Hide(); - bSizerExecFinished->Show(false); - //show and prepare final statistics - m_listbookResult->Show(); + m_notebookResult->Show(); -#ifdef FFS_WIN - m_staticlineHeader->Hide(); //win: m_listbookResult already has a window frame +#if defined ZEN_WIN || defined ZEN_LINUX + m_staticlineFooter->Hide(); //win: m_notebookResult already has a window frame #endif //show total time @@ -1588,29 +1613,23 @@ void SyncProgressDialogImpl::processHasFinished(SyncResult resultId, const Error m_staticTextLabelRemTime->Show(false); m_staticTextRemTime ->Show(false); - //workaround wxListBox bug on Windows XP: labels are drawn on top of each other - assert(m_listbookResult->GetImageList()); //make sure listbook keeps *any* image list - //due to some crazy reasons that aren't worth debugging, this needs to be done directly in wxFormBuilder, - //the following call is *not* sufficient: m_listbookResult->AssignImageList(new wxImageList(170, 1)); - //note: alternative solutions involving wxLC_LIST, wxLC_REPORT and SetWindowStyleFlag() do not work portably! wxListBook using wxLC_ICON is obviously a class invariant! - //1. re-arrange graph into results listbook bSizerRoot->Detach(m_panelProgress); - m_panelProgress->Reparent(m_listbookResult); -#ifdef FFS_LINUX //does not seem to be required on Win or OS X + m_panelProgress->Reparent(m_notebookResult); +#ifdef ZEN_LINUX //does not seem to be required on Win or OS X wxTheApp->Yield(); //wxGTK 2.9.3 fails miserably at "reparent" whithout this #endif - m_listbookResult->AddPage(m_panelProgress, _("Statistics"), true); //AddPage() takes ownership! + m_notebookResult->AddPage(m_panelProgress, _("Statistics"), true); //AddPage() takes ownership! //2. log file const size_t posLog = 1; - LogControl* logControl = new LogControl(m_listbookResult, log); //owned by m_listbookResult - m_listbookResult->AddPage(logControl, _("Logging"), false); - //bSizerHoldStretch->Insert(0, logControl, 1, wxEXPAND); + LogPanel* logPanel = new LogPanel(m_notebookResult, log); //owned by m_notebookResult + m_notebookResult->AddPage(logPanel, _("Logging"), false); + //bSizerHoldStretch->Insert(0, logPanel, 1, wxEXPAND); //show log instead of graph if errors occurred! (not required for ignored warnings) if (log.getItemCount(TYPE_ERROR | TYPE_FATAL_ERROR) > 0) - m_listbookResult->ChangeSelection(posLog); + m_notebookResult->ChangeSelection(posLog); Layout(); //play (optional) sound notification after sync has completed -> only play when waiting on results dialog, seems to be pointless otherwise! @@ -1630,6 +1649,7 @@ void SyncProgressDialogImpl::processHasFinished(SyncResult resultId, const Error } //Raise(); -> don't! user may be watching a movie in the meantime ;) + warn_static("was ist mit resumeFromSystray:: Raise()??") } @@ -1640,7 +1660,7 @@ void SyncProgressDialogImpl::OnOkay(wxCommandEvent& event) } -void SyncProgressDialogImpl::OnAbort(wxCommandEvent& event) +void SyncProgressDialogImpl::OnCancel(wxCommandEvent& event) { paused_ = false; updateDialogStatus(); //update status + pause button @@ -1699,41 +1719,46 @@ void SyncProgressDialogImpl::OnResumeFromTray(wxCommandEvent& event) void SyncProgressDialogImpl::minimizeToTray() { +// wxMessageBox(L"hi"); + if (!trayIcon.get()) { trayIcon = make_unique(); trayIcon->Connect(FFS_REQUEST_RESUME_TRAY_EVENT, wxCommandEventHandler(SyncProgressDialogImpl::OnResumeFromTray), nullptr, this); //tray icon has shorter lifetime than this => no need to disconnect event later - } - updateGuiInt(false); //set tray tooltip + progress: e.g. no updates while paused + updateGuiInt(false); //set tray tooltip + progress: e.g. no updates while paused - Hide(); - if (mainDialog) - mainDialog->Hide(); + Hide(); + if (mainDialog) + mainDialog->Hide(); + } } void SyncProgressDialogImpl::resumeFromSystray() { - trayIcon.reset(); - - if (mainDialog) + if (trayIcon) { - if (mainDialog->IsIconized()) //caveat: if window is maximized calling Iconize(false) will erroneously un-maximize! - mainDialog->Iconize(false); - mainDialog->Show(); - mainDialog->Raise(); - } + trayIcon.reset(); - if (IsIconized()) //caveat: if window is maximized calling Iconize(false) will erroneously un-maximize! - Iconize(false); - Show(); - Raise(); - SetFocus(); + if (mainDialog) + { + if (mainDialog->IsIconized()) //caveat: if window is maximized calling Iconize(false) will erroneously un-maximize! + mainDialog->Iconize(false); + mainDialog->Show(); + mainDialog->Raise(); + } - updateDialogStatus(); //restore Windows 7 task bar status (e.g. required in pause mode) - updateGuiInt(false); //restore Windows 7 task bar progress (e.g. required in pause mode) + if (IsIconized()) //caveat: if window is maximized calling Iconize(false) will erroneously un-maximize! + Iconize(false); + Show(); + Raise(); + SetFocus(); + + updateDialogStatus(); //restore Windows 7 task bar status (e.g. required in pause mode) + updateGuiInt(false); //restore Windows 7 task bar progress (e.g. required in pause mode) + } } //######################################################################################## diff --git a/ui/search.cpp b/ui/search.cpp index 444356d1..4c9c5366 100644 --- a/ui/search.cpp +++ b/ui/search.cpp @@ -42,7 +42,7 @@ SearchDlg::SearchDlg(wxWindow* parent, wxString& searchText, bool& respectCase) searchText_(searchText), respectCase_(respectCase) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif diff --git a/ui/small_dlgs.cpp b/ui/small_dlgs.cpp index 32bb3e85..304e4269 100644 --- a/ui/small_dlgs.cpp +++ b/ui/small_dlgs.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "gui_generated.h" #include "msg_popup.h" #include "custom_grid.h" @@ -44,6 +45,8 @@ private: AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent) { + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonClose)); + setRelativeFontSize(*m_buttonDonate, 1.25); assert(m_buttonClose->GetId() == wxID_OK); //we cannot use wxID_CLOSE else Esc key won't work: yet another wxWidgets bug?? @@ -76,7 +79,7 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent) bSizerTranslators->Fit(m_scrolledWindowTranslators); -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //-> put *after* creating credits #endif @@ -167,9 +170,10 @@ FilterDlg::FilterDlg(wxWindow* parent, FilterDlgGenerated(parent), outputRef(filter) //just hold reference { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOk).setCancel(m_buttonCancel)); setRelativeFontSize(*m_staticTextHeader, 1.25); @@ -350,9 +354,10 @@ DeleteDialog::DeleteDialog(wxWindow* parent, tickCountStartup(getTicks()), ticksPerSec_(ticksPerSec()) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOK).setCancel(m_buttonCancel)); m_checkBoxDeleteBothSides->SetValue(deleteOnBothSides); m_checkBoxUseRecycler->SetValue(useRecycleBin); @@ -448,7 +453,7 @@ ReturnSmallDlg::ButtonPressed zen::showDeleteDialog(wxWindow* parent, //######################################################################################## -class SyncPreviewDlg : public SyncPreviewDlgGenerated +class SyncPreviewDlg : public SyncConfirmationDlgGenerated { public: SyncPreviewDlg(wxWindow* parent, @@ -468,16 +473,16 @@ SyncPreviewDlg::SyncPreviewDlg(wxWindow* parent, const wxString& variantName, const SyncStatistics& st, bool& dontShowAgain) : - SyncPreviewDlgGenerated(parent), + SyncConfirmationDlgGenerated(parent), m_dontShowAgain(dontShowAgain) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonStartSync).setCancel(m_buttonCancel)); - setRelativeFontSize(*m_buttonStartSync, 1.5); - m_buttonStartSync->setInnerBorderSize(8); - m_buttonStartSync->setBitmapFront(getResourceImage(L"sync"), 5); + //setRelativeFontSize(*m_buttonStartSync, 1.5); + m_bitmapSync->SetBitmap(getResourceImage(L"sync")); m_staticTextVariant->SetLabel(variantName); m_checkBoxDontShowAgain->SetValue(dontShowAgain); @@ -499,12 +504,12 @@ SyncPreviewDlg::SyncPreviewDlg(wxWindow* parent, bmpControl.SetBitmap(mirrorIfRtl(getResourceImage(bmpName))); }; - setValue(*m_staticTextCreateLeft, st.getCreate(), *m_bitmapCreateLeft, L"createLeftSmall"); - setValue(*m_staticTextUpdateLeft, st.getUpdate(), *m_bitmapUpdateLeft, L"updateLeftSmall"); - setValue(*m_staticTextDeleteLeft, st.getDelete(), *m_bitmapDeleteLeft, L"deleteLeftSmall"); - setValue(*m_staticTextCreateRight, st.getCreate(), *m_bitmapCreateRight, L"createRightSmall"); - setValue(*m_staticTextUpdateRight, st.getUpdate(), *m_bitmapUpdateRight, L"updateRightSmall"); - setValue(*m_staticTextDeleteRight, st.getDelete(), *m_bitmapDeleteRight, L"deleteRightSmall"); + setValue(*m_staticTextCreateLeft, st.getCreate(), *m_bitmapCreateLeft, L"so_create_left_small"); + setValue(*m_staticTextUpdateLeft, st.getUpdate(), *m_bitmapUpdateLeft, L"so_update_left_small"); + setValue(*m_staticTextDeleteLeft, st.getDelete(), *m_bitmapDeleteLeft, L"so_delete_left_small"); + setValue(*m_staticTextCreateRight, st.getCreate(), *m_bitmapCreateRight, L"so_create_right_small"); + setValue(*m_staticTextUpdateRight, st.getUpdate(), *m_bitmapUpdateRight, L"so_update_right_small"); + setValue(*m_staticTextDeleteRight, st.getDelete(), *m_bitmapDeleteRight, L"so_delete_right_small"); m_panelStatistics->Layout(); //m_buttonStartSync changed => this *is* required! @@ -566,9 +571,11 @@ CompareCfgDialog::CompareCfgDialog(wxWindow* parent, cmpConfigOut(cmpConfig), compareVar(cmpConfig.compareVar) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel)); + setRelativeFontSize(*m_toggleBtnTimeSize, 1.25); setRelativeFontSize(*m_toggleBtnContent, 1.25); @@ -678,24 +685,25 @@ GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* parent, xmlAccess::XmlGlobalSetti GlobalSettingsDlgGenerated(parent), settings(globalSettings) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel)); setRelativeFontSize(*m_staticTextHeader, 1.25); m_bitmapSettings ->SetBitmap (getResourceImage(L"settings")); - m_buttonResetDialogs->setBitmapFront(getResourceImage(L"warningSmall"), 5); + m_buttonResetDialogs->setBitmapFront(getResourceImage(L"reset_dialogs"), 5); m_bpButtonAddRow ->SetBitmapLabel(getResourceImage(L"item_add")); - m_bpButtonRemoveRow ->SetBitmapLabel(getResourceImage(L"item_delete")); + m_bpButtonRemoveRow ->SetBitmapLabel(getResourceImage(L"item_remove")); m_checkBoxCopyLocked ->SetValue(globalSettings.copyLockedFiles); m_checkBoxTransCopy ->SetValue(globalSettings.transactionalFileCopy); m_checkBoxCopyPermissions->SetValue(globalSettings.copyFilePermissions); -#ifdef FFS_WIN +#ifdef ZEN_WIN m_checkBoxCopyPermissions->SetLabel(_("Copy NTFS permissions")); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC m_checkBoxCopyLocked->Hide(); m_staticTextCopyLocked->Hide(); #endif @@ -757,7 +765,7 @@ void GlobalSettingsDlg::OnOkay(wxCommandEvent& event) void GlobalSettingsDlg::OnResetDialogs(wxCommandEvent& event) { if (showQuestionDlg(this, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL, - _("Make hidden warnings and dialogs visible again?"), QuestConfig().setLabelYes(_("&Restore"))) == ReturnQuestionDlg::BUTTON_YES) + _("Make hidden warnings and dialogs visible again?"), QuestConfig().setCaption(_("Restore hidden dialogs")).setLabelYes(_("&Restore"))) == ReturnQuestionDlg::BUTTON_YES) settings.optDialogs.resetDialogs(); } @@ -890,13 +898,14 @@ SelectTimespanDlg::SelectTimespanDlg(wxWindow* parent, Int64& timeFrom, Int64& t timeFrom_(timeFrom), timeTo_(timeTo) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOkay).setCancel(m_buttonCancel)); long style = wxCAL_SHOW_HOLIDAYS | wxCAL_SHOW_SURROUNDING_WEEKS; -#ifdef FFS_WIN +#ifdef ZEN_WIN DWORD firstDayOfWeek = 0; if (::GetLocaleInfo(LOCALE_USER_DEFAULT, //__in LCID Locale, LOCALE_IFIRSTDAYOFWEEK | // first day of week specifier, 0-6, 0=Monday, 6=Sunday diff --git a/ui/sorting.h b/ui/sorting.h index 28d2f931..46477d0f 100644 --- a/ui/sorting.h +++ b/ui/sorting.h @@ -17,16 +17,16 @@ namespace { struct CompileTimeReminder : public FSObjectVisitor { - virtual void visit(const FileMapping& fileObj) {} - virtual void visit(const SymLinkMapping& linkObj) {} - virtual void visit(const DirMapping& dirObj ) {} + virtual void visit(const FilePair& fileObj) {} + virtual void visit(const SymlinkPair& linkObj) {} + virtual void visit(const DirPair& dirObj ) {} } checkDymanicCasts; //just a compile-time reminder to manually check dynamic casts in this file when needed } inline -bool isDirectoryMapping(const FileSystemObject& fsObj) +bool isDirectoryPair(const FileSystemObject& fsObj) { - return dynamic_cast(&fsObj) != nullptr; + return dynamic_cast(&fsObj) != nullptr; } @@ -40,16 +40,16 @@ bool lessShortFileName(const FileSystemObject& a, const FileSystemObject& b) return true; //empty rows always last - if (isDirectoryMapping(a)) //sort directories by relative name + if (isDirectoryPair(a)) //sort directories by relative name { - if (isDirectoryMapping(b)) + if (isDirectoryPair(b)) return LessFilename()(a.getRelativeName(), b.getRelativeName()); else return false; } else { - if (isDirectoryMapping(b)) + if (isDirectoryPair(b)) return true; else return makeSortDirection(LessFilename(), Int2Type())(a.getShortName(), b.getShortName()); @@ -60,12 +60,12 @@ bool lessShortFileName(const FileSystemObject& a, const FileSystemObject& b) template //side currently unused! bool lessRelativeName(const FileSystemObject& a, const FileSystemObject& b) { - const bool isDirectoryA = isDirectoryMapping(a); + const bool isDirectoryA = isDirectoryPair(a); const Zstring& relDirNameA = isDirectoryA ? a.getObjRelativeName() : //directory beforeLast(a.getObjRelativeName(), FILE_NAME_SEPARATOR); //returns empty string if ch not found - const bool isDirectoryB = isDirectoryMapping(b); + const bool isDirectoryB = isDirectoryPair(b); const Zstring& relDirNameB = isDirectoryB ? b.getObjRelativeName() : //directory beforeLast(b.getObjRelativeName(), FILE_NAME_SEPARATOR); //returns empty string if ch not found @@ -95,8 +95,8 @@ bool lessFilesize(const FileSystemObject& a, const FileSystemObject& b) else if (b.isEmpty()) return true; - const bool isDirA = dynamic_cast(&a) != nullptr; - const bool isDirB = dynamic_cast(&b) != nullptr; + const bool isDirA = dynamic_cast(&a) != nullptr; + const bool isDirB = dynamic_cast(&b) != nullptr; //directories second last if (isDirA) @@ -104,8 +104,8 @@ bool lessFilesize(const FileSystemObject& a, const FileSystemObject& b) else if (isDirB) return true; - const FileMapping* fileObjA = dynamic_cast(&a); - const FileMapping* fileObjB = dynamic_cast(&b); + const FilePair* fileObjA = dynamic_cast(&a); + const FilePair* fileObjB = dynamic_cast(&b); //then symlinks if (!fileObjA) @@ -127,11 +127,11 @@ bool lessFiletime(const FileSystemObject& a, const FileSystemObject& b) return true; //empty rows always last - const FileMapping* fileObjA = dynamic_cast(&a); - const FileMapping* fileObjB = dynamic_cast(&b); + const FilePair* fileObjA = dynamic_cast(&a); + const FilePair* fileObjB = dynamic_cast(&b); - const SymLinkMapping* linkObjA = dynamic_cast(&a); - const SymLinkMapping* linkObjB = dynamic_cast(&b); + const SymlinkPair* linkObjA = dynamic_cast(&a); + const SymlinkPair* linkObjB = dynamic_cast(&b); if (!fileObjA && !linkObjA) return false; //directories last @@ -154,9 +154,9 @@ bool lessExtension(const FileSystemObject& a, const FileSystemObject& b) else if (b.isEmpty()) return true; //empty rows always last - if (dynamic_cast(&a)) + if (dynamic_cast(&a)) return false; //directories last - else if (dynamic_cast(&b)) + else if (dynamic_cast(&b)) return true; //directories last auto getExtension = [&](const FileSystemObject& fsObj) -> Zstring diff --git a/ui/sync_cfg.cpp b/ui/sync_cfg.cpp index dc62b04a..806914a3 100644 --- a/ui/sync_cfg.cpp +++ b/ui/sync_cfg.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "gui_generated.h" #include "exec_finished_box.h" #include "dir_name.h" @@ -34,15 +35,15 @@ public: ExecWhenFinishedCfg* execWhenFinished); //optional input parameter private: - virtual void OnSyncAutomatic(wxCommandEvent& event) { directionCfg.var = DirectionConfig::AUTOMATIC; updateGui(); } - virtual void OnSyncMirror (wxCommandEvent& event) { directionCfg.var = DirectionConfig::MIRROR; updateGui(); } - virtual void OnSyncUpdate (wxCommandEvent& event) { directionCfg.var = DirectionConfig::UPDATE; updateGui(); } - virtual void OnSyncCustom (wxCommandEvent& event) { directionCfg.var = DirectionConfig::CUSTOM; updateGui(); } + virtual void OnSyncTwoWay(wxCommandEvent& event) { directionCfg.var = DirectionConfig::AUTOMATIC; updateGui(); } + virtual void OnSyncMirror(wxCommandEvent& event) { directionCfg.var = DirectionConfig::MIRROR; updateGui(); } + virtual void OnSyncUpdate(wxCommandEvent& event) { directionCfg.var = DirectionConfig::UPDATE; updateGui(); } + virtual void OnSyncCustom(wxCommandEvent& event) { directionCfg.var = DirectionConfig::CUSTOM; updateGui(); } - virtual void OnSyncAutomaticDouble(wxMouseEvent& event); - virtual void OnSyncMirrorDouble (wxMouseEvent& event); - virtual void OnSyncUpdateDouble (wxMouseEvent& event); - virtual void OnSyncCustomDouble (wxMouseEvent& event); + virtual void OnSyncTwoWayDouble(wxMouseEvent& event); + virtual void OnSyncMirrorDouble(wxMouseEvent& event); + virtual void OnSyncUpdateDouble(wxMouseEvent& event); + virtual void OnSyncCustomDouble(wxMouseEvent& event); virtual void OnExLeftSideOnly (wxCommandEvent& event); virtual void OnExRightSideOnly(wxCommandEvent& event); @@ -107,15 +108,15 @@ void updateConfigIcons(const DirectionConfig& directionCfg, switch (dirCfg.exLeftSideOnly) { case SYNC_DIR_RIGHT: - buttonLeftOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"createRight"))); + buttonLeftOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_create_right"))); buttonLeftOnly->SetToolTip(getSyncOpDescription(SO_CREATE_NEW_RIGHT)); break; case SYNC_DIR_LEFT: - buttonLeftOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"deleteLeft"))); + buttonLeftOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_delete_left"))); buttonLeftOnly->SetToolTip(getSyncOpDescription(SO_DELETE_LEFT)); break; case SYNC_DIR_NONE: - buttonLeftOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"none"))); + buttonLeftOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); buttonLeftOnly->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); break; } @@ -123,15 +124,15 @@ void updateConfigIcons(const DirectionConfig& directionCfg, switch (dirCfg.exRightSideOnly) { case SYNC_DIR_RIGHT: - buttonRightOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"deleteRight"))); + buttonRightOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_delete_right"))); buttonRightOnly->SetToolTip(getSyncOpDescription(SO_DELETE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonRightOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"createLeft"))); + buttonRightOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_create_left"))); buttonRightOnly->SetToolTip(getSyncOpDescription(SO_CREATE_NEW_LEFT)); break; case SYNC_DIR_NONE: - buttonRightOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"none"))); + buttonRightOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); buttonRightOnly->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); break; } @@ -139,15 +140,15 @@ void updateConfigIcons(const DirectionConfig& directionCfg, switch (dirCfg.leftNewer) { case SYNC_DIR_RIGHT: - buttonLeftNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"updateRight"))); + buttonLeftNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_right"))); buttonLeftNewer->SetToolTip(getSyncOpDescription(SO_OVERWRITE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonLeftNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"updateLeft"))); + buttonLeftNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_left"))); buttonLeftNewer->SetToolTip(getSyncOpDescription(SO_OVERWRITE_LEFT)); break; case SYNC_DIR_NONE: - buttonLeftNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"none"))); + buttonLeftNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); buttonLeftNewer->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); break; } @@ -155,15 +156,15 @@ void updateConfigIcons(const DirectionConfig& directionCfg, switch (dirCfg.rightNewer) { case SYNC_DIR_RIGHT: - buttonRightNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"updateRight"))); + buttonRightNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_right"))); buttonRightNewer->SetToolTip(getSyncOpDescription(SO_OVERWRITE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonRightNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"updateLeft"))); + buttonRightNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_left"))); buttonRightNewer->SetToolTip(getSyncOpDescription(SO_OVERWRITE_LEFT)); break; case SYNC_DIR_NONE: - buttonRightNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"none"))); + buttonRightNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); buttonRightNewer->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); break; } @@ -171,15 +172,15 @@ void updateConfigIcons(const DirectionConfig& directionCfg, switch (dirCfg.different) { case SYNC_DIR_RIGHT: - buttonDifferent->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"updateRight"))); + buttonDifferent->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_right"))); buttonDifferent->SetToolTip(getSyncOpDescription(SO_OVERWRITE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonDifferent->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"updateLeft"))); + buttonDifferent->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_left"))); buttonDifferent->SetToolTip(getSyncOpDescription(SO_OVERWRITE_LEFT)); break; case SYNC_DIR_NONE: - buttonDifferent->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"none"))); + buttonDifferent->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); buttonDifferent->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); break; } @@ -187,15 +188,15 @@ void updateConfigIcons(const DirectionConfig& directionCfg, switch (dirCfg.conflict) { case SYNC_DIR_RIGHT: - buttonConflict->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"updateRight"))); + buttonConflict->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_right"))); buttonConflict->SetToolTip(getSyncOpDescription(SO_OVERWRITE_RIGHT)); break; case SYNC_DIR_LEFT: - buttonConflict->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"updateLeft"))); + buttonConflict->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_left"))); buttonConflict->SetToolTip(getSyncOpDescription(SO_OVERWRITE_LEFT)); break; case SYNC_DIR_NONE: - buttonConflict->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"conflict"))); //silent dependency to algorithm.cpp::Redetermine!!! + buttonConflict->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"cat_conflict"))); //silent dependency to algorithm.cpp::Redetermine!!! buttonConflict->SetToolTip(_("Leave as unresolved conflict")); break; } @@ -217,22 +218,28 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent, compareVar_(compareVar), versioningFolder(*m_panelVersioning, *m_buttonSelectDirVersioning, *m_versioningFolder/*, m_staticTextResolvedPath*/) { -#ifdef FFS_WIN +#ifdef ZEN_WIN new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" #endif + setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOK).setCancel(m_buttonCancel)); + //set icons for this dialog - m_bitmapLeftOnly ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"leftOnly" )))); - m_bitmapRightOnly ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"rightOnly" )))); - m_bitmapLeftNewer ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"leftNewer" )))); - m_bitmapRightNewer->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"rightNewer")))); - m_bitmapDifferent ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"different" )))); - m_bitmapConflict ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"conflict" )))); + m_bitmapLeftOnly ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_left_only" )))); + m_bitmapRightOnly ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_right_only" )))); + m_bitmapLeftNewer ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_left_newer" )))); + m_bitmapRightNewer->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_right_newer")))); + m_bitmapDifferent ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_different" )))); + m_bitmapConflict ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_conflict" )))); m_bitmapDatabase ->SetBitmap(getResourceImage(L"database")); - setRelativeFontSize(*m_toggleBtnAutomatic, 1.25); - setRelativeFontSize(*m_toggleBtnMirror, 1.25); - setRelativeFontSize(*m_toggleBtnUpdate, 1.25); - setRelativeFontSize(*m_toggleBtnCustom, 1.25); + m_toggleBtnTwoWay->SetLabel(L"<- " + _("Two way") + L" ->"); + m_toggleBtnMirror->SetLabel( _("Mirror") + L" ->>"); + m_toggleBtnUpdate->SetLabel( _("Update") + L" ->"); + + setRelativeFontSize(*m_toggleBtnTwoWay, 1.25); + setRelativeFontSize(*m_toggleBtnMirror, 1.25); + setRelativeFontSize(*m_toggleBtnUpdate, 1.25); + setRelativeFontSize(*m_toggleBtnCustom, 1.25); enumVersioningStyle. add(VER_STYLE_REPLACE, _("Replace"), _("Move files and replace if existing")). @@ -345,15 +352,15 @@ void SyncCfgDialog::updateGui() m_staticTextUpdate ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); m_staticTextCustom ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); - m_toggleBtnAutomatic->SetValue(false); - m_toggleBtnMirror ->SetValue(false); - m_toggleBtnUpdate ->SetValue(false); - m_toggleBtnCustom ->SetValue(false); + m_toggleBtnTwoWay->SetValue(false); + m_toggleBtnMirror->SetValue(false); + m_toggleBtnUpdate->SetValue(false); + m_toggleBtnCustom->SetValue(false); switch (cfg.syncCfg.directionCfg.var) { case DirectionConfig::AUTOMATIC: - m_toggleBtnAutomatic->SetValue(true); + m_toggleBtnTwoWay->SetValue(true); m_staticTextAutomatic->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); break; case DirectionConfig::MIRROR: @@ -454,10 +461,10 @@ void SyncCfgDialog::OnApply(wxCommandEvent& event) } -void SyncCfgDialog::OnSyncAutomaticDouble(wxMouseEvent& event) +void SyncCfgDialog::OnSyncTwoWayDouble(wxMouseEvent& event) { wxCommandEvent dummy; - OnSyncAutomatic(dummy); + OnSyncTwoWay(dummy); OnApply(dummy); } diff --git a/ui/taskbar.cpp b/ui/taskbar.cpp index 8613643e..0e019d04 100644 --- a/ui/taskbar.cpp +++ b/ui/taskbar.cpp @@ -6,7 +6,7 @@ #include "taskbar.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include #include "Taskbar_Seven/taskbar.h" @@ -14,7 +14,7 @@ #elif defined HAVE_UBUNTU_UNITY #include -#elif defined FFS_MAC +#elif defined ZEN_MAC #include #include #include "osx_dock.h" @@ -23,7 +23,7 @@ using namespace zen; -#ifdef FFS_WIN +#ifdef ZEN_WIN using namespace tbseven; @@ -129,7 +129,7 @@ private: UnityLauncherEntry* tbEntry; }; -#elif defined FFS_MAC +#elif defined ZEN_MAC class Taskbar::Pimpl { public: @@ -150,9 +150,9 @@ private: { try { - osx::dockIconSetText(str); //throw OsxError + osx::dockIconSetText(str); //throw SysError } - catch (const osx::OsxError& e) { assert(false); } + catch (const zen::SysError& e) { assert(false); } } }; diff --git a/ui/tray_icon.cpp b/ui/tray_icon.cpp index 58b24697..6a9c640c 100644 --- a/ui/tray_icon.cpp +++ b/ui/tray_icon.cpp @@ -181,9 +181,9 @@ private: FfsTrayIcon::FfsTrayIcon() : trayIcon(new TaskBarImpl(*this)), fractionLast(1), //show FFS logo by default -#if defined FFS_WIN || defined FFS_MAC //16x16 seems to be the only size that is shown correctly on OS X +#if defined ZEN_WIN || defined ZEN_MAC //16x16 seems to be the only size that is shown correctly on OS X logo(getResourceImage(L"FFS_tray_16x16").ConvertToImage()) -#elif defined FFS_LINUX +#elif defined ZEN_LINUX logo(getResourceImage(L"FFS_tray_24x24").ConvertToImage()) #endif { diff --git a/ui/tree_view.cpp b/ui/tree_view.cpp index cf866a71..10037380 100644 --- a/ui/tree_view.cpp +++ b/ui/tree_view.cpp @@ -40,7 +40,7 @@ void TreeView::extractVisibleSubtree(HierarchyObject& hierObj, //in TreeView::Container& cont, //out Function pred) { - auto getBytes = [](const FileMapping& fileObj) -> UInt64 //MSVC screws up miserably if we put this lambda into std::for_each + auto getBytes = [](const FilePair& fileObj) -> UInt64 //MSVC screws up miserably if we put this lambda into std::for_each { //give accumulated bytes the semantics of a sync preview! if (fileObj.isActive()) @@ -58,7 +58,7 @@ void TreeView::extractVisibleSubtree(HierarchyObject& hierObj, //in cont.firstFileId = nullptr; std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), - [&](FileMapping& fileObj) + [&](FilePair& fileObj) { if (pred(fileObj)) { @@ -71,7 +71,7 @@ void TreeView::extractVisibleSubtree(HierarchyObject& hierObj, //in }); std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), - [&](SymLinkMapping& linkObj) + [&](SymlinkPair& linkObj) { if (pred(linkObj)) { @@ -87,7 +87,7 @@ void TreeView::extractVisibleSubtree(HierarchyObject& hierObj, //in cont.subDirs.reserve(hierObj.refSubDirs().size()); //avoid expensive reallocations! std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(), - [&cont, pred](DirMapping& subDirObj) + [&cont, pred](DirPair& subDirObj) { const bool included = pred(subDirObj); @@ -172,8 +172,8 @@ struct TreeView::LessShortName case TreeView::TYPE_DIRECTORY: { - const auto* dirObjL = dynamic_cast(FileSystemObject::retrieve(static_cast(lhs.node_)->objId)); - const auto* dirObjR = dynamic_cast(FileSystemObject::retrieve(static_cast(rhs.node_)->objId)); + const auto* dirObjL = dynamic_cast(FileSystemObject::retrieve(static_cast(lhs.node_)->objId)); + const auto* dirObjR = dynamic_cast(FileSystemObject::retrieve(static_cast(rhs.node_)->objId)); if (!dirObjL) //might be pathologic, but it's covered return false; @@ -279,10 +279,10 @@ void TreeView::applySubView(std::vector&& newView) switch (tl.type_) { case TreeView::TYPE_ROOT: - return static_cast(tl.node_)->baseMap.get(); + return static_cast(tl.node_)->baseDirObj.get(); case TreeView::TYPE_DIRECTORY: - if (auto dirObj = dynamic_cast(FileSystemObject::retrieve(static_cast(tl.node_)->objId))) + if (auto dirObj = dynamic_cast(FileSystemObject::retrieve(static_cast(tl.node_)->objId))) return dirObj; break; @@ -353,7 +353,7 @@ void TreeView::updateView(Predicate pred) newView.reserve(folderCmp.size()); //avoid expensive reallocations! std::for_each(folderCmp.begin(), folderCmp.end(), - [&](const std::shared_ptr& baseObj) + [&](const std::shared_ptr& baseObj) { newView.push_back(TreeView::RootNodeImpl()); RootNodeImpl& root = newView.back(); @@ -365,7 +365,7 @@ void TreeView::updateView(Predicate pred) newView.pop_back(); else { - root.baseMap = baseObj; + root.baseDirObj = baseObj; this->compressNode(root); //"this->" required by two-pass lookup as enforced by GCC 4.7 } }); @@ -560,22 +560,22 @@ void TreeView::updateSyncPreview(bool hideFiltered, switch (fsObj.getSyncOperation()) { case SO_CREATE_NEW_LEFT: - case SO_MOVE_LEFT_TARGET: return syncCreateLeftActive; case SO_CREATE_NEW_RIGHT: - case SO_MOVE_RIGHT_TARGET: return syncCreateRightActive; case SO_DELETE_LEFT: - case SO_MOVE_LEFT_SOURCE: return syncDeleteLeftActive; case SO_DELETE_RIGHT: - case SO_MOVE_RIGHT_SOURCE: return syncDeleteRightActive; case SO_OVERWRITE_RIGHT: case SO_COPY_METADATA_TO_RIGHT: + case SO_MOVE_RIGHT_SOURCE: + case SO_MOVE_RIGHT_TARGET: return syncDirOverwRightActive; case SO_OVERWRITE_LEFT: case SO_COPY_METADATA_TO_LEFT: + case SO_MOVE_LEFT_SOURCE: + case SO_MOVE_LEFT_TARGET: return syncDirOverwLeftActive; case SO_DO_NOTHING: return syncDirNoneActive; @@ -597,7 +597,7 @@ void TreeView::setData(FolderComparison& newData) folderCmp = newData; //remove truly empty folder pairs as early as this: we want to distinguish single/multiple folder pair cases by looking at "folderCmp" - vector_remove_if(folderCmp, [](const std::shared_ptr& baseObj) + vector_remove_if(folderCmp, [](const std::shared_ptr& baseObj) { return baseObj->getBaseDirPf().empty() && baseObj->getBaseDirPf().empty(); @@ -617,14 +617,14 @@ std::unique_ptr TreeView::getLine(size_t row) const case TreeView::TYPE_ROOT: { const auto* root = static_cast(flatTree[row].node_); - return make_unique(percent, root->bytesGross, root->itemCountGross, getStatus(row), *(root->baseMap)); + return make_unique(percent, root->bytesGross, root->itemCountGross, getStatus(row), *(root->baseDirObj)); } break; case TreeView::TYPE_DIRECTORY: { const auto* dir = static_cast(flatTree[row].node_); - if (auto dirObj = dynamic_cast(FileSystemObject::retrieve(dir->objId))) + if (auto dirObj = dynamic_cast(FileSystemObject::retrieve(dir->objId))) return make_unique(percent, dir->bytesGross, dir->itemCountGross, level, getStatus(row), *dirObj); } break; @@ -732,7 +732,7 @@ const wxColour COLOR_LEVEL0(0xcc, 0xcc, 0xff); const wxColour COLOR_LEVEL1(0xcc, 0xff, 0xcc); const wxColour COLOR_LEVEL2(0xff, 0xff, 0x99); -const wxColour COLOR_LEVEL3(0xcc, 0xff, 0xff); +const wxColour COLOR_LEVEL3(0xcc, 0xcc, 0xcc); const wxColour COLOR_LEVEL4(0xff, 0xcc, 0xff); const wxColour COLOR_LEVEL5(0x99, 0xff, 0xcc); @@ -741,7 +741,7 @@ const wxColour COLOR_LEVEL7(0xff, 0xcc, 0xcc); const wxColour COLOR_LEVEL8(0xcc, 0xff, 0x99); const wxColour COLOR_LEVEL9 (0xff, 0xff, 0xcc); -const wxColour COLOR_LEVEL10(0xcc, 0xcc, 0xcc); +const wxColour COLOR_LEVEL10(0xcc, 0xff, 0xff); const wxColour COLOR_LEVEL11(0xff, 0xcc, 0x99); const wxColour COLOR_PERCENTAGE_BORDER (198, 198, 198); @@ -793,8 +793,8 @@ private: if (std::unique_ptr node = treeDataView_->getLine(row)) if (const TreeView::RootNode* root = dynamic_cast(node.get())) { - const wxString& dirLeft = utfCvrtTo(root->baseMap_.getBaseDirPf()); - const wxString& dirRight = utfCvrtTo(root->baseMap_.getBaseDirPf()); + const wxString& dirLeft = utfCvrtTo(root->baseDirObj_.getBaseDirPf()); + const wxString& dirRight = utfCvrtTo(root->baseDirObj_.getBaseDirPf()); if (dirLeft.empty()) return dirRight; else if (dirRight.empty()) @@ -818,8 +818,8 @@ private: case COL_TYPE_NAVI_DIRECTORY: if (const TreeView::RootNode* root = dynamic_cast(node.get())) - return getShortDisplayNameForFolderPair(root->baseMap_.getBaseDirPf(), - root->baseMap_.getBaseDirPf()); + return getShortDisplayNameForFolderPair(root->baseDirObj_.getBaseDirPf(), + root->baseDirObj_.getBaseDirPf()); else if (const TreeView::DirNode* dir = dynamic_cast(node.get())) return utfCvrtTo(dir->dirObj_.getObjShortName()); else if (dynamic_cast(node.get())) diff --git a/ui/tree_view.h b/ui/tree_view.h index 9ea7d0e4..d7289d17 100644 --- a/ui/tree_view.h +++ b/ui/tree_view.h @@ -76,14 +76,14 @@ public: struct DirNode : public Node { - DirNode(int percent, UInt64 bytes, int itemCount, size_t level, NodeStatus status, DirMapping& dirObj) : Node(percent, bytes, itemCount, level, status), dirObj_(dirObj) {} - DirMapping& dirObj_; + DirNode(int percent, UInt64 bytes, int itemCount, size_t level, NodeStatus status, DirPair& dirObj) : Node(percent, bytes, itemCount, level, status), dirObj_(dirObj) {} + DirPair& dirObj_; }; struct RootNode : public Node { - RootNode(int percent, UInt64 bytes, int itemCount, NodeStatus status, BaseDirMapping& baseMap) : Node(percent, bytes, itemCount, 0, status), baseMap_(baseMap) {} - BaseDirMapping& baseMap_; + RootNode(int percent, UInt64 bytes, int itemCount, NodeStatus status, BaseDirPair& baseDirObj) : Node(percent, bytes, itemCount, 0, status), baseDirObj_(baseDirObj) {} + BaseDirPair& baseDirObj_; }; std::unique_ptr getLine(size_t row) const; //return nullptr on error @@ -110,7 +110,7 @@ private: int itemCountNet; //number of files on view for in this directory only std::vector subDirs; - FileSystemObject::ObjectId firstFileId; //weak pointer to first FileMapping or SymLinkMapping + FileSystemObject::ObjectId firstFileId; //weak pointer to first FilePair or SymlinkPair //- "compress" algorithm may hide file nodes for directories with a single included file, i.e. itemCountGross == itemCountNet == 1 //- a HierarchyObject* would a better fit, but we need weak pointer semantics! //- a std::vector would be a better design, but we don't want a second memory structure as large as custom grid! @@ -119,13 +119,13 @@ private: struct DirNodeImpl : public Container { DirNodeImpl() : objId(nullptr) {} - FileSystemObject::ObjectId objId; //weak pointer to DirMapping + FileSystemObject::ObjectId objId; //weak pointer to DirPair }; struct RootNodeImpl : public Container { RootNodeImpl() {} - std::shared_ptr baseMap; + std::shared_ptr baseDirObj; }; enum NodeType @@ -164,7 +164,7 @@ private: /* /|\ | (update...) | */ - std::vector> folderCmp; //full raw data + std::vector> folderCmp; //full raw data ColumnTypeNavi sortColumn; bool sortAscending; diff --git a/version/version.h b/version/version.h index 37cdffc2..9dc395a8 100644 --- a/version/version.h +++ b/version/version.h @@ -3,7 +3,7 @@ namespace zen { -const wchar_t currentVersion[] = L"5.16"; //internal linkage! +const wchar_t currentVersion[] = L"5.17"; //internal linkage! } #endif diff --git a/wx+/choice_enum.h b/wx+/choice_enum.h index adef88cc..f780af87 100644 --- a/wx+/choice_enum.h +++ b/wx+/choice_enum.h @@ -64,12 +64,7 @@ template void updateTooltipEnumVal(const EnumDescrList& mappi - - - - - -//--------------- inline impelementation ------------------------------------------- +//--------------- impelementation ------------------------------------------- template void setEnumVal(const EnumDescrList& mapping, wxChoice& ctrl, Enum value) { diff --git a/wx+/grid.cpp b/wx+/grid.cpp index a0af0671..46c0c406 100644 --- a/wx+/grid.cpp +++ b/wx+/grid.cpp @@ -20,7 +20,7 @@ #include "image_tools.h" #include "rtl.h" -#ifdef FFS_LINUX +#ifdef ZEN_LINUX #include #endif @@ -939,6 +939,7 @@ public: void setCursor(size_t row, size_t compPos) { cursor = std::make_pair(row, compPos); + activeSelection.reset(); //e.g. user might search with F3 while holding down left mouse button selectionAnchor = row; } std::pair getCursor() const { return cursor; } // (row, component position) @@ -1781,9 +1782,9 @@ void Grid::showScrollBars(Grid::ScrollBarStatus horizontal, Grid::ScrollBarStatu showScrollbarX = horizontal; showScrollbarY = vertical; -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC //handled by Grid::SetScrollbar -#elif defined FFS_LINUX //get rid of scrollbars, but preserve scrolling behavior! +#elif defined ZEN_LINUX //get rid of scrollbars, but preserve scrolling behavior! //the following wxGTK approach is pretty much identical to wxWidgets 2.9 ShowScrollbars() code! auto mapStatus = [](ScrollBarStatus sbStatus) -> GtkPolicyType @@ -1834,7 +1835,7 @@ void Grid::showScrollBars(Grid::ScrollBarStatus horizontal, Grid::ScrollBarStatu */ } -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC void Grid::SetScrollbar(int orientation, int position, int thumbSize, int range, bool refresh) { ScrollBarStatus sbStatus = SB_SHOW_AUTOMATIC; @@ -1866,7 +1867,7 @@ void Grid::SetScrollbar(int orientation, int position, int thumbSize, int range, #endif //get rid of scrollbars, but preserve scrolling behavior! -#ifdef FFS_WIN +#ifdef ZEN_WIN #ifdef __MINGW32__ //MinGW is clueless... #define WM_MOUSEHWHEEL 0x020E #endif diff --git a/wx+/grid.h b/wx+/grid.h index a5082039..1faa0bce 100644 --- a/wx+/grid.h +++ b/wx+/grid.h @@ -204,11 +204,11 @@ private: virtual wxSize GetSizeAvailableForScrollTarget(const wxSize& size); //required since wxWidgets 2.9 if SetTargetWindow() is used -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC virtual void SetScrollbar(int orientation, int position, int thumbSize, int range, bool refresh); //get rid of scrollbars, but preserve scrolling behavior! #endif -#ifdef FFS_WIN +#ifdef ZEN_WIN virtual WXLRESULT MSWDefWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam); //support horizontal mouse wheel #endif diff --git a/wx+/shell_execute.h b/wx+/shell_execute.h index a069fdb3..8965186e 100644 --- a/wx+/shell_execute.h +++ b/wx+/shell_execute.h @@ -13,12 +13,12 @@ #include #include -#ifdef FFS_WIN -#include +#ifdef ZEN_WIN +#include //#include #include //includes "windows.h" -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include #include //::system() //#include @@ -40,7 +40,7 @@ namespace { void shellExecute(const Zstring& command, ExecutionType type = EXEC_TYPE_ASYNC) { -#ifdef FFS_WIN +#ifdef ZEN_WIN //parse commandline std::vector argv; int argc = 0; @@ -74,7 +74,7 @@ void shellExecute(const Zstring& command, ExecutionType type = EXEC_TYPE_ASYNC) if (!::ShellExecuteEx(&execInfo)) //__inout LPSHELLEXECUTEINFO lpExecInfo { wxString cmdFmt = L"File: " + filename + L"\nArg: " + arguments; - wxMessageBox(_("Invalid command line:") + L"\n" + cmdFmt + L"\n\n" + getLastErrorFormatted()); + wxMessageBox(_("Invalid command line:") + L"\n" + cmdFmt + L"\n\n" + formatSystemError(L"ShellExecuteEx", getLastError())); return; } @@ -86,7 +86,7 @@ void shellExecute(const Zstring& command, ExecutionType type = EXEC_TYPE_ASYNC) ::WaitForSingleObject(execInfo.hProcess, INFINITE); } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC /* we cannot use wxExecute due to various issues: - screws up encoding on OS X for non-ASCII characters diff --git a/wx+/std_button_order.h b/wx+/std_button_order.h new file mode 100644 index 00000000..71fc2334 --- /dev/null +++ b/wx+/std_button_order.h @@ -0,0 +1,140 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * +// ************************************************************************** + +#ifndef STD_BUTTON_ORDER_H_18347032147831732143214 +#define STD_BUTTON_ORDER_H_18347032147831732143214 + +#include +#include + +namespace zen +{ +struct StdButtons +{ + StdButtons() : btnYes(nullptr), btnNo(nullptr), btnCancel(nullptr) {} + StdButtons& setAffirmative (wxButton* btn) { btnYes = btn; return *this; } + StdButtons& setNegative (wxButton* btn) { btnNo = btn; return *this; } + StdButtons& setCancel (wxButton* btn) { btnCancel = btn; return *this; } + + wxButton* btnYes; + wxButton* btnNo; + wxButton* btnCancel; +}; + +void setStandardButtonOrder(wxBoxSizer& sizer, const StdButtons& buttons = StdButtons()); +//sizer width will change! => call wxWindow::Fit and wxWindow::Layout + + + + + + + + + + + +//--------------- impelementation ------------------------------------------- +inline +void setStandardButtonOrder(wxBoxSizer& sizer, const StdButtons& buttons) +{ + assert(sizer.GetOrientation() == wxHORIZONTAL); + + StdButtons buttonsTmp = buttons; + + auto detach = [&](wxButton*& btn) + { + if (btn) + { + assert(btn->GetContainingSizer() == &sizer); + if (btn->IsShown()) + { + bool rv = sizer.Detach(btn); + assert(rv); + if (!rv) + btn = nullptr; + } + else + btn = nullptr; + } + }; + + detach(buttonsTmp.btnYes); + detach(buttonsTmp.btnNo); + detach(buttonsTmp.btnCancel); + +#if defined ZEN_WIN + //Windows User Experience Interaction Guidelines: http://msdn.microsoft.com/en-us/library/windows/desktop/aa511453.aspx#sizing + const int spaceH = 6; //OK + const int spaceRimH = 10; //OK + const int spaceRimV = 8; //compromise; consider additional top row from static line; exact values: top 8, bottom 9 +#elif defined ZEN_LINUX + //GNOME Human Interface Guidelines: https://developer.gnome.org/hig-book/3.2/hig-book.html#alert-spacing + const int spaceH = 6; //OK + const int spaceRimH = 12; //OK + const int spaceRimV = 12; //OK +#elif defined ZEN_MAC + //OS X Human Interface Guidelines: http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AppleHIGuidelines/Windows/Windows.html + const int spaceH = 14; //OK + const int spaceRimH = 20; //OK + const int spaceRimV = 11; //compromise; custom button height (of 30 pix) is considered, although the button is drawn smaller; otherwise 15 seems to have been optimal +#endif + + bool firstButtonSet = false; + auto attach = [&](wxButton* btn) + { + if (btn) + { + if (firstButtonSet) + sizer.Add(spaceH, 0); + else + firstButtonSet = true; + sizer.Add(btn, 0, wxTOP | wxBOTTOM | wxALIGN_CENTER_VERTICAL, spaceRimV); + assert(btn->GetSize().GetHeight() == 30); //see comment for OS X above + } + }; + + //set border on left considering existing items + if (sizer.GetChildren().GetCount() > 0) //for yet another retarded reason wxWidgets will have wxSizer::GetItem(0) cause an assert rather than just return nullptr as documented + if (wxSizerItem* item = sizer.GetItem(static_cast(0))) + { + assert(item->GetBorder() <= spaceRimV); //pragmatic check: other controls in the sizer should not have a larger border + int flag = item->GetFlag(); + if (flag & wxLEFT) + { + flag &= ~wxLEFT; + item->SetFlag(flag); + } + sizer.Insert(static_cast(0), spaceRimH, 0); + } + + sizer.Add(spaceRimH, 0); +#if defined ZEN_WIN + attach(buttonsTmp.btnYes); + attach(buttonsTmp.btnNo); + attach(buttonsTmp.btnCancel); + +#elif defined ZEN_LINUX + attach(buttonsTmp.btnNo); + attach(buttonsTmp.btnCancel); + attach(buttonsTmp.btnYes); + +#elif defined ZEN_MAC + if (buttonsTmp.btnNo) + { + attach(buttonsTmp.btnNo); + sizer.Add(42 - spaceH, 0); //OS X Human Interface Guidelines: "position it at least 24 pixels away from the safe buttons" -> however 42 is used in practice! + } + attach(buttonsTmp.btnCancel); + attach(buttonsTmp.btnYes); +#endif + sizer.Add(spaceRimH, 0); + + assert(buttonsTmp.btnCancel || buttonsTmp.btnYes); //OS X: there should be at least one button following the gap after the "dangerous" no-button +} +} + +#endif //STD_BUTTON_ORDER_H_18347032147831732143214 diff --git a/wx+/tooltip.cpp b/wx+/tooltip.cpp index 5dc64c90..ebf3c61c 100644 --- a/wx+/tooltip.cpp +++ b/wx+/tooltip.cpp @@ -43,7 +43,7 @@ public: this->Layout(); bSizer158->Fit(this); -#if defined FFS_WIN //prevent window stealing focus! +#if defined ZEN_WIN //prevent window stealing focus! Disable(); //= dark/grey text and image on Linux; no visible difference on OS X #endif } @@ -92,7 +92,7 @@ void Tooltip::hide() { if (tipWindow) { -#ifdef FFS_LINUX +#ifdef ZEN_LINUX //on wxGTK the tooltip is sometimes not shown again after it was hidden: e.g. drag-selection on middle grid tipWindow->Destroy(); //apply brute force: tipWindow = nullptr; // diff --git a/wx+/zlib_wrap.cpp b/wx+/zlib_wrap.cpp index cfa0f615..eccf8698 100644 --- a/wx+/zlib_wrap.cpp +++ b/wx+/zlib_wrap.cpp @@ -5,9 +5,9 @@ // ************************************************************************** #include "zlib_wrap.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include //not really a "nice" place to look for a stable solution -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include //let's pray this is the same version wxWidgets is linking against! #endif diff --git a/zen/FindFilePlus/FindFilePlus.vcxproj b/zen/FindFilePlus/FindFilePlus.vcxproj index b94174ac..d7dfe219 100644 --- a/zen/FindFilePlus/FindFilePlus.vcxproj +++ b/zen/FindFilePlus/FindFilePlus.vcxproj @@ -66,10 +66,8 @@ <_ProjectFileVersion>10.0.30319.1 OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ false diff --git a/zen/IFileOperation/FileOperation_Vista.vcxproj b/zen/IFileOperation/FileOperation_Vista.vcxproj index 4694a3a5..e5165514 100644 --- a/zen/IFileOperation/FileOperation_Vista.vcxproj +++ b/zen/IFileOperation/FileOperation_Vista.vcxproj @@ -67,10 +67,8 @@ <_ProjectFileVersion>10.0.30319.1 OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false OBJ\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ - false .\ OBJ\$(ProjectName)_$(Configuration)_$(Platform)\ false @@ -88,7 +86,7 @@ Disabled - WXINTL_NO_GETTEXT_MACRO;FFS_WIN;_DEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) + WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;_DEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -100,6 +98,7 @@ 4100;4996;4512 ../..;C:\Program Files\C++\boost true + zen/warn_static.h $(OutDir)$(TargetName)$(TargetExt) @@ -124,7 +123,7 @@ Disabled - WXINTL_NO_GETTEXT_MACRO;FFS_WIN;_DEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) + WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;_DEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -136,6 +135,7 @@ 4100;4996;4512 ../..;C:\Program Files\C++\boost true + zen/warn_static.h $(OutDir)$(TargetName)$(TargetExt) @@ -158,7 +158,7 @@ MaxSpeed true - WXINTL_NO_GETTEXT_MACRO;FFS_WIN;NDEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) + WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;NDEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true @@ -169,6 +169,7 @@ Speed 4100;4996;4512 ../..;C:\Program Files\C++\boost + zen/warn_static.h $(OutDir)$(TargetName)$(TargetExt) @@ -196,7 +197,7 @@ MaxSpeed true - WXINTL_NO_GETTEXT_MACRO;FFS_WIN;NDEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) + WXINTL_NO_GETTEXT_MACRO;ZEN_WIN;NDEBUG;_WINDOWS;_USRDLL;FILE_OP_DLL_EXPORTS;%(PreprocessorDefinitions) MultiThreaded true @@ -207,6 +208,7 @@ Speed 4100;4996;4512 ../..;C:\Program Files\C++\boost + zen/warn_static.h $(OutDir)$(TargetName)$(TargetExt) diff --git a/zen/IFileOperation/file_op.cpp b/zen/IFileOperation/file_op.cpp index 8816b502..218c6f99 100644 --- a/zen/IFileOperation/file_op.cpp +++ b/zen/IFileOperation/file_op.cpp @@ -31,13 +31,7 @@ using namespace zen; namespace { -struct Win32Error -{ - Win32Error(DWORD errorCode) : errorCode_(errorCode) {} - DWORD errorCode_; -}; - -std::vector getLockingProcesses(const wchar_t* filename); //throw Win32Error +std::vector getLockingProcesses(const wchar_t* filename); //throw SysError class RecyclerProgressCallback : public IFileOperationProgressSink @@ -167,13 +161,13 @@ private: }; -void moveToRecycleBin(const wchar_t* fileNames[], //throw ComError +void moveToRecycleBin(const wchar_t* fileNames[], //throw SysError size_t fileCount, fileop::RecyclerCallback callback, void* sink) { ComPtr fileOp; - ZEN_COM_CHECK(::CoCreateInstance(CLSID_FileOperation, //throw ComError + ZEN_COM_CHECK(::CoCreateInstance(CLSID_FileOperation, //throw SysError nullptr, CLSCTX_ALL, IID_PPV_ARGS(fileOp.init()))); @@ -196,7 +190,7 @@ void moveToRecycleBin(const wchar_t* fileNames[], //throw ComError ComPtr opProgress; *opProgress.init() = new (std::nothrow) RecyclerProgressCallback(callback, sink); if (!opProgress) - throw ComError(L"Error creating RecyclerProgressCallback.", E_OUTOFMEMORY); + throw SysError(formatComError(L"Error creating RecyclerProgressCallback.", E_OUTOFMEMORY)); DWORD callbackID = 0; ZEN_COM_CHECK(fileOp->Advise(opProgress.get(), &callbackID)); @@ -214,10 +208,10 @@ void moveToRecycleBin(const wchar_t* fileNames[], //throw ComError { continueExecution = callback(fileNames[i], sink); //should not throw! } - catch (...) { throw ComError(L"Unexpected exception in callback.", E_UNEXPECTED); } + catch (...) { throw SysError(formatComError(L"Unexpected exception in callback.", E_UNEXPECTED)); } if (!continueExecution) - throw ComError(L"Operation cancelled.", HRESULT_FROM_WIN32(ERROR_CANCELLED)); + throw SysError(formatComError(L"Operation cancelled.", HRESULT_FROM_WIN32(ERROR_CANCELLED))); } //create file/folder item object @@ -235,7 +229,7 @@ void moveToRecycleBin(const wchar_t* fileNames[], //throw ComError if (!somethingExists(fileNames[i])) continue; } - throw ComError(std::wstring(L"Error calling \"SHCreateItemFromParsingName\" for file:\n") + L"\'" + fileNames[i] + L"\'.", hr); + throw SysError(formatComError(std::wstring(L"Error calling \"SHCreateItemFromParsingName\" for file:\n") + L"\'" + fileNames[i] + L"\'.", hr)); } ZEN_COM_CHECK(fileOp->DeleteItem(psiFile.get(), nullptr)); @@ -251,24 +245,22 @@ void moveToRecycleBin(const wchar_t* fileNames[], //throw ComError { ZEN_COM_CHECK(fileOp->PerformOperations()); } - catch (const ComError&) + catch (const SysError&) { //first let's check if we have more detailed error information available if (const std::pair* lastError = opProgress->getLastError()) { - try //create an even better error message if we detect a locking issue: + std::vector processes; //create an even better error message if we detect a locking issue: + try { processes = getLockingProcesses(lastError->first.c_str()); /*throw SysError*/ } + catch (const SysError&) {} + + if (!processes.empty()) { - std::vector processes = getLockingProcesses(lastError->first.c_str()); //throw Win32Error - if (!processes.empty()) - { - std::wstring msg = L"The file \'" + lastError->first + L"\' is locked by another process:"; - std::for_each(processes.begin(), processes.end(), [&](const std::wstring& proc) { msg += L'\n'; msg += proc; }); - throw ComError(msg); //message is already descriptive enough, no need to add the HRESULT code - } + std::wstring errorMsg = L"The file \'" + lastError->first + L"\' is locked by another process:"; + std::for_each(processes.begin(), processes.end(), [&](const std::wstring& proc) { errorMsg += L'\n'; errorMsg += proc; }); + throw SysError(errorMsg); //message is descriptive enough, no need to evaluate HRESULT! } - catch (const Win32Error&) {} - - throw ComError(std::wstring(L"Error during \"PerformOperations\" for file:\n") + L"\'" + lastError->first + L"\'.", lastError->second); + throw SysError(formatComError(std::wstring(L"Error during \"PerformOperations\" for file:\n") + L"\'" + lastError->first + L"\'.", lastError->second)); } throw; } @@ -278,15 +270,15 @@ void moveToRecycleBin(const wchar_t* fileNames[], //throw ComError ZEN_COM_CHECK(fileOp->GetAnyOperationsAborted(&pfAnyOperationsAborted)); if (pfAnyOperationsAborted == TRUE) - throw ComError(L"Operation did not complete successfully."); + throw SysError(L"Operation did not complete successfully."); } -void copyFile(const wchar_t* sourceFile, //throw ComError +void copyFile(const wchar_t* sourceFile, //throw SysError const wchar_t* targetFile) { ComPtr fileOp; - ZEN_COM_CHECK(::CoCreateInstance(CLSID_FileOperation, //throw ComError + ZEN_COM_CHECK(::CoCreateInstance(CLSID_FileOperation, //throw SysError nullptr, CLSCTX_ALL, IID_PPV_ARGS(fileOp.init()))); @@ -295,7 +287,7 @@ void copyFile(const wchar_t* sourceFile, //throw ComError // from being shown to the user during the // operation. This includes error, confirmation // and progress dialogs. - ZEN_COM_CHECK(fileOp->SetOperationFlags(FOF_NOCONFIRMATION | //throw ComError + ZEN_COM_CHECK(fileOp->SetOperationFlags(FOF_NOCONFIRMATION | //throw SysError FOF_SILENT | FOFX_EARLYFAILURE | FOF_NOERRORUI)); @@ -306,12 +298,12 @@ void copyFile(const wchar_t* sourceFile, //throw ComError nullptr, IID_PPV_ARGS(psiSourceFile.init())); if (FAILED(hr)) - throw ComError(std::wstring(L"Error calling \"SHCreateItemFromParsingName\" for file:\n") + L"\'" + sourceFile + L"\'.", hr); + throw SysError(formatComError(std::wstring(L"Error calling \"SHCreateItemFromParsingName\" for file:\n") + L"\'" + sourceFile + L"\'.", hr)); } const size_t pos = std::wstring(targetFile).find_last_of(L'\\'); if (pos == std::wstring::npos) - throw ComError(L"Target filename does not contain a path separator."); + throw SysError(L"Target filename does not contain a path separator."); const std::wstring targetFolder(targetFile, pos); const std::wstring targetFileNameShort = targetFile + pos + 1; @@ -323,7 +315,7 @@ void copyFile(const wchar_t* sourceFile, //throw ComError nullptr, IID_PPV_ARGS(psiTargetFolder.init())); if (FAILED(hr)) - throw ComError(std::wstring(L"Error calling \"SHCreateItemFromParsingName\" for folder:\n") + L"\'" + targetFolder + L"\'.", hr); + throw SysError(formatComError(std::wstring(L"Error calling \"SHCreateItemFromParsingName\" for folder:\n") + L"\'" + targetFolder + L"\'.", hr)); } //schedule file copy operation @@ -337,14 +329,14 @@ void copyFile(const wchar_t* sourceFile, //throw ComError ZEN_COM_CHECK(fileOp->GetAnyOperationsAborted(&pfAnyOperationsAborted)); if (pfAnyOperationsAborted == TRUE) - throw ComError(L"Operation did not complete successfully."); + throw SysError(L"Operation did not complete successfully."); } -void getFolderClsid(const wchar_t* dirname, CLSID& pathCLSID) //throw ComError +void getFolderClsid(const wchar_t* dirname, CLSID& pathCLSID) //throw SysError { ComPtr desktopFolder; - ZEN_COM_CHECK(::SHGetDesktopFolder(desktopFolder.init())); //throw ComError + ZEN_COM_CHECK(::SHGetDesktopFolder(desktopFolder.init())); //throw SysError PIDLIST_RELATIVE pidlFolder = nullptr; ZEN_COM_CHECK(desktopFolder->ParseDisplayName(nullptr, // [in] HWND hwnd, @@ -358,53 +350,64 @@ void getFolderClsid(const wchar_t* dirname, CLSID& pathCLSID) //throw ComError ComPtr persistFolder; ZEN_COM_CHECK(desktopFolder->BindToObject(pidlFolder, // [in] PCUIDLIST_RELATIVE pidl, nullptr, // [in] IBindCtx *pbc, - IID_PPV_ARGS(persistFolder.init()))); //throw ComError + IID_PPV_ARGS(persistFolder.init()))); //throw SysError - ZEN_COM_CHECK(persistFolder->GetClassID(&pathCLSID)); //throw ComError + ZEN_COM_CHECK(persistFolder->GetClassID(&pathCLSID)); //throw SysError } -std::vector getLockingProcesses(const wchar_t* filename) //throw Win32Error +std::vector getLockingProcesses(const wchar_t* filename) //throw SysError { - wchar_t sessionKey[CCH_RM_SESSION_KEY + 1] = {}; //fixes two bugs: http://blogs.msdn.com/b/oldnewthing/archive/2012/02/17/10268840.aspx DWORD sessionHandle = 0; - DWORD rv1 = ::RmStartSession(&sessionHandle, //__out DWORD *pSessionHandle, - 0, //__reserved DWORD dwSessionFlags, - sessionKey); //__out WCHAR strSessionKey[ ] - if (rv1 != ERROR_SUCCESS) - throw Win32Error(rv1); + { + wchar_t sessionKey[CCH_RM_SESSION_KEY + 1] = {}; //fixes two bugs: http://blogs.msdn.com/b/oldnewthing/archive/2012/02/17/10268840.aspx + DWORD rv1 = ::RmStartSession(&sessionHandle, //__out DWORD *pSessionHandle, + 0, //__reserved DWORD dwSessionFlags, + sessionKey); //__out WCHAR strSessionKey[ ] + if (rv1 != ERROR_SUCCESS) + throw SysError(formatSystemError(L"RmStartSession", rv1)); + } ZEN_ON_SCOPE_EXIT(::RmEndSession(sessionHandle)); - DWORD rv2 = ::RmRegisterResources(sessionHandle, //__in DWORD dwSessionHandle, - 1, //__in UINT nFiles, - &filename, //__in_opt LPCWSTR rgsFilenames[ ], - 0, //__in UINT nApplications, - nullptr, //__in_opt RM_UNIQUE_PROCESS rgApplications[ ], - 0, //__in UINT nServices, - nullptr); //__in_opt LPCWSTR rgsServiceNames[ ] - if (rv2 != ERROR_SUCCESS) - throw Win32Error(rv2); - - UINT procInfoSize = 0; - UINT procInfoSizeNeeded = 0; - DWORD rebootReasons = 0; - ::RmGetList(sessionHandle, &procInfoSizeNeeded, &procInfoSize, nullptr, &rebootReasons); //get procInfoSizeNeeded - //fails with "access denied" for C:\pagefile.sys! - - if (procInfoSizeNeeded == 0) - return std::vector(); - - procInfoSize = procInfoSizeNeeded; - std::vector procInfo(procInfoSize); - - DWORD rv3 = ::RmGetList(sessionHandle, //__in DWORD dwSessionHandle, - &procInfoSizeNeeded, //__out UINT *pnProcInfoNeeded, - &procInfoSize, //__inout UINT *pnProcInfo, - &procInfo[0], //__inout_opt RM_PROCESS_INFO rgAffectedApps[ ], - &rebootReasons); //__out LPDWORD lpdwRebootReasons - if (rv3 != ERROR_SUCCESS) - throw Win32Error(rv3); - procInfo.resize(procInfoSize); + { + DWORD rv2 = ::RmRegisterResources(sessionHandle, //__in DWORD dwSessionHandle, + 1, //__in UINT nFiles, + &filename, //__in_opt LPCWSTR rgsFilenames[ ], + 0, //__in UINT nApplications, + nullptr, //__in_opt RM_UNIQUE_PROCESS rgApplications[ ], + 0, //__in UINT nServices, + nullptr); //__in_opt LPCWSTR rgsServiceNames[ ] + if (rv2 != ERROR_SUCCESS) + throw SysError(formatSystemError(L"RmRegisterResources", rv2)); + } + + std::vector procInfo; + { + UINT procInfoSize = 0; + UINT procInfoSizeNeeded = 0; + DWORD rebootReasons = 0; + DWORD rv3 = ::RmGetList(sessionHandle, &procInfoSizeNeeded, &procInfoSize, nullptr, &rebootReasons); //get procInfoSizeNeeded + if (rv3 == ERROR_SUCCESS) + return std::vector(); + if (rv3 != ERROR_MORE_DATA) + throw SysError(formatSystemError(L"RmGetList", rv3)); + //C:\pagefile.sys fails with ERROR_SHARING_VIOLATION! + + if (procInfoSizeNeeded == 0) + return std::vector(); + + procInfoSize = procInfoSizeNeeded; + procInfo.resize(procInfoSizeNeeded); + + rv3 = ::RmGetList(sessionHandle, //__in DWORD dwSessionHandle, + &procInfoSizeNeeded, //__out UINT *pnProcInfoNeeded, + &procInfoSize, //__inout UINT *pnProcInfo, + &procInfo[0], //__inout_opt RM_PROCESS_INFO rgAffectedApps[ ], + &rebootReasons); //__out LPDWORD lpdwRebootReasons + if (rv3 != ERROR_SUCCESS) + throw SysError(formatSystemError(L"RmGetList", rv3)); + procInfo.resize(procInfoSize); + } std::vector output; for (auto iter = procInfo.begin(); iter != procInfo.end(); ++iter) @@ -437,7 +440,7 @@ std::vector getLockingProcesses(const wchar_t* filename) //throw W &buffer[0], //__out LPTSTR lpExeName, &bufferSize)) //__inout PDWORD lpdwSize if (bufferSize < buffer.size()) - processName += std::wstring(L" - ") + L"\'" + &buffer[0] + L"\'"; + processName += std::wstring(L", ") + L"\'" + &buffer[0] + L"\'"; } } output.push_back(processName); @@ -457,10 +460,10 @@ bool fileop::moveToRecycleBin(const wchar_t* fileNames[], { try { - ::moveToRecycleBin(fileNames, fileCount, callback, sink); //throw ComError + ::moveToRecycleBin(fileNames, fileCount, callback, sink); //throw SysError return true; } - catch (const ComError& e) + catch (const SysError& e) { lastErrorMessage.reset(new std::wstring(e.toString())); return false; @@ -473,10 +476,10 @@ bool fileop::copyFile(const wchar_t* sourceFile, { try { - ::copyFile(sourceFile, targetFile); //throw ComError + ::copyFile(sourceFile, targetFile); //throw SysError return true; } - catch (const ComError& e) + catch (const SysError& e) { lastErrorMessage.reset(new std::wstring(e.toString())); return false; @@ -489,11 +492,11 @@ bool fileop::checkRecycler(const wchar_t* dirname, bool& isRecycler) try { CLSID clsid = {}; - getFolderClsid(dirname, clsid); //throw ComError + getFolderClsid(dirname, clsid); //throw SysError isRecycler = ::IsEqualCLSID(clsid, CLSID_RecycleBin) == TRUE; //silence perf warning return true; } - catch (const ComError& e) + catch (const SysError& e) { lastErrorMessage.reset(new std::wstring(e.toString())); return false; @@ -511,7 +514,7 @@ bool fileop::getLockingProcesses(const wchar_t* filename, const wchar_t*& procLi { try { - std::vector processes = ::getLockingProcesses(filename); //throw Win32Error + std::vector processes = ::getLockingProcesses(filename); //throw SysError std::wstring buffer; std::for_each(processes.begin(), processes.end(), [&](const std::wstring& proc) { buffer += proc; buffer += L'\n'; }); @@ -524,9 +527,9 @@ bool fileop::getLockingProcesses(const wchar_t* filename, const wchar_t*& procLi return true; } - catch (const Win32Error& e) + catch (const SysError& e) { - lastErrorMessage.reset(new std::wstring(formatWin32Msg(e.errorCode_))); + lastErrorMessage.reset(new std::wstring(e.toString())); return false; } } diff --git a/zen/assert_static.h b/zen/assert_static.h index c5b7f8c1..469e0299 100644 --- a/zen/assert_static.h +++ b/zen/assert_static.h @@ -1,5 +1,5 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * +// * This file is part of the zen::Xml project. It is distributed under the * // * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/zen/base64.h b/zen/base64.h index 5f18ea36..ae896e70 100644 --- a/zen/base64.h +++ b/zen/base64.h @@ -1,8 +1,9 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * -// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** + #ifndef BASE64_HEADER_08473021856321840873021487213453214 #define BASE64_HEADER_08473021856321840873021487213453214 diff --git a/zen/basic_math.h b/zen/basic_math.h index 89d9d6c0..f01421c7 100644 --- a/zen/basic_math.h +++ b/zen/basic_math.h @@ -1,6 +1,6 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * -// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/zen/com_error.h b/zen/com_error.h index 0e0448a7..5eb7611d 100644 --- a/zen/com_error.h +++ b/zen/com_error.h @@ -4,31 +4,19 @@ // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** -#ifndef COM_ERROR_HEADER -#define COM_ERROR_HEADER +#ifndef COM_ERROR_HEADER_88425703425254 +#define COM_ERROR_HEADER_88425703425254 -#include #include -#include "win.h" //includes "windows.h" +#include "sys_error.h" namespace zen { -std::wstring generateErrorMsg(const std::wstring& input, HRESULT hr); -std::wstring formatWin32Msg(DWORD dwMessageId); //return empty string on error - -class ComError -{ -public: - explicit ComError(const std::wstring& msg, HRESULT hr = S_OK) : msg_(hr == S_OK ? msg : generateErrorMsg(msg, hr)) {} - const std::wstring& toString() const { return msg_; } - -private: - std::wstring msg_; -}; +std::wstring formatComError(const std::wstring& msg, HRESULT hr); //Convenience Macros checking for COM errors: -#define ZEN_COM_CHECK(func) ZEN_COM_CHECK_IMPL(func, #func) //throw ComError +#define ZEN_COM_CHECK(func) ZEN_COM_CHECK_IMPL(func, #func) //throw SysError /* Example: ZEN_COM_CHECK(backupComp->InitializeForBackup()); @@ -36,17 +24,17 @@ Equivalent to: { HRESULT hrInternal = backupComp->InitializeForBackup(); if (FAILED(hrInternal)) - throw ComError(L"Error calling \"backupComp->InitializeForBackup()\".", hrInternal); + throw SysError(formatComError(L"Error calling \"backupComp->InitializeForBackup()\".", hrInternal)); } */ -#define ZEN_COM_ASSERT(obj) ZEN_COM_ASSERT_IMPL(obj, #obj) //throw ComError +#define ZEN_COM_ASSERT(obj) ZEN_COM_ASSERT_IMPL(obj, #obj) //throw SysError /* Example: ZEN_COM_ASSERT(obj); Equivalent to: if (!obj) - throw ComError(L"Assertion failed: \"obj\".", E_FAIL); + throw SysError(formatComError(L"Assertion failed: \"obj\".", E_FAIL)); */ @@ -54,32 +42,35 @@ Equivalent to: - - - - - - - //################# implementation ##################### -std::wstring formatWin32Msg(DWORD dwMessageId) //return empty string on error +namespace impl +{ +inline +std::wstring formatWin32Message(DWORD dwMessageId) //return empty string on error { - std::wstring output; LPWSTR buffer = nullptr; if (::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK | FORMAT_MESSAGE_IGNORE_INSERTS | //important: without this flag ::FormatMessage() will fail if message contains placeholders FORMAT_MESSAGE_ALLOCATE_BUFFER, nullptr, dwMessageId, 0, reinterpret_cast(&buffer), 0, nullptr) != 0) - { if (buffer) //just to be sure { - output = buffer; - ::LocalFree(buffer); + ZEN_ON_SCOPE_EXIT(::LocalFree(buffer)); + return buffer; } - } - return output; + return std::wstring(); +} + + +inline +std::wstring numberToHexString(long number) +{ + wchar_t buffer[100] = {}; + const int charsWritten = ::swprintf(buffer, 100, L"0x%08x", static_cast(number)); + return charsWritten > 0 ? std::wstring(buffer, charsWritten) : std::wstring(); } + namespace { std::wstring formatFacility(HRESULT hr) @@ -199,28 +190,24 @@ std::wstring formatFacility(HRESULT hr) } } } - -inline -std::wstring numberToHexString(long number) -{ - wchar_t result[100]; - ::swprintf(result, 100, L"0x%08x", static_cast(number)); - return std::wstring(result); } +std::wstring formatComError(const std::wstring& msg, long long hr); //not implemented! intentional overload ambiguity to catch usage errors with HRESULT! + + inline -std::wstring generateErrorMsg(const std::wstring& input, HRESULT hr) +std::wstring formatComError(const std::wstring& msg, HRESULT hr) { - std::wstring output(input); + std::wstring output(msg); output += L"\n"; //don't use _com_error(hr).ErrorMessage(): internally this is nothing more than a call to ::FormatMessage() - std::wstring win32Msg = formatWin32Msg(hr); + std::wstring win32Msg = impl::formatWin32Message(hr); if (!win32Msg.empty()) //empty string on error - output += win32Msg + L"\n" + L"HRESULT: " + numberToHexString(hr); + output += win32Msg + L"\n" + L"HRESULT: " + impl::numberToHexString(hr); else - output += L"HRESULT: " + numberToHexString(hr) + L", " + L"Facility: " + formatFacility(hr); + output += L"HRESULT: " + impl::numberToHexString(hr) + L", " + L"Facility: " + impl::formatFacility(hr); //don't bluntly interpret as Win32 error code HRESULT_CODE(hr), too often misleading! //http://blogs.msdn.com/b/oldnewthing/archive/2006/11/03/942851.aspx @@ -232,9 +219,9 @@ std::wstring generateErrorMsg(const std::wstring& input, HRESULT hr) { \ HRESULT hrInternal = func; \ if (FAILED(hrInternal)) \ - throw zen::ComError(std::wstring(L"Error calling \"") + L ## txt + L"\".", hrInternal); \ + throw zen::SysError(formatComError(std::wstring(L"Error calling \"") + L ## txt + L"\".", hrInternal)); \ } -#define ZEN_COM_ASSERT_IMPL(obj, txt) if (!(obj)) throw zen::ComError(std::wstring(L"Assertion failed: \"") + L ## txt + L"\".", E_FAIL); +#define ZEN_COM_ASSERT_IMPL(obj, txt) if (!(obj)) throw zen::SysError(formatComError(std::wstring(L"Assertion failed: \"") + L ## txt + L"\".", E_FAIL)); } -#endif //COM_ERROR_HEADER +#endif //COM_ERROR_HEADER_88425703425254 diff --git a/zen/com_ptr.h b/zen/com_ptr.h index 9944ea56..6fb9f2cd 100644 --- a/zen/com_ptr.h +++ b/zen/com_ptr.h @@ -36,7 +36,7 @@ class ComPtr public: ComPtr() : ptr(nullptr) {} // ComPtr(const ComPtr& other) : ptr(other.ptr) { if (ptr) ptr->AddRef(); } //noexcept in C++11 - ComPtr( ComPtr&& other) : ptr(other.release()) {} // + ComPtr( ComPtr&& tmp ) : ptr(tmp.release()) {} // ~ComPtr() { if (ptr) ptr->Release(); } //has exception spec of compiler-generated destructor by default ComPtr& operator=(const ComPtr& other) { ComPtr(other).swap(*this); return *this; } //noexcept in C++11 diff --git a/zen/debug_log.h b/zen/debug_log.h index 6ee44ff5..ad27b66e 100644 --- a/zen/debug_log.h +++ b/zen/debug_log.h @@ -23,9 +23,9 @@ namespace zen { -#ifdef FFS_WIN +#ifdef ZEN_WIN const char ZEN_FILE_NAME_SEPARATOR = '\\'; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC const char ZEN_FILE_NAME_SEPARATOR = '/'; #endif diff --git a/zen/dir_watcher.cpp b/zen/dir_watcher.cpp index 6402dce7..a800fb80 100644 --- a/zen/dir_watcher.cpp +++ b/zen/dir_watcher.cpp @@ -10,24 +10,24 @@ #include "thread.h" //includes #include "scope_guard.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "notify_removal.h" #include "win.h" //includes "windows.h" #include "long_path_prefix.h" -#elif defined FFS_LINUX +#elif defined ZEN_LINUX #include #include #include "file_traverser.h" -#elif defined FFS_MAC +#elif defined ZEN_MAC //#include #endif using namespace zen; -#ifdef FFS_WIN +#ifdef ZEN_WIN namespace { class SharedData @@ -101,14 +101,14 @@ public: boost::lock_guard dummy(lockAccess); //first check whether errors occurred in thread - if (!errorMsg.first.empty()) + if (errorInfo) { - const std::wstring msg = errorMsg.first.c_str(); - const DWORD lastError = errorMsg.second; + const std::wstring msg = copyStringTo(errorInfo->msg); + const std::wstring descr = copyStringTo(errorInfo->descr); - if (errorCodeForNotExisting(lastError)) - throw ErrorNotExisting(msg); - throw FileError(msg); + if (errorCodeForNotExisting(errorInfo->errorCode)) + throw ErrorNotExisting(msg, descr); + throw FileError(msg, descr); } output.swap(changedFiles); @@ -117,10 +117,12 @@ public: //context of worker thread - void reportError(const std::wstring& msg, DWORD errorCode) //throw() + void reportError(const std::wstring& msg, const std::wstring& description, DWORD errorCode) //throw() { boost::lock_guard dummy(lockAccess); - errorMsg = std::make_pair(copyStringTo(msg), errorCode); + + ErrorInfo newInfo = { copyStringTo(msg), copyStringTo(description), errorCode }; + errorInfo = make_unique(newInfo); } private: @@ -128,7 +130,14 @@ private: boost::mutex lockAccess; std::vector changedFiles; - std::pair errorMsg; //non-empty if errors occurred in thread + + struct ErrorInfo + { + BasicWString msg; + BasicWString descr; + DWORD errorCode; + }; + std::unique_ptr errorInfo; //non-empty if errors occurred in thread }; @@ -151,11 +160,13 @@ public: nullptr); if (hDir == INVALID_HANDLE_VALUE) { - const DWORD lastError = ::GetLastError(); - const std::wstring errorMsg = replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted(lastError); + const DWORD lastError = ::GetLastError(); //copy before making other system calls! + const std::wstring errorMsg = replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(directory)); + const std::wstring errorDescr = formatSystemError(L"CreateFile", lastError); + if (errorCodeForNotExisting(lastError)) - throw ErrorNotExisting(errorMsg); - throw FileError(errorMsg); + throw ErrorNotExisting(errorMsg, errorDescr); + throw FileError(errorMsg, errorDescr); } //end of constructor, no need to start managing "hDir" @@ -184,7 +195,10 @@ public: false, //__in BOOL bInitialState, nullptr); //__in_opt LPCTSTR lpName if (overlapped.hEvent == nullptr) - return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirnamePf)) + L" (CreateEvent)" L"\n\n" + getLastErrorFormatted(), ::GetLastError()); + { + const DWORD lastError = ::GetLastError(); //copy before making other system calls! + return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirnamePf)), formatSystemError(L"CreateEvent", lastError), lastError); + } ZEN_ON_SCOPE_EXIT(::CloseHandle(overlapped.hEvent)); @@ -202,7 +216,10 @@ public: &bytesReturned, // __out_opt LPDWORD lpBytesReturned, &overlapped, // __inout_opt LPOVERLAPPED lpOverlapped, nullptr)) // __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine - return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirnamePf)) + L" (ReadDirectoryChangesW)" L"\n\n" + getLastErrorFormatted(), ::GetLastError()); + { + const DWORD lastError = ::GetLastError(); //copy before making other system calls! + return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirnamePf)), formatSystemError(L"ReadDirectoryChangesW", lastError), lastError); + } //async I/O is a resource that needs to be guarded since it will write to local variable "buffer"! zen::ScopeGuard guardAio = zen::makeGuard([&] @@ -223,8 +240,9 @@ public: &bytesWritten, //__out LPDWORD lpNumberOfBytesTransferred, false)) //__in BOOL bWait { - if (::GetLastError() != ERROR_IO_INCOMPLETE) - return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirnamePf)) + L" (GetOverlappedResult)" L"\n\n" + getLastErrorFormatted(), ::GetLastError()); + const DWORD lastError = ::GetLastError(); //copy before making other system calls! + if (lastError != ERROR_IO_INCOMPLETE) + return shared_->reportError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirnamePf)), formatSystemError(L"GetOverlappedResult", lastError), lastError); //execute asynchronous procedure calls (APC) queued on this thread ::SleepEx(50, // __in DWORD dwMilliseconds, @@ -362,7 +380,7 @@ std::vector DirWatcher::getChanges(const std::function& dirs, - const std::shared_ptr& otherMe) : otherMe_(otherMe), dirs_(dirs) {} + DirsOnlyTraverser(std::vector& dirs) : dirs_(dirs) {} virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details) {} virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) { return LINK_SKIP; } - virtual std::shared_ptr onDir(const Zchar* shortName, const Zstring& fullName) + virtual TraverseCallback* onDir(const Zchar* shortName, const Zstring& fullName) { dirs_.push_back(fullName); - return otherMe_; + return this; } virtual HandleError reportDirError (const std::wstring& msg) { throw FileError(msg); } virtual HandleError reportItemError(const std::wstring& msg, const Zchar* shortName) { throw FileError(msg); } private: - const std::shared_ptr& otherMe_; //lifetime management, two options: 1. use std::weak_ptr 2. ref to shared_ptr std::vector& dirs_; }; } @@ -408,16 +424,14 @@ DirWatcher::DirWatcher(const Zstring& directory) : //throw FileError std::vector fullDirList; fullDirList.push_back(dirname); - std::shared_ptr traverser; - traverser = std::make_shared(fullDirList, traverser); //throw FileError - - zen::traverseFolder(dirname, *traverser); //don't traverse into symlinks (analog to windows build) + DirsOnlyTraverser traverser(fullDirList); //throw FileError + zen::traverseFolder(dirname, traverser); //don't traverse into symlinks (analog to windows build) //init pimpl_->dirname = directory; pimpl_->notifDescr = ::inotify_init(); if (pimpl_->notifDescr == -1) - throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"inotify_init", getLastError())); zen::ScopeGuard guardDescr = zen::makeGuard([&] { ::close(pimpl_->notifDescr); }); @@ -429,7 +443,7 @@ DirWatcher::DirWatcher(const Zstring& directory) : //throw FileError initSuccess = ::fcntl(pimpl_->notifDescr, F_SETFL, flags | O_NONBLOCK) != -1; } if (!initSuccess) - throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"fcntl", getLastError())); //add watches std::for_each(fullDirList.begin(), fullDirList.end(), @@ -448,10 +462,13 @@ DirWatcher::DirWatcher(const Zstring& directory) : //throw FileError IN_MOVE_SELF); if (wd == -1) { - const std::wstring errorMsg = replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(subdir)) + L"\n\n" + getLastErrorFormatted(); - if (errorCodeForNotExisting(errno)) - throw ErrorNotExisting(errorMsg); - throw FileError(errorMsg); + const ErrorCode lastError = getLastError(); //copy before making other system calls! + const std::wstring errorMsg = replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(subdir)); + const std::wstring errorDescr = formatSystemError(L"inotify_add_watch", lastError); + + if (errorCodeForNotExisting(lastError)) + throw ErrorNotExisting(errorMsg, errorDescr); + throw FileError(errorMsg, errorDescr); } pimpl_->watchDescrs.insert(std::make_pair(wd, appendSeparator(subdir))); @@ -484,7 +501,7 @@ std::vector DirWatcher::getChanges(const std::function(); - throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(pimpl_->dirname)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot monitor directory %x."), L"%x", fmtFileName(pimpl_->dirname)), formatSystemError(L"read", getLastError())); } std::vector output; @@ -522,18 +539,17 @@ std::vector DirWatcher::getChanges(const std::function -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include "scope_guard.h" #include "win.h" //includes "windows.h" -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include #endif @@ -40,11 +40,11 @@ class DllFun public: DllFun() : fun(nullptr) {} -#ifdef FFS_WIN +#ifdef ZEN_WIN DllFun(const wchar_t* libraryName, const char* functionName) : hLibRef(::LoadLibrary(libraryName), ::FreeLibrary), fun(hLibRef ? reinterpret_cast(::GetProcAddress(static_cast(hLibRef.get()), functionName)) : nullptr) {} -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC DllFun(const char* libraryName, const char* functionName) : hLibRef(::dlopen(libraryName, RTLD_LAZY), ::dlclose), fun(hLibRef ? reinterpret_cast(::dlsym(hLibRef.get(), functionName)) : nullptr) {} @@ -57,7 +57,7 @@ private: }; -#ifdef FFS_WIN +#ifdef ZEN_WIN //if the dll is already part of the process space, e.g. "kernel32.dll" or "shell32.dll", we can use a faster variant: //NOTE: since the lifetime of the referenced library is *not* controlled, this is safe to use only for permanently loaded libraries like these! template @@ -100,7 +100,7 @@ std::string getResourceStream(const std::wstring& libraryName, size_t resourceId //--------------- implementation--------------------------------------------------- -#ifdef FFS_WIN +#ifdef ZEN_WIN inline std::string getResourceStream(const wchar_t* libraryName, size_t resourceId) { diff --git a/zen/dst_hack.cpp b/zen/dst_hack.cpp index a70ef13b..887b9b63 100644 --- a/zen/dst_hack.cpp +++ b/zen/dst_hack.cpp @@ -166,10 +166,10 @@ FILETIME utcToLocal(const FILETIME& utcTime) //throw std::runtime_error &utcTime, //__in const FILETIME *lpFileTime, &localTime)) //__out LPFILETIME lpLocalFileTime { - const std::wstring errorMessage = _("Conversion error:") + L" FILETIME -> local FILETIME: " + L"(" + - L"High: " + numberTo(utcTime.dwHighDateTime) + L" " + - L"Low: " + numberTo(utcTime.dwLowDateTime) + L") " + L"\n\n" + getLastErrorFormatted(); - throw std::runtime_error(utfCvrtTo(errorMessage)); + const std::wstring errorMsg = _("Conversion error:") + L" FILETIME -> local FILETIME: " + L"(" + + L"High: " + numberTo(utcTime.dwHighDateTime) + L" " + + L"Low: " + numberTo(utcTime.dwLowDateTime) + L") " + L"\n\n" + formatSystemError(L"FileTimeToLocalFileTime", getLastError()); + throw std::runtime_error(utfCvrtTo(errorMsg)); } return localTime; } @@ -184,10 +184,10 @@ FILETIME localToUtc(const FILETIME& localTime) //throw std::runtime_error &localTime, //__in const FILETIME *lpLocalFileTime, &utcTime)) //__out LPFILETIME lpFileTime { - const std::wstring errorMessage = _("Conversion error:") + L" local FILETIME -> FILETIME: " + L"(" + - L"High: " + numberTo(localTime.dwHighDateTime) + L" " + - L"Low: " + numberTo(localTime.dwLowDateTime) + L") " + L"\n\n" + getLastErrorFormatted(); - throw std::runtime_error(utfCvrtTo(errorMessage)); + const std::wstring errorMsg = _("Conversion error:") + L" local FILETIME -> FILETIME: " + L"(" + + L"High: " + numberTo(localTime.dwHighDateTime) + L" " + + L"Low: " + numberTo(localTime.dwLowDateTime) + L") " + L"\n\n" + formatSystemError(L"LocalFileTimeToFileTime", getLastError()); + throw std::runtime_error(utfCvrtTo(errorMsg)); } return utcTime; } @@ -286,9 +286,8 @@ std::bitset getUtcLocalShift() if (std::bitset < UTC_LOCAL_OFFSET_BITS - 1 > (absValue).to_ulong() != static_cast(absValue) || //time shifts that big shouldn't be possible! timeShiftSec % (60 * 15) != 0) //all known time shift have at least 15 minute granularity! { - const std::wstring errorMessage = _("Conversion error:") + L" Unexpected UTC <-> local time shift: " + - L"(" + numberTo(timeShiftSec) + L") " + L"\n\n" + getLastErrorFormatted(); - throw std::runtime_error(utfCvrtTo(errorMessage)); + const std::wstring errorMsg = _("Conversion error:") + L" Unexpected UTC <-> local time shift: " + L"(" + numberTo(timeShiftSec) + L")"; + throw std::runtime_error(utfCvrtTo(errorMsg)); } std::bitset output(absValue); diff --git a/zen/error_log.h b/zen/error_log.h index 490bb1f4..05049d27 100644 --- a/zen/error_log.h +++ b/zen/error_log.h @@ -105,8 +105,8 @@ String formatMessageImpl(const LogEntry& entry) //internal linkage String formattedText = L"[" + formatTime(FORMAT_TIME, localTime(entry.time)) + L"] " + copyStringTo(getTypeName()) + L": "; const size_t prefixLen = formattedText.size(); - for (auto iter = entry.message.begin(); iter != entry.message.end(); ) - if (*iter == L'\n') + for (auto it = entry.message.begin(); it != entry.message.end(); ) + if (*it == L'\n') { formattedText += L'\n'; @@ -116,12 +116,12 @@ String formatMessageImpl(const LogEntry& entry) //internal linkage do //skip duplicate newlines { - ++iter; + ++it; } - while (iter != entry.message.end() && *iter == L'\n'); + while (it != entry.message.end() && *it == L'\n'); } else - formattedText += *iter++; + formattedText += *it++; return formattedText; } diff --git a/zen/file_error.h b/zen/file_error.h index f107a736..71619834 100644 --- a/zen/file_error.h +++ b/zen/file_error.h @@ -4,29 +4,31 @@ // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** -#ifndef FILEERROR_H_INCLUDED -#define FILEERROR_H_INCLUDED +#ifndef FILEERROR_H_INCLUDED_839567308565656789 +#define FILEERROR_H_INCLUDED_839567308565656789 #include #include "zstring.h" #include "utf.h" -#include "last_error.h" //we'll need this later anyway! +#include "sys_error.h" //we'll need this later anyway! namespace zen { -class FileError //Exception base class used to notify file/directory copy/delete errors +//A high-level exception class giving detailed context information for end users +class FileError { public: - explicit FileError(const std::wstring& message) : errorMessage(message) {} + explicit FileError(const std::wstring& msg) : msg_(msg) {} + FileError(const std::wstring& msg, const std::wstring& details) : msg_(msg + L"\n\n" + details) {} virtual ~FileError() {} - const std::wstring& toString() const { return errorMessage; } + const std::wstring& toString() const { return msg_; } private: - std::wstring errorMessage; + std::wstring msg_; }; -#define DEFINE_NEW_FILE_ERROR(X) struct X : public FileError { X(const std::wstring& message) : FileError(message) {} }; +#define DEFINE_NEW_FILE_ERROR(X) struct X : public FileError { X(const std::wstring& msg) : FileError(msg) {} X(const std::wstring& msg, const std::wstring& descr) : FileError(msg, descr) {} }; DEFINE_NEW_FILE_ERROR(ErrorNotExisting); DEFINE_NEW_FILE_ERROR(ErrorTargetExisting); @@ -35,7 +37,6 @@ DEFINE_NEW_FILE_ERROR(ErrorFileLocked); DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume); - //----------- facilitate usage of std::wstring for error messages -------------------- //allow implicit UTF8 conversion: since std::wstring models a GUI string, convenience is more important than performance @@ -56,4 +57,4 @@ std::wstring fmtFileName(const Zstring& filename) } } -#endif // FILEERROR_H_INCLUDED +#endif //FILEERROR_H_INCLUDED_839567308565656789 diff --git a/zen/file_handling.cpp b/zen/file_handling.cpp index 8dc3e72d..398e88e8 100644 --- a/zen/file_handling.cpp +++ b/zen/file_handling.cpp @@ -16,7 +16,7 @@ #include "file_id_def.h" #include -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include "privilege.h" #include "dll.h" @@ -26,19 +26,19 @@ #include "win_ver.h" #include "IFileOperation/file_op.h" -#elif defined FFS_LINUX +#elif defined ZEN_LINUX #include //statfs #include //AT_SYMLINK_NOFOLLOW, UTIME_OMIT #ifdef HAVE_SELINUX #include #endif -#elif defined FFS_MAC +#elif defined ZEN_MAC #include //statfs //#include #endif -#if defined FFS_LINUX || defined FFS_MAC +#if defined ZEN_LINUX || defined ZEN_MAC #include #include //lutimes #endif @@ -49,11 +49,11 @@ using namespace zen; bool zen::fileExists(const Zstring& filename) { //symbolic links (broken or not) are also treated as existing files! -#ifdef FFS_WIN +#ifdef ZEN_WIN const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(filename).c_str()); return attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY) == 0; //returns true for (file-)symlinks also -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC struct ::stat fileInfo = {}; return ::lstat(filename.c_str(), &fileInfo) == 0 && (S_ISLNK(fileInfo.st_mode) || S_ISREG(fileInfo.st_mode)); //in Linux a symbolic link is neither file nor directory @@ -64,11 +64,11 @@ bool zen::fileExists(const Zstring& filename) bool zen::dirExists(const Zstring& dirname) { //symbolic links (broken or not) are also treated as existing directories! -#ifdef FFS_WIN +#ifdef ZEN_WIN const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(dirname).c_str()); return attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0; //returns true for (dir-)symlinks also -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC struct ::stat dirInfo = {}; return ::lstat(dirname.c_str(), &dirInfo) == 0 && (S_ISLNK(dirInfo.st_mode) || S_ISDIR(dirInfo.st_mode)); //in Linux a symbolic link is neither file nor directory @@ -78,7 +78,7 @@ bool zen::dirExists(const Zstring& dirname) bool zen::symlinkExists(const Zstring& linkname) { -#ifdef FFS_WIN +#ifdef ZEN_WIN WIN32_FIND_DATA fileInfo = {}; { const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(linkname).c_str(), &fileInfo); @@ -88,7 +88,7 @@ bool zen::symlinkExists(const Zstring& linkname) } return isSymlink(fileInfo); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC struct ::stat fileInfo = {}; return ::lstat(linkname.c_str(), &fileInfo) == 0 && S_ISLNK(fileInfo.st_mode); //symbolic link @@ -98,11 +98,11 @@ bool zen::symlinkExists(const Zstring& linkname) bool zen::somethingExists(const Zstring& objname) { -#ifdef FFS_WIN +#ifdef ZEN_WIN const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(objname).c_str()); return attr != INVALID_FILE_ATTRIBUTES || ::GetLastError() == ERROR_SHARING_VIOLATION; //"C:\pagefile.sys" -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC struct ::stat fileInfo = {}; return ::lstat(objname.c_str(), &fileInfo) == 0; #endif @@ -112,13 +112,13 @@ bool zen::somethingExists(const Zstring& objname) SymLinkType zen::getSymlinkType(const Zstring& linkname) //throw() { assert(symlinkExists(linkname)); -#ifdef FFS_WIN +#ifdef ZEN_WIN const DWORD attr = ::GetFileAttributes(applyLongPathPrefix(linkname).c_str()); if (attr == INVALID_FILE_ATTRIBUTES) return SYMLINK_TYPE_UNKNOWN; return (attr & FILE_ATTRIBUTE_DIRECTORY) ? SYMLINK_TYPE_DIR : SYMLINK_TYPE_FILE; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC //S_ISDIR and S_ISLNK are mutually exclusive on Linux => explicitly need to follow link struct ::stat fileInfo = {}; if (::stat(linkname.c_str(), &fileInfo) != 0) @@ -130,14 +130,39 @@ SymLinkType zen::getSymlinkType(const Zstring& linkname) //throw() namespace { +#ifdef ZEN_WIN +//(try to) enhance error messages by showing which processes lock the file +Zstring getLockingProcessNames(const Zstring& filename) //throw(), empty string if none found or error occurred +{ + if (vistaOrLater()) + { + using namespace fileop; + const DllFun getLockingProcesses(getDllName(), funName_getLockingProcesses); + const DllFun freeString (getDllName(), funName_freeString); + + if (getLockingProcesses && freeString) + { + const wchar_t* procList = nullptr; + if (getLockingProcesses(filename.c_str(), procList)) + { + ZEN_ON_SCOPE_EXIT(freeString(procList)); + return procList; + } + } + } + return Zstring(); +} +#endif + + void getFileAttrib(const Zstring& filename, FileAttrib& attr, ProcSymlink procSl) //throw FileError { -#ifdef FFS_WIN +#ifdef ZEN_WIN WIN32_FIND_DATA fileInfo = {}; { const HANDLE searchHandle = ::FindFirstFile(applyLongPathPrefix(filename).c_str(), &fileInfo); if (searchHandle == INVALID_HANDLE_VALUE) - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"FindFirstFile", getLastError())); ::FindClose(searchHandle); } // WIN32_FILE_ATTRIBUTE_DATA sourceAttr = {}; @@ -173,25 +198,25 @@ void getFileAttrib(const Zstring& filename, FileAttrib& attr, ProcSymlink procSl FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory nullptr); if (hFile == INVALID_HANDLE_VALUE) - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"CreateFile", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile)); BY_HANDLE_FILE_INFORMATION fileInfoHnd = {}; if (!::GetFileInformationByHandle(hFile, &fileInfoHnd)) - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"GetFileInformationByHandle", getLastError())); attr.fileSize = UInt64(fileInfoHnd.nFileSizeLow, fileInfoHnd.nFileSizeHigh); attr.modificationTime = toTimeT(fileInfoHnd.ftLastWriteTime); } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC struct ::stat fileInfo = {}; const int rv = procSl == SYMLINK_FOLLOW ? :: stat(filename.c_str(), &fileInfo) : ::lstat(filename.c_str(), &fileInfo); if (rv != 0) //follow symbolic links - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"stat", getLastError())); attr.fileSize = UInt64(fileInfo.st_size); attr.modificationTime = fileInfo.st_mtime; @@ -218,119 +243,34 @@ Int64 zen::getFileTime(const Zstring& filename, ProcSymlink procSl) //throw File UInt64 zen::getFreeDiskSpace(const Zstring& path) //throw FileError { -#ifdef FFS_WIN +#ifdef ZEN_WIN ULARGE_INTEGER bytesFree = {}; if (!::GetDiskFreeSpaceEx(appendSeparator(path).c_str(), //__in_opt LPCTSTR lpDirectoryName, -> "UNC name [...] must include a trailing backslash, for example, "\\MyServer\MyShare\" &bytesFree, //__out_opt PULARGE_INTEGER lpFreeBytesAvailable, nullptr, //__out_opt PULARGE_INTEGER lpTotalNumberOfBytes, nullptr)) //__out_opt PULARGE_INTEGER lpTotalNumberOfFreeBytes - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(path)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(path)), formatSystemError(L"GetDiskFreeSpaceEx", getLastError())); return UInt64(bytesFree.LowPart, bytesFree.HighPart); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC struct statfs info = {}; if (::statfs(path.c_str(), &info) != 0) - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(path)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(path)), formatSystemError(L"statfs", getLastError())); return UInt64(info.f_bsize) * info.f_bavail; #endif } -namespace -{ -#ifdef FFS_WIN -//(try to) enhance error messages by showing which processes lock the file -Zstring getLockingProcessNames(const Zstring& filename) //throw(), empty string if none found or error occurred -{ - if (vistaOrLater()) - { - using namespace fileop; - const DllFun getLockingProcesses(getDllName(), funName_getLockingProcesses); - const DllFun freeString (getDllName(), funName_freeString); - - if (getLockingProcesses && freeString) - { - const wchar_t* procList = nullptr; - if (getLockingProcesses(filename.c_str(), procList)) - { - ZEN_ON_SCOPE_EXIT(freeString(procList)); - return procList; - } - } - } - return Zstring(); -} - - -DWORD retrieveVolumeSerial(const Zstring& pathName) //return 0 on error! -{ - //note: this even works for network shares: \\share\dirname - - const DWORD bufferSize = 10000; - std::vector buffer(bufferSize); - - //full pathName need not yet exist! - if (!::GetVolumePathName(pathName.c_str(), //__in LPCTSTR lpszFileName, - &buffer[0], //__out LPTSTR lpszVolumePathName, - bufferSize)) //__in DWORD cchBufferLength - return 0; - - DWORD volumeSerial = 0; - if (!::GetVolumeInformation(&buffer[0], //__in_opt LPCTSTR lpRootPathName, - nullptr, //__out LPTSTR lpVolumeNameBuffer, - 0, //__in DWORD nVolumeNameSize, - &volumeSerial, //__out_opt LPDWORD lpVolumeSerialNumber, - nullptr, //__out_opt LPDWORD lpMaximumComponentLength, - nullptr, //__out_opt LPDWORD lpFileSystemFlags, - nullptr, //__out LPTSTR lpFileSystemNameBuffer, - 0)) //__in DWORD nFileSystemNameSize - return 0; - - return volumeSerial; -} - -#elif defined FFS_LINUX || defined FFS_MAC -dev_t retrieveVolumeSerial(const Zstring& pathName) //return 0 on error! -{ - Zstring volumePathName = pathName; - - //remove trailing slash - if (volumePathName.size() > 1 && endsWith(volumePathName, FILE_NAME_SEPARATOR)) //exception: allow '/' - volumePathName = beforeLast(volumePathName, FILE_NAME_SEPARATOR); - - struct stat fileInfo = {}; - while (::lstat(volumePathName.c_str(), &fileInfo) != 0) //go up in folder hierarchy until existing folder is found - { - volumePathName = beforeLast(volumePathName, FILE_NAME_SEPARATOR); //returns empty string if ch not found - if (volumePathName.empty()) - return 0; //this includes path "/" also! - } - - return fileInfo.st_dev; -} -#endif -} - - -zen::ResponseSame zen::onSameVolume(const Zstring& folderLeft, const Zstring& folderRight) //throw() -{ - const auto serialLeft = retrieveVolumeSerial(folderLeft); //returns 0 on error! - const auto serialRight = retrieveVolumeSerial(folderRight); //returns 0 on error! - if (serialLeft == 0 || serialRight == 0) - return IS_SAME_CANT_SAY; - - return serialLeft == serialRight ? IS_SAME_YES : IS_SAME_NO; -} - - bool zen::removeFile(const Zstring& filename) //throw FileError { -#ifdef FFS_WIN +#ifdef ZEN_WIN + const wchar_t functionName[] = L"DeleteFile"; const Zstring& filenameFmt = applyLongPathPrefix(filename); if (!::DeleteFile(filenameFmt.c_str())) -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC + const wchar_t functionName[] = L"unlink"; if (::unlink(filename.c_str()) != 0) #endif { @@ -338,7 +278,7 @@ bool zen::removeFile(const Zstring& filename) //throw FileError if (errorCodeForNotExisting(lastError)) //no error situation if file is not existing! manual deletion relies on it! return false; -#ifdef FFS_WIN +#ifdef ZEN_WIN if (lastError == ERROR_ACCESS_DENIED) //function fails if file is read-only { ::SetFileAttributes(filenameFmt.c_str(), FILE_ATTRIBUTE_NORMAL); //(try to) normalize file attributes @@ -353,18 +293,19 @@ bool zen::removeFile(const Zstring& filename) //throw FileError return false; //neither file nor any other object (e.g. broken symlink) with that name existing //begin of "regular" error reporting - const std::wstring shortMsg = replaceCpy(_("Cannot delete file %x."), L"%x", fmtFileName(filename)); + const std::wstring errorMsg = replaceCpy(_("Cannot delete file %x."), L"%x", fmtFileName(filename)); + std::wstring errorDescr = formatSystemError(functionName, lastError); -#ifdef FFS_WIN +#ifdef ZEN_WIN if (lastError == ERROR_SHARING_VIOLATION || //-> enhance error message! lastError == ERROR_LOCK_VIOLATION) { const Zstring procList = getLockingProcessNames(filename); //throw() if (!procList.empty()) - throw FileError(shortMsg + L"\n\n" + _("The file is locked by another process:") + L"\n" + procList); + errorDescr = _("The file is locked by another process:") + L"\n" + procList; } #endif - throw FileError(shortMsg + L"\n\n" + getLastErrorFormatted(lastError)); + throw FileError(errorMsg, errorDescr); } return true; } @@ -382,7 +323,7 @@ namespace //wrapper for file system rename function: void renameFile_sub(const Zstring& oldName, const Zstring& newName) //throw FileError, ErrorDifferentVolume, ErrorTargetExisting { -#ifdef FFS_WIN +#ifdef ZEN_WIN const Zstring oldNameFmt = applyLongPathPrefix(oldName); const Zstring newNameFmt = applyLongPathPrefix(newName); @@ -392,16 +333,6 @@ void renameFile_sub(const Zstring& oldName, const Zstring& newName) //throw File { DWORD lastError = ::GetLastError(); - const std::wstring shortMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtFileName(oldName)), L"%y", L"\n" + fmtFileName(newName)); - - if (lastError == ERROR_SHARING_VIOLATION || //-> enhance error message! - lastError == ERROR_LOCK_VIOLATION) - { - const Zstring procList = getLockingProcessNames(oldName); //throw() - if (!procList.empty()) - throw FileError(shortMsg + L"\n\n" + _("The file is locked by another process:") + L"\n" + procList); - } - if (lastError == ERROR_ACCESS_DENIED) //MoveFileEx may fail to rename a read-only file on a SAMBA-share -> (try to) handle this { const DWORD oldAttr = ::GetFileAttributes(oldNameFmt.c_str()); @@ -421,7 +352,6 @@ void renameFile_sub(const Zstring& oldName, const Zstring& newName) //throw File else { lastError = ::GetLastError(); //use error code from second call to ::MoveFileEx() - //cleanup: (try to) restore file attributes: assume oldName is still existing ::SetFileAttributes(oldNameFmt.c_str(), oldAttr); } @@ -429,37 +359,45 @@ void renameFile_sub(const Zstring& oldName, const Zstring& newName) //throw File } } - std::wstring errorMessage = shortMsg + L"\n\n" + getLastErrorFormatted(lastError); + const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtFileName(oldName)), L"%y", L"\n" + fmtFileName(newName)); + std::wstring errorDescr = formatSystemError(L"MoveFileEx", lastError); - if (lastError == ERROR_NOT_SAME_DEVICE) - throw ErrorDifferentVolume(errorMessage); + if (lastError == ERROR_SHARING_VIOLATION || //-> enhance error message! + lastError == ERROR_LOCK_VIOLATION) + { + const Zstring procList = getLockingProcessNames(oldName); //throw() + if (!procList.empty()) + errorDescr = _("The file is locked by another process:") + L"\n" + procList; + } + if (lastError == ERROR_NOT_SAME_DEVICE) + throw ErrorDifferentVolume(errorMsg, errorDescr); else if (lastError == ERROR_ALREADY_EXISTS || //-> used on Win7 x64 lastError == ERROR_FILE_EXISTS) //-> used by XP??? - throw ErrorTargetExisting(errorMessage); + throw ErrorTargetExisting(errorMsg, errorDescr); else - throw FileError(errorMessage); + throw FileError(errorMsg, errorDescr); } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC if (::rename(oldName.c_str(), newName.c_str()) != 0) { - const int lastError = errno; - std::wstring errorMessage = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtFileName(oldName)), L"%y", L"\n" + fmtFileName(newName)) + - L"\n\n" + getLastErrorFormatted(lastError); + const int lastError = errno; //copy before making other system calls! + std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot move file %x to %y."), L"%x", L"\n" + fmtFileName(oldName)), L"%y", L"\n" + fmtFileName(newName)); + const std::wstring errorDescr = formatSystemError(L"rename", lastError); if (lastError == EXDEV) - throw ErrorDifferentVolume(errorMessage); + throw ErrorDifferentVolume(errorMsg, errorDescr); else if (lastError == EEXIST) - throw ErrorTargetExisting(errorMessage); + throw ErrorTargetExisting(errorMsg, errorDescr); else - throw FileError(errorMessage); + throw FileError(errorMsg, errorDescr); } #endif } -#ifdef FFS_WIN +#ifdef ZEN_WIN /*small wrapper around ::GetShortPathName() ::GetLongPathName() */ @@ -474,10 +412,10 @@ Zstring getFilenameFmt(const Zstring& filename, Function fun) //throw(); returns std::vector buffer(bufferSize); - const DWORD rv = fun(filenameFmt.c_str(), //__in LPCTSTR lpszShortPath, - &buffer[0], //__out LPTSTR lpszLongPath, - bufferSize); //__in DWORD cchBuffer - if (rv == 0 || rv >= bufferSize) + const DWORD charsWritten = fun(filenameFmt.c_str(), //__in LPCTSTR lpszShortPath, + &buffer[0], //__out LPTSTR lpszLongPath, + bufferSize); //__in DWORD cchBuffer + if (charsWritten == 0 || charsWritten >= bufferSize) return Zstring(); return &buffer[0]; @@ -572,7 +510,7 @@ void zen::renameFile(const Zstring& oldName, const Zstring& newName) //throw Fil } catch (const ErrorTargetExisting&) { -#ifdef FFS_WIN +#ifdef ZEN_WIN //try to handle issues with already existing short 8.3 file names on Windows if (have8dot3NameClash(newName)) { @@ -615,7 +553,7 @@ public: } return LINK_SKIP; } - virtual std::shared_ptr onDir(const Zchar* shortName, const Zstring& fullName) + virtual TraverseCallback* onDir(const Zchar* shortName, const Zstring& fullName) { dirs_.push_back(fullName); return nullptr; //DON'T traverse into subdirs; removeDirectory works recursively! @@ -636,7 +574,7 @@ void removeDirectoryImpl(const Zstring& directory, CallbackRemoveDir* callback) { assert(somethingExists(directory)); //[!] -#ifdef FFS_WIN +#ifdef ZEN_WIN const Zstring directoryFmt = applyLongPathPrefix(directory); //support for \\?\-prefix //(try to) normalize file attributes: actually NEEDED for symbolic links also! @@ -647,12 +585,14 @@ void removeDirectoryImpl(const Zstring& directory, CallbackRemoveDir* callback) if (symlinkExists(directory)) //remove symlink directly { if (callback) callback->onBeforeDirDeletion(directory); //once per symlink -#ifdef FFS_WIN +#ifdef ZEN_WIN + const wchar_t functionName[] = L"RemoveDirectory"; if (!::RemoveDirectory(directoryFmt.c_str())) -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC + const wchar_t functionName[] = L"unlink"; if (::unlink(directory.c_str()) != 0) #endif - throw FileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtFileName(directory)), formatSystemError(functionName, getLastError())); } else { @@ -681,12 +621,14 @@ void removeDirectoryImpl(const Zstring& directory, CallbackRemoveDir* callback) //parent directory is deleted last if (callback) callback->onBeforeDirDeletion(directory); //and once per folder -#ifdef FFS_WIN +#ifdef ZEN_WIN + const wchar_t functionName[] = L"RemoveDirectory"; if (!::RemoveDirectory(directoryFmt.c_str())) -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC + const wchar_t functionName[] = L"rmdir"; if (::rmdir(directory.c_str()) != 0) #endif - throw FileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot delete directory %x."), L"%x", fmtFileName(directory)), formatSystemError(functionName, getLastError())); //may spuriously fail with ERROR_DIR_NOT_EMPTY(145) even though all child items have //successfully been *marked* for deletion, but some application still has a handle open! //e.g. Open "C:\Test\Dir1\Dir2" (filled with lots of files) in Explorer, then delete "C:\Test\Dir1" via ::RemoveDirectory() => Error 145 @@ -708,7 +650,7 @@ void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback) void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink procSl) //throw FileError { -#ifdef FFS_WIN +#ifdef ZEN_WIN FILETIME creationTime = {}; FILETIME lastWriteTime = tofiletime(modTime); @@ -751,18 +693,18 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink ::SetFileAttributes(applyLongPathPrefix(filename).c_str(), attribs); ); - auto removeReadonly = [&]() -> bool //may need to remove the readonly-attribute (e.g. on FAT usb drives) + auto removeReadonly = [&]() -> bool //throw FileError; may need to remove the readonly-attribute (e.g. on FAT usb drives) { if (attribs == INVALID_FILE_ATTRIBUTES) { const DWORD tmpAttr = ::GetFileAttributes(applyLongPathPrefix(filename).c_str()); if (tmpAttr == INVALID_FILE_ATTRIBUTES) - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"GetFileAttributes", getLastError())); if (tmpAttr & FILE_ATTRIBUTE_READONLY) { if (!::SetFileAttributes(applyLongPathPrefix(filename).c_str(), FILE_ATTRIBUTE_NORMAL)) - throw FileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"SetFileAttributes", getLastError())); attribs = tmpAttr; //reapplied on scope exit return true; @@ -799,19 +741,20 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink if (hFile == INVALID_HANDLE_VALUE) { if (::GetLastError() == ERROR_ACCESS_DENIED) //fails if file is read-only (or for "other" reasons) - if (removeReadonly()) + if (removeReadonly()) //throw FileError continue; //2. be a *little* fancy hFile = openFile(false); if (hFile == INVALID_HANDLE_VALUE) { - if (::GetLastError() == ERROR_ACCESS_DENIED) - if (removeReadonly()) + const ErrorCode lastError = getLastError(); //copy before making other system calls! + if (lastError == ERROR_ACCESS_DENIED) + if (removeReadonly()) //throw FileError continue; //3. after these herculean stunts we give up... - throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"CreateFile", lastError)); } } break; @@ -826,15 +769,15 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink nullptr, //__in_opt const FILETIME *lpLastAccessTime, &lastWriteTime)) //__in_opt const FILETIME *lpLastWriteTime { - auto lastErr = ::GetLastError(); + ErrorCode lastError = getLastError(); //copy before making other system calls! //function may fail if file is read-only: https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3514569&group_id=234430 - if (lastErr == ERROR_ACCESS_DENIED) + if (lastError == ERROR_ACCESS_DENIED) { //dynamically load windows API function: available with Windows Vista and later typedef BOOL (WINAPI* SetFileInformationByHandleFunc)(HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS FileInformationClass, LPVOID lpFileInformation, DWORD dwBufferSize); - const SysDllFun setFileInformationByHandle(L"kernel32.dll", "SetFileInformationByHandle"); + if (setFileInformationByHandle) //if not: let the original error propagate! { auto setFileInfo = [&](FILE_BASIC_INFO basicInfo) //throw FileError; no const& since SetFileInformationByHandle() requires non-const parameter! @@ -843,7 +786,7 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink FileBasicInfo, //__in FILE_INFO_BY_HANDLE_CLASS FileInformationClass, &basicInfo, //__in LPVOID lpFileInformation, sizeof(basicInfo))) //__in DWORD dwBufferSize - throw FileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"SetFileInformationByHandle", getLastError())); }; auto toLargeInteger = [](const FILETIME& ft) -> LARGE_INTEGER @@ -876,15 +819,16 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink } catch (FileError&) {} - lastErr = ERROR_SUCCESS; + lastError = ERROR_SUCCESS; } } } - std::wstring errorMsg = replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted(lastErr); + std::wstring errorMsg = replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)); + const std::wstring errorDescr = formatSystemError(L"SetFileTime", lastError); //add more meaningful message: FAT accepts only a subset of the NTFS date range - if (lastErr == ERROR_INVALID_PARAMETER && + if (lastError == ERROR_INVALID_PARAMETER && dst::isFatDrive(filename)) { //we need a low-level reliable routine to format a potentially invalid date => don't use strftime!!! @@ -929,8 +873,8 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink (!isNullTime(creationTime) ? L"\n\tcreate (UTC): \t" + fmtDate(creationTime) : L""); } - if (lastErr != ERROR_SUCCESS) - throw FileError(errorMsg); + if (lastError != ERROR_SUCCESS) + throw FileError(errorMsg, errorDescr); } } #ifndef NDEBUG //dst hack: verify data written @@ -959,7 +903,7 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink } #endif -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC //sigh, we can't use utimensat on NTFS volumes on Ubuntu: silent failure!!! what morons are programming this shit??? // struct ::timespec newTimes[2] = {}; @@ -967,7 +911,7 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink // newTimes[1].tv_sec = to(modTime); //modification time (seconds) // // if (::utimensat(AT_FDCWD, filename.c_str(), newTimes, procSl == SYMLINK_DIRECT ? AT_SYMLINK_NOFOLLOW : 0) != 0) - // throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + // throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"utimensat", getLastError())); //=> fallback to "retarded-idiot version"! -- DarkByte @@ -979,20 +923,20 @@ void zen::setFileTime(const Zstring& filename, const Int64& modTime, ProcSymlink :: utimes(filename.c_str(), newTimes) : //utimensat() not yet implemented on OS X ::lutimes(filename.c_str(), newTimes); if (rv != 0) - throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)), formatSystemError(L"utimes", getLastError())); #endif } bool zen::supportsPermissions(const Zstring& dirname) //throw FileError { -#ifdef FFS_WIN +#ifdef ZEN_WIN const DWORD bufferSize = MAX_PATH + 1; std::vector buffer(bufferSize); if (!::GetVolumePathName(dirname.c_str(), //__in LPCTSTR lpszFileName, &buffer[0], //__out LPTSTR lpszVolumePathName, bufferSize)) //__in DWORD cchBufferLength - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"GetVolumePathName", getLastError())); DWORD fsFlags = 0; if (!::GetVolumeInformation(&buffer[0], //__in_opt LPCTSTR lpRootPathName, @@ -1003,11 +947,11 @@ bool zen::supportsPermissions(const Zstring& dirname) //throw FileError &fsFlags, //__out_opt LPDWORD lpFileSystemFlags, nullptr, //__out LPTSTR lpFileSystemNameBuffer, 0)) //__in DWORD nFileSystemNameSize - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"GetVolumeInformation", getLastError())); return (fsFlags & FILE_PERSISTENT_ACLS) != 0; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC return true; #endif } @@ -1029,7 +973,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, ProcSymli errno == EOPNOTSUPP) //extended attributes are not supported by the filesystem return; - throw FileError(replaceCpy(_("Cannot read security context of %x."), L"%x", fmtFileName(source)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read security context of %x."), L"%x", fmtFileName(source)), formatSystemError(L"getfilecon", getLastError())); } ZEN_ON_SCOPE_EXIT(::freecon(contextSource)); @@ -1057,7 +1001,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, ProcSymli ::setfilecon(target.c_str(), contextSource) : ::lsetfilecon(target.c_str(), contextSource); if (rv3 < 0) - throw FileError(replaceCpy(_("Cannot write security context of %x."), L"%x", fmtFileName(target)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write security context of %x."), L"%x", fmtFileName(target)), formatSystemError(L"setfilecon", getLastError())); } #endif //HAVE_SELINUX @@ -1065,7 +1009,7 @@ void copySecurityContext(const Zstring& source, const Zstring& target, ProcSymli //copy permissions for files, directories or symbolic links: requires admin rights void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSymlink procSl) //throw FileError { -#ifdef FFS_WIN +#ifdef ZEN_WIN //in contrast to ::SetSecurityInfo(), ::SetFileSecurity() seems to honor the "inherit DACL/SACL" flags //CAVEAT: if a file system does not support ACLs, GetFileSecurity() will return successfully with a *valid* security descriptor containing *no* ACL entries! @@ -1089,7 +1033,7 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSym } catch (const FileError& e)//add some more context description (e.g. user is not an admin) { - throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourceResolved)) + L"\n\n" + e.toString()); + throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourceResolved)), e.toString()); } @@ -1108,7 +1052,7 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSym if (bytesNeeded > buffer.size()) buffer.resize(bytesNeeded); else - throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourceResolved)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(sourceResolved)), formatSystemError(L"GetFileSecurity", getLastError())); } SECURITY_DESCRIPTOR& secDescr = reinterpret_cast(buffer[0]); @@ -1132,7 +1076,7 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSym OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION, //__in SECURITY_INFORMATION SecurityInformation, &secDescr)) //__in PSECURITY_DESCRIPTOR pSecurityDescriptor - throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(targetResolved)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(targetResolved)), formatSystemError(L"SetFileSecurity", getLastError())); /* PSECURITY_DESCRIPTOR buffer = nullptr; @@ -1214,7 +1158,7 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSym throw FileError */ -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #ifdef HAVE_SELINUX //copy SELinux security context copySecurityContext(source, target, procSl); //throw FileError @@ -1224,20 +1168,24 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSym if (procSl == SYMLINK_FOLLOW) { if (::stat(source.c_str(), &fileInfo) != 0) - throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(source)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(source)), formatSystemError(L"stat", getLastError())); + + if (::chown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0) // may require admin rights! + throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(target)), formatSystemError(L"chown", getLastError())); - if (::chown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights! - ::chmod(target.c_str(), fileInfo.st_mode) != 0) - throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(target)) + L"\n\n" + getLastErrorFormatted()); + if (::chmod(target.c_str(), fileInfo.st_mode) != 0) + throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(target)), formatSystemError(L"chmod", getLastError())); } else { if (::lstat(source.c_str(), &fileInfo) != 0) - throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(source)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read permissions of %x."), L"%x", fmtFileName(source)), formatSystemError(L"lstat", getLastError())); - if (::lchown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0 || // may require admin rights! - (!symlinkExists(target) && ::chmod(target.c_str(), fileInfo.st_mode) != 0)) //setting access permissions doesn't make sense for symlinks on Linux: there is no lchmod() - throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(target)) + L"\n\n" + getLastErrorFormatted()); + if (::lchown(target.c_str(), fileInfo.st_uid, fileInfo.st_gid) != 0) // may require admin rights! + throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(target)), formatSystemError(L"lchown", getLastError())); + + if (!symlinkExists(target) && ::chmod(target.c_str(), fileInfo.st_mode) != 0) //setting access permissions doesn't make sense for symlinks on Linux: there is no lchmod() + throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtFileName(target)), formatSystemError(L"chmod", getLastError())); } #endif } @@ -1315,7 +1263,7 @@ void zen::makeDirectoryPlain(const Zstring& directory, //throw FileError, ErrorT const Zstring& templateDir, bool copyFilePermissions) { -#ifdef FFS_WIN +#ifdef ZEN_WIN //special handling for volume root: trying to create existing root directory results in ERROR_ACCESS_DENIED rather than ERROR_ALREADY_EXISTS! Zstring dirTmp = removeLongPathPrefix(endsWith(directory, FILE_NAME_SEPARATOR) ? beforeLast(directory, FILE_NAME_SEPARATOR) : @@ -1327,10 +1275,12 @@ void zen::makeDirectoryPlain(const Zstring& directory, //throw FileError, ErrorT const ErrorCode lastError = dirExists(dirTmp) ? ERROR_ALREADY_EXISTS : ERROR_PATH_NOT_FOUND; - const std::wstring msg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtFileName(dirTmp)) + L"\n\n" + getLastErrorFormatted(lastError); + const std::wstring errorMsg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtFileName(dirTmp)); + const std::wstring errorDescr = formatSystemError(L"CreateDirectory", lastError); + if (lastError == ERROR_ALREADY_EXISTS) - throw ErrorTargetExisting(msg); - throw FileError(msg); //[!] this is NOT a ErrorTargetPathMissing case! + throw ErrorTargetExisting(errorMsg, errorDescr); + throw FileError(errorMsg, errorDescr); //[!] this is NOT a ErrorTargetPathMissing case! } //don't use ::CreateDirectoryEx: @@ -1357,32 +1307,35 @@ void zen::makeDirectoryPlain(const Zstring& directory, //throw FileError, ErrorT if (lastError != ERROR_SUCCESS) { - const std::wstring msg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted(lastError); + const std::wstring errorMsg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtFileName(directory)); + const std::wstring errorDescr = formatSystemError(L"CreateDirectory", lastError); + if (lastError == ERROR_ALREADY_EXISTS) - throw ErrorTargetExisting(msg); + throw ErrorTargetExisting(errorMsg, errorDescr); else if (lastError == ERROR_PATH_NOT_FOUND) - throw ErrorTargetPathMissing(msg); - throw FileError(msg); + throw ErrorTargetPathMissing(errorMsg, errorDescr); + throw FileError(errorMsg, errorDescr); } } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC if (::mkdir(directory.c_str(), 0755) != 0) //mode: drwxr-xr-x { - const std::wstring msg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted(); const ErrorCode lastError = getLastError(); + const std::wstring errorMsg = replaceCpy(_("Cannot create directory %x."), L"%x", fmtFileName(directory)); + const std::wstring errorDescr = formatSystemError(L"mkdir", lastError); if (lastError == EEXIST) - throw ErrorTargetExisting(msg); + throw ErrorTargetExisting(errorMsg, errorDescr); else if (lastError == ENOENT) - throw ErrorTargetPathMissing(msg); - throw FileError(msg); + throw ErrorTargetPathMissing(errorMsg, errorDescr); + throw FileError(errorMsg, errorDescr); } #endif if (!templateDir.empty()) { -#ifdef FFS_WIN +#ifdef ZEN_WIN //try to copy file attributes (dereference symlinks and junctions) const HANDLE hDirSrc = ::CreateFile(zen::applyLongPathPrefix(templateDir).c_str(), 0, @@ -1451,7 +1404,7 @@ void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool { const Zstring linkPath = getSymlinkTargetRaw(sourceLink); //throw FileError; accept broken symlinks -#ifdef FFS_WIN +#ifdef ZEN_WIN const bool isDirLink = [&]() -> bool { const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(sourceLink).c_str()); @@ -1463,22 +1416,24 @@ void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool const SysDllFun createSymbolicLink(L"kernel32.dll", "CreateSymbolicLinkW"); if (!createSymbolicLink) - throw FileError(replaceCpy(_("Cannot find system function %x."), L"%x", L"\"CreateSymbolicLinkW\"")); + throw FileError(replaceCpy(_("Cannot create symbolic link %x."), L"%x", fmtFileName(targetLink)), replaceCpy(_("Cannot find system function %x."), L"%x", L"\"CreateSymbolicLinkW\"")); + const wchar_t functionName[] = L"CreateSymbolicLinkW"; if (!createSymbolicLink(targetLink.c_str(), //__in LPTSTR lpSymlinkFileName, - seems no long path prefix is required... linkPath.c_str(), //__in LPTSTR lpTargetFileName, (isDirLink ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0))) //__in DWORD dwFlags -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC + const wchar_t functionName[] = L"symlink"; if (::symlink(linkPath.c_str(), targetLink.c_str()) != 0) #endif - throw FileError(replaceCpy(_("Cannot create symbolic link %x."), L"%x", fmtFileName(targetLink)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot create symbolic link %x."), L"%x", fmtFileName(targetLink)), formatSystemError(functionName, getLastError())); //allow only consistent objects to be created -> don't place before ::symlink, targetLink may already exist - zen::ScopeGuard guardNewDir = zen::makeGuard([&] + zen::ScopeGuard guardNewLink = zen::makeGuard([&] { try { -#ifdef FFS_WIN +#ifdef ZEN_WIN if (isDirLink) removeDirectory(targetLink); else @@ -1497,13 +1452,13 @@ void zen::copySymlink(const Zstring& sourceLink, const Zstring& targetLink, bool if (copyFilePermissions) copyObjectPermissions(sourceLink, targetLink, SYMLINK_DIRECT); //throw FileError - guardNewDir.dismiss(); //target has been created successfully! + guardNewLink.dismiss(); //target has been created successfully! } namespace { -#ifdef FFS_WIN +#ifdef ZEN_WIN /* CopyFileEx() BackupRead() FileRead() -------------------------------------------- @@ -1626,24 +1581,27 @@ void copyFileWindowsSparse(const Zstring& sourceFile, { const DWORD lastError = ::GetLastError(); - const std::wstring shortMsg = replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)); + const std::wstring errorMsg = replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)); + std::wstring errorDescr = formatSystemError(L"CreateFile", lastError); //if file is locked throw "ErrorFileLocked" instead! if (lastError == ERROR_SHARING_VIOLATION || lastError == ERROR_LOCK_VIOLATION) { const Zstring procList = getLockingProcessNames(sourceFile); //throw() - throw ErrorFileLocked(shortMsg + L"\n\n" + (!procList.empty() ? _("The file is locked by another process:") + L"\n" + procList : getLastErrorFormatted(lastError))); + if (!procList.empty()) + errorDescr = _("The file is locked by another process:") + L"\n" + procList; + throw ErrorFileLocked(errorMsg, errorDescr); } - throw FileError(shortMsg + L"\n\n" + getLastErrorFormatted(lastError) + L" (open)"); + throw FileError(errorMsg, errorDescr); } ZEN_ON_SCOPE_EXIT(::CloseHandle(hFileSource)); //---------------------------------------------------------------------- BY_HANDLE_FILE_INFORMATION fileInfoSource = {}; if (!::GetFileInformationByHandle(hFileSource, &fileInfoSource)) - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceFile)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceFile)), formatSystemError(L"GetFileInformationByHandle", getLastError())); //---------------------------------------------------------------------- const DWORD validAttribs = FILE_ATTRIBUTE_NORMAL | //"This attribute is valid only if used alone." @@ -1665,17 +1623,18 @@ void copyFileWindowsSparse(const Zstring& sourceFile, nullptr); if (hFileTarget == INVALID_HANDLE_VALUE) { - const DWORD lastError = ::GetLastError(); - const std::wstring errorMessage = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (open)"; + const ErrorCode lastError = getLastError(); //copy before making other system calls! + const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile)); + const std::wstring errorDescr = formatSystemError(L"CreateFile", lastError); if (lastError == ERROR_FILE_EXISTS || //confirmed to be used lastError == ERROR_ALREADY_EXISTS) //comment on msdn claims, this one is used on Windows Mobile 6 - throw ErrorTargetExisting(errorMessage); + throw ErrorTargetExisting(errorMsg, errorDescr); if (lastError == ERROR_PATH_NOT_FOUND) - throw ErrorTargetPathMissing(errorMessage); + throw ErrorTargetPathMissing(errorMsg, errorDescr); - throw FileError(errorMessage); + throw FileError(errorMsg, errorDescr); } ScopeGuard guardTarget = makeGuard([&] { try { removeFile(targetFile); } catch (...) {} }); //transactional behavior: guard just after opening target and before managing hFileOut ZEN_ON_SCOPE_EXIT(::CloseHandle(hFileTarget)); @@ -1683,7 +1642,7 @@ void copyFileWindowsSparse(const Zstring& sourceFile, //---------------------------------------------------------------------- BY_HANDLE_FILE_INFORMATION fileInfoTarget = {}; if (!::GetFileInformationByHandle(hFileTarget, &fileInfoTarget)) - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(targetFile)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(targetFile)), formatSystemError(L"GetFileInformationByHandle", getLastError())); //return up-to-date file attributes if (newAttrib) @@ -1732,8 +1691,8 @@ void copyFileWindowsSparse(const Zstring& sourceFile, 0, //OutBufferSize &bytesReturned, //number of bytes returned nullptr)) //OVERLAPPED structure - throw FileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(targetFile)) + - L"\n\n" + zen::getLastErrorFormatted() + L" (NTFS sparse)"); + throw FileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(targetFile)), + formatSystemError(L"DeviceIoControl, FSCTL_SET_SPARSE", getLastError())); } //---------------------------------------------------------------------- @@ -1760,10 +1719,10 @@ void copyFileWindowsSparse(const Zstring& sourceFile, false, //__in BOOL bAbort, false, //__in BOOL bProcessSecurity, &contextRead)) //__out LPVOID *lpContext - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)) + L"\n\n" + getLastErrorFormatted()); //better use fine-granular error messages "reading/writing"! + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)), formatSystemError(L"BackupRead", getLastError())); //better use fine-granular error messages "reading/writing"! if (bytesRead > BUFFER_SIZE) - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)) + L"\n\n" + L"(buffer overflow)"); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)), L"buffer overflow"); //user should never see this if (bytesRead < BUFFER_SIZE) eof = true; @@ -1776,10 +1735,10 @@ void copyFileWindowsSparse(const Zstring& sourceFile, false, //__in BOOL bAbort, false, //__in BOOL bProcessSecurity, &contextWrite)) //__out LPVOID *lpContext - throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile)), formatSystemError(L"BackupWrite", getLastError())); if (bytesWritten != bytesRead) - throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile)) + L"\n\n" + L"(incomplete write)"); + throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile)), L"incomplete write"); //user should never see this //total bytes transferred may be larger than file size! context information + ADS or smaller (sparse, compressed)! @@ -1797,14 +1756,14 @@ void copyFileWindowsSparse(const Zstring& sourceFile, //::BackupRead() silently fails reading encrypted files -> double check! if (!someBytesWritten && UInt64(fileInfoSource.nFileSizeLow, fileInfoSource.nFileSizeHigh) != 0U) //note: there is no guaranteed ordering relation beween bytes transferred and file size! Consider ADS (>) and compressed/sparse files (<)! - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)) + L"\n\n" + L"(unknown error)"); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)), L"unknown error"); //user should never see this -> this method is called only if "canCopyAsSparse()" //time needs to be set at the end: BackupWrite() changes modification time if (!::SetFileTime(hFileTarget, &fileInfoSource.ftCreationTime, nullptr, &fileInfoSource.ftLastWriteTime)) - throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(targetFile)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(targetFile)), formatSystemError(L"SetFileTime", getLastError())); guardTarget.dismiss(); @@ -1854,7 +1813,7 @@ public: void reportUserException(CallbackCopyFile& userCallback) { exceptionInUserCallback = &userCallback; } - void reportError(const std::wstring& message) { errorMsg = message; } + void reportError(const std::wstring& msg, const std::wstring& description) { errorMsg = std::make_pair(msg, description); } //call context: copyFileWindowsDefault() void evaluateErrors() //throw X @@ -1865,14 +1824,14 @@ public: if (exceptionInUserCallback) exceptionInUserCallback->updateCopyStatus(0); //rethrow (hopefully!) - if (!errorMsg.empty()) - throw FileError(errorMsg); + if (!errorMsg.first.empty()) + throw FileError(errorMsg.first, errorMsg.second); } private: - bool shouldCopyAsSparse; // - std::wstring errorMsg; //these are exclusive! - CallbackCopyFile* exceptionInUserCallback; // + bool shouldCopyAsSparse; // + std::pair errorMsg; //these are exclusive! + CallbackCopyFile* exceptionInUserCallback; // }; @@ -1935,14 +1894,14 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize, BY_HANDLE_FILE_INFORMATION fileInfoSrc = {}; if (!::GetFileInformationByHandle(hSourceFile, &fileInfoSrc)) { - cbd.errorHandler.reportError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(cbd.sourceFile_)) + L"\n\n" + getLastErrorFormatted()); + cbd.errorHandler.reportError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(cbd.sourceFile_)), formatSystemError(L"GetFileInformationByHandle", getLastError())); return PROGRESS_CANCEL; } BY_HANDLE_FILE_INFORMATION fileInfoTrg = {}; if (!::GetFileInformationByHandle(hDestinationFile, &fileInfoTrg)) { - cbd.errorHandler.reportError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(cbd.targetFile_)) + L"\n\n" + getLastErrorFormatted()); + cbd.errorHandler.reportError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(cbd.targetFile_)), formatSystemError(L"GetFileInformationByHandle", getLastError())); return PROGRESS_CANCEL; } @@ -2055,16 +2014,17 @@ void copyFileWindowsDefault(const Zstring& sourceFile, throw ErrorShouldCopyAsSparse(L"sparse dummy value2"); //assemble error message... - std::wstring errorMessage = replaceCpy(replaceCpy(_("Cannot copy file %x to %y."), L"%x", L"\n" + fmtFileName(sourceFile)), L"%y", L"\n" + fmtFileName(targetFile)) + - L"\n\n" + getLastErrorFormatted(lastError); + const std::wstring errorMsg = replaceCpy(replaceCpy(_("Cannot copy file %x to %y."), L"%x", L"\n" + fmtFileName(sourceFile)), L"%y", L"\n" + fmtFileName(targetFile)); + std::wstring errorDescr = formatSystemError(L"CopyFileEx", lastError); //if file is locked throw "ErrorFileLocked" instead! if (lastError == ERROR_SHARING_VIOLATION || lastError == ERROR_LOCK_VIOLATION) { const Zstring procList = getLockingProcessNames(sourceFile); //throw() -> enhance error message! - throw ErrorFileLocked(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)) + L"\n\n" + - (!procList.empty() ? _("The file is locked by another process:") + L"\n" + procList : getLastErrorFormatted(lastError))); + if (!procList.empty()) + errorDescr = _("The file is locked by another process:") + L"\n" + procList; + throw ErrorFileLocked(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)), errorDescr); } //if target is existing this functions is expected to throw ErrorTargetExisting!!! @@ -2072,13 +2032,13 @@ void copyFileWindowsDefault(const Zstring& sourceFile, lastError == ERROR_ALREADY_EXISTS) //not sure if used -> better be safe than sorry!!! { guardTarget.dismiss(); //don't delete file that existed previously! - throw ErrorTargetExisting(errorMessage); + throw ErrorTargetExisting(errorMsg, errorDescr); } if (lastError == ERROR_PATH_NOT_FOUND) { guardTarget.dismiss(); //not relevant - throw ErrorTargetPathMissing(errorMessage); + throw ErrorTargetPathMissing(errorMsg, errorDescr); } try //add more meaningful message @@ -2087,13 +2047,13 @@ void copyFileWindowsDefault(const Zstring& sourceFile, if (lastError == ERROR_INVALID_PARAMETER && dst::isFatDrive(targetFile) && getFilesize(sourceFile) >= 4U * UInt64(1024U * 1024 * 1024)) //throw FileError - errorMessage += L"\nFAT volume cannot store files larger than 4 gigabyte!"; + errorDescr += L"\nFAT volume cannot store files larger than 4 gigabyte!"; //note: ERROR_INVALID_PARAMETER can also occur when copying to a SharePoint server or MS SkyDrive and the target filename is of a restricted type. } catch (...) {} - throw FileError(errorMessage); + throw FileError(errorMsg, errorDescr); } if (newAttrib) @@ -2152,7 +2112,7 @@ void copyFileWindows(const Zstring& sourceFile, const Zstring& targetFile, Callb } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC void copyFileLinuxMac(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile* callback, @@ -2163,7 +2123,7 @@ void copyFileLinuxMac(const Zstring& sourceFile, struct ::stat sourceInfo = {}; if (::fstat(fileIn.getDescriptor(), &sourceInfo) != 0) //read file attributes from source - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceFile)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceFile)), formatSystemError(L"fstat", getLastError())); zen::ScopeGuard guardTarget = zen::makeGuard([&] { try { removeFile(targetFile); } catch (...) {} }); //transactional behavior: place guard before lifetime of FileOutput try @@ -2190,7 +2150,7 @@ void copyFileLinuxMac(const Zstring& sourceFile, //read and return file statistics struct ::stat targetInfo = {}; if (::fstat(fileOut.getDescriptor(), &targetInfo) != 0) - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(targetFile)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(targetFile)), formatSystemError(L"fstat", getLastError())); if (newAttrib) { @@ -2249,10 +2209,10 @@ copyFileWindowsDefault(::CopyFileEx) copyFileWindowsSparse(::BackupRead/::Backu inline void copyFileSelectOs(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile* callback, FileAttrib* sourceAttr) { -#ifdef FFS_WIN +#ifdef ZEN_WIN copyFileWindows(sourceFile, targetFile, callback, sourceAttr); //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC copyFileLinuxMac(sourceFile, targetFile, callback, sourceAttr); //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting #endif } diff --git a/zen/file_handling.h b/zen/file_handling.h index c18a68ac..f677358b 100644 --- a/zen/file_handling.h +++ b/zen/file_handling.h @@ -4,13 +4,13 @@ // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** -#ifndef FILE_HANDLING_H_INCLUDED -#define FILE_HANDLING_H_INCLUDED +#ifndef FILE_HANDLING_H_8017341345614857 +#define FILE_HANDLING_H_8017341345614857 #include "zstring.h" #include "file_error.h" -#include "int64.h" #include "file_id_def.h" +#include "int64.h" namespace zen { @@ -18,20 +18,10 @@ struct CallbackRemoveDir; struct CallbackCopyFile; -bool fileExists (const Zstring& filename); //throw() check whether file or symlink exists -bool dirExists (const Zstring& dirname); //throw() check whether directory or symlink exists -bool symlinkExists (const Zstring& linkname); //throw() check whether a symbolic link exists -bool somethingExists(const Zstring& objname); //throw() check whether any object with this name exists - -//check whether two folders are located on the same (logical) volume -//left and right directories NEED NOT yet exist! volume prefix is sufficient! path may end with PATH_SEPARATOR -enum ResponseSame -{ - IS_SAME_YES, - IS_SAME_NO, - IS_SAME_CANT_SAY -}; -ResponseSame onSameVolume(const Zstring& folderLeft, const Zstring& folderRight); //throw() +bool fileExists (const Zstring& filename); //noexcept; check whether file *or* (file) symlink exists +bool dirExists (const Zstring& dirname); //noexcept; check whether directory *or* (dir) symlink exists +bool symlinkExists (const Zstring& linkname); //noexcept; check whether a symbolic link exists +bool somethingExists(const Zstring& objname); //noexcept; check whether any object with this name exists enum SymLinkType { @@ -39,7 +29,7 @@ enum SymLinkType SYMLINK_TYPE_FILE, //Windows: may be broken SYMLINK_TYPE_UNKNOWN, //Windows: unable to determine type; Linux: broken Symlink }; -SymLinkType getSymlinkType(const Zstring& linkname); //throw() +SymLinkType getSymlinkType(const Zstring& linkname); //noexcept enum ProcSymlink { @@ -66,7 +56,7 @@ bool supportsPermissions(const Zstring& dirname); //throw FileError, derefernces //if parent directory not existing: create recursively: void makeDirectory(const Zstring& directory, bool failIfExists = false); //throw FileError, ErrorTargetExisting -//fail if already existing or parent not existing: +//fail if already existing or parent directory not existing: //directory should not end with path separator //templateDir may be empty void makeDirectoryPlain(const Zstring& directory, const Zstring& templateDir, bool copyFilePermissions); //throw FileError, ErrorTargetExisting, ErrorTargetPathMissing @@ -116,4 +106,4 @@ struct CallbackCopyFile }; } -#endif //FILE_HANDLING_H_INCLUDED +#endif //FILE_HANDLING_H_8017341345614857 diff --git a/zen/file_id.cpp b/zen/file_id.cpp index 8c66d1c9..310390da 100644 --- a/zen/file_id.cpp +++ b/zen/file_id.cpp @@ -6,19 +6,19 @@ #include "file_id.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "win.h" //includes "windows.h" #include "long_path_prefix.h" #include "scope_guard.h" -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include #endif zen::FileId zen::getFileID(const Zstring& filename) { -#ifdef FFS_WIN +#ifdef ZEN_WIN //WARNING: CreateFile() is SLOW, while GetFileInformationByHandle() is cheap! http://msdn.microsoft.com/en-us/library/aa363788(VS.85).aspx //privilege SE_BACKUP_NAME doesn't seem to be required here at all @@ -38,7 +38,7 @@ zen::FileId zen::getFileID(const Zstring& filename) return extractFileID(fileInfo); } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC struct ::stat fileInfo = {}; if (::lstat(filename.c_str(), &fileInfo) == 0) return extractFileID(fileInfo); diff --git a/zen/file_id_def.h b/zen/file_id_def.h index 54012b4f..0608aacd 100644 --- a/zen/file_id_def.h +++ b/zen/file_id_def.h @@ -10,17 +10,17 @@ #include #include "assert_static.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "win.h" //includes "windows.h" -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include #endif namespace zen { -#ifdef FFS_WIN +#ifdef ZEN_WIN typedef DWORD DeviceId; typedef ULONGLONG FileIndex; @@ -49,7 +49,7 @@ assert_static(sizeof(FileId().second) == sizeof(BY_HANDLE_FILE_INFORMATION().nFi assert_static(sizeof(FileId().second) == sizeof(ULARGE_INTEGER)); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC namespace impl { typedef struct ::stat StatDummy; } //sigh... typedef decltype(impl::StatDummy::st_dev) DeviceId; diff --git a/zen/file_io.cpp b/zen/file_io.cpp index cda48e36..e0f8c12e 100644 --- a/zen/file_io.cpp +++ b/zen/file_io.cpp @@ -6,13 +6,13 @@ #include "file_io.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "long_path_prefix.h" #include "IFileOperation/file_op.h" #include "win_ver.h" #include "dll.h" -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include //open, close #include //read, write #endif @@ -22,7 +22,7 @@ using namespace zen; namespace { -#ifdef FFS_WIN +#ifdef ZEN_WIN //(try to) enhance error messages by showing which processes lock the file Zstring getLockingProcessNames(const Zstring& filename) //throw(), empty string if none found or error occurred { @@ -45,7 +45,7 @@ Zstring getLockingProcessNames(const Zstring& filename) //throw(), empty string return Zstring(); } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC //"filename" could be a named pipe which *blocks* forever during "open()"! https://sourceforge.net/p/freefilesync/bugs/221/ void checkForUnsupportedType(const Zstring& filename) //throw FileError { @@ -77,10 +77,11 @@ void checkForUnsupportedType(const Zstring& filename) //throw FileError FileInput::FileInput(FileHandle handle, const Zstring& filename) : FileInputBase(filename), fileHandle(handle) {} -FileInput::FileInput(const Zstring& filename) : //throw FileError, ErrorNotExisting +FileInput::FileInput(const Zstring& filename) : //throw FileError, ErrorNotExisting FileInputBase(filename) { -#ifdef FFS_WIN +#ifdef ZEN_WIN + const wchar_t functionName[] = L"CreateFile"; fileHandle = ::CreateFile(applyLongPathPrefix(filename).c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, @@ -113,41 +114,42 @@ FileInput::FileInput(const Zstring& filename) : //throw FileError, ErrorNotExis */ nullptr); if (fileHandle == INVALID_HANDLE_VALUE) -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC checkForUnsupportedType(filename); //throw FileError; reading a named pipe would block forever! + const wchar_t functionName[] = L"fopen"; fileHandle = ::fopen(filename.c_str(), "r,type=record,noseek"); //utilize UTF-8 filename if (!fileHandle) #endif { - const ErrorCode lastError = getLastError(); - const std::wstring shortMsg = errorCodeForNotExisting(lastError) ? + const ErrorCode lastError = getLastError(); //copy before making other system calls! + const std::wstring errorMsg = errorCodeForNotExisting(lastError) ? replaceCpy(_("Cannot find file %x."), L"%x", fmtFileName(filename)) : replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename)); - std::wstring errorMsg = shortMsg + L"\n\n" + zen::getLastErrorFormatted(lastError); + std::wstring errorDescr = formatSystemError(functionName, lastError); -#ifdef FFS_WIN +#ifdef ZEN_WIN if (lastError == ERROR_SHARING_VIOLATION || //-> enhance error message! lastError == ERROR_LOCK_VIOLATION) { const Zstring procList = getLockingProcessNames(filename); //throw() if (!procList.empty()) - errorMsg = shortMsg + L"\n\n" + _("The file is locked by another process:") + L"\n" + procList; + errorDescr = _("The file is locked by another process:") + L"\n" + procList; } #endif if (errorCodeForNotExisting(lastError)) - throw ErrorNotExisting(errorMsg); + throw ErrorNotExisting(errorMsg, errorDescr); - throw FileError(errorMsg + L" (open)"); + throw FileError(errorMsg, errorDescr); } } FileInput::~FileInput() { -#ifdef FFS_WIN +#ifdef ZEN_WIN ::CloseHandle(fileHandle); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC ::fclose(fileHandle); //NEVER allow passing nullptr to fclose! -> crash!; fileHandle != nullptr in this context! #endif } @@ -157,34 +159,36 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //returns actual number { assert(!eof()); if (bytesToRead == 0) return 0; -#ifdef FFS_WIN +#ifdef ZEN_WIN + const wchar_t functionName[] = L"ReadFile"; DWORD bytesRead = 0; - if (!::ReadFile(fileHandle, //__in HANDLE hFile, - buffer, //__out LPVOID lpBuffer, + if (!::ReadFile(fileHandle, //__in HANDLE hFile, + buffer, //__out LPVOID lpBuffer, static_cast(bytesToRead), //__in DWORD nNumberOfBytesToRead, - &bytesRead, //__out_opt LPDWORD lpNumberOfBytesRead, - nullptr)) //__inout_opt LPOVERLAPPED lpOverlapped -#elif defined FFS_LINUX || defined FFS_MAC + &bytesRead, //__out_opt LPDWORD lpNumberOfBytesRead, + nullptr)) //__inout_opt LPOVERLAPPED lpOverlapped +#elif defined ZEN_LINUX || defined ZEN_MAC + const wchar_t functionName[] = L"fread"; const size_t bytesRead = ::fread(buffer, 1, bytesToRead, fileHandle); if (::ferror(fileHandle) != 0) //checks status of stream, not fread()! #endif - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + getLastErrorFormatted() + L" (ReadFile)"); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())), formatSystemError(functionName, getLastError())); -#ifdef FFS_WIN +#ifdef ZEN_WIN if (bytesRead < bytesToRead) //verify only! setEof(); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC if (::feof(fileHandle) != 0) setEof(); if (bytesRead < bytesToRead) if (!eof()) //pathologic!? - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + L"Incomplete read!"); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())), L"Incomplete read!"); //user should never see this #endif if (bytesRead > bytesToRead) - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + L"buffer overflow"); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())), L"buffer overflow"); //user should never see this return bytesRead; } @@ -196,7 +200,7 @@ FileOutput::FileOutput(FileHandle handle, const Zstring& filename) : FileOutputB FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting FileOutputBase(filename) { -#ifdef FFS_WIN +#ifdef ZEN_WIN const DWORD dwCreationDisposition = access == FileOutput::ACC_OVERWRITE ? CREATE_ALWAYS : CREATE_NEW; auto getHandle = [&](DWORD dwFlagsAndAttributes) @@ -218,7 +222,7 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw Fil fileHandle = getHandle(FILE_ATTRIBUTE_NORMAL); if (fileHandle == INVALID_HANDLE_VALUE) { - DWORD lastError = ::GetLastError(); + DWORD lastError = ::GetLastError(); //copy before making other system calls! //CREATE_ALWAYS fails with ERROR_ACCESS_DENIED if the existing file is hidden or "system" http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx if (lastError == ERROR_ACCESS_DENIED && @@ -235,44 +239,46 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw Fil //begin of "regular" error reporting if (fileHandle == INVALID_HANDLE_VALUE) { - const std::wstring shortMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filename)); - std::wstring errorMsg = shortMsg + L"\n\n" + zen::getLastErrorFormatted(lastError); + const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filename)); + std::wstring errorDescr = formatSystemError(L"CreateFile", lastError); if (lastError == ERROR_SHARING_VIOLATION || //-> enhance error message! lastError == ERROR_LOCK_VIOLATION) { const Zstring procList = getLockingProcessNames(filename); //throw() if (!procList.empty()) - errorMsg = shortMsg + L"\n\n" + _("The file is locked by another process:") + L"\n" + procList; + errorDescr = _("The file is locked by another process:") + L"\n" + procList; } if (lastError == ERROR_FILE_EXISTS || //confirmed to be used lastError == ERROR_ALREADY_EXISTS) //comment on msdn claims, this one is used on Windows Mobile 6 - throw ErrorTargetExisting(errorMsg); + throw ErrorTargetExisting(errorMsg, errorDescr); if (lastError == ERROR_PATH_NOT_FOUND) - throw ErrorTargetPathMissing(errorMsg); + throw ErrorTargetPathMissing(errorMsg, errorDescr); - throw FileError(errorMsg); + throw FileError(errorMsg, errorDescr); } } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC checkForUnsupportedType(filename); //throw FileError; writing a named pipe would block forever! fileHandle = ::fopen(filename.c_str(), //GNU extension: https://www.securecoding.cert.org/confluence/display/cplusplus/FIO03-CPP.+Do+not+make+assumptions+about+fopen()+and+file+creation access == ACC_OVERWRITE ? "w,type=record,noseek" : "wx,type=record,noseek"); if (!fileHandle) { - const int lastError = errno; - const std::wstring errorMessage = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + zen::getLastErrorFormatted(lastError); + const ErrorCode lastError = getLastError(); //copy before making other system calls! + const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())); + const std::wstring errorDescr = formatSystemError(L"fopen", lastError); + if (lastError == EEXIST) - throw ErrorTargetExisting(errorMessage); + throw ErrorTargetExisting(errorMsg, errorDescr); if (lastError == ENOENT) - throw ErrorTargetPathMissing(errorMessage); + throw ErrorTargetPathMissing(errorMsg, errorDescr); - throw FileError(errorMessage); + throw FileError(errorMsg, errorDescr); } #endif } @@ -280,9 +286,9 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw Fil FileOutput::~FileOutput() { -#ifdef FFS_WIN +#ifdef ZEN_WIN ::CloseHandle(fileHandle); -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC ::fclose(fileHandle); //NEVER allow passing nullptr to fclose! -> crash! #endif } @@ -290,25 +296,27 @@ FileOutput::~FileOutput() void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw FileError { -#ifdef FFS_WIN +#ifdef ZEN_WIN + const wchar_t functionName[] = L"WriteFile"; DWORD bytesWritten = 0; //this parameter is NOT optional: http://blogs.msdn.com/b/oldnewthing/archive/2013/04/04/10407417.aspx if (!::WriteFile(fileHandle, //__in HANDLE hFile, buffer, //__out LPVOID lpBuffer, static_cast(bytesToWrite), //__in DWORD nNumberOfBytesToWrite, &bytesWritten, //__out_opt LPDWORD lpNumberOfBytesWritten, nullptr)) //__inout_opt LPOVERLAPPED lpOverlapped -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC + const wchar_t functionName[] = L"fwrite"; const size_t bytesWritten = ::fwrite(buffer, 1, bytesToWrite, fileHandle); if (::ferror(fileHandle) != 0) //checks status of stream, not fwrite()! #endif - throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + getLastErrorFormatted() + L" (WriteFile)"); + throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())), formatSystemError(functionName, getLastError())); if (bytesWritten != bytesToWrite) //must be fulfilled for synchronous writes! - throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + L"Incomplete write!"); + throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())), L"Incomplete write!"); //user should never see this } -#if defined FFS_LINUX || defined FFS_MAC +#if defined ZEN_LINUX || defined ZEN_MAC //Compare copy_reg() in copy.c: ftp://ftp.gnu.org/gnu/coreutils/coreutils-5.0.tar.gz FileInputUnbuffered::FileInputUnbuffered(const Zstring& filename) : FileInputBase(filename) //throw FileError, ErrorNotExisting @@ -316,14 +324,19 @@ FileInputUnbuffered::FileInputUnbuffered(const Zstring& filename) : FileInputBas checkForUnsupportedType(filename); //throw FileError; reading a named pipe would block forever! fdFile = ::open(filename.c_str(), O_RDONLY); - if (fdFile == -1) + if (fdFile == -1) //don't check "< 0" -> docu seems to allow "-2" to be a valid file handle { - const ErrorCode lastError = getLastError(); + const ErrorCode lastError = getLastError(); //copy before making other system calls! + + const std::wstring errorMsg = errorCodeForNotExisting(lastError) ? + replaceCpy(_("Cannot find file %x."), L"%x", fmtFileName(filename)) : + replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename)); + const std::wstring errorDescr = formatSystemError(L"open", lastError); if (errorCodeForNotExisting(lastError)) - throw ErrorNotExisting(replaceCpy(_("Cannot find file %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted(lastError)); + throw ErrorNotExisting(errorMsg, errorDescr); - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (open)"); + throw FileError(errorMsg, errorDescr); } } @@ -344,11 +357,11 @@ size_t FileInputUnbuffered::read(void* buffer, size_t bytesToRead) //throw FileE while (bytesRead < 0 && errno == EINTR); if (bytesRead < 0) - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + getLastErrorFormatted() + L" (read)"); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())), formatSystemError(L"read", getLastError())); else if (bytesRead == 0) //"zero indicates end of file" setEof(); else if (bytesRead > static_cast(bytesToRead)) //better safe than sorry - throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + L"buffer overflow"); + throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(getFilename())), L"buffer overflow"); //user should never see this //if ::read is interrupted (EINTR) right in the middle, it will return successfully with "bytesRead < bytesToRead"! return bytesRead; @@ -363,15 +376,17 @@ FileOutputUnbuffered::FileOutputUnbuffered(const Zstring& filename, mode_t mode) fdFile = ::open(filename.c_str(), O_CREAT | O_WRONLY | O_EXCL, mode & (S_IRWXU | S_IRWXG | S_IRWXO)); if (fdFile == -1) { - const int lastError = errno; - const std::wstring errorMessage = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filename)) + L"\n\n" + zen::getLastErrorFormatted(lastError); + const int lastError = errno; //copy before making other system calls! + const std::wstring errorMsg = replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filename)); + const std::wstring errorDescr = formatSystemError(L"open", lastError); + if (lastError == EEXIST) - throw ErrorTargetExisting(errorMessage); + throw ErrorTargetExisting(errorMsg, errorDescr); if (lastError == ENOENT) - throw ErrorTargetPathMissing(errorMessage); + throw ErrorTargetPathMissing(errorMsg, errorDescr); - throw FileError(errorMessage); + throw FileError(errorMsg, errorDescr); } } @@ -396,10 +411,10 @@ void FileOutputUnbuffered::write(const void* buffer, size_t bytesToWrite) //thro if (bytesWritten == 0) //comment in safe-read.c suggests to treat this as an error due to buggy drivers errno = ENOSPC; - throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + getLastErrorFormatted() + L" (write)"); + throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())), formatSystemError(L"write", getLastError())); } if (bytesWritten > static_cast(bytesToWrite)) //better safe than sorry - throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())) + L"\n\n" + L"buffer overflow"); + throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(getFilename())), L"buffer overflow"); //user should never see this //if ::write is interrupted (EINTR) right in the middle, it will return successfully with "bytesWritten < bytesToWrite"! buffer = static_cast(buffer) + bytesWritten; //suppress warning about pointer arithmetics on void* diff --git a/zen/file_io.h b/zen/file_io.h index 407109f7..93267a39 100644 --- a/zen/file_io.h +++ b/zen/file_io.h @@ -10,9 +10,9 @@ #include "file_io_base.h" #include "file_error.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "win.h" //includes "windows.h" -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include #include #endif @@ -20,19 +20,19 @@ namespace zen { -#ifdef FFS_WIN +#ifdef ZEN_WIN static const char LINE_BREAK[] = "\r\n"; -#elif defined FFS_LINUX +#elif defined ZEN_LINUX static const char LINE_BREAK[] = "\n"; -#elif defined FFS_MAC +#elif defined ZEN_MAC static const char LINE_BREAK[] = "\r"; #endif //buffered file IO optimized for sequential read/write accesses + better error reporting + long path support (following symlinks) -#ifdef FFS_WIN +#ifdef ZEN_WIN typedef HANDLE FileHandle; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC typedef FILE* FileHandle; #endif @@ -64,7 +64,7 @@ private: FileHandle fileHandle; }; -#if defined FFS_LINUX || defined FFS_MAC +#if defined ZEN_LINUX || defined ZEN_MAC class FileInputUnbuffered : public FileInputBase { public: diff --git a/zen/file_traverser.cpp b/zen/file_traverser.cpp index 53049c21..a3e8491a 100644 --- a/zen/file_traverser.cpp +++ b/zen/file_traverser.cpp @@ -5,11 +5,11 @@ // ************************************************************************** #include "file_traverser.h" -#include "last_error.h" +#include "sys_error.h" #include "assert_static.h" #include "symlink_target.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #include "long_path_prefix.h" #include "dst_hack.h" @@ -17,11 +17,11 @@ #include "dll.h" #include "FindFilePlus/find_file_plus.h" -#elif defined FFS_MAC +#elif defined ZEN_MAC #include #endif -#if defined FFS_LINUX || defined FFS_MAC +#if defined ZEN_LINUX || defined ZEN_MAC #include #include #endif @@ -76,7 +76,7 @@ bool tryReportingItemError(Command cmd, zen::TraverseCallback& callback, const Z } -#ifdef FFS_WIN +#ifdef ZEN_WIN void getInfoFromFileSymlink(const Zstring& linkName, zen::TraverseCallback::FileInfo& output) //throw FileError { //open handle to target of symbolic link @@ -88,24 +88,25 @@ void getInfoFromFileSymlink(const Zstring& linkName, zen::TraverseCallback::File FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory -> keep it even if we expect to open a file! See comment below nullptr); if (hFile == INVALID_HANDLE_VALUE) - throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkName)) + L"\n\n" + getLastErrorFormatted() + L" (CreateFile)"); + throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkName)), formatSystemError(L"CreateFile", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hFile)); BY_HANDLE_FILE_INFORMATION fileInfo = {}; if (!::GetFileInformationByHandle(hFile, &fileInfo)) - throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkName)) + L"\n\n" + getLastErrorFormatted() + L" (GetFileInformationByHandle)"); + throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkName)), formatSystemError(L"GetFileInformationByHandle", getLastError())); //a file symlink may incorrectly point to a directory, but both CreateFile() and GetFileInformationByHandle() will succeed and return garbage! - //- if we did not use FILE_FLAG_BACKUP_SEMANTICS above, CreateFile() would error out with an even less helpful ERROR_ACCESS_DENIED! + //- if we did not use FILE_FLAG_BACKUP_SEMANTICS above, CreateFile() would error out with an even less helpful ERROR_ACCESS_DENIED! //- reinterpreting the link as a directory symlink would still fail during traversal, so just show an error here //- OTOH a directory symlink that points to a file fails immediately in ::FindFirstFile() with ERROR_DIRECTORY! -> nothing to do in this case if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkName)) + L"\n\n" + getLastErrorFormatted(ERROR_FILE_INVALID) + L" (GetFileInformationByHandle)"); + throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkName)), formatSystemError(L"GetFileInformationByHandle", static_cast(ERROR_FILE_INVALID))); //write output output.fileSize = UInt64(fileInfo.nFileSizeLow, fileInfo.nFileSizeHigh); output.lastWriteTime = toTimeT(fileInfo.ftLastWriteTime); output.id = extractFileID(fileInfo); //consider detection of moved files: allow for duplicate file ids, renaming affects symlink, not target, ... + //output.symlinkInfo -> not filled here } @@ -191,15 +192,16 @@ struct Win32Traverser //no noticable performance difference compared to FindFirstFileEx with FindExInfoBasic, FIND_FIRST_EX_CASE_SENSITIVE and/or FIND_FIRST_EX_LARGE_FETCH if (hnd.searchHandle == INVALID_HANDLE_VALUE) { + const ErrorCode lastError = getLastError(); //copy before making other system calls! hnd.haveData = false; - if (::GetLastError() == ERROR_FILE_NOT_FOUND) + if (lastError == ERROR_FILE_NOT_FOUND) { //1. directory may not exist *or* 2. it is completely empty: not all directories contain "., .." entries, e.g. a drive's root directory; NetDrive // -> FindFirstFile() is a nice example of violation of API design principle of single responsibility if (dirExists(dirname)) //yes, a race-condition, still the best we can do return; } - throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"FindFirstFile", lastError)); } } @@ -220,10 +222,11 @@ struct Win32Traverser if (!::FindNextFile(hnd.searchHandle, &fileInfo)) { - if (::GetLastError() == ERROR_NO_MORE_FILES) //not an error situation + const ErrorCode lastError = getLastError(); //copy before making other system calls! + if (lastError == ERROR_NO_MORE_FILES) //not an error situation return false; //else we have a problem... report it: - throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"FindNextFile", lastError)); } return true; } @@ -259,7 +262,7 @@ struct FilePlusTraverser { hnd.searchHandle = ::openDir(applyLongPathPrefix(dirname).c_str()); if (hnd.searchHandle == nullptr) - throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted() + L" (+)"); + throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"openDir", getLastError())); } static void destroy(DirHandle hnd) { ::closeDir(hnd.searchHandle); } //throw() @@ -284,7 +287,7 @@ struct FilePlusTraverser } //else we have a problem... report it: - throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (+)"); + throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"readDir", lastError)); } return true; @@ -310,10 +313,8 @@ class DirTraverser { public: DirTraverser(const Zstring& baseDirectory, TraverseCallback& sink, DstHackCallback* dstCallback) : - isFatFileSystem(dst::isFatDrive(baseDirectory)) + needDstHack(dstCallback ? dst::isFatDrive(baseDirectory) : false) { - warn_static("ineffizient, wenn kein dst hack/file ids gebraucht werden???") - try //traversing certain folders with restricted permissions requires this privilege! (but copying these files may still fail) { activatePrivilege(SE_BACKUP_NAME); //throw FileError @@ -326,8 +327,9 @@ public: traverse(baseDirectory, sink, 0); //apply daylight saving time hack AFTER file traversing, to give separate feedback to user - if (dstCallback && isFatFileSystem) - applyDstHack(*dstCallback); + if (needDstHack) + if (dstCallback) //bound if "needDstHack == true" + applyDstHack(*dstCallback); } private: @@ -378,8 +380,11 @@ private: case TraverseCallback::LINK_FOLLOW: if (Trav::isDirectory(findData)) { - if (const std::shared_ptr& rv = sink.onDir(shortName, fullName)) - traverse(fullName, *rv, retrieveVolumeSerial(fullName)); //symlink may link to different volume => redetermine volume serial! + if (TraverseCallback* trav = sink.onDir(shortName, fullName)) + { + ZEN_ON_SCOPE_EXIT(sink.releaseDirTraverser(trav)); + traverse(fullName, *trav, retrieveVolumeSerial(fullName)); //symlink may link to different volume => redetermine volume serial! + } } else //a file { @@ -387,13 +392,12 @@ private: const bool validLink = tryReportingItemError([&] //try to resolve symlink (and report error on failure!!!) { getInfoFromFileSymlink(fullName, targetInfo); //throw FileError + targetInfo.symlinkInfo = &linkInfo; }, sink, shortName); if (validLink) sink.onFile(shortName, fullName, targetInfo); - // else //broken symlink - // sink.onFile(shortName, fullName, TraverseCallback::FileInfo()); - warn_static("impact of ignored broken file/incomplete dir read on two-way variant!?") + // else //broken symlink -> ignore: it's client's responsibility to handle error! } break; @@ -403,8 +407,11 @@ private: } else if (Trav::isDirectory(findData)) { - if (const std::shared_ptr& rv = sink.onDir(shortName, fullName)) - traverse(fullName, *rv, volumeSerial); + if (TraverseCallback* trav = sink.onDir(shortName, fullName)) + { + ZEN_ON_SCOPE_EXIT(sink.releaseDirTraverser(trav)); + traverse(fullName, *trav, volumeSerial); + } } else //a file { @@ -412,12 +419,12 @@ private: Trav::extractFileInfo(findData, volumeSerial, fileInfo); //####################################### DST hack ########################################### - if (isFatFileSystem) + if (needDstHack) { const dst::RawTime rawTime(Trav::getCreateTimeRaw(findData), Trav::getModTimeRaw(findData)); if (dst::fatHasUtcEncoded(rawTime)) //throw std::runtime_error - fileInfo.lastWriteTime = toTimeT(dst::fatDecodeUtcTime(rawTime)); //return real UTC time; throw (std::runtime_error) + fileInfo.lastWriteTime = toTimeT(dst::fatDecodeUtcTime(rawTime)); //return real UTC time; throw std::runtime_error else markForDstHack.push_back(std::make_pair(fullName, toTimeT(rawTime.writeTimeRaw))); } @@ -476,13 +483,13 @@ private: } } - const bool isFatFileSystem; - typedef std::vector > FilenameTimeList; + const bool needDstHack; + typedef std::vector> FilenameTimeList; FilenameTimeList markForDstHack; //####################################### DST hack ########################################### }; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC class DirTraverser { public: @@ -498,8 +505,8 @@ public: the buffer whose address is passed in entry as follows: len = offsetof(struct dirent, d_name) + pathconf(dirpath, _PC_NAME_MAX) + 1 entryp = malloc(len); */ - const size_t maxPath = std::max(::pathconf(directoryFormatted.c_str(), _PC_NAME_MAX), 10000); //::pathconf may return long(-1) - buffer.resize(offsetof(struct ::dirent, d_name) + maxPath + 1); + const size_t nameMax = std::max(::pathconf(directoryFormatted.c_str(), _PC_NAME_MAX), 10000); //::pathconf may return long(-1) + buffer.resize(offsetof(struct ::dirent, d_name) + nameMax + 1); traverse(directoryFormatted, sink); } @@ -517,7 +524,7 @@ private: { dirObj = ::opendir(dirname.c_str()); //directory must NOT end with path separator, except "/" if (!dirObj) - throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"opendir", getLastError())); }, sink)) return; //ignored error ZEN_ON_SCOPE_EXIT(::closedir(dirObj)); //never close nullptr handles! -> crash @@ -528,7 +535,7 @@ private: tryReportingDirError([&] { if (::readdir_r(dirObj, reinterpret_cast< ::dirent*>(&buffer[0]), &dirEntry) != 0) - throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirname)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(dirname)), formatSystemError(L"readdir_r", getLastError())); }, sink); if (!dirEntry) //no more items or ignored error return; @@ -538,7 +545,7 @@ private: if (shortName[0] == '.' && (shortName[1] == 0 || (shortName[1] == '.' && shortName[2] == 0))) continue; -#ifdef FFS_MAC +#ifdef ZEN_MAC //some file system abstraction layers fail to properly return decomposed UTF8: http://developer.apple.com/library/mac/#qa/qa1173/_index.html //so we need to do it ourselves; perf: ~600 ns per conversion //note: it's not sufficient to apply this in z_impl::compareFilenamesNoCase: if UTF8 forms differ, FFS assumes a rename in case sensitivity and @@ -564,7 +571,7 @@ private: if (!tryReportingItemError([&] { if (::lstat(fullName.c_str(), &statData) != 0) //lstat() does not resolve symlinks - throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(fullName)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(fullName)), formatSystemError(L"lstat", getLastError())); }, sink, shortName)) continue; //ignore error: skip file @@ -582,15 +589,18 @@ private: bool validLink = tryReportingItemError([&] { if (::stat(fullName.c_str(), &statDataTrg) != 0) - throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(fullName)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(fullName)), formatSystemError(L"stat", getLastError())); }, sink, shortName); if (validLink) { if (S_ISDIR(statDataTrg.st_mode)) //a directory { - if (const std::shared_ptr& rv = sink.onDir(shortName, fullName)) - traverse(fullName, *rv); + if (TraverseCallback* trav = sink.onDir(shortName, fullName)) + { + ZEN_ON_SCOPE_EXIT(sink.releaseDirTraverser(trav)); + traverse(fullName, *trav); + } } else //a file or named pipe, ect. { @@ -598,11 +608,11 @@ private: fileInfo.fileSize = zen::UInt64(statDataTrg.st_size); fileInfo.lastWriteTime = statDataTrg.st_mtime; //UTC time (time_t format); unit: 1 second fileInfo.id = extractFileID(statDataTrg); + fileInfo.symlinkInfo = &linkInfo; sink.onFile(shortName, fullName, fileInfo); } } - // else //report broken symlink as file! - // sink.onFile(shortName, fullName, TraverseCallback::FileInfo()); + // else //broken symlink -> ignore: it's client's responsibility to handle error! } break; @@ -612,8 +622,11 @@ private: } else if (S_ISDIR(statData.st_mode)) //a directory { - if (const std::shared_ptr& rv = sink.onDir(shortName, fullName)) - traverse(fullName, *rv); + if (TraverseCallback* trav = sink.onDir(shortName, fullName)) + { + ZEN_ON_SCOPE_EXIT(sink.releaseDirTraverser(trav)); + traverse(fullName, *trav); + } } else //a file or named pipe, ect. { @@ -635,7 +648,7 @@ private: } std::vector buffer; -#ifdef FFS_MAC +#ifdef ZEN_MAC std::vector bufferUtfDecomposed; #endif }; diff --git a/zen/file_traverser.h b/zen/file_traverser.h index 13b76966..a1d8ac9e 100644 --- a/zen/file_traverser.h +++ b/zen/file_traverser.h @@ -7,7 +7,7 @@ #ifndef FILETRAVERSER_H_INCLUDED #define FILETRAVERSER_H_INCLUDED -#include +//#include #include "zstring.h" #include "int64.h" #include "file_id_def.h" @@ -20,17 +20,18 @@ struct TraverseCallback { virtual ~TraverseCallback() {} - struct FileInfo + struct SymlinkInfo { - UInt64 fileSize; //unit: bytes! Int64 lastWriteTime; //number of seconds since Jan. 1st 1970 UTC - FileId id; //optional: initial if not supported! - //std::unique_ptr symlinkInfo; //only filled if file is dereferenced symlink }; - struct SymlinkInfo + struct FileInfo { + FileInfo() : symlinkInfo() {} + UInt64 fileSize; //unit: bytes! Int64 lastWriteTime; //number of seconds since Jan. 1st 1970 UTC + FileId id; //optional: initial if not supported! + const SymlinkInfo* symlinkInfo; //only filled if file is a followed symlink }; enum HandleLink @@ -45,22 +46,24 @@ struct TraverseCallback ON_ERROR_IGNORE }; - virtual std::shared_ptr //nullptr: ignore directory, non-nullptr: traverse into using the (new) callback - /**/ onDir (const Zchar* shortName, const Zstring& fullName) = 0; - virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details) = 0; - virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) = 0; + virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details) = 0; + virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) = 0; + virtual TraverseCallback* onDir (const Zchar* shortName, const Zstring& fullName) = 0; + //nullptr: ignore directory, non-nullptr: traverse into using the (new) callback => implement releaseDirTraverser() if necessary! + virtual void releaseDirTraverser(TraverseCallback* trav) {} + virtual HandleError reportDirError (const std::wstring& msg) = 0; //failed directory traversal -> consider directory data as incomplete! - virtual HandleError reportItemError(const std::wstring& msg, const Zchar* shortName) = 0; //failed to get single file/dir/symlink only! + virtual HandleError reportItemError(const std::wstring& msg, const Zchar* shortName) = 0; //failed to get data for single file/dir/symlink only! }; -#ifdef FFS_WIN +#ifdef ZEN_WIN struct DstHackCallback { virtual ~DstHackCallback() {} virtual void requestUiRefresh(const Zstring& filename) = 0; //applying DST hack imposes significant one-time performance drawback => callback to inform user }; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC struct DstHackCallback; //DST hack not required on Unix #endif diff --git a/zen/format_unit.cpp b/zen/format_unit.cpp index 60eb6869..9e5975d9 100644 --- a/zen/format_unit.cpp +++ b/zen/format_unit.cpp @@ -12,12 +12,12 @@ #include #include -#ifdef FFS_WIN +#ifdef ZEN_WIN #include //includes "windows.h" #include -#elif defined FFS_LINUX || defined FFS_MAC -#include //thousands separator +#elif defined ZEN_LINUX || defined ZEN_MAC +#include //thousands separator #include // #endif @@ -152,7 +152,7 @@ std::wstring zen::fractionToString(double fraction) } -#ifdef FFS_WIN +#ifdef ZEN_WIN namespace { bool getUserSetting(LCTYPE lt, UINT& setting) @@ -233,7 +233,7 @@ private: std::wstring zen::ffs_Impl::includeNumberSeparator(const std::wstring& number) { -#ifdef FFS_WIN +#ifdef ZEN_WIN if (IntegerFormat::isValid()) { int bufferSize = ::GetNumberFormat(LOCALE_USER_DEFAULT, 0, number.c_str(), &IntegerFormat::get(), nullptr, 0); @@ -251,7 +251,7 @@ std::wstring zen::ffs_Impl::includeNumberSeparator(const std::wstring& number) } return number; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC //we have to include thousands separator ourselves; this doesn't work for all countries (e.g india), but is better than nothing //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale @@ -277,7 +277,7 @@ std::wstring zen::ffs_Impl::includeNumberSeparator(const std::wstring& number) } -#ifdef FFS_WIN +#ifdef ZEN_WIN namespace { const bool useNewLocalTimeCalculation = zen::vistaOrLater(); @@ -289,7 +289,7 @@ std::wstring zen::utcToLocalTimeString(Int64 utcTime) { auto errorMsg = [&] { return _("Error") + L" (time_t: " + numberTo(utcTime) + L")"; }; -#ifdef FFS_WIN +#ifdef ZEN_WIN FILETIME lastWriteTimeUtc = tofiletime(utcTime); //convert ansi C time to FILETIME SYSTEMTIME systemTimeLocal = {}; @@ -326,7 +326,7 @@ std::wstring zen::utcToLocalTimeString(Int64 utcTime) loc.minute = systemTimeLocal.wMinute; loc.second = systemTimeLocal.wSecond; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC zen::TimeComp loc = zen::localTime(to(utcTime)); #endif diff --git a/zen/int64.h b/zen/int64.h index 4c63a24f..7d03f35d 100644 --- a/zen/int64.h +++ b/zen/int64.h @@ -15,7 +15,7 @@ #include "assert_static.h" #include "type_tools.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "win.h" #endif @@ -60,7 +60,7 @@ public: Int64& operator=(const Int64& rhs) { value = rhs.value; return *this; } -#ifdef FFS_WIN +#ifdef ZEN_WIN Int64(DWORD low, LONG high) { assert_static(sizeof(low) + sizeof(high) == sizeof(value)); @@ -139,7 +139,7 @@ public: UInt64& operator=(const UInt64& rhs) { value = rhs.value; return *this; } -#ifdef FFS_WIN +#ifdef ZEN_WIN UInt64(DWORD low, DWORD high) { assert_static(sizeof(low) + sizeof(high) == sizeof(value)); @@ -206,7 +206,7 @@ template <> inline UInt64 to(Int64 number) { checkRange(number.va template <> inline Int64 to(UInt64 number) { checkRange(number.value); return Int64(number.value); } -#ifdef FFS_WIN +#ifdef ZEN_WIN //convert FILETIME (number of 100-nanosecond intervals since January 1, 1601 UTC) // to time_t (number of seconds since Jan. 1st 1970 UTC) // diff --git a/zen/last_error.h b/zen/last_error.h deleted file mode 100644 index ddee552f..00000000 --- a/zen/last_error.h +++ /dev/null @@ -1,105 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * -// ************************************************************************** - -#ifndef SYSTEMFUNCTIONS_H_INCLUDED -#define SYSTEMFUNCTIONS_H_INCLUDED - -#include -#include "utf.h" -#include "i18n.h" - -#ifdef FFS_WIN -#include "win.h" //includes "windows.h" - -#elif defined FFS_LINUX || defined FFS_MAC -#include -#include -#endif - - -namespace zen -{ -//evaluate GetLastError()/errno and assemble specific error message -#ifdef FFS_WIN -typedef DWORD ErrorCode; -#elif defined FFS_LINUX || defined FFS_MAC -typedef int ErrorCode; -#endif - -std::wstring getLastErrorFormatted(ErrorCode lastError = 0); -ErrorCode getLastError(); - -bool errorCodeForNotExisting(ErrorCode lastError); //check for "not existing" aliases - - - - - - - - - -//######################## implementation ######################## -inline -ErrorCode getLastError() -{ -#ifdef FFS_WIN - return ::GetLastError(); -#elif defined FFS_LINUX || defined FFS_MAC - return errno; //don't use "::", errno is a macro! -#endif -} - -inline -std::wstring getLastErrorFormatted(ErrorCode lastError) -{ - //determine error code if none was specified - if (lastError == 0) - lastError = getLastError(); - - std::wstring output = _("Error Code %x:"); - replace(output, L"%x", numberTo(lastError)); -#ifdef FFS_WIN - LPWSTR buffer = nullptr; - if (::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_MAX_WIDTH_MASK | - FORMAT_MESSAGE_IGNORE_INSERTS | //important: without this flag ::FormatMessage() will fail if message contains placeholders - FORMAT_MESSAGE_ALLOCATE_BUFFER, nullptr, lastError, 0, reinterpret_cast(&buffer), 0, nullptr) != 0) - { - if (buffer) //"don't trust nobody" - { - output += L" "; - output += buffer; - ::LocalFree(buffer); - } - } - ::SetLastError(lastError); //restore last error - -#elif defined FFS_LINUX || defined FFS_MAC - output += L" "; - output += utfCvrtTo(::strerror(lastError)); - - errno = lastError; //restore errno -#endif - return output; -} - - -inline -bool errorCodeForNotExisting(ErrorCode lastError) -{ -#ifdef FFS_WIN - return lastError == ERROR_FILE_NOT_FOUND || - lastError == ERROR_PATH_NOT_FOUND || - lastError == ERROR_BAD_NETPATH || - lastError == ERROR_NETNAME_DELETED; -#elif defined FFS_LINUX || defined FFS_MAC - return lastError == ENOENT; -#endif -} -} - -#endif // SYSTEMFUNCTIONS_H_INCLUDED diff --git a/zen/notify_removal.cpp b/zen/notify_removal.cpp index 29958f0c..3815887a 100644 --- a/zen/notify_removal.cpp +++ b/zen/notify_removal.cpp @@ -46,7 +46,7 @@ private: MessageProvider(const MessageProvider&); MessageProvider& operator=(const MessageProvider&); - static const wchar_t WINDOW_NAME[]; + static const wchar_t dummyWindowName[]; friend LRESULT CALLBACK topWndProc(HWND, UINT, WPARAM, LPARAM); void processMessage(UINT message, WPARAM wParam, LPARAM lParam); @@ -58,7 +58,7 @@ private: }; -const wchar_t MessageProvider::WINDOW_NAME[] = L"E6AD5EB1-527B-4EEF-AC75-27883B233380"; //random name +const wchar_t MessageProvider::dummyWindowName[] = L"E6AD5EB1-527B-4EEF-AC75-27883B233380"; //random name LRESULT CALLBACK topWndProc(HWND hwnd, //handle to window @@ -82,22 +82,22 @@ MessageProvider::MessageProvider() : windowHandle(nullptr) { if (!hMainModule) - throw zen::FileError(std::wstring(L"Could not start monitoring window notifications:") + L"\n\n" + getLastErrorFormatted() + L" (GetModuleHandle)"); + throw FileError(_("Failed to register to receive system messages."), formatSystemError(L"GetModuleHandle", getLastError())); //register the main window class WNDCLASS wc = {}; wc.lpfnWndProc = topWndProc; wc.hInstance = hMainModule; - wc.lpszClassName = WINDOW_NAME; + wc.lpszClassName = dummyWindowName; if (::RegisterClass(&wc) == 0) - throw zen::FileError(std::wstring(L"Could not start monitoring window notifications:") + L"\n\n" + getLastErrorFormatted() + L" (RegisterClass)"); + throw FileError(_("Failed to register to receive system messages."), formatSystemError(L"RegisterClass", getLastError())); - ScopeGuard guardClass = makeGuard([&] { ::UnregisterClass(WINDOW_NAME, hMainModule); }); + ScopeGuard guardClass = makeGuard([&] { ::UnregisterClass(dummyWindowName, hMainModule); }); //create dummy-window - windowHandle = ::CreateWindow(WINDOW_NAME, //LPCTSTR lpClassName OR ATOM in low-order word! - nullptr, //LPCTSTR lpWindowName, + windowHandle = ::CreateWindow(dummyWindowName, //LPCTSTR lpClassName OR ATOM in low-order word! + nullptr, //LPCTSTR lpWindowName, 0, //DWORD dwStyle, 0, //int x, 0, //int y, @@ -108,7 +108,7 @@ MessageProvider::MessageProvider() : hMainModule, //HINSTANCE hInstance, nullptr); //LPVOID lpParam if (!windowHandle) - throw zen::FileError(std::wstring(L"Could not start monitoring window notifications:") + L"\n\n" + getLastErrorFormatted() + L" (CreateWindow)"); + throw FileError(_("Failed to register to receive system messages."), formatSystemError(L"CreateWindow", getLastError())); guardClass.dismiss(); } @@ -118,7 +118,7 @@ MessageProvider::~MessageProvider() { //clean-up in reverse order ::DestroyWindow(windowHandle); - ::UnregisterClass(WINDOW_NAME, //LPCTSTR lpClassName OR ATOM in low-order word! + ::UnregisterClass(dummyWindowName, //LPCTSTR lpClassName OR ATOM in low-order word! hMainModule); //HINSTANCE hInstance } @@ -128,8 +128,8 @@ void MessageProvider::processMessage(UINT message, WPARAM wParam, LPARAM lParam) std::for_each(listener.begin(), listener.end(), [&](Listener* ls) { ls->onMessage(message, wParam, lParam); }); } -//#################################################################################################### +//#################################################################################################### class NotifyRequestDeviceRemoval::Pimpl : private MessageProvider::Listener { @@ -139,6 +139,8 @@ public: { MessageProvider::instance().registerListener(*this); //throw FileError + ScopeGuard guardProvider = makeGuard([&] { MessageProvider::instance().unregisterListener(*this); }); + //register handles to receive notifications DEV_BROADCAST_HANDLE filter = {}; filter.dbch_size = sizeof(filter); @@ -154,13 +156,16 @@ public: if (lastError != ERROR_CALL_NOT_IMPLEMENTED && //fail on SAMBA share: this shouldn't be a showstopper! lastError != ERROR_SERVICE_SPECIFIC_ERROR && //neither should be fail for "Pogoplug" mapped network drives lastError != ERROR_INVALID_DATA) //this seems to happen for a NetDrive-mapped FTP server - throw zen::FileError(L"Could not register device removal notifications:" L"\n\n" + getLastErrorFormatted(lastError)); + throw zen::FileError(_("Failed to register to receive system messages."), formatSystemError(L"RegisterDeviceNotification", lastError)); } + + guardProvider.dismiss(); } ~Pimpl() { - ::UnregisterDeviceNotification(hNotification); + if (hNotification) + ::UnregisterDeviceNotification(hNotification); MessageProvider::instance().unregisterListener(*this); } @@ -172,10 +177,9 @@ private: { //DBT_DEVICEQUERYREMOVE example: http://msdn.microsoft.com/en-us/library/aa363427(v=VS.85).aspx if (message == WM_DEVICECHANGE) - { - if ( wParam == DBT_DEVICEQUERYREMOVE || - wParam == DBT_DEVICEQUERYREMOVEFAILED || - wParam == DBT_DEVICEREMOVECOMPLETE) + if (wParam == DBT_DEVICEQUERYREMOVE || + wParam == DBT_DEVICEQUERYREMOVEFAILED || + wParam == DBT_DEVICEREMOVECOMPLETE) { PDEV_BROADCAST_HDR header = reinterpret_cast(lParam); if (header->dbch_devicetype == DBT_DEVTYP_HANDLE) @@ -202,14 +206,13 @@ private: } } } - } } NotifyRequestDeviceRemoval& parent_; HDEVNOTIFY hNotification; }; -//#################################################################################################### +//#################################################################################################### NotifyRequestDeviceRemoval::NotifyRequestDeviceRemoval(HANDLE hDir) { @@ -217,4 +220,4 @@ NotifyRequestDeviceRemoval::NotifyRequestDeviceRemoval(HANDLE hDir) } -NotifyRequestDeviceRemoval::~NotifyRequestDeviceRemoval() {} //make sure ~auto_ptr() works with complete type +NotifyRequestDeviceRemoval::~NotifyRequestDeviceRemoval() {} //make sure ~unique_ptr() works with complete type diff --git a/zen/notify_removal.h b/zen/notify_removal.h index dc8149a0..aca0912f 100644 --- a/zen/notify_removal.h +++ b/zen/notify_removal.h @@ -7,7 +7,6 @@ #ifndef NOTIFY_H_INCLUDED #define NOTIFY_H_INCLUDED -#include #include #include "win.h" //includes "windows.h" #include "file_error.h" diff --git a/zen/osx_error.h b/zen/osx_error.h deleted file mode 100644 index 4b0aeb3b..00000000 --- a/zen/osx_error.h +++ /dev/null @@ -1,27 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * -// ************************************************************************** - -#ifndef OSX_ERRROR_834270598342753425 -#define OSX_ERRROR_834270598342753425 - -#include - -namespace osx -{ -class OsxError //Exception base class used to notify file/directory copy/delete errors -{ -public: - explicit OsxError(const std::wstring& message) : msg(message) {} - virtual ~OsxError() {} - - const std::wstring& toString() const { return msg; } - -private: - std::wstring msg; -}; -} - -#endif //OSX_ERRROR_834270598342753425 diff --git a/zen/osx_string.h b/zen/osx_string.h index ce8b1062..0d77345c 100644 --- a/zen/osx_string.h +++ b/zen/osx_string.h @@ -7,8 +7,8 @@ #ifndef OSX_STRING_1873641732143214324 #define OSX_STRING_1873641732143214324 -#include #include //CFString +#include "zstring.h" namespace osx { diff --git a/zen/osx_throw_exception.h b/zen/osx_throw_exception.h index 31592854..018e9456 100644 --- a/zen/osx_throw_exception.h +++ b/zen/osx_throw_exception.h @@ -8,21 +8,21 @@ #define OSX_EXCEPTION_89274305834255 #import -#include -#include +#include "sys_error.h" +#include "utf.h" namespace osx { //for use in Objective C implementation files only! -void throwOsxError(NSException* e); //throw OsxError +void throwSysError(NSException* e); //throw SysError -#define ZEN_OSX_ASSERT(obj) ZEN_OSX_ASSERT_IMPL(obj, #obj) //throw OsxError +#define ZEN_OSX_ASSERT(obj) ZEN_OSX_ASSERT_IMPL(obj, #obj) //throw SysError /* -Example: ZEN_COM_ASSERT(obj); +Example: ZEN_OSX_ASSERT(obj); Equivalent to: if (!obj) - throw OsxError(L"Assertion failed: \"obj\"."); + throw zen::SysError(L"Assertion failed: \"obj\"."); */ @@ -32,7 +32,7 @@ Equivalent to: //######################## implmentation ############################ inline -void throwOsxError(NSException* e) //throw OsxError +void throwSysError(NSException* e) //throw SysError { std::string msg; if (const char* name = [[e name ] cStringUsingEncoding:NSUTF8StringEncoding]) //"const char*" NOT owned by us! @@ -42,7 +42,7 @@ if (const char* descr = [[e reason] cStringUsingEncoding:NSUTF8StringEncoding]) msg += "\n"; msg += descr; } - throw OsxError(zen::utfCvrtTo(msg)); + throw zen::SysError(zen::utfCvrtTo(msg)); /* e.g. NSInvalidArgumentException @@ -51,6 +51,6 @@ if (const char* descr = [[e reason] cStringUsingEncoding:NSUTF8StringEncoding]) } } -#define ZEN_OSX_ASSERT_IMPL(obj, txt) if (!(obj)) throw osx::OsxError(std::wstring(L"Assertion failed: \"") + L ## txt + L"\"."); +#define ZEN_OSX_ASSERT_IMPL(obj, txt) if (!(obj)) throw zen::SysError(std::wstring(L"Assertion failed: \"") + L ## txt + L"\"."); #endif //OSX_EXCEPTION_89274305834255 diff --git a/zen/perf.h b/zen/perf.h index 4a334bff..ccaa3f07 100644 --- a/zen/perf.h +++ b/zen/perf.h @@ -10,7 +10,7 @@ #include "deprecate.h" #include "tick_count.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include #else #include @@ -33,7 +33,7 @@ public: ticksPerSec_(ticksPerSec()), startTime(), resultShown(false) { //std::clock() - "counts CPU time in C and wall time in VC++" - WTF!??? -#ifdef FFS_WIN +#ifdef ZEN_WIN if (::SetThreadAffinityMask(::GetCurrentThread(), 1) == 0) //"should not be required unless there are bugs in BIOS or HAL" - msdn, QueryPerformanceCounter throw TimerError(); #endif @@ -51,7 +51,7 @@ public: throw TimerError(); const auto delta = static_cast(1000.0 * dist(startTime, now) / ticksPerSec_); -#ifdef FFS_WIN +#ifdef ZEN_WIN std::ostringstream ss; ss << delta << " ms"; ::MessageBoxA(nullptr, ss.str().c_str(), "Timer", 0); diff --git a/zen/privilege.cpp b/zen/privilege.cpp index b474958e..44318517 100644 --- a/zen/privilege.cpp +++ b/zen/privilege.cpp @@ -15,14 +15,14 @@ bool privilegeIsActive(LPCTSTR privilege) //throw FileError if (!::OpenProcessToken(::GetCurrentProcess(), //__in HANDLE ProcessHandle, TOKEN_QUERY, //__in DWORD DesiredAccess, &hToken)) //__out PHANDLE TokenHandle - throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\"") + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\""), formatSystemError(L"OpenProcessToken", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hToken)); LUID luid = {}; if (!::LookupPrivilegeValue(nullptr, //__in_opt LPCTSTR lpSystemName, privilege, //__in LPCTSTR lpName, &luid )) //__out PLUID lpLuid - throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\"") + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\""), formatSystemError(L"LookupPrivilegeValue", getLastError())); PRIVILEGE_SET priv = {}; priv.PrivilegeCount = 1; @@ -34,7 +34,7 @@ bool privilegeIsActive(LPCTSTR privilege) //throw FileError if (!::PrivilegeCheck(hToken, //__in HANDLE ClientToken, &priv, //__inout PPRIVILEGE_SET RequiredPrivileges, &alreadyGranted)) //__out LPBOOL pfResult - throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\"") + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\""), formatSystemError(L"PrivilegeCheck", getLastError())); return alreadyGranted != FALSE; } @@ -46,14 +46,14 @@ void setPrivilege(LPCTSTR privilege, bool enable) //throw FileError if (!::OpenProcessToken(::GetCurrentProcess(), //__in HANDLE ProcessHandle, TOKEN_ADJUST_PRIVILEGES, //__in DWORD DesiredAccess, &hToken)) //__out PHANDLE TokenHandle - throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\"") + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\""), formatSystemError(L"OpenProcessToken", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hToken)); LUID luid = {}; if (!::LookupPrivilegeValue(nullptr, //__in_opt LPCTSTR lpSystemName, privilege, //__in LPCTSTR lpName, &luid )) //__out PLUID lpLuid - throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\"") + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\""), formatSystemError(L"LookupPrivilegeValue", getLastError())); TOKEN_PRIVILEGES tp = {}; tp.PrivilegeCount = 1; @@ -66,10 +66,11 @@ void setPrivilege(LPCTSTR privilege, bool enable) //throw FileError 0, //__in DWORD BufferLength, nullptr, //__out_opt PTOKEN_PRIVILEGES PreviousState, nullptr)) //__out_opt PDWORD ReturnLength - throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\"") + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\""), formatSystemError(L"AdjustTokenPrivileges", getLastError())); - if (::GetLastError() == ERROR_NOT_ALL_ASSIGNED) //check although previous function returned with success! - throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\"") + L"\n\n" + getLastErrorFormatted()); + const ErrorCode lastError = getLastError(); + if (lastError == ERROR_NOT_ALL_ASSIGNED) //check although previous function returned with success! + throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\""), formatSystemError(L"AdjustTokenPrivileges", lastError)); } diff --git a/zen/process_priority.cpp b/zen/process_priority.cpp index 96a6c2de..b09b35f5 100644 --- a/zen/process_priority.cpp +++ b/zen/process_priority.cpp @@ -5,16 +5,16 @@ // ************************************************************************** #include "process_priority.h" -#include +#include #include -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "win.h" //includes "windows.h" -#elif defined FFS_LINUX +#elif defined ZEN_LINUX //#include -#elif defined FFS_MAC +#elif defined ZEN_MAC #include //getiopolicy_np #include //keep in .cpp file to not pollute global namespace! e.g. with UInt64 #endif @@ -22,7 +22,7 @@ using namespace zen; -#ifdef FFS_WIN +#ifdef ZEN_WIN struct PreventStandby::Pimpl {}; PreventStandby::PreventStandby() @@ -49,7 +49,7 @@ struct ScheduleForBackgroundProcessing::Pimpl {}; ScheduleForBackgroundProcessing::ScheduleForBackgroundProcessing() { if (!::SetPriorityClass(::GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN)) //this call lowers CPU priority, too!! - throw FileError(_("Cannot change process I/O priorities.") + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot change process I/O priorities."), formatSystemError(L"SetPriorityClass", getLastError())); } @@ -58,7 +58,7 @@ ScheduleForBackgroundProcessing::~ScheduleForBackgroundProcessing() ::SetPriorityClass(::GetCurrentProcess(), PROCESS_MODE_BACKGROUND_END); } -#elif defined FFS_LINUX +#elif defined ZEN_LINUX struct PreventStandby::Pimpl {}; PreventStandby::PreventStandby() {} PreventStandby::~PreventStandby() {} @@ -101,7 +101,7 @@ private: }; */ -#elif defined FFS_MAC +#elif defined ZEN_MAC //https://developer.apple.com/library/mac/#qa/qa1340 struct PreventStandby::Pimpl { @@ -111,11 +111,12 @@ struct PreventStandby::Pimpl PreventStandby::PreventStandby() : pimpl(make_unique()) { - if (::IOPMAssertionCreateWithName(kIOPMAssertionTypeNoIdleSleep, - kIOPMAssertionLevelOn, - CFSTR("FreeFileSync"), - &pimpl->assertionID) != kIOReturnSuccess) - throw FileError(_("Failed to suspend system sleep mode.")); + IOReturn rv = ::IOPMAssertionCreateWithName(kIOPMAssertionTypeNoIdleSleep, + kIOPMAssertionLevelOn, + CFSTR("FreeFileSync"), + &pimpl->assertionID); + if (rv != kIOReturnSuccess) + throw FileError(_("Failed to suspend system sleep mode."), replaceCpy(L"IOReturn Code %x", L"%x", numberTo(rv))); //could not find a better way to convert IOReturn to string } PreventStandby::~PreventStandby() @@ -135,10 +136,10 @@ ScheduleForBackgroundProcessing::ScheduleForBackgroundProcessing() : pimpl(make_ { pimpl->oldIoPrio = ::getiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS); if (pimpl->oldIoPrio == -1) - throw FileError(_("Cannot change process I/O priorities.") + L" (r)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot change process I/O priorities."), formatSystemError(L"getiopolicy_np", getLastError())); if (::setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, IOPOL_THROTTLE) != 0) - throw FileError(_("Cannot change process I/O priorities.") + L" (w)" + L"\n\n" + getLastErrorFormatted()); + throw FileError(_("Cannot change process I/O priorities."), formatSystemError(L"setiopolicy_np", getLastError())); } @@ -146,4 +147,4 @@ ScheduleForBackgroundProcessing::~ScheduleForBackgroundProcessing() { ::setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_PROCESS, pimpl->oldIoPrio); } -#endif \ No newline at end of file +#endif diff --git a/zen/recycler.cpp b/zen/recycler.cpp index c062a26c..f1b8381a 100644 --- a/zen/recycler.cpp +++ b/zen/recycler.cpp @@ -9,7 +9,7 @@ //#include #include -#ifdef FFS_WIN +#ifdef ZEN_WIN //#include //#include #include @@ -18,19 +18,19 @@ #include #include "IFileOperation/file_op.h" -#elif defined FFS_LINUX +#elif defined ZEN_LINUX #include #include #include -#elif defined FFS_MAC +#elif defined ZEN_MAC #include #endif using namespace zen; -#ifdef FFS_WIN +#ifdef ZEN_WIN namespace { /* @@ -91,7 +91,7 @@ void zen::recycleOrDelete(const std::vector& filenames, CallbackRecycli const DllFun getLastError (getDllName(), funName_getLastError); if (!moveToRecycler || !getLastError) - throw FileError(replaceCpy(_("Unable to move %x to the Recycle Bin!"), L"%x", fmtFileName(filenames[0])) + L"\n\n" + + throw FileError(replaceCpy(_("Unable to move %x to the Recycle Bin."), L"%x", fmtFileName(filenames[0])), replaceCpy(_("Cannot load file %x."), L"%x", fmtFileName(getDllName()))); std::vector cNames; @@ -108,8 +108,7 @@ void zen::recycleOrDelete(const std::vector& filenames, CallbackRecycli if (filenames.size() > 1) filenameFmt += L", ..."; //give at least some hint that there are multiple files, and the error need not be related to the first one - throw FileError(replaceCpy(_("Unable to move %x to the Recycle Bin!"), L"%x", filenameFmt) + - L"\n\n" + getLastError()); //already includes details about locking errors! + throw FileError(replaceCpy(_("Unable to move %x to the Recycle Bin."), L"%x", filenameFmt), getLastError()); //already includes details about locking errors! } } else //regular recycle bin usage: available since XP @@ -134,7 +133,7 @@ void zen::recycleOrDelete(const std::vector& filenames, CallbackRecycli //"You should use fully-qualified path names with this function. Using it with relative path names is not thread safe." if (::SHFileOperation(&fileOp) != 0 || fileOp.fAnyOperationsAborted) { - throw FileError(replaceCpy(_("Unable to move %x to the Recycle Bin!"), L"%x", fmtFileName(filenames[0]))); //probably not the correct file name for file list larger than 1! + throw FileError(replaceCpy(_("Unable to move %x to the Recycle Bin."), L"%x", fmtFileName(filenames[0]))); //probably not the correct file name for file list larger than 1! } } } @@ -146,12 +145,12 @@ bool zen::recycleOrDelete(const Zstring& filename) //throw FileError if (!somethingExists(filename)) //[!] do not optimize away, OS X needs this for reliable detection of "recycle bin missing" return false; //neither file nor any other object with that name existing: no error situation, manual deletion relies on it! -#ifdef FFS_WIN +#ifdef ZEN_WIN std::vector filenames; filenames.push_back(filename); recycleOrDelete(filenames, nullptr); //throw FileError -#elif defined FFS_LINUX +#elif defined ZEN_LINUX GFile* file = ::g_file_new_for_path(filename.c_str()); //never fails according to docu ZEN_ON_SCOPE_EXIT(g_object_unref(file);) @@ -160,10 +159,10 @@ bool zen::recycleOrDelete(const Zstring& filename) //throw FileError if (!::g_file_trash(file, nullptr, &error)) { - const std::wstring shortMsg = replaceCpy(_("Unable to move %x to the Recycle Bin!"), L"%x", fmtFileName(filename)); + const std::wstring errorMsg = replaceCpy(_("Unable to move %x to the Recycle Bin."), L"%x", fmtFileName(filename)); if (!error) - throw FileError(shortMsg + L"\n\n" + L"Unknown error."); + throw FileError(errorMsg, L"Unknown error."); //user should never see this //implement same behavior as in Windows: if recycler is not existing, delete permanently if (error->code == G_IO_ERROR_NOT_SUPPORTED) @@ -179,11 +178,11 @@ bool zen::recycleOrDelete(const Zstring& filename) //throw FileError return true; } - throw FileError(shortMsg + L"\n\n" + L"Glib Error Code " + numberTo(error->code) + /* L", " + - g_quark_to_string(error->domain) + */ L": " + utfCvrtTo(error->message)); + throw FileError(errorMsg, replaceCpy(L"Glib Error Code %x:", L"%x", numberTo(error->code)) + L" " + utfCvrtTo(error->message)); + //g_quark_to_string(error->domain) } -#elif defined FFS_MAC +#elif defined ZEN_MAC //we cannot use FSPathMoveObjectToTrashSync directly since it follows symlinks! assert_static(sizeof(Zchar) == sizeof(char)); @@ -191,12 +190,12 @@ bool zen::recycleOrDelete(const Zstring& filename) //throw FileError auto throwFileError = [&](OSStatus oss) { - std::wstring msg = replaceCpy(_("Unable to move %x to the Recycle Bin!"), L"%x", fmtFileName(filename)) + L"\n\n" - + L"Result Code " + numberTo(oss); - const char* description = GetMacOSStatusCommentString(oss); - if (description) //found no documentation for proper use of GetMacOSStatusCommentString - msg += L": " + utfCvrtTo(description); - throw FileError(msg); + const std::wstring errorMsg = replaceCpy(_("Unable to move %x to the Recycle Bin."), L"%x", fmtFileName(filename)); + std::wstring errorDescr = L"OSStatus Code " + numberTo(oss); + + if (const char* description = ::GetMacOSStatusCommentString(oss)) //found no documentation for proper use of GetMacOSStatusCommentString + errorDescr += L": " + utfCvrtTo(description); + throw FileError(errorMsg, errorDescr); }; FSRef objectRef; @@ -234,7 +233,7 @@ bool zen::recycleOrDelete(const Zstring& filename) //throw FileError } -#ifdef FFS_WIN +#ifdef ZEN_WIN StatusRecycler zen::recycleBinStatus(const Zstring& pathName) { const DWORD bufferSize = MAX_PATH + 1; @@ -323,7 +322,7 @@ StatusRecycler zen::recycleBinStatus(const Zstring& pathName) */ } -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC /* We really need access to a similar function to check whether a directory supports trashing and emit a warning if it does not! diff --git a/zen/recycler.h b/zen/recycler.h index 8aca0ff3..f55971ac 100644 --- a/zen/recycler.h +++ b/zen/recycler.h @@ -34,7 +34,7 @@ Already included in package "gtk+-2.0"! bool recycleOrDelete(const Zstring& filename); //throw FileError, return "true" if file/dir was actually deleted -#ifdef FFS_WIN +#ifdef ZEN_WIN enum StatusRecycler { STATUS_REC_EXISTS, diff --git a/zen/scope_guard.h b/zen/scope_guard.h index cb28904f..000853fd 100644 --- a/zen/scope_guard.h +++ b/zen/scope_guard.h @@ -1,5 +1,5 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * +// * This file is part of the zen::Xml project. It is distributed under the * // * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/zen/serialize.h b/zen/serialize.h index 982165f9..415bd430 100644 --- a/zen/serialize.h +++ b/zen/serialize.h @@ -167,7 +167,7 @@ BinContainer loadBinStream(const Zstring& filename) //throw FileError, ErrorNotE const size_t blockSize = 128 * 1024; do { - contOut.resize(contOut.size() + blockSize); + contOut.resize(contOut.size() + blockSize); //container better implement exponential growth! const size_t bytesRead = fileIn.read(&*contOut.begin() + contOut.size() - blockSize, blockSize); //throw FileError if (bytesRead < blockSize) diff --git a/zen/stl_tools.h b/zen/stl_tools.h index b394b128..c93f2d61 100644 --- a/zen/stl_tools.h +++ b/zen/stl_tools.h @@ -1,5 +1,5 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * +// * This file is part of the zen::Xml project. It is distributed under the * // * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** @@ -129,7 +129,7 @@ ForwardIterator binary_search(ForwardIterator first, ForwardIterator last, const template inline -BidirectionalIterator find_last(const BidirectionalIterator first, BidirectionalIterator last, const T& value) +BidirectionalIterator find_last(const BidirectionalIterator first, const BidirectionalIterator last, const T& value) { for (BidirectionalIterator iter = last; iter != first;) //reverse iteration: 1. check 2. decrement 3. evaluate { @@ -143,8 +143,8 @@ BidirectionalIterator find_last(const BidirectionalIterator first, Bidirectional template inline -BidirectionalIterator1 search_last(const BidirectionalIterator1 first1, BidirectionalIterator1 last1, - const BidirectionalIterator2 first2, BidirectionalIterator2 last2) +BidirectionalIterator1 search_last(const BidirectionalIterator1 first1, BidirectionalIterator1 last1, + const BidirectionalIterator2 first2, const BidirectionalIterator2 last2) { const BidirectionalIterator1 iterNotFound = last1; diff --git a/zen/string_tools.h b/zen/string_tools.h index 990c823a..4639e1dd 100644 --- a/zen/string_tools.h +++ b/zen/string_tools.h @@ -1,5 +1,5 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * +// * This file is part of the zen::Xml project. It is distributed under the * // * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** @@ -463,41 +463,69 @@ perf: integer to string: (executed 10 mio. times) formatInteger - 778 ms */ -template inline -S formatInteger(Num n, bool hasMinus) +template inline +void formatNegativeInteger(Num n, OutputIterator& it) { - assert(n >= 0); - typedef typename GetCharType::Type CharType; - CharType buffer[2 + sizeof(Num) * 5 / 2]; //it's generally faster to use a buffer than to rely on String::operator+=() (in)efficiency - //required chars (+ sign char): 1 + ceil(ln_10 (256^sizeof(n))) =~ 1 + ceil(sizeof(n) * 2.4082) < 2 + floor(sizeof(n) * 2.5) - - auto iter = std::end(buffer); + assert(n < 0); + typedef typename std::iterator_traits::value_type CharType; do { const Num tmp = n / 10; - *--iter = static_cast('0' + (n - tmp * 10)); //8% faster than using modulus operator! + *--it = static_cast('0' + (tmp * 10 - n)); //8% faster than using modulus operator! n = tmp; } while (n != 0); - if (hasMinus) - *--iter = static_cast('-'); + *--it = static_cast('-'); +} - return S(&*iter, std::end(buffer) - iter); +template inline +void formatPositiveInteger(Num n, OutputIterator& it) +{ + assert(n >= 0); + typedef typename std::iterator_traits::value_type CharType; + do + { + const Num tmp = n / 10; + *--it = static_cast('0' + (n - tmp * 10)); //8% faster than using modulus operator! + n = tmp; + } + while (n != 0); } + template inline S numberTo(const Num& number, Int2Type) { - return formatInteger(number < 0 ? -number : number, number < 0); - //bug for "INT_MIN"! technically -INT_MIN == INT_MIN -> not worth the trouble + typedef typename GetCharType::Type CharType; + CharType buffer[2 + sizeof(Num) * 241 / 100]; //it's generally faster to use a buffer than to rely on String::operator+=() (in)efficiency + //required chars (+ sign char): 1 + ceil(ln_10(256^sizeof(n) / 2 + 1)) -> divide by 2 for signed half-range; second +1 since one half starts with 1! + // <= 1 + ceil(ln_10(256^sizeof(n))) =~ 1 + ceil(sizeof(n) * 2.4082) <= 2 + floor(sizeof(n) * 2.41) + + //caveat: consider INT_MIN: technically -INT_MIN == INT_MIN + auto it = std::end(buffer); + if (number < 0) + formatNegativeInteger(number, it); + else + formatPositiveInteger(number, it); + assert(it >= std::begin(buffer)); + + return S(&*it, std::end(buffer) - it); } template inline S numberTo(const Num& number, Int2Type) { - return formatInteger(number, false); + typedef typename GetCharType::Type CharType; + CharType buffer[1 + sizeof(Num) * 241 / 100]; + //required chars: ceil(ln_10(256^sizeof(n))) =~ ceil(sizeof(n) * 2.4082) <= 1 + floor(sizeof(n) * 2.41) + + auto it = std::end(buffer); + formatPositiveInteger(number, it); + assert(it >= std::begin(buffer)); + + return S(&*it, std::end(buffer) - it); } //-------------------------------------------------------------------------------- diff --git a/zen/string_traits.h b/zen/string_traits.h index 22aa2ffc..eb79831e 100644 --- a/zen/string_traits.h +++ b/zen/string_traits.h @@ -1,5 +1,5 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * +// * This file is part of the zen::Xml project. It is distributed under the * // * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/zen/symlink_target.h b/zen/symlink_target.h index bbced0fa..bfd9e038 100644 --- a/zen/symlink_target.h +++ b/zen/symlink_target.h @@ -10,27 +10,27 @@ #include "scope_guard.h" #include "file_error.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "win.h" //includes "windows.h" #include "WinIoCtl.h" #include "privilege.h" #include "long_path_prefix.h" #include "dll.h" -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC #include +#include //realpath #endif namespace zen { -#ifdef FFS_WIN +#ifdef ZEN_WIN bool isSymlink(const WIN32_FIND_DATA& data); //*not* a simple FILE_ATTRIBUTE_REPARSE_POINT check! bool isSymlink(DWORD fileAttributes, DWORD reparseTag); - -Zstring getResolvedFilePath(const Zstring& filename); //throw FileError; requires Vista or later! #endif +Zstring getResolvedFilePath(const Zstring& linkPath); //throw FileError; Win: requires Vista or later! Zstring getSymlinkTargetRaw(const Zstring& linkPath); //throw FileError } @@ -84,7 +84,7 @@ namespace Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileError { using namespace zen; -#ifdef FFS_WIN +#ifdef ZEN_WIN //FSCTL_GET_REPARSE_POINT: http://msdn.microsoft.com/en-us/library/aa364571(VS.85).aspx //reading certain symlinks/junctions requires admin rights! @@ -100,7 +100,7 @@ Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileErro FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, nullptr); if (hLink == INVALID_HANDLE_VALUE) - throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)), formatSystemError(L"CreateFile", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hLink)); //respect alignment issues... @@ -116,7 +116,7 @@ Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileErro bufferSize, //__in DWORD nOutBufferSize, &bytesReturned, //__out_opt LPDWORD lpBytesReturned, nullptr)) //__inout_opt LPOVERLAPPED lpOverlapped - throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)), formatSystemError(L"DeviceIoControl, FSCTL_GET_REPARSE_POINT", getLastError())); REPARSE_DATA_BUFFER& reparseData = *reinterpret_cast(&buffer[0]); //REPARSE_DATA_BUFFER needs to be artificially enlarged! @@ -132,7 +132,7 @@ Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileErro reparseData.MountPointReparseBuffer.SubstituteNameLength / sizeof(WCHAR)); } else - throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)) + L"\n\n" + L"Not a symbolic link or junction!"); + throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)), L"Not a symbolic link or junction!"); //absolute symlinks and junctions technically start with \??\ while relative ones do not if (startsWith(output, Zstr("\\??\\"))) @@ -140,29 +140,29 @@ Zstring getSymlinkRawTargetString_impl(const Zstring& linkPath) //throw FileErro return output; -#elif defined FFS_LINUX || defined FFS_MAC +#elif defined ZEN_LINUX || defined ZEN_MAC const size_t BUFFER_SIZE = 10000; std::vector buffer(BUFFER_SIZE); const ssize_t bytesWritten = ::readlink(linkPath.c_str(), &buffer[0], BUFFER_SIZE); if (bytesWritten < 0 || bytesWritten >= static_cast(BUFFER_SIZE)) //detect truncation! { - std::wstring errorMessage = replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)); + ErrorCode lastError = getLastError(); + const std::wstring errorMsg = replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(linkPath)); if (bytesWritten < 0) - errorMessage += L"\n\n" + getLastErrorFormatted(); - throw FileError(errorMessage); + throw FileError(errorMsg, formatSystemError(L"readlink", lastError)); + throw FileError(errorMsg); } return Zstring(&buffer[0], bytesWritten); //readlink does not append 0-termination! #endif } -#ifdef FFS_WIN -Zstring getResolvedFilePath_impl(const Zstring& filename) //throw FileError +Zstring getResolvedFilePath_impl(const Zstring& linkPath) //throw FileError { using namespace zen; - - const HANDLE hDir = ::CreateFile(applyLongPathPrefix(filename).c_str(), +#ifdef ZEN_WIN + const HANDLE hDir = ::CreateFile(applyLongPathPrefix(linkPath).c_str(), 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, nullptr, @@ -170,7 +170,7 @@ Zstring getResolvedFilePath_impl(const Zstring& filename) //throw FileError FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory nullptr); if (hDir == INVALID_HANDLE_VALUE) - throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted() + L" (CreateFile)"); + throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)), formatSystemError(L"CreateFile", getLastError())); ZEN_ON_SCOPE_EXIT(::CloseHandle(hDir)); //GetFinalPathNameByHandle() is not available before Vista! @@ -178,11 +178,11 @@ Zstring getResolvedFilePath_impl(const Zstring& filename) //throw FileError const SysDllFun getFinalPathNameByHandle(L"kernel32.dll", "GetFinalPathNameByHandleW"); if (!getFinalPathNameByHandle) - throw FileError(replaceCpy(_("Cannot find system function %x."), L"%x", L"\"GetFinalPathNameByHandleW\"")); + throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)), replaceCpy(_("Cannot find system function %x."), L"%x", L"\"GetFinalPathNameByHandleW\"")); const DWORD bufferSize = getFinalPathNameByHandle(hDir, nullptr, 0, 0); if (bufferSize == 0) - throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted()); + throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)), formatSystemError(L"GetFinalPathNameByHandle", getLastError())); std::vector targetPath(bufferSize); const DWORD charsWritten = getFinalPathNameByHandle(hDir, //__in HANDLE hFile, @@ -191,16 +191,23 @@ Zstring getResolvedFilePath_impl(const Zstring& filename) //throw FileError 0); //__in DWORD dwFlags if (charsWritten == 0 || charsWritten >= bufferSize) { - std::wstring errorMessage = replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(filename)); + const std::wstring errorMsg = replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)); if (charsWritten == 0) - errorMessage += L"\n\n" + getLastErrorFormatted(); - throw FileError(errorMessage); + throw FileError(errorMsg, formatSystemError(L"GetFinalPathNameByHandle", getLastError())); + throw FileError(errorMsg); } return Zstring(&targetPath[0], charsWritten); -} + +#elif defined ZEN_LINUX || defined ZEN_MAC + char* targetPath = ::realpath(linkPath.c_str(), nullptr); + if (!targetPath) + throw FileError(replaceCpy(_("Cannot determine final path for %x."), L"%x", fmtFileName(linkPath)), formatSystemError(L"realpath", getLastError())); + ZEN_ON_SCOPE_EXIT(::free(targetPath)); + return targetPath; #endif } +} namespace zen @@ -208,11 +215,10 @@ namespace zen inline Zstring getSymlinkTargetRaw(const Zstring& linkPath) { return getSymlinkRawTargetString_impl(linkPath); } - -#ifdef FFS_WIN inline -Zstring getResolvedFilePath(const Zstring& filename) { return getResolvedFilePath_impl(filename); } +Zstring getResolvedFilePath(const Zstring& linkPath) { return getResolvedFilePath_impl(linkPath); } +#ifdef ZEN_WIN /* Reparse Point Tags http://msdn.microsoft.com/en-us/library/windows/desktop/aa365511(v=vs.85).aspx diff --git a/zen/sys_error.h b/zen/sys_error.h new file mode 100644 index 00000000..bbac2eaa --- /dev/null +++ b/zen/sys_error.h @@ -0,0 +1,124 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * +// ************************************************************************** + +#ifndef LAST_ERROR_H_3284791347018951324534 +#define LAST_ERROR_H_3284791347018951324534 + +#include +#include "utf.h" +#include "i18n.h" +#include "scope_guard.h" + +#ifdef ZEN_WIN +#include "win.h" //includes "windows.h" + +#elif defined ZEN_LINUX || defined ZEN_MAC +#include +#include +#endif + + +namespace zen +{ +//evaluate GetLastError()/errno and assemble specific error message +#ifdef ZEN_WIN +typedef DWORD ErrorCode; +#elif defined ZEN_LINUX || defined ZEN_MAC +typedef int ErrorCode; +#endif + +ErrorCode getLastError(); + +std::wstring formatSystemError(const std::wstring& functionName, ErrorCode lastError); + +bool errorCodeForNotExisting(ErrorCode lastError); //check for "not existing" aliases + + +//A low-level exception class giving (non-translated) detail information only - same conceptional level like "GetLastError()"! +class SysError +{ +public: + explicit SysError(const std::wstring& msg) : msg_(msg) {} + const std::wstring& toString() const { return msg_; } + +private: + std::wstring msg_; +}; + + + + + + + + +//######################## implementation ######################## +inline +ErrorCode getLastError() +{ +#ifdef ZEN_WIN + return ::GetLastError(); +#elif defined ZEN_LINUX || defined ZEN_MAC + return errno; //don't use "::", errno is a macro! +#endif +} + + +std::wstring formatSystemError(const std::wstring& functionName, long long lastError); //not implemented! intentional overload ambiguity to catch usage errors with HRESULT! + + +inline +std::wstring formatSystemError(const std::wstring& functionName, ErrorCode lastError) +{ + //determine error code if none was specified -> still required?? + if (lastError == 0) + lastError = getLastError(); + + std::wstring output = replaceCpy(_("Error Code %x:"), L"%x", numberTo(lastError)); + +#ifdef ZEN_WIN + LPWSTR buffer = nullptr; + if (::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_MAX_WIDTH_MASK | + FORMAT_MESSAGE_IGNORE_INSERTS | //important: without this flag ::FormatMessage() will fail if message contains placeholders + FORMAT_MESSAGE_ALLOCATE_BUFFER, nullptr, lastError, 0, reinterpret_cast(&buffer), 0, nullptr) != 0) + if (buffer) //"don't trust nobody" + { + ZEN_ON_SCOPE_EXIT(::LocalFree(buffer)); + output += L" "; + output += buffer; + } + ::SetLastError(lastError); //restore last error + +#elif defined ZEN_LINUX || defined ZEN_MAC + output += L" "; + output += utfCvrtTo(::strerror(lastError)); + + errno = lastError; //restore errno +#endif + if (!endsWith(output, L" ")) //Windows messages seem to end with a blank... + output += L" "; + output += L"(" + functionName + L")"; + + return output; +} + + +inline +bool errorCodeForNotExisting(ErrorCode lastError) +{ +#ifdef ZEN_WIN + return lastError == ERROR_FILE_NOT_FOUND || + lastError == ERROR_PATH_NOT_FOUND || + lastError == ERROR_BAD_NETPATH || + lastError == ERROR_NETNAME_DELETED; +#elif defined ZEN_LINUX || defined ZEN_MAC + return lastError == ENOENT; +#endif +} +} + +#endif //LAST_ERROR_H_3284791347018951324534 diff --git a/zen/tick_count.h b/zen/tick_count.h index d005a828..893d8e80 100644 --- a/zen/tick_count.h +++ b/zen/tick_count.h @@ -1,6 +1,6 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * -// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** @@ -10,13 +10,13 @@ #include #include "type_traits.h" #include "basic_math.h" -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "win.h" //includes "windows.h" -#elif defined FFS_LINUX +#elif defined ZEN_LINUX #include //Posix ::clock_gettime() -#elif defined FFS_MAC +#elif defined ZEN_MAC #include #endif //#include @@ -57,11 +57,11 @@ TickVal getTicks(); //return invalid value on error: !TickVal::isValid() class TickVal { public: -#ifdef FFS_WIN +#ifdef ZEN_WIN typedef LARGE_INTEGER NativeVal; -#elif defined FFS_LINUX +#elif defined ZEN_LINUX typedef timespec NativeVal; -#elif defined FFS_MAC +#elif defined ZEN_MAC typedef uint64_t NativeVal; #endif @@ -71,16 +71,16 @@ public: inline friend std::int64_t dist(const TickVal& lhs, const TickVal& rhs) { -#ifdef FFS_WIN +#ifdef ZEN_WIN return numeric::dist(lhs.val_.QuadPart, rhs.val_.QuadPart); //std::abs(a - b) can lead to overflow! -#elif defined FFS_LINUX +#elif defined ZEN_LINUX const auto distSec = numeric::dist(lhs.val_.tv_sec, rhs.val_.tv_sec); const auto distNsec = numeric::dist(lhs.val_.tv_nsec, rhs.val_.tv_nsec); if (distSec > (std::numeric_limits::max() - distNsec) / 1000000000) //truncate instead of overflow! return std::numeric_limits::max(); return distSec * 1000000000 + distNsec; -#elif defined FFS_MAC +#elif defined ZEN_MAC return numeric::dist(lhs.val_, rhs.val_); #endif } @@ -88,13 +88,13 @@ public: inline friend bool operator<(const TickVal& lhs, const TickVal& rhs) { -#ifdef FFS_WIN +#ifdef ZEN_WIN return lhs.val_.QuadPart < rhs.val_.QuadPart; -#elif defined FFS_LINUX +#elif defined ZEN_LINUX if (lhs.val_.tv_sec != rhs.val_.tv_sec) return lhs.val_.tv_sec < rhs.val_.tv_sec; return lhs.val_.tv_nsec < rhs.val_.tv_nsec; -#elif defined FFS_MAC +#elif defined ZEN_MAC return lhs.val_ < rhs.val_; #endif } @@ -109,17 +109,17 @@ private: inline std::int64_t ticksPerSec() //return 0 on error { -#ifdef FFS_WIN +#ifdef ZEN_WIN LARGE_INTEGER frequency = {}; if (!::QueryPerformanceFrequency(&frequency)) //MSDN promises: "The frequency cannot change while the system is running." return 0; static_assert(sizeof(std::int64_t) >= sizeof(frequency.QuadPart), ""); return frequency.QuadPart; -#elif defined FFS_LINUX +#elif defined ZEN_LINUX return 1000000000; //precision: nanoseconds -#elif defined FFS_MAC +#elif defined ZEN_MAC mach_timebase_info_data_t tbi = {}; if (::mach_timebase_info(&tbi) != KERN_SUCCESS) return 0; @@ -131,18 +131,18 @@ std::int64_t ticksPerSec() //return 0 on error inline TickVal getTicks() //return !isValid() on error { -#ifdef FFS_WIN +#ifdef ZEN_WIN LARGE_INTEGER now = {}; if (!::QueryPerformanceCounter(&now)) //msdn: SetThreadAffinityMask() may be required if there are bugs in BIOS or HAL" return TickVal(); -#elif defined FFS_LINUX +#elif defined ZEN_LINUX //gettimeofday() seems fine but is deprecated timespec now = {}; if (::clock_gettime(CLOCK_MONOTONIC_RAW, &now) != 0) //CLOCK_MONOTONIC measures time reliably across processors! return TickVal(); -#elif defined FFS_MAC +#elif defined ZEN_MAC uint64_t now = ::mach_absolute_time(); //can this call fail??? #endif return TickVal(now); diff --git a/zen/time.h b/zen/time.h index 80481856..e94300a0 100644 --- a/zen/time.h +++ b/zen/time.h @@ -1,6 +1,6 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * -// * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** @@ -197,8 +197,8 @@ template inline size_t strftimeWrap(CharType* buffer, size_t bufferSize, const CharType* format, const struct std::tm* timeptr) { #if defined _MSC_VER && !defined NDEBUG - //it's no use: application init must register an invalid parameter that does nothing !!! - //=> strftime will abort with 0 and set errno to EINVAL instead of CRASH THE APPLICATION! + //there's no way around: application init must register an invalid parameter handler that does nothing !!! + //=> strftime will abort with 0 and set errno to EINVAL instead of CRASHING THE APPLICATION! _invalid_parameter_handler oldHandler = _set_invalid_parameter_handler(nullptr); assert(oldHandler); _set_invalid_parameter_handler(oldHandler); diff --git a/zen/type_tools.h b/zen/type_tools.h index c83e8f1e..e5ce29bd 100644 --- a/zen/type_tools.h +++ b/zen/type_tools.h @@ -1,5 +1,5 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * +// * This file is part of the zen::Xml project. It is distributed under the * // * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/zen/type_traits.h b/zen/type_traits.h index 15352e8c..4f71f961 100644 --- a/zen/type_traits.h +++ b/zen/type_traits.h @@ -1,5 +1,5 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * +// * This file is part of the zen::Xml project. It is distributed under the * // * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** @@ -80,11 +80,6 @@ template struct IsArithmetic; //IsInteger or IsFloat - - - - - //################ implementation ###################### #define ZEN_SPECIALIZE_TRAIT(X, Y) template <> struct X : StaticBool {}; diff --git a/zen/utf.h b/zen/utf.h index 8da588cd..e428422b 100644 --- a/zen/utf.h +++ b/zen/utf.h @@ -1,5 +1,5 @@ // ************************************************************************** -// * This file is part of the zenXML project. It is distributed under the * +// * This file is part of the zen::Xml project. It is distributed under the * // * Boost Software License: http://www.boost.org/LICENSE_1_0.txt * // * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * // ************************************************************************** diff --git a/zen/zstring.cpp b/zen/zstring.cpp index 085e6f72..a469ade2 100644 --- a/zen/zstring.cpp +++ b/zen/zstring.cpp @@ -7,11 +7,11 @@ #include "zstring.h" #include -#ifdef FFS_WIN +#ifdef ZEN_WIN #include "dll.h" #include "win_ver.h" -#elif defined FFS_MAC +#elif defined ZEN_MAC //#include #include //toupper() #endif @@ -64,7 +64,7 @@ private: const std::string message = std::string("Memory leak detected!") + "\n\n" + "Candidates:\n" + leakingStrings; -#ifdef FFS_WIN +#ifdef ZEN_WIN MessageBoxA(nullptr, message.c_str(), "Error", 0); #else std::cerr << message; @@ -85,7 +85,7 @@ private: void reportProblem(const std::string& message) //throw std::logic_error { -#ifdef FFS_WIN +#ifdef ZEN_WIN ::MessageBoxA(nullptr, message.c_str(), "Error", 0); #else std::cerr << message; @@ -128,7 +128,7 @@ time per call | function */ -#ifdef FFS_WIN +#ifdef ZEN_WIN namespace { #ifdef __MINGW32__ //MinGW is clueless... @@ -227,7 +227,7 @@ void z_impl::makeFilenameUpperCase(wchar_t* str, size_t size) throw std::runtime_error("Error converting to upper case! (LCMapString)"); } -#elif defined FFS_MAC +#elif defined ZEN_MAC int z_impl::compareFilenamesNoCase(const char* lhs, const char* rhs, size_t sizeLhs, size_t sizeRhs) { return ::strcasecmp(lhs, rhs); //locale-dependent! diff --git a/zen/zstring.h b/zen/zstring.h index 435f03a2..80c267e3 100644 --- a/zen/zstring.h +++ b/zen/zstring.h @@ -8,9 +8,9 @@ #define ZSTRING_H_INCLUDED #include "string_base.h" -#ifdef FFS_LINUX +#ifdef ZEN_LINUX #include //strcmp -#elif defined FFS_MAC +#elif defined ZEN_MAC //#include //strcasecmp #endif @@ -49,12 +49,12 @@ public: //############################## helper functions ############################################# -#ifdef FFS_WIN //Windows encodes Unicode as UTF-16 wchar_t +#ifdef ZEN_WIN //Windows encodes Unicode as UTF-16 wchar_t typedef wchar_t Zchar; #define Zstr(x) L ## x const Zchar FILE_NAME_SEPARATOR = L'\\'; -#elif defined FFS_LINUX || defined FFS_MAC //Linux uses UTF-8 +#elif defined ZEN_LINUX || defined ZEN_MAC //Linux uses UTF-8 typedef char Zchar; #define Zstr(x) x const Zchar FILE_NAME_SEPARATOR = '/'; @@ -82,7 +82,7 @@ struct EqualFilename //case-insensitive on Windows, case-sensitive on Linux bool operator()(const zen::Zbase& lhs, const zen::Zbase& rhs) const { return cmpFileName(lhs, rhs) == 0; } }; -#if defined FFS_WIN || defined FFS_MAC +#if defined ZEN_WIN || defined ZEN_MAC template