summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Application.cpp58
-rw-r--r--Application.h2
-rw-r--r--BUILD/Changelog.txt18
-rw-r--r--BUILD/FreeFileSync.chmbin667830 -> 662608 bytes
-rw-r--r--BUILD/Help/html/External Applications.html33
-rw-r--r--BUILD/Help/html/FreeFileSync.html27
-rw-r--r--BUILD/Help/html/Links.html4
-rw-r--r--BUILD/Help/html/Run as Service.html8
-rw-r--r--BUILD/Help/html/Schedule a Batch Job.html5
-rw-r--r--BUILD/Help/img/MainDialog.pngbin75443 -> 74469 bytes
-rw-r--r--BUILD/Help/img/SetupBatch.pngbin31640 -> 27624 bytes
-rw-r--r--BUILD/Languages/chinese_simple.lng244
-rw-r--r--BUILD/Languages/chinese_traditional.lng240
-rw-r--r--BUILD/Languages/croatian.lng250
-rw-r--r--BUILD/Languages/czech.lng261
-rw-r--r--BUILD/Languages/danish.lng246
-rw-r--r--BUILD/Languages/dutch.lng241
-rw-r--r--BUILD/Languages/english_uk.lng267
-rw-r--r--BUILD/Languages/finnish.lng260
-rw-r--r--BUILD/Languages/french.lng285
-rw-r--r--BUILD/Languages/german.lng249
-rw-r--r--BUILD/Languages/greek.lng273
-rw-r--r--BUILD/Languages/hebrew.lng252
-rw-r--r--BUILD/Languages/hungarian.lng308
-rw-r--r--BUILD/Languages/italian.lng252
-rw-r--r--BUILD/Languages/japanese.lng265
-rw-r--r--BUILD/Languages/korean.lng281
-rw-r--r--BUILD/Languages/lithuanian.lng311
-rw-r--r--BUILD/Languages/norwegian.lng238
-rw-r--r--BUILD/Languages/polish.lng256
-rw-r--r--BUILD/Languages/portuguese.lng248
-rw-r--r--BUILD/Languages/portuguese_br.lng256
-rw-r--r--BUILD/Languages/romanian.lng267
-rw-r--r--BUILD/Languages/russian.lng240
-rw-r--r--BUILD/Languages/scottish_gaelic.lng234
-rw-r--r--BUILD/Languages/slovenian.lng265
-rw-r--r--BUILD/Languages/spanish.lng250
-rw-r--r--BUILD/Languages/swedish.lng267
-rw-r--r--BUILD/Languages/turkish.lng265
-rw-r--r--BUILD/Languages/ukrainian.lng234
-rw-r--r--FreeFileSync.cbp21
-rw-r--r--FreeFileSync.vcxproj1
-rw-r--r--Makefile3
-rw-r--r--RealtimeSync/RealtimeSync.cbp12
-rw-r--r--RealtimeSync/application.cpp2
-rw-r--r--RealtimeSync/application.h2
-rw-r--r--RealtimeSync/gui_generated.cpp14
-rw-r--r--RealtimeSync/gui_generated.h6
-rw-r--r--RealtimeSync/main_dlg.cpp24
-rw-r--r--RealtimeSync/main_dlg.h5
-rw-r--r--RealtimeSync/makefile2
-rw-r--r--RealtimeSync/resources.cpp2
-rw-r--r--RealtimeSync/resources.h2
-rw-r--r--RealtimeSync/tray_menu.cpp14
-rw-r--r--RealtimeSync/tray_menu.h2
-rw-r--r--RealtimeSync/watcher.cpp2
-rw-r--r--RealtimeSync/watcher.h2
-rw-r--r--RealtimeSync/xml_ffs.cpp2
-rw-r--r--RealtimeSync/xml_ffs.h2
-rw-r--r--RealtimeSync/xml_proc.cpp2
-rw-r--r--RealtimeSync/xml_proc.h2
-rw-r--r--algorithm.cpp8
-rw-r--r--algorithm.h2
-rw-r--r--comparison.cpp249
-rw-r--r--comparison.h54
-rw-r--r--file_hierarchy.cpp4
-rw-r--r--file_hierarchy.h18
-rw-r--r--lib/ShadowCopy/LockFile.cpp2
-rw-r--r--lib/ShadowCopy/Shadow_Server2003.vcxproj4
-rw-r--r--lib/ShadowCopy/Shadow_Windows7.vcxproj4
-rw-r--r--lib/ShadowCopy/Shadow_XP.vcxproj4
-rw-r--r--lib/ShadowCopy/dll_main.cpp2
-rw-r--r--lib/ShadowCopy/shadow.cpp2
-rw-r--r--lib/ShadowCopy/shadow.h2
-rw-r--r--lib/Thumbnail/dll_main.cpp2
-rw-r--r--lib/Thumbnail/thumbnail.cpp2
-rw-r--r--lib/Thumbnail/thumbnail.h2
-rw-r--r--lib/binary.cpp2
-rw-r--r--lib/binary.h9
-rw-r--r--lib/db_file.cpp14
-rw-r--r--lib/db_file.h2
-rw-r--r--lib/dir_exist_async.h2
-rw-r--r--lib/dir_lock.cpp4
-rw-r--r--lib/dir_lock.h2
-rw-r--r--lib/error_log.h4
-rw-r--r--lib/ffs_paths.h2
-rw-r--r--lib/generate_logfile.h28
-rw-r--r--lib/hard_filter.cpp4
-rw-r--r--lib/hard_filter.h2
-rw-r--r--lib/help_provider.h2
-rw-r--r--lib/icon_buffer.cpp2
-rw-r--r--lib/icon_buffer.h2
-rw-r--r--lib/localization.cpp4
-rw-r--r--lib/localization.h2
-rw-r--r--lib/norm_filter.h2
-rw-r--r--lib/parallel_scan.cpp8
-rw-r--r--lib/parallel_scan.h8
-rw-r--r--lib/parse_lng.h2
-rw-r--r--lib/parse_plural.h2
-rw-r--r--lib/perf_check.cpp8
-rw-r--r--lib/perf_check.h4
-rw-r--r--lib/process_xml.cpp189
-rw-r--r--lib/process_xml.h36
-rw-r--r--lib/resolve_path.cpp295
-rw-r--r--lib/resolve_path.h21
-rw-r--r--lib/resources.cpp3
-rw-r--r--lib/resources.h2
-rw-r--r--lib/return_codes.h2
-rw-r--r--lib/shadow.cpp5
-rw-r--r--lib/shadow.h4
-rw-r--r--lib/soft_filter.h2
-rw-r--r--lib/status_handler.cpp2
-rw-r--r--lib/status_handler.h2
-rw-r--r--lib/status_handler_impl.h2
-rw-r--r--lib/versioning.cpp398
-rw-r--r--lib/versioning.h85
-rw-r--r--lib/xml_base.cpp2
-rw-r--r--lib/xml_base.h2
-rw-r--r--process_callback.h2
-rw-r--r--structures.cpp2
-rw-r--r--structures.h58
-rw-r--r--synchronization.cpp435
-rw-r--r--synchronization.h82
-rw-r--r--ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj230
-rw-r--r--ui/IFileDialog_Vista/dll_main.cpp25
-rw-r--r--ui/IFileDialog_Vista/ifile_dialog.cpp98
-rw-r--r--ui/IFileDialog_Vista/ifile_dialog.h61
-rw-r--r--ui/Taskbar_Seven/dll_main.cpp2
-rw-r--r--ui/Taskbar_Seven/taskbar.cpp2
-rw-r--r--ui/Taskbar_Seven/taskbar.h14
-rw-r--r--ui/batch_config.cpp269
-rw-r--r--ui/batch_config.h2
-rw-r--r--ui/batch_status_handler.cpp46
-rw-r--r--ui/batch_status_handler.h9
-rw-r--r--ui/check_version.cpp2
-rw-r--r--ui/check_version.h2
-rw-r--r--ui/column_attr.h2
-rw-r--r--ui/custom_grid.cpp4
-rw-r--r--ui/custom_grid.h2
-rw-r--r--ui/dir_name.cpp157
-rw-r--r--ui/dir_name.h41
-rw-r--r--ui/exec_finished_box.cpp85
-rw-r--r--ui/exec_finished_box.h11
-rw-r--r--ui/folder_history_box.cpp22
-rw-r--r--ui/folder_history_box.h8
-rw-r--r--ui/folder_pair.h2
-rw-r--r--ui/grid_view.cpp2
-rw-r--r--ui/grid_view.h2
-rw-r--r--ui/gui_generated.cpp674
-rw-r--r--ui/gui_generated.h169
-rw-r--r--ui/gui_status_handler.cpp8
-rw-r--r--ui/gui_status_handler.h2
-rw-r--r--ui/main_dlg.cpp316
-rw-r--r--ui/main_dlg.h116
-rw-r--r--ui/msg_popup.cpp4
-rw-r--r--ui/msg_popup.h2
-rw-r--r--ui/progress_indicator.cpp7
-rw-r--r--ui/progress_indicator.h2
-rw-r--r--ui/search.cpp2
-rw-r--r--ui/search.h2
-rw-r--r--ui/small_dlgs.cpp67
-rw-r--r--ui/small_dlgs.h2
-rw-r--r--ui/sorting.h2
-rw-r--r--ui/switch_to_gui.h2
-rw-r--r--ui/sync_cfg.cpp269
-rw-r--r--ui/sync_cfg.h2
-rw-r--r--ui/taskbar.cpp10
-rw-r--r--ui/taskbar.h2
-rw-r--r--ui/tray_icon.cpp2
-rw-r--r--ui/tray_icon.h2
-rw-r--r--ui/tree_view.cpp2
-rw-r--r--ui/tree_view.h2
-rw-r--r--ui/triple_splitter.cpp6
-rw-r--r--ui/triple_splitter.h2
-rw-r--r--ui/wx_form_build_hide_warnings.h2
-rw-r--r--version/version.h2
-rw-r--r--version/version.rc4
-rw-r--r--wx+/app_main.h2
-rw-r--r--wx+/button.cpp2
-rw-r--r--wx+/button.h2
-rw-r--r--wx+/choice_enum.h8
-rw-r--r--wx+/context_menu.h2
-rw-r--r--wx+/create_pch.cpp2
-rw-r--r--wx+/dir_picker.h35
-rw-r--r--wx+/file_drop.h2
-rw-r--r--wx+/format_unit.cpp24
-rw-r--r--wx+/format_unit.h4
-rw-r--r--wx+/graph.cpp2
-rw-r--r--wx+/graph.h2
-rw-r--r--wx+/grid.cpp7
-rw-r--r--wx+/grid.h2
-rw-r--r--wx+/image_tools.h2
-rw-r--r--wx+/mouse_move_dlg.cpp2
-rw-r--r--wx+/mouse_move_dlg.h2
-rw-r--r--wx+/no_flicker.h2
-rw-r--r--wx+/pch.h2
-rw-r--r--wx+/rtl.h2
-rw-r--r--wx+/shell_execute.h2
-rw-r--r--wx+/string_conv.h2
-rw-r--r--wx+/timespan.h2
-rw-r--r--wx+/toggle_button.h2
-rw-r--r--wx+/tooltip.cpp2
-rw-r--r--wx+/tooltip.h2
-rw-r--r--wx+/zlib_wrap.cpp2
-rw-r--r--wx+/zlib_wrap.h95
-rw-r--r--zen/FindFilePlus/dll_main.cpp2
-rw-r--r--zen/FindFilePlus/find_file_plus.cpp2
-rw-r--r--zen/FindFilePlus/find_file_plus.h2
-rw-r--r--zen/FindFilePlus/init_dll_binding.h2
-rw-r--r--zen/FindFilePlus/load_dll.cpp2
-rw-r--r--zen/FindFilePlus/load_dll.h2
-rw-r--r--zen/IFileOperation/FileOperation_Vista.vcxproj4
-rw-r--r--zen/IFileOperation/dll_main.cpp2
-rw-r--r--zen/IFileOperation/file_op.cpp2
-rw-r--r--zen/IFileOperation/file_op.h2
-rw-r--r--zen/assert_static.h2
-rw-r--r--zen/base64.h2
-rw-r--r--zen/basic_math.h2
-rw-r--r--zen/build_info.h2
-rw-r--r--zen/com_error.h2
-rw-r--r--zen/com_ptr.h2
-rw-r--r--zen/com_util.h2
-rw-r--r--zen/debug_log.h2
-rw-r--r--zen/debug_new.cpp12
-rw-r--r--zen/debug_new.h26
-rw-r--r--zen/deprecate.h2
-rw-r--r--zen/dir_watcher.cpp11
-rw-r--r--zen/dir_watcher.h2
-rw-r--r--zen/dll.h2
-rw-r--r--zen/error_log.h2
-rw-r--r--zen/file_error.h3
-rw-r--r--zen/file_handling.cpp255
-rw-r--r--zen/file_handling.h26
-rw-r--r--zen/file_id.cpp2
-rw-r--r--zen/file_id.h2
-rw-r--r--zen/file_id_def.h12
-rw-r--r--zen/file_io.cpp2
-rw-r--r--zen/file_io.h2
-rw-r--r--zen/file_traverser.cpp51
-rw-r--r--zen/file_traverser.h5
-rw-r--r--zen/fixed_list.h28
-rw-r--r--zen/guid.h2
-rw-r--r--zen/i18n.h2
-rw-r--r--zen/int64.h2
-rw-r--r--zen/last_error.h2
-rw-r--r--zen/long_path_prefix.h2
-rw-r--r--zen/notify_removal.cpp2
-rw-r--r--zen/notify_removal.h2
-rw-r--r--zen/optional.h2
-rw-r--r--zen/perf.h2
-rw-r--r--zen/privilege.h2
-rw-r--r--zen/read_txt.h2
-rw-r--r--zen/recycler.cpp2
-rw-r--r--zen/recycler.h2
-rw-r--r--zen/scope_guard.h2
-rw-r--r--zen/serialize.h2
-rw-r--r--zen/stl_tools.h2
-rw-r--r--zen/string_base.h2
-rw-r--r--zen/string_tools.h2
-rw-r--r--zen/string_traits.h2
-rw-r--r--zen/symlink_target.h2
-rw-r--r--zen/thread.h2
-rw-r--r--zen/tick_count.h2
-rw-r--r--zen/time.h35
-rw-r--r--zen/type_tools.h2
-rw-r--r--zen/type_traits.h2
-rw-r--r--zen/utf.h2
-rw-r--r--zen/warn_static.h2
-rw-r--r--zen/win.h2
-rw-r--r--zen/win_ver.h2
-rw-r--r--zen/zstring.cpp2
-rw-r--r--zen/zstring.h2
272 files changed, 7219 insertions, 6257 deletions
diff --git a/Application.cpp b/Application.cpp
index 26cd3b03..baf269c1 100644
--- a/Application.cpp
+++ b/Application.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "application.h"
@@ -161,24 +161,22 @@ void Application::OnStartApplication(wxIdleEvent&)
#endif
xmlAccess::XmlGlobalSettings globalSettings; //settings used by GUI, batch mode or both
- setLanguage(globalSettings.programLanguage); //set default language tentatively
-
- try //load global settings from XML: they are written on exit, so read them FIRST
+ try //load global settings
{
if (fileExists(toZ(getGlobalConfigFile())))
readConfig(globalSettings); //throw FfsXmlError
//else: globalSettings already has default values
-
- setLanguage(globalSettings.programLanguage);
}
catch (const xmlAccess::FfsXmlError& error)
{
+ setLanguage(globalSettings.programLanguage); //set default language
//show messagebox and continue
if (error.getSeverity() == FfsXmlError::WARNING)
; //wxMessageBox(error.toString(), _("Warning"), wxOK | wxICON_WARNING); -> ignore parsing errors: should be migration problems only *cross-fingers*
else
wxMessageBox(error.toString(), _("Error"), wxOK | wxICON_ERROR);
}
+ setLanguage(globalSettings.programLanguage);
//determine FFS mode of operation
std::vector<wxString> commandArgs = getCommandlineArgs(*this);
@@ -353,16 +351,17 @@ void runBatchMode(const Zstring& filename, XmlGlobalSettings& globSettings, FfsR
try //begin of synchronization process (all in one try-catch block)
{
- const std::wstring timestamp = formatTime<std::wstring>(L"%Y-%m-%d %H%M%S");
+
+ const TimeComp timeStamp = localTime();
const SwitchToGui switchBatchToGui(utfCvrtTo<wxString>(filename), batchCfg, globSettings); //prepare potential operational switch
//class handling status updates and error messages
BatchStatusHandler statusHandler(batchCfg.showProgress,
extractJobName(filename),
- timestamp,
+ timeStamp,
batchCfg.logFileDirectory,
- batchCfg.logFileCountMax,
+ batchCfg.logfilesCountLimit,
batchCfg.handleError,
switchBatchToGui,
returnCode,
@@ -397,30 +396,30 @@ void runBatchMode(const Zstring& filename, XmlGlobalSettings& globSettings, FfsR
}
//COMPARE DIRECTORIES
- CompareProcess cmpProc(globSettings.fileTimeTolerance,
- globSettings.optDialogs,
- allowPwPrompt,
- globSettings.runWithBackgroundPriority,
- statusHandler);
-
FolderComparison folderCmp;
- cmpProc.startCompareProcess(cmpConfig, folderCmp);
+ compare(globSettings.fileTimeTolerance,
+ globSettings.optDialogs,
+ allowPwPrompt,
+ globSettings.runWithBackgroundPriority,
+ cmpConfig,
+ folderCmp,
+ statusHandler);
//START SYNCHRONIZATION
- SyncProcess syncProc(extractJobName(filename),
- timestamp,
- globSettings.optDialogs,
- globSettings.verifyFileCopy,
- globSettings.copyLockedFiles,
- globSettings.copyFilePermissions,
- globSettings.transactionalFileCopy,
- globSettings.runWithBackgroundPriority,
- statusHandler);
-
const std::vector<FolderPairSyncCfg> syncProcessCfg = extractSyncCfg(batchCfg.mainCfg);
- assert(syncProcessCfg.size() == folderCmp.size());
-
- syncProc.startSynchronizationProcess(syncProcessCfg, folderCmp);
+ if (syncProcessCfg.size() != folderCmp.size())
+ throw std::logic_error("Programming Error: Contract violation!");
+
+ synchronize(timeStamp,
+ globSettings.optDialogs,
+ globSettings.verifyFileCopy,
+ globSettings.copyLockedFiles,
+ globSettings.copyFilePermissions,
+ globSettings.transactionalFileCopy,
+ globSettings.runWithBackgroundPriority,
+ syncProcessCfg,
+ folderCmp,
+ statusHandler);
//play (optional) sound notification after sync has completed -> don't play in silent mode, consider RealtimeSync!
if (batchCfg.showProgress)
@@ -432,7 +431,6 @@ void runBatchMode(const Zstring& filename, XmlGlobalSettings& globSettings, FfsR
}
catch (BatchAbortProcess&) {} //exit used by statusHandler
-
try //save global settings to XML: e.g. ignored warnings
{
xmlAccess::writeConfig(globSettings); //FfsXmlError
diff --git a/Application.h b/Application.h
index de5a7cf7..b0968f6d 100644
--- a/Application.h
+++ b/Application.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FREEFILESYNCAPP_H
diff --git a/BUILD/Changelog.txt b/BUILD/Changelog.txt
index b64c9933..412615f3 100644
--- a/BUILD/Changelog.txt
+++ b/BUILD/Changelog.txt
@@ -2,6 +2,24 @@
|FreeFileSync|
--------------
+Changelog v5.7
+--------------
+Modern directory selection dialog (Windows Vista and later)
+New file versioning scheme appending revision number to files
+New sync option to limit number of versions per file
+Revised configuration format for *.ffs_gui/*.ffs_batch files: old format will be supported for some time
+Fixed crash on invalid file modification times
+Fixed zlib error on empty database stream
+GlobalSettings.xml: added "MaxSize" parameter to "ConfigHistory"
+Fixed occasional crash on GTK 2 (Linux)
+Always show "items processed" in log file
+Simplified configuration dialogs
+Fixed password prompt not always coming up when connecting to a network share
+Support environment variables everywhere: +on completion; +external applications; +RTS command
+Harmonized external application macros: %item_path%, %item_folder%, %item2_path%, %item2_folder%
+Updated translation files
+
+
Changelog v5.6
--------------
Resize left and right grids equally
diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm
index 97363d82..91d928d1 100644
--- a/BUILD/FreeFileSync.chm
+++ b/BUILD/FreeFileSync.chm
Binary files differ
diff --git a/BUILD/Help/html/External Applications.html b/BUILD/Help/html/External Applications.html
index 16a7134d..f9d939dc 100644
--- a/BUILD/Help/html/External Applications.html
+++ b/BUILD/Help/html/External Applications.html
@@ -5,7 +5,7 @@
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)">
<META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20120511;23111200">
+ <META NAME="CHANGED" CONTENT="20120904;11283300">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -28,22 +28,26 @@ applications</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">By
default FreeFileSync opens the operating system's standard file
browser on each mouse double-click by invoking &quot;<FONT FACE="Courier New, monospace">explorer
-/select, &quot;%name&quot;</FONT>&quot; on Windows and &quot;<FONT FACE="Courier New, monospace">xdg-open
-&quot;%dir&quot;</FONT>&quot; on Linux.</FONT></P>
+/select, &quot;%item_path%&quot;</FONT>&quot; on Windows and
+&quot;<FONT FACE="Courier New, monospace">xdg-open &quot;%item_folder%&quot;</FONT>&quot;
+on Linux.</FONT></P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">However
you are free to integrate other external applications into
FreeFileSync: navigate to &quot;</FONT><FONT FACE="Tahoma, sans-serif"><I>Menu
-&gt; Advanced -&gt; Global settings: External Applications</I></FONT><FONT FACE="Tahoma, sans-serif">&quot;
and add or replace a command string. The first entry is executed when
double-clicking a row on main grid while all other entries are only
-available via right-click context menu. The following macros may be
-used:</FONT></P>
+available via right-click context menu. The following internal macros
+may be used:</FONT></P>
<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
<P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm">
- <FONT FACE="Courier New, monospace">%name&nbsp;&nbsp;&nbsp;- full
- file or directory name<BR>%dir &nbsp;&nbsp;&nbsp;- directory part
- only<BR>%nameCo&nbsp;- Other side's counterpart to %name<BR>%dirCo&nbsp;&nbsp;-
- Other side's counterpart to %dir</FONT></P>
+ <FONT FACE="Courier New, monospace">%item_path%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-
+ <FONT FACE="Tahoma, sans-serif">full file or folder
+ name</FONT><BR>%item_folder% &nbsp;&nbsp;- <FONT FACE="Tahoma, sans-serif">folder
+ part only</FONT><BR>%item2_path%&nbsp;&nbsp;&nbsp;&nbsp;- <FONT FACE="Tahoma, sans-serif">Other
+ side's counterpart to %item_path%</FONT><BR>%item2_folder%&nbsp;&nbsp;-
+ <FONT FACE="Tahoma, sans-serif">Other side's counterpart to
+ %item_folder%</FONT></FONT></P>
</SPAN><BR CLEAR=LEFT><BR>
</P>
<P STYLE="margin-bottom: 0cm"><BR>
@@ -52,17 +56,18 @@ used:</FONT></P>
<UL>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start
visual difference tool:<BR><FONT FACE="Courier New, monospace">&quot;C:\Program
- Files\WinMerge\WinMergeU.exe&quot; &quot;%name&quot; &quot;%nameCo&quot;<BR>&nbsp;</FONT></FONT></P>
+ Files\WinMerge\WinMergeU.exe&quot; &quot;%item_path%&quot;
+ &quot;%item2_path%&quot;<BR>&nbsp;</FONT></FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Show
file in Windows Explorer:<BR><FONT FACE="Courier New, monospace">explorer
- /select, &quot;%name&quot;<BR>&nbsp;</FONT></FONT></P>
+ /select, &quot;%item_path%&quot;<BR>&nbsp;</FONT></FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open
file in associated application:</FONT><BR><FONT FACE="Courier New, monospace">cmd
- /c start &quot;&quot; &quot;%name&quot; </FONT><FONT FACE="Tahoma, sans-serif">or
- simply</FONT> <FONT FACE="Courier New, monospace">&quot;%name&quot;</FONT><FONT FACE="Tahoma, sans-serif"><BR>&nbsp;</FONT></P>
+ /c start &quot;&quot; &quot;%item_path%&quot; </FONT><FONT FACE="Tahoma, sans-serif">or
+ simply</FONT> <FONT FACE="Courier New, monospace">&quot;%item_path%&quot;</FONT><FONT FACE="Tahoma, sans-serif"><BR>&nbsp;</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Open
console dialog:<BR><FONT FACE="Courier New, monospace">cmd /k cd /D
- &quot;%dir&quot;<BR>&nbsp;</FONT></FONT></P>
+ &quot;%item_folder%&quot;<BR>&nbsp;</FONT></FONT></P>
</UL>
<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
<P ALIGN=LEFT STYLE="margin-left: 0.79cm; margin-right: 0.98cm; margin-bottom: 0cm">
diff --git a/BUILD/Help/html/FreeFileSync.html b/BUILD/Help/html/FreeFileSync.html
index f08d1600..6004791c 100644
--- a/BUILD/Help/html/FreeFileSync.html
+++ b/BUILD/Help/html/FreeFileSync.html
@@ -5,7 +5,7 @@
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)">
<META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20120504;2110200">
+ <META NAME="CHANGED" CONTENT="20120903;14424200">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -29,7 +29,7 @@ Folder Comparison and Synchronization -</SPAN></I></FONT></H3>
<H3 CLASS="western" ALIGN=LEFT>Usage:</H3>
<OL>
<LI VALUE=1><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Choose
- left and right directories.<BR></FONT><IMG SRC="../img/SourceTarget.png" NAME="Grafik4" ALIGN=TEXTTOP BORDER=0></P>
+ left and right directories.<BR></FONT><IMG SRC="../img/SourceTarget.png" NAME="Grafik4" ALIGN=TEXTTOP WIDTH=427 HEIGHT=50 BORDER=0></P>
<P STYLE="margin-bottom: 0cm">&nbsp;</P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">&quot;</FONT><FONT FACE="Tahoma, sans-serif"><I>Compare</I></FONT><FONT FACE="Tahoma, sans-serif">&quot;
them.<BR></FONT><IMG SRC="../img/CompareButton.png" NAME="Grafik1" ALIGN=BOTTOM WIDTH=178 HEIGHT=40 BORDER=0></P>
@@ -49,33 +49,36 @@ Folder Comparison and Synchronization -</SPAN></I></FONT></H3>
<H3 CLASS="western" STYLE="page-break-before: always"><FONT FACE="Tahoma, sans-serif">Main
Dialog:</FONT></H3>
<OL>
- <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/MainDialog.png" NAME="Grafik5" ALIGN=BOTTOM WIDTH=743 HEIGHT=438 BORDER=0></P>
+ <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/MainDialog.png" NAME="Grafik5" ALIGN=BOTTOM BORDER=0></P>
</OL>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<OL>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Start
comparison</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Specify
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Setup
comparison settings</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Set
- sync configuration</FONT></FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Setup
+ synchronization settings</FONT></FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Start
synchronization</FONT></FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Tree
+ overview panel</FONT></FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Add
additional folder pairs</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Swap
- sides</FONT></FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Select
- left and right directories</FONT></FONT></P>
+ left and right folders</FONT></FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Synchronization
+ preview </FONT></FONT>
+ </P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Save/load
configuration</FONT></FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Filter
files</FONT></FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Specify
- category for display</FONT></FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Select
+ categories for preview</FONT></FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4>Synchronization
- statistics/preview</FONT></FONT></P>
+ statistics</FONT></FONT></P>
</OL>
<P STYLE="margin-bottom: 0cm; border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0cm; padding-bottom: 0.07cm; padding-left: 0cm; padding-right: 0cm">
<BR>
diff --git a/BUILD/Help/html/Links.html b/BUILD/Help/html/Links.html
index 5fcafa9d..2616b9ee 100644
--- a/BUILD/Help/html/Links.html
+++ b/BUILD/Help/html/Links.html
@@ -27,7 +27,7 @@ on SourceForge:<BR><A HREF="http://sourceforge.net/projects/freefilesync">http:/
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">For
feedback, suggestions or bug-reports you can write an email
-to:<BR><A HREF="mailto:zhnmju123@gmx.de">zhnmju123 [at] gmx [dot] de</A></FONT></P>
+to:<BR><A HREF="mailto:zenju@gmx.de">zenju [at] gmx [dot] de</A></FONT></P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Or
@@ -35,6 +35,6 @@ report directly to:<BR><A HREF="http://sourceforge.net/tracker/?group_id=234430"
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Support
-the FreeFileSync project:<BR><A HREF="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=zhnmju123@gmx.de&amp;lc=US&amp;currency_code=EUR">Paypal</A></FONT></P>
+the FreeFileSync project:<BR><A HREF="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=zenju@gmx.de&amp;no_shipping=1&amp;lc=US&amp;currency_code=EUR">Donate via PayPal</A></FONT></P>
</BODY>
</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Run as Service.html b/BUILD/Help/html/Run as Service.html
index b1bc5171..7fdd1393 100644
--- a/BUILD/Help/html/Run as Service.html
+++ b/BUILD/Help/html/Run as Service.html
@@ -5,7 +5,7 @@
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)">
<META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20120511;23105500">
+ <META NAME="CHANGED" CONTENT="20120903;12221300">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -30,9 +30,9 @@ following step-by-step guide describes how to setup RealtimeSync (or
any other application) as a Windows Service. This is necessary if the
tool shall run on the SYSTEM account independent from currently
logged-in users. If you are the only user and all you want is to
-start RealtimeSync automatically then it's better to place a link
-into Windows' Autostart folder, specifying RealtimeSync.exe and the
-.ffs_batch or .ffs_real file as argument.</FONT></P>
+start RealtimeSync automatically then it's better to <B>place a link
+into Windows' Autostart folder</B>, specifying RealtimeSync.exe and
+the .ffs_batch or .ffs_real file as argument.</FONT></P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Reference:
diff --git a/BUILD/Help/html/Schedule a Batch Job.html b/BUILD/Help/html/Schedule a Batch Job.html
index 19b1eca2..93fa804e 100644
--- a/BUILD/Help/html/Schedule a Batch Job.html
+++ b/BUILD/Help/html/Schedule a Batch Job.html
@@ -35,12 +35,11 @@ a Batch Job</FONT></FONT></H2>
&quot;Close progress dialog&quot; located in synchronization
settings. <B>Note:</B> Even if the progress dialog is not shown at
the beginning, a user can make it visible <B>during</B>
- synchronization by double-clicking the FreeFileSync systray icon.<BR><IMG SRC="../img/SetupBatch.png" NAME="Grafik3" ALIGN=BOTTOM WIDTH=560 HEIGHT=342 BORDER=0></FONT></P>
+ synchronization by double-clicking the FreeFileSync systray icon.<BR><IMG SRC="../img/SetupBatch.png" NAME="Grafik3" ALIGN=BOTTOM BORDER=0></FONT></P>
<P STYLE="margin-bottom: 0cm">&nbsp;</P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In
order to prevent error or warning popup messages from stopping
- progress, set &quot;<I>Error handling</I>&quot; to either &quot;<I>Ignore
- errors</I>&quot; or &quot;<I>Exit instantly</I>&quot;.</FONT></P>
+ progress, set &quot;<I>Error handling</I>&quot; to either &quot;<I>Ignore</I>&quot; or &quot;<I>Exit</I>&quot;.</FONT></P>
<P STYLE="margin-bottom: 0cm">&nbsp;</P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Setup
your operating system's scheduler</FONT></P>
diff --git a/BUILD/Help/img/MainDialog.png b/BUILD/Help/img/MainDialog.png
index 984e1305..bc909996 100644
--- a/BUILD/Help/img/MainDialog.png
+++ b/BUILD/Help/img/MainDialog.png
Binary files differ
diff --git a/BUILD/Help/img/SetupBatch.png b/BUILD/Help/img/SetupBatch.png
index 469d632b..71ff0996 100644
--- a/BUILD/Help/img/SetupBatch.png
+++ b/BUILD/Help/img/SetupBatch.png
Binary files differ
diff --git a/BUILD/Languages/chinese_simple.lng b/BUILD/Languages/chinese_simple.lng
index dbf75eac..656c9079 100644
--- a/BUILD/Languages/chinese_simple.lng
+++ b/BUILD/Languages/chinese_simple.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>正在æœç´¢æ–‡ä»¶å¤¹ %x...</target>
-<source>Batch execution</source>
-<target>批处ç†æ‰§è¡Œ</target>
-
<source>Items processed:</source>
<target>已处ç†çš„项目:</target>
@@ -61,12 +58,12 @@
<source>Create a batch job</source>
<target>创建一个批处ç†ä½œä¸š</target>
-<source>Synchronization settings</source>
-<target>åŒæ­¥è®¾ç½®</target>
-
<source>Comparison settings</source>
<target>比较设置</target>
+<source>Synchronization settings</source>
+<target>åŒæ­¥è®¾ç½®</target>
+
<source>About</source>
<target>关于</target>
@@ -88,27 +85,6 @@
<source>Select time span</source>
<target>选择时间跨度</target>
-<source>Show pop-up</source>
-<target>显示弹出对è¯æ¡†</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>在错误或警告时显示弹出对è¯æ¡†</target>
-
-<source>Ignore errors</source>
-<target>忽略错误</target>
-
-<source>Hide all error and warning messages</source>
-<target>éšè—所有错误与警告信æ¯</target>
-
-<source>Exit instantly</source>
-<target>ç«‹å³é€€å‡º</target>
-
-<source>Abort synchronization immediately</source>
-<target>ç«‹å³ä¸­æ­¢åŒæ­¥</target>
-
-<source>Browse</source>
-<target>æµè§ˆ</target>
-
<source>Invalid command line:</source>
<target>无效的命令行:</target>
@@ -244,7 +220,7 @@
<source>&Open...</source>
<target>打开(&O)...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>å¦å­˜ä¸º(&A)...</target>
<source>&Quit</source>
@@ -286,6 +262,9 @@
<source>Remove folder</source>
<target>移除文件夹</target>
+<source>Browse</source>
+<target>æµè§ˆ</target>
+
<source>Select a folder</source>
<target>选择一个文件夹</target>
@@ -318,8 +297,8 @@ The command is triggered if:
<source>Cancel</source>
<target>å–消</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Build: %x</target>
<source>All files</source>
<target>所有文件</target>
@@ -339,9 +318,6 @@ The command is triggered if:
<source>A folder input field is empty.</source>
<target>有一个文件夹输入框为空.</target>
-<source>Logging</source>
-<target>记录</target>
-
<source>File time and size</source>
<target>文件时间和大å°</target>
@@ -522,11 +498,11 @@ The command is triggered if:
<source>Last used configurations (press DEL to remove from list)</source>
<target>最åŽä½¿ç”¨çš„é…ç½®(按DEL键将其从列表中移除)</target>
-<source>Hide excluded items</source>
-<target>éšè—已排除的项目</target>
+<source>Show excluded items</source>
+<target>显示已排除项目</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>éšè—已过滤或临时排除的文件</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>显示已被过滤或被临时排除的文件</target>
<source>Number of files and folders that will be created</source>
<target>将被创建的文件和文件夹数</target>
@@ -570,24 +546,81 @@ The command is triggered if:
<source>Right</source>
<target>å³ä¾§</target>
-<source>Status feedback</source>
-<target>状况å馈</target>
+<source>Error handling</source>
+<target>错误处ç†</target>
+
+<source>Ignore</source>
+<target>忽略</target>
+
+<source>Hide all error and warning messages</source>
+<target>éšè—所有错误与警告信æ¯</target>
+
+<source>Pop-up</source>
+<target>弹出框</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>在错误或警告时显示弹出对è¯æ¡†</target>
+
+<source>Exit</source>
+<target>退出</target>
+
+<source>Abort synchronization on first error</source>
+<target>在第一个错误时中止åŒæ­¥</target>
+
+<source>On completion:</source>
+<target>完æˆæ—¶:</target>
<source>Show progress dialog</source>
<target>显示进度对è¯æ¡†</target>
-<source>Error handling</source>
-<target>错误处ç†</target>
+<source>Generate log file</source>
+<target>生æˆæ—¥å¿—文件</target>
-<source>Maximum number of log files:</source>
-<target>最大的日志文件数:</target>
+<source>Select folder to save log files</source>
+<target>选择è¦ä¿å­˜æ—¥å¿—文件的文件夹</target>
-<source>Select folder to save log files:</source>
-<target>选择è¦ä¿å­˜æ—¥å¿—的文件夹:</target>
+<source>Limit</source>
+<target>é™åˆ¶</target>
+
+<source>Limit maximum number of log files</source>
+<target>é™åˆ¶æ—¥å¿—文件的é‡å¤§ä¸ªæ•°</target>
<source>Batch settings</source>
<target>批处ç†è®¾ç½®</target>
+<source>Compare by...</source>
+<target>比较选项...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+文件被认为是相åŒçš„,如果
+ - 最åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸ
+ - 文件大å°
+是相åŒçš„
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+文件被认为是相åŒçš„,如果
+ - 文件内容
+是相åŒçš„
+</target>
+
+<source>Symbolic Link handling</source>
+<target>符å·è¿žæŽ¥å¤„ç†æ–¹å¼</target>
+
+<source>OK</source>
+<target>确定</target>
+
<source>Select variant:</source>
<target>选择å˜åŒ–çš„:</target>
@@ -606,8 +639,26 @@ The command is triggered if:
<source>Deletion handling</source>
<target>删除处ç†</target>
-<source>On completion:</source>
-<target>完æˆæ—¶:</target>
+<source>Permanent</source>
+<target>永久</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>永久性删除或覆盖文件</target>
+
+<source>Recycle Bin</source>
+<target>回收站</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>当删除或覆盖文件时使用回收站</target>
+
+<source>Versioning</source>
+<target>ä¿ç•™åŽ†å²ç‰ˆæœ¬</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>移动时间标记文件到指定的文件夹</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>é™åˆ¶æ¯ä¸ªæ–‡ä»¶çš„最大历å²ç‰ˆæœ¬æ•°</target>
<source>Configuration</source>
<target>é…ç½®</target>
@@ -630,39 +681,6 @@ The command is triggered if:
<source>Conflict/item cannot be categorized</source>
<target>冲çª/项目未能被分类</target>
-<source>OK</source>
-<target>确定</target>
-
-<source>Compare by...</source>
-<target>比较选项...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-文件被认为是相åŒçš„,如果
- - 最åŽä¿®æ”¹æ—¶é—´å’Œæ—¥æœŸ
- - 文件大å°
-是相åŒçš„
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-文件被认为是相åŒçš„,如果
- - 文件内容
-是相åŒçš„
-</target>
-
-<source>Symbolic Link handling</source>
-<target>符å·è¿žæŽ¥å¤„ç†æ–¹å¼</target>
-
<source>Synchronizing...</source>
<target>åŒæ­¥ä¸­...</target>
@@ -678,8 +696,8 @@ is the same
<source>Donate with PayPal</source>
<target>通过PayPalæèµ </target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>éžå¸¸æ„Ÿè°¢ä»¥ä¸‹æœ¬åœ°åŒ– FreeFileSync 的工作人员:</target>
+<source>Many thanks for localization:</source>
+<target>éžå¸¸æ„Ÿè°¢ä»¥ä¸‹æœ¬åœ°åŒ–翻译者:</target>
<source>Feedback and suggestions are welcome</source>
<target>欢迎å馈æ„è§å’Œæ出建议</target>
@@ -696,9 +714,6 @@ is the same
<source>Published under the GNU General Public License</source>
<target>在GNU通用公共许å¯ä¸‹å‘布</target>
-<source>Use Recycle Bin</source>
-<target>使用回收站</target>
-
<source>Delete on both sides</source>
<target>从两侧删除</target>
@@ -768,8 +783,8 @@ Note: File names must be relative to base directories!
<source>Statistics</source>
<target>统计</target>
-<source>Do not show this dialog again</source>
-<target>ä¸è¦å†æ˜¾ç¤ºæ­¤å¯¹è¯æ¡†</target>
+<source>Don't show this dialog again</source>
+<target>ä¸è¦å†æ˜¾ç¤ºè¿™ä¸ªå¯¹è¯æ¡†</target>
<source>Find what:</source>
<target>è¦æŸ¥æ‰¾ä»€ä¹ˆ:</target>
@@ -852,11 +867,8 @@ Note: File names must be relative to base directories!
<source>Do you want to save changes to %x?</source>
<target>是å¦è¦ä¿å­˜ä¿®æ”¹åˆ° %x ?</target>
-<source>Save</source>
-<target>ä¿å­˜</target>
-
-<source>Don't Save</source>
-<target>ä¸ä¿å­˜</target>
+<source>Do&n't save</source>
+<target>ä¸ä¿å­˜(&N)</target>
<source>Configuration loaded!</source>
<target>é…置已加载!</target>
@@ -948,8 +960,8 @@ Note: File names must be relative to base directories!
<source>Show files that won't be copied</source>
<target>显示将ä¸è¢«å¤åˆ¶çš„文件</target>
-<source>All directories in sync!</source>
-<target>所有目录已åŒæ­¥!</target>
+<source>All folders are in sync!</source>
+<target>所有文件夹都是åŒæ­¥çš„!</target>
<source>Comma separated list</source>
<target>逗å·åˆ†éš”的列表</target>
@@ -1034,6 +1046,9 @@ Note: File names must be relative to base directories!
<source>Pause</source>
<target>æš‚åœ</target>
+<source>Logging</source>
+<target>记录</target>
+
<source>Cannot find %x</source>
<target>找ä¸åˆ° %x</target>
@@ -1113,21 +1128,6 @@ Note: File names must be relative to base directories!
<source>Leave as unresolved conflict</source>
<target>é—留为未解决的冲çª</target>
-<source>Delete permanently</source>
-<target>永久性删除</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>永久性删除或覆盖文件</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>当删除或覆盖文件时使用回收站</target>
-
-<source>Versioning</source>
-<target>ä¿ç•™åŽ†å²ç‰ˆæœ¬</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>移动文件到一个以时间标记命åçš„å­æ–‡ä»¶å¤¹</target>
-
<source>Files</source>
<target>文件</target>
@@ -1215,8 +1215,11 @@ Note: File names must be relative to base directories!
<source>Cannot copy file %x to %y.</source>
<target>无法å¤åˆ¶æ–‡ä»¶ %x 到 %y.</target>
-<source>Cannot read directory %x.</source>
-<target>无法读å–目录 %x.</target>
+<source>Cannot open directory %x.</source>
+<target>无法打开目录 %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>无法列举目录 %x.</target>
<source>Detected endless directory recursion.</source>
<target>检测到无é™çš„目录递归.</target>
@@ -1242,6 +1245,9 @@ Note: File names must be relative to base directories!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>设置默认的åŒæ­¥æ–¹å‘:旧文件会被新文件覆盖.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>如下路径的回收站ä¸å¯ç”¨! 文件会被永久删除:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>ä½ å¯ä»¥å¿½ç•¥è¿™ä¸ªé”™è¯¯è€Œè®¤ä¸ºæ–‡ä»¶å¤¹æ˜¯ç©ºçš„.</target>
@@ -1251,6 +1257,9 @@ Note: File names must be relative to base directories!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>目录有ä¾èµ–性ï¼åœ¨è®¾ç«‹åŒæ­¥è§„则时请å°å¿ƒ:</target>
+<source>Start comparison</source>
+<target>开始比较</target>
+
<source>Preparing synchronization...</source>
<target>正在准备åŒæ­¥...</target>
@@ -1263,6 +1272,9 @@ Note: File names must be relative to base directories!
<source>Files %x have the same date but a different size!</source>
<target>文件 %x 日期相åŒä½†å¤§å°ä¸åŒ!</target>
+<source>Items differ in attributes only</source>
+<target>项目仅是文件属性ä¸åŒ</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>符å·è¿žæŽ¥ %x 有相åŒçš„日期但目标ä¸åŒ.</target>
@@ -1278,9 +1290,6 @@ Note: File names must be relative to base directories!
<source>Both sides are equal</source>
<target>两侧相等</target>
-<source>Items have different attributes</source>
-<target>项目有ä¸åŒçš„属性</target>
-
<source>Copy new item to left</source>
<target>å¤åˆ¶æ–°é¡¹ç›®åˆ°å·¦ä¾§</target>
@@ -1395,14 +1404,11 @@ Note: File names must be relative to base directories!
<source>Available:</source>
<target>å¯ç”¨:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>如下路径的回收站ä¸å¯ç”¨! 文件会被永久删除:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>一个将被修改的文件夹是多个文件夹对的一部分. 请é‡æ–°æ£€è§†åŒæ­¥è®¾ç½®.</target>
-<source>Processing folder pair:</source>
-<target>正在处ç†æˆå¯¹æ–‡ä»¶å¤¹:</target>
+<source>Synchronizing folder pair:</source>
+<target>正在åŒæ­¥æˆå¯¹çš„文件夹:</target>
<source>Target folder %x already existing.</source>
<target>目标文件夹 %x å·²ç»å­˜åœ¨.</target>
diff --git a/BUILD/Languages/chinese_traditional.lng b/BUILD/Languages/chinese_traditional.lng
index ab6f6be8..69e79b2d 100644
--- a/BUILD/Languages/chinese_traditional.lng
+++ b/BUILD/Languages/chinese_traditional.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>正在æœå°‹è³‡æ–™å¤¾ %x...</target>
-<source>Batch execution</source>
-<target>批次處ç†åŸ·è¡Œ</target>
-
<source>Items processed:</source>
<target>已處ç†é …目:</target>
@@ -34,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>中止請求:正在等待目å‰æ“作完æˆ...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>å³æ™‚åŒæ­¥ - 自動åŒæ­¥</target>
@@ -61,12 +61,12 @@
<source>Create a batch job</source>
<target>新建一個批次處ç†ä½œæ¥­</target>
-<source>Synchronization settings</source>
-<target>åŒæ­¥è¨­å®š</target>
-
<source>Comparison settings</source>
<target>比å°è¨­å®š</target>
+<source>Synchronization settings</source>
+<target>åŒæ­¥è¨­å®š</target>
+
<source>About</source>
<target>關於</target>
@@ -88,27 +88,6 @@
<source>Select time span</source>
<target>é¸æ“‡æ™‚é–“é–“éš”</target>
-<source>Show pop-up</source>
-<target>顯示彈出視窗</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>在彈出視窗上顯示錯誤或警告訊æ¯</target>
-
-<source>Ignore errors</source>
-<target>忽略錯誤</target>
-
-<source>Hide all error and warning messages</source>
-<target>éš±è—所有錯誤和警告訊æ¯</target>
-
-<source>Exit instantly</source>
-<target>ç«‹å³é€€å‡º</target>
-
-<source>Abort synchronization immediately</source>
-<target>ç«‹å³ä¸­æ­¢åŒæ­¥</target>
-
-<source>Browse</source>
-<target>ç€è¦½</target>
-
<source>Invalid command line:</source>
<target>無效的命令列:</target>
@@ -244,8 +223,8 @@
<source>&Open...</source>
<target>é–‹å•Ÿ(&O)...</target>
-<source>Save &As...</source>
-<target>å¦å­˜æ–°æª”(&A)...</target>
+<source>Save &as...</source>
+<target>å¦å­˜æ–°æª”(&a)...</target>
<source>&Quit</source>
<target>離開(&Q)</target>
@@ -286,6 +265,9 @@
<source>Remove folder</source>
<target>移除資料夾</target>
+<source>Browse</source>
+<target>ç€è¦½</target>
+
<source>Select a folder</source>
<target>é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾</target>
@@ -318,8 +300,8 @@ The command is triggered if:
<source>Cancel</source>
<target>å–消</target>
-<source>(Build: %x)</source>
-<target>(建立:%x)</target>
+<source>Build: %x</source>
+<target>建立:%x</target>
<source>All files</source>
<target>所有檔案</target>
@@ -339,9 +321,6 @@ The command is triggered if:
<source>A folder input field is empty.</source>
<target>資料夾輸入欄ä½æ˜¯ç©ºçš„。</target>
-<source>Logging</source>
-<target>日誌記錄</target>
-
<source>File time and size</source>
<target>檔案大å°å’Œæ—¥æœŸ</target>
@@ -505,10 +484,10 @@ The command is triggered if:
<target>開始åŒæ­¥</target>
<source>Add folder pair</source>
-<target>新增一å°è³‡æ–™å¤¾</target>
+<target>新增é…å°è³‡æ–™å¤¾</target>
<source>Remove folder pair</source>
-<target>移除一å°è³‡æ–™å¤¾</target>
+<target>移除é…å°è³‡æ–™å¤¾</target>
<source>Swap sides</source>
<target>兩邊交æ›</target>
@@ -522,11 +501,11 @@ The command is triggered if:
<source>Last used configurations (press DEL to remove from list)</source>
<target>上次使用的é…ç½®(按DELéµï¼Œå¾žæ¸…單中移除)</target>
-<source>Hide excluded items</source>
-<target>éš±è—被排除的項目</target>
+<source>Show excluded items</source>
+<target>顯示排除的項目</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>éš±è—篩é¸æˆ–暫時被排除的檔案</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>顯示已篩é¸æˆ–暫時排除的檔案</target>
<source>Number of files and folders that will be created</source>
<target>將被新建的檔案和資料夾數é‡</target>
@@ -570,24 +549,72 @@ The command is triggered if:
<source>Right</source>
<target>å³é‚Š</target>
-<source>Status feedback</source>
-<target>狀態回報</target>
+<source>Error handling</source>
+<target>錯誤處ç†</target>
+
+<source>Ignore</source>
+<target>忽略</target>
+
+<source>Hide all error and warning messages</source>
+<target>éš±è—所有錯誤和警告訊æ¯</target>
+
+<source>Pop-up</source>
+<target>彈出視窗</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>在彈出視窗上顯示錯誤或警告訊æ¯</target>
+
+<source>Exit</source>
+<target>çµæŸ</target>
+
+<source>Abort synchronization on first error</source>
+<target>在第一個錯誤出ç¾å³ä¸­æ­¢åŒæ­¥</target>
+
+<source>On completion:</source>
+<target>完æˆå¾Œï¼š</target>
<source>Show progress dialog</source>
<target>顯示進度å°è©±æ¡†</target>
-<source>Error handling</source>
-<target>錯誤處ç†</target>
+<source>Generate log file</source>
+<target>產生日誌檔</target>
+
+<source>Select folder to save log files</source>
+<target>é¸æ“‡è¦å„²å­˜æ—¥èªŒæª”的資料夾</target>
-<source>Maximum number of log files:</source>
-<target>日誌檔的最大數目:</target>
+<source>Limit</source>
+<target>é™åˆ¶</target>
-<source>Select folder to save log files:</source>
-<target>é¸æ“‡è¦å„²å­˜æ—¥èªŒæª”的資料夾:</target>
+<source>Limit maximum number of log files</source>
+<target>é™åˆ¶æ—¥èªŒæª”的最大數é‡</target>
<source>Batch settings</source>
<target>批次處ç†è¨­å®š</target>
+<source>Compare by...</source>
+<target>比å°é¸é …...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target>
+
+<source>Symbolic Link handling</source>
+<target>符號連çµè™•ç†</target>
+
+<source>OK</source>
+<target>確定</target>
+
<source>Select variant:</source>
<target>é¸æ“‡è®Šæ•¸ï¼š</target>
@@ -606,8 +633,26 @@ The command is triggered if:
<source>Deletion handling</source>
<target>刪除處ç†</target>
-<source>On completion:</source>
-<target>完æˆå¾Œï¼š</target>
+<source>Permanent</source>
+<target>常é§</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>永久刪除或覆蓋檔案</target>
+
+<source>Recycle Bin</source>
+<target>資æºå›žæ”¶ç­’</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>當刪除或覆蓋檔案時使用資æºå›žæ”¶ç­’</target>
+
+<source>Versioning</source>
+<target>版本控制</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>將時間戳記檔案移動到指定的資料夾</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>é™åˆ¶æ¯å€‹æª”案版本的最大數é‡</target>
<source>Configuration</source>
<target>é…ç½®</target>
@@ -630,30 +675,6 @@ The command is triggered if:
<source>Conflict/item cannot be categorized</source>
<target>è¡çª/é …ç›®ä¸èƒ½è¢«åˆ†é¡ž</target>
-<source>OK</source>
-<target>確定</target>
-
-<source>Compare by...</source>
-<target>比å°é¸é …...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>如果檔案大å°å’Œæœ€å¾Œä¿®æ”¹æ™‚間和日期相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>如果檔案内容相åŒå‰‡åˆ¤æ–·å…©è€…相åŒ</target>
-
-<source>Symbolic Link handling</source>
-<target>符號連çµè™•ç†</target>
-
<source>Synchronizing...</source>
<target>正在åŒæ­¥...</target>
@@ -669,8 +690,8 @@ is the same
<source>Donate with PayPal</source>
<target>使用PayPalæ款</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>éžå¸¸æ„Ÿè¬FreeFileSync當地語系化的工作人員:</target>
+<source>Many thanks for localization:</source>
+<target>éžå¸¸æ„Ÿè¬æœ¬åœ°åŒ–語系翻譯工作人員:</target>
<source>Feedback and suggestions are welcome</source>
<target>æ­¡è¿Žå饋æ„見和建議</target>
@@ -687,9 +708,6 @@ is the same
<source>Published under the GNU General Public License</source>
<target>在GNU通用公共許å¯è­‰ä¸‹ç™¼ä½ˆ</target>
-<source>Use Recycle Bin</source>
-<target>使用資æºå›žæ”¶ç­’</target>
-
<source>Delete on both sides</source>
<target>兩邊都刪除</target>
@@ -759,7 +777,7 @@ Note: File names must be relative to base directories!
<source>Statistics</source>
<target>統計</target>
-<source>Do not show this dialog again</source>
+<source>Don't show this dialog again</source>
<target>ä¸è¦å†é¡¯ç¤ºæ­¤å°è©±æ¡†</target>
<source>Find what:</source>
@@ -778,7 +796,7 @@ Note: File names must be relative to base directories!
<target>主欄ä½</target>
<source>Folder pairs</source>
-<target>資料夾å°</target>
+<target>é…å°è³‡æ–™å¤¾</target>
<source>Overview</source>
<target>摘è¦</target>
@@ -843,11 +861,8 @@ Note: File names must be relative to base directories!
<source>Do you want to save changes to %x?</source>
<target>是å¦è¦æ›´æ”¹å„²å­˜åˆ° %x?</target>
-<source>Save</source>
-<target>儲存</target>
-
-<source>Don't Save</source>
-<target>ä¸è¦å„²å­˜</target>
+<source>Do&n't save</source>
+<target>ä¸å„²å­˜(&n)</target>
<source>Configuration loaded!</source>
<target>é…置已載入ï¼</target>
@@ -939,8 +954,8 @@ Note: File names must be relative to base directories!
<source>Show files that won't be copied</source>
<target>顯示將ä¸æœƒè¢«è¤‡è£½çš„檔案</target>
-<source>All directories in sync!</source>
-<target>åŒæ­¥æ‰€æœ‰ç›®éŒ„ï¼</target>
+<source>All folders are in sync!</source>
+<target>所有資料夾都是åŒæ­¥çš„ï¼</target>
<source>Comma separated list</source>
<target>逗號分隔清單</target>
@@ -1025,6 +1040,9 @@ Note: File names must be relative to base directories!
<source>Pause</source>
<target>æš«åœ</target>
+<source>Logging</source>
+<target>日誌記錄</target>
+
<source>Cannot find %x</source>
<target>找ä¸åˆ° %x</target>
@@ -1104,21 +1122,6 @@ Note: File names must be relative to base directories!
<source>Leave as unresolved conflict</source>
<target>ä¿ç•™çµ¦æœªè§£æ±ºçš„è¡çª</target>
-<source>Delete permanently</source>
-<target>永久刪除</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>永久刪除或覆蓋檔案</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>當刪除或覆蓋檔案時使用資æºå›žæ”¶ç­’</target>
-
-<source>Versioning</source>
-<target>版本控制</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>將檔移動到一個有時間戳記的å­è³‡æ–™å¤¾</target>
-
<source>Files</source>
<target>檔案</target>
@@ -1206,8 +1209,11 @@ Note: File names must be relative to base directories!
<source>Cannot copy file %x to %y.</source>
<target>無法複製檔案 %x 到 %y。</target>
-<source>Cannot read directory %x.</source>
-<target>無法讀å–目錄 %x。</target>
+<source>Cannot open directory %x.</source>
+<target>無法開啟目錄 %x。</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>無法枚舉目錄 %x。</target>
<source>Detected endless directory recursion.</source>
<target>檢測到無é™ç›®éŒ„éžè¿´ã€‚</target>
@@ -1233,6 +1239,9 @@ Note: File names must be relative to base directories!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>設定é è¨­åŒæ­¥æ–¹å‘:舊檔案會被較新的檔案覆蓋。</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>資æºå›žæ”¶ç­’ä¸å¯ç”¨æ–¼ä»¥ä¸‹è·¯å¾‘ï¼ç›¸å的,檔案將永é è¢«åˆªé™¤ï¼š</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>您å¯ä»¥å¿½ç•¥æ­¤éŒ¯èª¤ï¼Œè€ƒæ…®åˆ°ç©ºçš„資料夾。</target>
@@ -1242,6 +1251,9 @@ Note: File names must be relative to base directories!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>目錄有ä¾é æ€§ï¼è«‹å°å¿ƒè¨­å®šåŒæ­¥è¦å‰‡ï¼š</target>
+<source>Start comparison</source>
+<target>開始比較</target>
+
<source>Preparing synchronization...</source>
<target>正在準備åŒæ­¥...</target>
@@ -1254,6 +1266,9 @@ Note: File names must be relative to base directories!
<source>Files %x have the same date but a different size!</source>
<target>檔案 %x 日期相åŒä½†å¤§å°ä¸åŒï¼</target>
+<source>Items differ in attributes only</source>
+<target>åªæœ‰é …目的屬性ä¸åŒ</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>%x 的符號連çµå…·æœ‰ç›¸åŒçš„日期,但ä¸åŒçš„目標。</target>
@@ -1269,9 +1284,6 @@ Note: File names must be relative to base directories!
<source>Both sides are equal</source>
<target>兩邊都相åŒ</target>
-<source>Items have different attributes</source>
-<target>項目具有ä¸åŒå±¬æ€§</target>
-
<source>Copy new item to left</source>
<target>複製新的項目到左邊</target>
@@ -1335,6 +1347,9 @@ Note: File names must be relative to base directories!
<source>Moving symbolic link %x to %y</source>
<target>æ­£åœ¨ç§»å‹•ç¬¦è™Ÿé€£çµ %x 到 %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>正在新建檔案 %x</target>
@@ -1386,14 +1401,11 @@ Note: File names must be relative to base directories!
<source>Available:</source>
<target>å¯ç”¨ï¼š</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>資æºå›žæ”¶ç­’ä¸å¯ç”¨æ–¼ä»¥ä¸‹è·¯å¾‘ï¼ç›¸å的,檔案將永é è¢«åˆªé™¤ï¼š</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
-<target>一個將被修改的資料夾,是多個資料夾å°çš„一部分。請檢查åŒæ­¥è¨­å®šã€‚</target>
+<target>一個將被修改的資料夾,是多個é…å°è³‡æ–™å¤¾çš„一部分。請檢查åŒæ­¥è¨­å®šã€‚</target>
-<source>Processing folder pair:</source>
-<target>處ç†ä¸€å°è³‡æ–™å¤¾ï¼š</target>
+<source>Synchronizing folder pair:</source>
+<target>åŒæ­¥é…å°è³‡æ–™å¤¾ï¼š</target>
<source>Target folder %x already existing.</source>
<target>目標資料夾 %x 已存在。</target>
diff --git a/BUILD/Languages/croatian.lng b/BUILD/Languages/croatian.lng
index 6a07aff7..91e26f43 100644
--- a/BUILD/Languages/croatian.lng
+++ b/BUILD/Languages/croatian.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Tražim mapu %x...</target>
-<source>Batch execution</source>
-<target>Slijedno izvršavanje</target>
-
<source>Items processed:</source>
<target>Obrađeni elementi:</target>
@@ -34,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Prekid zahtjevan: Äekam da se trenutna akcija zavrÅ¡i...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automatska Sinkronizacija</target>
@@ -61,12 +61,12 @@
<source>Create a batch job</source>
<target>Izradi slijedni zadatak</target>
-<source>Synchronization settings</source>
-<target>Postavke sinkronizacije</target>
-
<source>Comparison settings</source>
<target>Postavke usporedbe</target>
+<source>Synchronization settings</source>
+<target>Postavke sinkronizacije</target>
+
<source>About</source>
<target>O programu</target>
@@ -88,27 +88,6 @@
<source>Select time span</source>
<target>Izaberite mjerni raspon</target>
-<source>Show pop-up</source>
-<target>Prikaži skoÄni prozor</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Prikaži skoÄni prozor pri greÅ¡kama i upozorenjima</target>
-
-<source>Ignore errors</source>
-<target>Ignoriraj greške</target>
-
-<source>Hide all error and warning messages</source>
-<target>Sakrij sve greške i upozorenja</target>
-
-<source>Exit instantly</source>
-<target>Izađi trenutno</target>
-
-<source>Abort synchronization immediately</source>
-<target>Odmah prekini sinkronizaciju</target>
-
-<source>Browse</source>
-<target>Odaberi</target>
-
<source>Invalid command line:</source>
<target>NetoÄna naredba:</target>
@@ -250,8 +229,8 @@
<source>&Open...</source>
<target>&Otvori...</target>
-<source>Save &As...</source>
-<target>Spremi kao...</target>
+<source>Save &as...</source>
+<target>Spremiti &kao...</target>
<source>&Quit</source>
<target>&Izlaz</target>
@@ -292,6 +271,9 @@
<source>Remove folder</source>
<target>Ukloni mapu</target>
+<source>Browse</source>
+<target>Odaberi</target>
+
<source>Select a folder</source>
<target>Izaberite mapu</target>
@@ -324,8 +306,8 @@ Naredba će biti pokrenuta ako se:
<source>Cancel</source>
<target>Odustani</target>
-<source>(Build: %x)</source>
-<target>(InaÄnica: %x)</target>
+<source>Build: %x</source>
+<target>InaÄnica: %x</target>
<source>All files</source>
<target>Sve datoteke</target>
@@ -345,9 +327,6 @@ Naredba će biti pokrenuta ako se:
<source>A folder input field is empty.</source>
<target>Polje za odabir foldera je prazno.</target>
-<source>Logging</source>
-<target>Zapisivanje</target>
-
<source>File time and size</source>
<target>Vrijeme i veliÄina datoteke</target>
@@ -528,11 +507,11 @@ Naredba će biti pokrenuta ako se:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Zadnje korištene postavke (pretisite DEL za ukloniti s liste)</target>
-<source>Hide excluded items</source>
-<target>Sakrij iskljuÄene stavke</target>
+<source>Show excluded items</source>
+<target>Prikaži iskljuÄene stavke</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Sakrij filtrirane ili trenutno iskljuÄene datoteke</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Prikaži filtrirane ili privremeno izdvojene datoteke</target>
<source>Number of files and folders that will be created</source>
<target>Broj datoteka i foldera koji će se stvoriti</target>
@@ -576,24 +555,81 @@ Naredba će biti pokrenuta ako se:
<source>Right</source>
<target>Desno</target>
-<source>Status feedback</source>
-<target>Status veze</target>
+<source>Error handling</source>
+<target>Greška pri obradi</target>
+
+<source>Ignore</source>
+<target>Ignoriraj</target>
+
+<source>Hide all error and warning messages</source>
+<target>Sakrij sve greške i upozorenja</target>
+
+<source>Pop-up</source>
+<target>Pop-up</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Prikaži skoÄni prozor pri greÅ¡kama i upozorenjima</target>
+
+<source>Exit</source>
+<target>Izađi</target>
+
+<source>Abort synchronization on first error</source>
+<target>Prekini sinkronizaciju pri prvoj pogrešci</target>
+
+<source>On completion:</source>
+<target>Pri završetku</target>
<source>Show progress dialog</source>
<target>Prikaži napredak</target>
-<source>Error handling</source>
-<target>Greška pri obradi</target>
+<source>Generate log file</source>
+<target>Generiraj izvješće</target>
+
+<source>Select folder to save log files</source>
+<target>Odaberi mapu za spremanje izvješća</target>
-<source>Maximum number of log files:</source>
-<target>Maksimalan broj izvješća:</target>
+<source>Limit</source>
+<target>Granica</target>
-<source>Select folder to save log files:</source>
-<target>Odabrati mapu za spremanje izvješća</target>
+<source>Limit maximum number of log files</source>
+<target>OgraniÄi maksimalan broj izvješća</target>
<source>Batch settings</source>
<target>Slijedne postavke</target>
+<source>Compare by...</source>
+<target>Usporedi prema...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Datoteke se smatraju jednake ako su im
+ - vrijeme zadnje promjene i datum
+ - veliÄina datoteke
+jednaki
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Datoteke se smatraju jednake ako im je
+ - sadržaj datoteke
+jednak
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Upravljanje simboliÄnim poveznicama</target>
+
+<source>OK</source>
+<target>U redu</target>
+
<source>Select variant:</source>
<target>Izaberite varijantu:</target>
@@ -612,8 +648,26 @@ Naredba će biti pokrenuta ako se:
<source>Deletion handling</source>
<target>Upravljanje pri brisanju</target>
-<source>On completion:</source>
-<target>Pri završetku</target>
+<source>Permanent</source>
+<target>Trajno</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Trajno izbriši ili prepiši datoteke</target>
+
+<source>Recycle Bin</source>
+<target>Koš za smeće</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Koristi Koš za smeće pri brisanju ili prepisivanju datoteka</target>
+
+<source>Versioning</source>
+<target>Verzija</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Premjesti vremenski-oznaÄene datoteke u odreÄ‘enu mapu</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>OgraniÄi maksimalan broj verzija po datoteci</target>
<source>Configuration</source>
<target>Postavke</target>
@@ -636,39 +690,6 @@ Naredba će biti pokrenuta ako se:
<source>Conflict/item cannot be categorized</source>
<target>Sukob/stavka ne može biti razvrstana</target>
-<source>OK</source>
-<target>U redu</target>
-
-<source>Compare by...</source>
-<target>Usporedi prema...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Datoteke se smatraju jednake ako su im
- - vrijeme zadnje promjene i datum
- - veliÄina datoteke
-jednaki
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Datoteke se smatraju jednake ako im je
- - sadržaj datoteke
-jednak
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Upravljanje simboliÄnim poveznicama</target>
-
<source>Synchronizing...</source>
<target>Sinkroniziram...</target>
@@ -684,8 +705,8 @@ jednak
<source>Donate with PayPal</source>
<target>Doniraj s PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Zahvale za prijevod FreeFileSync idu:</target>
+<source>Many thanks for localization:</source>
+<target>Velike zahvale idu:</target>
<source>Feedback and suggestions are welcome</source>
<target>Povratne informacije i prijedlozi su dobrodošli</target>
@@ -702,9 +723,6 @@ jednak
<source>Published under the GNU General Public License</source>
<target>Objavljeno pod licencom GNU General Public</target>
-<source>Use Recycle Bin</source>
-<target>Uporabi Koš za smeće</target>
-
<source>Delete on both sides</source>
<target>Izbriši na obje strane</target>
@@ -774,7 +792,7 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Statistics</source>
<target>Statistika</target>
-<source>Do not show this dialog again</source>
+<source>Don't show this dialog again</source>
<target>Ne prikazuj ovaj prozor ponovno</target>
<source>Find what:</source>
@@ -858,11 +876,8 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Do you want to save changes to %x?</source>
<target>Da li želite spremiti izmjene za %x?</target>
-<source>Save</source>
-<target>Spremiti</target>
-
-<source>Don't Save</source>
-<target>Nemoj spremati</target>
+<source>Do&n't save</source>
+<target>Ne spremaj</target>
<source>Configuration loaded!</source>
<target>Postavke uÄitane!</target>
@@ -954,8 +969,8 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Show files that won't be copied</source>
<target>Prikaži datoteke koje neće biti kopirane</target>
-<source>All directories in sync!</source>
-<target>Svi direktoriji su sinkronizirani!</target>
+<source>All folders are in sync!</source>
+<target>Sve mape su u sinkronizaciji!</target>
<source>Comma separated list</source>
<target>Zarezom odvojene liste</target>
@@ -1048,6 +1063,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Pause</source>
<target>Pauziraj</target>
+<source>Logging</source>
+<target>Zapisivanje</target>
+
<source>Cannot find %x</source>
<target>Nemogu pronać %x</target>
@@ -1131,21 +1149,6 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Leave as unresolved conflict</source>
<target>Ostavi kao neriješeni sukob</target>
-<source>Delete permanently</source>
-<target>Trajno izbriši</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Trajno izbriši ili prepiši datoteke</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Koristi Koš za smeće pri brisanju ili prepisivanju datoteka</target>
-
-<source>Versioning</source>
-<target>Verzija</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Prebaci datoteke u vremenski-blokirani podfolder</target>
-
<source>Files</source>
<target>Datoteke</target>
@@ -1239,8 +1242,11 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Cannot copy file %x to %y.</source>
<target>Ne mogu kopirati datoteku %x na %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Ne mogu Äitati mapu %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Ne mogu otvoriti mapu %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Ne mogu izlistati mapu %x.</target>
<source>Detected endless directory recursion.</source>
<target>Detektiran bezograniÄeni direktorij</target>
@@ -1266,6 +1272,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Postavljam zadani sinkronizacijski smijer: Stare datoteke će biti prepisane novim datotekama.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Koš za smeće nije dostupan za navedene putanje! Umjesto toga datoteke će biti trajno izbrisane:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Možete ignorirati ovu pogrešku i smatrati mapu praznom</target>
@@ -1275,6 +1284,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Direktoriji su u ovisnosti! Budite oprezni pri postavljanju sinkronizacijskih pravila:</target>
+<source>Start comparison</source>
+<target>ZapoÄni usporedbu</target>
+
<source>Preparing synchronization...</source>
<target>Pripremam sinkronizaciju</target>
@@ -1287,6 +1299,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Files %x have the same date but a different size!</source>
<target>Datoteke %x imaju isti datum ali drugaÄiju veliÄinu!</target>
+<source>Items differ in attributes only</source>
+<target>Stavke se razlikuju samo u atributima</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>SimboliÄne poveznice %x imaju isti datum ali drugaÄiji cilj</target>
@@ -1302,9 +1317,6 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Both sides are equal</source>
<target>Obje strane su jednake</target>
-<source>Items have different attributes</source>
-<target>Stavke imaju razliÄite atribute</target>
-
<source>Copy new item to left</source>
<target>Kopiraj novu stavku lijevo</target>
@@ -1368,6 +1380,9 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Moving symbolic link %x to %y</source>
<target>PremjeÅ¡tam simboliÄnu poveznicu %x u %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>Izrađujem datoteku %x</target>
@@ -1419,14 +1434,11 @@ Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
<source>Available:</source>
<target>Dostupno:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Koš za smeće nije dostupan za navedene putanje! Umjesto toga datoteke će biti trajno izbrisane:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Mapa će biti uređena koja je dio više pari mapa. Molimo provjerite sinkronizacijske postavke.</target>
-<source>Processing folder pair:</source>
-<target>Obrađujem parove mapa:</target>
+<source>Synchronizing folder pair:</source>
+<target>Par sinkronizirane mape:</target>
<source>Target folder %x already existing.</source>
<target>Odredišna mapa %x već postoji.</target>
diff --git a/BUILD/Languages/czech.lng b/BUILD/Languages/czech.lng
index a294e21c..2ff7d45a 100644
--- a/BUILD/Languages/czech.lng
+++ b/BUILD/Languages/czech.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>Otevírání složky %x</target>
+<source>Items processed:</source>
+<target>Zpracováno položek:</target>
+
+<source>Items remaining:</source>
+<target>Zbývá položek:</target>
+
+<source>Total time:</source>
+<target>Celkový Äas:</target>
+
<source>Show in Explorer</source>
<target>Zobrazit v Průzkumníkovi</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>Vytvořit dávku</target>
-<source>Synchronization settings</source>
-<target>Nastavení synchronizace</target>
-
<source>Comparison settings</source>
<target>Nastavení porovnání</target>
+<source>Synchronization settings</source>
+<target>Nastavení synchronizace</target>
+
<source>About</source>
<target>O Programu</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>Časové rozmezí</target>
-<source>Show pop-up</source>
-<target>Zobrazit okno</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Zobrazit hlášení při chybě nebo varování</target>
-
-<source>Ignore errors</source>
-<target>PÅ™eskoÄit chyby</target>
-
-<source>Hide all error and warning messages</source>
-<target>Skrýt všechny chyby a varování</target>
-
-<source>Exit instantly</source>
-<target>UkonÄit ihned</target>
-
-<source>Abort synchronization immediately</source>
-<target>Přerušit synchronizaci ihned</target>
-
-<source>Browse</source>
-<target>Procházet</target>
-
<source>Invalid command line:</source>
<target>Neplatný příkaz:</target>
@@ -238,7 +226,7 @@
<source>&Open...</source>
<target>&Otevřít...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>Uložit &jako...</target>
<source>&Quit</source>
@@ -280,6 +268,9 @@
<source>Remove folder</source>
<target>Odstranit adresář</target>
+<source>Browse</source>
+<target>Procházet</target>
+
<source>Select a folder</source>
<target>Vyberte adresář</target>
@@ -312,8 +303,8 @@ Příkaz je spuštěn když:
<source>Cancel</source>
<target>Zrušit</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Verze: %x</target>
<source>All files</source>
<target>VÅ¡echny soubory</target>
@@ -333,9 +324,6 @@ Příkaz je spuštěn když:
<source>A folder input field is empty.</source>
<target>Není zadána vstupní složka.</target>
-<source>Logging</source>
-<target>Záznam zpracování</target>
-
<source>File time and size</source>
<target>Podle velikosti a data souboru</target>
@@ -357,21 +345,6 @@ Příkaz je spuštěn když:
<source>FreeFileSync batch</source>
<target>FreeFileSync dávka</target>
-<source>Batch execution</source>
-<target>Spuštění dávky</target>
-
-<source>Items processed:</source>
-<target>Zpracováno položek:</target>
-
-<source>Items remaining:</source>
-<target>Zbývá položek:</target>
-
-<source>Total time:</source>
-<target>Celkový Äas:</target>
-
-<source>Stop</source>
-<target>Stop</target>
-
<source>Synchronization aborted!</source>
<target>Synchronizace zrušena!</target>
@@ -531,11 +504,11 @@ Příkaz je spuštěn když:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Posledně použité konfigurace (pomocí DEL můžete položku smazat)</target>
-<source>Hide excluded items</source>
-<target>Skrýt vynechané položky</target>
+<source>Show excluded items</source>
+<target>Zobrazit vynechané položky</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Skrýt filtrované nebo doÄasnÄ› vynechané soubory</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Zobrazit filtrované nebo doÄasnÄ› vynechané soubory</target>
<source>Number of files and folders that will be created</source>
<target>PoÄet souborů a složek k vytvoÅ™ení</target>
@@ -579,24 +552,81 @@ Příkaz je spuštěn když:
<source>Right</source>
<target>Pravý</target>
-<source>Status feedback</source>
-<target>Běh programu</target>
+<source>Error handling</source>
+<target>Zpracování chyb</target>
+
+<source>Ignore</source>
+<target>PÅ™eskoÄit</target>
+
+<source>Hide all error and warning messages</source>
+<target>Skrýt všechny chyby a varování</target>
+
+<source>Pop-up</source>
+<target>Hlašení</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Zobrazit hlášení při chybě nebo varování</target>
+
+<source>Exit</source>
+<target>Konec</target>
+
+<source>Abort synchronization on first error</source>
+<target>UkonÄit synchronizaci pÅ™i první chybÄ›</target>
+
+<source>On completion:</source>
+<target>Po dokonÄení:</target>
<source>Show progress dialog</source>
<target>Zobrazit průběh zpracování</target>
-<source>Error handling</source>
-<target>Zpracování chyb</target>
+<source>Generate log file</source>
+<target>Vytvořit záznamový soubor</target>
-<source>Maximum number of log files:</source>
-<target>Maximální poÄet záznamových souborů:</target>
+<source>Select folder to save log files</source>
+<target>Vyberte složku pro záznamové soubory</target>
-<source>Select folder to save log files:</source>
-<target>Vyberte složku pro záznamové soubory:</target>
+<source>Limit</source>
+<target>Omezení</target>
+
+<source>Limit maximum number of log files</source>
+<target>Omezení maximálního poÄtu záznamových souborů</target>
<source>Batch settings</source>
<target>Nastavení</target>
+<source>Compare by...</source>
+<target>Porovnat ...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Soubory jsou shodné jestliže
+ - datum i Äas poslední zmÄ›ny
+ - velikost souboru
+jsou stejné
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Soubory jsou shodné jestliže
+ - obsah souboru
+je stejný
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Zpracování symbolických odkazů</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Vyberte variantu:</target>
@@ -615,8 +645,26 @@ Příkaz je spuštěn když:
<source>Deletion handling</source>
<target>Nastavení mazání</target>
-<source>On completion:</source>
-<target>Po dokonÄení:</target>
+<source>Permanent</source>
+<target>Trvale</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Smazat nebo přepsat soubory trvale</target>
+
+<source>Recycle Bin</source>
+<target>Koš</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Použít Koš při mazání nebo přepisu souborů</target>
+
+<source>Versioning</source>
+<target>Verzování</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>PÅ™esunout ÄasovÄ› oznaÄení soubory do zvláštního adresáře</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Omezit maximální poÄet verzí jednoho souboru</target>
<source>Configuration</source>
<target>Konfigurace</target>
@@ -639,39 +687,6 @@ Příkaz je spuštěn když:
<source>Conflict/item cannot be categorized</source>
<target>Konflikty/položky které nelze zařadit</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Porovnat ...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Soubory jsou shodné jestliže
- - datum i Äas poslední zmÄ›ny
- - velikost souboru
-jsou stejné
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Soubory jsou shodné jestliže
- - obsah souboru
-je stejný
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Zpracování symbolických odkazů</target>
-
<source>Synchronizing...</source>
<target>Synchronizuji...</target>
@@ -679,7 +694,7 @@ je stejný
<target>&Pauza</target>
<source>Source code written in C++ utilizing:</source>
-<target>Zdrojový kód byl napsán kompletně v C++ s pomocí:</target>
+<target>Zdrojový kód byl napsán kompletně v C++ pomocí:</target>
<source>If you like FreeFileSync</source>
<target>Pokud se Vám FreeFileSync líbí</target>
@@ -687,7 +702,7 @@ je stejný
<source>Donate with PayPal</source>
<target>Přispět pomocí PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
+<source>Many thanks for localization:</source>
<target>Poděkování za překlad FreeFileSync:</target>
<source>Feedback and suggestions are welcome</source>
@@ -705,9 +720,6 @@ je stejný
<source>Published under the GNU General Public License</source>
<target>Vydáno pod GNU General Public License (GPL)</target>
-<source>Use Recycle Bin</source>
-<target>Použít Koš</target>
-
<source>Delete on both sides</source>
<target>Smazat z obou stran</target>
@@ -777,7 +789,7 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Statistics</source>
<target>Statistika</target>
-<source>Do not show this dialog again</source>
+<source>Don't show this dialog again</source>
<target>Tento dialog již nezobrazovat</target>
<source>Find what:</source>
@@ -861,10 +873,7 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Do you want to save changes to %x?</source>
<target>Uložit změny do %x?</target>
-<source>Save</source>
-<target>Uložit></target>
-
-<source>Don't Save</source>
+<source>Do&n't save</source>
<target>Neukládat</target>
<source>Configuration loaded!</source>
@@ -957,8 +966,8 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Show files that won't be copied</source>
<target>Zobrazit soubory, které nebudou kopírovány</target>
-<source>All directories in sync!</source>
-<target>Všechny adresáře jsou synchronizovány!</target>
+<source>All folders are in sync!</source>
+<target>Všechny složky jsou synchronizovány!</target>
<source>Comma separated list</source>
<target>Text oddÄ›lený Äárkami</target>
@@ -1051,6 +1060,9 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Pause</source>
<target>Pauza</target>
+<source>Logging</source>
+<target>Záznam zpracování</target>
+
<source>Cannot find %x</source>
<target>Nelze najít %x</target>
@@ -1134,21 +1146,6 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Leave as unresolved conflict</source>
<target>Ponechat jako nevyřešený konflikt</target>
-<source>Delete permanently</source>
-<target>Odstranit trvale</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Smazat nebo přepsat soubory trvale</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Použít Koš při mazání nebo přepisu souborů</target>
-
-<source>Versioning</source>
-<target>Verzování</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>PÅ™esunout soubory do ÄasovÄ› oznaÄené podsložky</target>
-
<source>Files</source>
<target>Soubory</target>
@@ -1242,8 +1239,11 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Cannot copy file %x to %y.</source>
<target>Nelze kopírovat soubor %x do %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Nelze Äíst adresář %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Nelze otevřít adresář %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Nelze procházet adresář %x.</target>
<source>Detected endless directory recursion.</source>
<target>Nalezena nekoneÄná adresářová smyÄka.</target>
@@ -1269,6 +1269,9 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Nastaven výchozí způsob synchronizace: Staré soubory budou nahrazeny novými.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Nelze použít Koš pro následující umístění! Soubory budou odstraněny trvale:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Tuto chybu můžete pÅ™eskoÄit a považovat neexistující složku jako prázdnou.</target>
@@ -1278,6 +1281,9 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Adresáře jsou závislé! BuÄte opatrní s definicí synchronizaÄních pravidel:</target>
+<source>Start comparison</source>
+<target>Spustit porovnání</target>
+
<source>Preparing synchronization...</source>
<target>Příprava synchronizace...</target>
@@ -1290,6 +1296,9 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Files %x have the same date but a different size!</source>
<target>Soubory %x mají stejné datum a Äas ale rozdílnou velikost!</target>
+<source>Items differ in attributes only</source>
+<target>Položky se liší pouze ve vlastnostech</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Symbolický odkaz %x má stejné datum ale jiný cíl.</target>
@@ -1305,9 +1314,6 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Both sides are equal</source>
<target>Obě strany jsou shodné</target>
-<source>Items have different attributes</source>
-<target>Položky se liší ve vlastnostech</target>
-
<source>Copy new item to left</source>
<target>Kopírovat novou položku do leva</target>
@@ -1422,14 +1428,11 @@ Poznámka: Filtr je aplikován relativně k základním adresářům.
<source>Available:</source>
<target>K dispozici</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Nelze použít Koš pro následující umístění! Soubory budou odstraněny trvale:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>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í synchronizacem.</target>
-<source>Processing folder pair:</source>
-<target>Zpracovávání adresářové páru:</target>
+<source>Synchronizing folder pair:</source>
+<target>Zpracovávání páru složek:</target>
<source>Target folder %x already existing.</source>
<target>Cílova složka %x již existuje.</target>
diff --git a/BUILD/Languages/danish.lng b/BUILD/Languages/danish.lng
index 4ebecf69..da76bd5e 100644
--- a/BUILD/Languages/danish.lng
+++ b/BUILD/Languages/danish.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Søger efter mappen %x...</target>
-<source>Batch execution</source>
-<target>Batch afvikling</target>
-
<source>Items processed:</source>
<target>Enheder behandlet:</target>
@@ -61,12 +58,12 @@
<source>Create a batch job</source>
<target>Lav et batch job</target>
-<source>Synchronization settings</source>
-<target>Synkroniserings indstillinger</target>
-
<source>Comparison settings</source>
<target>Sammenlignings indstillinger</target>
+<source>Synchronization settings</source>
+<target>Synkroniserings indstillinger</target>
+
<source>About</source>
<target>Om</target>
@@ -88,27 +85,6 @@
<source>Select time span</source>
<target>Vælg tids område</target>
-<source>Show pop-up</source>
-<target>Vis pop-up</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Vis pop-up ved fejl eller advarsler</target>
-
-<source>Ignore errors</source>
-<target>Ignorer fejl</target>
-
-<source>Hide all error and warning messages</source>
-<target>Skjul beskeder om fejl og advarsler</target>
-
-<source>Exit instantly</source>
-<target>Afslut med det samme</target>
-
-<source>Abort synchronization immediately</source>
-<target>Abort synkronisering med det samme</target>
-
-<source>Browse</source>
-<target>Gennemse</target>
-
<source>Invalid command line:</source>
<target>Ugyldig kommando:</target>
@@ -247,8 +223,8 @@
<source>&Open...</source>
<target>&Ã…ben...</target>
-<source>Save &As...</source>
-<target>Gem &Som...</target>
+<source>Save &as...</source>
+<target>Gem &som...</target>
<source>&Quit</source>
<target>&Afslut</target>
@@ -289,6 +265,9 @@
<source>Remove folder</source>
<target>Fjern mappe</target>
+<source>Browse</source>
+<target>Gennemse</target>
+
<source>Select a folder</source>
<target>Vælg en mappe</target>
@@ -321,8 +300,8 @@ Kommandoen udføres hvis:
<source>Cancel</source>
<target>Anuller</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Build: %x</target>
<source>All files</source>
<target>Alle filer</target>
@@ -342,9 +321,6 @@ Kommandoen udføres hvis:
<source>A folder input field is empty.</source>
<target>Et mappe felt er tomt.</target>
-<source>Logging</source>
-<target>Logger</target>
-
<source>File time and size</source>
<target>Fil tid og størrelse</target>
@@ -525,11 +501,11 @@ Kommandoen udføres hvis:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Senest brugte konfigurationer (tryk DEL for at fjerne fra listen)</target>
-<source>Hide excluded items</source>
-<target>Skjul udelukkede emner</target>
+<source>Show excluded items</source>
+<target>Vis afviste emner</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Skjul filtrerede eller midlertidigt udelukkede filer</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Vis filtrerede eller midlertidigt afviste filer</target>
<source>Number of files and folders that will be created</source>
<target>Antallet af filer og mapper der vil blive oprettet</target>
@@ -573,24 +549,81 @@ Kommandoen udføres hvis:
<source>Right</source>
<target>Højre</target>
-<source>Status feedback</source>
-<target>Status feedback</target>
+<source>Error handling</source>
+<target>Fejl håndtering</target>
+
+<source>Ignore</source>
+<target>Ignorer</target>
+
+<source>Hide all error and warning messages</source>
+<target>Skjul beskeder om fejl og advarsler</target>
+
+<source>Pop-up</source>
+<target>Pop-up</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Vis pop-up ved fejl eller advarsler</target>
+
+<source>Exit</source>
+<target>Afslut</target>
+
+<source>Abort synchronization on first error</source>
+<target>Stop synkronisering ved første fejl</target>
+
+<source>On completion:</source>
+<target>Før færdiggørelse:</target>
<source>Show progress dialog</source>
<target>Vis dialog boks</target>
-<source>Error handling</source>
-<target>Fejl håndtering</target>
+<source>Generate log file</source>
+<target>Lav log fil</target>
-<source>Maximum number of log files:</source>
-<target>Maksimalt antal log filer:</target>
+<source>Select folder to save log files</source>
+<target>Vælg destinations mappe til log filer</target>
-<source>Select folder to save log files:</source>
-<target>Vælg hvor log filer skal gemmes:</target>
+<source>Limit</source>
+<target>Grænse</target>
+
+<source>Limit maximum number of log files</source>
+<target>Maksimale antal log filer</target>
<source>Batch settings</source>
<target>Batch indstillinger</target>
+<source>Compare by...</source>
+<target>Sammenlign ved...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Filer bliver set som ens hvis
+ - sidst skrevne tid og dato
+ - fil størrelse
+er ens
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Filer er ens hvis
+ - fil indhold
+er det samme
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Link håndtering</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Vælg variant:</target>
@@ -609,8 +642,26 @@ Kommandoen udføres hvis:
<source>Deletion handling</source>
<target>Slette håndtering</target>
-<source>On completion:</source>
-<target>Før færdiggørelse:</target>
+<source>Permanent</source>
+<target>Permanent</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Slet eller overskriv filer permanent</target>
+
+<source>Recycle Bin</source>
+<target>Skralsespand</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Brug skraldespand ved sletning eller overskrivning</target>
+
+<source>Versioning</source>
+<target>Versionering</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Flyt tids-stemplede filer til den valgte mappe</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Begræns det maksimale antal fil versioner</target>
<source>Configuration</source>
<target>Konfiguration</target>
@@ -633,39 +684,6 @@ Kommandoen udføres hvis:
<source>Conflict/item cannot be categorized</source>
<target>Advarsel/enheden kan ikke kategoriseres</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Sammenlign ved...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Filer bliver set som ens hvis
- - sidst skrevne tid og dato
- - fil størrelse
-er ens
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Filer er ens hvis
- - fil indhold
-er det samme
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Link håndtering</target>
-
<source>Synchronizing...</source>
<target>Synkroniserer...</target>
@@ -681,8 +699,8 @@ er det samme
<source>Donate with PayPal</source>
<target>Doner med PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Stor tak for lokalisering af FreeFileSync går til:</target>
+<source>Many thanks for localization:</source>
+<target>Mange tak for oversættelse til:</target>
<source>Feedback and suggestions are welcome</source>
<target>Feedback og forslag er velkomne</target>
@@ -699,9 +717,6 @@ er det samme
<source>Published under the GNU General Public License</source>
<target>Udgivet under GNU General Public Licence</target>
-<source>Use Recycle Bin</source>
-<target>Brug skraldespanden</target>
-
<source>Delete on both sides</source>
<target>Slet på begge sider</target>
@@ -771,8 +786,8 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Statistics</source>
<target>Statestik</target>
-<source>Do not show this dialog again</source>
-<target>Vis ikke denne dialog igen</target>
+<source>Don't show this dialog again</source>
+<target>Vis ikke denne dialog boks igen</target>
<source>Find what:</source>
<target>Find:</target>
@@ -855,11 +870,8 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Do you want to save changes to %x?</source>
<target>Ønsker du at gemme ændringerne til %x?</target>
-<source>Save</source>
-<target>Gem</target>
-
-<source>Don't Save</source>
-<target>Gem Ikke</target>
+<source>Do&n't save</source>
+<target>Gem ikke</target>
<source>Configuration loaded!</source>
<target>Konfiguration hentet!</target>
@@ -951,8 +963,8 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Show files that won't be copied</source>
<target>Vis filer der ikke bliver kopieret</target>
-<source>All directories in sync!</source>
-<target>Alle biblioteker er synkroniseret!</target>
+<source>All folders are in sync!</source>
+<target>Alle mapper er synkroniserede</target>
<source>Comma separated list</source>
<target>Komma separeret list</target>
@@ -1041,6 +1053,9 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Pause</source>
<target>Pause</target>
+<source>Logging</source>
+<target>Logger</target>
+
<source>Cannot find %x</source>
<target>Kan ikke finde %x</target>
@@ -1122,21 +1137,6 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Leave as unresolved conflict</source>
<target>Efterlad som uløste konflikter</target>
-<source>Delete permanently</source>
-<target>Slet permanent</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Slet eller overskriv filer permanent</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Brug skraldespand ved sletning eller overskrivning</target>
-
-<source>Versioning</source>
-<target>Versionering</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Flyt filer til tids-stemplet undermappe</target>
-
<source>Files</source>
<target>Filer</target>
@@ -1227,8 +1227,11 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Cannot copy file %x to %y.</source>
<target>Kan ikke kopiere filen %x til %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Kan ikke læse biblioteket %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Kan ikke åbne bibliotek %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Kan ikke optælle biblioteket %x.</target>
<source>Detected endless directory recursion.</source>
<target>Opdaget en uendelig biblioteks løkke.</target>
@@ -1254,6 +1257,9 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Sætter standard synkroniseringsvej: Gamle filer bliver overskrevet med nyere.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Papirkurven kan ikke bruges på følgende stier! Filerne vil blive slettet permanent i stedet for:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Du kan ignorere denne fejl og betegne mappen som tom.</target>
@@ -1263,6 +1269,9 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Biblioteker er afhængige! Vær forsigtig når du laver synkroniserings reglerne:</target>
+<source>Start comparison</source>
+<target>Start sammenligning</target>
+
<source>Preparing synchronization...</source>
<target>Forbereder synkronisering...</target>
@@ -1275,6 +1284,9 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Files %x have the same date but a different size!</source>
<target>Filerne %x har den samme dato men forskellig størrelse!</target>
+<source>Items differ in attributes only</source>
+<target>Enheder der kun har attributter til forskel</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Linksene %x har samme dato men forskellige mål.</target>
@@ -1290,9 +1302,6 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Both sides are equal</source>
<target>Begge sider er ens</target>
-<source>Items have different attributes</source>
-<target>Enhederne har forskellige attributter</target>
-
<source>Copy new item to left</source>
<target>Kopiere nyt emne mod venstre</target>
@@ -1407,14 +1416,11 @@ Note: Fil navne må skal passe til grund bibliotekerne!
<source>Available:</source>
<target>Tilgængeligt:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Papirkurven kan ikke bruges på følgende stier! Filerne vil blive slettet permanent i stedet for:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>En mappe som er en del af flere mappe parringer vil blive ændret. Gennemse venligst synkroniserings indstillingerne.</target>
-<source>Processing folder pair:</source>
-<target>Behandler mappe par:</target>
+<source>Synchronizing folder pair:</source>
+<target>Synkroniserer mappe par:</target>
<source>Target folder %x already existing.</source>
<target>Destinations mappen %x eksisterer allerede.</target>
diff --git a/BUILD/Languages/dutch.lng b/BUILD/Languages/dutch.lng
index cc79add7..bf6459e1 100644
--- a/BUILD/Languages/dutch.lng
+++ b/BUILD/Languages/dutch.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Bezig met zoeken naar map %x...</target>
-<source>Batch execution</source>
-<target>Taak uitvoeren</target>
-
<source>Items processed:</source>
<target>Onderdelen verwerkt:</target>
@@ -34,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Bezig met afbreken: Wacht op beëindiging huidige bewerking...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Geautomatiseerde Synchronisatie</target>
@@ -61,12 +61,12 @@
<source>Create a batch job</source>
<target>Creëer een taaklijst</target>
-<source>Synchronization settings</source>
-<target>Synchronisatieinstellingen</target>
-
<source>Comparison settings</source>
<target>Vergelijksinstellingen</target>
+<source>Synchronization settings</source>
+<target>Synchronisatieinstellingen</target>
+
<source>About</source>
<target>Informatie</target>
@@ -88,27 +88,6 @@
<source>Select time span</source>
<target>Selecteer tijdsspanne</target>
-<source>Show pop-up</source>
-<target>Laat pop-up zien</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Laat pop-up zien bij foutmeldingen of waarschuwingen</target>
-
-<source>Ignore errors</source>
-<target>Negeer foutmeldingen</target>
-
-<source>Hide all error and warning messages</source>
-<target>Verberg alle fout- en waarschuwingsberichten</target>
-
-<source>Exit instantly</source>
-<target>Sluit meteen af</target>
-
-<source>Abort synchronization immediately</source>
-<target>Stop synchronisatie onmiddelijk</target>
-
-<source>Browse</source>
-<target>Verkennen</target>
-
<source>Invalid command line:</source>
<target>Ongeldige opdrachtregel:</target>
@@ -247,7 +226,7 @@
<source>&Open...</source>
<target>&Open...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>Ops&laan als...</target>
<source>&Quit</source>
@@ -260,7 +239,7 @@
<target>&Inhoud</target>
<source>&About</source>
-<target>O&ver</target>
+<target>&Over</target>
<source>&Help</source>
<target>&Help</target>
@@ -289,6 +268,9 @@
<source>Remove folder</source>
<target>Verwijder map</target>
+<source>Browse</source>
+<target>Verkennen</target>
+
<source>Select a folder</source>
<target>Selecteer een map</target>
@@ -321,8 +303,8 @@ De opdracht word geactiveerd als:
<source>Cancel</source>
<target>Annuleren</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Build: %x</target>
<source>All files</source>
<target>Alle bestanden</target>
@@ -342,9 +324,6 @@ De opdracht word geactiveerd als:
<source>A folder input field is empty.</source>
<target>Een map invoerveld is leeg.</target>
-<source>Logging</source>
-<target>Loggen</target>
-
<source>File time and size</source>
<target>Bestandstijd- en grootte</target>
@@ -525,11 +504,11 @@ De opdracht word geactiveerd als:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Laatst gebruikte instellingen (druk op DEL om iets te verwijderen)</target>
-<source>Hide excluded items</source>
-<target>Verberg uitgesloten items</target>
+<source>Show excluded items</source>
+<target>Laat uitgesloten bestanden zien</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Verberg gefilterde of tijdelijk uitgesloten bestanden</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Laat gefilterde of tijdelijk uitgesloten bestanden zien</target>
<source>Number of files and folders that will be created</source>
<target>Aantal bestanden en mappen die zullen worden aangemaakt</target>
@@ -573,24 +552,81 @@ De opdracht word geactiveerd als:
<source>Right</source>
<target>Rechts</target>
-<source>Status feedback</source>
-<target>Status terugkoppeling</target>
+<source>Error handling</source>
+<target>Fout afhandeling</target>
+
+<source>Ignore</source>
+<target>Negeer</target>
+
+<source>Hide all error and warning messages</source>
+<target>Verberg alle fout- en waarschuwingsberichten</target>
+
+<source>Pop-up</source>
+<target>Pop-up</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Laat pop-up zien bij foutmeldingen of waarschuwingen</target>
+
+<source>Exit</source>
+<target>Sluiten</target>
+
+<source>Abort synchronization on first error</source>
+<target>Synchronisatie stoppen bij eerste foutmelding</target>
+
+<source>On completion:</source>
+<target>Bij voltooiing:</target>
<source>Show progress dialog</source>
<target>Toon voortgangsdialoogvenster</target>
-<source>Error handling</source>
-<target>Fout afhandeling</target>
+<source>Generate log file</source>
+<target>Log bestand aanmaken</target>
-<source>Maximum number of log files:</source>
-<target>Maximale aantal van logbestanden:</target>
+<source>Select folder to save log files</source>
+<target>Selecteer map om log bestanden op te slaan</target>
-<source>Select folder to save log files:</source>
-<target>Selecteer de map voor het bewaren van logbestanden:</target>
+<source>Limit</source>
+<target>Limiet</target>
+
+<source>Limit maximum number of log files</source>
+<target>Limiteer maximaal aantal log bestanden</target>
<source>Batch settings</source>
<target>Batchinstellingen</target>
+<source>Compare by...</source>
+<target>Vergelijk met...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Bestanden worden als gelijk bevonden indien
+ - de laatste schrijf tijd en datum
+ - de bestandsgrootte
+gelijk zijn
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Bestanden worden als gelijk beschouwd indien
+ - de bestandsinhoud
+overeenkomt
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Afhandeling van snelkoppelingen</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Selecteer een variant:</target>
@@ -609,8 +645,26 @@ De opdracht word geactiveerd als:
<source>Deletion handling</source>
<target>Verwijder-afhandeling</target>
-<source>On completion:</source>
-<target>Bij voltooiing:</target>
+<source>Permanent</source>
+<target>Permanent</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Bestanden definitief verwijderen of overschrijven</target>
+
+<source>Recycle Bin</source>
+<target>Prullenbak</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Gebruik de prullenbak bij verwijderen of overschrijven van bestanden</target>
+
+<source>Versioning</source>
+<target>Versiebeheer</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Verplaats bestanden met tijdstempel naar specifieke map</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Limiteer maximaal aantal versies per bestand</target>
<source>Configuration</source>
<target>Configuratie</target>
@@ -633,39 +687,6 @@ De opdracht word geactiveerd als:
<source>Conflict/item cannot be categorized</source>
<target>Conflict/item kan niet worden gecategoriseerd</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Vergelijk met...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Bestanden worden als gelijk bevonden indien
- - de laatste schrijf tijd en datum
- - de bestandsgrootte
-gelijk zijn
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Bestanden worden als gelijk beschouwd indien
- - de bestandsinhoud
-overeenkomt
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Afhandeling van snelkoppelingen</target>
-
<source>Synchronizing...</source>
<target>Synchroniseert...</target>
@@ -681,8 +702,8 @@ overeenkomt
<source>Donate with PayPal</source>
<target>Doneer met PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Extra dank voor het vertalen van FreeFileSync gaat naar:</target>
+<source>Many thanks for localization:</source>
+<target>Veel dank voor de vertalingen:</target>
<source>Feedback and suggestions are welcome</source>
<target>Feedback en suggesties zijn welkom</target>
@@ -699,9 +720,6 @@ overeenkomt
<source>Published under the GNU General Public License</source>
<target>Gepubliceerd onder de GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>Gebruik de prullenbak</target>
-
<source>Delete on both sides</source>
<target>Verwijder aan beide zijdes</target>
@@ -771,8 +789,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<source>Statistics</source>
<target>Statistieken</target>
-<source>Do not show this dialog again</source>
-<target>Toon deze melding niet meer</target>
+<source>Don't show this dialog again</source>
+<target>Laat deze dialoog niet meer zien</target>
<source>Find what:</source>
<target>Vind wat:</target>
@@ -855,11 +873,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<source>Do you want to save changes to %x?</source>
<target>Wilt u de wijzigingen in %x opslaan?</target>
-<source>Save</source>
-<target>Opslaan</target>
-
-<source>Don't Save</source>
-<target>Niet opslaan</target>
+<source>Do&n't save</source>
+<target>&Niet opslaan</target>
<source>Configuration loaded!</source>
<target>Configuratie geladen!</target>
@@ -951,7 +966,7 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<source>Show files that won't be copied</source>
<target>Toon bestanden die niet gekopiëerd zullen worden</target>
-<source>All directories in sync!</source>
+<source>All folders are in sync!</source>
<target>Alle mappen zijn gesynchroniseerd!</target>
<source>Comma separated list</source>
@@ -1041,6 +1056,9 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<source>Pause</source>
<target>Pauze</target>
+<source>Logging</source>
+<target>Loggen</target>
+
<source>Cannot find %x</source>
<target>Kan %x niet vinden</target>
@@ -1122,21 +1140,6 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<source>Leave as unresolved conflict</source>
<target>Beschouw als onopgelost conflict</target>
-<source>Delete permanently</source>
-<target>Definitief verwijderen</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Bestanden definitief verwijderen of overschrijven</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Gebruik de prullenbak bij verwijderen of overschrijven van bestanden</target>
-
-<source>Versioning</source>
-<target>Versiebeheer</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Verplaats bestanden in een tijdsaangeduide submap</target>
-
<source>Files</source>
<target>Bestanden</target>
@@ -1227,8 +1230,11 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<source>Cannot copy file %x to %y.</source>
<target>Kan bestand %x niet kopiëren naar %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Kan map %x niet lezen.</target>
+<source>Cannot open directory %x.</source>
+<target>Kan map %x niet openen.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Kan map %x niet opsommen.</target>
<source>Detected endless directory recursion.</source>
<target>Eindeloze map recursie gedetecteerd.</target>
@@ -1267,7 +1273,7 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<target>Mappen zijn afhankelijk van elkaar! Wees voorzichtig met het maken van synchronisatieregels:</target>
<source>Start comparison</source>
-<target></target>
+<target>Start vergelijking</target>
<source>Preparing synchronization...</source>
<target>Synchronisatie voorbereiden</target>
@@ -1281,8 +1287,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<source>Files %x have the same date but a different size!</source>
<target>Bestanden %x hebben dezelfde datums maar een afwijkende grootte!</target>
-<source>Items have different attributes</source>
-<target>Items hebben verschillende attributen</target>
+<source>Items differ in attributes only</source>
+<target>Items verschillen alleen in attributen</target>
<source>Symbolic links %x have the same date but a different target.</source>
<target>Snelkoppelingen %x hebben dezelfde datum maar een verschillend doel.</target>
@@ -1362,6 +1368,9 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<source>Moving symbolic link %x to %y</source>
<target>Bezig met verplaatsen van snelkoppeling %x naar %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>Bestand %x wordt aangemaakt</target>
@@ -1416,8 +1425,8 @@ Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Een map die onderdeel is van meerdere map paren word aangepast. Kijk alstublieft uw synchronisatie instellingen na.</target>
-<source>Synchronize folder pair:</source>
-<target></target>
+<source>Synchronizing folder pair:</source>
+<target>Bezig met synchroniseren van folder paar:</target>
<source>Target folder %x already existing.</source>
<target>Doelmap %x bestaat al.</target>
diff --git a/BUILD/Languages/english_uk.lng b/BUILD/Languages/english_uk.lng
index bd0cd650..840e9431 100644
--- a/BUILD/Languages/english_uk.lng
+++ b/BUILD/Languages/english_uk.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>Searching for folder %x...</target>
+<source>Items processed:</source>
+<target>Elements processed:</target>
+
+<source>Items remaining:</source>
+<target>Elements remaining:</target>
+
+<source>Total time:</source>
+<target>Total time:</target>
+
<source>Show in Explorer</source>
<target>Show in Explorer</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>Create a batch job</target>
-<source>Synchronization settings</source>
-<target>Synchronisation settings</target>
-
<source>Comparison settings</source>
<target>Comparison settings</target>
+<source>Synchronization settings</source>
+<target>Synchronisation settings</target>
+
<source>About</source>
<target>About</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>Select time span</target>
-<source>Show pop-up</source>
-<target>Show pop-up</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Show pop-up on errors or warnings</target>
-
-<source>Ignore errors</source>
-<target>Ignore errors</target>
-
-<source>Hide all error and warning messages</source>
-<target>Hide all error and warning messages</target>
-
-<source>Exit instantly</source>
-<target>Exit instantly</target>
-
-<source>Abort synchronization immediately</source>
-<target>Abort synchronisation immediately</target>
-
-<source>Browse</source>
-<target>Browse</target>
-
<source>Invalid command line:</source>
<target>Invalid command line:</target>
@@ -235,8 +223,8 @@
<source>&Open...</source>
<target>&Open...</target>
-<source>Save &As...</source>
-<target>Save &As...</target>
+<source>Save &as...</source>
+<target>Save &as...</target>
<source>&Quit</source>
<target>&Quit</target>
@@ -277,6 +265,9 @@
<source>Remove folder</source>
<target>Remove folder</target>
+<source>Browse</source>
+<target>Browse</target>
+
<source>Select a folder</source>
<target>Select a folder</target>
@@ -309,8 +300,8 @@ The command is triggered if:
<source>Cancel</source>
<target>Cancel</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Build: %x</target>
<source>All files</source>
<target>All files</target>
@@ -330,9 +321,6 @@ The command is triggered if:
<source>A folder input field is empty.</source>
<target>A folder input field is empty.</target>
-<source>Logging</source>
-<target>Logging</target>
-
<source>File time and size</source>
<target>File time and size</target>
@@ -354,21 +342,6 @@ The command is triggered if:
<source>FreeFileSync batch</source>
<target>FreeFileSync batch</target>
-<source>Batch execution</source>
-<target>Batch execution</target>
-
-<source>Items processed:</source>
-<target>Elements processed:</target>
-
-<source>Items remaining:</source>
-<target>Elements remaining:</target>
-
-<source>Total time:</source>
-<target>Total time:</target>
-
-<source>Stop</source>
-<target>Stop</target>
-
<source>Synchronization aborted!</source>
<target>Synchronisation aborted!</target>
@@ -528,11 +501,11 @@ The command is triggered if:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Last used configurations (press DEL to remove from list)</target>
-<source>Hide excluded items</source>
-<target>Hide excluded items</target>
+<source>Show excluded items</source>
+<target>Show excluded items</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Hide filtered or temporarily excluded files</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Show filtered or temporarily excluded files</target>
<source>Number of files and folders that will be created</source>
<target>Number of files and folders that will be created</target>
@@ -576,24 +549,81 @@ The command is triggered if:
<source>Right</source>
<target>Right</target>
-<source>Status feedback</source>
-<target>Status feedback</target>
+<source>Error handling</source>
+<target>Error handling</target>
+
+<source>Ignore</source>
+<target>Ignore</target>
+
+<source>Hide all error and warning messages</source>
+<target>Hide all error and warning messages</target>
+
+<source>Pop-up</source>
+<target>Pop-up</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Show pop-up on errors or warnings</target>
+
+<source>Exit</source>
+<target>Exit</target>
+
+<source>Abort synchronization on first error</source>
+<target>Abort synchronisation on first error</target>
+
+<source>On completion:</source>
+<target>On completion:</target>
<source>Show progress dialog</source>
<target>Show progress dialog</target>
-<source>Error handling</source>
-<target>Error handling</target>
+<source>Generate log file</source>
+<target>Generate log file</target>
-<source>Maximum number of log files:</source>
-<target>Maximum number of log files:</target>
+<source>Select folder to save log files</source>
+<target>Select folder to save log files</target>
-<source>Select folder to save log files:</source>
-<target>Select folder to save log files:</target>
+<source>Limit</source>
+<target>Limit</target>
+
+<source>Limit maximum number of log files</source>
+<target>Limit maximum number of log files</target>
<source>Batch settings</source>
<target>Batch settings</target>
+<source>Compare by...</source>
+<target>Compare by...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Files are found equal if
+ - file content
+is the same
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Symbolic Link handling</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Select variant:</target>
@@ -612,8 +642,26 @@ The command is triggered if:
<source>Deletion handling</source>
<target>Deletion handling</target>
-<source>On completion:</source>
-<target>On completion:</target>
+<source>Permanent</source>
+<target>Permanent</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Delete or overwrite files permanently</target>
+
+<source>Recycle Bin</source>
+<target>Recycle Bin</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Use Recycle Bin when deleting or overwriting files</target>
+
+<source>Versioning</source>
+<target>Versioning</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Move time-stamped files into specified folder</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Limit maximum number of versions per file</target>
<source>Configuration</source>
<target>Configuration</target>
@@ -636,39 +684,6 @@ The command is triggered if:
<source>Conflict/item cannot be categorized</source>
<target>Conflict/item cannot be categorised</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Compare by...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Files are found equal if
- - file content
-is the same
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Symbolic Link handling</target>
-
<source>Synchronizing...</source>
<target>Synchronising...</target>
@@ -684,8 +699,8 @@ is the same
<source>Donate with PayPal</source>
<target>Donate with PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Big thanks for localising FreeFileSync goes out to:</target>
+<source>Many thanks for localization:</source>
+<target>Many thanks for localisation:</target>
<source>Feedback and suggestions are welcome</source>
<target>Feedback and suggestions are welcome</target>
@@ -702,9 +717,6 @@ is the same
<source>Published under the GNU General Public License</source>
<target>Published under the GNU General Public Licence</target>
-<source>Use Recycle Bin</source>
-<target>Use Recycle Bin</target>
-
<source>Delete on both sides</source>
<target>Delete on both sides</target>
@@ -774,8 +786,8 @@ Note: File names must be relative to base directories!
<source>Statistics</source>
<target>Statistics</target>
-<source>Do not show this dialog again</source>
-<target>Do not show this dialogue again</target>
+<source>Don't show this dialog again</source>
+<target>Don't show this dialog again</target>
<source>Find what:</source>
<target>Find what:</target>
@@ -858,11 +870,8 @@ Note: File names must be relative to base directories!
<source>Do you want to save changes to %x?</source>
<target>Do you want to save changes to %x?</target>
-<source>Save</source>
-<target>Save</target>
-
-<source>Don't Save</source>
-<target>Don't Save</target>
+<source>Do&n't save</source>
+<target>Do&n't save</target>
<source>Configuration loaded!</source>
<target>Configuration loaded!</target>
@@ -954,8 +963,8 @@ Note: File names must be relative to base directories!
<source>Show files that won't be copied</source>
<target>Show files that won't be copied</target>
-<source>All directories in sync!</source>
-<target>All directories in sync!</target>
+<source>All folders are in sync!</source>
+<target>All folders are in sync!</target>
<source>Comma separated list</source>
<target>Comma separated list</target>
@@ -1044,6 +1053,9 @@ Note: File names must be relative to base directories!
<source>Pause</source>
<target>Pause</target>
+<source>Logging</source>
+<target>Logging</target>
+
<source>Cannot find %x</source>
<target>Cannot find %x</target>
@@ -1125,21 +1137,6 @@ Note: File names must be relative to base directories!
<source>Leave as unresolved conflict</source>
<target>Leave as unresolved conflict</target>
-<source>Delete permanently</source>
-<target>Delete permanently</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Delete or overwrite files permanently</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Use Recycle Bin when deleting or overwriting files</target>
-
-<source>Versioning</source>
-<target>Versioning</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Move files into a time-stamped subfolder</target>
-
<source>Files</source>
<target>Files</target>
@@ -1230,8 +1227,11 @@ Note: File names must be relative to base directories!
<source>Cannot copy file %x to %y.</source>
<target>Cannot copy file %x to %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Cannot read directory %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Cannot open directory %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Cannot enumerate directory %x.</target>
<source>Detected endless directory recursion.</source>
<target>Detected endless directory recursion.</target>
@@ -1257,6 +1257,9 @@ Note: File names must be relative to base directories!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Setting default synchronisation directions: Old files will be overwritten with newer files.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>You can ignore this error to consider the folder as empty.</target>
@@ -1266,6 +1269,9 @@ Note: File names must be relative to base directories!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Directories are dependent! Be careful when setting up synchronisation rules:</target>
+<source>Start comparison</source>
+<target>Start comparison</target>
+
<source>Preparing synchronization...</source>
<target>Preparing synchronisation...</target>
@@ -1278,6 +1284,9 @@ Note: File names must be relative to base directories!
<source>Files %x have the same date but a different size!</source>
<target>Files %x have the same date but a different size!</target>
+<source>Items differ in attributes only</source>
+<target>Items differ in attributes only</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Symbolic links %x have the same date but a different target.</target>
@@ -1293,9 +1302,6 @@ Note: File names must be relative to base directories!
<source>Both sides are equal</source>
<target>Both sides are equal</target>
-<source>Items have different attributes</source>
-<target>Items have different attributes</target>
-
<source>Copy new item to left</source>
<target>Copy new item to left</target>
@@ -1410,14 +1416,11 @@ Note: File names must be relative to base directories!
<source>Available:</source>
<target>Available:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>A folder will be modified which is part of multiple folder pairs. Please review synchronisation settings.</target>
-<source>Processing folder pair:</source>
-<target>Processing folder pair:</target>
+<source>Synchronizing folder pair:</source>
+<target>Synchronising folder pair:</target>
<source>Target folder %x already existing.</source>
<target>Target folder %x already existing.</target>
diff --git a/BUILD/Languages/finnish.lng b/BUILD/Languages/finnish.lng
index f67326e5..93220ec4 100644
--- a/BUILD/Languages/finnish.lng
+++ b/BUILD/Languages/finnish.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>Etsitään hakemistoa %x...</target>
+<source>Items processed:</source>
+<target>Osia käsitelty:</target>
+
+<source>Items remaining:</source>
+<target>Osia jäljellä:</target>
+
+<source>Total time:</source>
+<target>Kokonaisaika:</target>
+
<source>Show in Explorer</source>
<target>Näytä Explorerissa</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>Eräajon luonti</target>
-<source>Synchronization settings</source>
-<target>Täsmäytyksen asetukset</target>
-
<source>Comparison settings</source>
<target>Vertailun asetukset</target>
+<source>Synchronization settings</source>
+<target>Täsmäytyksen asetukset</target>
+
<source>About</source>
<target>Ohje</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>Valitse aikajana</target>
-<source>Show pop-up</source>
-<target>Näytä Pop-Up</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Näytä Pop-Up (virheet/varoitukset)</target>
-
-<source>Ignore errors</source>
-<target>Älä huomioi virheitä</target>
-
-<source>Hide all error and warning messages</source>
-<target>Piilota kaikki virhe- ja varoitusviestit</target>
-
-<source>Exit instantly</source>
-<target>Poistu välittömästi</target>
-
-<source>Abort synchronization immediately</source>
-<target>Lopeta täsmäytys välittömästi</target>
-
-<source>Browse</source>
-<target>Selaa</target>
-
<source>Invalid command line:</source>
<target>Virheellinen komentokehote:</target>
@@ -235,7 +223,7 @@
<source>&Open...</source>
<target>&Avaa...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>Tallenna n&imellä...</target>
<source>&Quit</source>
@@ -277,6 +265,9 @@
<source>Remove folder</source>
<target>Poista hakemisto</target>
+<source>Browse</source>
+<target>Selaa</target>
+
<source>Select a folder</source>
<target>Valitse hakemisto</target>
@@ -309,8 +300,8 @@ Käsky suoritetaan jos:
<source>Cancel</source>
<target>Lopeta</target>
-<source>(Build: %x)</source>
-<target>(Versio: %x)</target>
+<source>Build: %x</source>
+<target>Versio: %x</target>
<source>All files</source>
<target>Kaikki tiedostot</target>
@@ -330,9 +321,6 @@ Käsky suoritetaan jos:
<source>A folder input field is empty.</source>
<target>Hakemiston syöte on tyhjä.</target>
-<source>Logging</source>
-<target>Kirjaa</target>
-
<source>File time and size</source>
<target>Tiedoston aika ja koko</target>
@@ -354,18 +342,6 @@ Käsky suoritetaan jos:
<source>FreeFileSync batch</source>
<target>FreeFileSync eräajo</target>
-<source>Batch execution</source>
-<target>Eräajon suoritus</target>
-
-<source>Items processed:</source>
-<target>Osia käsitelty:</target>
-
-<source>Items remaining:</source>
-<target>Osia jäljellä:</target>
-
-<source>Total time:</source>
-<target>Kokonaisaika:</target>
-
<source>Synchronization aborted!</source>
<target>Täsmäytys lopetettiin!</target>
@@ -525,11 +501,11 @@ Käsky suoritetaan jos:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Viimeksi käytetty asetus (poista listalta paina DEL)</target>
-<source>Hide excluded items</source>
-<target>Piilota suodatetut</target>
+<source>Show excluded items</source>
+<target>Näytä suodatetut</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Piilota suodatetut ja tilapäisesti poistetut</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Näytä suodatetut/nyt pois suljetut tiedostot</target>
<source>Number of files and folders that will be created</source>
<target>Luotavien tiedostojen ja hakemistojen määrä</target>
@@ -573,24 +549,81 @@ Käsky suoritetaan jos:
<source>Right</source>
<target>Oikea</target>
-<source>Status feedback</source>
-<target>Tilan palaute</target>
+<source>Error handling</source>
+<target>Virheiden käsittely</target>
+
+<source>Ignore</source>
+<target>Ohita</target>
+
+<source>Hide all error and warning messages</source>
+<target>Piilota kaikki virhe- ja varoitusviestit</target>
+
+<source>Pop-up</source>
+<target>Pop-up</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Näytä Pop-Up (virheet/varoitukset)</target>
+
+<source>Exit</source>
+<target>Poistu</target>
+
+<source>Abort synchronization on first error</source>
+<target>Keskeytä täsmäytys ensimmäisestä virheestä</target>
+
+<source>On completion:</source>
+<target>Kun valmis</target>
<source>Show progress dialog</source>
<target>Näytä etenemä ikkuna</target>
-<source>Error handling</source>
-<target>Virheiden käsittely</target>
+<source>Generate log file</source>
+<target>Luo lokitiedosto</target>
+
+<source>Select folder to save log files</source>
+<target>Valitse tallennushakemisto lokeille</target>
-<source>Maximum number of log files:</source>
-<target>Lokitiedostojen enimmäismäärä:</target>
+<source>Limit</source>
+<target>Raja</target>
-<source>Select folder to save log files:</source>
-<target>Lokitiedostojen tallennushakemisto:</target>
+<source>Limit maximum number of log files</source>
+<target>Lokeja enintäin</target>
<source>Batch settings</source>
<target>Eräajo asetukset</target>
+<source>Compare by...</source>
+<target>Vertaile...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Tiedostot samat jos
+ - viimeinen kirjoitusaika ja pvm
+ - tiedostokoko
+ovat samat
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Tiedostot samat jos,
+ - tiedoston sisältö
+on sama
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Pikakuvakkeiden hallinta</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Valitse vaihtoehto:</target>
@@ -609,8 +642,26 @@ Käsky suoritetaan jos:
<source>Deletion handling</source>
<target>Poistotapa</target>
-<source>On completion:</source>
-<target>Kun valmis</target>
+<source>Permanent</source>
+<target>Pysyvä</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Poista tai korvaa tiedostoja pysyvästi</target>
+
+<source>Recycle Bin</source>
+<target>Roskakori</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Käytä Roskakoria kun poistat tai korvaat tiedostoja</target>
+
+<source>Versioning</source>
+<target>Versiointi</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Siirrä aikaleimatut tiedostot hakemistoon</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Tiedostoversioita enintäin</target>
<source>Configuration</source>
<target>Asetukset</target>
@@ -633,39 +684,6 @@ Käsky suoritetaan jos:
<source>Conflict/item cannot be categorized</source>
<target>Ristiriita, ei määriteltävissä</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Vertaile...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Tiedostot samat jos
- - viimeinen kirjoitusaika ja pvm
- - tiedostokoko
-ovat samat
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Tiedostot samat jos,
- - tiedoston sisältö
-on sama
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Pikakuvakkeiden hallinta</target>
-
<source>Synchronizing...</source>
<target>Täsmäytetään...</target>
@@ -681,8 +699,8 @@ on sama
<source>Donate with PayPal</source>
<target>Lahjoita PayPal:lla</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Suuret kiitokset FreeFileSync:n paikallistamisesta:</target>
+<source>Many thanks for localization:</source>
+<target>Paljon kiitoksia kääntäjille:</target>
<source>Feedback and suggestions are welcome</source>
<target>Palaute ja uudet ideat ovat tervetulleita</target>
@@ -699,9 +717,6 @@ on sama
<source>Published under the GNU General Public License</source>
<target>Julkaistu lisenssillä GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>Käytä Roskakoria</target>
-
<source>Delete on both sides</source>
<target>Poista molemmilta puolilta</target>
@@ -771,8 +786,8 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Statistics</source>
<target>Tilastot</target>
-<source>Do not show this dialog again</source>
-<target>Älä enää näytä valintaikkunaa</target>
+<source>Don't show this dialog again</source>
+<target>Älä näytä tätä uudestaan</target>
<source>Find what:</source>
<target>Etsi:</target>
@@ -855,10 +870,7 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Do you want to save changes to %x?</source>
<target>Haluatko tallentaa muutokset: %x?</target>
-<source>Save</source>
-<target>Tallenna</target>
-
-<source>Don't Save</source>
+<source>Do&n't save</source>
<target>Älä tallenna</target>
<source>Configuration loaded!</source>
@@ -951,8 +963,8 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Show files that won't be copied</source>
<target>Näytä kopioimatta jäävät tiedostot</target>
-<source>All directories in sync!</source>
-<target>Kaikki hakemistot täsmäävät!</target>
+<source>All folders are in sync!</source>
+<target>Kaikki hakemistot täsmäytetty!</target>
<source>Comma separated list</source>
<target>CSV-muotoinen lista</target>
@@ -1041,6 +1053,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Pause</source>
<target>Tauko</target>
+<source>Logging</source>
+<target>Kirjaa</target>
+
<source>Cannot find %x</source>
<target>En löydä %x</target>
@@ -1122,21 +1137,6 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Leave as unresolved conflict</source>
<target>Jätä ratkaisemattomana virheenä</target>
-<source>Delete permanently</source>
-<target>Poista pysyvästi</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Poista tai korvaa tiedostoja pysyvästi</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Käytä Roskakoria kun poistat tai korvaat tiedostoja</target>
-
-<source>Versioning</source>
-<target>Versiointi</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Siirrä tiedostot aikaleimattuun alihakemistoon</target>
-
<source>Files</source>
<target>Tiedostot</target>
@@ -1227,8 +1227,11 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Cannot copy file %x to %y.</source>
<target>Tiedostoa %x ei voida kopioida kohtaan %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Hakemisto %x ei voida lukea.</target>
+<source>Cannot open directory %x.</source>
+<target>Hakemistoa %x ei voida avata.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Hakemistoa ei voida luetella.</target>
<source>Detected endless directory recursion.</source>
<target>Päättymätön hakemiston toisto.</target>
@@ -1254,6 +1257,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Aseta oletussuunta täsmäykselle: Vanhat tiedostot korvataan uudemilla tiedostoilla.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Roskakori puuttuu näistä polusta! Tiedostot poistetaan pysyvästi:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Ohita tämä virhe ja oleta hakemisto tyhjäksi.</target>
@@ -1263,6 +1269,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Hakemistot riippuvuussuhteessa! Aseta täsmäyssääntöjä varovasti:</target>
+<source>Start comparison</source>
+<target>Käynnistä vertailu</target>
+
<source>Preparing synchronization...</source>
<target>Täsmäytys alustetaan...</target>
@@ -1275,6 +1284,9 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Files %x have the same date but a different size!</source>
<target>Tiedostoilla %x on sama päiväys mutta eri koko!</target>
+<source>Items differ in attributes only</source>
+<target>Kohteiden eroaa vain määritteissä</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Pikakuvikeilla %x on sama päiväys mutta osoittavat eri kohtiin.</target>
@@ -1290,9 +1302,6 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Both sides are equal</source>
<target>Puolet ovat identtiset</target>
-<source>Items have different attributes</source>
-<target>Kohteilla poikkeavat ominaisuudet</target>
-
<source>Copy new item to left</source>
<target>Monista uusi vasemmalle</target>
@@ -1407,14 +1416,11 @@ Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
<source>Available:</source>
<target>Saatavilla:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Roskakori puuttuu näistä polusta! Tiedostot poistetaan pysyvästi:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Moniosaisen hakemistoparin hakemistoa muutetaan. Tarkista täsmäytyksen asetuksia.</target>
-<source>Processing folder pair:</source>
-<target>Käsitellään hakemistoparia:</target>
+<source>Synchronizing folder pair:</source>
+<target>Täsmäytetään hakemistoparia:</target>
<source>Target folder %x already existing.</source>
<target>Kohdehakemisto %x on olemassa.</target>
diff --git a/BUILD/Languages/french.lng b/BUILD/Languages/french.lng
index db263be5..91d1c1b0 100644
--- a/BUILD/Languages/french.lng
+++ b/BUILD/Languages/french.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>Recherche du dossier %x...</target>
+<source>Items processed:</source>
+<target>Elements traités :</target>
+
+<source>Items remaining:</source>
+<target>Elements restants :</target>
+
+<source>Total time:</source>
+<target>Durée totale :</target>
+
<source>Show in Explorer</source>
<target>Montrer dans l'explorateur</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>Créer un traitement batch</target>
-<source>Synchronization settings</source>
-<target>Paramétrage de la synchronisation</target>
-
<source>Comparison settings</source>
<target>Paramètres de comparaison</target>
+<source>Synchronization settings</source>
+<target>Paramétrage de la synchronisation</target>
+
<source>About</source>
<target>A propos de</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>Choisir un intervalle de temps</target>
-<source>Show pop-up</source>
-<target>Montrer les boîtes de dialogue</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Montrer les messages d'avertissement ou d'erreur</target>
-
-<source>Ignore errors</source>
-<target>Ignorer les erreurs</target>
-
-<source>Hide all error and warning messages</source>
-<target>Masquer tous les messages d'erreurs et les avertissements</target>
-
-<source>Exit instantly</source>
-<target>Sortie immédiate</target>
-
-<source>Abort synchronization immediately</source>
-<target>Abandon immédiat de la synchronisation</target>
-
-<source>Browse</source>
-<target>Parcourir</target>
-
<source>Invalid command line:</source>
<target>Ligne de commande incorrecte :</target>
@@ -235,8 +223,8 @@
<source>&Open...</source>
<target>&Ouvrir...</target>
-<source>Save &As...</source>
-<target>&Enregistrer sous ...</target>
+<source>Save &as...</source>
+<target>S&auvegarder sous...</target>
<source>&Quit</source>
<target>&Quitter</target>
@@ -266,7 +254,7 @@
<target>3. Cliquez sur 'Démarrer'.</target>
<source>To get started just import a .ffs_batch file.</source>
-<target>Pour démarrer il faur importer un fichier .ffs_batch.</target>
+<target>Pour démarrer, il faut importer un fichier .ffs_batch.</target>
<source>Folders to watch</source>
<target>Dossiers à examiner</target>
@@ -277,6 +265,9 @@
<source>Remove folder</source>
<target>Supprimer le dossier</target>
+<source>Browse</source>
+<target>Parcourir</target>
+
<source>Select a folder</source>
<target>Choisissez un dossier</target>
@@ -309,8 +300,8 @@ La commande est déclenchée si :
<source>Cancel</source>
<target>Annuler</target>
-<source>(Build: %x)</source>
-<target>(Généré : %x)</target>
+<source>Build: %x</source>
+<target>Généré : %x</target>
<source>All files</source>
<target>Tous les fichiers</target>
@@ -330,9 +321,6 @@ La commande est déclenchée si :
<source>A folder input field is empty.</source>
<target>Une entrée dossier est vide.</target>
-<source>Logging</source>
-<target>Connexion</target>
-
<source>File time and size</source>
<target>Heure et taille du fichier</target>
@@ -354,21 +342,6 @@ La commande est déclenchée si :
<source>FreeFileSync batch</source>
<target>FreeFileSync batch</target>
-<source>Batch execution</source>
-<target>Exécution du traitement batch</target>
-
-<source>Items processed:</source>
-<target>Elements traités :</target>
-
-<source>Items remaining:</source>
-<target>Elements restants :</target>
-
-<source>Total time:</source>
-<target>Durée totale :</target>
-
-<source>Stop</source>
-<target>Arrêt</target>
-
<source>Synchronization aborted!</source>
<target>Synchronisation abandonnée !</target>
@@ -528,11 +501,11 @@ La commande est déclenchée si :
<source>Last used configurations (press DEL to remove from list)</source>
<target>Dernière configuration utilisée (Appuyez sur SUPPR pour l'enlever de la liste)</target>
-<source>Hide excluded items</source>
-<target>Masquer les éléments exclus</target>
+<source>Show excluded items</source>
+<target>Afficher les éléments exclus</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Masquer les fichiers filtrés ou exclus temporairement</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Afficher les fichiers filtrés ou temporairement exclus</target>
<source>Number of files and folders that will be created</source>
<target>Nombre de fichiers et de dossiers qui seront créés</target>
@@ -562,7 +535,7 @@ La commande est déclenchée si :
<target>Traitement batch</target>
<source>Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe <job name>.ffs_batch</source>
-<target>Créer un fichier batch pour automatiser la synchronisation. Double-cliquez sur ce fichier ou entrez-le dans le plannificateur de tâches : FreeFileSync.exe <job name>.ffs_batch</target>
+<target>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 <job name>.ffs_batch</target>
<source>Help</source>
<target>Aide</target>
@@ -576,29 +549,86 @@ La commande est déclenchée si :
<source>Right</source>
<target>Droite</target>
-<source>Status feedback</source>
-<target>Retour d'informations</target>
+<source>Error handling</source>
+<target>Erreur de gestion de fichiers</target>
+
+<source>Ignore</source>
+<target>Ignorer</target>
+
+<source>Hide all error and warning messages</source>
+<target>Masquer tous les messages d'erreurs et les avertissements</target>
+
+<source>Pop-up</source>
+<target>Pop-up</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Montrer les messages d'avertissement ou d'erreur</target>
+
+<source>Exit</source>
+<target>Quitter</target>
+
+<source>Abort synchronization on first error</source>
+<target>Abandonner la synchronisation dès la première erreur</target>
+
+<source>On completion:</source>
+<target>A la fin :</target>
<source>Show progress dialog</source>
<target>Montrer la fenêtre de progression</target>
-<source>Error handling</source>
-<target>Erreur de gestion de fichiers</target>
+<source>Generate log file</source>
+<target>Créer le fichier log</target>
+
+<source>Select folder to save log files</source>
+<target>Choisir le dossier de sauvegarde des fichiers log</target>
-<source>Maximum number of log files:</source>
-<target>Nombre maximum de fichiers Log</target>
+<source>Limit</source>
+<target>Limite</target>
-<source>Select folder to save log files:</source>
-<target>Choisissez un dossier pour sauvegarder les fichiers log :</target>
+<source>Limit maximum number of log files</source>
+<target>Nombre maximal de fichiers log</target>
<source>Batch settings</source>
<target>Configuration du traitement batch</target>
+<source>Compare by...</source>
+<target>Comparaison par...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Les fichiers sont considérés comme identiques si
+ - la date et l'heure de modification
+ - la taille des fichiers
+sont les mêmes
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Les fichiers sont considérés comme identiques si
+ - leur contenu
+est identique
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Gestion des Liens Symboliques</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Choisissez une variante :</target>
<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source>
-<target>Identifie et propage les modifications des deux côtés à l'aide d'une base de données. Les suppressions, renommage et conflits sont détectés automatiquement.</target>
+<target>Identifie et propage les modifications des deux côtés à l'aide d'une base de données. Les suppressions, renommages et conflits sont détectés automatiquement.</target>
<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
<target>Copie miroir du dossier de gauche. Le dossier de droite est modifié pour être strictement identique après la synchronisation.</target>
@@ -612,8 +642,26 @@ La commande est déclenchée si :
<source>Deletion handling</source>
<target>Gestion des suppressions</target>
-<source>On completion:</source>
-<target>A la fin :</target>
+<source>Permanent</source>
+<target>Permanent</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Supprimer ou écraser les fichiers définitivement</target>
+
+<source>Recycle Bin</source>
+<target>Corbeille</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier</target>
+
+<source>Versioning</source>
+<target>Gestion des versions</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Déplacer les fichiers horodatés dans le dossier spécifié</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Nombre maximal de versions par fichier</target>
<source>Configuration</source>
<target>Configuration</target>
@@ -636,39 +684,6 @@ La commande est déclenchée si :
<source>Conflict/item cannot be categorized</source>
<target>Conflit/élément impossible à classer</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Comparaison par...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Les fichiers sont considérés comme identiques si
- - la date et l'heure de modification
- - la taille des fichiers
-sont les mêmes
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Les fichiers sont considérés comme identiques si
- - leur contenu
-est identique
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Gestion des Liens Symboliques</target>
-
<source>Synchronizing...</source>
<target>Synchronisation en cours...</target>
@@ -684,8 +699,8 @@ est identique
<source>Donate with PayPal</source>
<target>Faites un don avec PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Pour les traductions de FreeFileSync, un grand merci à :</target>
+<source>Many thanks for localization:</source>
+<target>Un grand merci pour la traduction à :</target>
<source>Feedback and suggestions are welcome</source>
<target>Vos commentaires et vos suggestions sont les bienvenus</target>
@@ -702,9 +717,6 @@ est identique
<source>Published under the GNU General Public License</source>
<target>Publié sous licence GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>Utiliser la Corbeille</target>
-
<source>Delete on both sides</source>
<target>Suppression des deux côtés</target>
@@ -745,7 +757,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<target>Copie de fichiers sécurisé</target>
<source>Write to a temporary file (*.ffs_tmp) first then rename it. This guarantees a consistent state even in case of fatal error.</source>
-<target>Ecrit d'abord dans un fichier temporaire (*.ffs_tmp), puis le renomme. Ceci guarantit la cohérence des données même en cas d'erreur fatale.</target>
+<target>Ecrit d'abord dans un fichier temporaire (*.ffs_tmp), puis le renomme. Ceci garantit la cohérence des données même en cas d'erreur fatale.</target>
<source>Copy locked files</source>
<target>Copier les fichiers verrouillés</target>
@@ -774,8 +786,8 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Statistics</source>
<target>Statistiques</target>
-<source>Do not show this dialog again</source>
-<target>Ne plus afficher ce message la prochaine fois</target>
+<source>Don't show this dialog again</source>
+<target>Ne plus afficher cette boîte de dialogue</target>
<source>Find what:</source>
<target>Chercher cela :</target>
@@ -826,7 +838,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<target>Exclure tout</target>
<source>Show icons:</source>
-<target>Afficher les icones :</target>
+<target>Afficher les icônes :</target>
<source>Small</source>
<target>Petit</target>
@@ -856,13 +868,10 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<target>Ne jamais enregistrer les modifications</target>
<source>Do you want to save changes to %x?</source>
-<target>Voulez-vous enregistrer les midifications dans %x ?</target>
-
-<source>Save</source>
-<target>Sauvegarder</target>
+<target>Voulez-vous enregistrer les modifications dans %x ?</target>
-<source>Don't Save</source>
-<target>Ne pas sauvegarder</target>
+<source>Do&n't save</source>
+<target>&Ne pas Sauvegarder</target>
<source>Configuration loaded!</source>
<target>Configuration chargée !</target>
@@ -954,8 +963,8 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Show files that won't be copied</source>
<target>Afficher les fichiers qui ne seront pas copiés</target>
-<source>All directories in sync!</source>
-<target>Tous les répertoires sont synchronisés !</target>
+<source>All folders are in sync!</source>
+<target>Tous les dossiers sont synchronisés !</target>
<source>Comma separated list</source>
<target>Liste d'éléments séparés par une virgule</target>
@@ -971,7 +980,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<pluralform>%x objects deleted successfully!</pluralform>
</source>
<target>
-<pluralform>Objet supprimé avec suucès!</pluralform>
+<pluralform>Objet supprimé avec succès !</pluralform>
<pluralform>%x objets supprimés avec succès!</pluralform>
</target>
@@ -1044,6 +1053,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Pause</source>
<target>Pause</target>
+<source>Logging</source>
+<target>Connexion</target>
+
<source>Cannot find %x</source>
<target>Impossible de trouver %x</target>
@@ -1125,21 +1137,6 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Leave as unresolved conflict</source>
<target>Abandonner en tant que conflit non résolu</target>
-<source>Delete permanently</source>
-<target>Suppression définitive</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Supprimer ou écraser les fichiers définitivement</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Utiliser la Corbeille lors de la suppression ou du remplacement d'un fichier</target>
-
-<source>Versioning</source>
-<target>Gestion des versions</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Déplacer les fichiers dans un sous-dossier horodaté</target>
-
<source>Files</source>
<target>Fichiers</target>
@@ -1230,8 +1227,11 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Cannot copy file %x to %y.</source>
<target>Impossible de copier le fichier %X vers %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Impossible de lire le répertoire %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Impossible d'ouvrir le répertoire %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Impossible de parcourir le répertoire %x.</target>
<source>Detected endless directory recursion.</source>
<target>Une boucle sans fin détectée dans un répertoire.</target>
@@ -1257,6 +1257,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Directions de la synchronisation par défaut : les anciens fichiers seront remplacés par les nouveaux.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>La corbeille n'est pas valable pour les chemins suivants ! Les fichiers seront détruits définitivement :</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Vous pouvez ignorer cette erreur en considérant le dossier comme vide.</target>
@@ -1266,6 +1269,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Les répertoires sont imbriqués ! Attention à la mise à jour des règles de synchronisation :</target>
+<source>Start comparison</source>
+<target>Démarrer la comparaison</target>
+
<source>Preparing synchronization...</source>
<target>Synchronisation en cours de préparation ...</target>
@@ -1278,6 +1284,9 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Files %x have the same date but a different size!</source>
<target>Les fichiers %x ont la même date mais une taille différente !</target>
+<source>Items differ in attributes only</source>
+<target>Seuls les attributs des éléments diffèrent</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Le lien symbolique %x a la même date mais pas la même cible.</target>
@@ -1293,9 +1302,6 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Both sides are equal</source>
<target>Les deux cotés sont identiques</target>
-<source>Items have different attributes</source>
-<target>Les éléments ont des attributs différents</target>
-
<source>Copy new item to left</source>
<target>Copie du nouvel élément à gauche</target>
@@ -1339,7 +1345,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<target>Suppression du dossier %x</target>
<source>Deleting symbolic link %x</source>
-<target>Suppression du lien symbomique %x</target>
+<target>Suppression du lien symbolique %x</target>
<source>Moving file %x to recycle bin</source>
<target>Envoi du fichier %x dans la corbeille</target>
@@ -1372,7 +1378,7 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<target>Remplacement du fichier %x</target>
<source>Overwriting symbolic link %x</source>
-<target>Remplacement du lien symbomique %x</target>
+<target>Remplacement du lien symbolique %x</target>
<source>Verifying file %x</source>
<target>Contrôle du fichier %x</target>
@@ -1410,14 +1416,11 @@ Attention : les noms de fichiers doivent être relatifs aux répertoires de base
<source>Available:</source>
<target>Disponible :</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>La corbeille n'est pas valable pour les chemins suivants ! Les fichiers seront détruits définitivement :</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Un dossier faisant partie de paires multiples sera modifié. Veuillez vérifier les paramètres de synchronisation.</target>
-<source>Processing folder pair:</source>
-<target>Traitement de la paire de dossiers :</target>
+<source>Synchronizing folder pair:</source>
+<target>Synchronisation de la paire de dossiers</target>
<source>Target folder %x already existing.</source>
<target>Le dossier destination %x existe déjà.</target>
diff --git a/BUILD/Languages/german.lng b/BUILD/Languages/german.lng
index ddcb4832..d142df24 100644
--- a/BUILD/Languages/german.lng
+++ b/BUILD/Languages/german.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Suche Ordner %x...</target>
-<source>Batch execution</source>
-<target>Batchlauf</target>
-
<source>Items processed:</source>
<target>Verarbeitete Elemente:</target>
@@ -34,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Abbruch initiiert: Warte, bis aktuelle Operation beendet ist...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target>Der Zeitstempel für die Versionierung kann nicht erstellt werden:</target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automatisierte Synchronisation</target>
@@ -61,12 +61,12 @@
<source>Create a batch job</source>
<target>Batch-Job erstellen</target>
-<source>Synchronization settings</source>
-<target>Synchronisationseinstellungen</target>
-
<source>Comparison settings</source>
<target>Vergleichseinstellungen</target>
+<source>Synchronization settings</source>
+<target>Synchronisationseinstellungen</target>
+
<source>About</source>
<target>Ãœber</target>
@@ -88,27 +88,6 @@
<source>Select time span</source>
<target>Zeitspanne auswählen</target>
-<source>Show pop-up</source>
-<target>Pop-up zeigen</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target>
-
-<source>Ignore errors</source>
-<target>Fehler ignorieren</target>
-
-<source>Hide all error and warning messages</source>
-<target>Alle Fehler- und Warnmeldungen unterdrücken</target>
-
-<source>Exit instantly</source>
-<target>Sofort beenden</target>
-
-<source>Abort synchronization immediately</source>
-<target>Synchronisation sofort abbrechen</target>
-
-<source>Browse</source>
-<target>Auswählen</target>
-
<source>Invalid command line:</source>
<target>Ungültige Befehlszeile:</target>
@@ -247,7 +226,7 @@
<source>&Open...</source>
<target>Ö&ffnen...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>Speichern &unter...</target>
<source>&Quit</source>
@@ -289,6 +268,9 @@
<source>Remove folder</source>
<target>Ordner entfernen</target>
+<source>Browse</source>
+<target>Auswählen</target>
+
<source>Select a folder</source>
<target>Ordner auswählen</target>
@@ -321,8 +303,8 @@ Die Befehlszeile wird ausgelöst wenn:
<source>Cancel</source>
<target>Abbrechen</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Build: %x</target>
<source>All files</source>
<target>Alle Dateien</target>
@@ -342,9 +324,6 @@ Die Befehlszeile wird ausgelöst wenn:
<source>A folder input field is empty.</source>
<target>Ein Ordnereingabefeld ist leer.</target>
-<source>Logging</source>
-<target>Protokoll</target>
-
<source>File time and size</source>
<target>Datum und Größe</target>
@@ -379,7 +358,7 @@ Die Befehlszeile wird ausgelöst wenn:
<target>Synchronisation erfolgreich abgeschlossen!</target>
<source>Press "Switch" to resolve issues in FreeFileSync main dialog.</source>
-<target>Drücken Sie "Wechseln", um die Probleme in FreeFileSyncs Hauptdialog zu bearbeiten.</target>
+<target>Drücken Sie "Wechseln", um die Probleme in FreeFileSyncs Hauptdialog zu beheben.</target>
<source>Switching to FreeFileSync main dialog...</source>
<target>Wechsle in FreeFileSyncs Hauptdialog...</target>
@@ -525,11 +504,11 @@ Die Befehlszeile wird ausgelöst wenn:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Zuletzt benutzte Konfigurationen (Entf-Taste löscht Einträge)</target>
-<source>Hide excluded items</source>
-<target>Ausgeschlossene Elemente verstecken</target>
+<source>Show excluded items</source>
+<target>Ausgeschlossene Elemente anzeigen</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Gefilterte oder temporär ausgeschlossene Dateien ausblenden</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Gefilterte oder temporär ausgeschlossene Dateien zeigen</target>
<source>Number of files and folders that will be created</source>
<target>Anzahl der zu erstellenden Dateien und Ordner</target>
@@ -573,68 +552,47 @@ Die Befehlszeile wird ausgelöst wenn:
<source>Right</source>
<target>Rechts</target>
-<source>Status feedback</source>
-<target>Statusrückmeldung</target>
-
-<source>Show progress dialog</source>
-<target>Zeige Fortschrittsdialog</target>
-
<source>Error handling</source>
<target>Fehlerbehandlung</target>
-<source>Maximum number of log files:</source>
-<target>Maximale Anzahl an Logdateien:</target>
-
-<source>Select folder to save log files:</source>
-<target>Ordner zum Sichern der Logdateien wählen:</target>
-
-<source>Batch settings</source>
-<target>Batch Einstellungen</target>
-
-<source>Select variant:</source>
-<target>Variante auswählen:</target>
+<source>Ignore</source>
+<target>Ignorieren</target>
-<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source>
-<target>Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen, Umbenennungen und Konflikte werden automatisch erkannt.</target>
+<source>Hide all error and warning messages</source>
+<target>Alle Fehler- und Warnmeldungen unterdrücken</target>
-<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
-<target>Spiegelkopie des linken Ordners erstellen. Der rechte Ordner wird dem linken exakt angeglichen.</target>
+<source>Pop-up</source>
+<target>Nachfragen</target>
-<source>Copy new or updated files to right folder.</source>
-<target>Neue oder aktualisierte Dateien vom linken in den rechten Ordner kopieren.</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Ein Auswahlfenster bei Fehlern oder Warnungen anzeigen</target>
-<source>Configure your own synchronization rules.</source>
-<target>Eigene Synchronisationsregeln definieren.</target>
+<source>Exit</source>
+<target>Beenden</target>
-<source>Deletion handling</source>
-<target>Behandlung von Löschungen</target>
+<source>Abort synchronization on first error</source>
+<target>Synchronisation beim ersten Fehler abbrechen</target>
<source>On completion:</source>
<target>Nach Abschluss:</target>
-<source>Configuration</source>
-<target>Konfiguration</target>
-
-<source>Item exists on left side only</source>
-<target>Element existiert nur links</target>
-
-<source>Item exists on right side only</source>
-<target>Element existiert nur rechts</target>
+<source>Show progress dialog</source>
+<target>Fortschrittsdialog zeigen</target>
-<source>Left side is newer</source>
-<target>Linke Seite ist neuer</target>
+<source>Generate log file</source>
+<target>Logdatei erzeugen</target>
-<source>Right side is newer</source>
-<target>Rechte Seite ist neuer</target>
+<source>Select folder to save log files</source>
+<target>Ordner zum speichern der Logdateien wählen</target>
-<source>Items have different content</source>
-<target>Elemente haben unterschiedlichen Inhalt</target>
+<source>Limit</source>
+<target>Limit</target>
-<source>Conflict/item cannot be categorized</source>
-<target>Konflikt/Element, das nicht eingeordnet werden kann</target>
+<source>Limit maximum number of log files</source>
+<target>Maximale Anzahl von Logdateien begrenzen</target>
-<source>OK</source>
-<target>OK</target>
+<source>Batch settings</source>
+<target>Batch Einstellungen</target>
<source>Compare by...</source>
<target>Vergleichen nach...</target>
@@ -666,6 +624,69 @@ gleich ist
<source>Symbolic Link handling</source>
<target>Behandlung Symbolischer Links</target>
+<source>OK</source>
+<target>OK</target>
+
+<source>Select variant:</source>
+<target>Variante auswählen:</target>
+
+<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source>
+<target>Identifiziere und propagiere Änderungen auf beiden Seiten mit Hilfe einer Datenbank. Löschungen, Umbenennungen und Konflikte werden automatisch erkannt.</target>
+
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Spiegelkopie des linken Ordners erstellen. Der rechte Ordner wird dem linken exakt angeglichen.</target>
+
+<source>Copy new or updated files to right folder.</source>
+<target>Neue oder aktualisierte Dateien in den rechten Ordner kopieren.</target>
+
+<source>Configure your own synchronization rules.</source>
+<target>Eigene Synchronisationsregeln definieren.</target>
+
+<source>Deletion handling</source>
+<target>Behandlung von Löschungen</target>
+
+<source>Permanent</source>
+<target>Endgültig</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Dateien endgültig löschen oder überschreiben</target>
+
+<source>Recycle Bin</source>
+<target>Papierkorb</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Papierkorb für zu löschende oder zu überschreibende Dateien nutzen</target>
+
+<source>Versioning</source>
+<target>Versionierung</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Dateien mit Zeitstempel in den angegebenen Ordner verschieben</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Maximale Anzahl von Versionen pro Datei begrenzen</target>
+
+<source>Configuration</source>
+<target>Konfiguration</target>
+
+<source>Item exists on left side only</source>
+<target>Element existiert nur links</target>
+
+<source>Item exists on right side only</source>
+<target>Element existiert nur rechts</target>
+
+<source>Left side is newer</source>
+<target>Linke Seite ist neuer</target>
+
+<source>Right side is newer</source>
+<target>Rechte Seite ist neuer</target>
+
+<source>Items have different content</source>
+<target>Elemente haben unterschiedlichen Inhalt</target>
+
+<source>Conflict/item cannot be categorized</source>
+<target>Konflikt/Element, das nicht eingeordnet werden kann</target>
+
<source>Synchronizing...</source>
<target>Synchronisiere...</target>
@@ -681,8 +702,8 @@ gleich ist
<source>Donate with PayPal</source>
<target>Mit PayPal spenden</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Vielen Dank für die Lokalisation von FreeFileSync an:</target>
+<source>Many thanks for localization:</source>
+<target>Vielen Dank für die Lokalisation:</target>
<source>Feedback and suggestions are welcome</source>
<target>Feedback und Vorschläge sind willkommen</target>
@@ -699,9 +720,6 @@ gleich ist
<source>Published under the GNU General Public License</source>
<target>Veröffentlicht unter der Allgemeinen Öffentlichen GNU-Lizenz</target>
-<source>Use Recycle Bin</source>
-<target>Papierkorb verwenden</target>
-
<source>Delete on both sides</source>
<target>Auf beiden Seiten löschen</target>
@@ -771,7 +789,7 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>Statistics</source>
<target>Statistiken</target>
-<source>Do not show this dialog again</source>
+<source>Don't show this dialog again</source>
<target>Diesen Dialog nicht mehr anzeigen</target>
<source>Find what:</source>
@@ -855,11 +873,8 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>Do you want to save changes to %x?</source>
<target>Möchten Sie die Änderungen an %x speichern?</target>
-<source>Save</source>
-<target>Speichern</target>
-
-<source>Don't Save</source>
-<target>Nicht speichern</target>
+<source>Do&n't save</source>
+<target>&Nicht speichern</target>
<source>Configuration loaded!</source>
<target>Konfiguration geladen!</target>
@@ -951,8 +966,8 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>Show files that won't be copied</source>
<target>Dateien die nicht kopiert werden anzeigen</target>
-<source>All directories in sync!</source>
-<target>Alle Verzeichnisse sind synchron!</target>
+<source>All folders are in sync!</source>
+<target>Alle Ordner sind synchron!</target>
<source>Comma separated list</source>
<target>Kommagetrennte Liste</target>
@@ -1041,6 +1056,9 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>Pause</source>
<target>Pause</target>
+<source>Logging</source>
+<target>Protokoll</target>
+
<source>Cannot find %x</source>
<target>%x wurde nicht gefunden.</target>
@@ -1092,11 +1110,11 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>- folder part only</source>
<target>- nur Ordneranteil</target>
-<source>- Other side's counterpart to %name</source>
-<target>- Entsprechung der anderen Seite zu %name</target>
+<source>- Other side's counterpart to %item_path%</source>
+<target>- Entsprechung der anderen Seite zu %item_path%</target>
-<source>- Other side's counterpart to %dir</source>
-<target>- Entsprechung der anderen Seite zu %dir</target>
+<source>- Other side's counterpart to %item_folder%</source>
+<target>- Entsprechung der anderen Seite zu %item_folder%</target>
<source>Make hidden dialogs and warning messages visible again?</source>
<target>Versteckte Dialoge und Warnungen wieder sichtbar machen?</target>
@@ -1122,21 +1140,6 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>Leave as unresolved conflict</source>
<target>Als unbehandelten Konflikt belassen</target>
-<source>Delete permanently</source>
-<target>Endgültig löschen</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Dateien endgültig löschen oder überschreiben</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Papierkorb für zu löschende oder zu überschreibende Dateien nutzen</target>
-
-<source>Versioning</source>
-<target>Versionierung</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Verschiebe Dateien in einen Unterordner mit Zeitstempel</target>
-
<source>Files</source>
<target>Dateien</target>
@@ -1227,8 +1230,11 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>Cannot copy file %x to %y.</source>
<target>Die Datei %x kann nicht nach %y kopiert werden.</target>
-<source>Cannot read directory %x.</source>
-<target>Das Verzeichnis %x kann nicht gelesen werden.</target>
+<source>Cannot open directory %x.</source>
+<target>Das Verzeichnis %x kann nicht geöffnet werden.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Das Verzeichnis %x kann nicht gelistet werden.</target>
<source>Detected endless directory recursion.</source>
<target>Eine endlose Verzeichnisrekursion wurde erkannt.</target>
@@ -1281,8 +1287,8 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>Files %x have the same date but a different size!</source>
<target>Die Dateien %x haben dasselbe Datum, aber unterschiedliche Größen!</target>
-<source>Items have different attributes</source>
-<target>Die Elemente haben unterschiedliche Attribute</target>
+<source>Items differ in attributes only</source>
+<target>Die Elemente unterscheiden sich nur in Attributen</target>
<source>Symbolic links %x have the same date but a different target.</source>
<target>Die Symbolischen Links %x haben dasselbe Datum, aber ein unterschiedliches Ziel.</target>
@@ -1362,6 +1368,9 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>Moving symbolic link %x to %y</source>
<target>Verschiebe Symbolischen Link %x nach %y</target>
+<source>Removing old versions...</source>
+<target>Entferne alte Versionen...</target>
+
<source>Creating file %x</source>
<target>Erstelle Datei %x</target>
@@ -1416,7 +1425,7 @@ Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Ein Ordner wird verändert werden, der Teil mehrerer Ordnerpaare ist. Bitte überprüfen Sie die Synchronisationseinstellungen.</target>
-<source>Synchronize folder pair:</source>
+<source>Synchronizing folder pair:</source>
<target>Synchronisiere Ordnerpaar:</target>
<source>Target folder %x already existing.</source>
diff --git a/BUILD/Languages/greek.lng b/BUILD/Languages/greek.lng
index f75accaf..ed8e6f27 100644
--- a/BUILD/Languages/greek.lng
+++ b/BUILD/Languages/greek.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>Αναζήτηση του υποκαταλόγου %x...</target>
+<source>Items processed:</source>
+<target>ΕπεξεÏγάστηκαν στοιχεία:</target>
+
+<source>Items remaining:</source>
+<target>ΠεÏισσεÏουν στοιχεία:</target>
+
+<source>Total time:</source>
+<target>Συνολική διάÏκεια:</target>
+
<source>Show in Explorer</source>
<target>Εμφάνιση στην ΕξεÏεÏνηση</target>
@@ -22,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Ζητήθηκε ματαίωση: Αναμονή για την λήξη της Ï„Ïέχουσας εÏγασίας...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Αυτοματοποιημένος ΣυγχÏονισμός</target>
@@ -49,12 +61,12 @@
<source>Create a batch job</source>
<target>ΔημιουÏγία μιας δέσμης ενεÏγειών</target>
-<source>Synchronization settings</source>
-<target>Ρυθμίσεις συγχÏονισμοÏ</target>
-
<source>Comparison settings</source>
<target>Ρυθμίσεις σÏγκÏισης</target>
+<source>Synchronization settings</source>
+<target>Ρυθμίσεις συγχÏονισμοÏ</target>
+
<source>About</source>
<target>Σχετικά με το...</target>
@@ -76,27 +88,6 @@
<source>Select time span</source>
<target>Επιλογή χÏÎ¿Î½Î¹ÎºÎ¿Ï Î´Î¹Î±ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚</target>
-<source>Show pop-up</source>
-<target>Εμφάνιση αναδυόμενου παÏάθυÏου</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Εμφάνιση αναδυόμενου παÏάθυÏου σε σφάλματα ή Ï€Ïοειδοποιήσεις</target>
-
-<source>Ignore errors</source>
-<target>ΠαÏάβλεψη των σφαλμάτων</target>
-
-<source>Hide all error and warning messages</source>
-<target>ΑπόκÏυψη όλων των σφαλμάτων και Ï€Ïοειδοποιήσεων</target>
-
-<source>Exit instantly</source>
-<target>Άμεση έξοδος</target>
-
-<source>Abort synchronization immediately</source>
-<target>Άμεση ματαίωση του συγχÏονισμοÏ</target>
-
-<source>Browse</source>
-<target>Αναζήτηση</target>
-
<source>Invalid command line:</source>
<target>Σφάλμα στη γÏαμμή εντολών:</target>
@@ -235,8 +226,8 @@
<source>&Open...</source>
<target>Ά&νοιγμα...</target>
-<source>Save &As...</source>
-<target>Αποθή&κευση ως...</target>
+<source>Save &as...</source>
+<target>Απο&θήκευση ως...</target>
<source>&Quit</source>
<target>Έ&ξοδος</target>
@@ -277,6 +268,9 @@
<source>Remove folder</source>
<target>ΔιαγÏαφή του υποκαταλόγου</target>
+<source>Browse</source>
+<target>Αναζήτηση</target>
+
<source>Select a folder</source>
<target>Επιλογή υποκαταλόγου</target>
@@ -309,8 +303,8 @@ The command is triggered if:
<source>Cancel</source>
<target>ΆκυÏο</target>
-<source>(Build: %x)</source>
-<target>(ΔημιουÏγήθηκε : %x)</target>
+<source>Build: %x</source>
+<target>ΔημιουÏγήθηκε : %x</target>
<source>All files</source>
<target>Όλα τα αÏχεία</target>
@@ -330,9 +324,6 @@ The command is triggered if:
<source>A folder input field is empty.</source>
<target>Ένα πεδίο εισαγωγής υποκαταλόγων είναι άδειο.</target>
-<source>Logging</source>
-<target>ΚαταγÏαφή μηνυμάτων</target>
-
<source>File time and size</source>
<target>ΗμεÏομηνία και μέγεθος αÏχείων</target>
@@ -354,21 +345,6 @@ The command is triggered if:
<source>FreeFileSync batch</source>
<target>Δέσμη ενεÏγειών του FreeFileSync</target>
-<source>Batch execution</source>
-<target>Εκτέλεση δέσμης ενεÏγειών</target>
-
-<source>Items processed:</source>
-<target>ΕπεξεÏγάστηκαν στοιχεία:</target>
-
-<source>Items remaining:</source>
-<target>ΠεÏισσεÏουν στοιχεία:</target>
-
-<source>Total time:</source>
-<target>Συνολική διάÏκεια:</target>
-
-<source>Stop</source>
-<target>Λήξη</target>
-
<source>Synchronization aborted!</source>
<target>Ο συγχÏονισμός ματαιώθηκε!</target>
@@ -528,11 +504,11 @@ The command is triggered if:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Διατάξεις που χÏησιμοποιήθηκαν τελευταία (πατήστε DEL για διαγÏαφή από τη λίστα)</target>
-<source>Hide excluded items</source>
-<target>ΑπόκÏυψη των εξαιÏεθέντων στοιχείων</target>
+<source>Show excluded items</source>
+<target>Εμφάνιση εξαιÏεθέντων στοιχείων</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>ΑπόκÏυψη των αÏχείων που φιλτÏαÏίστηκαν ή εξαιÏέθηκαν Ï€ÏοσωÏινά</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Εμφάνιση φιλτÏαÏισμένων ή Ï€ÏοσωÏινά εξαιÏεθέντων αÏχείων</target>
<source>Number of files and folders that will be created</source>
<target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα δημιουÏγηθοÏν</target>
@@ -576,24 +552,81 @@ The command is triggered if:
<source>Right</source>
<target>Δεξιά</target>
-<source>Status feedback</source>
-<target>ΑναφοÏά κατάστασης</target>
+<source>Error handling</source>
+<target>ΔιαχείÏιση σφαλμάτων</target>
+
+<source>Ignore</source>
+<target>ΠαÏάβλεψη</target>
+
+<source>Hide all error and warning messages</source>
+<target>ΑπόκÏυψη όλων των σφαλμάτων και Ï€Ïοειδοποιήσεων</target>
+
+<source>Pop-up</source>
+<target>Αναδυόμενο μήνυμα</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Εμφάνιση αναδυόμενου παÏάθυÏου σε σφάλματα ή Ï€Ïοειδοποιήσεις</target>
+
+<source>Exit</source>
+<target>Έξοδος</target>
+
+<source>Abort synchronization on first error</source>
+<target>Ματαίωση του συγχÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Î¼Îµ το Ï€Ïώτο σφάλμα</target>
+
+<source>On completion:</source>
+<target>Μετά την ολοκλήÏωση:</target>
<source>Show progress dialog</source>
<target>Εμφάνιση της αναφοÏάς Ï€Ïοόδου</target>
-<source>Error handling</source>
-<target>ΔιαχείÏιση σφαλμάτων</target>
+<source>Generate log file</source>
+<target>ΔημιουÏγία αÏχείων καταγÏαφής</target>
-<source>Maximum number of log files:</source>
-<target>Μέγιστος αÏιθμός αÏχείων καταγÏαφής:</target>
+<source>Select folder to save log files</source>
+<target>Επιλογή υποκαταλόγου για την αποθήκευση των αÏχείων καταγÏαφής</target>
-<source>Select folder to save log files:</source>
-<target>Επιλέξτε τον υποκατάλογο όπου θα αποθηκευτοÏν τα αÏχεία καταγÏαφής:</target>
+<source>Limit</source>
+<target>ΑÏιθμός εκδόσεων</target>
+
+<source>Limit maximum number of log files</source>
+<target>Μέγιστος αÏιθμός αÏχείων καταγÏαφής</target>
<source>Batch settings</source>
<target>Ρυθμίσεις δέσμης ενεÏγειών</target>
+<source>Compare by...</source>
+<target>ΣÏγκÏιση με βάση το...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Τα αÏχεία θεωÏοÏνται ίδια εάν
+ - η ημεÏομηνία και ÏŽÏα τελευταίας Ï„Ïοποποίησης
+ - το μέγεθός τους
+είναι ίδια
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Τα αÏχεία θεωÏοÏνται ίδια, εάν
+ - το πεÏιεχόμενό τους
+είναι ίδιο
+</target>
+
+<source>Symbolic Link handling</source>
+<target>ΤÏόπος διαχείÏισης των συμβολικών δεσμών</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Επιλέξτε μια μέθοδο:</target>
@@ -610,10 +643,28 @@ The command is triggered if:
<target>ΟÏίστε τους δικοÏÏ‚ σας κανόνες συγχÏονισμοÏ.</target>
<source>Deletion handling</source>
-<target>ΔιαχείÏιση των διαγÏαφών</target>
+<target>ΔιαγÏαφή των αÏχείων</target>
-<source>On completion:</source>
-<target>Μετά την ολοκλήÏωση:</target>
+<source>Permanent</source>
+<target>Μόνιμα</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Μόνιμη διαγÏαφή ή αντικατάσταση των αÏχείων</target>
+
+<source>Recycle Bin</source>
+<target>Κάδος ΑνακÏκλωσης</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>ΧÏήση του Κάδου ΑνακÏκλωσης κατά τη διαγÏαφή ή αντικατάσταση αÏχείων</target>
+
+<source>Versioning</source>
+<target>ΔιατήÏηση παλιών εκδόσεων</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>ΜεταφοÏά χÏονοσημασμένων αÏχείων σε συγκεκÏιμένο υποκατάλογο</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>ΠεÏιοÏισμός του μέγιστου αÏÎ¹Î¸Î¼Î¿Ï ÎµÎºÎ´ÏŒÏƒÎµÏ‰Î½ ανά αÏχείο</target>
<source>Configuration</source>
<target>Διάταξη</target>
@@ -636,39 +687,6 @@ The command is triggered if:
<source>Conflict/item cannot be categorized</source>
<target>Διένεξη/το αντικείμενο δεν μποÏεί να κατηγοÏιοποιηθεί</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>ΣÏγκÏιση με βάση το...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Τα αÏχεία θεωÏοÏνται ίδια εάν
- - η ημεÏομηνία και ÏŽÏα τελευταίας Ï„Ïοποποίησης
- - το μέγεθός τους
-είναι ίδια
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Τα αÏχεία θεωÏοÏνται ίδια, εάν
- - το πεÏιεχόμενό τους
-είναι ίδιο
-</target>
-
-<source>Symbolic Link handling</source>
-<target>ΤÏόπος διαχείÏισης των συμβολικών δεσμών</target>
-
<source>Synchronizing...</source>
<target>Γίνεται συγχÏονισμός...</target>
@@ -684,8 +702,8 @@ is the same
<source>Donate with PayPal</source>
<target>Κάντε μια δωÏεά μέσω PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Για τις μεταφÏάσεις του FreeFileSync, ευχαÏιστοÏμε τους:</target>
+<source>Many thanks for localization:</source>
+<target>Πολλές ευχαÏιστίες για τις μεταφÏάσεις:</target>
<source>Feedback and suggestions are welcome</source>
<target>Τα σχόλια και οι Ï€Ïοτάσεις σας είναι ευπÏόσδεκτα</target>
@@ -702,9 +720,6 @@ is the same
<source>Published under the GNU General Public License</source>
<target>Διανέμεται υπό την Γενική Άδεια Δημόσιας ΧÏήσης GNU</target>
-<source>Use Recycle Bin</source>
-<target>ΧÏήση του Κάδου ΑνακÏκλωσης</target>
-
<source>Delete on both sides</source>
<target>ΔιαγÏαφή και στις δυο πλευÏές</target>
@@ -774,7 +789,7 @@ Note: File names must be relative to base directories!
<source>Statistics</source>
<target>Στατιστικά</target>
-<source>Do not show this dialog again</source>
+<source>Don't show this dialog again</source>
<target>Îα μην εμφανιστεί ξανά αυτό το μήνυμα</target>
<source>Find what:</source>
@@ -858,11 +873,8 @@ Note: File names must be relative to base directories!
<source>Do you want to save changes to %x?</source>
<target>Θέλετε να αποθηκεÏσετε τις αλλαγές στο %x;</target>
-<source>Save</source>
-<target>Αποθήκευση</target>
-
-<source>Don't Save</source>
-<target>ΧωÏίς αποθήκευση</target>
+<source>Do&n't save</source>
+<target>Îα &μην αποθηκευθοÏν</target>
<source>Configuration loaded!</source>
<target>Η διάταξη έχει ανοιχθεί!</target>
@@ -954,7 +966,7 @@ Note: File names must be relative to base directories!
<source>Show files that won't be copied</source>
<target>Εμφάνιση των αÏχείων που δε θα αντιγÏαφοÏν</target>
-<source>All directories in sync!</source>
+<source>All folders are in sync!</source>
<target>Όλοι οι υποκατάλογοι είναι συγχÏονισμένοι!</target>
<source>Comma separated list</source>
@@ -1044,6 +1056,9 @@ Note: File names must be relative to base directories!
<source>Pause</source>
<target>ΠαÏση</target>
+<source>Logging</source>
+<target>ΚαταγÏαφή μηνυμάτων</target>
+
<source>Cannot find %x</source>
<target>Δεν μποÏεί να βÏεθεί το %x</target>
@@ -1125,21 +1140,6 @@ Note: File names must be relative to base directories!
<source>Leave as unresolved conflict</source>
<target>ΠαÏάβλεψη ως ανεπίλυτη διένεξη</target>
-<source>Delete permanently</source>
-<target>Μόνιμη διαγÏαφή</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Μόνιμη διαγÏαφή ή αντικατάσταση των αÏχείων</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>ΧÏήση του Κάδου ΑνακÏκλωσης κατά τη διαγÏαφή ή αντικατάσταση αÏχείων</target>
-
-<source>Versioning</source>
-<target>ΔιατήÏηση παλιών εκδόσεων</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>ΜεταφοÏά αÏχείων σε υποκατάλογο με χÏονική πεÏιγÏαφή</target>
-
<source>Files</source>
<target>ΑÏχεία</target>
@@ -1230,8 +1230,11 @@ Note: File names must be relative to base directories!
<source>Cannot copy file %x to %y.</source>
<target>Δεν μποÏεί να αντιγÏαφεί το αÏχείο %x στο %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Δεν μποÏεί να αναγνωσθεί ο υποκατάλογος %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Δεν είναι δυνατό το άνοιγμα του υποκαταλόγου %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Δεν είναι δυνατή η καταλογογÏάφηση του υποκαταλόγου %x.</target>
<source>Detected endless directory recursion.</source>
<target>ΑνιχνεÏτηκε αέναος βÏόχος υποκαταλόγων.</target>
@@ -1240,7 +1243,7 @@ Note: File names must be relative to base directories!
<target>Τα δικαιώματα %x δεν μποÏοÏν να οÏιστοÏν.</target>
<source>Unable to move %x to the Recycle Bin!</source>
-<target>Το αÏχείο %x δεν μπόÏεσε να μεταφεÏθεί στον Κάδο ΑνακÏκλωσης!</target>
+<target>Το αÏχείο %x δεν ήταν δυνατό να μεταφεÏθεί στον Κάδο ΑνακÏκλωσης!</target>
<source>Both sides have changed since last synchronization!</source>
<target>Και οι δυο πλευÏές έχουν αλλάξει από τον τελευταίο συγχÏονισμό!</target>
@@ -1257,6 +1260,9 @@ Note: File names must be relative to base directories!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>ΡÏθμιση Ï€Ïοεπιλεγμένης κατεÏθυνσης συγχÏονισμοÏ: Τα νεότεÏα αÏχεία θα αντικαταστήσουν τα παλιότεÏα.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Ο Κάδος ΑνακÏκλωσης δεν είναι διαθέσιμος για τις ακόλουθες διαδÏομές! Τα αÏχεία θα διαγÏαφοÏν μόνιμα:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>ΜποÏείτε να αγνοήσετε αυτό το λάθος, για να θεωÏήσετε ότι ο υποκατάλογος είναι κενός.</target>
@@ -1266,6 +1272,9 @@ Note: File names must be relative to base directories!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Οι υποκατάλογοι είναι εξαÏτώμενοι. ΠÏοσοχή κατά την εισαγωγή των κανόνων συγχÏονισμοÏ:</target>
+<source>Start comparison</source>
+<target>ΈναÏξη σÏγκÏισης</target>
+
<source>Preparing synchronization...</source>
<target>ΠÏοετοιμασία του συγχÏονισμοÏ...</target>
@@ -1278,6 +1287,9 @@ Note: File names must be relative to base directories!
<source>Files %x have the same date but a different size!</source>
<target>Τα αÏχεία %x έχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό μέγεθος!</target>
+<source>Items differ in attributes only</source>
+<target>Τα στοιχεία διαφέÏουν μόνο ως Ï€Ïος τα χαÏακτηÏιστικά τους</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Οι συμβολικοί δεσμοί %x έχουν την ίδια ημεÏομηνία αλλά διαφοÏετικό Ï€ÏοοÏισμό.</target>
@@ -1293,9 +1305,6 @@ Note: File names must be relative to base directories!
<source>Both sides are equal</source>
<target>Οι δυο πλευÏές είναι ίδιες</target>
-<source>Items have different attributes</source>
-<target>Τα στοιχεία έχουν διαφοÏετικά χαÏακτηÏιστικά</target>
-
<source>Copy new item to left</source>
<target>ΑντιγÏαφή του νέου στοιχείου στα αÏιστεÏά</target>
@@ -1359,6 +1368,9 @@ Note: File names must be relative to base directories!
<source>Moving symbolic link %x to %y</source>
<target>ΜεταφοÏά του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï Î´ÎµÏƒÎ¼Î¿Ï %x στο %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>ΔημιουÏγία του αÏχείου %x</target>
@@ -1410,14 +1422,11 @@ Note: File names must be relative to base directories!
<source>Available:</source>
<target>Διαθέσιμος:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Ο Κάδος ΑνακÏκλωσης δεν είναι διαθέσιμος για τις ακόλουθες διαδÏομές! Τα αÏχεία θα διαγÏαφοÏν μόνιμα:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Θα Ï„Ïοποποιηθεί ένας υποκατάλογος που είναι μέÏος από πολλαπλά ζεÏγη υποκαταλόγων. ΠαÏακαλοÏμε επανελέγξτε τις Ïυθμίσεις συγχÏονισμοÏ.</target>
-<source>Processing folder pair:</source>
-<target>ΣÏγκÏιση του ζεÏγους υποκαταλόγων:</target>
+<source>Synchronizing folder pair:</source>
+<target>ΣυγχÏονίζεται το ζευγάÏι υποκαταλόγων:</target>
<source>Target folder %x already existing.</source>
<target>Ο υποκατάλογος-στόχος %x υπάÏχει ήδη.</target>
diff --git a/BUILD/Languages/hebrew.lng b/BUILD/Languages/hebrew.lng
index db4dd2c6..16d7919a 100644
--- a/BUILD/Languages/hebrew.lng
+++ b/BUILD/Languages/hebrew.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>מחפש ×ת תיקייה %x...</target>
-<source>Batch execution</source>
-<target>פעולת ×צווה</target>
-
<source>Items processed:</source>
<target>××œ×ž× ×˜×™× ×¢×•×‘×“×•:</target>
@@ -34,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>התקבלה בקשת ביטול: מחכה לפעולה הנוכחית להסתיי×...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - סינכרון ×וטומטי</target>
@@ -61,12 +61,12 @@
<source>Create a batch job</source>
<target>יוצר עבודת ×צווה</target>
-<source>Synchronization settings</source>
-<target>הגדרות סנכרון</target>
-
<source>Comparison settings</source>
<target>הגדרות השוו××”</target>
+<source>Synchronization settings</source>
+<target>הגדרות סנכרון</target>
+
<source>About</source>
<target>×ודות</target>
@@ -88,27 +88,6 @@
<source>Select time span</source>
<target>בחר ×ª×—×•× ×–×ž×Ÿ</target>
-<source>Show pop-up</source>
-<target>הר××” חלונות מוקפצי×</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>הר××” חלונות ×ž×•×§×¤×¦×™× ×¢×‘×•×¨ שגי×ות ×ו ×זהרות</target>
-
-<source>Ignore errors</source>
-<target>×”×ª×¢×œ× ×ž×˜×¢×•×™×•×ª</target>
-
-<source>Hide all error and warning messages</source>
-<target>הסתר ×ת כל הודעות ההזהרה והשגי××”</target>
-
-<source>Exit instantly</source>
-<target>×¦× ×ž×™×“×™×ª</target>
-
-<source>Abort synchronization immediately</source>
-<target>הפסק סנכרון מידית</target>
-
-<source>Browse</source>
-<target>עיין</target>
-
<source>Invalid command line:</source>
<target>שורת פקודה בלתי חוקית:</target>
@@ -247,8 +226,8 @@
<source>&Open...</source>
<target>&פתח...</target>
-<source>Save &As...</source>
-<target>שמור בש×&</target>
+<source>Save &as...</source>
+<target>שמור &בש×...</target>
<source>&Quit</source>
<target>&יצי××”</target>
@@ -289,6 +268,9 @@
<source>Remove folder</source>
<target>הסר מחיצה</target>
+<source>Browse</source>
+<target>עיין</target>
+
<source>Select a folder</source>
<target>בחר מחיצה</target>
@@ -321,8 +303,8 @@ The command is triggered if:
<source>Cancel</source>
<target>בטל</target>
-<source>(Build: %x)</source>
-<target>(מבנה: %x)</target>
+<source>Build: %x</source>
+<target>מבנה: %x</target>
<source>All files</source>
<target>כל הקבצי×</target>
@@ -342,9 +324,6 @@ The command is triggered if:
<source>A folder input field is empty.</source>
<target>שדה קלט תיקייה ריק.</target>
-<source>Logging</source>
-<target>×¨×™×©×•× ×‘×™×•×ž×Ÿ</target>
-
<source>File time and size</source>
<target>זמן וגודל קובץ</target>
@@ -525,11 +504,11 @@ The command is triggered if:
<source>Last used configurations (press DEL to remove from list)</source>
<target>תצורות ×חרונות שהיו בשמוש (לחץ DEL להסרה מהרשימה)</target>
-<source>Hide excluded items</source>
-<target>×”×—×‘× ×¤×¨×™×˜×™× × ×©×œ×œ×™×</target>
+<source>Show excluded items</source>
+<target>הר××” ×¤×¨×™×˜×™× ×©×œ× × ×›×œ×œ×•</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>×”×—×‘× ×§×‘×¦×™× ×ž×¡×•× × ×™× ×ו נשללי×</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>הר××” ×§×‘×¦×™× ×©×¡×•× × ×• ×ו ×œ× × ×›×œ×œ×• זמנית</target>
<source>Number of files and folders that will be created</source>
<target>מספר ×”×§×‘×¦×™× ×•×”×ª×™×§×™×•×ª שייוצרו</target>
@@ -573,24 +552,81 @@ The command is triggered if:
<source>Right</source>
<target>שמ×ל</target>
-<source>Status feedback</source>
-<target>משוב מצב</target>
+<source>Error handling</source>
+<target>טיפול בשגי×ות</target>
+
+<source>Ignore</source>
+<target>התעל×</target>
+
+<source>Hide all error and warning messages</source>
+<target>הסתר ×ת כל הודעות ההזהרה והשגי××”</target>
+
+<source>Pop-up</source>
+<target>מוקפץ</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>הר××” חלונות ×ž×•×§×¤×¦×™× ×¢×‘×•×¨ שגי×ות ×ו ×זהרות</target>
+
+<source>Exit</source>
+<target>יצי××”</target>
+
+<source>Abort synchronization on first error</source>
+<target>הפסק פעולת סינכרון בשגי××” ר×שונה</target>
+
+<source>On completion:</source>
+<target>ל×חר סיו×:</target>
<source>Show progress dialog</source>
<target>הר××” שיח התקדמות</target>
-<source>Error handling</source>
-<target>טיפול בשגי×ות</target>
+<source>Generate log file</source>
+<target>יצר קובץ יומן</target>
+
+<source>Select folder to save log files</source>
+<target>בחר תיקיה לשמירת קובץ יומן</target>
-<source>Maximum number of log files:</source>
-<target>מספר מכסימלי של קבצי יומן</target>
+<source>Limit</source>
+<target>הגבלה</target>
-<source>Select folder to save log files:</source>
-<target>בחר תיקייה לשמירה קבצי יומן:</target>
+<source>Limit maximum number of log files</source>
+<target>הגבל מספר מכסימלי של קבצי יומן</target>
<source>Batch settings</source>
<target>הגדרות ×צווה</target>
+<source>Compare by...</source>
+<target>השווה ע"י...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+×”×§×‘×¦×™× ×™×™×ž×¦×ו ×›×–×”×™× ××
+ - זמן ות×ריך שמירה ×חרוני×
+ - גודל קובץ
+×”× ×–×”×™×
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+×§×‘×¦×™× ×ž×•×’×“×¨×™× ×›×–×”×™× ××
+ - תכולת הקובץ
+×”×™× ×–×”×”
+</target>
+
+<source>Symbolic Link handling</source>
+<target>טיפול בקישור סימבולי</target>
+
+<source>OK</source>
+<target>×שר</target>
+
<source>Select variant:</source>
<target>בחר משתנה:</target>
@@ -609,8 +645,26 @@ The command is triggered if:
<source>Deletion handling</source>
<target>טיפול במחיקות</target>
-<source>On completion:</source>
-<target>ל×חר סיו×:</target>
+<source>Permanent</source>
+<target>קבוע</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>מחק ×ו דרוס ×§×‘×¦×™× ×œ×¦×ž×™×ª×•×ª</target>
+
+<source>Recycle Bin</source>
+<target>סל מחזור</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>השתמש בסל המיחזור ×›×שר מוחק ×ו דורס קבצי×</target>
+
+<source>Versioning</source>
+<target>עדכון גרס×ות</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>העבר ×§×‘×¦×™× ×¢× ×—×ª×™×ž×ª זמן לתיקיה מיוחדת</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>הגבל מספר מכסימלי של גרס×ות לקובץ</target>
<source>Configuration</source>
<target>תצורה</target>
@@ -633,39 +687,6 @@ The command is triggered if:
<source>Conflict/item cannot be categorized</source>
<target>סתירה/פריט ×ינו ניתן לסיווג</target>
-<source>OK</source>
-<target>×שר</target>
-
-<source>Compare by...</source>
-<target>השווה ע"י...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-×”×§×‘×¦×™× ×™×™×ž×¦×ו ×›×–×”×™× ××
- - זמן ות×ריך שמירה ×חרוני×
- - גודל קובץ
-×”× ×–×”×™×
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-×§×‘×¦×™× ×ž×•×’×“×¨×™× ×›×–×”×™× ××
- - תכולת הקובץ
-×”×™× ×–×”×”
-</target>
-
-<source>Symbolic Link handling</source>
-<target>טיפול בקישור סימבולי</target>
-
<source>Synchronizing...</source>
<target>מסנכרן...</target>
@@ -681,8 +702,8 @@ is the same
<source>Donate with PayPal</source>
<target>×ª×¨×•× ×¢× ×¤×™×™×¤×œ</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>תודות עבור עבודות ×”×ª×¨×’×•× ×©×œ תוכנת הסנכרון:</target>
+<source>Many thanks for localization:</source>
+<target>תודות עבור ×ª×¨×’×•× ×©×¤×•×ª:</target>
<source>Feedback and suggestions are welcome</source>
<target>משוב והצעות יתקבלו בברכה</target>
@@ -699,9 +720,6 @@ is the same
<source>Published under the GNU General Public License</source>
<target>×ž×¤×•×¨×¡× ×‘×ž×¡×’×¨×ª GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>השתמש בסל המיחזור</target>
-
<source>Delete on both sides</source>
<target>מחק בשני הצדדי×</target>
@@ -771,8 +789,8 @@ Note: File names must be relative to base directories!
<source>Statistics</source>
<target>סטטיסטיקה</target>
-<source>Do not show this dialog again</source>
-<target>×ל תר××” מסך ×–×” שנית</target>
+<source>Don't show this dialog again</source>
+<target>×ל תר××” דו-שיח ×–×” שוב</target>
<source>Find what:</source>
<target>חפש מה:</target>
@@ -855,11 +873,8 @@ Note: File names must be relative to base directories!
<source>Do you want to save changes to %x?</source>
<target>×”×× ×œ×©×ž×•×¨ ×©×™× ×•×™×™× ×ל %x?</target>
-<source>Save</source>
-<target>שמור</target>
-
-<source>Don't Save</source>
-<target>×ל תשמור</target>
+<source>Do&n't save</source>
+<target>×ל &תשמור</target>
<source>Configuration loaded!</source>
<target>תצורה הוטענה!</target>
@@ -951,8 +966,8 @@ Note: File names must be relative to base directories!
<source>Show files that won't be copied</source>
<target>הר××” ×§×‘×¦×™× ×©×œ× ×™×•×¢×ª×§×•</target>
-<source>All directories in sync!</source>
-<target>כל המחיצות מסונכרנות!</target>
+<source>All folders are in sync!</source>
+<target>כל התיקיות מסונכרנות</target>
<source>Comma separated list</source>
<target>רשימה מופרדת פסיקי×</target>
@@ -1041,6 +1056,9 @@ Note: File names must be relative to base directories!
<source>Pause</source>
<target>עצור</target>
+<source>Logging</source>
+<target>×¨×™×©×•× ×‘×™×•×ž×Ÿ</target>
+
<source>Cannot find %x</source>
<target>×œ× ×ž×•×¦× %x</target>
@@ -1122,21 +1140,6 @@ Note: File names must be relative to base directories!
<source>Leave as unresolved conflict</source>
<target>הש×ר כקונפליקט ×œ× ×ž×˜×•×¤×œ</target>
-<source>Delete permanently</source>
-<target>מחק לצמיתות</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>מחק ×ו דרוס ×§×‘×¦×™× ×œ×¦×ž×™×ª×•×ª</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>השתמש בסל המיחזור ×›×שר מוחק ×ו דורס קבצי×</target>
-
-<source>Versioning</source>
-<target>עדכון גרס×ות</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>העבר ×§×‘×¦×™× ×œ×ª×™×§×™×™×” המסומנת בחותמת-זמן</target>
-
<source>Files</source>
<target>קבצי×</target>
@@ -1227,8 +1230,11 @@ Note: File names must be relative to base directories!
<source>Cannot copy file %x to %y.</source>
<target>×œ× ×™×›×•×œ להעתיק קובץ %x ×ל %y.</target>
-<source>Cannot read directory %x.</source>
-<target>×œ× ×™×›×•×œ ×œ×§×¨×•× ×ž×—×™×¦×” %x.</target>
+<source>Cannot open directory %x.</source>
+<target>×œ× ×™×›×•×œ לפתוח מחיצה %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>×œ× ×™×›×•×œ למספר מחיצה %x.</target>
<source>Detected endless directory recursion.</source>
<target>×ובחנה רקורסית תיקיות ×ינסופית.</target>
@@ -1254,6 +1260,9 @@ Note: File names must be relative to base directories!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>בחר ברירת מחדל של סנכרון: ×§×‘×¦×™× ×™×©× ×™× ×™×“×¨×¡×• ×¢"×™ ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>סל מחזור ×ינו זמין עבור ×”× ×ª×™×‘×™× ×”×‘××™×! ×§×‘×¦×™× ×™×ž×—×§×• לצמיתות:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>ניתן ×œ×”×ª×¢×œ× ×ž×©×’×™××” זו ולהחשיב התיקייה כריקה.</target>
@@ -1263,6 +1272,9 @@ Note: File names must be relative to base directories!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>מחיצות תלויות! זהירות בהגדרת כללי סנכרון:</target>
+<source>Start comparison</source>
+<target>התחל השוו××”</target>
+
<source>Preparing synchronization...</source>
<target>מכין סינכרון...</target>
@@ -1275,6 +1287,9 @@ Note: File names must be relative to base directories!
<source>Files %x have the same date but a different size!</source>
<target>קובץ %x בעל ת×ריך ×–×”×” ×ך גודל שונה!</target>
+<source>Items differ in attributes only</source>
+<target>×¤×¨×™×˜×™× ×©×•× ×™× ×‘×ª×›×•× ×•×ª בלבד</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>×œ×§×™×©×•×¨×™× ×¡×™×ž×‘×•×œ×™×™× %x יש ת×ריך ×–×”×” ×בל יעד שונה.</target>
@@ -1290,9 +1305,6 @@ Note: File names must be relative to base directories!
<source>Both sides are equal</source>
<target>שני ×”×¦×“×“×™× ×©×•×•×™×</target>
-<source>Items have different attributes</source>
-<target>×”×¤×¨×™×˜×™× ×”× ×‘×¢×œ×™ תכונות שונות</target>
-
<source>Copy new item to left</source>
<target>העתק פריט חדש לצד ימין</target>
@@ -1356,6 +1368,9 @@ Note: File names must be relative to base directories!
<source>Moving symbolic link %x to %y</source>
<target>מעביר קישור סימבולי %x ×ל %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>יוצר קובץ %x</target>
@@ -1407,14 +1422,11 @@ Note: File names must be relative to base directories!
<source>Available:</source>
<target>זמין:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>סל מחזור ×ינו זמין עבור ×”× ×ª×™×‘×™× ×”×‘××™×! ×§×‘×¦×™× ×™×ž×—×§×• לצמיתות:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>התיקייה שתשתנה ×”×™× ×—×œ×§ מריבוי זוגות תיקיות. ×× × ×¡×§×•×¨ מחדש הגדרות סינכרון.</target>
-<source>Processing folder pair:</source>
-<target>מבצע זוג מחיצות:</target>
+<source>Synchronizing folder pair:</source>
+<target>מסנכרן זוג תיקיות:</target>
<source>Target folder %x already existing.</source>
<target>תיקיית מטרה %x כבר קיימת.</target>
diff --git a/BUILD/Languages/hungarian.lng b/BUILD/Languages/hungarian.lng
index f1b0ae8b..adca1b46 100644
--- a/BUILD/Languages/hungarian.lng
+++ b/BUILD/Languages/hungarian.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>A(z) %x mappa keresése...</target>
+<source>Items processed:</source>
+<target>Feldolgozott elemek száma:</target>
+
+<source>Items remaining:</source>
+<target>Hátralévő elemek száma:</target>
+
+<source>Total time:</source>
+<target>Becsült idő:</target>
+
<source>Show in Explorer</source>
<target>Mutatás az Intézőben</target>
@@ -22,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Megszakítási kérelem: Várakozás a folyamatban lévő művelet befejezésére...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automatikus szinkronizálás</target>
@@ -49,12 +61,12 @@
<source>Create a batch job</source>
<target>Kötegelt feladat létrehozása</target>
-<source>Synchronization settings</source>
-<target>Szinkronizáció beállításai</target>
-
<source>Comparison settings</source>
<target>Összehasonlítási beállítások</target>
+<source>Synchronization settings</source>
+<target>Szinkronizáció beállításai</target>
+
<source>About</source>
<target>A programról</target>
@@ -76,27 +88,6 @@
<source>Select time span</source>
<target>Időintervallum kiválasztása</target>
-<source>Show pop-up</source>
-<target>Párbeszédablak mutatása</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Párbeszédablakok mutatása hiba vagy figyelmeztetés esetén</target>
-
-<source>Ignore errors</source>
-<target>Hibák figyelmen kívül hagyása</target>
-
-<source>Hide all error and warning messages</source>
-<target>Összes hibaüzenet és figyelmeztetés elrejtése</target>
-
-<source>Exit instantly</source>
-<target>Kilépés azonnal</target>
-
-<source>Abort synchronization immediately</source>
-<target>Szinkronizáció azonnali megszakítása</target>
-
-<source>Browse</source>
-<target>Tallózás</target>
-
<source>Invalid command line:</source>
<target>Érvénytelen parancssor:</target>
@@ -146,7 +137,7 @@
<target>A következő adatbázisfájl nem létezik: %x.</target>
<source>Database file is corrupt:</source>
-<target></target>
+<target>Sérült adatbázisfájl:</target>
<source>Out of memory!</source>
<target>Elfogyott a szabad memória!</target>
@@ -235,8 +226,8 @@
<source>&Open...</source>
<target>&Megnyitás...</target>
-<source>Save &As...</source>
-<target></target>
+<source>Save &as...</source>
+<target>Mentés m&ásként...</target>
<source>&Quit</source>
<target>&Kilépés</target>
@@ -277,6 +268,9 @@
<source>Remove folder</source>
<target>Mappa eltávolítása</target>
+<source>Browse</source>
+<target>Tallózás</target>
+
<source>Select a folder</source>
<target>Mappa kiválasztása</target>
@@ -309,11 +303,11 @@ A parancs végrehajtódik, ha:
<source>Cancel</source>
<target>Mégsem</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Build: %x</target>
<source>All files</source>
-<target></target>
+<target>Összes fájl</target>
<source>&Restore</source>
<target>&Visszaállítás</target>
@@ -328,10 +322,7 @@ A parancs végrehajtódik, ha:
<target>Várakozás a hiányzó mappákra...</target>
<source>A folder input field is empty.</source>
-<target></target>
-
-<source>Logging</source>
-<target>Naplózás</target>
+<target>A mappa beviteli mezeje üres.</target>
<source>File time and size</source>
<target>Fájl dátuma és mérete</target>
@@ -352,22 +343,7 @@ A parancs végrehajtódik, ha:
<target>Egyedi</target>
<source>FreeFileSync batch</source>
-<target></target>
-
-<source>Batch execution</source>
-<target>Kötegelt végrehajtás</target>
-
-<source>Items processed:</source>
-<target>Feldolgozott elemek száma:</target>
-
-<source>Items remaining:</source>
-<target>Hátralévő elemek száma:</target>
-
-<source>Total time:</source>
-<target>Becsült idő:</target>
-
-<source>Stop</source>
-<target>Megállítás</target>
+<target>FreeFileSync kötegelt fájl</target>
<source>Synchronization aborted!</source>
<target>A szinkronizáció megszakítva!</target>
@@ -391,7 +367,7 @@ A parancs végrehajtódik, ha:
<target>A csatlakozás a sourceforge.net-hez sikertelen!</target>
<source>A new version of FreeFileSync is available:</source>
-<target></target>
+<target>Elérhető a FreeFileSync új verziója:</target>
<source>Download now?</source>
<target>Letöltsem most?</target>
@@ -436,10 +412,10 @@ A parancs végrehajtódik, ha:
<target>Kiterjesztés</target>
<source>Size:</source>
-<target></target>
+<target>Méret:</target>
<source>Date:</source>
-<target></target>
+<target>Dátum:</target>
<source>Action</source>
<target>Művelet</target>
@@ -475,7 +451,7 @@ A parancs végrehajtódik, ha:
<target>&Új</target>
<source>&Save</source>
-<target></target>
+<target>&Mentés</target>
<source>&Language</source>
<target>&Nyelv</target>
@@ -528,11 +504,11 @@ A parancs végrehajtódik, ha:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Utoljára használt beállítások (DEL billentyűvel törölhető a listából)</target>
-<source>Hide excluded items</source>
-<target>A kizárt elemek elrejtése</target>
+<source>Show excluded items</source>
+<target>Kizárt elemek mutatása</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>A kiszűrt vagy ideiglenesen kizárt fájlok elrejtése</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>A szűrt vagy ideiglenesen kizárt fájlok mutatása</target>
<source>Number of files and folders that will be created</source>
<target>A létrehozandó fájlok és mappák száma</target>
@@ -544,7 +520,7 @@ A parancs végrehajtódik, ha:
<target>A törlendő fájlok és mappák száma</target>
<source>Total bytes to copy</source>
-<target></target>
+<target>Összesen másolandó bájtok</target>
<source>Items found:</source>
<target>Talált elemek száma:</target>
@@ -553,10 +529,10 @@ A parancs végrehajtódik, ha:
<target>Sebesség:</target>
<source>Time remaining:</source>
-<target></target>
+<target>Hátralévő idő:</target>
<source>Time elapsed:</source>
-<target></target>
+<target>Eltelt idő:</target>
<source>Batch job</source>
<target>Kötegelt feladat</target>
@@ -576,24 +552,79 @@ A parancs végrehajtódik, ha:
<source>Right</source>
<target>Jobb oldal</target>
-<source>Status feedback</source>
-<target>Státusz visszajelzés</target>
+<source>Error handling</source>
+<target>Hibakezelés</target>
+
+<source>Ignore</source>
+<target>Kihagy</target>
+
+<source>Hide all error and warning messages</source>
+<target>Összes hibaüzenet és figyelmeztetés elrejtése</target>
+
+<source>Pop-up</source>
+<target>Párbeszédablak</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Párbeszédablakok mutatása hiba vagy figyelmeztetés esetén</target>
+
+<source>Exit</source>
+<target>Kilépés</target>
+
+<source>Abort synchronization on first error</source>
+<target>Szinkronizáció leállítása az első hibánál</target>
+
+<source>On completion:</source>
+<target>Végrehajtás után:</target>
<source>Show progress dialog</source>
<target>Folyamatjelző párbeszédablak mutatása</target>
-<source>Error handling</source>
-<target>Hibakezelés</target>
+<source>Generate log file</source>
+<target>Naplófájl generálása</target>
-<source>Maximum number of log files:</source>
-<target>Naplófájlok maximális száma:</target>
+<source>Select folder to save log files</source>
+<target>Válaszd ki a mappát a naplófájlok mentéséhez</target>
-<source>Select folder to save log files:</source>
-<target>Válaszd ki a mappát a naplófájlok mentéséhez:</target>
+<source>Limit</source>
+<target>Korlát</target>
+
+<source>Limit maximum number of log files</source>
+<target>Naplófájlok maximális számának korlátozása</target>
<source>Batch settings</source>
<target>Beállítások</target>
+<source>Compare by...</source>
+<target>Összehasonlítás</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+A fájlok egyezőnek tekintendők, ha megegyezik
+ - az utolsó módosításuk dátuma és ideje
+ - a fájlméret
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+A fájlok megegyeznek, ha megegyezik
+ - a fájlok tartalma
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Symlink kezelés</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Változat kiválasztása:</target>
@@ -612,8 +643,26 @@ A parancs végrehajtódik, ha:
<source>Deletion handling</source>
<target>Törlések kezelése</target>
-<source>On completion:</source>
-<target>Végrehajtás után:</target>
+<source>Permanent</source>
+<target>Ãllandó</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>A fájlok folyamatos törlése vagy felülírása</target>
+
+<source>Recycle Bin</source>
+<target>Lomtár (Recycle Bin)</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülírásánál</target>
+
+<source>Versioning</source>
+<target>Verziókövetés</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Időbélyeges fájlok mozgatása a megadott mappába</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Verziók maximális számának korlátozása fájlonként</target>
<source>Configuration</source>
<target>Beállítás</target>
@@ -636,37 +685,6 @@ A parancs végrehajtódik, ha:
<source>Conflict/item cannot be categorized</source>
<target>Az ütközés vagy elem nem kategorizálható</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Összehasonlítás</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-A fájlok egyezőnek tekintendők, ha megegyezik
- - az utolsó módosításuk dátuma és ideje
- - a fájlméret
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-A fájlok megegyeznek, ha megegyezik
- - a fájlok tartalma
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Symlink kezelés</target>
-
<source>Synchronizing...</source>
<target>Szinkronizálás folyamatban...</target>
@@ -682,11 +700,8 @@ A fájlok megegyeznek, ha megegyezik
<source>Donate with PayPal</source>
<target>Ha szereted a FreeFileSync-et, támogasd a PayPal segítségével.</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>
-Nagy köszönet a FreeFileSync lokalizációjáért
-a következő személyeknek:
-</target>
+<source>Many thanks for localization:</source>
+<target>Ezer köszönet a lokalizációért:</target>
<source>Feedback and suggestions are welcome</source>
<target>Várjuk a visszajelzéseket és az ötleteket</target>
@@ -703,9 +718,6 @@ a következő személyeknek:
<source>Published under the GNU General Public License</source>
<target>Kiadva a GNU General Public License alatt</target>
-<source>Use Recycle Bin</source>
-<target>Lomtár (Recycle Bin) használata</target>
-
<source>Delete on both sides</source>
<target>Törlés mindkét oldalon</target>
@@ -775,8 +787,8 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<source>Statistics</source>
<target>Statisztikák</target>
-<source>Do not show this dialog again</source>
-<target>Ne mutasd újra ezt a párbeszédablakot</target>
+<source>Don't show this dialog again</source>
+<target>Ne mutasd ezt a párbeszédablakot többé</target>
<source>Find what:</source>
<target>Mit keresünk:</target>
@@ -857,13 +869,10 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<target>Változtatások figyelmen kívül hagyása</target>
<source>Do you want to save changes to %x?</source>
-<target></target>
+<target>Akarod menteni a %x változtatásait?</target>
-<source>Save</source>
-<target></target>
-
-<source>Don't Save</source>
-<target></target>
+<source>Do&n't save</source>
+<target>Ne mentsd</target>
<source>Configuration loaded!</source>
<target>Beállítások betöltve!</target>
@@ -955,7 +964,7 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<source>Show files that won't be copied</source>
<target>A nem másolandó fájlok mutatása</target>
-<source>All directories in sync!</source>
+<source>All folders are in sync!</source>
<target>Minden mappa szinkronban!</target>
<source>Comma separated list</source>
@@ -1045,6 +1054,9 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<source>Pause</source>
<target>Szünet</target>
+<source>Logging</source>
+<target>Naplózás</target>
+
<source>Cannot find %x</source>
<target>Nem található: %x</target>
@@ -1126,21 +1138,6 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<source>Leave as unresolved conflict</source>
<target>Feloldatlan ütközésként hagyni</target>
-<source>Delete permanently</source>
-<target>Folyamatosan törölni</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>A fájlok folyamatos törlése vagy felülírása</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>A Lomtár (Recycle Bin) használata fájlok törlésénél vagy felülírásánál</target>
-
-<source>Versioning</source>
-<target>Verziókövetés</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Fájlok mozgatása egy időbélyeges almappába</target>
-
<source>Files</source>
<target>Fájlok</target>
@@ -1231,8 +1228,11 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<source>Cannot copy file %x to %y.</source>
<target>%x fájl másolása a(z) %y fájlba sikertelen.</target>
-<source>Cannot read directory %x.</source>
-<target>A következő mappa olvasása sikertelen: %x.</target>
+<source>Cannot open directory %x.</source>
+<target>A következő mappa megnyitása sikertelen: %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>A következő mappa sorszámozása sikertelen: %x.</target>
<source>Detected endless directory recursion.</source>
<target>Végtelen mapparekurzió detektálva.</target>
@@ -1253,11 +1253,14 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<target>Az utolsó szinkronizálás után nem történt változás.</target>
<source>The corresponding database entries are not in sync considering current settings.</source>
-<target></target>
+<target>A megfelelő adatbázisbejegyzések nincsenek szinkronban a jelenlegi beállításokat tekintve.</target>
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Alapértelmezett szinkronizációs irányok beállítása: a régebbi fájlok felülíródnak az újabbakkal.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>A Lomtár (Recycle Bin) nem elérhető a következő útvonalakhoz! A fájlok azonnali törlésre kerülnek helyette:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Figyelmen kívül hagyhatod ezt a hibát ezzel üresnek tekintve a mappát.</target>
@@ -1267,6 +1270,9 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>A mappák függenek egymástól! Legyen óvatos, amikor megadja a szinkronizálási szabályokat:</target>
+<source>Start comparison</source>
+<target>Összehasonlítás megkezdése</target>
+
<source>Preparing synchronization...</source>
<target>Szinkronizálás előkészítése...</target>
@@ -1279,6 +1285,9 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<source>Files %x have the same date but a different size!</source>
<target>A(z) %x fájlok dátuma megegyezik, de a mérete nem!</target>
+<source>Items differ in attributes only</source>
+<target>Az elemek csak attribútumaikban különböznek</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>A következő symlinkeknek megegyezik a dátuma, de a célpontjuk különböző: %x.</target>
@@ -1294,9 +1303,6 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<source>Both sides are equal</source>
<target>Mindkét oldal egyforma</target>
-<source>Items have different attributes</source>
-<target>Az elemek attribútumai különböznek</target>
-
<source>Copy new item to left</source>
<target>Új elemek másolása a bal oldalra</target>
@@ -1360,6 +1366,9 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<source>Moving symbolic link %x to %y</source>
<target>%x symlink mozgatása ide: %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>%x fájl létrehozása</target>
@@ -1382,13 +1391,13 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<target>A(z) %x attribútumainak frissítése</target>
<source>Target folder input field must not be empty.</source>
-<target></target>
+<target>A célmappa beviteli mezeje nem lehet üres.</target>
<source>Folder input field for versioning must not be empty.</source>
-<target></target>
+<target>A verziókövetés mappájának beviteli mezeje nem lehet üres.</target>
<source>Source folder %x not found.</source>
-<target></target>
+<target>A következő forrásmappa nem található: %x.</target>
<source>Unresolved conflicts existing!</source>
<target>Feloldatlan ütközések vannak!</target>
@@ -1406,22 +1415,19 @@ Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszony
<target>Nincs elég szabad lemezterület:</target>
<source>Required:</source>
-<target></target>
+<target>Szükséges:</target>
<source>Available:</source>
-<target></target>
-
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>A Lomtár (Recycle Bin) nem elérhető a következő útvonalakhoz! A fájlok azonnali törlésre kerülnek helyette:</target>
+<target>Szabad:</target>
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>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.</target>
-<source>Processing folder pair:</source>
-<target>Mappapár feldolgozása:</target>
+<source>Synchronizing folder pair:</source>
+<target>Mappapár szinkronizálása:</target>
<source>Target folder %x already existing.</source>
-<target></target>
+<target>A következő célmappa már létezik: %x.</target>
<source>Generating database...</source>
<target>Adatbázis generálása...</target>
diff --git a/BUILD/Languages/italian.lng b/BUILD/Languages/italian.lng
index 53e4b011..177ea600 100644
--- a/BUILD/Languages/italian.lng
+++ b/BUILD/Languages/italian.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Ricerca della cartella %x...</target>
-<source>Batch execution</source>
-<target>Esecuzione in batch</target>
-
<source>Items processed:</source>
<target>Elementi processati:</target>
@@ -34,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Selezionata interruazione: conclusione dell'operazione...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Sincronizzazione automatizzata</target>
@@ -61,12 +61,12 @@
<source>Create a batch job</source>
<target>Creazione di un attività batch</target>
-<source>Synchronization settings</source>
-<target>Parametri di sincronizzazione</target>
-
<source>Comparison settings</source>
<target>Impostazioni di comparazione</target>
+<source>Synchronization settings</source>
+<target>Parametri di sincronizzazione</target>
+
<source>About</source>
<target>Info su</target>
@@ -88,27 +88,6 @@
<source>Select time span</source>
<target>Seleziona intervallo di tempo</target>
-<source>Show pop-up</source>
-<target>Mostra popup</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Mostra popup di errore o avviso</target>
-
-<source>Ignore errors</source>
-<target>Ignora errori</target>
-
-<source>Hide all error and warning messages</source>
-<target>Nascondi tutti gli errori e i messaggi d'avviso</target>
-
-<source>Exit instantly</source>
-<target>Esci istantaneamente</target>
-
-<source>Abort synchronization immediately</source>
-<target>Interrompi immediatamente la sincronizzazione</target>
-
-<source>Browse</source>
-<target>Sfoglia</target>
-
<source>Invalid command line:</source>
<target>Linea di comando non valida:</target>
@@ -247,8 +226,8 @@
<source>&Open...</source>
<target>&Apri...</target>
-<source>Save &As...</source>
-<target>Salva &Con nome...</target>
+<source>Save &as...</source>
+<target>Salva &come...</target>
<source>&Quit</source>
<target>&Esci</target>
@@ -289,6 +268,9 @@
<source>Remove folder</source>
<target>Rimuovi cartella</target>
+<source>Browse</source>
+<target>Sfoglia</target>
+
<source>Select a folder</source>
<target>Seleziona una cartella</target>
@@ -321,8 +303,8 @@ Il comando è attivato se:
<source>Cancel</source>
<target>Annulla</target>
-<source>(Build: %x)</source>
-<target>(Versione: %x)</target>
+<source>Build: %x</source>
+<target>Versione: %x</target>
<source>All files</source>
<target>Tutti i file</target>
@@ -342,9 +324,6 @@ Il comando è attivato se:
<source>A folder input field is empty.</source>
<target>Un campo cartella input è vuoto.</target>
-<source>Logging</source>
-<target>Registo attività</target>
-
<source>File time and size</source>
<target>Ora e dimensione file</target>
@@ -525,11 +504,11 @@ Il comando è attivato se:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Ultima configurazione utilizzata (premi CANC per rimuovere dall'elenco)</target>
-<source>Hide excluded items</source>
-<target>Nascondi oggetti esclusi</target>
+<source>Show excluded items</source>
+<target>Mostra oggetti esclusi</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Nascondi file filtrati o temporaneamente esclusi</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Mostra file filtrati o temporaneamente esclusi</target>
<source>Number of files and folders that will be created</source>
<target>Numero di file e cartelle che verranno creati</target>
@@ -573,24 +552,81 @@ Il comando è attivato se:
<source>Right</source>
<target>Destra</target>
-<source>Status feedback</source>
-<target>Feedback di stato</target>
+<source>Error handling</source>
+<target>Gestione degli errori</target>
+
+<source>Ignore</source>
+<target>Ignora</target>
+
+<source>Hide all error and warning messages</source>
+<target>Nascondi tutti gli errori e i messaggi d'avviso</target>
+
+<source>Pop-up</source>
+<target>Pop-up</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Mostra popup di errore o avviso</target>
+
+<source>Exit</source>
+<target></target>
+
+<source>Abort synchronization on first error</source>
+<target>Abortisci sincronizzazione al primo errore</target>
+
+<source>On completion:</source>
+<target>In completamento:</target>
<source>Show progress dialog</source>
<target>Mostra stato di avanzamento</target>
-<source>Error handling</source>
-<target>Gestione degli errori</target>
+<source>Generate log file</source>
+<target>Genera file log</target>
+
+<source>Select folder to save log files</source>
+<target>Seleziona cartella dove salvare i file log</target>
-<source>Maximum number of log files:</source>
-<target>Numero massimo di file registro:</target>
+<source>Limit</source>
+<target>Limita</target>
-<source>Select folder to save log files:</source>
-<target>Seleziona cartella per il salvataggio dei file registro:</target>
+<source>Limit maximum number of log files</source>
+<target>Limita il numero massimo di file log</target>
<source>Batch settings</source>
<target>Impostazioni batch</target>
+<source>Compare by...</source>
+<target>Compara per...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+I file sono considerati identici se
+ - data e ora di ultima modifica
+ - dimensione
+sono identici
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+I file sono considerati identici se
+ - il contenuto
+è identico
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Gestione Collegamenti</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Seleziona una variante:</target>
@@ -609,8 +645,26 @@ Il comando è attivato se:
<source>Deletion handling</source>
<target>Gestione cancellazione</target>
-<source>On completion:</source>
-<target>In completamento:</target>
+<source>Permanent</source>
+<target>Permanente</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Elimina o sovrascrivi file definitivamente</target>
+
+<source>Recycle Bin</source>
+<target>Cestino</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Usa il Cestino quando si elimina o sovrascrive un file</target>
+
+<source>Versioning</source>
+<target>Versione</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Sposta file con indicazione datata nella cartella specifica</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Limita numero massimo di versioni per ogni file</target>
<source>Configuration</source>
<target>Configurazione</target>
@@ -633,39 +687,6 @@ Il comando è attivato se:
<source>Conflict/item cannot be categorized</source>
<target>Conflitto/elemento non categorizzabile</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Compara per...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-I file sono considerati identici se
- - data e ora di ultima modifica
- - dimensione
-sono identici
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-I file sono considerati identici se
- - il contenuto
-è identico
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Gestione Collegamenti</target>
-
<source>Synchronizing...</source>
<target>Sincronizzazione...</target>
@@ -681,8 +702,8 @@ I file sono considerati identici se
<source>Donate with PayPal</source>
<target>Fai una donazione con PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Per la traduzione di FreeFileSync, un grazie va a:</target>
+<source>Many thanks for localization:</source>
+<target>Ringraziamenti per la localizzazione:</target>
<source>Feedback and suggestions are welcome</source>
<target>Ogni commento o suggerimento è ben accetto</target>
@@ -699,9 +720,6 @@ I file sono considerati identici se
<source>Published under the GNU General Public License</source>
<target>Pubblicato sotto licenza GNU General Public</target>
-<source>Use Recycle Bin</source>
-<target>Usa il Cestino</target>
-
<source>Delete on both sides</source>
<target>Elimina su entrambi i lati</target>
@@ -771,8 +789,8 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Statistics</source>
<target>Statistiche</target>
-<source>Do not show this dialog again</source>
-<target>Non visualizzare più questo messaggio</target>
+<source>Don't show this dialog again</source>
+<target>Non mostrare più questo messaggio</target>
<source>Find what:</source>
<target>Trova questo:</target>
@@ -855,11 +873,8 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Do you want to save changes to %x?</source>
<target>Vuoi salvare le modifiche a %x?</target>
-<source>Save</source>
-<target>Salva</target>
-
-<source>Don't Save</source>
-<target>Non salvare</target>
+<source>Do&n't save</source>
+<target>No&n salvare</target>
<source>Configuration loaded!</source>
<target>Configurazione caricata!</target>
@@ -951,8 +966,8 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Show files that won't be copied</source>
<target>Mostra file che non saranno copiati</target>
-<source>All directories in sync!</source>
-<target>Tutte le cartelle sincronizzate!</target>
+<source>All folders are in sync!</source>
+<target>Tutte le cartelle sono sincronizzate!</target>
<source>Comma separated list</source>
<target>Elenco elementi separati da virgola</target>
@@ -1041,6 +1056,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Pause</source>
<target>Pausa</target>
+<source>Logging</source>
+<target>Registo attività</target>
+
<source>Cannot find %x</source>
<target>Impossibile trovare %x</target>
@@ -1122,21 +1140,6 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Leave as unresolved conflict</source>
<target>Lascia come conflitti irrisolti</target>
-<source>Delete permanently</source>
-<target>Elimina definitivamente</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Elimina o sovrascrivi file definitivamente</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Usa il Cestino quando si elimina o sovrascrive un file</target>
-
-<source>Versioning</source>
-<target>Versione</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Sposta file in una sotto-cartella con data e ora</target>
-
<source>Files</source>
<target>File</target>
@@ -1227,8 +1230,11 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Cannot copy file %x to %y.</source>
<target>Impossibile copiare file %x in %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Impossibile leggere cartella %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Impossibile aprire cartella %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Impossibile numerare cartella %x.</target>
<source>Detected endless directory recursion.</source>
<target>Rilevato percorso ricorsivo senza fine.</target>
@@ -1254,6 +1260,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Imposta direzioni di sincronizzazione dpredefinite: i vecchi file saranno sovrascritti dai nuovi.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Cestino non disponibile per i seguenti percorsi! I file verranno cancellati in modo permanente:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Puoi ignorare questo errore per considerare la cartella come vuota.</target>
@@ -1263,6 +1272,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Le cartelle sono dipendenti! Fai attenzione quando configuri le regole di sincronizzazione:</target>
+<source>Start comparison</source>
+<target>Inizia comparazione</target>
+
<source>Preparing synchronization...</source>
<target>Preparazione sincronizzazione...</target>
@@ -1275,6 +1287,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Files %x have the same date but a different size!</source>
<target>I file %x hanno la stessa data ma dimensione diversa!</target>
+<source>Items differ in attributes only</source>
+<target>Gli oggetti differiscono solo negli attributi</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Il collegamento %x ha stessa data ma un diverso puntamento.</target>
@@ -1290,9 +1305,6 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Both sides are equal</source>
<target>Entrambi i lati sono uguali</target>
-<source>Items have different attributes</source>
-<target>Gli elementi hanno differenti attributi</target>
-
<source>Copy new item to left</source>
<target>Copia nuovo elemento a sinistra</target>
@@ -1356,6 +1368,9 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Moving symbolic link %x to %y</source>
<target>Spostamento collegamento %x in %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>Creazione file %x</target>
@@ -1407,14 +1422,11 @@ Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
<source>Available:</source>
<target>Dispobilile:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Cestino non disponibile per i seguenti percorsi! I file verranno cancellati in modo permanente:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Verrà modificata una cartella che è parte di molteplici coppie di cartelle. Controlla le impostazioni di sincronizzazione.</target>
-<source>Processing folder pair:</source>
-<target>Elaborazione coppia di cartelle:</target>
+<source>Synchronizing folder pair:</source>
+<target>Sincronizzazione della coppia di cartelle:</target>
<source>Target folder %x already existing.</source>
<target>La cartella di destinazione %x è già esistente.</target>
diff --git a/BUILD/Languages/japanese.lng b/BUILD/Languages/japanese.lng
index e40b6f92..6745cced 100644
--- a/BUILD/Languages/japanese.lng
+++ b/BUILD/Languages/japanese.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>フォルダ %x を検索中...</target>
+<source>Items processed:</source>
+<target>処ç†ã•ã‚ŒãŸè¦ç´ :</target>
+
+<source>Items remaining:</source>
+<target>残りã®è¦ç´ :</target>
+
+<source>Total time:</source>
+<target>åˆè¨ˆæ™‚é–“:</target>
+
<source>Show in Explorer</source>
<target>エクスプローラã§è¡¨ç¤º</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>一括ジョブを作æˆ</target>
-<source>Synchronization settings</source>
-<target>åŒæœŸå‡¦ç†è¨­å®š</target>
-
<source>Comparison settings</source>
<target>比較設定</target>
+<source>Synchronization settings</source>
+<target>åŒæœŸå‡¦ç†è¨­å®š</target>
+
<source>About</source>
<target>情報</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>タイムスパンをé¸æŠž</target>
-<source>Show pop-up</source>
-<target>ãƒãƒƒãƒ—アップ表示</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>エラーã¨è­¦å‘Šã‚’ãƒãƒƒãƒ—アップã§è¡¨ç¤º</target>
-
-<source>Ignore errors</source>
-<target>エラーを無視</target>
-
-<source>Hide all error and warning messages</source>
-<target>ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã¨è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤º</target>
-
-<source>Exit instantly</source>
-<target>ã™ãã«çµ‚了</target>
-
-<source>Abort synchronization immediately</source>
-<target>今ã™ãã«åŒæœŸå‡¦ç†ã‚’中断</target>
-
-<source>Browse</source>
-<target>å‚ç…§</target>
-
<source>Invalid command line:</source>
<target>無効ãªã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³:</target>
@@ -232,7 +220,7 @@
<source>&Open...</source>
<target>é–‹ã(&O)...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>別åä¿å­˜(&A)...</target>
<source>&Quit</source>
@@ -274,6 +262,9 @@
<source>Remove folder</source>
<target>フォルダ除去</target>
+<source>Browse</source>
+<target>å‚ç…§</target>
+
<source>Select a folder</source>
<target>フォルダをé¸æŠž</target>
@@ -306,8 +297,8 @@ The command is triggered if:
<source>Cancel</source>
<target>キャンセル</target>
-<source>(Build: %x)</source>
-<target>(ビルド: %x)</target>
+<source>Build: %x</source>
+<target>ビルド: %x</target>
<source>All files</source>
<target>ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«</target>
@@ -327,9 +318,6 @@ The command is triggered if:
<source>A folder input field is empty.</source>
<target>フォルダ入力欄ãŒç©ºç™½ã§ã™.</target>
-<source>Logging</source>
-<target>ログ</target>
-
<source>File time and size</source>
<target>ファイル時刻ã¨ã‚µã‚¤ã‚º</target>
@@ -351,21 +339,6 @@ The command is triggered if:
<source>FreeFileSync batch</source>
<target>FreeFileSync 一括</target>
-<source>Batch execution</source>
-<target>一括処ç†ã‚’実行</target>
-
-<source>Items processed:</source>
-<target>処ç†ã•ã‚ŒãŸè¦ç´ :</target>
-
-<source>Items remaining:</source>
-<target>残りã®è¦ç´ :</target>
-
-<source>Total time:</source>
-<target>åˆè¨ˆæ™‚é–“:</target>
-
-<source>Stop</source>
-<target>åœæ­¢</target>
-
<source>Synchronization aborted!</source>
<target>åŒæœŸå‡¦ç†ã‚’中断!</target>
@@ -525,11 +498,11 @@ The command is triggered if:
<source>Last used configurations (press DEL to remove from list)</source>
<target>å‰å›žä½¿ç”¨ã—ãŸæ§‹æˆè¨­å®š(DEL キーã§ãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã—ã¾ã™)</target>
-<source>Hide excluded items</source>
-<target>除外アイテムを隠ã™</target>
+<source>Show excluded items</source>
+<target>除外ã—ãŸé …目を表示</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>フィルターã€ã¾ãŸã¯ä¸€æ™‚除外ファイルを隠ã™</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>フィルター済ã€ã¾ãŸã¯ä¸€æ™‚除外ファイルを表示</target>
<source>Number of files and folders that will be created</source>
<target>作æˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã€ãŠã‚ˆã³ãƒ•ã‚©ãƒ«ãƒ€ã®æ•°</target>
@@ -573,24 +546,81 @@ The command is triggered if:
<source>Right</source>
<target>å³å´</target>
-<source>Status feedback</source>
-<target>状態 フィードãƒãƒƒã‚¯</target>
+<source>Error handling</source>
+<target>ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã®ã‚¨ãƒ©ãƒ¼æ™‚:</target>
+
+<source>Ignore</source>
+<target>無視</target>
+
+<source>Hide all error and warning messages</source>
+<target>ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã¨è­¦å‘Šãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤º</target>
+
+<source>Pop-up</source>
+<target>ãƒãƒƒãƒ—アップ</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>エラーã¨è­¦å‘Šã‚’ãƒãƒƒãƒ—アップã§è¡¨ç¤º</target>
+
+<source>Exit</source>
+<target>終了</target>
+
+<source>Abort synchronization on first error</source>
+<target>最åˆã®ã‚¨ãƒ©ãƒ¼ç™ºç”Ÿæ™‚ã«åŒæœŸã‚’中断ã™ã‚‹</target>
+
+<source>On completion:</source>
+<target>完了時:</target>
<source>Show progress dialog</source>
<target>進æ—ダイアログを表示</target>
-<source>Error handling</source>
-<target>ãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°ã®ã‚¨ãƒ©ãƒ¼æ™‚:</target>
+<source>Generate log file</source>
+<target>ログファイルを生æˆ</target>
+
+<source>Select folder to save log files</source>
+<target>ログファイルä¿å­˜å…ˆãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž</target>
-<source>Maximum number of log files:</source>
-<target>ログファイルã®æœ€å¤§æ•°:</target>
+<source>Limit</source>
+<target>制é™</target>
-<source>Select folder to save log files:</source>
-<target>ログファイルä¿å­˜å…ˆãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž:</target>
+<source>Limit maximum number of log files</source>
+<target>ログファイルã®æœ€å¤§æ•°ã‚’制é™</target>
<source>Batch settings</source>
<target>一括設定</target>
+<source>Compare by...</source>
+<target>比較対象...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ
+ - 最終書ãè¾¼ã¿æ™‚刻ã€æ—¥æ™‚
+ - ファイルサイズ
+ã§åˆ¤æ–­ã™ã‚‹
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ
+ - ファイル内容
+ã§åˆ¤æ–­ã™ã‚‹
+</target>
+
+<source>Symbolic Link handling</source>
+<target>ï½¼ï¾ï¾Žï¾žï¾˜ï½¯ï½¸ãƒ»ï¾˜ï¾ï½¸ã®å–り扱ã„</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>変数をé¸æŠž:</target>
@@ -609,8 +639,26 @@ The command is triggered if:
<source>Deletion handling</source>
<target>削除ã®å–り扱ã„</target>
-<source>On completion:</source>
-<target>完了時:</target>
+<source>Permanent</source>
+<target>完全消去</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤</target>
+
+<source>Recycle Bin</source>
+<target>ゴミ箱ã«ç§»å‹•</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹</target>
+
+<source>Versioning</source>
+<target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>ファイルã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã§æŒ‡å®šãƒ•ã‚©ãƒ«ãƒ€ã«ç§»å‹•</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>ファイル当ãŸã‚Šã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·åˆ¶é™</target>
<source>Configuration</source>
<target>構æˆè¨­å®š</target>
@@ -633,39 +681,6 @@ The command is triggered if:
<source>Conflict/item cannot be categorized</source>
<target>競åˆ/項目を分類化ã§ãã¾ã›ã‚“</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>比較対象...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ
- - 最終書ãè¾¼ã¿æ™‚刻ã€æ—¥æ™‚
- - ファイルサイズ
-ã§åˆ¤æ–­ã™ã‚‹
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-ファイルãŒåŒæ§˜ã ã£ãŸå ´åˆ
- - ファイル内容
-ã§åˆ¤æ–­ã™ã‚‹
-</target>
-
-<source>Symbolic Link handling</source>
-<target>シンボリック・リンクã®å–り扱ã„</target>
-
<source>Synchronizing...</source>
<target>åŒæœŸå‡¦ç†ä¸­...</target>
@@ -681,8 +696,8 @@ is the same
<source>Donate with PayPal</source>
<target>PayPal ã‹ã‚‰å¯„付ã™ã‚‹</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>FreeFileSync ã®ãƒ­ãƒ¼ã‚«ãƒ©ã‚¤ã‚ºã¸ã®å”力ã«æ„Ÿè¬ã—ã¾ã™:</target>
+<source>Many thanks for localization:</source>
+<target>ローカライズã®ã”å”力ã«æ„Ÿè¬ã—ã¾ã™:</target>
<source>Feedback and suggestions are welcome</source>
<target>フィードãƒãƒƒã‚¯ã€æ案ãªã©ã¯ã“ã¡ã‚‰ã‹ã‚‰</target>
@@ -699,9 +714,6 @@ is the same
<source>Published under the GNU General Public License</source>
<target>GNU 一般共有使用許諾ã«åŸºã¥ã公開ã•ã‚Œã¦ã„ã¾ã™</target>
-<source>Use Recycle Bin</source>
-<target>ゴミ箱を使用</target>
-
<source>Delete on both sides</source>
<target>両方を削除</target>
@@ -771,8 +783,8 @@ Note: File names must be relative to base directories!
<source>Statistics</source>
<target>統計</target>
-<source>Do not show this dialog again</source>
-<target>次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„</target>
+<source>Don't show this dialog again</source>
+<target>次回ã‹ã‚‰ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’表示ã—ãªã„</target>
<source>Find what:</source>
<target>検索語:</target>
@@ -855,11 +867,8 @@ Note: File names must be relative to base directories!
<source>Do you want to save changes to %x?</source>
<target>本当㫠%x ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹?</target>
-<source>Save</source>
-<target>ä¿å­˜</target>
-
-<source>Don't Save</source>
-<target>ä¿å­˜ã—ãªã„</target>
+<source>Do&n't save</source>
+<target>ä¿å­˜ã—ãªã„(&N)</target>
<source>Configuration loaded!</source>
<target>構æˆè¨­å®šã‚’読ã¿è¾¼ã¿ä¸­!</target>
@@ -951,8 +960,8 @@ Note: File names must be relative to base directories!
<source>Show files that won't be copied</source>
<target>コピーã•ã‚Œãªã‹ã£ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示</target>
-<source>All directories in sync!</source>
-<target>ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸ!</target>
+<source>All folders are in sync!</source>
+<target>ã™ã¹ã¦ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’åŒæœŸ!</target>
<source>Comma separated list</source>
<target>カンマ区切り</target>
@@ -1037,6 +1046,9 @@ Note: File names must be relative to base directories!
<source>Pause</source>
<target>一時åœæ­¢</target>
+<source>Logging</source>
+<target>ログ</target>
+
<source>Cannot find %x</source>
<target>%x ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“</target>
@@ -1116,21 +1128,6 @@ Note: File names must be relative to base directories!
<source>Leave as unresolved conflict</source>
<target>未解決ã®ç«¶åˆã¯ãã®ã¾ã¾æ®‹ã™</target>
-<source>Delete permanently</source>
-<target>完全ã«å‰Šé™¤</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>ファイルを上書ãã€ã¾ãŸã¯å®Œå…¨ã«å‰Šé™¤</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>ファイルã®å‰Šé™¤ã€ä¸Šæ›¸ã時ã«ã‚´ãƒŸç®±ã‚’使用ã™ã‚‹</target>
-
-<source>Versioning</source>
-<target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>サブフォルダã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’移動</target>
-
<source>Files</source>
<target>ファイル</target>
@@ -1218,8 +1215,11 @@ Note: File names must be relative to base directories!
<source>Cannot copy file %x to %y.</source>
<target>%x ã‹ã‚‰ %y ã«ã‚³ãƒ”ーã§ãã¾ã›ã‚“.</target>
-<source>Cannot read directory %x.</source>
-<target>ディレクトリ %x を読ã¿è¾¼ã‚ã¾ã›ã‚“.</target>
+<source>Cannot open directory %x.</source>
+<target>ディレクトリ %x ã‚’é–‹ã‘ã¾ã›ã‚“.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>ディレクトリ %x を列挙ã§ãã¾ã›ã‚“</target>
<source>Detected endless directory recursion.</source>
<target>ディレクトリå†å¸°å‡¦ç†ã§ãƒ«ãƒ¼ãƒ—を検出</target>
@@ -1245,6 +1245,9 @@ Note: File names must be relative to base directories!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>åŒæœŸæ–¹å‘ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨­å®š: å¤ã„ファイルã«æ–°ã—ã„ファイルを上書ã</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>以下ã®ãƒ‘スã«ã‚るゴミ箱ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“! 代ã‚ã‚Šã«ãƒ•ã‚¡ã‚¤ãƒ«ã¯å®Œå…¨å‰Šé™¤ã•ã‚Œã¾ã™:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>フォルダを空ã¨æƒ³å®šã™ã‚‹å ´åˆã¯ã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™.</target>
@@ -1254,6 +1257,9 @@ Note: File names must be relative to base directories!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>ディレクトリãŒä¾å­˜é–¢ä¿‚ã«ã‚ã‚Šã¾ã™! åŒæœŸè¦å‰‡ã®è¨­å®šæ™‚ã«ã¯æ³¨æ„ã—ã¦ãã ã•ã„:</target>
+<source>Start comparison</source>
+<target>比較を開始</target>
+
<source>Preparing synchronization...</source>
<target>åŒæœŸå‡¦ç†ã®æº–備中...</target>
@@ -1266,6 +1272,9 @@ Note: File names must be relative to base directories!
<source>Files %x have the same date but a different size!</source>
<target>ファイル %x ã¯ã€åŒã˜æ™‚é–“ã§ã™ãŒã‚µã‚¤ã‚ºãŒç•°ãªã£ã¦ã„ã¾ã™!</target>
+<source>Items differ in attributes only</source>
+<target>属性ã®ã¿ç•°ãªã‚‹é …ç›®</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>シンボリックリンク %x ã®æ—¥ä»˜ã¯åŒã˜ã§ã™ãŒã€å¯¾è±¡ãŒç•°ãªã£ã¦ã„ã¾ã™.</target>
@@ -1281,9 +1290,6 @@ Note: File names must be relative to base directories!
<source>Both sides are equal</source>
<target>両å´ã¨ã‚‚ç­‰ã—ã</target>
-<source>Items have different attributes</source>
-<target>属性ãŒç•°ãªã‚‹é …ç›®</target>
-
<source>Copy new item to left</source>
<target>æ–°ã—ã„項目を左ã«ã‚³ãƒ”ー</target>
@@ -1398,14 +1404,11 @@ Note: File names must be relative to base directories!
<source>Available:</source>
<target>利用å¯èƒ½:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>以下ã®ãƒ‘スã«ã‚るゴミ箱ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“! 代ã‚ã‚Šã«ãƒ•ã‚¡ã‚¤ãƒ«ã¯å®Œå…¨å‰Šé™¤ã•ã‚Œã¾ã™:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>複数フォルダペアã®ä¸€éƒ¨ã§ã‚るフォルダãŒå¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™. åŒæœŸè¨­å®šã‚’確èªã—ã¦ãã ã•ã„.</target>
-<source>Processing folder pair:</source>
-<target>フォルダペアを処ç†ä¸­:</target>
+<source>Synchronizing folder pair:</source>
+<target>フォルダペアをåŒæœŸå‡¦ç†ä¸­:</target>
<source>Target folder %x already existing.</source>
<target>対象フォルダ %x ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™.</target>
diff --git a/BUILD/Languages/korean.lng b/BUILD/Languages/korean.lng
index 79f58d51..db2d73a6 100644
--- a/BUILD/Languages/korean.lng
+++ b/BUILD/Languages/korean.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>í´ë” %x 검색 중...</target>
+<source>Items processed:</source>
+<target>ì²˜ë¦¬ëœ í•­ëª© :</target>
+
+<source>Items remaining:</source>
+<target>ë‚¨ì€ í•­ëª© :</target>
+
+<source>Total time:</source>
+<target>전체 시간 :</target>
+
<source>Show in Explorer</source>
<target>íƒìƒ‰ê¸°ì— 표시</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>ì¼ê´„ìž‘ì—… ìƒì„±</target>
-<source>Synchronization settings</source>
-<target>ë™ê¸°í™” 설정</target>
-
<source>Comparison settings</source>
<target>ë¹„êµ ì„¤ì •</target>
+<source>Synchronization settings</source>
+<target>ë™ê¸°í™” 설정</target>
+
<source>About</source>
<target>ìƒì„¸ ì •ë³´</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>시간간격(타임스팬) ì„ íƒ</target>
-<source>Show pop-up</source>
-<target>íŒì—… ë³´ì´ê¸°</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>오류 ë˜ëŠ” ê²½ê³ ì— ëŒ€í•œ íŒì—… ë³´ì´ê¸°</target>
-
-<source>Ignore errors</source>
-<target>오류 무시</target>
-
-<source>Hide all error and warning messages</source>
-<target>모든 오류/경고 메세지 숨기기</target>
-
-<source>Exit instantly</source>
-<target>즉시 종료</target>
-
-<source>Abort synchronization immediately</source>
-<target>ë™ê¸°í™” ìž‘ì—… 즉시 중단</target>
-
-<source>Browse</source>
-<target>찾아보기</target>
-
<source>Invalid command line:</source>
<target>ìž˜ëª»ëœ ëª…ë ¹ì¤„ :</target>
@@ -232,8 +220,8 @@
<source>&Open...</source>
<target>열기(&O)</target>
-<source>Save &As...</source>
-<target>다른 ì´ë¦„으로 저장(&A)</target>
+<source>Save &as...</source>
+<target>다른 ì´ë¦„으로 저장(&a)</target>
<source>&Quit</source>
<target>종료(&Q)</target>
@@ -274,6 +262,9 @@
<source>Remove folder</source>
<target>í´ë” 제거</target>
+<source>Browse</source>
+<target>찾아보기</target>
+
<source>Select a folder</source>
<target>í´ë” ì„ íƒ</target>
@@ -306,8 +297,8 @@ The command is triggered if:
<source>Cancel</source>
<target>취소</target>
-<source>(Build: %x)</source>
-<target>(빌드: %x)</target>
+<source>Build: %x</source>
+<target>빌드: %x</target>
<source>All files</source>
<target>모든 파ì¼</target>
@@ -327,9 +318,6 @@ The command is triggered if:
<source>A folder input field is empty.</source>
<target>í´ë” ìž…ë ¥ í•„ë“œ 하나가 비어 있습니다.</target>
-<source>Logging</source>
-<target>로깅</target>
-
<source>File time and size</source>
<target>íŒŒì¼ ì‹œê°„ ë° í¬ê¸°</target>
@@ -351,21 +339,6 @@ The command is triggered if:
<source>FreeFileSync batch</source>
<target>FreeFileSync ì¼ê´„처리(배치)</target>
-<source>Batch execution</source>
-<target>ì¼ê´„ 실행</target>
-
-<source>Items processed:</source>
-<target>ì²˜ë¦¬ëœ í•­ëª© :</target>
-
-<source>Items remaining:</source>
-<target>ë‚¨ì€ í•­ëª© :</target>
-
-<source>Total time:</source>
-<target>전체 시간 :</target>
-
-<source>Stop</source>
-<target>정지</target>
-
<source>Synchronization aborted!</source>
<target>ë™ê¸°í™” 중단!</target>
@@ -448,7 +421,7 @@ The command is triggered if:
<target>드래그 && ë“œëž (마우스로 íŒŒì¼ ëŒì–´ë‹¤ 놓기)</target>
<source>Close progress dialog</source>
-<target>프로그레스 다ì´ì–¼ë¡œê·¸ (진행창) 닫기</target>
+<target>프로그레스 다ì´ì–¼ë¡œê·¸ (진행 ì°½) 닫기</target>
<source>Standby</source>
<target>대기</target>
@@ -525,20 +498,20 @@ The command is triggered if:
<source>Last used configurations (press DEL to remove from list)</source>
<target>마지막으로 사용한 설정 (DEL 키를 누르면 리스트ì—ì„œ ì‚­ì œ)</target>
-<source>Hide excluded items</source>
-<target>ì œì™¸ëœ í•­ëª© 숨기기</target>
+<source>Show excluded items</source>
+<target>제외 항목 ë³´ì´ê¸°</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>í•„í„°ë§ ë˜ê±°ë‚˜ ìž„ì‹œ ì œì™¸ë  íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>í•„í„°ë§ ë˜ëŠ” ì¼ì‹œì ìœ¼ë¡œ ì œì™¸ëœ íŒŒì¼ ë³´ì´ê¸°</target>
<source>Number of files and folders that will be created</source>
-<target>ìƒì„±ë  íŒŒì¼ ë° í´ë” ​​개수</target>
+<target>ìƒì„±ë  íŒŒì¼ ë° í´ë” 개수</target>
<source>Number of files that will be overwritten</source>
<target>ë®ì–´ 씌어질 íŒŒì¼ ê°œìˆ˜</target>
<source>Number of files and folders that will be deleted</source>
-<target>ì‚­ì œë  íŒŒì¼ ë° í´ë” ​​개수</target>
+<target>ì‚­ì œë  íŒŒì¼ ë° í´ë” 개수</target>
<source>Total bytes to copy</source>
<target>복사할 ì „ì²´ ë°”ì´íŠ¸ í¬ê¸°</target>
@@ -559,7 +532,7 @@ The command is triggered if:
<target>ì¼ê´„ ìž‘ì—…</target>
<source>Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe <job name>.ffs_batch</source>
-<target>ìžë™ ë™ê¸°í™” ìž‘ì—…ì„ ìœ„í•œ ì¼ê´„ 파ì¼ì„ 만듭니다. 본 파ì¼ì„ ë”블 í´ë¦­í•˜ê±°ë‚˜ 시스템 íƒœìŠ¤í¬ í”Œëž˜ë„ˆì— ë‹¤ìŒê³¼ ê°™ì´ ì˜ˆì•½í•˜ì„¸ìš” : FreeFileSync.exe <job name>.ffs_batch</target>
+<target>ìžë™ ë™ê¸°í™”를 위한 ì¼ê´„ 파ì¼ì„ 만듭니다. 본 파ì¼ì„ ë”블 í´ë¦­í•˜ê±°ë‚˜ 시스템 íƒœìŠ¤í¬ í”Œëž˜ë„ˆì— ë‹¤ìŒê³¼ ê°™ì´ ì˜ˆì•½í•˜ì„¸ìš” : FreeFileSync.exe <job name>.ffs_batch</target>
<source>Help</source>
<target>ë„움ë§</target>
@@ -573,24 +546,81 @@ The command is triggered if:
<source>Right</source>
<target>우측</target>
-<source>Status feedback</source>
-<target>ìƒíƒœ 피드백</target>
+<source>Error handling</source>
+<target>오류 ë°œìƒì‹œ :</target>
+
+<source>Ignore</source>
+<target>무시</target>
+
+<source>Hide all error and warning messages</source>
+<target>모든 오류/경고 메세지 숨기기</target>
+
+<source>Pop-up</source>
+<target>íŒì—…</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>오류 ë˜ëŠ” ê²½ê³ ì— ëŒ€í•œ íŒì—… ë³´ì´ê¸°</target>
+
+<source>Exit</source>
+<target>종료</target>
+
+<source>Abort synchronization on first error</source>
+<target>첫 번째 오류 ì‹œ ë™ê¸°í™” 중지</target>
+
+<source>On completion:</source>
+<target>완료 :</target>
<source>Show progress dialog</source>
-<target>프로그레스 다ì´ì–¼ë¡œê·¸ (진행창) 보기</target>
+<target>프로그레스 다ì´ì–¼ë¡œê·¸ (진행 ì°½) 보기</target>
-<source>Error handling</source>
-<target>오류 ë°œìƒì‹œ :</target>
+<source>Generate log file</source>
+<target>로그 íŒŒì¼ ìƒì„±</target>
-<source>Maximum number of log files:</source>
-<target>최대 ë¡œê·¸íŒŒì¼ ê°œìˆ˜ :</target>
+<source>Select folder to save log files</source>
+<target>로그 파ì¼ì„ 저장할 í´ë” ì„ íƒ</target>
-<source>Select folder to save log files:</source>
-<target>로그 파ì¼ì„ 저장할 í´ë”를 ì„ íƒ :</target>
+<source>Limit</source>
+<target>제한</target>
+
+<source>Limit maximum number of log files</source>
+<target>로그 파ì¼ì˜ 최대 개수 제한</target>
<source>Batch settings</source>
<target>ì¼ê´„ 설정</target>
+<source>Compare by...</source>
+<target>ëŒ€ìƒ ë³„ 비êµ...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+비êµëœ 양쪽 파ì¼ì€
+마지막 쓰기 시간과 날짜,
+그리고 íŒŒì¼ í¬ê¸°ê°€ ëª¨ë‘ ê°™ì„ ê²½ìš°,
+ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤.
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+비êµëœ 양쪽 파ì¼ì€
+íŒŒì¼ ë‚´ìš©ì´ ê°™ì„ ê²½ìš°,
+ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤.
+</target>
+
+<source>Symbolic Link handling</source>
+<target>심볼릭 ë§í¬ 처리</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>옵션 ì„ íƒ :</target>
@@ -609,8 +639,26 @@ The command is triggered if:
<source>Deletion handling</source>
<target>삭제 처리 옵션</target>
-<source>On completion:</source>
-<target>완료 :</target>
+<source>Permanent</source>
+<target>ì˜êµ¬</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>íŒŒì¼ ì˜êµ¬ ì‚­ì œ ë˜ëŠ” ë®ì–´ì“°ê¸°</target>
+
+<source>Recycle Bin</source>
+<target>휴지통</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>파ì¼ì„ 삭제하거나 ë®ì–´ì“°ê¸° í•  ë•Œ, 휴지통 사용</target>
+
+<source>Versioning</source>
+<target>버저ë‹</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>타임스탬핑(ìƒì„±ì‹œê°„ ë‚ ì¸)ëœ íŒŒì¼ì„ ì§€ì •ëœ í´ë”ë¡œ ì´ë™</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>íŒŒì¼ ë‹¹ 버전 최대 개수 제한</target>
<source>Configuration</source>
<target>구성 설정</target>
@@ -633,39 +681,6 @@ The command is triggered if:
<source>Conflict/item cannot be categorized</source>
<target>ì¶©ëŒ / í•­ëª©ì„ ë¶„ë¥˜í•  수 ì—†ìŒ</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>ëŒ€ìƒ ë³„ 비êµ...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-비êµëœ 양쪽 파ì¼ì€
-마지막 쓰기 시간과 날짜,
-그리고 íŒŒì¼ í¬ê¸°ê°€ ê°™ì„ ê²½ìš°,
-ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤.
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-비êµëœ 양쪽 파ì¼ì€
-íŒŒì¼ ë‚´ìš©ì´ ê°™ì„ ê²½ìš°,
-ë™ì¼í•œ 파ì¼ë¡œ 간주ë©ë‹ˆë‹¤.
-</target>
-
-<source>Symbolic Link handling</source>
-<target>심볼릭 ë§í¬ 처리</target>
-
<source>Synchronizing...</source>
<target>ë™ê¸°í™” ìž‘ì—… 중...</target>
@@ -681,8 +696,8 @@ is the same
<source>Donate with PayPal</source>
<target>PayPal로 기부하기</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>FreeFileSync í˜„ì§€í™”ì— ë„ì›€ì„ ì£¼ì‹  분들께 ê°ì‚¬ 드립니다 :</target>
+<source>Many thanks for localization:</source>
+<target>현지화 ìž‘ì—…ì— ê¹Šì€ ê°ì‚¬ 드립니다:</target>
<source>Feedback and suggestions are welcome</source>
<target>모든 ì˜ê²¬ ë° ê±´ì˜/ì œì•ˆì„ í™˜ì˜í•©ë‹ˆë‹¤</target>
@@ -699,9 +714,6 @@ is the same
<source>Published under the GNU General Public License</source>
<target>GNU ì¼ë°˜ 공용 ë¼ì´ì„¼ìŠ¤ì— ì˜í•œ 출시</target>
-<source>Use Recycle Bin</source>
-<target>휴지통 사용</target>
-
<source>Delete on both sides</source>
<target>양측 ëª¨ë‘ ì‚­ì œ</target>
@@ -757,7 +769,7 @@ Note: File names must be relative to base directories!
<target>íŒŒì¼ ë° í´ë” 사용 권한 전송 (ê´€ë¦¬ìž ê¶Œí•œ í•„ìš”)</target>
<source>Restore hidden dialogs</source>
-<target>숨겨진 대화창 ë³µì›</target>
+<target>숨겨진 대화 ìƒìž ë³µì›</target>
<source>External applications</source>
<target>외부 ì‘ìš© 프로그램</target>
@@ -771,8 +783,8 @@ Note: File names must be relative to base directories!
<source>Statistics</source>
<target>통계</target>
-<source>Do not show this dialog again</source>
-<target>다ìŒë¶€í„° 표시하지 ì•ŠìŒ</target>
+<source>Don't show this dialog again</source>
+<target>ì´ ëŒ€í™” ìƒìžë¥¼ 다시 표시하지 ì•ŠìŒ</target>
<source>Find what:</source>
<target>검색어 :</target>
@@ -855,11 +867,8 @@ Note: File names must be relative to base directories!
<source>Do you want to save changes to %x?</source>
<target>%xì˜ ë³€ê²½ì‚¬í•­ì„ ì €ìž¥í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</target>
-<source>Save</source>
-<target>저장</target>
-
-<source>Don't Save</source>
-<target>저장 안 함.</target>
+<source>Do&n't save</source>
+<target>저장하기 않기(&n)</target>
<source>Configuration loaded!</source>
<target>설정 로드 완료!</target>
@@ -951,8 +960,8 @@ Note: File names must be relative to base directories!
<source>Show files that won't be copied</source>
<target>복사ë˜ì§€ ì•Šì„ íŒŒì¼ í‘œì‹œ</target>
-<source>All directories in sync!</source>
-<target>모든 디렉토리 ë™ê¸°í™”!</target>
+<source>All folders are in sync!</source>
+<target>모든 í´ë”ê°€ ë™ê¸°í™” ë˜ì—ˆìŒ!</target>
<source>Comma separated list</source>
<target>콤마 분리 목ë¡</target>
@@ -1037,6 +1046,9 @@ Note: File names must be relative to base directories!
<source>Pause</source>
<target>ì¼ì‹œì •ì§€</target>
+<source>Logging</source>
+<target>로깅</target>
+
<source>Cannot find %x</source>
<target>%x ì„(를) ì°¾ì„ ìˆ˜ 없습니다.</target>
@@ -1095,7 +1107,7 @@ Note: File names must be relative to base directories!
<target>- %dir ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ</target>
<source>Make hidden dialogs and warning messages visible again?</source>
-<target>숨겨진 대화창ì´ë‚˜ 경고 메세지를 다시 ë³´ì´ê²Œ 하시겠습니까?</target>
+<target>숨겨진 대화 ìƒìžë‚˜ 경고 메세지를 다시 ë³´ì´ê²Œ 하시겠습니까?</target>
<source>
<pluralform>Do you really want to move the following object to the Recycle Bin?</pluralform>
@@ -1116,21 +1128,6 @@ Note: File names must be relative to base directories!
<source>Leave as unresolved conflict</source>
<target>í•´ê²°ë˜ì§€ ì•Šì€ ì¶©ëŒë¡œ 놔ë‘기</target>
-<source>Delete permanently</source>
-<target>ì˜êµ¬ ì‚­ì œ</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>íŒŒì¼ ì˜êµ¬ ì‚­ì œ ë˜ëŠ” ë®ì–´ì“°ê¸°</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>파ì¼ì„ 삭제하거나 ë®ì–´ì“°ê¸° í•  ë•Œ, 휴지통 사용</target>
-
-<source>Versioning</source>
-<target>버저ë‹</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>시간 기ë¡ì´ 남는 하위 í´ë”ë¡œ íŒŒì¼ ì´ë™</target>
-
<source>Files</source>
<target>파ì¼</target>
@@ -1218,8 +1215,11 @@ Note: File names must be relative to base directories!
<source>Cannot copy file %x to %y.</source>
<target>íŒŒì¼ %x ì„(를) %y (으)ë¡œ 복사할 수 없습니다.</target>
-<source>Cannot read directory %x.</source>
-<target>디렉토리 %x ì„(를) ì½ì„ 수 없습니다.</target>
+<source>Cannot open directory %x.</source>
+<target>디렉토리 %x ì„(를) ì—´ 수 없습니다.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>디렉토리 %x ì„(를) ì—´ê±°í•  수 없습니다.</target>
<source>Detected endless directory recursion.</source>
<target>ì‚­ì œëœ ë¬´í•œ 디렉토리 재귀(반복)</target>
@@ -1245,6 +1245,9 @@ Note: File names must be relative to base directories!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>기본값 ë™ê¸°í™” ë°©í–¥ 설정 : ì´ì „ 파ì¼ë“¤ì€ ì‹ ê·œ 파ì¼ë“¤ë¡œ ë®ì–´ 쓰여집니다.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>ë‹¤ìŒ ê²½ë¡œë¡œëŠ” íœ´ì§€í†µì„ ì‚¬ìš©í•  수 없습니다! 대신 파ì¼ì„ ì˜êµ¬ì ìœ¼ë¡œ 삭제합니다 :</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>í´ë”를 빈 ìƒíƒœë¡œ 가정할 경우, ì´ ì˜¤ë¥˜ëŠ” ë¬´ì‹œë  ìˆ˜ 있습니다.</target>
@@ -1254,6 +1257,9 @@ Note: File names must be relative to base directories!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>디렉토리가 ì˜ì¡´ ê´€ê³„ì— ìžˆìŠµë‹ˆë‹¤. ë™ê¸°í™” 규칙 설정시 주ì˜í•˜ì‹­ì‹œì˜¤.</target>
+<source>Start comparison</source>
+<target>ë¹„êµ ì‹œìž‘</target>
+
<source>Preparing synchronization...</source>
<target>ë™ê¸°í™” 준비 중...</target>
@@ -1266,6 +1272,9 @@ Note: File names must be relative to base directories!
<source>Files %x have the same date but a different size!</source>
<target>íŒŒì¼ %x ì˜ ë‚ ì§œëŠ” 같으나, í¬ê¸°ê°€ 다릅니다!</target>
+<source>Items differ in attributes only</source>
+<target>í•­ëª©ë“¤ì´ ì†ì„±ì—서만 ì°¨ì´ê°€ 있습니다.</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>심볼릭 ë§í¬ %x ì˜ ë‚ ì§œëŠ” 같으나, íƒ€ê²Ÿì´ ë‹¤ë¦…ë‹ˆë‹¤.</target>
@@ -1281,9 +1290,6 @@ Note: File names must be relative to base directories!
<source>Both sides are equal</source>
<target>ì–‘ì¸¡ì´ ê°™ìŒ</target>
-<source>Items have different attributes</source>
-<target>í•­ëª©ì˜ ì†ì„±ì´ 서로 다릅니다.</target>
-
<source>Copy new item to left</source>
<target>ì¢Œì¸¡ì— ìƒˆ 항목 복사</target>
@@ -1398,14 +1404,11 @@ Note: File names must be relative to base directories!
<source>Available:</source>
<target>여유 공간(í¬ê¸°) :</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>ë‹¤ìŒ ê²½ë¡œë¡œëŠ” íœ´ì§€í†µì„ ì‚¬ìš©í•  수 없습니다! 대신 파ì¼ì„ ì˜êµ¬ì ìœ¼ë¡œ 삭제합니다 :</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>다중 í´ë” íŽ˜ì–´ì˜ ì¼ë¶€ì¸ í´ë”ê°€ 변경ë©ë‹ˆë‹¤. ë™ê¸°í™” ì„¤ì •ì„ ìž¬ê²€í† í•˜ì„¸ìš”.</target>
-<source>Processing folder pair:</source>
-<target>í´ë” 페어 처리 중 :</target>
+<source>Synchronizing folder pair:</source>
+<target>í´ë” 페어(ì§) ë™ê¸°í™” 진행 중</target>
<source>Target folder %x already existing.</source>
<target>ëŒ€ìƒ í´ë” %xì´(ê°€) ì´ë¯¸ 존재함.</target>
diff --git a/BUILD/Languages/lithuanian.lng b/BUILD/Languages/lithuanian.lng
index 7b44874a..c4e82e6f 100644
--- a/BUILD/Languages/lithuanian.lng
+++ b/BUILD/Languages/lithuanian.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>Ieškoma aplanko %x...</target>
+<source>Items processed:</source>
+<target>Elementų apdorota:</target>
+
+<source>Items remaining:</source>
+<target>LikÄ™ elementai:</target>
+
+<source>Total time:</source>
+<target>Visas laikas:</target>
+
<source>Show in Explorer</source>
<target>Rodyti naršyklėje</target>
@@ -22,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Nutraukti: laukiama kol baigsis esama operacija...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automatizuotas sinchronizavimas</target>
@@ -49,12 +61,12 @@
<source>Create a batch job</source>
<target>Sukurti paketinę užduotį</target>
-<source>Synchronization settings</source>
-<target>Sinchronizavimo nustatymai</target>
-
<source>Comparison settings</source>
<target>Sulyginimo nustatymai</target>
+<source>Synchronization settings</source>
+<target>Sinchronizavimo nustatymai</target>
+
<source>About</source>
<target>Apie</target>
@@ -76,27 +88,6 @@
<source>Select time span</source>
<target>Pažymėti laiko trukmę</target>
-<source>Show pop-up</source>
-<target>Rodyti pranešimą</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Rodyti pranešimą esant klaidoms ar perspėjimams</target>
-
-<source>Ignore errors</source>
-<target>Ignoruoti klaidas</target>
-
-<source>Hide all error and warning messages</source>
-<target>Slėpti visus klaidų ir perspėjimų pranešimus</target>
-
-<source>Exit instantly</source>
-<target>Išeiti iškart</target>
-
-<source>Abort synchronization immediately</source>
-<target>Atšaukti sinchronizavimą dabar</target>
-
-<source>Browse</source>
-<target>Naršyti</target>
-
<source>Invalid command line:</source>
<target>Netinkama komandinÄ— eilutÄ—:</target>
@@ -148,7 +139,7 @@
<target>Duomenų bazės failo %x dar nėra.</target>
<source>Database file is corrupt:</source>
-<target></target>
+<target>Duomenų bazės failas sugadintas</target>
<source>Out of memory!</source>
<target>Trūksta atminties!</target>
@@ -241,8 +232,8 @@
<source>&Open...</source>
<target>&Atverti...</target>
-<source>Save &As...</source>
-<target></target>
+<source>Save &as...</source>
+<target>IÅ¡saugoti &kaip...</target>
<source>&Quit</source>
<target>&IÅ¡eiti</target>
@@ -283,6 +274,9 @@
<source>Remove folder</source>
<target>Pašalinti aplanką</target>
+<source>Browse</source>
+<target>Naršyti</target>
+
<source>Select a folder</source>
<target>Pažymėti aplanką</target>
@@ -315,11 +309,11 @@ Komanda inicijuojama jei:
<source>Cancel</source>
<target>Atšaukti</target>
-<source>(Build: %x)</source>
-<target>(Komponavimo versija: %x)</target>
+<source>Build: %x</source>
+<target>Versija: %x</target>
<source>All files</source>
-<target></target>
+<target>Visi failai</target>
<source>&Restore</source>
<target>&Atstatyti</target>
@@ -334,10 +328,7 @@ Komanda inicijuojama jei:
<target>Laikiama trūkstamų katalogų...</target>
<source>A folder input field is empty.</source>
-<target></target>
-
-<source>Logging</source>
-<target>Užduoties duomenys</target>
+<target>Aplanko įvesties laukas yra tuÅ¡Äias.</target>
<source>File time and size</source>
<target>Failo laiką ir dydį</target>
@@ -358,22 +349,7 @@ Komanda inicijuojama jei:
<target>Savitas</target>
<source>FreeFileSync batch</source>
-<target></target>
-
-<source>Batch execution</source>
-<target>Paketinės užduoties vykdymas</target>
-
-<source>Items processed:</source>
-<target>Elementų apdorota:</target>
-
-<source>Items remaining:</source>
-<target>LikÄ™ elementai:</target>
-
-<source>Total time:</source>
-<target>Visas laikas:</target>
-
-<source>Stop</source>
-<target>Stabdyti</target>
+<target>FreeFileSync paketinė užduotis</target>
<source>Synchronization aborted!</source>
<target>Synchronizavimas nutrauktas!</target>
@@ -397,7 +373,7 @@ Komanda inicijuojama jei:
<target>Nepavyksta prisijungti prie sourceforge.net!</target>
<source>A new version of FreeFileSync is available:</source>
-<target></target>
+<target>Yra nauja FreeFileSync versija:</target>
<source>Download now?</source>
<target>Atsiųsti dabar?</target>
@@ -442,10 +418,10 @@ Komanda inicijuojama jei:
<target>PlÄ—tinys</target>
<source>Size:</source>
-<target></target>
+<target>Dydis:</target>
<source>Date:</source>
-<target></target>
+<target>Data:</target>
<source>Action</source>
<target>Veiksmas</target>
@@ -481,7 +457,7 @@ Komanda inicijuojama jei:
<target>&Naujas</target>
<source>&Save</source>
-<target></target>
+<target>&IÅ¡saugoti</target>
<source>&Language</source>
<target>&Kalba</target>
@@ -534,11 +510,11 @@ Komanda inicijuojama jei:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Paskiausiai naudoti nustatymai (spauskite DEL, kad pašalinti iš sąrašo)</target>
-<source>Hide excluded items</source>
-<target>Slėpti neįtrauktus elementus</target>
+<source>Show excluded items</source>
+<target>Rodyti išskirtus elementus</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Slėpti išfiltruotus ar laikinai neįtrauktus failus</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Rodyti išfiltruotus ar laikinai išskirtus failus</target>
<source>Number of files and folders that will be created</source>
<target>Failų ir aplankų, kurie bus sukurti, skaiÄius</target>
@@ -550,7 +526,7 @@ Komanda inicijuojama jei:
<target>Failų ir aplankų, kurie bus iÅ¡trinti, skaiÄius</target>
<source>Total bytes to copy</source>
-<target></target>
+<target>Viso baitų kopijuoti</target>
<source>Items found:</source>
<target>Rasta elementų:</target>
@@ -559,10 +535,10 @@ Komanda inicijuojama jei:
<target>Greitis:</target>
<source>Time remaining:</source>
-<target></target>
+<target>Likęs laikas:</target>
<source>Time elapsed:</source>
-<target></target>
+<target>Praėjęs laikas:</target>
<source>Batch job</source>
<target>Paketinė užduotis</target>
@@ -582,24 +558,81 @@ Komanda inicijuojama jei:
<source>Right</source>
<target>Dešinė</target>
-<source>Status feedback</source>
-<target>Būsenos grįžtamasis ryšys</target>
+<source>Error handling</source>
+<target>Klaidų valdymas</target>
+
+<source>Ignore</source>
+<target>Ignoruoti</target>
+
+<source>Hide all error and warning messages</source>
+<target>Slėpti visus klaidų ir perspėjimų pranešimus</target>
+
+<source>Pop-up</source>
+<target>IÅ¡Å¡okti</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Rodyti pranešimą esant klaidoms ar perspėjimams</target>
+
+<source>Exit</source>
+<target>IÅ¡eiti</target>
+
+<source>Abort synchronization on first error</source>
+<target>Nutraukti sinchronizavimÄ… su pirma klaida</target>
+
+<source>On completion:</source>
+<target>Baigus:</target>
<source>Show progress dialog</source>
<target>Rodyti eigos langÄ…</target>
-<source>Error handling</source>
-<target>Klaidų valdymas</target>
+<source>Generate log file</source>
+<target>Bendras ataskaitos failas</target>
+
+<source>Select folder to save log files</source>
+<target>Pasirinkite aplanką ataskaitos failų saugojimui</target>
-<source>Maximum number of log files:</source>
-<target>Didžiausias ataskaitų failų skaiÄius:</target>
+<source>Limit</source>
+<target>Riba</target>
-<source>Select folder to save log files:</source>
-<target>Pasirinkite aplanką, kuriame saugoti ataskaitų failus:</target>
+<source>Limit maximum number of log files</source>
+<target>Apriboti ataskaitų failų skaiÄių</target>
<source>Batch settings</source>
<target>Paketinės užduoties nustatymai</target>
+<source>Compare by...</source>
+<target>Sulyginti pagal...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Failai laikomi lygiais jei
+ - paskutinis rašymo laikas ir data
+ - failo dydis
+yra tokie patys
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Failai laikomi lygiais jei
+ - failo turinys
+yra toks pats
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Simbolinių nuorodų valdymas</target>
+
+<source>OK</source>
+<target>Gerai</target>
+
<source>Select variant:</source>
<target>Pažymėkite variantą:</target>
@@ -618,8 +651,26 @@ Komanda inicijuojama jei:
<source>Deletion handling</source>
<target>Trinimo valdymas</target>
-<source>On completion:</source>
-<target>Baigus:</target>
+<source>Permanent</source>
+<target>Visiškai</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Trinti ar perrašyti failus visam laikui</target>
+
+<source>Recycle Bin</source>
+<target>Šiukšliadėžė</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Naudoti šiukšliadėžę kaii trinami ar perrašomi failai</target>
+
+<source>Versioning</source>
+<target>Versijavimas</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Perkelti su laiko žyme failus į nurodytą aplanką</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Apriboti versijų skaiÄių failui</target>
<source>Configuration</source>
<target>Nustatymai</target>
@@ -642,39 +693,6 @@ Komanda inicijuojama jei:
<source>Conflict/item cannot be categorized</source>
<target>Konfliktas/elementas negali būti kategorizuojamas</target>
-<source>OK</source>
-<target>Gerai</target>
-
-<source>Compare by...</source>
-<target>Sulyginti pagal...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Failai laikomi lygiais jei
- - paskutinis rašymo laikas ir data
- - failo dydis
-yra tokie patys
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Failai laikomi lygiais jei
- - failo turinys
-yra toks pats
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Simbolinių nuorodų valdymas</target>
-
<source>Synchronizing...</source>
<target>Sinchronizuojama...</target>
@@ -690,8 +708,8 @@ yra toks pats
<source>Donate with PayPal</source>
<target>Paremkite per PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Didelė padėka už FreeFileSync vertimą reiškiama:</target>
+<source>Many thanks for localization:</source>
+<target>Labai dėkojame už vertimą:</target>
<source>Feedback and suggestions are welcome</source>
<target>NuomonÄ— ir patarimai laukiami</target>
@@ -708,9 +726,6 @@ yra toks pats
<source>Published under the GNU General Public License</source>
<target>Platinama su GNU General Public licenzija</target>
-<source>Use Recycle Bin</source>
-<target>Naudoti šiukšliadėžę</target>
-
<source>Delete on both sides</source>
<target>IÅ¡trinti abiejose pusÄ—se</target>
@@ -780,8 +795,8 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<source>Statistics</source>
<target>Statistika</target>
-<source>Do not show this dialog again</source>
-<target>Nerodyti Å¡io lango daugiau</target>
+<source>Don't show this dialog again</source>
+<target>Daugiau nerodyti Å¡io dialogo</target>
<source>Find what:</source>
<target>Rasti kas:</target>
@@ -862,13 +877,10 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<target>Niekada nesaugoti pakeitimų</target>
<source>Do you want to save changes to %x?</source>
-<target></target>
+<target>Ar norite išsaugoti %x pakeitimus?</target>
-<source>Save</source>
-<target></target>
-
-<source>Don't Save</source>
-<target></target>
+<source>Do&n't save</source>
+<target>&Nesaugoti</target>
<source>Configuration loaded!</source>
<target>Nustatymai įkelti!</target>
@@ -960,8 +972,8 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<source>Show files that won't be copied</source>
<target>Rodyti failus, kurie ne bus kopijuojami</target>
-<source>All directories in sync!</source>
-<target>Visi katalogai sinchronizuoti!</target>
+<source>All folders are in sync!</source>
+<target>Visi aplankai susinchronizuoti!</target>
<source>Comma separated list</source>
<target>Kableliais atksirtas sąrašas</target>
@@ -1058,6 +1070,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<source>Pause</source>
<target>Pristabdyti</target>
+<source>Logging</source>
+<target>Užduoties duomenys</target>
+
<source>Cannot find %x</source>
<target>Nepavyksta rasti %x</target>
@@ -1143,21 +1158,6 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<source>Leave as unresolved conflict</source>
<target>Palikti kaip neišpręstą konfliktą</target>
-<source>Delete permanently</source>
-<target>IÅ¡trinti visam laikui</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Trinti ar perrašyti failus visam laikui</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Naudoti šiukšliadėžę kaii trinami ar perrašomi failai</target>
-
-<source>Versioning</source>
-<target>Versijavimas</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Perkelti failus į laiku pažymėtus poaplankius</target>
-
<source>Files</source>
<target>Failai</target>
@@ -1254,8 +1254,11 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<source>Cannot copy file %x to %y.</source>
<target>Nepavyksta nukopijuoti failo %x į %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Nepavyksta nuskaityti katalogo %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Nepavyksta atverti direktorijos %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Nepavyksta sunumeruoti direktorijos %x.</target>
<source>Detected endless directory recursion.</source>
<target>Aptikri nesibaigianÄiÄ… katalogo rekursijÄ….</target>
@@ -1276,11 +1279,14 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<target>NÄ—ra pakitimo nuo pakutinio sinchronizavimo!</target>
<source>The corresponding database entries are not in sync considering current settings.</source>
-<target></target>
+<target>Atitinkami duomenų bazės įrašai nėra susinchronizuoti atsižvelgiant į dabartinius nustatymus.</target>
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Nustatomos numatytos sinchronizavimo kryptys: Seni failai bus perrašyti naujesniais failais.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Šiukšliadėžė nepasiekiama sekantiems keliams! Failai bus ištrinti visam laikui išskyrus:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Galite ignoruoti Å¡iÄ… klaidÄ…, kad laikyti aplankÄ… tuÅ¡Äiu.</target>
@@ -1290,6 +1296,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Katalogai yra priklausomi! Būkite atsargūs nustatydami sinchronizavimo taisykles:</target>
+<source>Start comparison</source>
+<target>PradÄ—ti palyginimÄ…</target>
+
<source>Preparing synchronization...</source>
<target>Ruošiamas sinchronizavimas...</target>
@@ -1302,6 +1311,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<source>Files %x have the same date but a different size!</source>
<target>Failai %x turi tokiÄ… paÄiÄ… datÄ… bet skirtingÄ… dydį!</target>
+<source>Items differ in attributes only</source>
+<target>Elementai skiriasi tik atributais</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>SimbolinÄ—s nuorodos %x turi tokiÄ… paÄiÄ… datÄ… bet skirtingus tikslus</target>
@@ -1317,9 +1329,6 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<source>Both sides are equal</source>
<target>Abi pusÄ—s yra lygios</target>
-<source>Items have different attributes</source>
-<target>Elementai turi skirtingus atributus</target>
-
<source>Copy new item to left</source>
<target>Kopijuoti naują elementą į kairę</target>
@@ -1383,6 +1392,9 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<source>Moving symbolic link %x to %y</source>
<target>Perkeliama simbolinė nuoroda %x į %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>Kuriamas failas %x</target>
@@ -1405,13 +1417,13 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<target>Atnaujinami atributai %x</target>
<source>Target folder input field must not be empty.</source>
-<target></target>
+<target>Tikslo aplanko įvesties laukas negali bÅ«ti tuÅ¡Äias.</target>
<source>Folder input field for versioning must not be empty.</source>
-<target></target>
+<target>Aplanko įvesties laukas versijavimui negali bÅ«ti tuÅ¡Äias.</target>
<source>Source folder %x not found.</source>
-<target></target>
+<target>Å altinio aplankas %x nerastas.</target>
<source>Unresolved conflicts existing!</source>
<target>Yra neišspręstų konfliktų!</target>
@@ -1429,22 +1441,19 @@ Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
<target>Nepakanka laisvos disko vietos:</target>
<source>Required:</source>
-<target></target>
+<target>Reikia:</target>
<source>Available:</source>
-<target></target>
-
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Šiukšliadėžė nepasiekiama sekantiems keliams! Failai bus ištrinti visam laikui išskyrus:</target>
+<target>Pasiekiama:</target>
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Aplankas, kuris yra dalis keletos aplankų porų, bus pakeistas. Prašome peržiūrėti sinchronizavimo nustatymus.</target>
-<source>Processing folder pair:</source>
-<target>Apdorojama aplankų pora:</target>
+<source>Synchronizing folder pair:</source>
+<target>Sinchrinizuojama aplankų pora:</target>
<source>Target folder %x already existing.</source>
-<target></target>
+<target>Tikslo aplankas %x jau yra.</target>
<source>Generating database...</source>
<target>Generuojama duomenų bazė...</target>
diff --git a/BUILD/Languages/norwegian.lng b/BUILD/Languages/norwegian.lng
index 6ac894b0..947406c8 100644
--- a/BUILD/Languages/norwegian.lng
+++ b/BUILD/Languages/norwegian.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Leter etter mappen %x</target>
-<source>Batch execution</source>
-<target>Batch-kjøring</target>
-
<source>Items processed:</source>
<target>Elementer behandlet:</target>
@@ -61,12 +58,12 @@
<source>Create a batch job</source>
<target>Opprett en batch-jobb</target>
-<source>Synchronization settings</source>
-<target>Innstillinger for synkronisering</target>
-
<source>Comparison settings</source>
<target>Innstillinger for sammenligning</target>
+<source>Synchronization settings</source>
+<target>Innstillinger for synkronisering</target>
+
<source>About</source>
<target>Om</target>
@@ -88,27 +85,6 @@
<source>Select time span</source>
<target>Velg tidsområde</target>
-<source>Show pop-up</source>
-<target>Vis pop-up</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Vis pop-upvindu ved feil eller advarsler</target>
-
-<source>Ignore errors</source>
-<target>Ignorer feil</target>
-
-<source>Hide all error and warning messages</source>
-<target>Skjul feilmeldinger og advarsler</target>
-
-<source>Exit instantly</source>
-<target>Avslutt med en gang</target>
-
-<source>Abort synchronization immediately</source>
-<target>Avbryt synkronisering umiddelbart</target>
-
-<source>Browse</source>
-<target>Bla gjennom</target>
-
<source>Invalid command line:</source>
<target>Ugyldig kommando:</target>
@@ -247,8 +223,8 @@
<source>&Open...</source>
<target>&Ã…pne</target>
-<source>Save &As...</source>
-<target>Lagre &som...</target>
+<source>Save &as...</source>
+<target></target>
<source>&Quit</source>
<target>&Avslutt</target>
@@ -289,6 +265,9 @@
<source>Remove folder</source>
<target>Fjern mappe</target>
+<source>Browse</source>
+<target>Bla gjennom</target>
+
<source>Select a folder</source>
<target>Velg en mappe</target>
@@ -321,8 +300,8 @@ Kommandoen utløses hvis:
<source>Cancel</source>
<target>Avbryt</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Build: %x</target>
<source>All files</source>
<target>Alle filer</target>
@@ -342,9 +321,6 @@ Kommandoen utløses hvis:
<source>A folder input field is empty.</source>
<target>Et mappefelt er tomt.</target>
-<source>Logging</source>
-<target>Logging</target>
-
<source>File time and size</source>
<target>Fildato og størrelse</target>
@@ -525,11 +501,11 @@ Kommandoen utløses hvis:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Sist brukte innstillinger (trykk DEL for å fjerne fra liste)</target>
-<source>Hide excluded items</source>
-<target>Skjul ekskluderte elementer</target>
+<source>Show excluded items</source>
+<target></target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Skjul filtrerte eller midlertidig ekskluderte filer</target>
+<source>Show filtered or temporarily excluded files</source>
+<target></target>
<source>Number of files and folders that will be created</source>
<target>Antall filer og mapper som vil opprettes</target>
@@ -573,24 +549,81 @@ Kommandoen utløses hvis:
<source>Right</source>
<target>Høyre</target>
-<source>Status feedback</source>
-<target>Status-tilbakemelding</target>
+<source>Error handling</source>
+<target>Feilhåndtering</target>
+
+<source>Ignore</source>
+<target></target>
+
+<source>Hide all error and warning messages</source>
+<target>Skjul feilmeldinger og advarsler</target>
+
+<source>Pop-up</source>
+<target></target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Vis pop-upvindu ved feil eller advarsler</target>
+
+<source>Exit</source>
+<target></target>
+
+<source>Abort synchronization on first error</source>
+<target></target>
+
+<source>On completion:</source>
+<target>Ved fullføring:</target>
<source>Show progress dialog</source>
<target>Vis dialogboks</target>
-<source>Error handling</source>
-<target>Feilhåndtering</target>
+<source>Generate log file</source>
+<target></target>
-<source>Maximum number of log files:</source>
-<target>Maksimale antall loggfiler:</target>
+<source>Select folder to save log files</source>
+<target></target>
-<source>Select folder to save log files:</source>
-<target>Velg en mappe for loggfiler:</target>
+<source>Limit</source>
+<target></target>
+
+<source>Limit maximum number of log files</source>
+<target></target>
<source>Batch settings</source>
<target>Batch-innstillinger</target>
+<source>Compare by...</source>
+<target>Sammenlign etter...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Filer blir funnet like hvis
+ - sist skrevne tid og dato
+ - filstørrelse
+er den samme
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Filer blir funnet like hvis
+ - filinnhold
+er det samme
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Symbolsk lenkehåndtering</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Velg variant:</target>
@@ -609,8 +642,26 @@ Kommandoen utløses hvis:
<source>Deletion handling</source>
<target>Slette-håndtering</target>
-<source>On completion:</source>
-<target>Ved fullføring:</target>
+<source>Permanent</source>
+<target></target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Slett eller overskriv filer permanent</target>
+
+<source>Recycle Bin</source>
+<target></target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Bruk papirkurv ved sletting eller filoverskrivning</target>
+
+<source>Versioning</source>
+<target>Versjonshåndtering</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target></target>
+
+<source>Limit maximum number of versions per file</source>
+<target></target>
<source>Configuration</source>
<target>Innstilling</target>
@@ -633,39 +684,6 @@ Kommandoen utløses hvis:
<source>Conflict/item cannot be categorized</source>
<target>Konflikt/element kan ikke kategoriseres</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Sammenlign etter...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Filer blir funnet like hvis
- - sist skrevne tid og dato
- - filstørrelse
-er den samme
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Filer blir funnet like hvis
- - filinnhold
-er det samme
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Symbolsk lenkehåndtering</target>
-
<source>Synchronizing...</source>
<target>Synkroniserer...</target>
@@ -681,8 +699,8 @@ er det samme
<source>Donate with PayPal</source>
<target>Doner med PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Stor takk for oversettelse av FreeFileSync går til:</target>
+<source>Many thanks for localization:</source>
+<target></target>
<source>Feedback and suggestions are welcome</source>
<target>Tilbakemelding og forslag er velkomne</target>
@@ -699,9 +717,6 @@ er det samme
<source>Published under the GNU General Public License</source>
<target>Utgitt under GNU General Public Licence</target>
-<source>Use Recycle Bin</source>
-<target>Bruk papirkurv</target>
-
<source>Delete on both sides</source>
<target>Slett på begge sider</target>
@@ -771,8 +786,8 @@ Merk: Filnavn må være relative til basismapper!
<source>Statistics</source>
<target>Statistikk</target>
-<source>Do not show this dialog again</source>
-<target>Ikke vis denne dialog igjen</target>
+<source>Don't show this dialog again</source>
+<target></target>
<source>Find what:</source>
<target>Søk hva:</target>
@@ -855,11 +870,8 @@ Merk: Filnavn må være relative til basismapper!
<source>Do you want to save changes to %x?</source>
<target>Vil du lagre endringene til %x?</target>
-<source>Save</source>
-<target>Lagre</target>
-
-<source>Don't Save</source>
-<target>Ikke lagre</target>
+<source>Do&n't save</source>
+<target></target>
<source>Configuration loaded!</source>
<target>Innstilling lastet!</target>
@@ -951,8 +963,8 @@ Merk: Filnavn må være relative til basismapper!
<source>Show files that won't be copied</source>
<target>Vis filer som ikke blir kopiert</target>
-<source>All directories in sync!</source>
-<target>Alle mapper er synkronisert!</target>
+<source>All folders are in sync!</source>
+<target></target>
<source>Comma separated list</source>
<target>Komma-separert liste</target>
@@ -1041,6 +1053,9 @@ Merk: Filnavn må være relative til basismapper!
<source>Pause</source>
<target>Pause</target>
+<source>Logging</source>
+<target>Logging</target>
+
<source>Cannot find %x</source>
<target>Kan ikke finne %x</target>
@@ -1122,21 +1137,6 @@ Merk: Filnavn må være relative til basismapper!
<source>Leave as unresolved conflict</source>
<target>Etterlat som uløste konflikter</target>
-<source>Delete permanently</source>
-<target>Slett permanent</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Slett eller overskriv filer permanent</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Bruk papirkurv ved sletting eller filoverskrivning</target>
-
-<source>Versioning</source>
-<target>Versjonshåndtering</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Flytt filer til en undermappe med tidsstempel</target>
-
<source>Files</source>
<target>Filer</target>
@@ -1227,8 +1227,11 @@ Merk: Filnavn må være relative til basismapper!
<source>Cannot copy file %x to %y.</source>
<target>Kan ikke kopiere filen %x til %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Kan ikke lese mappen %x.</target>
+<source>Cannot open directory %x.</source>
+<target></target>
+
+<source>Cannot enumerate directory %x.</source>
+<target></target>
<source>Detected endless directory recursion.</source>
<target>Fant uendelig dyp mappestruktur (lenker til mapper høyere opp i strukturen)</target>
@@ -1266,6 +1269,9 @@ Merk: Filnavn må være relative til basismapper!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Mapper er avhengige av hverandre! Vær forsiktig når du setter opp synkroniseringsregler:</target>
+<source>Start comparison</source>
+<target></target>
+
<source>Preparing synchronization...</source>
<target>Forbereder synkronisering...</target>
@@ -1278,8 +1284,8 @@ Merk: Filnavn må være relative til basismapper!
<source>Files %x have the same date but a different size!</source>
<target>Filer %x har den samme datoen, men forskjellig størrelse!</target>
-<source>Items have different attributes</source>
-<target>Elementer har forskjellige attributter</target>
+<source>Items differ in attributes only</source>
+<target></target>
<source>Symbolic links %x have the same date but a different target.</source>
<target>Symbolske lenker %x har den samme datoen, men forskjellige mål.</target>
@@ -1413,8 +1419,8 @@ Merk: Filnavn må være relative til basismapper!
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>En mappe vil endres som er en del av flere mappepar. Se over innstillingene for synkronisering.</target>
-<source>Processing folder pair:</source>
-<target>Behandler mappepar:</target>
+<source>Synchronizing folder pair:</source>
+<target></target>
<source>Target folder %x already existing.</source>
<target>MÃ¥lmappe %x eksisterer allerede.</target>
diff --git a/BUILD/Languages/polish.lng b/BUILD/Languages/polish.lng
index 08b5366c..d338f97a 100644
--- a/BUILD/Languages/polish.lng
+++ b/BUILD/Languages/polish.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Wyszukiwanie katalogu %x...</target>
-<source>Batch execution</source>
-<target>Uruchomienie pliku wsadowego</target>
-
<source>Items processed:</source>
<target>Przetworzeone elementy:</target>
@@ -61,12 +58,12 @@
<source>Create a batch job</source>
<target>Utwórz plik wsadowy</target>
-<source>Synchronization settings</source>
-<target>Ustawienia synchronizacji</target>
-
<source>Comparison settings</source>
<target>Ustawienia porównywania</target>
+<source>Synchronization settings</source>
+<target>Ustawienia synchronizacji</target>
+
<source>About</source>
<target>O Programie</target>
@@ -88,27 +85,6 @@
<source>Select time span</source>
<target>Określ przedział czasowy</target>
-<source>Show pop-up</source>
-<target>Pokazuj okna pop-up</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Pokazuj okna pop-up dla błędów i ostrzeżeń</target>
-
-<source>Ignore errors</source>
-<target>Ignoruj błędy</target>
-
-<source>Hide all error and warning messages</source>
-<target>Ukryj wszystkie informacje błędach i ostrzeżeniach</target>
-
-<source>Exit instantly</source>
-<target>Wyjdź natychmiast</target>
-
-<source>Abort synchronization immediately</source>
-<target>Natychmiast zakończ synchronizację</target>
-
-<source>Browse</source>
-<target>PrzeglÄ…daj</target>
-
<source>Invalid command line:</source>
<target>Nieprawidłowa komenda:</target>
@@ -250,11 +226,11 @@
<source>&Open...</source>
<target>&Otwórz...</target>
-<source>Save &As...</source>
-<target>Zapi&sz jako...</target>
+<source>Save &as...</source>
+<target>&Zapisz jako...</target>
<source>&Quit</source>
-<target>&Zamknij</target>
+<target>Zam&knij</target>
<source>&Program</source>
<target>&Program</target>
@@ -266,7 +242,7 @@
<target>O Program&ie</target>
<source>&Help</source>
-<target>P&omoc</target>
+<target>Pomo&c</target>
<source>Usage:</source>
<target>Użycie:</target>
@@ -292,6 +268,9 @@
<source>Remove folder</source>
<target>Usuń katalog</target>
+<source>Browse</source>
+<target>PrzeglÄ…daj</target>
+
<source>Select a folder</source>
<target>Wybierz katalog</target>
@@ -324,8 +303,8 @@ Komenda jest wykonywana gdy:
<source>Cancel</source>
<target>Anuluj</target>
-<source>(Build: %x)</source>
-<target>(Zbudowano: %x)</target>
+<source>Build: %x</source>
+<target>Zbudowano: %x</target>
<source>All files</source>
<target>Wszystkie pliki</target>
@@ -345,9 +324,6 @@ Komenda jest wykonywana gdy:
<source>A folder input field is empty.</source>
<target>Pole katalog źródłowy jest puste.</target>
-<source>Logging</source>
-<target>Tworzenie logów</target>
-
<source>File time and size</source>
<target>Czas modyfikacji i rozmiar</target>
@@ -528,11 +504,11 @@ Komenda jest wykonywana gdy:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Ostatnio użyta konfiguracja (naciśnij DEL żeby usunąć z listy)</target>
-<source>Hide excluded items</source>
-<target>Ukryj wykluczone pliki</target>
+<source>Show excluded items</source>
+<target>Pokaż wykluczone elementy</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Ukryj pliki filtrowane lub tymczasowo wykluczone</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Pokaż pliki wykluczone tymczasowo lub pliki wykluczone tymczasowo</target>
<source>Number of files and folders that will be created</source>
<target>Liczba plików i katalogów, które zostaną utworzone</target>
@@ -576,68 +552,47 @@ Komenda jest wykonywana gdy:
<source>Right</source>
<target>Prawy</target>
-<source>Status feedback</source>
-<target>Status</target>
-
-<source>Show progress dialog</source>
-<target>Pokaż okno postępu</target>
-
<source>Error handling</source>
<target>Obsługa błędów</target>
-<source>Maximum number of log files:</source>
-<target>Maksymalna liczba plików z logami:</target>
-
-<source>Select folder to save log files:</source>
-<target>Wybierz katalog, do które będą zapisywane logi:</target>
-
-<source>Batch settings</source>
-<target>Ustawienia trybu wsadowego</target>
+<source>Ignore</source>
+<target>Ignoruj</target>
-<source>Select variant:</source>
-<target>Wybierz wariant:</target>
-
-<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source>
-<target>Znajdź i zastosuj zmiany po obu stronach przy pomocy bazy danych. Usunięnia, zmiany nazwy plików oraz konflikty są usuwane automatycznie.</target>
+<source>Hide all error and warning messages</source>
+<target>Ukryj wszystkie informacje błędach i ostrzeżeniach</target>
-<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
-<target>Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzanÄ… kopiÄ… lewego folderu.</target>
+<source>Pop-up</source>
+<target>Pop-up</target>
-<source>Copy new or updated files to right folder.</source>
-<target>Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™.</target>
+<source>Show pop-up on errors or warnings</source>
+<target>Pokazuj okna pop-up dla błędów i ostrzeżeń</target>
-<source>Configure your own synchronization rules.</source>
-<target>Skonfiguruj swoje własne reguły synchronizacji.</target>
+<source>Exit</source>
+<target>Wyjście</target>
-<source>Deletion handling</source>
-<target>Obsługa usuwania</target>
+<source>Abort synchronization on first error</source>
+<target>Zakończ synchronizację przy pierwszym błędzie</target>
<source>On completion:</source>
<target>Po zakończeniu:</target>
-<source>Configuration</source>
-<target>Konfiguracja</target>
-
-<source>Item exists on left side only</source>
-<target>Element istnieje tylko po lewej stronie</target>
-
-<source>Item exists on right side only</source>
-<target>Element istnieje tylko po prawej stronie</target>
+<source>Show progress dialog</source>
+<target>Pokaż okno postępu</target>
-<source>Left side is newer</source>
-<target>Lewa strona jest nowsza</target>
+<source>Generate log file</source>
+<target>Twórz plik logów</target>
-<source>Right side is newer</source>
-<target>Prawa strona jest nowsza</target>
+<source>Select folder to save log files</source>
+<target>Określ katalog z logami</target>
-<source>Items have different content</source>
-<target><Elementy różnią się zawartością</target>
+<source>Limit</source>
+<target>Limit</target>
-<source>Conflict/item cannot be categorized</source>
-<target>Konflikt/element nie może zostać skategoryzowany</target>
+<source>Limit maximum number of log files</source>
+<target>Określ maksymalną liczbę plików z logami</target>
-<source>OK</source>
-<target>OK</target>
+<source>Batch settings</source>
+<target>Ustawienia trybu wsadowego</target>
<source>Compare by...</source>
<target>Porównaj przez...</target>
@@ -669,6 +624,69 @@ jest identyczna
<source>Symbolic Link handling</source>
<target>Obsługa dowiązań symbolicznych</target>
+<source>OK</source>
+<target>OK</target>
+
+<source>Select variant:</source>
+<target>Wybierz wariant:</target>
+
+<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source>
+<target>Znajdź i zastosuj zmiany po obu stronach przy pomocy bazy danych. Usunięnia, zmiany nazwy plików oraz konflikty są usuwane automatycznie.</target>
+
+<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
+<target>Lustrzana kopia lewego folderu. Prawy folder po synchronizacji jest lustrzanÄ… kopiÄ… lewego folderu.</target>
+
+<source>Copy new or updated files to right folder.</source>
+<target>Kopiuj nowe lub aktualniejsze pliki na prawÄ… stronÄ™.</target>
+
+<source>Configure your own synchronization rules.</source>
+<target>Skonfiguruj swoje własne reguły synchronizacji.</target>
+
+<source>Deletion handling</source>
+<target>Usuwanie</target>
+
+<source>Permanent</source>
+<target>Trwały</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Usuń lub nadpisz pliki na stałe</target>
+
+<source>Recycle Bin</source>
+<target>Kosz</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Używaj Kosza podczas usuwania lub nadpisywania plików</target>
+
+<source>Versioning</source>
+<target>Wersjonowanie</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Pliki wersji oznaczone datą przenieś do określonego katalogu</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Określ maksymalną liczbę wersji dla pliku</target>
+
+<source>Configuration</source>
+<target>Konfiguracja</target>
+
+<source>Item exists on left side only</source>
+<target>Element istnieje tylko po lewej stronie</target>
+
+<source>Item exists on right side only</source>
+<target>Element istnieje tylko po prawej stronie</target>
+
+<source>Left side is newer</source>
+<target>Lewa strona jest nowsza</target>
+
+<source>Right side is newer</source>
+<target>Prawa strona jest nowsza</target>
+
+<source>Items have different content</source>
+<target>Elementy różnią się zawartością</target>
+
+<source>Conflict/item cannot be categorized</source>
+<target>Konflikt/element nie może zostać skategoryzowany</target>
+
<source>Synchronizing...</source>
<target>SynchronizujÄ™...</target>
@@ -684,8 +702,8 @@ jest identyczna
<source>Donate with PayPal</source>
<target>Wesprzyj z PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Podziękowania za tłumaczenie FreeFileSync:</target>
+<source>Many thanks for localization:</source>
+<target>Podziękowania za tłumaczenia:</target>
<source>Feedback and suggestions are welcome</source>
<target>Wszelkie opinie i sugestie mile widziane</target>
@@ -702,9 +720,6 @@ jest identyczna
<source>Published under the GNU General Public License</source>
<target>Udostępnione na zasadach licencji GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>Użyj kosza</target>
-
<source>Delete on both sides</source>
<target>Usuń po obu stronach</target>
@@ -774,8 +789,8 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Statistics</source>
<target>Statystyki</target>
-<source>Do not show this dialog again</source>
-<target>Nie pokazuj tego okna ponownie</target>
+<source>Don't show this dialog again</source>
+<target>Nie pokazuj więcej tego okna</target>
<source>Find what:</source>
<target>Co:</target>
@@ -858,11 +873,8 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Do you want to save changes to %x?</source>
<target>Czy chcesz zapisać zmiany w %x?</target>
-<source>Save</source>
-<target>Zapisz</target>
-
-<source>Don't Save</source>
-<target>Nie zapisuj</target>
+<source>Do&n't save</source>
+<target>&Nie zapisuj</target>
<source>Configuration loaded!</source>
<target>Konfiguracja wczytana!</target>
@@ -954,8 +966,8 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Show files that won't be copied</source>
<target>Pokaż pliki, które nie będą kopiowane</target>
-<source>All directories in sync!</source>
-<target>Wszystkie katalogi zsynchronizowane!</target>
+<source>All folders are in sync!</source>
+<target>Wszystkie katalogi sÄ… zsynchronizowane!</target>
<source>Comma separated list</source>
<target>Lista oddzielona przecinkami</target>
@@ -1048,6 +1060,9 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Pause</source>
<target>Pauza</target>
+<source>Logging</source>
+<target>Tworzenie logów</target>
+
<source>Cannot find %x</source>
<target>Nie można znaleźć %x</target>
@@ -1131,21 +1146,6 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Leave as unresolved conflict</source>
<target>Zostaw jako nierozwiÄ…zany konflikt</target>
-<source>Delete permanently</source>
-<target>Usuń na stałe</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Usuń lub nadpisz pliki na stałe</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Używaj Kosza podczas usuwania lub nadpisywania plików</target>
-
-<source>Versioning</source>
-<target>Wersjonowanie</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>PrzenieÅ› pliki do podkatalogu ze zmodyfikowanym czasem.</target>
-
<source>Files</source>
<target>Pliki</target>
@@ -1239,8 +1239,11 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Cannot copy file %x to %y.</source>
<target>Nie można skopiować pliku %x do %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Nie można odczytać katalogu %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Nie można otworzyć katalogu %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Nie można wyliczyć katalogu %x.</target>
<source>Detected endless directory recursion.</source>
<target>Wykryto nieskończoną pętlę katalogów</target>
@@ -1266,6 +1269,9 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Ustawianie domyślnego kierunku synchronizacji: Stare pliki zostaną nadpisane nowszymi.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Kosz nie jest dostępny dla określonych ścieżek! Pliki zostaną nieodwracalnie usuniętę:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Możesz zignorować ten błąd traktując katalog jako pusty.</target>
@@ -1275,6 +1281,9 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Katalogi są zależne! Pamiętaj o tym podczas ustawiania zasad synchronizacji:</target>
+<source>Start comparison</source>
+<target>Rozpocznij porównywanie</target>
+
<source>Preparing synchronization...</source>
<target>Przygotowywanie synchronizacji...</target>
@@ -1287,6 +1296,9 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Files %x have the same date but a different size!</source>
<target>Pliki %x mają tą samą datę lecz różne rozmiary!</target>
+<source>Items differ in attributes only</source>
+<target>Elementy różnią się wyłącznie atrybutami</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Dowiązania symboliczne %x mają tą samą datę, ale różne źródła.</target>
@@ -1302,9 +1314,6 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Both sides are equal</source>
<target>Obie strony są równe</target>
-<source>Items have different attributes</source>
-<target>Elementy mają różne atrybuty</target>
-
<source>Copy new item to left</source>
<target>Kopiuj nowy element na lewÄ… stronÄ™</target>
@@ -1393,7 +1402,7 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<target>Pole katalog docelowy nie może być puste.</target>
<source>Folder input field for versioning must not be empty.</source>
-<target>Pole katalog źródłowy nie może być puste.</target>
+<target>Określ katalog do przechowywania wersjonowanych plików.</target>
<source>Source folder %x not found.</source>
<target>Nie znaleziono katalogu docelowego %x.</target>
@@ -1419,14 +1428,11 @@ Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowe
<source>Available:</source>
<target>Dostępne:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Kosz nie jest dostępny dla określonych ścieżek! Pliki zostaną nieodwracalnie usuniętę:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Katalog zostanie zmodyfikowany w związku z synchronizacją wielu katalogów. Zweryfikuj ustawienia synchronizacji.</target>
-<source>Processing folder pair:</source>
-<target>Przetwarzanie folderów:</target>
+<source>Synchronizing folder pair:</source>
+<target>Synchronizacja katalgów:</target>
<source>Target folder %x already existing.</source>
<target>Katalog docelowy %x już istnieje.</target>
diff --git a/BUILD/Languages/portuguese.lng b/BUILD/Languages/portuguese.lng
index af35040b..d825097c 100644
--- a/BUILD/Languages/portuguese.lng
+++ b/BUILD/Languages/portuguese.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>À procura da pasta %x...</target>
-<source>Batch execution</source>
-<target>Execução do batch</target>
-
<source>Items processed:</source>
<target>Elementos processados:</target>
@@ -34,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Abortar pedido: À espera do fim da operação atual...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Sincronização Automatizada</target>
@@ -61,12 +61,12 @@
<source>Create a batch job</source>
<target>Criar ficheiro batch</target>
-<source>Synchronization settings</source>
-<target>Parametros de sincronização</target>
-
<source>Comparison settings</source>
<target>Opções de comparação</target>
+<source>Synchronization settings</source>
+<target>Parametros de sincronização</target>
+
<source>About</source>
<target>Sobre</target>
@@ -88,27 +88,6 @@
<source>Select time span</source>
<target>Selecionar intervalo de tempo</target>
-<source>Show pop-up</source>
-<target>Mostrar popup</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Mostrar popup em caso de erros ou avisos</target>
-
-<source>Ignore errors</source>
-<target>Ignorar erros</target>
-
-<source>Hide all error and warning messages</source>
-<target>Ocultar todas as mensagens de erro/aviso</target>
-
-<source>Exit instantly</source>
-<target>Sair imediatamente</target>
-
-<source>Abort synchronization immediately</source>
-<target>Abortar sincronização imediatamente</target>
-
-<source>Browse</source>
-<target>Procurar</target>
-
<source>Invalid command line:</source>
<target>Linha de comando inválida:</target>
@@ -247,8 +226,8 @@
<source>&Open...</source>
<target>&Abrir...</target>
-<source>Save &As...</source>
-<target>Guar&dar como...</target>
+<source>Save &as...</source>
+<target>Guardar &como...</target>
<source>&Quit</source>
<target>&Sair</target>
@@ -289,6 +268,9 @@
<source>Remove folder</source>
<target>Remover pasta(s)</target>
+<source>Browse</source>
+<target>Procurar</target>
+
<source>Select a folder</source>
<target>Selecione uma pasta</target>
@@ -321,8 +303,8 @@ O comando é executado se:
<source>Cancel</source>
<target>Cancelar</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Build: %x</target>
<source>All files</source>
<target>Todos os ficheiros</target>
@@ -342,9 +324,6 @@ O comando é executado se:
<source>A folder input field is empty.</source>
<target>Um dos campos de directório para comparar está vazio.</target>
-<source>Logging</source>
-<target>A escrever em log</target>
-
<source>File time and size</source>
<target>Data e tamanho do ficheiro</target>
@@ -525,11 +504,11 @@ O comando é executado se:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Última configuração utilizada (pressione DEL para remover da lista)</target>
-<source>Hide excluded items</source>
-<target>Ocultar itens excluidos</target>
+<source>Show excluded items</source>
+<target>Mostrar itens excluidos</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Ocultar ficheiros filtrados ou temporariamente excluidos</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Mostrar ficheiros filtrados ou temporariamente excluidos</target>
<source>Number of files and folders that will be created</source>
<target>Número de ficheiros e pastas a ser criados</target>
@@ -573,24 +552,80 @@ O comando é executado se:
<source>Right</source>
<target>Direita</target>
-<source>Status feedback</source>
-<target>Retorno de estado</target>
+<source>Error handling</source>
+<target>Controlador de erros</target>
+
+<source>Ignore</source>
+<target>Ignorar</target>
+
+<source>Hide all error and warning messages</source>
+<target>Ocultar todas as mensagens de erro/aviso</target>
+
+<source>Pop-up</source>
+<target>Pop-up</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Mostrar popup em caso de erros ou avisos</target>
+
+<source>Exit</source>
+<target>Sair</target>
+
+<source>Abort synchronization on first error</source>
+<target>Abortar sincronização ao primeiro erro</target>
+
+<source>On completion:</source>
+<target>Ao concluir:</target>
<source>Show progress dialog</source>
<target>Mostrar diálogo de progresso</target>
-<source>Error handling</source>
-<target>Controlador de erros</target>
+<source>Generate log file</source>
+<target>Gerar ficheiro log</target>
+
+<source>Select folder to save log files</source>
+<target>Seleccionar pasta para guardar ficheiros log</target>
-<source>Maximum number of log files:</source>
-<target>Número máximo de ficheiros log:</target>
+<source>Limit</source>
+<target>Limitar</target>
-<source>Select folder to save log files:</source>
-<target>Selecionar pasta onde guardar os logs:</target>
+<source>Limit maximum number of log files</source>
+<target>Limitar o número máximo de ficheiros log</target>
<source>Batch settings</source>
<target>Opções do batch</target>
+<source>Compare by...</source>
+<target>Comparar por...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Ficheiros considerados iguais se
+ - data da última modificação
+ - tamanho
+são iguais
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Os ficheiros são considerados iguais se
+ - o conteúdo é o mesmo
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Tratamento de links simbólicos</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Selecione uma variante:</target>
@@ -609,8 +644,26 @@ O comando é executado se:
<source>Deletion handling</source>
<target>Controlo eliminação</target>
-<source>On completion:</source>
-<target>Ao concluir:</target>
+<source>Permanent</source>
+<target>Permanente</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Apagar ou substituir ficheiros permanentemente</target>
+
+<source>Recycle Bin</source>
+<target>Reciclagem</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Utilizar Reciclagem ao apagar ou substituir ficheiros</target>
+
+<source>Versioning</source>
+<target>Manter versões anteriores</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Mover ficheiros datados para a pasta especificada</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Limitar número máximo de versões por ficheiro</target>
<source>Configuration</source>
<target>Configuração</target>
@@ -633,38 +686,6 @@ O comando é executado se:
<source>Conflict/item cannot be categorized</source>
<target>Conflito/item não pode ser categorizado</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Comparar por...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Ficheiros considerados iguais se
- - data da última modificação
- - tamanho
-são iguais
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Os ficheiros são considerados iguais se
- - o conteúdo é o mesmo
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Tratamento de links simbólicos</target>
-
<source>Synchronizing...</source>
<target>A sincronizar...</target>
@@ -680,8 +701,8 @@ Os ficheiros são considerados iguais se
<source>Donate with PayPal</source>
<target>Doar usando PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Pela tradução de FreeFileSync, um agradecimento a:</target>
+<source>Many thanks for localization:</source>
+<target>Muito obrigado pela localização:</target>
<source>Feedback and suggestions are welcome</source>
<target>Comentários e sugestões são apreciados</target>
@@ -698,9 +719,6 @@ Os ficheiros são considerados iguais se
<source>Published under the GNU General Public License</source>
<target>Publicado sobre GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>Utilizar Reciclagem</target>
-
<source>Delete on both sides</source>
<target>Eliminar em ambos os lados</target>
@@ -770,7 +788,7 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Statistics</source>
<target>Estatísticas</target>
-<source>Do not show this dialog again</source>
+<source>Don't show this dialog again</source>
<target>Não mostrar este diálogo novamente</target>
<source>Find what:</source>
@@ -854,11 +872,8 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Do you want to save changes to %x?</source>
<target>Deseja guardar as alterações a %x?</target>
-<source>Save</source>
-<target>Guardar</target>
-
-<source>Don't Save</source>
-<target>Não Guardar</target>
+<source>Do&n't save</source>
+<target>Não g&uardar</target>
<source>Configuration loaded!</source>
<target>Configuração carregada!</target>
@@ -950,8 +965,8 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Show files that won't be copied</source>
<target>Mostrar ficheiros que não serão copiados</target>
-<source>All directories in sync!</source>
-<target>Todas as pastas sincronizadas!</target>
+<source>All folders are in sync!</source>
+<target>Todas as pastas estão sincronizadas!</target>
<source>Comma separated list</source>
<target>Lista de itens separados por vírgulas</target>
@@ -1040,6 +1055,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Pause</source>
<target>Pausa</target>
+<source>Logging</source>
+<target>A escrever em log</target>
+
<source>Cannot find %x</source>
<target>Não é possível descobrir %x</target>
@@ -1121,21 +1139,6 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Leave as unresolved conflict</source>
<target>Deixar como conflito</target>
-<source>Delete permanently</source>
-<target>Apagar permanentemente</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Apagar ou substituir ficheiros permanentemente</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Utilizar Reciclagem ao apagar ou substituir ficheiros</target>
-
-<source>Versioning</source>
-<target>Manter versões anteriores</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Mover ficheiros para uma subpasta com hora e data</target>
-
<source>Files</source>
<target>Ficheiros</target>
@@ -1226,8 +1229,11 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Cannot copy file %x to %y.</source>
<target>Não é possível copiar o ficheiro %x para %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Não é possível ler o directório %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Não é possível abrir o directório %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Não é possível enumerar o directório %x.</target>
<source>Detected endless directory recursion.</source>
<target>Recursão infinita detetada no directório</target>
@@ -1253,6 +1259,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Escolher direcção de sincronização por defeito: Os ficheiros antigos serão substituídos pelos novos.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Reciclagem não disponível para os seguintes caminhos! Os ficheiros serão apagados permanentemente:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Pode ignorar este erro para considerar a pasta como vazia.</target>
@@ -1262,6 +1271,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Directórios são dependentes! Cuidado ao definir as regras de sincronização:</target>
+<source>Start comparison</source>
+<target>Iniciar comparação</target>
+
<source>Preparing synchronization...</source>
<target>A preparar sincronização...</target>
@@ -1274,6 +1286,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Files %x have the same date but a different size!</source>
<target>Os ficheiros %x têm a mesma data, mas tamanho diferente!</target>
+<source>Items differ in attributes only</source>
+<target>Itens diferem apenas nos atributos</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Links simbólicos %x tem a mesma data, mas alvos diferentes.</target>
@@ -1289,9 +1304,6 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Both sides are equal</source>
<target>Ambos os lados iguais</target>
-<source>Items have different attributes</source>
-<target>Itens tem diferentes atributos</target>
-
<source>Copy new item to left</source>
<target>Copiar novo item para a esquerda</target>
@@ -1355,6 +1367,9 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Moving symbolic link %x to %y</source>
<target>Mover link simbólico %x para %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>Criar ficheiro %x</target>
@@ -1406,14 +1421,11 @@ Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
<source>Available:</source>
<target>Disponível:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Reciclagem não disponível para os seguintes caminhos! Os ficheiros serão apagados permanentemente:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Uma pasta que faz parte de vários pares vai ser modificada. Por favor, reveja os parametros de sincronização.</target>
-<source>Processing folder pair:</source>
-<target>A processar o par do directorio:</target>
+<source>Synchronizing folder pair:</source>
+<target>Sincronizar o par de pastas:</target>
<source>Target folder %x already existing.</source>
<target>Directório de destino %x já existe.</target>
diff --git a/BUILD/Languages/portuguese_br.lng b/BUILD/Languages/portuguese_br.lng
index bac56f55..e64cdba5 100644
--- a/BUILD/Languages/portuguese_br.lng
+++ b/BUILD/Languages/portuguese_br.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Buscando pela pasta %x...</target>
-<source>Batch execution</source>
-<target>Execução da tarefa em lote</target>
-
<source>Items processed:</source>
<target>Elementos processados:</target>
@@ -34,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Cancelar solicitado: Esperando fim da operação...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Sincronização Automatizada</target>
@@ -61,12 +61,12 @@
<source>Create a batch job</source>
<target>Criar arquivo de lote</target>
+<source>Comparison settings</source>
+<target>Parâmetros de comparação</target>
+
<source>Synchronization settings</source>
<target>Parâmetros de sincronização</target>
-<source>Comparison settings</source>
-<target>Parâmetros da comparação</target>
-
<source>About</source>
<target>Sobre</target>
@@ -88,27 +88,6 @@
<source>Select time span</source>
<target>Selecionar intervalo de tempo</target>
-<source>Show pop-up</source>
-<target>Mostrar pop-up</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Mostrar pop-up em caso de erros ou avisos</target>
-
-<source>Ignore errors</source>
-<target>Ignorar erros</target>
-
-<source>Hide all error and warning messages</source>
-<target>Ocultar todas as mensagens de erro e aviso</target>
-
-<source>Exit instantly</source>
-<target>Sair imediatamente</target>
-
-<source>Abort synchronization immediately</source>
-<target>Cancelar a sincronização imediatamente</target>
-
-<source>Browse</source>
-<target>Procurar</target>
-
<source>Invalid command line:</source>
<target>Linha de comando inválida:</target>
@@ -247,8 +226,8 @@
<source>&Open...</source>
<target>&Abrir...</target>
-<source>Save &As...</source>
-<target>Salvar &Como...</target>
+<source>Save &as...</source>
+<target>Salvar &como...</target>
<source>&Quit</source>
<target>Sai&r</target>
@@ -289,6 +268,9 @@
<source>Remove folder</source>
<target>Remover pasta</target>
+<source>Browse</source>
+<target>Procurar</target>
+
<source>Select a folder</source>
<target>Selecionar uma pasta</target>
@@ -321,8 +303,8 @@ O comando é disparado se:
<source>Cancel</source>
<target>Cancelar</target>
-<source>(Build: %x)</source>
-<target>(Versão: %x)</target>
+<source>Build: %x</source>
+<target>Versão: %x</target>
<source>All files</source>
<target>Todos os arquivos</target>
@@ -342,9 +324,6 @@ O comando é disparado se:
<source>A folder input field is empty.</source>
<target>Um campo de entrada de pasta está vazio.</target>
-<source>Logging</source>
-<target>Ver Log</target>
-
<source>File time and size</source>
<target>Data e tamanho do arquivo</target>
@@ -499,7 +478,7 @@ O comando é disparado se:
<target>Comparar os dois lados</target>
<source>&Abort</source>
-<target>&Abortar</target>
+<target>&Cancelar</target>
<source>Synchronize</source>
<target>Sincronizar</target>
@@ -525,11 +504,11 @@ O comando é disparado se:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Últimas configurações usadas (pressione DEL para remover da lista)</target>
-<source>Hide excluded items</source>
-<target>Ocultar itens excluídos</target>
+<source>Show excluded items</source>
+<target>Mostrar itens excluídos</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Ocultar arquivos filtrados ou temporariamente excluídos</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Mostra arquivos que foram filtrados ou excluídos temporariamente</target>
<source>Number of files and folders that will be created</source>
<target>Número de arquivos e pastas que serão criados</target>
@@ -573,24 +552,81 @@ O comando é disparado se:
<source>Right</source>
<target>Direita</target>
-<source>Status feedback</source>
-<target>Informação do Status</target>
+<source>Error handling</source>
+<target>Tratamento de erros</target>
+
+<source>Ignore</source>
+<target>Ignorar</target>
+
+<source>Hide all error and warning messages</source>
+<target>Oculta todas as mensagens de erros e avisos</target>
+
+<source>Pop-up</source>
+<target>Pop-up</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Mostra pop-up em caso de erros ou avisos</target>
+
+<source>Exit</source>
+<target>Sair</target>
+
+<source>Abort synchronization on first error</source>
+<target>Cancela sincronização no primeiro erro</target>
+
+<source>On completion:</source>
+<target>Ao terminar:</target>
<source>Show progress dialog</source>
<target>Mostrar indicador de progresso</target>
-<source>Error handling</source>
-<target>Tratamento de erros</target>
+<source>Generate log file</source>
+<target>Gerar arquivo de log</target>
+
+<source>Select folder to save log files</source>
+<target>Seleciona pasta para salvar arquivos de log</target>
-<source>Maximum number of log files:</source>
-<target>Número máximo de arquivos de log:</target>
+<source>Limit</source>
+<target>Limite</target>
-<source>Select folder to save log files:</source>
-<target>Selecione a pasta para salvar os arquivos de log:</target>
+<source>Limit maximum number of log files</source>
+<target>Limita número máximo de arquivos de log</target>
<source>Batch settings</source>
<target>Configurações da tarefa em lote</target>
+<source>Compare by...</source>
+<target>Comparar por...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Os arquivos são considerados iguais se
+ - data e hora de modificação e
+ - tamanho do arquivo
+são os mesmos
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Os arquivos são considerados iguais se
+ - o conteúdo do arquivo
+é o mesmo
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Tratamento de Links Simbólicos</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Selecione um modo:</target>
@@ -609,8 +645,26 @@ O comando é disparado se:
<source>Deletion handling</source>
<target>Tratamento da exclusão</target>
-<source>On completion:</source>
-<target>Ao terminar:</target>
+<source>Permanent</source>
+<target>Permante</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Apaga ou substitui arquivos permanentemente</target>
+
+<source>Recycle Bin</source>
+<target>Lixeira</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Usa a Lixeira quando apagar ou substituir arquivos</target>
+
+<source>Versioning</source>
+<target>Controle de versões</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Move os arquivos com estampa de tempo para uma pasta especificada</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Limita número máximo de versões por arquivo</target>
<source>Configuration</source>
<target>Configuração</target>
@@ -633,39 +687,6 @@ O comando é disparado se:
<source>Conflict/item cannot be categorized</source>
<target>Conflito/item não pode ser categorizado</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Comparar por...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Os arquivos são considerados iguais se
- - data e hora de modificação e
- - tamanho do arquivo
-são os mesmos
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Os arquivos são considerados iguais se
- - o conteúdo do arquivo
-é o mesmo
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Tratamento de Links Simbólicos</target>
-
<source>Synchronizing...</source>
<target>Sincronizando...</target>
@@ -681,8 +702,8 @@ Os arquivos são considerados iguais se
<source>Donate with PayPal</source>
<target>Doar usando PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Pela tradução do FreeFileSync, um agradecimento a:</target>
+<source>Many thanks for localization:</source>
+<target>Pela tradução, um agradecimento a:</target>
<source>Feedback and suggestions are welcome</source>
<target>Críticas e sugestões são bem-vindas</target>
@@ -699,9 +720,6 @@ Os arquivos são considerados iguais se
<source>Published under the GNU General Public License</source>
<target>Publicado sobre a GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>Utilizar Lixeira</target>
-
<source>Delete on both sides</source>
<target>Apagar em ambos os lados</target>
@@ -771,8 +789,8 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Statistics</source>
<target>Estatísticas</target>
-<source>Do not show this dialog again</source>
-<target>Não mostrar este diálogo novamente</target>
+<source>Don't show this dialog again</source>
+<target>Não mostrar esta caixa de diálogo novamente</target>
<source>Find what:</source>
<target>Localizar o que:</target>
@@ -855,11 +873,8 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Do you want to save changes to %x?</source>
<target>Gostaria de salvar as alterações para %x?</target>
-<source>Save</source>
-<target>Salvar</target>
-
-<source>Don't Save</source>
-<target>Não Salvar</target>
+<source>Do&n't save</source>
+<target>&Não salvar</target>
<source>Configuration loaded!</source>
<target>Configuração carregada!</target>
@@ -951,8 +966,8 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Show files that won't be copied</source>
<target>Mostrar arquivos que não serão copiados</target>
-<source>All directories in sync!</source>
-<target>Todos os diretórios em sincronismo!</target>
+<source>All folders are in sync!</source>
+<target>Todas as pastas estão sincronizadas!</target>
<source>Comma separated list</source>
<target>Lista de itens separados por vírgulas</target>
@@ -1041,6 +1056,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Pause</source>
<target>Pausar</target>
+<source>Logging</source>
+<target>Ver Log</target>
+
<source>Cannot find %x</source>
<target>Não foi possível encontrar %x</target>
@@ -1122,21 +1140,6 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Leave as unresolved conflict</source>
<target>Deixar como conflito não resolvido</target>
-<source>Delete permanently</source>
-<target>Apagar permanentemente</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Apagar ou substituir arquivos permanentemente</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Usar a Lixeira quando apagar ou substituir arquivos</target>
-
-<source>Versioning</source>
-<target>Controle de versões</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Move os arquivos para uma subpasta com estampa de tempo</target>
-
<source>Files</source>
<target>Arquivos</target>
@@ -1227,8 +1230,11 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Cannot copy file %x to %y.</source>
<target>Não foi possível copiar o arquivo %x para %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Não foi possível ler o diretório %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Não foi possível abrir o diretório %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Não foi possível enumerar o diretório %x.</target>
<source>Detected endless directory recursion.</source>
<target>Detectada recursão de diretório infinita.</target>
@@ -1254,6 +1260,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Configurando direções padrões de sincronização: Arquivos antigos serão substituídos por arquivos mais novos.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>A Lixeira não está disponível para os seguintes caminhos! Os arquivos serão apagados permanentemente:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Você pode ignorar este erro para considerar a pasta como vazia.</target>
@@ -1263,6 +1272,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Os diretórios são dependentes! Cuidado ao definir as regras de sincronização:</target>
+<source>Start comparison</source>
+<target>Iniciar a comparação</target>
+
<source>Preparing synchronization...</source>
<target>Preparando sincronização...</target>
@@ -1275,6 +1287,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Files %x have the same date but a different size!</source>
<target>Os arquivos %x têm a mesma data mas tamanhos diferentes!</target>
+<source>Items differ in attributes only</source>
+<target>Os itens diferem apenas nos atributos</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Os links simbólicos %x têm a mesma data mas um destino diferente.</target>
@@ -1290,9 +1305,6 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Both sides are equal</source>
<target>Ambos os lados são iguais</target>
-<source>Items have different attributes</source>
-<target>Itens têm atributos diferentes</target>
-
<source>Copy new item to left</source>
<target>Copiar novo item para a esquerda</target>
@@ -1356,6 +1368,9 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<source>Moving symbolic link %x to %y</source>
<target>Movendo link simbólico %x para %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>Criando arquivo %x</target>
@@ -1402,19 +1417,16 @@ Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
<target>Espaço em disco insuficiente em:</target>
<source>Required:</source>
-<target>Requerido:</target>
+<target>Necessário:</target>
<source>Available:</source>
<target>Disponível:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>A Lixeira não está disponível para os seguintes caminhos! Os arquivos serão apagados permanentemente:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Uma pasta que é parte de múltiplos pares de pasta será modificada. Por favor, revise as configurações de sincronização.</target>
-<source>Processing folder pair:</source>
-<target>Processando par de pastas:</target>
+<source>Synchronizing folder pair:</source>
+<target>Sincronizando par de pastas:</target>
<source>Target folder %x already existing.</source>
<target>Pasta de destino %x já existe.</target>
diff --git a/BUILD/Languages/romanian.lng b/BUILD/Languages/romanian.lng
index 9c0f7999..196d9393 100644
--- a/BUILD/Languages/romanian.lng
+++ b/BUILD/Languages/romanian.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>Caut dosarul %x...</target>
+<source>Items processed:</source>
+<target>Elemente Procesate:</target>
+
+<source>Items remaining:</source>
+<target>Elemente Rămase:</target>
+
+<source>Total time:</source>
+<target>Timp Total:</target>
+
<source>Show in Explorer</source>
<target>Arată în Exploratorul de File</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>Creează o Sarcină Set [Batch Job]</target>
-<source>Synchronization settings</source>
-<target>Setările Sincronizării</target>
-
<source>Comparison settings</source>
<target>Setările Comparării</target>
+<source>Synchronization settings</source>
+<target>Setările Sincronizării</target>
+
<source>About</source>
<target>Despre</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>Selectează intervalul de timp</target>
-<source>Show pop-up</source>
-<target>Arată un popîc</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Va fi afișată o fereastră popîc [popup] la erori sau avertizări</target>
-
-<source>Ignore errors</source>
-<target>Ignoră erorile</target>
-
-<source>Hide all error and warning messages</source>
-<target>Sînt ascunse toate mesajele de eroare și de avertizare</target>
-
-<source>Exit instantly</source>
-<target>Ieși imediat</target>
-
-<source>Abort synchronization immediately</source>
-<target>Abandonează imediat sincronizarea</target>
-
-<source>Browse</source>
-<target>Explorează</target>
-
<source>Invalid command line:</source>
<target>Linie de comandă nevalidă:</target>
@@ -238,7 +226,7 @@
<source>&Open...</source>
<target>&Deschide...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>Salvează c&a...</target>
<source>&Quit</source>
@@ -280,6 +268,9 @@
<source>Remove folder</source>
<target>Înlătură Dosarul</target>
+<source>Browse</source>
+<target>Explorează</target>
+
<source>Select a folder</source>
<target>Selectează un Dosar</target>
@@ -312,8 +303,8 @@ Comanda este declanșată dacă:
<source>Cancel</source>
<target>Anulează</target>
-<source>(Build: %x)</source>
-<target>(Compilația: %x)</target>
+<source>Build: %x</source>
+<target>Compilația: %x</target>
<source>All files</source>
<target>Toate Filele</target>
@@ -333,9 +324,6 @@ Comanda este declanșată dacă:
<source>A folder input field is empty.</source>
<target>Un cîmp de introducere a dosarului este gol.</target>
-<source>Logging</source>
-<target>Jurnal</target>
-
<source>File time and size</source>
<target>Timpul și Mărimea Filelor</target>
@@ -357,21 +345,6 @@ Comanda este declanșată dacă:
<source>FreeFileSync batch</source>
<target>Set FreeFileSync</target>
-<source>Batch execution</source>
-<target>Execută Fila Set</target>
-
-<source>Items processed:</source>
-<target>Elemente Procesate:</target>
-
-<source>Items remaining:</source>
-<target>Elemente Rămase:</target>
-
-<source>Total time:</source>
-<target>Timp Total:</target>
-
-<source>Stop</source>
-<target>Oprește</target>
-
<source>Synchronization aborted!</source>
<target>Sincronizare abandonată!</target>
@@ -531,11 +504,11 @@ Comanda este declanșată dacă:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Ultimele configurații utilizate (apasă tasta DEL pentru a înlătura din listă)</target>
-<source>Hide excluded items</source>
-<target>Ascunde elementele excluse</target>
+<source>Show excluded items</source>
+<target>Arată itemurile excluse</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Ascunde elementele (file/dosare) filtrate sau excluse temporar</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Arată filele filtrate sau excluse temporar</target>
<source>Number of files and folders that will be created</source>
<target>Numărul de file și dosare care vor fi create</target>
@@ -579,29 +552,86 @@ Comanda este declanșată dacă:
<source>Right</source>
<target>Dreapta</target>
-<source>Status feedback</source>
-<target>Afișarea Stării</target>
+<source>Error handling</source>
+<target>Gestionarea Erorilor</target>
+
+<source>Ignore</source>
+<target>Ignorare</target>
+
+<source>Hide all error and warning messages</source>
+<target>Mesajele de eroare și de avertizare nu sînt arătate</target>
+
+<source>Pop-up</source>
+<target>Popîc</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>În caz de erori sau avertizări este arătată o fereastră popîc [popup]</target>
+
+<source>Exit</source>
+<target>Ieși</target>
+
+<source>Abort synchronization on first error</source>
+<target>Abandonează sincronizarea la prima eroare</target>
+
+<source>On completion:</source>
+<target>La Terminare:</target>
<source>Show progress dialog</source>
<target>Arată progresul sincronizării</target>
-<source>Error handling</source>
-<target>Gestionarea Erorilor</target>
+<source>Generate log file</source>
+<target>Generează filă jurnal [log]</target>
+
+<source>Select folder to save log files</source>
+<target>Selectează dosarul cu filele jurnal</target>
-<source>Maximum number of log files:</source>
-<target>Numărul maxim de file jurnal:</target>
+<source>Limit</source>
+<target>Limită</target>
-<source>Select folder to save log files:</source>
-<target>Selectează dosarul unde să fie salvate filele jurnal [log files]</target>
+<source>Limit maximum number of log files</source>
+<target>Limitează numărul maxim de file jurnal</target>
<source>Batch settings</source>
<target>Setările Setului</target>
+<source>Compare by...</source>
+<target>Compară după:</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Filele sînt considerate identice dacă
+ - data și ora ultimei scrieri
+ - mărimea filelor
+sînt aceleași
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Filele sînt considerate identice dacă
+ - conținutul filelor
+este același
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Gestionarea Legăturilor Simbolice</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Selectează Varianta de Sincronizare:</target>
<source>Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically.</source>
-<target>Identificare și propagare a modificărilor din ambele părți folosind o bază de date. Ștergerile, renumirile și conflictele sînt detectate automat</target>
+<target>Identificare și propagare a modificărilor din ambele părți folosind o bază de date. Ștergerile, renumirile și conflictele sînt detectate automat.</target>
<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
<target>Conservare [backup] în oglindă a dosarului stîng. Dosarul drept e modificat pentru a fi identic după sincronizare cu cel stîng.</target>
@@ -615,8 +645,26 @@ Comanda este declanșată dacă:
<source>Deletion handling</source>
<target>Gestionarea Ștergerii</target>
-<source>On completion:</source>
-<target>La Terminare:</target>
+<source>Permanent</source>
+<target>Definitivă</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Filele sînt șterse sau suprascrise în mod definitiv, fără a mai putea fi recuperate</target>
+
+<source>Recycle Bin</source>
+<target>Reciclator</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Filele șterse sau suprascrise sînt puse în Reciclator [Recycle Bin], de unde pot fi recuperate la nevoie</target>
+
+<source>Versioning</source>
+<target>Versionare</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Filelor le este adăugat un marcaj de timp și apoi sînt mutate în dosarul specificat</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Limitează numărul maxim de versiuni per filă</target>
<source>Configuration</source>
<target>Configurație</target>
@@ -639,39 +687,6 @@ Comanda este declanșată dacă:
<source>Conflict/item cannot be categorized</source>
<target>Conflictul/elementul nu poate fi inclus într-o anumită categorie</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Compară după:</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Filele sînt considerate identice dacă
- - data și ora ultimei scrieri
- - mărimea filelor
-sînt aceleași
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Filele sînt considerate identice dacă
- - conținutul filelor
-este același
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Gestionarea Legăturilor Simbolice (Simleg.)</target>
-
<source>Synchronizing...</source>
<target>Sincronizare Aflată în Curs...</target>
@@ -687,8 +702,8 @@ este același
<source>Donate with PayPal</source>
<target>Donează prin PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Mulțumiri pentru traducerea FreeFileSync:</target>
+<source>Many thanks for localization:</source>
+<target>Multe mulțumiri pentru localizare:</target>
<source>Feedback and suggestions are welcome</source>
<target>Opiniile și sugestiile despre program sînt binevenite</target>
@@ -705,9 +720,6 @@ este același
<source>Published under the GNU General Public License</source>
<target>Publicat sub licența GNU GPL</target>
-<source>Use Recycle Bin</source>
-<target>Mută în Reciclator</target>
-
<source>Delete on both sides</source>
<target>Șterge din ambele părți</target>
@@ -777,8 +789,8 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Statistics</source>
<target>Statistici</target>
-<source>Do not show this dialog again</source>
-<target>Nu arăta acest dialog din nou</target>
+<source>Don't show this dialog again</source>
+<target>Nu arăta fereastra asta din nou</target>
<source>Find what:</source>
<target>Găsește Asta:</target>
@@ -861,11 +873,8 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Do you want to save changes to %x?</source>
<target>Vrei să salvezi modificările făcute la %x?</target>
-<source>Save</source>
-<target>Salvează</target>
-
-<source>Don't Save</source>
-<target>Nu Salva</target>
+<source>Do&n't save</source>
+<target>&Nu salva</target>
<source>Configuration loaded!</source>
<target>Configurație deschisă !</target>
@@ -957,8 +966,8 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Show files that won't be copied</source>
<target>Arată elementele (file/dosare) care nu vor fi copiate</target>
-<source>All directories in sync!</source>
-<target>Toate dosarele au fost sincronizate!</target>
+<source>All folders are in sync!</source>
+<target>Toate dosarele sînt sincronizate!</target>
<source>Comma separated list</source>
<target>Listă de elemente separate prin virgulă</target>
@@ -1051,6 +1060,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Pause</source>
<target>Pauzează</target>
+<source>Logging</source>
+<target>Jurnal</target>
+
<source>Cannot find %x</source>
<target>Nu pot găsi %x</target>
@@ -1134,21 +1146,6 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Leave as unresolved conflict</source>
<target>Lasă ca Conflict Nerezolvat</target>
-<source>Delete permanently</source>
-<target>Șterge definitiv</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Filele sînt șterse sau suprascrise în mod definitiv, fără a mai putea fi recuperate</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Filele șterse sau suprascrise sînt puse în Reciclator [Recycle Bin], de unde pot fi recuperate la nevoie</target>
-
-<source>Versioning</source>
-<target>Versionează</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Filele sînt mutate într-un subdosar cu marcaj de timp</target>
-
<source>Files</source>
<target>File</target>
@@ -1242,8 +1239,11 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Cannot copy file %x to %y.</source>
<target>Nu pot copia fila %x în %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Nu pot citi dosarul %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Nu pot deschide dosarul %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Nu pot enumera dosarul %x.</target>
<source>Detected endless directory recursion.</source>
<target>A fost detectată o recursivitate infinită a dosarului.</target>
@@ -1269,6 +1269,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>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.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Reciclatorul nu este disponibil pentru căile următoare! Filele vor fi deci șterse definitiv:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Poți ignora această eroare dacă vrei ca dosarul să fie considerat gol.</target>
@@ -1278,6 +1281,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Dosarele sînt interdependente! Atenție la setarea regulilor de sincronizare:</target>
+<source>Start comparison</source>
+<target>Pornește compararea</target>
+
<source>Preparing synchronization...</source>
<target>Pregătesc sincronizarea...</target>
@@ -1290,6 +1296,9 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Files %x have the same date but a different size!</source>
<target>Filele %x au dată identică, dar mărime diferită!</target>
+<source>Items differ in attributes only</source>
+<target>Itemurile diferă doar prin atributele lor</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Legăturile simbolice %x au aceeași dată, dar ținte diferite.</target>
@@ -1305,9 +1314,6 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Both sides are equal</source>
<target>Ambele părți sînt identice</target>
-<source>Items have different attributes</source>
-<target>Elementele au atribute diferite</target>
-
<source>Copy new item to left</source>
<target>Copiază elementul nou în stînga</target>
@@ -1422,14 +1428,11 @@ Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
<source>Available:</source>
<target>Disponibil:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Reciclatorul nu este disponibil pentru căile următoare! Filele vor fi deci șterse definitiv:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Va fi modificat un dosar care face parte din mai multe perechi de dosare! Reverifică setările de sincronizare!</target>
-<source>Processing folder pair:</source>
-<target>Procesez perechea de dosare:</target>
+<source>Synchronizing folder pair:</source>
+<target>Sincronizez perechea de dosare:</target>
<source>Target folder %x already existing.</source>
<target>Dosarul țintă %x există deja.</target>
diff --git a/BUILD/Languages/russian.lng b/BUILD/Languages/russian.lng
index 2bf43563..59740f22 100644
--- a/BUILD/Languages/russian.lng
+++ b/BUILD/Languages/russian.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>ПоиÑк папки %x...</target>
-<source>Batch execution</source>
-<target>Выполнение пакетного заданиÑ</target>
-
<source>Items processed:</source>
<target>Элементов обработано:</target>
@@ -61,12 +58,12 @@
<source>Create a batch job</source>
<target>Создать пакетное задание</target>
-<source>Synchronization settings</source>
-<target>ÐаÑтройки Ñинхронизации</target>
-
<source>Comparison settings</source>
<target>ÐаÑтройки ÑравнениÑ</target>
+<source>Synchronization settings</source>
+<target>ÐаÑтройки Ñинхронизации</target>
+
<source>About</source>
<target>О программе</target>
@@ -88,27 +85,6 @@
<source>Select time span</source>
<target>Выберите промежуток времени</target>
-<source>Show pop-up</source>
-<target>Показывать вÑплывающие окна</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Показывать вÑплывающие окна при ошибках и замечаниÑÑ…</target>
-
-<source>Ignore errors</source>
-<target>Игнорировать ошибки</target>
-
-<source>Hide all error and warning messages</source>
-<target>Скрывать вÑе ошибки и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми</target>
-
-<source>Exit instantly</source>
-<target>Выйти немедленно</target>
-
-<source>Abort synchronization immediately</source>
-<target>Отменить Ñинхронизацию немедленно</target>
-
-<source>Browse</source>
-<target>Обзор</target>
-
<source>Invalid command line:</source>
<target>ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока:</target>
@@ -250,7 +226,7 @@
<source>&Open...</source>
<target>&Открыть...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>Сохранить &как...</target>
<source>&Quit</source>
@@ -266,7 +242,7 @@
<target>&О программе</target>
<source>&Help</source>
-<target>&Помощь</target>
+<target>П&омощь</target>
<source>Usage:</source>
<target>ИнÑтрукциÑ:</target>
@@ -292,6 +268,9 @@
<source>Remove folder</source>
<target>Удалить папку</target>
+<source>Browse</source>
+<target>Обзор</target>
+
<source>Select a folder</source>
<target>Выбрать папку</target>
@@ -324,8 +303,8 @@ The command is triggered if:
<source>Cancel</source>
<target>Отмена</target>
-<source>(Build: %x)</source>
-<target>(Ñборка %x)</target>
+<source>Build: %x</source>
+<target>Ñборка %x</target>
<source>All files</source>
<target>Ð’Ñе файлы</target>
@@ -345,9 +324,6 @@ The command is triggered if:
<source>A folder input field is empty.</source>
<target>Поле ввода папки пуÑтое.</target>
-<source>Logging</source>
-<target>Лог-файлы</target>
-
<source>File time and size</source>
<target>Дата и размер файла</target>
@@ -466,10 +442,10 @@ The command is triggered if:
<target>ГибернациÑ</target>
<source>1. &Compare</source>
-<target>1. &Сравнить</target>
+<target>1. С&равнить</target>
<source>2. &Synchronize</source>
-<target>2. &Синхронизировать</target>
+<target>2. С&инхронизировать</target>
<source>&New</source>
<target>&ÐоваÑ</target>
@@ -531,11 +507,11 @@ The command is triggered if:
(нажмите DEL Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка)
</target>
-<source>Hide excluded items</source>
-<target>Скрыть иÑключенные Ñлементы</target>
+<source>Show excluded items</source>
+<target>Показать иÑключенные Ñлементы</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Скрыть отфильтрованные или временно иÑключенные файлы</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Показать отфильтрованные или временно иÑключенные файлы</target>
<source>Number of files and folders that will be created</source>
<target>КоличеÑтво файлов и папок, которые будут Ñозданы</target>
@@ -579,24 +555,76 @@ The command is triggered if:
<source>Right</source>
<target>Справа</target>
-<source>Status feedback</source>
-<target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð¹ ÑвÑзи</target>
+<source>Error handling</source>
+<target>Обработка ошибок</target>
+
+<source>Ignore</source>
+<target>Игнорировать</target>
+
+<source>Hide all error and warning messages</source>
+<target>Скрывать вÑе ошибки и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñми</target>
+
+<source>Pop-up</source>
+<target>Ð’Ñплывающие окна</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Показывать вÑплывающие окна при ошибках и замечаниÑÑ…</target>
+
+<source>Exit</source>
+<target>Выход</target>
+
+<source>Abort synchronization on first error</source>
+<target>Отменить Ñинхронизацию при первой ошибке</target>
+
+<source>On completion:</source>
+<target>По окончании работы</target>
<source>Show progress dialog</source>
-<target>Показать диалог (окно) прогреÑÑа</target>
+<target>Показать окно прогреÑÑа</target>
-<source>Error handling</source>
-<target>Обработка ошибок</target>
+<source>Generate log file</source>
+<target>Создавать лог-файлы</target>
-<source>Maximum number of log files:</source>
-<target>МакÑимальное количеÑтво лог-файлов:</target>
+<source>Select folder to save log files</source>
+<target>Выберите папку Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³-файлов</target>
-<source>Select folder to save log files:</source>
-<target>Выберите папку Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³-файлов:</target>
+<source>Limit</source>
+<target>Ограничение</target>
+
+<source>Limit maximum number of log files</source>
+<target>Ограничить макÑимальное количеÑтво лог-файлов</target>
<source>Batch settings</source>
<target>ÐаÑтройки пакетного заданиÑ</target>
+<source>Compare by...</source>
+<target>Критерии ÑравнениÑ</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые
+ - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ
+ - размер файла
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое</target>
+
+<source>Symbolic Link handling</source>
+<target>Обращение к Ñимвольной ÑÑылке</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Варианты Ñинхронизации</target>
@@ -615,8 +643,26 @@ The command is triggered if:
<source>Deletion handling</source>
<target>ÐаÑтройки удалениÑ</target>
-<source>On completion:</source>
-<target>По окончании работы</target>
+<source>Permanent</source>
+<target>Безвозвратно</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Удалить или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target>
+
+<source>Recycle Bin</source>
+<target>В "Корзину"</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>ИÑпользовать "Корзину" при удалении или перезапиÑи файлов</target>
+
+<source>Versioning</source>
+<target>ПеремеÑтить Ñтарые верÑии файлов в заданную папку</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>ПеремеÑтить файлы Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ времени в указанную папку</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Ограничить макÑимальное количеÑтво верÑий на файл</target>
<source>Configuration</source>
<target>ÐаÑтройки</target>
@@ -639,34 +685,6 @@ The command is triggered if:
<source>Conflict/item cannot be categorized</source>
<target>Конфликт/Ñлемент не могут быть отнеÑены к какой-либо категории</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Критерии ÑравнениÑ</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли одинаковые
- - дата и Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледнего изменениÑ
- - размер файла
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>Файлы ÑчитаютÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼Ð¸, еÑли Ñодержание файлов одинаковое</target>
-
-<source>Symbolic Link handling</source>
-<target>Обращение к Ñимвольной ÑÑылке</target>
-
<source>Synchronizing...</source>
<target>СинхронизациÑ...</target>
@@ -682,8 +700,8 @@ is the same
<source>Donate with PayPal</source>
<target>Отправить деньги через PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Большое ÑпаÑибо за перевод FreeFileSync:</target>
+<source>Many thanks for localization:</source>
+<target>Большое ÑпаÑибо за перевод:</target>
<source>Feedback and suggestions are welcome</source>
<target>Ð—Ð°Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¸ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÑ‚ÑтвуютÑÑ</target>
@@ -700,14 +718,11 @@ is the same
<source>Published under the GNU General Public License</source>
<target>ИздаетÑÑ Ð¿Ð¾Ð´ лицензией GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>ИÑпользовать "Корзину"</target>
-
<source>Delete on both sides</source>
<target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон</target>
<source>Delete on both sides even if the file is selected on one side only</source>
-<target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, еÑли даже файл выделен только на одной Ñтороне</target>
+<target>Удалить Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон, даже еÑли файл выделен только на одной Ñтороне</target>
<source>
Only files that match all filter settings will be synchronized.
@@ -772,7 +787,7 @@ Note: File names must be relative to base directories!
<source>Statistics</source>
<target>СтатиÑтика</target>
-<source>Do not show this dialog again</source>
+<source>Don't show this dialog again</source>
<target>Больше не показывать Ñто окно</target>
<source>Find what:</source>
@@ -856,11 +871,8 @@ Note: File names must be relative to base directories!
<source>Do you want to save changes to %x?</source>
<target>Ð’Ñ‹ хотите Ñохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² %x?</target>
-<source>Save</source>
-<target>Сохранить</target>
-
-<source>Don't Save</source>
-<target>Ðе ÑохранÑÑ‚ÑŒ</target>
+<source>Do&n't save</source>
+<target>&Ðе ÑохранÑÑ‚ÑŒ</target>
<source>Configuration loaded!</source>
<target>ÐаÑтройки Ñинхронизации загружены!</target>
@@ -952,7 +964,7 @@ Note: File names must be relative to base directories!
<source>Show files that won't be copied</source>
<target>Показать файлы, которые не будут Ñкопированы</target>
-<source>All directories in sync!</source>
+<source>All folders are in sync!</source>
<target>Ð’Ñе папки Ñинхронизированы!</target>
<source>Comma separated list</source>
@@ -1046,6 +1058,9 @@ Note: File names must be relative to base directories!
<source>Pause</source>
<target>Пауза</target>
+<source>Logging</source>
+<target>Лог-файлы</target>
+
<source>Cannot find %x</source>
<target>Ðевозможно найти %x</target>
@@ -1132,21 +1147,6 @@ Note: File names must be relative to base directories!
<source>Leave as unresolved conflict</source>
<target>ОÑтавить как нерешенный конфликт</target>
-<source>Delete permanently</source>
-<target>УдалÑÑ‚ÑŒ, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>УдалÑÑ‚ÑŒ или перезапиÑать файлы, не Ð¿Ð¾Ð¼ÐµÑ‰Ð°Ñ Ð² "Корзину"</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>ИÑпользовать "Корзину" при удалении или перезапиÑи файлов</target>
-
-<source>Versioning</source>
-<target>Перемещать Ñтарые верÑии файлов в заданную папку</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Перемещать файлы в заданную папку (можно Ñоздавать архивные верÑии удаленных файлов)</target>
-
<source>Files</source>
<target>Файлы</target>
@@ -1240,8 +1240,11 @@ Note: File names must be relative to base directories!
<source>Cannot copy file %x to %y.</source>
<target>Ðе удаетÑÑ Ñкопировать файл %x в %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Ðе удаетÑÑ Ð¿Ñ€Ð¾Ñ‡ÐµÑÑ‚ÑŒ папку %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Ðевозможно открыть папку %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Ðевозможно прочеÑÑ‚ÑŒ папку %x.</target>
<source>Detected endless directory recursion.</source>
<target>Обнаружена беÑÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐºÑƒÑ€ÑÐ¸Ñ Ð¿Ð°Ð¿Ð¾Ðº.</target>
@@ -1270,6 +1273,9 @@ Note: File names must be relative to base directories!
Старые файлы будут заменены более новыми файлами.
</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Ð”Ð»Ñ Ñтого пути "Корзина" не доÑтупна! Файлы будут удалены безвозвратно:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Ð’Ñ‹ можете проигнорировать ошибку, принÑв папку за пуÑтую.</target>
@@ -1279,6 +1285,9 @@ Note: File names must be relative to base directories!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>ЗавиÑимые папки! Будьте внимательны при наÑтройке правил Ñинхронизации:</target>
+<source>Start comparison</source>
+<target>Ðачать Ñравнение</target>
+
<source>Preparing synchronization...</source>
<target>Подготовка к Ñинхронизации...</target>
@@ -1291,6 +1300,9 @@ Note: File names must be relative to base directories!
<source>Files %x have the same date but a different size!</source>
<target>Файлы %x имеют одинаковую дату, но различаютÑÑ Ð¿Ð¾ размеру!</target>
+<source>Items differ in attributes only</source>
+<target>Элементы различаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ атрибутами</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка %x имеет ту же дату, но отличающуюÑÑ Ñ†ÐµÐ»ÑŒ.</target>
@@ -1306,9 +1318,6 @@ Note: File names must be relative to base directories!
<source>Both sides are equal</source>
<target>Обе Ñтороны равны</target>
-<source>Items have different attributes</source>
-<target>Элементы имеют разные атрибуты</target>
-
<source>Copy new item to left</source>
<target>Скопировать новый Ñлемент налево</target>
@@ -1423,14 +1432,11 @@ Note: File names must be relative to base directories!
<source>Available:</source>
<target>ДоÑтупно:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Ð”Ð»Ñ Ñтого пути "Корзина" не доÑтупна! Файлы будут удалены безвозвратно:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Папка, входÑÑ‰Ð°Ñ Ð² неÑколько пар папок, будет изменена. ПожалуйÑта, проверьте наÑтройки Ñинхронизации.</target>
-<source>Processing folder pair:</source>
-<target>Обработка пары папок:</target>
+<source>Synchronizing folder pair:</source>
+<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð°Ñ€Ñ‹ папок:</target>
<source>Target folder %x already existing.</source>
<target>Ð¦ÐµÐ»ÐµÐ²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° %x уже ÑущеÑтвует.</target>
diff --git a/BUILD/Languages/scottish_gaelic.lng b/BUILD/Languages/scottish_gaelic.lng
index d5f01eef..24551a41 100644
--- a/BUILD/Languages/scottish_gaelic.lng
+++ b/BUILD/Languages/scottish_gaelic.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>A' lorg a' phasgain %x...</target>
-<source>Batch execution</source>
-<target>Cur an gnìomh batch</target>
-
<source>Items processed:</source>
<target>Nithean a tha deiseil:</target>
@@ -61,12 +58,12 @@
<source>Create a batch job</source>
<target>Cruthaich batch job</target>
-<source>Synchronization settings</source>
-<target>Roghainnean an t-sioncronachaidh</target>
-
<source>Comparison settings</source>
<target>Roghainnean a' choimeasaidh</target>
+<source>Synchronization settings</source>
+<target>Roghainnean an t-sioncronachaidh</target>
+
<source>About</source>
<target>Mu dheidhinn</target>
@@ -88,27 +85,6 @@
<source>Select time span</source>
<target>Tagh an raon-ama</target>
-<source>Show pop-up</source>
-<target>Seall na priob-uinneagan</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Seall priob-uinneagan a thaobh mhearachdan no rabhaidhean</target>
-
-<source>Ignore errors</source>
-<target>Leig seachad mearachdan</target>
-
-<source>Hide all error and warning messages</source>
-<target>Falaich gach teachdaireachd mu mhearachdan no rabhaidhean</target>
-
-<source>Exit instantly</source>
-<target>Fàg sa bhad</target>
-
-<source>Abort synchronization immediately</source>
-<target>Sguir dhen t-sioncronachadh sa bhad</target>
-
-<source>Browse</source>
-<target>Rùraich</target>
-
<source>Invalid command line:</source>
<target>Loidhne-àithne mhì-dhligheach:</target>
@@ -253,8 +229,8 @@
<source>&Open...</source>
<target>F&osgail...</target>
-<source>Save &As...</source>
-<target>&Sàbhail mar...</target>
+<source>Save &as...</source>
+<target>Sàbhail &mar...</target>
<source>&Quit</source>
<target>&Fàg</target>
@@ -295,6 +271,9 @@
<source>Remove folder</source>
<target>Thoir am pasgan air falbh</target>
+<source>Browse</source>
+<target>Rùraich</target>
+
<source>Select a folder</source>
<target>Tagh pasgan</target>
@@ -327,8 +306,8 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Cancel</source>
<target>Sguir dheth</target>
-<source>(Build: %x)</source>
-<target>(Build: %x)</target>
+<source>Build: %x</source>
+<target>Build: %x</target>
<source>All files</source>
<target>Gach faidhle</target>
@@ -348,9 +327,6 @@ Thèid an loidhne-àithne a chur gu dol:
<source>A folder input field is empty.</source>
<target>Tha co-dhiù aon raon pasgain ann a tha falamh.</target>
-<source>Logging</source>
-<target>Logadh</target>
-
<source>File time and size</source>
<target>Ceann-là is meud</target>
@@ -531,11 +507,11 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Last used configurations (press DEL to remove from list)</source>
<target>An rèiteachadh mu dheireadh a chaidh a chleachdadh (brùth DEL gus rudan a thoirt air falbh on liosta)</target>
-<source>Hide excluded items</source>
-<target>Falaich rudan a chaidh an dùnadh às</target>
+<source>Show excluded items</source>
+<target>Seall an fheadhainn a tha 'ga dhùnadh a-mach</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Falaich faidhlichean a chaidh a chriathradh às no a chaidh a dhùnadh às gu sealach</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Seall faidhlichean a tha 'gan dùnadh a-mach no air an criathradh a-mach an-dràsta fhèin</target>
<source>Number of files and folders that will be created</source>
<target>Àireamh nam faidhle 's nam pasgan a thèid a chruthachadh</target>
@@ -579,24 +555,80 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Right</source>
<target>Deas</target>
-<source>Status feedback</source>
-<target>Fiosrachadh mun staid</target>
+<source>Error handling</source>
+<target>Làimhseachadh mhearachdan</target>
+
+<source>Ignore</source>
+<target>Leig seachad</target>
+
+<source>Hide all error and warning messages</source>
+<target>Falaich gach teachdaireachd mu mhearachdan no rabhaidhean</target>
+
+<source>Pop-up</source>
+<target>Priob-uinneag</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Seall priob-uinneagan a thaobh mhearachdan no rabhaidhean</target>
+
+<source>Exit</source>
+<target>Fàg an-seo</target>
+
+<source>Abort synchronization on first error</source>
+<target>Sguir dhen t-sioncronachadh nuair a thachras a' chiad mhearachd</target>
+
+<source>On completion:</source>
+<target>Nuair a bhios e deiseil:</target>
<source>Show progress dialog</source>
<target>Seall còmhradh an adhartais</target>
-<source>Error handling</source>
-<target>Làimhseachadh mhearachdan</target>
+<source>Generate log file</source>
+<target>Gin faidhle an loga</target>
-<source>Maximum number of log files:</source>
-<target>An àireamh as motha de dh'fhaidhlichean loga a tha ceadaichte:</target>
+<source>Select folder to save log files</source>
+<target>Tagh pasgan far an dèid faidhlichean an loga a shàbhaladh</target>
-<source>Select folder to save log files:</source>
-<target>Tagh am pasgan far an dèid na logaichean a shàbhaladh:</target>
+<source>Limit</source>
+<target>Cuingich</target>
+
+<source>Limit maximum number of log files</source>
+<target>Cuingich an àireamh as motha de dh'fhaidhlichean an loga</target>
<source>Batch settings</source>
<target>Roghainnean a' batch</target>
+<source>Compare by...</source>
+<target>Dèan coimeas a-rèir...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Bidh dà fhaidhle co-ionnann 'nar beachd-sa
+ - ma tha àm is ceann-là an sgrìobhaidh mu dheireadh
+ - ma tha am meud
+co-ionnann
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Bidh dà fhaidhle co-ionnann 'nar beachd-sa
+ - susbaint an dà fhaidhle co-ionnann
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Làimhseachadh nan symbolic links</target>
+
+<source>OK</source>
+<target>Ceart ma-thà</target>
+
<source>Select variant:</source>
<target>Tagh seòrsa:</target>
@@ -615,8 +647,26 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Deletion handling</source>
<target>Mar a dhèiligear ri sguabadh às</target>
-<source>On completion:</source>
-<target>Nuair a bhios e deiseil:</target>
+<source>Permanent</source>
+<target>Buan</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Sguab às no sgrìobh thairis air faidhlichean gu buan</target>
+
+<source>Recycle Bin</source>
+<target>Am biona ath-chuairteachaidh</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Cleachd am biona ath-chuairteachaidh nuair a thèid faidhlichean a sguabadh às no ma thèid sgrìobhadh thairis orra</target>
+
+<source>Versioning</source>
+<target>Versioning</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Gluais faidhlichean air a bheil stampa ama do phasgain shònraichte</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Cuingich an àireamh as motha de thionndaidhean airson gach faidhle</target>
<source>Configuration</source>
<target>Rèiteachadh</target>
@@ -639,38 +689,6 @@ Thèid an loidhne-àithne a chur gu dol:
<source>Conflict/item cannot be categorized</source>
<target>Tha còmhstri/nì ann nach urrainn dhuinn aithneachadh</target>
-<source>OK</source>
-<target>Ceart ma-thà</target>
-
-<source>Compare by...</source>
-<target>Dèan coimeas a-rèir...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Bidh dà fhaidhle co-ionnann 'nar beachd-sa
- - ma tha àm is ceann-là an sgrìobhaidh mu dheireadh
- - ma tha am meud
-co-ionnann
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Bidh dà fhaidhle co-ionnann 'nar beachd-sa
- - susbaint an dà fhaidhle co-ionnann
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Làimhseachadh nan symbolic links</target>
-
<source>Synchronizing...</source>
<target>A' sioncronachadh...</target>
@@ -686,8 +704,8 @@ Bidh dà fhaidhle co-ionnann 'nar beachd-sa
<source>Donate with PayPal</source>
<target>Nach doir sibh tabhartas le PayPal?</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Taing mhòr dha na daoine a leanas a rinn eadar-theangachadh air FreeFileSync:</target>
+<source>Many thanks for localization:</source>
+<target>Tha sinn fada an comain nan daoine a leanas airson eadar-theangachadh:</target>
<source>Feedback and suggestions are welcome</source>
<target>Tha sinn a' cur fàilte mhòr air beachd is moladh sam bith</target>
@@ -704,9 +722,6 @@ Bidh dà fhaidhle co-ionnann 'nar beachd-sa
<source>Published under the GNU General Public License</source>
<target>Air fhoillseachadh fo GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>Cleachd am biona ath-chuairteachaidh</target>
-
<source>Delete on both sides</source>
<target>Sguab às air an dà thaobh</target>
@@ -776,7 +791,7 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-eòlairea
<source>Statistics</source>
<target>Stats</target>
-<source>Do not show this dialog again</source>
+<source>Don't show this dialog again</source>
<target>Na seall an còmhradh seo a-rithist</target>
<source>Find what:</source>
@@ -860,11 +875,8 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-eòlairea
<source>Do you want to save changes to %x?</source>
<target>An sàbhail sinn dhut na h-atharraichean air %x?</target>
-<source>Save</source>
-<target>Sàbhailibh</target>
-
-<source>Don't Save</source>
-<target>Na sàbhailibh</target>
+<source>Do&n't save</source>
+<target>&Na sàbhail</target>
<source>Configuration loaded!</source>
<target>Chaidh an rèiteachadh a luchdadh!</target>
@@ -956,8 +968,8 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-eòlairea
<source>Show files that won't be copied</source>
<target>Seall faidhlichean nach dèid lethbhreac a dhèanamh dhiubh</target>
-<source>All directories in sync!</source>
-<target>Tha gach eòlaire air sioncronachadh!</target>
+<source>All folders are in sync!</source>
+<target>Tha gach pasgan air a shioncronachadh!</target>
<source>Comma separated list</source>
<target>Liosta air a sgaradh le cromagan</target>
@@ -1054,6 +1066,9 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-eòlairea
<source>Pause</source>
<target>Cuir 'na stad</target>
+<source>Logging</source>
+<target>Logadh</target>
+
<source>Cannot find %x</source>
<target>Chan urrainn dhuinn %x a lorg.</target>
@@ -1139,21 +1154,6 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-eòlairea
<source>Leave as unresolved conflict</source>
<target>Fàg mar còmhstri gun rèiteachadh</target>
-<source>Delete permanently</source>
-<target>Sguab às gu buan</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Sguab às no sgrìobh thairis air faidhlichean gu buan</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Cleachd am biona ath-chuairteachaidh nuair a thèid faidhlichean a sguabadh às no ma thèid sgrìobhadh thairis orra</target>
-
-<source>Versioning</source>
-<target>Versioning</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Gluais na faidhlichean dha fo-phasgan air a bheil stampa-ama</target>
-
<source>Files</source>
<target>Faidhlichean</target>
@@ -1250,8 +1250,11 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-eòlairea
<source>Cannot copy file %x to %y.</source>
<target>Cha ghabh lethbhreac an fhaidhle %x a chur gu %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Cha ghabh an t-eòlaire %x a leughadh.</target>
+<source>Cannot open directory %x.</source>
+<target>Cha ghabh an t-eòlaire %x fhosgladh.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Cha ghabh an t-eòlaire %x àireamhachadh.</target>
<source>Detected endless directory recursion.</source>
<target>Mhothaich sinn dha ath-chùrsadh eòlaire gun chrìoch.</target>
@@ -1289,6 +1292,9 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-eòlairea
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Tha eòlairean an eisimeil a chèile! Bi faiceallach nuair a shuidhicheas tu na riaghailtean sioncronachaidh:</target>
+<source>Start comparison</source>
+<target>Dèan coimeas</target>
+
<source>Preparing synchronization...</source>
<target>Ag ullachadh an t-sioncronachaidh...</target>
@@ -1301,8 +1307,8 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-eòlairea
<source>Files %x have the same date but a different size!</source>
<target>Tha an dearbh cheann-là aig na faidhlichean %x ach chan eil am meud co-ionnann!</target>
-<source>Items have different attributes</source>
-<target>Tha diofar buadhan aig na nithean</target>
+<source>Items differ in attributes only</source>
+<target>Chan eil diofar eatarra ach a thaobh an cuid bhuadhan</target>
<source>Symbolic links %x have the same date but a different target.</source>
<target>Tha an dearbh cheann-là aig na symbolic links %x ach targaidean eadar-dhealaichte.</target>
@@ -1436,8 +1442,8 @@ An aire: Feumaidh ainmean nam faidhlichean a bhi dàimheach ris na bun-eòlairea
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>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?</target>
-<source>Processing folder pair:</source>
-<target>A' pròiseasadh a' phaidhir de phasgain:</target>
+<source>Synchronizing folder pair:</source>
+<target>A' sioncronachadh paidhir nam pasgan:</target>
<source>Target folder %x already existing.</source>
<target>Tha am pasgan-uidhe %x ann mu thràth.</target>
diff --git a/BUILD/Languages/slovenian.lng b/BUILD/Languages/slovenian.lng
index 9fa57752..e831aeeb 100644
--- a/BUILD/Languages/slovenian.lng
+++ b/BUILD/Languages/slovenian.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>Iskanje mape %x...</target>
+<source>Items processed:</source>
+<target>Obdelanih elementov:</target>
+
+<source>Items remaining:</source>
+<target>Preostalih elementov:</target>
+
+<source>Total time:</source>
+<target>Celoten Äas:</target>
+
<source>Show in Explorer</source>
<target>Prikaži v Raziskovalcu</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>Ustvari paketno opravilo</target>
-<source>Synchronization settings</source>
-<target>Nastavitve sinhronizacije</target>
-
<source>Comparison settings</source>
<target>Nastavitve primerjanja</target>
+<source>Synchronization settings</source>
+<target>Nastavitve sinhronizacije</target>
+
<source>About</source>
<target>O programu(1)</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>Izberite Äasovni okvir</target>
-<source>Show pop-up</source>
-<target>Prikaži pojavno okno</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Prikaži pojavne napaka ali opozorila</target>
-
-<source>Ignore errors</source>
-<target>Ignoriraj napake</target>
-
-<source>Hide all error and warning messages</source>
-<target>Skrij vsa obvestila o napakah in opozorilih</target>
-
-<source>Exit instantly</source>
-<target>Zapusti v trenutku</target>
-
-<source>Abort synchronization immediately</source>
-<target>Takoj prekini sinhronizacijo</target>
-
-<source>Browse</source>
-<target>Brskaj</target>
-
<source>Invalid command line:</source>
<target>NapaÄna ukazna vrstica:</target>
@@ -241,7 +229,7 @@
<source>&Open...</source>
<target>&Odpri...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>Shr&ani kot...</target>
<source>&Quit</source>
@@ -283,6 +271,9 @@
<source>Remove folder</source>
<target>Odstrani v mapo</target>
+<source>Browse</source>
+<target>Brskaj</target>
+
<source>Select a folder</source>
<target>Izberite mapo</target>
@@ -315,8 +306,8 @@ Ukaz se sproži Äe:
<source>Cancel</source>
<target>PrekliÄi</target>
-<source>(Build: %x)</source>
-<target>(Izgradnja: %x)</target>
+<source>Build: %x</source>
+<target>Izgradnja: %x</target>
<source>All files</source>
<target>Vse datoteke</target>
@@ -336,9 +327,6 @@ Ukaz se sproži Äe:
<source>A folder input field is empty.</source>
<target>Vnosno polje za mapo je prazno.</target>
-<source>Logging</source>
-<target>Beleženje</target>
-
<source>File time and size</source>
<target>ÄŒas in velikost datoteke</target>
@@ -360,21 +348,6 @@ Ukaz se sproži Äe:
<source>FreeFileSync batch</source>
<target>FreeFileSync paket</target>
-<source>Batch execution</source>
-<target>Paketno izvajanje</target>
-
-<source>Items processed:</source>
-<target>Obdelanih elementov:</target>
-
-<source>Items remaining:</source>
-<target>Preostalih elementov:</target>
-
-<source>Total time:</source>
-<target>Celoten Äas:</target>
-
-<source>Stop</source>
-<target>Ustavi</target>
-
<source>Synchronization aborted!</source>
<target>Sinhronizacija prekinjena!</target>
@@ -534,11 +507,11 @@ Ukaz se sproži Äe:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Zadnje uporabljene konfiguracije (pritisite DEL za odstranitev s seznama)</target>
-<source>Hide excluded items</source>
-<target>Skrij izkljuÄene predmete</target>
+<source>Show excluded items</source>
+<target>Pokaži izkljuÄene elemente</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Skrij filtrirane ali zaÄasno izkljuÄene datoteke</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Pokaži filtrirane ali zaÄasno izkljuÄene datoteke</target>
<source>Number of files and folders that will be created</source>
<target>Å tevilo datotek in map, ki bodo ustvarjene</target>
@@ -582,24 +555,81 @@ Ukaz se sproži Äe:
<source>Right</source>
<target>Desno</target>
-<source>Status feedback</source>
-<target>Povratne informacije statusa</target>
+<source>Error handling</source>
+<target>Napaka pri obravnavanju</target>
+
+<source>Ignore</source>
+<target>Ignoriraj</target>
+
+<source>Hide all error and warning messages</source>
+<target>Skrij vsa obvestila o napakah in opozorilih</target>
+
+<source>Pop-up</source>
+<target>Pogovorno okno</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Prikaži pojavne napaka ali opozorila</target>
+
+<source>Exit</source>
+<target>Izhod</target>
+
+<source>Abort synchronization on first error</source>
+<target>Prekini sinhronizacijo ob prvi napaki</target>
+
+<source>On completion:</source>
+<target>Ob zakljuÄku:</target>
<source>Show progress dialog</source>
<target>Prikazuj pogovorno okno z napredkom</target>
-<source>Error handling</source>
-<target>Napaka pri obravnavanju</target>
+<source>Generate log file</source>
+<target>Ustvari datoteko beleženja</target>
-<source>Maximum number of log files:</source>
-<target>Maksimalno število datotek beleženja:</target>
+<source>Select folder to save log files</source>
+<target>Izberite mapo za shranjevanje datotek beleženja</target>
-<source>Select folder to save log files:</source>
-<target>Izberite mapo za shranjevanje datotek beleženja:</target>
+<source>Limit</source>
+<target>Omejitev</target>
+
+<source>Limit maximum number of log files</source>
+<target>Omeji maksimalno število datotek beleženja</target>
<source>Batch settings</source>
<target>Paketne nastavitve</target>
+<source>Compare by...</source>
+<target>Primerjaj po...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Datoteki sta enaki, Äe sta
+ - zadnji Äas zapisa in datum
+ - velikost datoteke
+enaka
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Datoteki sta enaki, Äe
+ - je vsebina datoteke
+enaka
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Rokovanje s simboliÄnimi povezavami</target>
+
+<source>OK</source>
+<target>V redu</target>
+
<source>Select variant:</source>
<target>Izberite varianto:</target>
@@ -618,8 +648,26 @@ Ukaz se sproži Äe:
<source>Deletion handling</source>
<target>Ravnanje pri brisanju</target>
-<source>On completion:</source>
-<target>Ob zakljuÄku:</target>
+<source>Permanent</source>
+<target>Trajno</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Trajno izbriši ali prepiši datoteke</target>
+
+<source>Recycle Bin</source>
+<target>Koš</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Uporabi Koš pri brisanju ali prepisovanju datotek</target>
+
+<source>Versioning</source>
+<target>Ustvarjanje razliÄiÄ</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Premakni Äasovno-oznaÄene datoteke v doloÄeno mapo</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Omejitev maksimalnega Å¡tevila razliÄic na datoteko</target>
<source>Configuration</source>
<target>Konfiguracija</target>
@@ -642,39 +690,6 @@ Ukaz se sproži Äe:
<source>Conflict/item cannot be categorized</source>
<target>Spor/element ne more biti kategoriziran</target>
-<source>OK</source>
-<target>V redu</target>
-
-<source>Compare by...</source>
-<target>Primerjaj po...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Datoteki sta enaki, Äe sta
- - zadnji Äas zapisa in datum
- - velikost datoteke
-enaka
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Datoteki sta enaki, Äe
- - je vsebina datoteke
-enaka
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Rokovanje s simboliÄnimi povezavami</target>
-
<source>Synchronizing...</source>
<target>Sinhroniziram...</target>
@@ -690,8 +705,8 @@ enaka
<source>Donate with PayPal</source>
<target>Doniraj s PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Zahvale za prevod FreeFileSync gredo:</target>
+<source>Many thanks for localization:</source>
+<target>Zahvale za lokalizacijo:</target>
<source>Feedback and suggestions are welcome</source>
<target>Povratne informacije in predlogi so dobrodošli</target>
@@ -708,9 +723,6 @@ enaka
<source>Published under the GNU General Public License</source>
<target>Objavljeno pod licenco GNU General Public</target>
-<source>Use Recycle Bin</source>
-<target>Uporabi Koš</target>
-
<source>Delete on both sides</source>
<target>Izbriši na obeh straneh</target>
@@ -780,8 +792,8 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Statistics</source>
<target>Statistika</target>
-<source>Do not show this dialog again</source>
-<target>Ne prikaži veÄ tega pogovornega okna</target>
+<source>Don't show this dialog again</source>
+<target>Ne prikazuj veÄ tega pogovora</target>
<source>Find what:</source>
<target>Najdi kaj</target>
@@ -864,11 +876,8 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Do you want to save changes to %x?</source>
<target>Ali želite shraniti spremembe v %x?</target>
-<source>Save</source>
-<target>Shrani</target>
-
-<source>Don't Save</source>
-<target>Ne shrani</target>
+<source>Do&n't save</source>
+<target>Ne shra&ni</target>
<source>Configuration loaded!</source>
<target>Konfiguracija naložena!</target>
@@ -960,8 +969,8 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Show files that won't be copied</source>
<target>Prikaži datoteke, ki ne bodo kopirane</target>
-<source>All directories in sync!</source>
-<target>Vsi imeniki so sinhronizirani!</target>
+<source>All folders are in sync!</source>
+<target>Vse mape so sinhronizirane!</target>
<source>Comma separated list</source>
<target>Seznam loÄen z vejico</target>
@@ -1058,6 +1067,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Pause</source>
<target>Premor</target>
+<source>Logging</source>
+<target>Beleženje</target>
+
<source>Cannot find %x</source>
<target>Ne najdem %x</target>
@@ -1143,21 +1155,6 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Leave as unresolved conflict</source>
<target>Pusti kot nerešeni spor</target>
-<source>Delete permanently</source>
-<target>Trajno izbriši</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Trajno izbriši ali prepiši datoteke</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Uporabi Koš pri brisanju ali prepisovanju datotek</target>
-
-<source>Versioning</source>
-<target>Ustvarjanje razliÄiÄ</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Premakni datoteke v Äasovno-ožigosano podmapo</target>
-
<source>Files</source>
<target>Datoteke</target>
@@ -1254,8 +1251,11 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Cannot copy file %x to %y.</source>
<target>Ne morem kopirati datoteke %x v %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Ne morem prebrati imenika %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Ne morem odpreti imenika %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Ne morem oÅ¡tevilÄiti imenika %x.</target>
<source>Detected endless directory recursion.</source>
<target>Zaznana neskonÄna imeniÅ¡ka rekurzija</target>
@@ -1281,6 +1281,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Nastavljanje privzetih smeri sinhronizacije: Stare datoteke bodo prepisane z novimi datotekami.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Koš ni na voljo za naslednje poti! Namesto tega bodo datoteke trajno izbrisane:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>To napako, da upoštevate mapo kot prazno, lahko ignorirate</target>
@@ -1290,6 +1293,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila:</target>
+<source>Start comparison</source>
+<target>ZaÄni primerjavo</target>
+
<source>Preparing synchronization...</source>
<target>Pripravljam sinhronizacijo...</target>
@@ -1302,6 +1308,9 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Files %x have the same date but a different size!</source>
<target>Datoteki %x imata enak datum ampak razliÄno velikost!</target>
+<source>Items differ in attributes only</source>
+<target>Elementi se razlikujejo samo v atributih</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>SimboliÄne povezave %x imajo isti datum, vendar razliÄno tarÄo.</target>
@@ -1317,9 +1326,6 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Both sides are equal</source>
<target>Obe strani sta enaki</target>
-<source>Items have different attributes</source>
-<target>Elementi imajo razliÄne atribute</target>
-
<source>Copy new item to left</source>
<target>Kopiraj nov element na levo</target>
@@ -1434,14 +1440,11 @@ Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
<source>Available:</source>
<target>Na voljo:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Koš ni na voljo za naslednje poti! Namesto tega bodo datoteke trajno izbrisane:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Spremenjena bo mapa, ki je del veÄkratnih parov map. Prosim preglejte nastavitve sinhronizacije.</target>
-<source>Processing folder pair:</source>
-<target>Obdelujem par map:</target>
+<source>Synchronizing folder pair:</source>
+<target>Sinhroniziram par map:</target>
<source>Target folder %x already existing.</source>
<target>Ciljna mapa %x že obstaja.</target>
diff --git a/BUILD/Languages/spanish.lng b/BUILD/Languages/spanish.lng
index fa14ba86..7d310860 100644
--- a/BUILD/Languages/spanish.lng
+++ b/BUILD/Languages/spanish.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Buscando carpeta %x...</target>
-<source>Batch execution</source>
-<target>Ejecución por lotes</target>
-
<source>Items processed:</source>
<target>Elementos procesados:</target>
@@ -34,6 +31,9 @@
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Solicitud de aborto: Esperando a que la operación actual finalice...</target>
+<source>Failure to create time stamp for versioning:</source>
+<target></target>
+
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Sincronización Automática</target>
@@ -61,12 +61,12 @@
<source>Create a batch job</source>
<target>Crear una tarea por lotes</target>
-<source>Synchronization settings</source>
-<target>Opciones de sincronización</target>
-
<source>Comparison settings</source>
<target>Opciones de comparación</target>
+<source>Synchronization settings</source>
+<target>Opciones de sincronización</target>
+
<source>About</source>
<target>Acerca de</target>
@@ -88,27 +88,6 @@
<source>Select time span</source>
<target>Seleccionar duración</target>
-<source>Show pop-up</source>
-<target>Mostrar ventana emergente</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Mostrar ventana emergente de errores o avisos</target>
-
-<source>Ignore errors</source>
-<target>Ignorar errores</target>
-
-<source>Hide all error and warning messages</source>
-<target>Ocultar todos los mensajes de error y aviso</target>
-
-<source>Exit instantly</source>
-<target>Salir inmediatamente</target>
-
-<source>Abort synchronization immediately</source>
-<target>Abortar sincronización inmediatamente</target>
-
-<source>Browse</source>
-<target>Examinar</target>
-
<source>Invalid command line:</source>
<target>Línea de comandos errónea:</target>
@@ -247,8 +226,8 @@
<source>&Open...</source>
<target>&Abrir...</target>
-<source>Save &As...</source>
-<target>Guardar &Como...</target>
+<source>Save &as...</source>
+<target>Guardar &como...</target>
<source>&Quit</source>
<target>&Salir</target>
@@ -289,6 +268,9 @@
<source>Remove folder</source>
<target>Eliminar carpeta</target>
+<source>Browse</source>
+<target>Examinar</target>
+
<source>Select a folder</source>
<target>Seleccione una carpeta</target>
@@ -321,8 +303,8 @@ El comando es disparado si::
<source>Cancel</source>
<target>Cancelar</target>
-<source>(Build: %x)</source>
-<target>(Completado: %x)</target>
+<source>Build: %x</source>
+<target>Completado: %x</target>
<source>All files</source>
<target>Todos los archivos</target>
@@ -342,9 +324,6 @@ El comando es disparado si::
<source>A folder input field is empty.</source>
<target>Un campo de entrada de la carpeta está vacío.</target>
-<source>Logging</source>
-<target>Registro</target>
-
<source>File time and size</source>
<target>Fecha y tamaño del archivo</target>
@@ -525,11 +504,11 @@ El comando es disparado si::
<source>Last used configurations (press DEL to remove from list)</source>
<target>Últimas configuraciones usadas (Pulsar DEL para quitar de la lista)</target>
-<source>Hide excluded items</source>
-<target>Ocultar elementos excluidos</target>
+<source>Show excluded items</source>
+<target>Mostrar elementos excluidos</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Ocultar archivos filtrados o temporalmente excluidos</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Mostrar archivos excluidos temporalmente o filtrados</target>
<source>Number of files and folders that will be created</source>
<target>Número de archivos y carpetas que serán creados</target>
@@ -573,24 +552,81 @@ El comando es disparado si::
<source>Right</source>
<target>Derecha</target>
-<source>Status feedback</source>
-<target>Status feedback</target>
+<source>Error handling</source>
+<target>Gestión de errores</target>
+
+<source>Ignore</source>
+<target>Ignorar</target>
+
+<source>Hide all error and warning messages</source>
+<target>Ocultar todos los mensajes de error y aviso</target>
+
+<source>Pop-up</source>
+<target>Automático</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Mostrar ventana emergente de errores o avisos</target>
+
+<source>Exit</source>
+<target>Salir</target>
+
+<source>Abort synchronization on first error</source>
+<target>Abortar sincronización al primer error</target>
+
+<source>On completion:</source>
+<target>Al completarse:</target>
<source>Show progress dialog</source>
<target>Mostrar diálogo de progreso</target>
-<source>Error handling</source>
-<target>Gestión de errores</target>
+<source>Generate log file</source>
+<target>Generar archivo de registro</target>
+
+<source>Select folder to save log files</source>
+<target>Seleccionar una carpeta para salvar archivos de registro</target>
-<source>Maximum number of log files:</source>
-<target>Número máximo de archivos de registro:</target>
+<source>Limit</source>
+<target>Límite</target>
-<source>Select folder to save log files:</source>
-<target>Seleccionar carpeta para guardar archivos de registro:</target>
+<source>Limit maximum number of log files</source>
+<target>Limitar el número máximo de archivos de registro</target>
<source>Batch settings</source>
<target>Opciones de lotes</target>
+<source>Compare by...</source>
+<target>Comparar por...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Los archivos serán considerados iguales si
+ - última hora y fecha de escritura
+ - tamaño del archivo
+son iguales
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Los archivos serán considerados iguales si
+ - el contenido del archivo
+es el mismo
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Gestión de enlaces simbólicos</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Seleccione un tipo:</target>
@@ -609,8 +645,26 @@ El comando es disparado si::
<source>Deletion handling</source>
<target>Gestión de borrado</target>
-<source>On completion:</source>
-<target>Al completarse:</target>
+<source>Permanent</source>
+<target>Permanente</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Borrar o sobreescribir archivos permanentemente</target>
+
+<source>Recycle Bin</source>
+<target>Papelera de reciclaje</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos</target>
+
+<source>Versioning</source>
+<target>Control de versiones</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Mover archivos marcados a la carpeta especificada</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Limitar el número máximo de versiones por archivo</target>
<source>Configuration</source>
<target>Configuración</target>
@@ -633,39 +687,6 @@ El comando es disparado si::
<source>Conflict/item cannot be categorized</source>
<target>Conflicto</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Comparar por...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Los archivos serán considerados iguales si
- - última hora y fecha de escritura
- - tamaño del archivo
-son iguales
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Los archivos serán considerados iguales si
- - el contenido del archivo
-es el mismo
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Gestión de enlaces simbólicos</target>
-
<source>Synchronizing...</source>
<target>Sincronizando...</target>
@@ -681,8 +702,8 @@ es el mismo
<source>Donate with PayPal</source>
<target>Donar a través de PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Agradecimientos por la traducción de FreeFileSync a:</target>
+<source>Many thanks for localization:</source>
+<target>Agradecimientos por las traducciones a:</target>
<source>Feedback and suggestions are welcome</source>
<target>Feedback y sugerencias son bienvenidas</target>
@@ -699,9 +720,6 @@ es el mismo
<source>Published under the GNU General Public License</source>
<target>Publicado bajo "GNU General Public License"</target>
-<source>Use Recycle Bin</source>
-<target>Utilizar Papelera de Reciclaje</target>
-
<source>Delete on both sides</source>
<target>Borrar en ambos lados</target>
@@ -771,7 +789,7 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Statistics</source>
<target>Estadísticas</target>
-<source>Do not show this dialog again</source>
+<source>Don't show this dialog again</source>
<target>No volver a mostrar este diálogo</target>
<source>Find what:</source>
@@ -855,11 +873,8 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Do you want to save changes to %x?</source>
<target>¿Quiere guardar los cambios de %x?</target>
-<source>Save</source>
-<target>Guardar</target>
-
-<source>Don't Save</source>
-<target>No guardar</target>
+<source>Do&n't save</source>
+<target>No salvar</target>
<source>Configuration loaded!</source>
<target>¡Configuración cargada!</target>
@@ -951,8 +966,8 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Show files that won't be copied</source>
<target>Mostrar archivos que no serán copiados</target>
-<source>All directories in sync!</source>
-<target>¡Todos los directorios en sincronización!</target>
+<source>All folders are in sync!</source>
+<target>¡Todas las carpetas están sincronizadas!</target>
<source>Comma separated list</source>
<target>Lista separada por comas</target>
@@ -1041,6 +1056,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Pause</source>
<target>Pausa</target>
+<source>Logging</source>
+<target>Registro</target>
+
<source>Cannot find %x</source>
<target>No se puede encontrar %x</target>
@@ -1122,21 +1140,6 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Leave as unresolved conflict</source>
<target>Dejar como conflicto sin resolver</target>
-<source>Delete permanently</source>
-<target>Borrar permanentemente</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Borrar o sobreescribir archivos permanentemente</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Utilitzar Papelera de Reciclaje al eliminar o sobreescribir archivos</target>
-
-<source>Versioning</source>
-<target>Control de versiones</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Mover archivo a una subcarpeta con marca de tiempo</target>
-
<source>Files</source>
<target>Archivos</target>
@@ -1227,8 +1230,11 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Cannot copy file %x to %y.</source>
<target>No se puede copiar el archivo %x a %y.</target>
-<source>Cannot read directory %x.</source>
-<target>No se puede leer el directorio %x.</target>
+<source>Cannot open directory %x.</source>
+<target>No se puede abrir el directorio %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>No se puede enumerar el directorio %x.</target>
<source>Detected endless directory recursion.</source>
<target>Detectada recursividad de directorios sin fin.</target>
@@ -1254,6 +1260,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Fijando direcciones de sincronización por defecto: Los archivos viejos serán sobreescritos por los archivos nuevos.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>¡La papelera de reciclaje no está disponible para las siguientes rutas! Los archivos serán eliminados permanentemente:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Puede ignorar este error al considerar vacía la carpeta.</target>
@@ -1263,6 +1272,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>¡Los directorios son dependientes! Tenga cuidado al establecer las reglas de sincronización:</target>
+<source>Start comparison</source>
+<target>Empezar comparación</target>
+
<source>Preparing synchronization...</source>
<target>Preparando sincronización...</target>
@@ -1275,6 +1287,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Files %x have the same date but a different size!</source>
<target>¡Los archivos %x tienen la misma fecha pero un tamaño diferente!</target>
+<source>Items differ in attributes only</source>
+<target>Los elementos sólo se diferencian en los atributos</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Los enlaces simbólicos %x tienen la misma fecha pero un destino diferente.</target>
@@ -1290,9 +1305,6 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Both sides are equal</source>
<target>Ambos lados son iguales</target>
-<source>Items have different attributes</source>
-<target>Los elementos tienen distintos atributos</target>
-
<source>Copy new item to left</source>
<target>Copiar nuevo elemento a la izquierda</target>
@@ -1356,6 +1368,9 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Moving symbolic link %x to %y</source>
<target>Mover enlace simbólico de %x a %y</target>
+<source>Removing old versions...</source>
+<target></target>
+
<source>Creating file %x</source>
<target>Creando archivo %x</target>
@@ -1407,14 +1422,11 @@ Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
<source>Available:</source>
<target>Disponible:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>¡La papelera de reciclaje no está disponible para las siguientes rutas! Los archivos serán eliminados permanentemente:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Una carpeta, que es parte de múltiple pares de carpetas, será modificada. Por favor, revise las opciones de sincronización.</target>
-<source>Processing folder pair:</source>
-<target>Procesar un par de carpetas:</target>
+<source>Synchronizing folder pair:</source>
+<target>Sincronizando par de carpetas:</target>
<source>Target folder %x already existing.</source>
<target>La carpeta de destino %x ya existe.</target>
diff --git a/BUILD/Languages/swedish.lng b/BUILD/Languages/swedish.lng
index e472d893..37b3edf0 100644
--- a/BUILD/Languages/swedish.lng
+++ b/BUILD/Languages/swedish.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>Söker efter mappen %x...</target>
+<source>Items processed:</source>
+<target>Processade poster</target>
+
+<source>Items remaining:</source>
+<target>Återstående poster:</target>
+
+<source>Total time:</source>
+<target>Total tid:</target>
+
<source>Show in Explorer</source>
<target>Visa i Utforskaren</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>Skapa ett batch-jobb</target>
-<source>Synchronization settings</source>
-<target>Synkroniseringsinställningar</target>
-
<source>Comparison settings</source>
<target>Jämförelseinställningar</target>
+<source>Synchronization settings</source>
+<target>Synkroniseringsinställningar</target>
+
<source>About</source>
<target>Om</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>Välj tidsintervall</target>
-<source>Show pop-up</source>
-<target>Visa pop-up</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Visa pop-up vid fel och varningar</target>
-
-<source>Ignore errors</source>
-<target>Ignorera fel</target>
-
-<source>Hide all error and warning messages</source>
-<target>Visa inte fel- och varningsmeddelanden</target>
-
-<source>Exit instantly</source>
-<target>Avsluta omedelbart</target>
-
-<source>Abort synchronization immediately</source>
-<target>Avbryt synkronisering omedelbart</target>
-
-<source>Browse</source>
-<target>Bläddra</target>
-
<source>Invalid command line:</source>
<target>Ogiltig kommandorad:</target>
@@ -235,8 +223,8 @@
<source>&Open...</source>
<target>&Öppna...</target>
-<source>Save &As...</source>
-<target>Spara s&om...</target>
+<source>Save &as...</source>
+<target>S&para som...</target>
<source>&Quit</source>
<target>&Avsluta</target>
@@ -277,6 +265,9 @@
<source>Remove folder</source>
<target>Ta bort mapp</target>
+<source>Browse</source>
+<target>Bläddra</target>
+
<source>Select a folder</source>
<target>Markera en mapp</target>
@@ -309,8 +300,8 @@ Kommandot triggas om:
<source>Cancel</source>
<target>Avbryt</target>
-<source>(Build: %x)</source>
-<target>(Bygge: %x)</target>
+<source>Build: %x</source>
+<target>Bygge: %x</target>
<source>All files</source>
<target>Alla filer</target>
@@ -330,9 +321,6 @@ Kommandot triggas om:
<source>A folder input field is empty.</source>
<target>Ett inmatningsfält är tomt</target>
-<source>Logging</source>
-<target>Loggar</target>
-
<source>File time and size</source>
<target>Tidsstämpling och storlek</target>
@@ -354,21 +342,6 @@ Kommandot triggas om:
<source>FreeFileSync batch</source>
<target>FreeFileSync batch</target>
-<source>Batch execution</source>
-<target>Batch-körning</target>
-
-<source>Items processed:</source>
-<target>Processade poster</target>
-
-<source>Items remaining:</source>
-<target>Återstående poster:</target>
-
-<source>Total time:</source>
-<target>Total tid:</target>
-
-<source>Stop</source>
-<target>Stopp</target>
-
<source>Synchronization aborted!</source>
<target>Synkronisering avbruten!</target>
@@ -528,11 +501,11 @@ Kommandot triggas om:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Senast använda konfigurationer (Tryck DEL för att ta bort)</target>
-<source>Hide excluded items</source>
-<target>Visa inte undantagna objekt</target>
+<source>Show excluded items</source>
+<target>Visa undantagna poster</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Visa inte filtrerade eller temporärt undantagna filer</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Visa filtrerade eller temporärt undantagna filer</target>
<source>Number of files and folders that will be created</source>
<target>Antal filer och mappar som kommer att skapas</target>
@@ -576,24 +549,81 @@ Kommandot triggas om:
<source>Right</source>
<target>Höger</target>
-<source>Status feedback</source>
-<target>Status</target>
+<source>Error handling</source>
+<target>Felhantering</target>
+
+<source>Ignore</source>
+<target>Ignorera</target>
+
+<source>Hide all error and warning messages</source>
+<target>Visa inte fel- och varningsmeddelanden</target>
+
+<source>Pop-up</source>
+<target>Popup</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Visa popup vid fel och varningar</target>
+
+<source>Exit</source>
+<target>Avsluta</target>
+
+<source>Abort synchronization on first error</source>
+<target>Avbryt synkronisering vid första felet</target>
+
+<source>On completion:</source>
+<target>Vid slutfört:</target>
<source>Show progress dialog</source>
<target>Visa förloppsindikator</target>
-<source>Error handling</source>
-<target>Felhantering</target>
+<source>Generate log file</source>
+<target>Skapa loggfil</target>
+
+<source>Select folder to save log files</source>
+<target>Väl en mapp att spara loggfiler i</target>
-<source>Maximum number of log files:</source>
-<target>Max antal loggfiler:</target>
+<source>Limit</source>
+<target>Begränsa</target>
-<source>Select folder to save log files:</source>
-<target>Välj mapp, att spara loggfiler i</target>
+<source>Limit maximum number of log files</source>
+<target>Begränsa antalet loggfiler</target>
<source>Batch settings</source>
<target>Batch-inställningar</target>
+<source>Compare by...</source>
+<target>Jämför...</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Filer betraktas som likvärdiga om
+ - tidsstämpel för 'Senast ändrad'
+ - filstorlek
+är samma.
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Filerna betecknas som lika om,
+ - filinnehållet
+är lika
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Hantering av Symboliska länkar</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Välj variant:</target>
@@ -612,8 +642,26 @@ Kommandot triggas om:
<source>Deletion handling</source>
<target>Borttagning</target>
-<source>On completion:</source>
-<target>Vid slutfört:</target>
+<source>Permanent</source>
+<target>Permanent</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Ta bort eller skriv över permanent</target>
+
+<source>Recycle Bin</source>
+<target>Papperskorgen</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Använd papperskorgen vid borttagning och överskrivning av filer</target>
+
+<source>Versioning</source>
+<target>Versionshantering</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Flytta tidsstämplade filer till specificerad mapp</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Begränsa antalet versioner per fil</target>
<source>Configuration</source>
<target>Inställningar</target>
@@ -636,39 +684,6 @@ Kommandot triggas om:
<source>Conflict/item cannot be categorized</source>
<target>Konflikten/Objektet kan inte kategoriseras</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Jämför...</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Filer betraktas som likvärdiga om
- - tidsstämpel för 'Senast ändrad'
- - filstorlek
-är samma.
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Filerna betecknas som lika om,
- - filinnehållet
-är lika
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Hantering av Symboliska länkar</target>
-
<source>Synchronizing...</source>
<target>Synkroniserar...</target>
@@ -684,8 +699,8 @@ Filerna betecknas som lika om,
<source>Donate with PayPal</source>
<target>Donera via PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Stort tack för översättningen av FreeFileSync går till:</target>
+<source>Many thanks for localization:</source>
+<target>Tack för översättning:</target>
<source>Feedback and suggestions are welcome</source>
<target>Återkoppling och förslag är välkommna</target>
@@ -702,9 +717,6 @@ Filerna betecknas som lika om,
<source>Published under the GNU General Public License</source>
<target>Publiserad under GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>Använd papperskorgen</target>
-
<source>Delete on both sides</source>
<target>Ta bort på båda sidor</target>
@@ -774,8 +786,8 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Statistics</source>
<target>Statistik</target>
-<source>Do not show this dialog again</source>
-<target>Visa inte den här dialogrutan igen</target>
+<source>Don't show this dialog again</source>
+<target>Visa inte det här igen</target>
<source>Find what:</source>
<target>Sök efter:</target>
@@ -858,11 +870,8 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Do you want to save changes to %x?</source>
<target>Vill du spara ändringar till %x?</target>
-<source>Save</source>
-<target>Spara</target>
-
-<source>Don't Save</source>
-<target>Spara inte</target>
+<source>Do&n't save</source>
+<target>Spara &inte</target>
<source>Configuration loaded!</source>
<target>Inställningar inlästa!</target>
@@ -954,8 +963,8 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Show files that won't be copied</source>
<target>Visa filer som inte kommer att kopieras</target>
-<source>All directories in sync!</source>
-<target>Alla mappar synkroniserade!</target>
+<source>All folders are in sync!</source>
+<target>Alla mappar är synkroniserade!</target>
<source>Comma separated list</source>
<target>Komma-separerad lista</target>
@@ -1044,6 +1053,9 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Pause</source>
<target>Paus</target>
+<source>Logging</source>
+<target>Loggar</target>
+
<source>Cannot find %x</source>
<target>Kan inte hitta %x</target>
@@ -1125,21 +1137,6 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Leave as unresolved conflict</source>
<target>Ignorera konflikt</target>
-<source>Delete permanently</source>
-<target>Ta bort permanent</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Ta bort eller skriv över permanent</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Använd papperskorgen vid borttagning och överskrivning av filer</target>
-
-<source>Versioning</source>
-<target>Versionshantering</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Flytta filer till en tidsstämplad undermapp</target>
-
<source>Files</source>
<target>Filer</target>
@@ -1230,8 +1227,11 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Cannot copy file %x to %y.</source>
<target>Kan inte kopiera filen %x till %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Kan inte läsa in mappen %x.</target>
+<source>Cannot open directory %x.</source>
+<target>Kan inte öppna %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Kan inte räkna upp %x.</target>
<source>Detected endless directory recursion.</source>
<target>Upptäckte ändlös mapprekursion</target>
@@ -1257,6 +1257,9 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Standardsynkronisering: Gamla filer kommer att skrivas över av nyare versioner.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Papperskorgen är inte tillgänglig för följande sökvägar! Filerna tas i stället bort permanent.</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Du kan ignorera detta fel och betrakta mappen som tom</target>
@@ -1266,6 +1269,9 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Mappar är beroende! Var försiktig när du sätter upp synkroniseringsregler:</target>
+<source>Start comparison</source>
+<target>Starta jämförelse</target>
+
<source>Preparing synchronization...</source>
<target>Förbereder synkronisering...</target>
@@ -1278,6 +1284,9 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Files %x have the same date but a different size!</source>
<target>Filerna %x har samma datum men olika storlek!</target>
+<source>Items differ in attributes only</source>
+<target>Endast attribut skiljer objekten åt</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>De symboliska länkarna %x har samma datumstämpel men olika mål.</target>
@@ -1293,9 +1302,6 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Both sides are equal</source>
<target>Bägge sidor är lika</target>
-<source>Items have different attributes</source>
-<target>Objekten har olika attribut</target>
-
<source>Copy new item to left</source>
<target>Kopiera nytt objekt åt vänster</target>
@@ -1410,14 +1416,11 @@ OBS! Filnamnen måste anges relativt till basmappar
<source>Available:</source>
<target>Tillgängligt:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Papperskorgen är inte tillgänglig för följande sökvägar! Filerna tas i stället bort permanent.</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>En mapp som tillhör flera mapp-par är på väg att ändras. Kontrollera synkroniseringsinställningarna</target>
-<source>Processing folder pair:</source>
-<target>Bearbetar mapp-paret:</target>
+<source>Synchronizing folder pair:</source>
+<target>Synkroniserar mapp-par:</target>
<source>Target folder %x already existing.</source>
<target>MÃ¥lmappen %x finns redan.</target>
diff --git a/BUILD/Languages/turkish.lng b/BUILD/Languages/turkish.lng
index c58532a3..0cf8d9ef 100644
--- a/BUILD/Languages/turkish.lng
+++ b/BUILD/Languages/turkish.lng
@@ -10,6 +10,15 @@
<source>Searching for folder %x...</source>
<target>%s klasörü aranıyor...</target>
+<source>Items processed:</source>
+<target>Ä°ÅŸlenen bileÅŸenler:</target>
+
+<source>Items remaining:</source>
+<target>Kalan bileÅŸenler:</target>
+
+<source>Total time:</source>
+<target>Toplam zaman:</target>
+
<source>Show in Explorer</source>
<target>Tarayıcıda Göster</target>
@@ -49,12 +58,12 @@
<source>Create a batch job</source>
<target>Toplu iÅŸ oluÅŸtur</target>
-<source>Synchronization settings</source>
-<target>Eşleştirme ayarları</target>
-
<source>Comparison settings</source>
<target>Karşılaştırma ayarları</target>
+<source>Synchronization settings</source>
+<target>Eşleştirme ayarları</target>
+
<source>About</source>
<target>Hakkında</target>
@@ -76,27 +85,6 @@
<source>Select time span</source>
<target>Zaman aralığı</target>
-<source>Show pop-up</source>
-<target>Açılır pencerede göster</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Hata ya da uyarıları açılır pencerede gösterir</target>
-
-<source>Ignore errors</source>
-<target>Hataları yoksay</target>
-
-<source>Hide all error and warning messages</source>
-<target>Tüm hata ve uyarı iletilerini gizler</target>
-
-<source>Exit instantly</source>
-<target>İşlemi sonlandır</target>
-
-<source>Abort synchronization immediately</source>
-<target>Eşleştirmeyi hemen bırakır</target>
-
-<source>Browse</source>
-<target>Gözat</target>
-
<source>Invalid command line:</source>
<target>Geçersiz komut satırı:</target>
@@ -235,8 +223,8 @@
<source>&Open...</source>
<target>&Aç...</target>
-<source>Save &As...</source>
-<target>F&arklı Kaydet...</target>
+<source>Save &as...</source>
+<target>F&arklı kaydet...</target>
<source>&Quit</source>
<target>Çı&k</target>
@@ -277,6 +265,9 @@
<source>Remove folder</source>
<target>Klasörü sil</target>
+<source>Browse</source>
+<target>Gözat</target>
+
<source>Select a folder</source>
<target>Bir klasör seçin</target>
@@ -309,8 +300,8 @@ Komut şu durumlarda yürütülür:
<source>Cancel</source>
<target>Ä°ptal</target>
-<source>(Build: %x)</source>
-<target>(Yapım: %x)</target>
+<source>Build: %x</source>
+<target>Yapım: %x</target>
<source>All files</source>
<target>Tüm dosyalar</target>
@@ -330,9 +321,6 @@ Komut şu durumlarda yürütülür:
<source>A folder input field is empty.</source>
<target>Bir klasör giriş alanı boş.</target>
-<source>Logging</source>
-<target>Günlükleme</target>
-
<source>File time and size</source>
<target>Dosya tarih ve saati</target>
@@ -354,21 +342,6 @@ Komut şu durumlarda yürütülür:
<source>FreeFileSync batch</source>
<target>FreeFileSync toplu iÅŸi</target>
-<source>Batch execution</source>
-<target>Toplu komut yürütme</target>
-
-<source>Items processed:</source>
-<target>Ä°ÅŸlenen bileÅŸenler:</target>
-
-<source>Items remaining:</source>
-<target>Kalan bileÅŸenler:</target>
-
-<source>Total time:</source>
-<target>Toplam zaman:</target>
-
-<source>Stop</source>
-<target>Durdur</target>
-
<source>Synchronization aborted!</source>
<target>EÅŸleÅŸtirme durduruldu!</target>
@@ -528,11 +501,11 @@ Komut şu durumlarda yürütülür:
<source>Last used configurations (press DEL to remove from list)</source>
<target>Son kullanılan yapılandırmalar (listeden silmek için DEL tuşuna basın)</target>
-<source>Hide excluded items</source>
-<target>Dışlanan ögeleri gizle</target>
+<source>Show excluded items</source>
+<target>Katılmayan ögeleri göster</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Süzülmüş ya da geçici olarak dışlanmış dosyaları gizler</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Süzülmüş ya da geçici olarak katılmayan dosyaları göster</target>
<source>Number of files and folders that will be created</source>
<target>Oluşturulacak dosya ve klasör sayısı</target>
@@ -576,24 +549,81 @@ Komut şu durumlarda yürütülür:
<source>Right</source>
<target>SaÄŸ</target>
-<source>Status feedback</source>
-<target>Durum geri bildirimi</target>
+<source>Error handling</source>
+<target>Hata olursa:</target>
+
+<source>Ignore</source>
+<target>Yoksay</target>
+
+<source>Hide all error and warning messages</source>
+<target>Tüm hata ve uyarı iletilerini gizler</target>
+
+<source>Pop-up</source>
+<target>Açılan pencere</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Hata ya da uyarıları açılır pencerede gösterir</target>
+
+<source>Exit</source>
+<target>Çık</target>
+
+<source>Abort synchronization on first error</source>
+<target>>OluÅŸacak ilk hatada eÅŸleÅŸtirmeyi durdur</target>
+
+<source>On completion:</source>
+<target>İşlem tamamlandığında:</target>
<source>Show progress dialog</source>
<target>İşlem penceresini göster</target>
-<source>Error handling</source>
-<target>Hata olursa:</target>
+<source>Generate log file</source>
+<target>Günlük dosyası oluştur</target>
-<source>Maximum number of log files:</source>
-<target>Tutulacak en fazla günlük dosyası sayısı:</target>
+<source>Select folder to save log files</source>
+<target>Günlük dosyalarının kaydedileceği klasörü seçin</target>
-<source>Select folder to save log files:</source>
-<target>Günlük dosyalarının kaydedileceği klasörü seçin:</target>
+<source>Limit</source>
+<target>Sınır</target>
+
+<source>Limit maximum number of log files</source>
+<target>Günlük dosyası sayısının üst sınırını belirle</target>
<source>Batch settings</source>
<target>İş ayarları</target>
+<source>Compare by...</source>
+<target>Karşılaştırma ölçütünü seçin:</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Dosyaların eşit sayılması için
+ - son yazma tarih ve saati
+ - dosya boyutu
+aynı olmalıdır
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>
+Dosyaların eşit sayılması için
+ - dosya içeriği
+aynı olmalıdır
+</target>
+
+<source>Symbolic Link handling</source>
+<target>Sembolik bağlantı işleme</target>
+
+<source>OK</source>
+<target>Tamam</target>
+
<source>Select variant:</source>
<target>Davranışı seçin:</target>
@@ -612,8 +642,26 @@ Komut şu durumlarda yürütülür:
<source>Deletion handling</source>
<target>Silme eyleminde:</target>
-<source>On completion:</source>
-<target>İşlem tamamlandığında:</target>
+<source>Permanent</source>
+<target>Kalıcı</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Dosyaları kalıcı olarak siler ya da üzerine yazar</target>
+
+<source>Recycle Bin</source>
+<target>Geri Dönüşüm Kutusu</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>Dosya silme ve üzerine yazma sırasında Geri Dönüşüm Kutusu'nu kullanır</target>
+
+<source>Versioning</source>
+<target>Eski sürüm olarak sakla</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>Zaman damgalanmış dosyaları belirtilen klasöre taşı</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Her dosya için en fazla sürüm sayısını sınırla</target>
<source>Configuration</source>
<target>Yapılandırma</target>
@@ -636,39 +684,6 @@ Komut şu durumlarda yürütülür:
<source>Conflict/item cannot be categorized</source>
<target>Uyuşmazlık/öge kategorize edilemiyor</target>
-<source>OK</source>
-<target>Tamam</target>
-
-<source>Compare by...</source>
-<target>Karşılaştırma ölçütünü seçin:</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Dosyaların eşit sayılması için
- - son yazma tarih ve saati
- - dosya boyutu
-aynı olmalıdır
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>
-Dosyaların eşit sayılması için
- - dosya içeriği
-aynı olmalıdır
-</target>
-
-<source>Symbolic Link handling</source>
-<target>Sembolik bağlantı işleme</target>
-
<source>Synchronizing...</source>
<target>EÅŸleÅŸtiriliyor...</target>
@@ -684,8 +699,8 @@ aynı olmalıdır
<source>Donate with PayPal</source>
<target>PayPal ile bağış yapın</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>FreeFileSync çevirmenlerine çok teşekkürler:</target>
+<source>Many thanks for localization:</source>
+<target>Çeviriler için çok teşekkürler:</target>
<source>Feedback and suggestions are welcome</source>
<target>Öneri ve geri bildirimlerinizi bekleriz</target>
@@ -702,9 +717,6 @@ aynı olmalıdır
<source>Published under the GNU General Public License</source>
<target>GNU Genel Kamu Lisansı şartları altında yayınlanmıştır</target>
-<source>Use Recycle Bin</source>
-<target>Geri Dönüşüm Kutusu'nu kullan</target>
-
<source>Delete on both sides</source>
<target>Her iki yandakini de sil</target>
@@ -774,8 +786,8 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Statistics</source>
<target>Ä°statistikler</target>
-<source>Do not show this dialog again</source>
-<target>Bu iletiyi yeniden gösterme</target>
+<source>Don't show this dialog again</source>
+<target>Bu iletiyi artık gösterme</target>
<source>Find what:</source>
<target>Aranacak:</target>
@@ -858,10 +870,7 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Do you want to save changes to %x?</source>
<target>Değişiklikleri %x dosyasına kaydetmek istiyor musunuz?</target>
-<source>Save</source>
-<target>Kaydet</target>
-
-<source>Don't Save</source>
+<source>Do&n't save</source>
<target>Kaydetme</target>
<source>Configuration loaded!</source>
@@ -954,8 +963,8 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Show files that won't be copied</source>
<target>Kopyalanmayacak dosyaları göster</target>
-<source>All directories in sync!</source>
-<target>Tüm klasörler eş!</target>
+<source>All folders are in sync!</source>
+<target>Tüm klasörler eşleştirildi.</target>
<source>Comma separated list</source>
<target>Virgül ile ayrılmış liste</target>
@@ -1044,6 +1053,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Pause</source>
<target>Duraklat</target>
+<source>Logging</source>
+<target>Günlükleme</target>
+
<source>Cannot find %x</source>
<target>%x bulunamadı</target>
@@ -1125,21 +1137,6 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Leave as unresolved conflict</source>
<target>Çözülmemiş tutarsızlık olarak bırak</target>
-<source>Delete permanently</source>
-<target>Kalıcı olarak sil</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Dosyaları kalıcı olarak siler ya da üzerine yazar</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>Dosya silme ve üzerine yazma sırasında Geri Dönüşüm Kutusu'nu kullanır</target>
-
-<source>Versioning</source>
-<target>Eski sürüm olarak sakla</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>Dosyaları zaman damgalı bir alt klasöre taşı</target>
-
<source>Files</source>
<target>Dosyalar</target>
@@ -1230,8 +1227,11 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Cannot copy file %x to %y.</source>
<target>%x dosyası %y olarak kopyalanamadı.</target>
-<source>Cannot read directory %x.</source>
-<target>%x klasörü okunamadı.</target>
+<source>Cannot open directory %x.</source>
+<target>%x klasörü açılamadı.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>%x klasörü sayılamadı.</target>
<source>Detected endless directory recursion.</source>
<target>Sonsuz klasör kısayol döngüsü algılandı.</target>
@@ -1257,6 +1257,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Varsayılan eşleştirme yönleri ayarlanıyor: Yeni dosyalar eski dosyaların üzerine yazılacak.</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Şu yollar için geri dönüşüm kutusu kullanılamaz! Dosyalar anında ve tamamen silinir:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Klasörün boş olarak kabul edilmesi için bu hatayı yok sayanbilirsiniz.</target>
@@ -1266,6 +1269,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Klasörler bağımlı! Eşleştirme kurallarını koyarken dikkatli olun:</target>
+<source>Start comparison</source>
+<target>Karşılaştırmaya başla</target>
+
<source>Preparing synchronization...</source>
<target>Eşleştirmeye hazırlanıyor...</target>
@@ -1278,6 +1284,9 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Files %x have the same date but a different size!</source>
<target>%x dosyalarının tarihleri aynı fakat boyutları farklı!</target>
+<source>Items differ in attributes only</source>
+<target>Yalnız öznitelikleri farklı ögeler</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>%x simgesel bağlantıları aynı tarihe sahip ancak hedef yolları farklı.</target>
@@ -1293,9 +1302,6 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Both sides are equal</source>
<target>İki tarafta aynı</target>
-<source>Items have different attributes</source>
-<target>Ögeler farklı özniteliklere sahip</target>
-
<source>Copy new item to left</source>
<target>Yeni ögeyi sola kopyala</target>
@@ -1410,14 +1416,11 @@ Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
<source>Available:</source>
<target>Kullanılabilir:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Şu yollar için geri dönüşüm kutusu kullanılamaz! Dosyalar anında ve tamamen silinir:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Çoklu klasör çiftlerinin parçası olan bir klasör değiştirilecek. Lütfen eşleştirme ayarlarını gözden geçirin.</target>
-<source>Processing folder pair:</source>
-<target>İşlenen klasör çifti:</target>
+<source>Synchronizing folder pair:</source>
+<target>Eşleştirilen klasör çifti:</target>
<source>Target folder %x already existing.</source>
<target>%x hedef klasörü zaten var.</target>
diff --git a/BUILD/Languages/ukrainian.lng b/BUILD/Languages/ukrainian.lng
index bdfd7db7..594fd28f 100644
--- a/BUILD/Languages/ukrainian.lng
+++ b/BUILD/Languages/ukrainian.lng
@@ -10,9 +10,6 @@
<source>Searching for folder %x...</source>
<target>Пошук каталогу %x...</target>
-<source>Batch execution</source>
-<target>Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ð³Ð¾ завданнÑ</target>
-
<source>Items processed:</source>
<target>Елементів оброблено:</target>
@@ -61,12 +58,12 @@
<source>Create a batch job</source>
<target>Створити пакетне завданнÑ</target>
-<source>Synchronization settings</source>
-<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target>
-
<source>Comparison settings</source>
<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ</target>
+<source>Synchronization settings</source>
+<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target>
+
<source>About</source>
<target>Про</target>
@@ -88,27 +85,6 @@
<source>Select time span</source>
<target>Виберіть чаÑовий інтервал</target>
-<source>Show pop-up</source>
-<target>Показувати виринаючі вікна</target>
-
-<source>Show pop-up on errors or warnings</source>
-<target>Показувати виринаючі вікна при помилках та попередженнÑÑ…</target>
-
-<source>Ignore errors</source>
-<target>Ігнорувати помилки</target>
-
-<source>Hide all error and warning messages</source>
-<target>Приховати вÑÑ– помилки Ñ– Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· попередженнÑми</target>
-
-<source>Exit instantly</source>
-<target>Вийти негайно</target>
-
-<source>Abort synchronization immediately</source>
-<target>Перервати Ñинхронізацію негайно</target>
-
-<source>Browse</source>
-<target>ПереглÑнути</target>
-
<source>Invalid command line:</source>
<target>Ðеправильний командний Ñ€Ñдок:</target>
@@ -250,7 +226,7 @@
<source>&Open...</source>
<target>Відкрити...</target>
-<source>Save &As...</source>
+<source>Save &as...</source>
<target>Зберегти Ñк...</target>
<source>&Quit</source>
@@ -292,6 +268,9 @@
<source>Remove folder</source>
<target>Вилучити папку</target>
+<source>Browse</source>
+<target>ПереглÑнути</target>
+
<source>Select a folder</source>
<target>Вибрати папку</target>
@@ -324,8 +303,8 @@ The command is triggered if:
<source>Cancel</source>
<target>Відмінити</target>
-<source>(Build: %x)</source>
-<target>(компілÑÑ†Ñ–Ñ %x)</target>
+<source>Build: %x</source>
+<target>компілÑÑ†Ñ–Ñ %x</target>
<source>All files</source>
<target>Ð’ÑÑ– файли</target>
@@ -345,9 +324,6 @@ The command is triggered if:
<source>A folder input field is empty.</source>
<target>Порожнє поле папки.</target>
-<source>Logging</source>
-<target>Лог-файли</target>
-
<source>File time and size</source>
<target>Дата та розмір файлу</target>
@@ -531,11 +507,11 @@ The command is triggered if:
(тиÑніть DEL Ð´Ð»Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð·Ñ– ÑпиÑку)
</target>
-<source>Hide excluded items</source>
-<target>Приховати виключені пункти</target>
+<source>Show excluded items</source>
+<target>Показати виключені елементи</target>
-<source>Hide filtered or temporarily excluded files</source>
-<target>Приховати відфільтровані чи тимчаÑово виключені файли</target>
+<source>Show filtered or temporarily excluded files</source>
+<target>Показати відфільтровані чи тимчаÑово виключені елементи</target>
<source>Number of files and folders that will be created</source>
<target>КількіÑÑ‚ÑŒ файлів Ñ– папок, Ñкі будуть Ñтворені</target>
@@ -579,24 +555,77 @@ The command is triggered if:
<source>Right</source>
<target>Праворуч</target>
-<source>Status feedback</source>
-<target>Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¾Ð±ÐµÑ€Ð½ÐµÐ½Ð¾Ð³Ð¾ зв’Ñзку</target>
+<source>Error handling</source>
+<target>Обробка помилок</target>
+
+<source>Ignore</source>
+<target>Ігнорувати</target>
+
+<source>Hide all error and warning messages</source>
+<target>Приховати вÑÑ– помилки Ñ– Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð· попередженнÑми</target>
+
+<source>Pop-up</source>
+<target>Виринаючі вікна</target>
+
+<source>Show pop-up on errors or warnings</source>
+<target>Показувати виринаючі вікна при помилках та попередженнÑÑ…</target>
+
+<source>Exit</source>
+<target>Вихід</target>
+
+<source>Abort synchronization on first error</source>
+<target>Перервати Ñинхронізацію при першій помилці</target>
+
+<source>On completion:</source>
+<target>Закінчивши:</target>
<source>Show progress dialog</source>
<target>Показувати вікно прогреÑу</target>
-<source>Error handling</source>
-<target>Обробка помилок</target>
+<source>Generate log file</source>
+<target>Створити файл журналу</target>
+
+<source>Select folder to save log files</source>
+<target>Виберіть папку Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² журналу</target>
-<source>Maximum number of log files:</source>
-<target>МакÑимальна кількіÑÑ‚ÑŒ лог-файлів:</target>
+<source>Limit</source>
+<target>Межа</target>
-<source>Select folder to save log files:</source>
-<target>Вибрати папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлу</target>
+<source>Limit maximum number of log files</source>
+<target>Обмежити макÑимальну кількіÑÑ‚ÑŒ файлів журналу</target>
<source>Batch settings</source>
<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ð³Ð¾ завданнÑ</target>
+<source>Compare by...</source>
+<target>Критерії порівнюваннÑ</target>
+
+<source>
+Files are found equal if
+ - last write time and date
+ - file size
+are the same
+</source>
+<target>
+Файли вважаютьÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¼Ð¸ Ñкщо
+ - дата Ñ– Ñ‡Ð°Ñ Ð¾Ñтаннього запиÑу
+ - розмір файлів
+Ñпівпадають
+</target>
+
+<source>
+Files are found equal if
+ - file content
+is the same
+</source>
+<target>Файли вважаютьÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо вміÑÑ‚ файлів однаковий</target>
+
+<source>Symbolic Link handling</source>
+<target>Обробка Ñимвольного поÑиланнÑ</target>
+
+<source>OK</source>
+<target>OK</target>
+
<source>Select variant:</source>
<target>Виберіть варіант:</target>
@@ -615,8 +644,26 @@ The command is triggered if:
<source>Deletion handling</source>
<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ</target>
-<source>On completion:</source>
-<target>Закінчивши:</target>
+<source>Permanent</source>
+<target>Ðазавжди</target>
+
+<source>Delete or overwrite files permanently</source>
+<target>Вилучати чи перезапиÑати файли назавжди</target>
+
+<source>Recycle Bin</source>
+<target>Корзина</target>
+
+<source>Use Recycle Bin when deleting or overwriting files</source>
+<target>ВикориÑтовувати "Корзину" при вилученні чи перезапиÑÑ– файлів</target>
+
+<source>Versioning</source>
+<target>Ð—Ð°Ð¿Ð¸Ñ Ð²ÐµÑ€Ñій</target>
+
+<source>Move time-stamped files into specified folder</source>
+<target>ПереміÑтити файли з чаÑовою міткою у вказану папку</target>
+
+<source>Limit maximum number of versions per file</source>
+<target>Обмежити кількіÑÑ‚ÑŒ верÑій файлу</target>
<source>Configuration</source>
<target>ÐалаштуваннÑ</target>
@@ -639,35 +686,6 @@ The command is triggered if:
<source>Conflict/item cannot be categorized</source>
<target>Ðе вдаєтьÑÑ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð·ÑƒÐ²Ð°Ñ‚Ð¸ конфлікт/елемент</target>
-<source>OK</source>
-<target>OK</target>
-
-<source>Compare by...</source>
-<target>Критерії порівнюваннÑ</target>
-
-<source>
-Files are found equal if
- - last write time and date
- - file size
-are the same
-</source>
-<target>
-Файли вважаютьÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¼Ð¸ Ñкщо
- - дата Ñ– Ñ‡Ð°Ñ Ð¾Ñтаннього запиÑу
- - розмір файлів
-Ñпівпадають
-</target>
-
-<source>
-Files are found equal if
- - file content
-is the same
-</source>
-<target>Файли вважаютьÑÑ Ñ€Ñ–Ð²Ð½Ð¸Ð¼Ð¸, Ñкщо вміÑÑ‚ файлів однаковий</target>
-
-<source>Symbolic Link handling</source>
-<target>Обробка Ñимвольного поÑиланнÑ</target>
-
<source>Synchronizing...</source>
<target>СинхронізаціÑ...</target>
@@ -683,8 +701,8 @@ is the same
<source>Donate with PayPal</source>
<target>Пожертвувати через PayPal</target>
-<source>Big thanks for localizing FreeFileSync goes out to:</source>
-<target>Щира подÑка за переклад FreeFileSync:</target>
+<source>Many thanks for localization:</source>
+<target>ПодÑка за локалізацію:</target>
<source>Feedback and suggestions are welcome</source>
<target>Відгуки та пропозиції вітаютьÑÑ</target>
@@ -701,9 +719,6 @@ is the same
<source>Published under the GNU General Public License</source>
<target>Видано за ліцензією GNU General Public License</target>
-<source>Use Recycle Bin</source>
-<target>ВикориÑтовувати "Корзину"</target>
-
<source>Delete on both sides</source>
<target>Вилучити з обох Ñторін</target>
@@ -773,8 +788,8 @@ Note: File names must be relative to base directories!
<source>Statistics</source>
<target>СтатиÑтика</target>
-<source>Do not show this dialog again</source>
-<target>Ðадалі не показувати це вікно</target>
+<source>Don't show this dialog again</source>
+<target>Ðе показувати надалі цього діалогу</target>
<source>Find what:</source>
<target>Знайти:</target>
@@ -857,10 +872,7 @@ Note: File names must be relative to base directories!
<source>Do you want to save changes to %x?</source>
<target>Зберегти зміни в %x?</target>
-<source>Save</source>
-<target>Зберегти</target>
-
-<source>Don't Save</source>
+<source>Do&n't save</source>
<target>Ðе зберігати</target>
<source>Configuration loaded!</source>
@@ -953,8 +965,8 @@ Note: File names must be relative to base directories!
<source>Show files that won't be copied</source>
<target>Показати файли, Ñкі не будуть зкопійовані</target>
-<source>All directories in sync!</source>
-<target>Ð’ÑÑ– каталоги Ñинхронізовані!</target>
+<source>All folders are in sync!</source>
+<target>Ð’ÑÑ– папки Ñинхронізовано!</target>
<source>Comma separated list</source>
<target>Розділений комами ÑпиÑок</target>
@@ -1047,6 +1059,9 @@ Note: File names must be relative to base directories!
<source>Pause</source>
<target>Пауза</target>
+<source>Logging</source>
+<target>Лог-файли</target>
+
<source>Cannot find %x</source>
<target>Ðе можна знайти %x</target>
@@ -1130,21 +1145,6 @@ Note: File names must be relative to base directories!
<source>Leave as unresolved conflict</source>
<target>Залишити Ñк невирішений конфлікт</target>
-<source>Delete permanently</source>
-<target>Вилучати назавжди</target>
-
-<source>Delete or overwrite files permanently</source>
-<target>Вилучати чи перезапиÑати файли назавжди</target>
-
-<source>Use Recycle Bin when deleting or overwriting files</source>
-<target>ВикориÑтовувати "Корзину" при вилученні чи перезапиÑÑ– файлів</target>
-
-<source>Versioning</source>
-<target>Ð—Ð°Ð¿Ð¸Ñ Ð²ÐµÑ€Ñій</target>
-
-<source>Move files into a time-stamped subfolder</source>
-<target>ПереміÑтити файли в означену датою підпапку</target>
-
<source>Files</source>
<target>Файли</target>
@@ -1238,8 +1238,11 @@ Note: File names must be relative to base directories!
<source>Cannot copy file %x to %y.</source>
<target>Ðе вдаєтьÑÑ Ð·ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ñ‚Ð¸ файл %Ñ… до %y.</target>
-<source>Cannot read directory %x.</source>
-<target>Ðе вдаєтьÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог %x</target>
+<source>Cannot open directory %x.</source>
+<target>Ðе вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталогу %x.</target>
+
+<source>Cannot enumerate directory %x.</source>
+<target>Ðе вдаєтьÑÑ Ð²Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог %x.</target>
<source>Detected endless directory recursion.</source>
<target>ВиÑвлено неÑкінченну рекурÑÑ–ÑŽ каталогів.</target>
@@ -1268,6 +1271,9 @@ Note: File names must be relative to base directories!
Старі файли будуть замінені новішими файлами.
</target>
+<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
+<target>Корзина Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ шлÑху недоÑтупна. Файли будуть вилучені назавжди:</target>
+
<source>You can ignore this error to consider the folder as empty.</source>
<target>Ви можете ігнорувати цю помилку вважаючи папку порожньою.</target>
@@ -1277,6 +1283,9 @@ Note: File names must be relative to base directories!
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Залежні каталоги! Будьте уважні при налаштуванні правил Ñинхронізації:</target>
+<source>Start comparison</source>
+<target>Розпочати порівнÑннÑ</target>
+
<source>Preparing synchronization...</source>
<target>Підготовка до Ñинхронізації...</target>
@@ -1289,6 +1298,9 @@ Note: File names must be relative to base directories!
<source>Files %x have the same date but a different size!</source>
<target>Файли %x мають однакову дату, але різні за розміром!</target>
+<source>Items differ in attributes only</source>
+<target>Елементи відрізнÑÑŽÑ‚ÑŒÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ атрибутами</target>
+
<source>Symbolic links %x have the same date but a different target.</source>
<target>Символьні поÑÐ¸Ð»Ð°Ð½Ð½Ñ %Ñ… мають таку ж дату, але різні цілі.</target>
@@ -1304,9 +1316,6 @@ Note: File names must be relative to base directories!
<source>Both sides are equal</source>
<target>Сторони ідентичні</target>
-<source>Items have different attributes</source>
-<target>Елементи мають різні атрибути</target>
-
<source>Copy new item to left</source>
<target>Копіювати нові елементи ліворуч</target>
@@ -1421,14 +1430,11 @@ Note: File names must be relative to base directories!
<source>Available:</source>
<target>ДоÑтупно:</target>
-<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
-<target>Корзина Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ шлÑху недоÑтупна. Файли будуть вилучені назавжди:</target>
-
<source>A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.</source>
<target>Буде змінена папка, Ñка Ñ” чаÑтиною кількох пар папок. Будь лаÑка, переглÑньте Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації.</target>
-<source>Processing folder pair:</source>
-<target>Обробка пари папок:</target>
+<source>Synchronizing folder pair:</source>
+<target>Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ð°Ñ€Ð¸ папок:</target>
<source>Target folder %x already existing.</source>
<target>Цільова папка %x вже Ñ–Ñнує.</target>
diff --git a/FreeFileSync.cbp b/FreeFileSync.cbp
index 4c324148..e924a35f 100644
--- a/FreeFileSync.cbp
+++ b/FreeFileSync.cbp
@@ -23,9 +23,9 @@
<Linker>
<Add option="-s" />
<Add option="-static" />
- <Add library="libboost_thread-mgw47-mt-s-1_50.a" />
- <Add library="libboost_system-mgw47-mt-s-1_50.a" />
- <Add library="libboost_chrono-mgw47-mt-s-1_50.a" />
+ <Add library="libboost_thread-mgw47-mt-s-1_51.a" />
+ <Add library="libboost_system-mgw47-mt-s-1_51.a" />
+ <Add library="libboost_chrono-mgw47-mt-s-1_51.a" />
<Add library="libwxmsw28u_aui.a" />
<Add library="libwxmsw28u_adv.a" />
<Add library="libwxmsw28u_core.a" />
@@ -55,9 +55,9 @@
<Add directory="C:\Programme\C++\wxWidgets\lib\mingw_debug_dll\mswud" />
</Compiler>
<Linker>
- <Add library="libboost_thread-mgw47-mt-sd-1_50.a" />
- <Add library="libboost_system-mgw47-mt-sd-1_50.a" />
- <Add library="libboost_chrono-mgw47-mt-sd-1_50.a" />
+ <Add library="libboost_thread-mgw47-mt-sd-1_51.a" />
+ <Add library="libboost_system-mgw47-mt-sd-1_51.a" />
+ <Add library="libboost_chrono-mgw47-mt-sd-1_51.a" />
<Add library="libwxmsw28ud_aui.a" />
<Add library="libwxmsw28ud_adv.a" />
<Add library="libwxmsw28ud_core.a" />
@@ -85,9 +85,9 @@
<Add directory="lib\gtest\include" />
</Compiler>
<Linker>
- <Add library="libboost_thread-mgw47-mt-sd-1_50.a" />
- <Add library="libboost_system-mgw47-mt-sd-1_50.a" />
- <Add library="libboost_chrono-mgw47-mt-sd-1_50.a" />
+ <Add library="libboost_thread-mgw47-mt-sd-1_51.a" />
+ <Add library="libboost_system-mgw47-mt-sd-1_51.a" />
+ <Add library="libboost_chrono-mgw47-mt-sd-1_51.a" />
<Add library="libwxmsw28ud_adv.a" />
<Add library="libwxmsw28ud_core.a" />
<Add library="libwxbase28ud.a" />
@@ -166,6 +166,7 @@
<Unit filename="lib\dir_exist_async.h" />
<Unit filename="lib\dir_lock.cpp" />
<Unit filename="lib\dir_lock.h" />
+ <Unit filename="lib\error_log.h" />
<Unit filename="lib\ffs_paths.h" />
<Unit filename="lib\generate_logfile.h" />
<Unit filename="lib\gtest\main.cpp">
@@ -219,6 +220,8 @@
<Unit filename="lib\soft_filter.h" />
<Unit filename="lib\status_handler.cpp" />
<Unit filename="lib\status_handler.h" />
+ <Unit filename="lib\versioning.cpp" />
+ <Unit filename="lib\versioning.h" />
<Unit filename="lib\xml_base.cpp" />
<Unit filename="lib\xml_base.h" />
<Unit filename="resource.rc">
diff --git a/FreeFileSync.vcxproj b/FreeFileSync.vcxproj
index 4d42e24e..e144579e 100644
--- a/FreeFileSync.vcxproj
+++ b/FreeFileSync.vcxproj
@@ -237,6 +237,7 @@
<ClCompile Include="lib\resources.cpp" />
<ClCompile Include="lib\shadow.cpp" />
<ClCompile Include="lib\status_handler.cpp" />
+ <ClCompile Include="lib\versioning.cpp" />
<ClCompile Include="lib\xml_base.cpp" />
<ClCompile Include="structures.cpp" />
<ClCompile Include="synchronization.cpp" />
diff --git a/Makefile b/Makefile
index 17a4dda9..370ba305 100644
--- a/Makefile
+++ b/Makefile
@@ -5,7 +5,7 @@ SHAREDIR = $(DESTDIR)$(prefix)/share
APPSHAREDIR = $(SHAREDIR)/$(APPNAME)
DOCSHAREDIR = $(SHAREDIR)/doc/$(APPNAME)
-COMMON_COMPILE_FLAGS = -Wall -pipe -O3 -pthread -std=gnu++0x -DNDEBUG -DwxUSE_UNICODE -DFFS_LINUX -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I. -include "zen/i18n.h"
+COMMON_COMPILE_FLAGS = -Wall -pipe -O3 -pthread -std=gnu++0x -DNDEBUG -DwxUSE_UNICODE -DFFS_LINUX -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I. -include "zen/i18n.h" -include "zen/warn_static.h"
COMMON_LINK_FLAGS = -pthread -lrt -lz
#default build
@@ -76,6 +76,7 @@ CPP_LIST+=lib/resolve_path.cpp
CPP_LIST+=lib/resources.cpp
CPP_LIST+=lib/perf_check.cpp
CPP_LIST+=lib/status_handler.cpp
+CPP_LIST+=lib/versioning.cpp
CPP_LIST+=lib/xml_base.cpp
CPP_LIST+=zen/recycler.cpp
CPP_LIST+=zen/file_handling.cpp
diff --git a/RealtimeSync/RealtimeSync.cbp b/RealtimeSync/RealtimeSync.cbp
index 24aca825..4cda30b1 100644
--- a/RealtimeSync/RealtimeSync.cbp
+++ b/RealtimeSync/RealtimeSync.cbp
@@ -27,9 +27,9 @@
<Add library="libwxbase28u.a" />
<Add library="libwxpng.a" />
<Add library="libwxzlib.a" />
- <Add library="libboost_thread-mgw47-mt-s-1_50.a" />
- <Add library="libboost_system-mgw47-mt-s-1_50.a" />
- <Add library="libboost_chrono-mgw47-mt-s-1_50.a" />
+ <Add library="libboost_thread-mgw47-mt-s-1_51.a" />
+ <Add library="libboost_system-mgw47-mt-s-1_51.a" />
+ <Add library="libboost_chrono-mgw47-mt-s-1_51.a" />
<Add directory="C:\Programme\C++\wxWidgets\lib\mingw_release_lib" />
</Linker>
<ExtraCommands>
@@ -56,9 +56,9 @@
<Add library="libwxbase28ud.a" />
<Add library="libwxpngd.a" />
<Add library="libwxzlibd.a" />
- <Add library="libboost_thread-mgw47-mt-sd-1_50.a" />
- <Add library="libboost_system-mgw47-mt-sd-1_50.a" />
- <Add library="libboost_chrono-mgw47-mt-sd-1_50.a" />
+ <Add library="libboost_thread-mgw47-mt-sd-1_51.a" />
+ <Add library="libboost_system-mgw47-mt-sd-1_51.a" />
+ <Add library="libboost_chrono-mgw47-mt-sd-1_51.a" />
<Add directory="C:\Program Files\C++\wxWidgets\lib\mingw_debug_dll" />
</Linker>
</Target>
diff --git a/RealtimeSync/application.cpp b/RealtimeSync/application.cpp
index dae44de4..a69951d4 100644
--- a/RealtimeSync/application.cpp
+++ b/RealtimeSync/application.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "application.h"
diff --git a/RealtimeSync/application.h b/RealtimeSync/application.h
index 8ed2b45d..cb8b42e3 100644
--- a/RealtimeSync/application.h
+++ b/RealtimeSync/application.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef REALTIMESYNCAPP_H
diff --git a/RealtimeSync/gui_generated.cpp b/RealtimeSync/gui_generated.cpp
index 645249fe..5f884012 100644
--- a/RealtimeSync/gui_generated.cpp
+++ b/RealtimeSync/gui_generated.cpp
@@ -20,7 +20,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
m_menuFile->Append( m_menuItem13 );
wxMenuItem* m_menuItem14;
- m_menuItem14 = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &As...") ) , wxEmptyString, wxITEM_NORMAL );
+ m_menuItem14 = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL );
m_menuFile->Append( m_menuItem14 );
m_menuFile->AppendSeparator();
@@ -119,10 +119,10 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
m_txtCtrlDirectoryMain = new wxTextCtrl( m_panelMainFolder, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 300,-1 ), 0 );
bSizer781->Add( m_txtCtrlDirectoryMain, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerMain = new zen::DirPickerCtrl( m_panelMainFolder, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerMain->SetToolTip( _("Select a folder") );
+ m_buttonSelectDirMain = new wxButton( m_panelMainFolder, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirMain->SetToolTip( _("Select a folder") );
- bSizer781->Add( m_dirPickerMain, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer781->Add( m_buttonSelectDirMain, 0, wxALIGN_CENTER_VERTICAL, 5 );
bSizer10->Add( bSizer781, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
@@ -233,10 +233,10 @@ FolderGenerated::FolderGenerated( wxWindow* parent, wxWindowID id, const wxPoint
m_txtCtrlDirectory = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
bSizer20->Add( m_txtCtrlDirectory, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPicker = new zen::DirPickerCtrl( this, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPicker->SetToolTip( _("Select a folder") );
+ m_buttonSelectDir = new wxButton( this, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDir->SetToolTip( _("Select a folder") );
- bSizer20->Add( m_dirPicker, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer20->Add( m_buttonSelectDir, 0, wxALIGN_CENTER_VERTICAL, 5 );
bSizer114->Add( bSizer20, 1, wxALIGN_CENTER_VERTICAL, 5 );
diff --git a/RealtimeSync/gui_generated.h b/RealtimeSync/gui_generated.h
index 2afd5244..1f475454 100644
--- a/RealtimeSync/gui_generated.h
+++ b/RealtimeSync/gui_generated.h
@@ -11,7 +11,6 @@
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/intl.h>
-#include "../wx+/dir_picker.h"
#include "../wx+/button.h"
#include <wx/string.h>
#include <wx/bitmap.h>
@@ -29,7 +28,6 @@
#include <wx/bmpbuttn.h>
#include <wx/button.h>
#include <wx/textctrl.h>
-#include <wx/filepicker.h>
#include <wx/panel.h>
#include <wx/scrolwin.h>
#include <wx/spinctrl.h>
@@ -66,6 +64,7 @@ protected:
wxBitmapButton* m_bpButtonAddFolder;
wxBitmapButton* m_bpButtonRemoveTopFolder;
wxTextCtrl* m_txtCtrlDirectoryMain;
+ wxButton* m_buttonSelectDirMain;
wxScrolledWindow* m_scrolledWinFolders;
wxBoxSizer* bSizerFolders;
wxSpinCtrl* m_spinCtrlDelay;
@@ -86,7 +85,6 @@ protected:
public:
- zen::DirPickerCtrl* m_dirPickerMain;
MainDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("RealtimeSync - Automated Synchronization"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
@@ -102,11 +100,11 @@ class FolderGenerated : public wxPanel
private:
protected:
+ wxButton* m_buttonSelectDir;
public:
wxBitmapButton* m_bpButtonRemoveFolder;
wxTextCtrl* m_txtCtrlDirectory;
- zen::DirPickerCtrl* m_dirPicker;
FolderGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
~FolderGenerated();
diff --git a/RealtimeSync/main_dlg.cpp b/RealtimeSync/main_dlg.cpp
index 7c2c9f69..c5142f3a 100644
--- a/RealtimeSync/main_dlg.cpp
+++ b/RealtimeSync/main_dlg.cpp
@@ -1,27 +1,29 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "main_dlg.h"
#include "resources.h"
-#include <wx+/button.h>
-#include "../lib/ffs_paths.h"
#include <wx/msgdlg.h>
#include <wx/wupdlock.h>
-#include "watcher.h"
+#include <wx/filedlg.h>
#include <wx/utils.h>
-#include "xml_proc.h"
-#include "tray_menu.h"
-#include <zen/file_handling.h>
-#include "xml_ffs.h"
+#include <wx/filedlg.h>
+#include <wx+/button.h>
#include <wx+/string_conv.h>
+#include <wx+/mouse_move_dlg.h>
#include <zen/assert_static.h>
+#include <zen/file_handling.h>
#include <zen/build_info.h>
+#include "watcher.h"
+#include "xml_proc.h"
+#include "tray_menu.h"
+#include "xml_ffs.h"
#include "../lib/help_provider.h"
#include "../lib/process_xml.h"
-#include <wx+/mouse_move_dlg.h>
+#include "../lib/ffs_paths.h"
using namespace zen;
@@ -42,7 +44,7 @@ MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName)
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(MainDialog::OnKeyPressed), nullptr, this);
//prepare drag & drop
- dirNameFirst.reset(new DirectoryName<wxTextCtrl>(*m_panelMainFolder, *m_dirPickerMain, *m_txtCtrlDirectoryMain, m_staticTextFinalPath));
+ dirNameFirst.reset(new DirectoryName<wxTextCtrl>(*m_panelMainFolder, *m_buttonSelectDirMain, *m_txtCtrlDirectoryMain, m_staticTextFinalPath));
#ifdef FFS_WIN
new MouseMoveWindow(*this); //ownership passed to "this"
@@ -139,7 +141,7 @@ void MainDialog::OnMenuAbout(wxCommandEvent& event)
build += L" x86";
assert_static(zen::is32BitBuild || zen::is64BitBuild);
- wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("(Build: %x)"), L"%x", build), _("About"), wxOK, this);
+ wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("Build: %x"), L"%x", build), _("About"), wxOK, this);
}
diff --git a/RealtimeSync/main_dlg.h b/RealtimeSync/main_dlg.h
index 50b90cc7..ebc0838e 100644
--- a/RealtimeSync/main_dlg.h
+++ b/RealtimeSync/main_dlg.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef REALTIMESYNCMAIN_H
@@ -11,7 +11,6 @@
#include <vector>
#include <memory>
#include "../ui/dir_name.h"
-#include <wx+/dir_picker.h>
namespace xmlAccess
{
@@ -24,7 +23,7 @@ class DirectoryPanel : public FolderGenerated
public:
DirectoryPanel(wxWindow* parent) :
FolderGenerated(parent),
- dirName(*this, *m_dirPicker, *m_txtCtrlDirectory) {}
+ dirName(*this, *m_buttonSelectDir, *m_txtCtrlDirectory) {}
void setName(const wxString& dirname) { dirName.setName(dirname); }
wxString getName() const { return dirName.getName(); }
diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile
index 84f617f6..7c59d7b4 100644
--- a/RealtimeSync/makefile
+++ b/RealtimeSync/makefile
@@ -2,7 +2,7 @@ APPNAME = RealtimeSync
prefix = /usr
BINDIR = $(DESTDIR)$(prefix)/bin
-COMMON_COMPILE_FLAGS = -Wall -pipe -O3 -pthread -std=gnu++0x -DNDEBUG -DwxUSE_UNICODE -DFFS_LINUX -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I.. -include "../zen/i18n.h"
+COMMON_COMPILE_FLAGS = -Wall -pipe -O3 -pthread -std=gnu++0x -DNDEBUG -DwxUSE_UNICODE -DFFS_LINUX -DZEN_PLATFORM_OTHER -DWXINTL_NO_GETTEXT_MACRO -I.. -include "../zen/i18n.h" -include "zen/warn_static.h"
COMMON_LINK_FLAGS = -pthread -lrt
#default build
diff --git a/RealtimeSync/resources.cpp b/RealtimeSync/resources.cpp
index 486aa8f1..787e8968 100644
--- a/RealtimeSync/resources.cpp
+++ b/RealtimeSync/resources.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "resources.h"
diff --git a/RealtimeSync/resources.h b/RealtimeSync/resources.h
index 7a7b1d7f..8578a730 100644
--- a/RealtimeSync/resources.h
+++ b/RealtimeSync/resources.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef RESOURCES_H_INCLUDED_870857342085670826521345
diff --git a/RealtimeSync/tray_menu.cpp b/RealtimeSync/tray_menu.cpp
index 1a3898d6..e1f2b732 100644
--- a/RealtimeSync/tray_menu.cpp
+++ b/RealtimeSync/tray_menu.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "tray_menu.h"
@@ -25,6 +25,7 @@
#include <zen/build_info.h>
#include <wx+/shell_execute.h>
#include "gui_generated.h"
+#include "../lib/resolve_path.h"
using namespace rts;
using namespace zen;
@@ -107,7 +108,7 @@ private:
build += L" x86";
assert_static(zen::is32BitBuild || zen::is64BitBuild);
- wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("(Build: %x)"), L"%x", build), _("About"), wxOK);
+ wxMessageBox(L"RealtimeSync" L"\n\n" + replaceCpy(_("Build: %x"), L"%x", build), _("About"), wxOK);
}
break;
}
@@ -266,12 +267,12 @@ public:
private:
void OnTimerEvent(wxEvent& event)
{
- --secondsLeft;
- if (secondsLeft < 0)
+ if (secondsLeft <= 0)
{
EndModal(BUTTON_RETRY);
return;
}
+ --secondsLeft;
updateButtonLabel();
}
@@ -323,7 +324,7 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf
{
const std::vector<Zstring> dirList = toZ(config.directories);
- auto cmdLine = config.commandline;
+ wxString cmdLine = config.commandline;
trim(cmdLine);
if (cmdLine.empty())
@@ -382,7 +383,8 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf
lastFileChanged.clear(); //make sure old name is not shown again after a directory reappears
//execute command
- zen::shellExecute(cmdLine, zen::EXEC_TYPE_SYNC);
+ auto cmdLineExp = utfCvrtTo<wxString>(expandMacros(utfCvrtTo<Zstring>(cmdLine)));
+ zen::shellExecute(cmdLineExp, zen::EXEC_TYPE_SYNC);
callback.clearSchedule();
}
};
diff --git a/RealtimeSync/tray_menu.h b/RealtimeSync/tray_menu.h
index 9c910694..7ebe4f40 100644
--- a/RealtimeSync/tray_menu.h
+++ b/RealtimeSync/tray_menu.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TRAYMENU_H_INCLUDED
diff --git a/RealtimeSync/watcher.cpp b/RealtimeSync/watcher.cpp
index a0893382..c2885b5d 100644
--- a/RealtimeSync/watcher.cpp
+++ b/RealtimeSync/watcher.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "watcher.h"
diff --git a/RealtimeSync/watcher.h b/RealtimeSync/watcher.h
index 6d68d5be..2078bb0f 100644
--- a/RealtimeSync/watcher.h
+++ b/RealtimeSync/watcher.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef WATCHER_H_INCLUDED
diff --git a/RealtimeSync/xml_ffs.cpp b/RealtimeSync/xml_ffs.cpp
index 6572800b..acce554c 100644
--- a/RealtimeSync/xml_ffs.cpp
+++ b/RealtimeSync/xml_ffs.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "xml_ffs.h"
diff --git a/RealtimeSync/xml_ffs.h b/RealtimeSync/xml_ffs.h
index b63c3620..76e4348f 100644
--- a/RealtimeSync/xml_ffs.h
+++ b/RealtimeSync/xml_ffs.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef XMLFREEFILESYNC_H_INCLUDED
diff --git a/RealtimeSync/xml_proc.cpp b/RealtimeSync/xml_proc.cpp
index b804ba72..ac6c0eb9 100644
--- a/RealtimeSync/xml_proc.cpp
+++ b/RealtimeSync/xml_proc.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "xml_proc.h"
diff --git a/RealtimeSync/xml_proc.h b/RealtimeSync/xml_proc.h
index e07f9844..33b1694c 100644
--- a/RealtimeSync/xml_proc.h
+++ b/RealtimeSync/xml_proc.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef XMLPROCESSING_H_INCLUDED
diff --git a/algorithm.cpp b/algorithm.cpp
index 6ca1f73a..f1ff5f2a 100644
--- a/algorithm.cpp
+++ b/algorithm.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "algorithm.h"
@@ -509,8 +509,8 @@ private:
std::for_each(container.files.begin(), container.files.end(),
[&](const std::pair<Zstring, InSyncFile>& filePair)
{
- if (filePair.second.left .id != FileId() &&
- filePair.second.right.id != FileId() &&
+ if (getFileId(filePair.second.left ) != FileId() &&
+ getFileId(filePair.second.right) != FileId() &&
stillInSync(filePair.second, cmpVar, fileTimeTolerance))
onceEqual.insert(std::make_pair(getFileIdKey(filePair.second.left), getFileIdKey(filePair.second.right)));
});
@@ -572,7 +572,7 @@ private:
//detection of renamed files
template <SelectedSide side>
static FileIdKey getFileIdKey(const FileMapping& fsObj) { return std::make_tuple(fsObj.getLastWriteTime<side>(), fsObj.getFileSize<side>(), fsObj.getFileId<side>()); }
- static FileIdKey getFileIdKey(const FileDescriptor& fileDescr) { return std::make_tuple(fileDescr.lastWriteTimeRaw, fileDescr.fileSize, fileDescr.id); }
+ static FileIdKey getFileIdKey(const FileDescriptor& fileDescr) { return std::make_tuple(fileDescr.lastWriteTimeRaw, fileDescr.fileSize, getFileId(fileDescr)); }
struct LessFileIdKey
{
diff --git a/algorithm.h b/algorithm.h
index c2621ec0..c4c1d135 100644
--- a/algorithm.h
+++ b/algorithm.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef ALGORITHM_H_INCLUDED
diff --git a/comparison.cpp b/comparison.cpp
index 2661d67c..76aad384 100644
--- a/comparison.cpp
+++ b/comparison.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "comparison.h"
@@ -9,6 +9,7 @@
#include <numeric>
#include <zen/perf.h>
#include <zen/scope_guard.h>
+#include <zen/process_priority.h>
#include <wx+/format_unit.h>
#include "algorithm.h"
#include "lib/parallel_scan.h"
@@ -17,6 +18,7 @@
#include "lib/binary.h"
#include "lib/cmp_filetime.h"
#include "lib/status_handler_impl.h"
+#include "lib/parallel_scan.h"
using namespace zen;
@@ -52,7 +54,7 @@ std::vector<FolderPairCfg> zen::extractCompareCfg(const MainConfiguration& mainC
//------------------------------------------------------------------------------------------
namespace
{
-void checkForIncompleteInput(const std::vector<FolderPairCfg>& folderPairsForm, ProcessCallback& procCallback)
+void checkForIncompleteInput(const std::vector<FolderPairCfg>& folderPairsForm, ProcessCallback& callback)
{
bool havePartialPair = false;
bool haveFullPair = false;
@@ -71,14 +73,14 @@ void checkForIncompleteInput(const std::vector<FolderPairCfg>& folderPairsForm,
if (havePartialPair == haveFullPair) //error if: all empty or exist both full and partial pairs -> support single-dir scenario
throw FileError(_("A folder input field is empty.") + L" \n\n" +
_("You can ignore this error to consider the folder as empty."));
- }, procCallback);
+ }, callback);
}
void determineExistentDirs(const std::set<Zstring, LessFilename>& dirnames,
std::set<Zstring, LessFilename>& dirnamesExisting,
bool allowUserInteraction,
- ProcessCallback& procCallback)
+ ProcessCallback& callback)
{
std::for_each(dirnames.begin(), dirnames.end(),
[&](const Zstring& dirname)
@@ -87,10 +89,10 @@ void determineExistentDirs(const std::set<Zstring, LessFilename>& dirnames,
{
if (tryReportingError([&]
{
- if (!dirExistsUpdating(dirname, allowUserInteraction, procCallback))
+ if (!dirExistsUpdating(dirname, allowUserInteraction, callback))
throw FileError(replaceCpy(_("Cannot find folder %x."), L"%x", fmtFileName(dirname)) + L"\n\n" +
_("You can ignore this error to consider the folder as empty."));
- }, procCallback))
+ }, callback))
dirnamesExisting.insert(dirname);
}
});
@@ -172,40 +174,110 @@ bool filesHaveSameContentUpdating(const Zstring& filename1, const Zstring& filen
}
}
-
//#############################################################################################################################
-CompareProcess::CompareProcess(size_t fileTimeTol,
- xmlAccess::OptionalDialogs& warnings,
- bool allowUserInteraction,
- bool runWithBackgroundPriority,
- ProcessCallback& handler) :
+class ComparisonBuffer
+{
+public:
+ ComparisonBuffer(const std::set<DirectoryKey>& 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<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad);
+
+private:
+ ComparisonBuffer(const ComparisonBuffer&);
+ ComparisonBuffer& operator=(const ComparisonBuffer&);
+
+ void performComparison(const FolderPairCfg& fpCfg,
+ BaseDirMapping& output,
+ std::vector<FileMapping*>& undefinedFiles,
+ std::vector<SymLinkMapping*>& undefinedLinks);
+
+ std::map<DirectoryKey, DirectoryValue> directoryBuffer; //contains only *existing* directories
+ const size_t fileTimeTolerance;
+ ProcessCallback& callback_;
+};
+
+
+ComparisonBuffer::ComparisonBuffer(const std::set<DirectoryKey>& keysToRead,
+ size_t fileTimeTol,
+ ProcessCallback& callback) :
fileTimeTolerance(fileTimeTol),
- m_warnings(warnings),
- allowUserInteraction_(allowUserInteraction),
- procCallback(handler)
+ callback_(callback)
{
- if (runWithBackgroundPriority)
- procBackground.reset(new ScheduleForBackgroundProcessing);
+ class CbImpl : public FillBufferCallback
+ {
+ public:
+ CbImpl(ProcessCallback& pcb) :
+ callback_(pcb),
+ itemsReported(0) {}
+
+ virtual void reportStatus(const std::wstring& statusMsg, int itemsTotal)
+ {
+ callback_.updateProcessedData(itemsTotal - itemsReported, 0); //processed data is communicated in subfunctions!
+ itemsReported = itemsTotal;
+
+ callback_.reportStatus(statusMsg); //may throw
+ //callback_.requestUiRefresh(); //already called by reportStatus()
+ }
+
+ virtual HandleError reportError(const std::wstring& msg)
+ {
+ switch (callback_.reportError(msg))
+ {
+ case ProcessCallback::IGNORE_ERROR:
+ return ON_ERROR_IGNORE;
+
+ case ProcessCallback::RETRY:
+ return ON_ERROR_RETRY;
+ }
+
+ assert(false);
+ return ON_ERROR_IGNORE;
+ }
+
+ private:
+ ProcessCallback& callback_;
+ int itemsReported;
+ } cb(callback);
+
+ fillBuffer(keysToRead, //in
+ directoryBuffer, //out
+ cb,
+ UI_UPDATE_INTERVAL / 4); //every ~25 ms
}
-void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgList, FolderComparison& output)
+void zen::compare(size_t fileTimeTolerance,
+ xmlAccess::OptionalDialogs& warnings,
+ bool allowUserInteraction,
+ bool runWithBackgroundPriority,
+ const std::vector<FolderPairCfg>& cfgList,
+ FolderComparison& output,
+ ProcessCallback& callback)
{
- //prevent shutdown while (binary) comparison is in progress
+ //specify process and resource handling priorities
+ std::unique_ptr<ScheduleForBackgroundProcessing> backgroundPrio;
+ if (runWithBackgroundPriority)
+ backgroundPrio.reset(new ScheduleForBackgroundProcessing);
+
+ //prevent operating system going into sleep state
PreventStandby dummy2;
(void)dummy2;
//PERF_START;
- procCallback.reportInfo(_("Start comparison")); //we want some indicator at the very beginning to make sense of "total time"
+ callback.reportInfo(_("Start comparison")); //we want some indicator at the very beginning to make sense of "total time"
//init process: keep at beginning so that all gui elements are initialized properly
- procCallback.initNewPhase(-1, 0, ProcessCallback::PHASE_SCANNING); //it's not known how many files will be scanned => -1 objects
+ callback.initNewPhase(-1, 0, ProcessCallback::PHASE_SCANNING); //it's not known how many files will be scanned => -1 objects
//-------------------some basic checks:------------------------------------------
- checkForIncompleteInput(cfgList, procCallback);
+ checkForIncompleteInput(cfgList, callback);
std::set<Zstring, LessFilename> dirnamesExisting;
@@ -219,7 +291,7 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi
dirnames.insert(fpCfg.leftDirectoryFmt);
dirnames.insert(fpCfg.rightDirectoryFmt);
});
- determineExistentDirs(dirnames, dirnamesExisting, allowUserInteraction_, procCallback);
+ determineExistentDirs(dirnames, dirnamesExisting, allowUserInteraction, callback);
}
auto dirAvailable = [&](const Zstring& dirnameFmt) { return dirnamesExisting.find(dirnameFmt) != dirnamesExisting.end(); };
@@ -228,7 +300,7 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi
//check if folders have dependencies
std::wstring warningMessage = checkFolderDependency(cfgList);
if (!warningMessage.empty())
- procCallback.reportWarning(warningMessage, m_warnings.warningDependentFolders);
+ callback.reportWarning(warningMessage, warnings.warningDependentFolders);
}
//-------------------end of basic checks------------------------------------------
@@ -247,52 +319,14 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi
keysToRead.insert(DirectoryKey(fpCfg.rightDirectoryFmt, fpCfg.filter.nameFilter, fpCfg.handleSymlinks));
});
- class CbImpl : public FillBufferCallback
- {
- public:
- CbImpl(ProcessCallback& pcb) :
- procCallback_(pcb),
- itemsReported(0) {}
-
- virtual void reportStatus(const std::wstring& statusMsg, int itemsTotal)
- {
- procCallback_.updateProcessedData(itemsTotal - itemsReported, 0); //processed data is communicated in subfunctions!
- itemsReported = itemsTotal;
-
- procCallback_.reportStatus(statusMsg); //may throw
- //procCallback_.requestUiRefresh(); //already called by reportStatus()
- }
-
- virtual HandleError reportError(const std::wstring& errorText)
- {
- switch (procCallback_.reportError(errorText))
- {
- case ProcessCallback::IGNORE_ERROR:
- return ON_ERROR_IGNORE;
-
- case ProcessCallback::RETRY:
- return ON_ERROR_RETRY;
- }
-
- assert(false);
- return ON_ERROR_IGNORE;
- }
+ ComparisonBuffer cmpBuff(keysToRead,
+ fileTimeTolerance,
+ callback);
- private:
- ProcessCallback& procCallback_;
- int itemsReported;
- } cb(procCallback);
+ //------------ traverse/read folders -----------------------------------------------------
- fillBuffer(keysToRead, //in
- directoryBuffer, //out
- cb,
- UI_UPDATE_INTERVAL / 4); //every ~25 ms
- //-------------------------------------------------------------------------------------------
-
- //traverse/process folders
FolderComparison output_tmp; //write to output not before END of process!
-
//buffer "config"/"result of binary comparison" for latter processing as a single block
std::vector<std::pair<FolderPairCfg, BaseDirMapping*>> workLoadBinary;
@@ -310,7 +344,7 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi
switch (fpCfg.compareVar)
{
case CMP_BY_TIME_SIZE:
- compareByTimeSize(fpCfg, *output_tmp.back());
+ cmpBuff.compareByTimeSize(fpCfg, *output_tmp.back());
break;
case CMP_BY_CONTENT:
workLoadBinary.push_back(std::make_pair(fpCfg, &*output_tmp.back()));
@@ -318,20 +352,20 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi
}
});
//process binary comparison in one block
- compareByContent(workLoadBinary);
-
+ cmpBuff.compareByContent(workLoadBinary);
assert(output_tmp.size() == cfgList.size());
+ //--------- set initial sync-direction --------------------------------------------------
+
for (auto j = begin(output_tmp); j != end(output_tmp); ++j)
{
const FolderPairCfg& fpCfg = cfgList[j - output_tmp.begin()];
- //set initial sync-direction
- procCallback.reportStatus(_("Preparing synchronization..."));
- procCallback.forceUiRefresh();
+ callback.reportStatus(_("Preparing synchronization..."));
+ callback.forceUiRefresh();
zen::redetermineSyncDirection(fpCfg.directionCfg, *j,
- [&](const std::wstring& warning) { procCallback.reportWarning(warning, m_warnings.warningSyncDatabase); });
+ [&](const std::wstring& warning) { callback.reportWarning(warning, warnings.warningSyncDatabase); });
}
//only if everything was processed correctly output is written to!
@@ -340,11 +374,11 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi
}
catch (const std::bad_alloc& e)
{
- procCallback.reportFatalError(_("Out of memory!") + L" " + utfCvrtTo<std::wstring>(e.what()));
+ callback.reportFatalError(_("Out of memory!") + L" " + utfCvrtTo<std::wstring>(e.what()));
}
catch (const std::exception& e)
{
- procCallback.reportFatalError(utfCvrtTo<std::wstring>(e.what()));
+ callback.reportFatalError(utfCvrtTo<std::wstring>(e.what()));
}
}
@@ -378,9 +412,9 @@ std::wstring getConflictSameDateDiffSize(const FileMapping& fileObj)
inline
-std::wstring getDescrDiffMetaShortname(const FileSystemObject& fsObj)
+std::wstring getDescrDiffMetaShortnameCase(const FileSystemObject& fsObj)
{
- return _("Items have different attributes") + L"\n" +
+ return _("Items differ in attributes only") + L"\n" +
arrowLeft + L" " + fmtFileName(fsObj.getShortName<LEFT_SIDE >()) + L"\n" +
arrowRight + L" " + fmtFileName(fsObj.getShortName<RIGHT_SIDE>());
}
@@ -389,7 +423,7 @@ std::wstring getDescrDiffMetaShortname(const FileSystemObject& fsObj)
template <class FileOrLinkMapping> inline
std::wstring getDescrDiffMetaDate(const FileOrLinkMapping& fileObj)
{
- return _("Items have different attributes") + L"\n" +
+ return _("Items differ in attributes only") + L"\n" +
arrowLeft + L" " + _("Date:") + L" " + utcToLocalTimeString(fileObj.template getLastWriteTime<LEFT_SIDE >()) + L"\n" +
arrowRight + L" " + _("Date:") + L" " + utcToLocalTimeString(fileObj.template getLastWriteTime<RIGHT_SIDE>());
}
@@ -397,7 +431,9 @@ std::wstring getDescrDiffMetaDate(const FileOrLinkMapping& fileObj)
//-----------------------------------------------------------------------------
-void CompareProcess::categorizeSymlinkByTime(SymLinkMapping& linkObj) const
+namespace
+{
+void categorizeSymlinkByTime(SymLinkMapping& linkObj, size_t fileTimeTolerance)
{
//categorize symlinks that exist on both sides
switch (CmpFileTime::getResult(linkObj.getLastWriteTime<LEFT_SIDE>(),
@@ -422,7 +458,7 @@ void CompareProcess::categorizeSymlinkByTime(SymLinkMapping& linkObj) const
if (linkObj.getShortName<LEFT_SIDE>() == linkObj.getShortName<RIGHT_SIDE>())
linkObj.setCategory<FILE_EQUAL>();
else
- linkObj.setCategoryDiffMetadata(getDescrDiffMetaShortname(linkObj));
+ linkObj.setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(linkObj));
}
else
linkObj.setCategoryConflict(_("Conflict detected:") + L"\n" +
@@ -446,9 +482,9 @@ void CompareProcess::categorizeSymlinkByTime(SymLinkMapping& linkObj) const
break;
}
}
+}
-
-void CompareProcess::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output)
+void ComparisonBuffer::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output)
{
//do basis scan and retrieve files existing on both sides as "compareCandidates"
std::vector<FileMapping*> uncategorizedFiles;
@@ -457,7 +493,7 @@ void CompareProcess::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMap
//finish symlink categorization
std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(),
- [&](SymLinkMapping* linkMap) { this->categorizeSymlinkByTime(*linkMap); });
+ [&](SymLinkMapping* linkMap) { categorizeSymlinkByTime(*linkMap, fileTimeTolerance); });
//categorize files that exist on both sides
std::for_each(uncategorizedFiles.begin(), uncategorizedFiles.end(),
@@ -476,7 +512,7 @@ void CompareProcess::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMap
if (fileObj->getShortName<LEFT_SIDE>() == fileObj->getShortName<RIGHT_SIDE>())
fileObj->setCategory<FILE_EQUAL>();
else
- fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortname(*fileObj));
+ fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(*fileObj));
}
else
fileObj->setCategoryConflict(getConflictSameDateDiffSize(*fileObj)); //same date, different filesize
@@ -501,8 +537,9 @@ void CompareProcess::compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMap
});
}
-
-void CompareProcess::categorizeSymlinkByContent(SymLinkMapping& linkObj) const
+namespace
+{
+void categorizeSymlinkByContent(SymLinkMapping& linkObj, size_t fileTimeTolerance)
{
//categorize symlinks that exist on both sides
if (linkObj.getTargetPath<LEFT_SIDE>().empty())
@@ -523,7 +560,7 @@ void CompareProcess::categorizeSymlinkByContent(SymLinkMapping& linkObj) const
//symlinks have same "content"
if (linkObj.getShortName<LEFT_SIDE>() != linkObj.getShortName<RIGHT_SIDE>())
- linkObj.setCategoryDiffMetadata(getDescrDiffMetaShortname(linkObj));
+ linkObj.setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(linkObj));
else if (CmpFileTime::getResult(linkObj.getLastWriteTime<LEFT_SIDE>(), linkObj.getLastWriteTime<RIGHT_SIDE>(), fileTimeTolerance) != CmpFileTime::TIME_EQUAL)
linkObj.setCategoryDiffMetadata(getDescrDiffMetaDate(linkObj));
else
@@ -532,9 +569,9 @@ void CompareProcess::categorizeSymlinkByContent(SymLinkMapping& linkObj) const
else
linkObj.setCategory<FILE_DIFFERENT>();
}
+}
-
-void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad)
+void ComparisonBuffer::compareByContent(std::vector<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad)
{
if (workLoad.empty()) return;
@@ -551,7 +588,7 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD
//finish symlink categorization
std::for_each(uncategorizedLinks.begin(), uncategorizedLinks.end(),
- [&](SymLinkMapping* linkMap) { this->categorizeSymlinkByContent(*linkMap); });
+ [&](SymLinkMapping* linkMap) { categorizeSymlinkByContent(*linkMap, fileTimeTolerance); });
}
//finish categorization...
@@ -575,9 +612,9 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD
std::accumulate(filesToCompareBytewise.begin(), filesToCompareBytewise.end(), static_cast<UInt64>(0),
[](UInt64 sum, FileMapping* fsObj) { return sum + fsObj->getFileSize<LEFT_SIDE>(); });
- procCallback.initNewPhase(static_cast<int>(objectsTotal),
- to<Int64>(bytesTotal),
- ProcessCallback::PHASE_COMPARING_CONTENT);
+ callback_.initNewPhase(static_cast<int>(objectsTotal),
+ to<Int64>(bytesTotal),
+ ProcessCallback::PHASE_COMPARING_CONTENT);
const std::wstring txtComparingContentOfFiles = replaceCpy(_("Comparing content of files %x"), L"%x", L"\n%x", false);
@@ -585,7 +622,7 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD
std::for_each(filesToCompareBytewise.begin(), filesToCompareBytewise.end(),
[&](FileMapping* fileObj)
{
- procCallback.reportStatus(replaceCpy(txtComparingContentOfFiles, L"%x", fmtFileName(fileObj->getObjRelativeName()), false));
+ callback_.reportStatus(replaceCpy(txtComparingContentOfFiles, L"%x", fmtFileName(fileObj->getObjRelativeName()), false));
//check files that exist in left and right model but have different content
@@ -594,13 +631,13 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD
if (filesHaveSameContentUpdating(fileObj->getFullName<LEFT_SIDE>(), //throw FileError
fileObj->getFullName<RIGHT_SIDE>(),
fileObj->getFileSize<LEFT_SIDE >(),
- procCallback))
+ callback_))
{
//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<LEFT_SIDE>() != fileObj->getShortName<RIGHT_SIDE>())
- fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortname(*fileObj));
+ fileObj->setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(*fileObj));
else if (CmpFileTime::getResult(fileObj->getLastWriteTime<LEFT_SIDE>(), fileObj->getLastWriteTime<RIGHT_SIDE>(), fileTimeTolerance) != CmpFileTime::TIME_EQUAL)
fileObj->setCategoryDiffMetadata(getDescrDiffMetaDate(*fileObj));
else
@@ -609,12 +646,12 @@ void CompareProcess::compareByContent(std::vector<std::pair<FolderPairCfg, BaseD
else
fileObj->setCategory<FILE_DIFFERENT>();
- procCallback.updateProcessedData(1, 0); //processed data is communicated in subfunctions!
+ callback_.updateProcessedData(1, 0); //processed data is communicated in subfunctions!
- }, procCallback))
+ }, callback_))
fileObj->setCategoryConflict(_("Conflict detected:") + L"\n" + _("Comparing files by content failed."));
- procCallback.requestUiRefresh(); //may throw
+ callback_.requestUiRefresh(); //may throw
});
}
@@ -752,7 +789,7 @@ void MergeSides::execute(const DirContainer& leftSide, const DirContainer& right
{
DirMapping& newDirMap = output.addSubDir(dirLeft.first, dirRight.first, DIR_EQUAL);
if (dirLeft.first != dirRight.first)
- newDirMap.setCategoryDiffMetadata(getDescrDiffMetaShortname(newDirMap));
+ newDirMap.setCategoryDiffMetadata(getDescrDiffMetaShortnameCase(newDirMap));
execute(dirLeft.second, dirRight.second, newDirMap); //recurse into subdirectories
});
@@ -786,10 +823,10 @@ 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 CompareProcess::performComparison(const FolderPairCfg& fpCfg,
- BaseDirMapping& output,
- std::vector<FileMapping*>& undefinedFiles,
- std::vector<SymLinkMapping*>& undefinedLinks)
+void ComparisonBuffer::performComparison(const FolderPairCfg& fpCfg,
+ BaseDirMapping& output,
+ std::vector<FileMapping*>& undefinedFiles,
+ std::vector<SymLinkMapping*>& undefinedLinks)
{
assert(output.refSubDirs(). empty());
assert(output.refSubLinks().empty());
@@ -807,8 +844,8 @@ void CompareProcess::performComparison(const FolderPairCfg& fpCfg,
const DirectoryValue& bufValueLeft = getDirValue(fpCfg.leftDirectoryFmt);
const DirectoryValue& bufValueRight = getDirValue(fpCfg.rightDirectoryFmt);
- procCallback.reportStatus(_("Generating file list..."));
- procCallback.forceUiRefresh();
+ callback_.reportStatus(_("Generating file list..."));
+ callback_.forceUiRefresh();
//PERF_START;
MergeSides(undefinedFiles, undefinedLinks).execute(bufValueLeft.dirCont, bufValueRight.dirCont, output);
diff --git a/comparison.h b/comparison.h
index 7dc18682..18408e95 100644
--- a/comparison.h
+++ b/comparison.h
@@ -1,20 +1,16 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef COMPARISON_H_INCLUDED
#define COMPARISON_H_INCLUDED
-#include <zen/process_priority.h>
#include "file_hierarchy.h"
#include "lib/process_xml.h"
#include "process_callback.h"
-#include "structures.h"
#include "lib/norm_filter.h"
-#include "lib/parallel_scan.h"
-
namespace zen
{
@@ -46,47 +42,15 @@ struct FolderPairCfg
std::vector<FolderPairCfg> extractCompareCfg(const MainConfiguration& mainCfg); //fill FolderPairCfg and resolve folder pairs
+//FFS core routine:
+void compare(size_t fileTimeTolerance, //max allowed file time deviation
+ xmlAccess::OptionalDialogs& warnings,
+ bool allowUserInteraction,
+ bool runWithBackgroundPriority,
-//runComparison
-
-//class handling comparison process
-class CompareProcess
-{
-public:
- CompareProcess(size_t fileTimeTol,
- xmlAccess::OptionalDialogs& warnings,
- bool allowUserInteraction,
- bool runWithBackgroundPriority,
- ProcessCallback& handler);
-
- void startCompareProcess(const std::vector<FolderPairCfg>& cfgList, FolderComparison& output);
-
-private:
- CompareProcess(const CompareProcess&);
- CompareProcess& operator=(const CompareProcess&);
-
- //create comparison result table and fill category except for files existing on both sides: undefinedFiles and undefinedLinks are appended!
- void categorizeSymlinkByTime(SymLinkMapping& linkObj) const;
- void categorizeSymlinkByContent(SymLinkMapping& linkObj) const;
-
- void compareByTimeSize(const FolderPairCfg& fpConfig, BaseDirMapping& output);
- void compareByContent(std::vector<std::pair<FolderPairCfg, BaseDirMapping*>>& workLoad);
-
- void performComparison(const FolderPairCfg& fpCfg,
- BaseDirMapping& output,
- std::vector<FileMapping*>& undefinedFiles,
- std::vector<SymLinkMapping*>& undefinedLinks);
-
- std::map<DirectoryKey, DirectoryValue> directoryBuffer; //contains only *existing* directories
-
- const size_t fileTimeTolerance; //max allowed file time deviation
-
- xmlAccess::OptionalDialogs& m_warnings;
-
- const bool allowUserInteraction_;
- ProcessCallback& procCallback;
- std::unique_ptr<ScheduleForBackgroundProcessing> procBackground;
-};
+ const std::vector<FolderPairCfg>& cfgList,
+ FolderComparison& output,
+ ProcessCallback& callback);
}
#endif // COMPARISON_H_INCLUDED
diff --git a/file_hierarchy.cpp b/file_hierarchy.cpp
index 37fd9b18..491f9c2e 100644
--- a/file_hierarchy.cpp
+++ b/file_hierarchy.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "file_hierarchy.h"
@@ -279,7 +279,7 @@ std::wstring zen::getCategoryDescription(CompareFilesResult cmpRes)
case FILE_EQUAL:
return _("Both sides are equal");
case FILE_DIFFERENT_METADATA:
- return _("Items have different attributes");
+ return _("Items differ in attributes only");
case FILE_CONFLICT:
return _("Conflict/item cannot be categorized");
}
diff --git a/file_hierarchy.h b/file_hierarchy.h
index 3853bf59..12888727 100644
--- a/file_hierarchy.h
+++ b/file_hierarchy.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FILEHIERARCHY_H_INCLUDED
@@ -24,19 +24,23 @@ namespace zen
{
struct FileDescriptor
{
- FileDescriptor() {}
+ FileDescriptor() : fileIdx(), devId() {}
FileDescriptor(Int64 lastWriteTimeRawIn,
UInt64 fileSizeIn,
const FileId& idIn) :
lastWriteTimeRaw(lastWriteTimeRawIn),
fileSize(fileSizeIn),
- id(idIn) {}
+ fileIdx(idIn.second),
+ devId(idIn.first) {}
Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC, same semantics like time_t (== signed long)
UInt64 fileSize;
- FileId id; //optional! (however, always set on Linux, and *generally* available on Windows)
+ 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!
};
+inline
+FileId getFileId(const FileDescriptor& fd) { return FileId(fd.devId, fd.fileIdx); }
struct LinkDescriptor
{
@@ -238,7 +242,7 @@ public:
dirExistsLeft_ (dirExistsLeft ),
dirExistsRight_(dirExistsRight) {}
- template <SelectedSide side> const Zstring& getBaseDirPf() const; //base sync directory postfixed with FILE_NAME_SEPARATOR
+ template <SelectedSide side> 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
template <SelectedSide side> bool wasExisting() const; //status of directory existence at the time of comparison!
@@ -1048,14 +1052,14 @@ zen::UInt64 FileMapping::getFileSize<RIGHT_SIDE>() const
template <> inline
FileId FileMapping::getFileId<LEFT_SIDE>() const
{
- return dataLeft.id;
+ return FileId(dataLeft.devId, dataLeft.fileIdx);
}
template <> inline
FileId FileMapping::getFileId<RIGHT_SIDE>() const
{
- return dataRight.id;
+ return FileId(dataRight.devId, dataRight.fileIdx);
}
diff --git a/lib/ShadowCopy/LockFile.cpp b/lib/ShadowCopy/LockFile.cpp
index aac4c170..701b84ec 100644
--- a/lib/ShadowCopy/LockFile.cpp
+++ b/lib/ShadowCopy/LockFile.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
diff --git a/lib/ShadowCopy/Shadow_Server2003.vcxproj b/lib/ShadowCopy/Shadow_Server2003.vcxproj
index ad24d4c1..3e70cd7a 100644
--- a/lib/ShadowCopy/Shadow_Server2003.vcxproj
+++ b/lib/ShadowCopy/Shadow_Server2003.vcxproj
@@ -145,7 +145,7 @@
</ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -216,7 +216,7 @@
</ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/lib/ShadowCopy/Shadow_Windows7.vcxproj b/lib/ShadowCopy/Shadow_Windows7.vcxproj
index 5381372b..985936b4 100644
--- a/lib/ShadowCopy/Shadow_Windows7.vcxproj
+++ b/lib/ShadowCopy/Shadow_Windows7.vcxproj
@@ -145,7 +145,7 @@
</ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -216,7 +216,7 @@
</ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/lib/ShadowCopy/Shadow_XP.vcxproj b/lib/ShadowCopy/Shadow_XP.vcxproj
index fce942d5..b49bff4c 100644
--- a/lib/ShadowCopy/Shadow_XP.vcxproj
+++ b/lib/ShadowCopy/Shadow_XP.vcxproj
@@ -146,7 +146,7 @@
</ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -217,7 +217,7 @@
</ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/lib/ShadowCopy/dll_main.cpp b/lib/ShadowCopy/dll_main.cpp
index 46c65311..95d14910 100644
--- a/lib/ShadowCopy/dll_main.cpp
+++ b/lib/ShadowCopy/dll_main.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
diff --git a/lib/ShadowCopy/shadow.cpp b/lib/ShadowCopy/shadow.cpp
index c47ce983..3bc2df87 100644
--- a/lib/ShadowCopy/shadow.cpp
+++ b/lib/ShadowCopy/shadow.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "shadow.h"
diff --git a/lib/ShadowCopy/shadow.h b/lib/ShadowCopy/shadow.h
index 66d29300..8f35c728 100644
--- a/lib/ShadowCopy/shadow.h
+++ b/lib/ShadowCopy/shadow.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SHADOWCOPY_H
diff --git a/lib/Thumbnail/dll_main.cpp b/lib/Thumbnail/dll_main.cpp
index 46c65311..95d14910 100644
--- a/lib/Thumbnail/dll_main.cpp
+++ b/lib/Thumbnail/dll_main.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
diff --git a/lib/Thumbnail/thumbnail.cpp b/lib/Thumbnail/thumbnail.cpp
index d35f15c3..50c4f2a8 100644
--- a/lib/Thumbnail/thumbnail.cpp
+++ b/lib/Thumbnail/thumbnail.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "thumbnail.h"
diff --git a/lib/Thumbnail/thumbnail.h b/lib/Thumbnail/thumbnail.h
index 6c3575b5..9328b4f0 100644
--- a/lib/Thumbnail/thumbnail.h
+++ b/lib/Thumbnail/thumbnail.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TASKBAR_SEVEN_DLL_H
diff --git a/lib/binary.cpp b/lib/binary.cpp
index 2065e13e..ec22c60f 100644
--- a/lib/binary.cpp
+++ b/lib/binary.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "binary.h"
diff --git a/lib/binary.h b/lib/binary.h
index b419e9e2..2c985de5 100644
--- a/lib/binary.h
+++ b/lib/binary.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef BINARY_H_INCLUDED
@@ -13,13 +13,10 @@
namespace zen
{
-
-//callback functionality for status updates while comparing
-class CompareCallback
+struct CompareCallback
{
-public:
virtual ~CompareCallback() {}
- virtual void updateCompareStatus(zen::UInt64 totalBytes) = 0;
+ virtual void updateCompareStatus(UInt64 totalBytes) = 0;
};
bool filesHaveSameContent(const Zstring& filename1, const Zstring& filename2, CompareCallback& callback); //throw FileError
diff --git a/lib/db_file.cpp b/lib/db_file.cpp
index 2c299236..3c61137b 100644
--- a/lib/db_file.cpp
+++ b/lib/db_file.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "db_file.h"
@@ -218,10 +218,10 @@ private:
{
writeNumber<std:: int64_t>(output, to<std:: int64_t>(descr.lastWriteTimeRaw));
writeNumber<std::uint64_t>(output, to<std::uint64_t>(descr.fileSize));
- writeNumber<std::uint64_t>(output, descr.id.first ); //device id
- writeNumber<std::uint64_t>(output, descr.id.second); //file id
- assert_static(sizeof(descr.id.first ) <= sizeof(std::uint64_t));
- assert_static(sizeof(descr.id.second) <= sizeof(std::uint64_t));
+ writeNumber<std::uint64_t>(output, descr.devId);
+ writeNumber<std::uint64_t>(output, descr.fileIdx);
+ assert_static(sizeof(descr.devId ) <= sizeof(std::uint64_t));
+ assert_static(sizeof(descr.fileIdx) <= sizeof(std::uint64_t));
}
static void write(BinStreamOut& output, const LinkDescriptor& descr)
@@ -344,8 +344,8 @@ private:
//attention: order of function argument evaluation is undefined! So do it one after the other...
descr.lastWriteTimeRaw = readNumber<std::int64_t>(input); //throw UnexpectedEndOfStreamError
descr.fileSize = readNumber<std::uint64_t>(input);
- descr.id.first = static_cast<decltype(descr.id.first )>(readNumber<std::uint64_t>(input)); //
- descr.id.second = static_cast<decltype(descr.id.second)>(readNumber<std::uint64_t>(input)); //silence "loss of precision" compiler warnings
+ descr.devId = static_cast<DeviceId >(readNumber<std::uint64_t>(input)); //
+ descr.fileIdx = static_cast<FileIndex>(readNumber<std::uint64_t>(input)); //silence "loss of precision" compiler warnings
}
static void read(BinStreamIn& input, LinkDescriptor& descr)
diff --git a/lib/db_file.h b/lib/db_file.h
index 4425f52c..469cd3fa 100644
--- a/lib/db_file.h
+++ b/lib/db_file.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DBFILE_H_INCLUDED
diff --git a/lib/dir_exist_async.h b/lib/dir_exist_async.h
index 2ab98e94..7e18d210 100644
--- a/lib/dir_exist_async.h
+++ b/lib/dir_exist_async.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DIR_EXIST_HEADER_08173281673432158067342132467183267
diff --git a/lib/dir_lock.cpp b/lib/dir_lock.cpp
index e385c9a8..469af262 100644
--- a/lib/dir_lock.cpp
+++ b/lib/dir_lock.cpp
@@ -1,13 +1,11 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "dir_lock.h"
#include <utility>
-//#include <wx/utils.h>
#include <wx/log.h>
-//#include <wx/msgdlg.h>
#include <memory>
#include <zen/last_error.h>
#include <zen/thread.h> //includes <boost/thread.hpp>
diff --git a/lib/dir_lock.h b/lib/dir_lock.h
index 925d99d6..b1fc1a06 100644
--- a/lib/dir_lock.h
+++ b/lib/dir_lock.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DIR_LOCK_H_INCLUDED
#define DIR_LOCK_H_INCLUDED
diff --git a/lib/error_log.h b/lib/error_log.h
index 07a8b383..2ccb4d84 100644
--- a/lib/error_log.h
+++ b/lib/error_log.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef ERROR_LOG_89734181783491324134
@@ -34,7 +34,7 @@ void logError(const std::string& msg) //throw()
const std::string logEntry = "[" + formatTime<std::string>(FORMAT_DATE) + " "+ formatTime<std::string>(FORMAT_TIME) + "] " + msg;
try
{
- saveBinStream(getConfigDir() + Zstr("LastError.txt"), logEntry); //throw FileError
+ saveBinStream(getConfigDir() + Zstr("LastError.log"), logEntry); //throw FileError
}
catch (const FileError&) {}
}
diff --git a/lib/ffs_paths.h b/lib/ffs_paths.h
index d7987195..1a67af5c 100644
--- a/lib/ffs_paths.h
+++ b/lib/ffs_paths.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef STANDARDPATHS_H_INCLUDED
diff --git a/lib/generate_logfile.h b/lib/generate_logfile.h
index b54b4893..d1537311 100644
--- a/lib/generate_logfile.h
+++ b/lib/generate_logfile.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef GEN_LOGFILE_H_93172643216748973216458732165415
@@ -41,41 +41,41 @@ Utf8String generateLogStream_impl(const ErrorLog& log,
int itemsTotal, Int64 dataTotal,
long totalTime) //unit: [sec]
{
+ assert(itemsSynced <= itemsTotal);
+ assert(dataSynced <= dataTotal);
+
Utf8String output;
//write header
- std::wstring headerLine = _("Batch execution") + L" - " + formatTime<std::wstring>(FORMAT_DATE);
+ std::wstring headerLine = formatTime<std::wstring>(FORMAT_DATE);
if (!jobName.empty())
headerLine += L" - " + jobName;
-
- //output += utfCvrtTo<MemoryStream>(headerLine);
- //output += '\n';
-
- //for (size_t i = 0; i < headerLine.size(); ++i) //well, this considers UTF-16 only, not true Unicode...
- // output += '=';
- //output += '\n';
+ headerLine += L": " + finalStatus;
//assemble results box
std::vector<std::wstring> results;
results.push_back(headerLine);
results.push_back(L"");
- results.push_back(finalStatus);
- results.push_back(L"");
+
+ std::wstring itemsProc = L" " + _("Items processed:") + L" " + toGuiString(itemsSynced); //show always, even if 0!
+ if (itemsSynced != 0 || dataSynced != 0) //[!] don't show 0 bytes processed if 0 items were processed
+ itemsProc += + L" (" + filesizeToShortString(dataSynced) + L")";
+ results.push_back(itemsProc);
+
if (itemsTotal != 0 || dataTotal != 0) //=: sync phase was reached and there were actual items to sync
{
- results.push_back(L" " + _("Items processed:") + L" " + toGuiString(itemsSynced) + L" (" + filesizeToShortString(dataSynced) + L")");
-
if (itemsSynced != itemsTotal ||
dataSynced != dataTotal)
results.push_back(L" " + _("Items remaining:") + L" " + toGuiString(itemsTotal - itemsSynced) + L" (" + filesizeToShortString(dataTotal - dataSynced) + L")");
}
+
results.push_back(L" " + _("Total time:") + L" " + copyStringTo<std::wstring>(wxTimeSpan::Seconds(totalTime).Format()));
//calculate max width, this considers UTF-16 only, not true Unicode...
size_t sepLineLen = 0;
std::for_each(results.begin(), results.end(), [&](const std::wstring& str) { sepLineLen = std::max(sepLineLen, str.size()); });
- for (size_t i = 0; i < sepLineLen; ++i) output += '_';
+ for (size_t i = 0; i < sepLineLen; ++i) output += '_'; //this considers UTF-16 only, not true Unicode!!!
output += "\n";
std::for_each(results.begin(), results.end(), [&](const std::wstring& str) { output += utfCvrtTo<Utf8String>(str); output += '\n'; });
diff --git a/lib/hard_filter.cpp b/lib/hard_filter.cpp
index d66fc665..8fe0f7f4 100644
--- a/lib/hard_filter.cpp
+++ b/lib/hard_filter.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "hard_filter.h"
@@ -79,7 +79,7 @@ void addFilterEntry(const Zstring& filtername, std::vector<Zstring>& fileFilter,
filterFormatted = afterFirst(filterFormatted, FILE_NAME_SEPARATOR); //leading separator is optional!
//some syntactic sugar:
- if (filterFormatted == asteriskSepAsterisk) // *\* := match everything except files directly in base directory
+ if (filterFormatted == asteriskSepAsterisk) // *\* := match everything except files directly in base directory
{
fileFilter. push_back(filterFormatted);
directoryFilter.push_back(asterisk);
diff --git a/lib/hard_filter.h b/lib/hard_filter.h
index 723c7bdf..57132e7f 100644
--- a/lib/hard_filter.h
+++ b/lib/hard_filter.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FFS_FILTER_H_INCLUDED
diff --git a/lib/help_provider.h b/lib/help_provider.h
index 3b7443cb..d35e04c2 100644
--- a/lib/help_provider.h
+++ b/lib/help_provider.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef HELPPROVIDER_H_INCLUDED
diff --git a/lib/icon_buffer.cpp b/lib/icon_buffer.cpp
index 2dc6f389..dd449229 100644
--- a/lib/icon_buffer.cpp
+++ b/lib/icon_buffer.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "icon_buffer.h"
diff --git a/lib/icon_buffer.h b/lib/icon_buffer.h
index f3a358ef..7bbf3432 100644
--- a/lib/icon_buffer.h
+++ b/lib/icon_buffer.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef ICONBUFFER_H_INCLUDED
diff --git a/lib/localization.cpp b/lib/localization.cpp
index 16dcac9a..83bc60d2 100644
--- a/lib/localization.cpp
+++ b/lib/localization.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "localization.h"
@@ -127,7 +127,7 @@ public:
virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) { return LINK_SKIP; }
virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName) { return nullptr; }
- virtual HandleError onError(const std::wstring& errorText) { return ON_ERROR_IGNORE; } //errors are not really critical in this context
+ virtual HandleError onError(const std::wstring& msg) { return ON_ERROR_IGNORE; } //errors are not really critical in this context
private:
std::vector<Zstring>& lngFiles_;
diff --git a/lib/localization.h b/lib/localization.h
index 7c30ab74..a4430467 100644
--- a/lib/localization.h
+++ b/lib/localization.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef MISC_H_INCLUDED
diff --git a/lib/norm_filter.h b/lib/norm_filter.h
index dc73bc6b..aeefa8a1 100644
--- a/lib/norm_filter.h
+++ b/lib/norm_filter.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef NORM_FILTER_H_INCLUDED
diff --git a/lib/parallel_scan.cpp b/lib/parallel_scan.cpp
index f49fdc3e..6e7a6368 100644
--- a/lib/parallel_scan.cpp
+++ b/lib/parallel_scan.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "parallel_scan.h"
@@ -330,7 +330,7 @@ public:
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 HandleError onError (const std::wstring& errorText);
+ virtual HandleError onError (const std::wstring& msg);
private:
TraverserShared& cfg;
@@ -437,9 +437,9 @@ std::shared_ptr<TraverseCallback> DirCallback::onDir(const Zchar* shortName, con
}
-DirCallback::HandleError DirCallback::onError(const std::wstring& errorText)
+DirCallback::HandleError DirCallback::onError(const std::wstring& msg)
{
- switch (cfg.acb_.reportError(errorText))
+ switch (cfg.acb_.reportError(msg))
{
case FillBufferCallback::ON_ERROR_IGNORE:
cfg.failedReads_.insert(relNameParentPf_);
diff --git a/lib/parallel_scan.h b/lib/parallel_scan.h
index 0ce0114d..41712a55 100644
--- a/lib/parallel_scan.h
+++ b/lib/parallel_scan.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef PARALLEL_SCAN_H_INCLUDED
@@ -45,7 +45,7 @@ bool operator<(const DirectoryKey& lhs, const DirectoryKey& rhs)
struct DirectoryValue
{
DirContainer dirCont;
- std::set<Zstring> failedReads; //relative postfixed names of directories that could not be read (empty string for root), e.g. access denied, or temporal network drop
+ std::set<Zstring> failedReads; //relative postfixed names of directories that could not be read completely (empty string for root), e.g. access denied, or temporal network drop
};
@@ -59,8 +59,8 @@ public:
ON_ERROR_RETRY,
ON_ERROR_IGNORE
};
- virtual HandleError reportError (const std::wstring& errorText) = 0; //may throw!
- virtual void reportStatus(const std::wstring& statusMsg, int itemsTotal) = 0; //
+ virtual HandleError reportError (const std::wstring& msg) = 0; //may throw!
+ virtual void reportStatus(const std::wstring& msg, int itemsTotal) = 0; //
};
//attention: ensure directory filtering is applied later to exclude filtered directories which have been kept as parent folders
diff --git a/lib/parse_lng.h b/lib/parse_lng.h
index 6a0b9dc5..3cbadf65 100644
--- a/lib/parse_lng.h
+++ b/lib/parse_lng.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef PARSE_LNG_HEADER_INCLUDED
diff --git a/lib/parse_plural.h b/lib/parse_plural.h
index 141266b6..d3473821 100644
--- a/lib/parse_plural.h
+++ b/lib/parse_plural.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef PARSE_PLURAL_H_INCLUDED
diff --git a/lib/perf_check.cpp b/lib/perf_check.cpp
index f01af061..f8d80191 100644
--- a/lib/perf_check.cpp
+++ b/lib/perf_check.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "perf_check.h"
@@ -75,8 +75,8 @@ wxString PerfCheck::getRemainingTime(double dataRemaining) const
if (!numeric::isNull(dataDelta)) //sign(dataRemaining) != sign(dataDelta) usually an error, so show it!
{
- int remTimeSec = dataRemaining * timeDelta / (1000.0 * dataDelta);
- return zen::remainingTimeToShortString(remTimeSec);
+ const double remTimeSec = dataRemaining * timeDelta / (1000.0 * dataDelta);
+ return remainingTimeToShortString(remTimeSec);
}
}
return L"-"; //fallback
@@ -100,7 +100,7 @@ wxString PerfCheck::getBytesPerSecond() const
if (!numeric::isNull(timeDelta))
if (dataDelta > 0) //may be negative if user cancels copying
- return zen::filesizeToShortString(zen::Int64(dataDelta * 1000 / timeDelta)) + _("/sec");
+ return filesizeToShortString(zen::Int64(dataDelta * 1000 / timeDelta)) + _("/sec");
}
return L"-"; //fallback
}
diff --git a/lib/perf_check.h b/lib/perf_check.h
index b0d4db89..d16c35f9 100644
--- a/lib/perf_check.h
+++ b/lib/perf_check.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef STATISTICS_H_INCLUDED
@@ -34,7 +34,7 @@ private:
int objCount_;
double data_; //unit: [bytes]
};
- std::multimap<long, Record> samples; ////time, unit: [ms]
+ std::multimap<long, Record> samples; //time, unit: [ms]
};
#endif // STATISTICS_H_INCLUDED
diff --git a/lib/process_xml.cpp b/lib/process_xml.cpp
index f5a6a4d1..0b53a0f5 100644
--- a/lib/process_xml.cpp
+++ b/lib/process_xml.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "process_xml.h"
@@ -114,23 +114,7 @@ xmlAccess::XmlGuiConfig xmlAccess::convertBatchToGui(const xmlAccess::XmlBatchCo
xmlAccess::XmlBatchConfig xmlAccess::convertGuiToBatch(const xmlAccess::XmlGuiConfig& guiCfg, const Zstring& referenceFile)
{
- //try to take over batch-specific settings from reference
- if (!referenceFile.empty() && getXmlType(referenceFile) == XML_TYPE_BATCH)
- try
- {
- XmlBatchConfig output;
-
- std::vector<Zstring> filenames;
- filenames.push_back(referenceFile);
- convertConfig(filenames, output); //throw xmlAccess::FfsXmlError
-
- output.mainCfg = guiCfg.mainCfg;
- return output;
- }
- catch (xmlAccess::FfsXmlError&) {}
-
XmlBatchConfig output; //use default batch-settings
- output.mainCfg = guiCfg.mainCfg;
switch (guiCfg.handleError)
{
@@ -142,6 +126,17 @@ xmlAccess::XmlBatchConfig xmlAccess::convertGuiToBatch(const xmlAccess::XmlGuiCo
break;
}
+ //try to take over batch-specific settings from reference
+ if (!referenceFile.empty() && getXmlType(referenceFile) == XML_TYPE_BATCH)
+ try
+ {
+ std::vector<Zstring> filenames;
+ filenames.push_back(referenceFile);
+ convertConfig(filenames, output); //throw xmlAccess::FfsXmlError
+ }
+ catch (xmlAccess::FfsXmlError&) {}
+
+ output.mainCfg = guiCfg.mainCfg;
return output;
}
@@ -428,13 +423,13 @@ void writeText(const DeletionPolicy& value, std::string& output)
switch (value)
{
case DELETE_PERMANENTLY:
- output = "DeletePermanently";
+ output = "Permanent";
break;
- case MOVE_TO_RECYCLE_BIN:
- output = "MoveToRecycleBin";
+ case DELETE_TO_RECYCLER:
+ output = "RecycleBin";
break;
- case MOVE_TO_CUSTOM_DIRECTORY:
- output = "MoveToCustomDirectory";
+ case DELETE_TO_VERSIONING:
+ output = "Versioning";
break;
}
}
@@ -444,14 +439,24 @@ bool readText(const std::string& input, DeletionPolicy& value)
{
std::string tmp = input;
zen::trim(tmp);
- if (tmp == "DeletePermanently")
+ //------------------
+ warn_static("remove after migration?")
+ if (tmp == "DeletePermanently")//obsolete name
value = DELETE_PERMANENTLY;
- else if (tmp == "MoveToRecycleBin")
- value = MOVE_TO_RECYCLE_BIN;
- else if (tmp == "MoveToCustomDirectory")
- value = MOVE_TO_CUSTOM_DIRECTORY;
+ else if (tmp == "MoveToRecycleBin")//obsolete name
+ value = DELETE_TO_RECYCLER;
+ else if (tmp == "MoveToCustomDirectory")//obsolete name
+ value = DELETE_TO_VERSIONING;
else
- return false;
+ //------------------
+ if (tmp == "Permanent")
+ value = DELETE_PERMANENTLY;
+ else if (tmp == "RecycleBin")
+ value = DELETE_TO_RECYCLER;
+ else if (tmp == "Versioning")
+ value = DELETE_TO_VERSIONING;
+ else
+ return false;
return true;
}
@@ -501,9 +506,6 @@ void writeText(const UnitTime& value, std::string& output)
case UTIME_TODAY:
output = "Today";
break;
- //case UTIME_THIS_WEEK:
- // output = "Week";
- // break;
case UTIME_THIS_MONTH:
output = "Month";
break;
@@ -525,8 +527,6 @@ bool readText(const std::string& input, UnitTime& value)
value = UTIME_NONE;
else if (tmp == "Today")
value = UTIME_TODAY;
- //else if (tmp == "Week")
- // value = UTIME_THIS_WEEK;
else if (tmp == "Month")
value = UTIME_THIS_MONTH;
else if (tmp == "Year")
@@ -772,8 +772,19 @@ void readConfig(const XmlIn& in, SyncConfig& syncCfg)
{
readConfig(in, syncCfg.directionCfg);
- in["DeletionPolicy" ](syncCfg.handleDeletion);
- in["CustomDeletionFolder"](syncCfg.customDeletionDirectory);
+ in["DeletionPolicy"](syncCfg.handleDeletion);
+
+ warn_static("remove after migration?")
+ if (in["CustomDeletionFolder"])
+ {
+ in["CustomDeletionFolder"](syncCfg.versioningDirectory);//obsolete name
+ syncCfg.versionCountLimit = 0; //new parameter
+ }
+ else
+ {
+ in["VersioningFolder"](syncCfg.versioningDirectory);
+ in["VersioningFolder"].attribute("Limit", syncCfg.versionCountLimit);
+ }
}
@@ -782,14 +793,21 @@ void readConfig(const XmlIn& in, FilterConfig& filter)
in["Include"](filter.includeFilter);
in["Exclude"](filter.excludeFilter);
- in["TimeSpan" ](filter.timeSpan);
- in["UnitTimeSpan"](filter.unitTimeSpan);
+ in["TimeSpan"](filter.timeSpan);
+ warn_static("remove after migration?")
+ if (in["UnitTimeSpan"]) in["UnitTimeSpan"](filter.unitTimeSpan);//obsolete name
+ else
+ in["TimeSpan"].attribute("Type", filter.unitTimeSpan);
- in["SizeMin" ](filter.sizeMin);
- in["UnitSizeMin"](filter.unitSizeMin);
+ in["SizeMin"](filter.sizeMin);
+ if (in["UnitSizeMin"]) in["UnitSizeMin"](filter.unitSizeMin);//obsolete name
+ else
+ in["SizeMin"].attribute("Unit", filter.unitSizeMin);
- in["SizeMax" ](filter.sizeMax);
- in["UnitSizeMax"](filter.unitSizeMax);
+ in["SizeMax"](filter.sizeMax);
+ if (in["UnitSizeMax"]) in["UnitSizeMax"](filter.unitSizeMax);//obsolete name
+ else
+ in["SizeMax"].attribute("Unit", filter.unitSizeMax);
}
@@ -859,7 +877,10 @@ void readConfig(const XmlIn& in, MainConfiguration& mainCfg)
mainCfg.additionalPairs.push_back(newPair); //set additional folder pairs
}
- inMain["ExecuteWhenFinished"](mainCfg.onCompletion);
+ warn_static("remove after migration?")
+ if (inMain["ExecuteWhenFinished"]) inMain["ExecuteWhenFinished"](mainCfg.onCompletion); //obsolete name
+ else
+ inMain["OnCompletion"](mainCfg.onCompletion);
}
@@ -870,7 +891,15 @@ void readConfig(const XmlIn& in, xmlAccess::XmlGuiConfig& config)
//read GUI specific config data
XmlIn inGuiCfg = in["GuiConfig"];
- inGuiCfg["HideFiltered" ](config.hideFilteredElements);
+ warn_static("remove after migration?")
+ if (inGuiCfg["HideFiltered" ]) //obsolete name
+ {
+ inGuiCfg["HideFiltered" ](config.showFilteredElements);
+ config.showFilteredElements = !config.showFilteredElements;
+ }
+ else
+ inGuiCfg["ShowFiltered"](config.showFilteredElements);
+
inGuiCfg["HandleError" ](config.handleError);
inGuiCfg["SyncPreviewActive"](config.showSyncAction);
}
@@ -883,10 +912,17 @@ void readConfig(const XmlIn& in, xmlAccess::XmlBatchConfig& config)
//read GUI specific config data
XmlIn inBatchCfg = in["BatchConfig"];
- inBatchCfg["ShowProgress" ](config.showProgress);
- inBatchCfg["LogfileDirectory"](config.logFileDirectory);
- inBatchCfg["LogfileCountMax" ](config.logFileCountMax);
inBatchCfg["HandleError" ](config.handleError);
+ inBatchCfg["ShowProgress" ](config.showProgress);
+
+ warn_static("remove after migration?")
+ if (inBatchCfg["LogfileDirectory"]) inBatchCfg["LogfileDirectory"](config.logFileDirectory); //obsolete name
+ else
+ inBatchCfg["LogfileFolder"](config.logFileDirectory);
+
+ if (inBatchCfg["LogfileCountMax" ]) inBatchCfg["LogfileCountMax"](config.logfilesCountLimit); //obsolete name
+ else
+ inBatchCfg["LogfileFolder"].attribute("Limit", config.logfilesCountLimit);
}
@@ -960,6 +996,15 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& config)
inWnd["Layout"](config.gui.guiPerspectiveLast);
+ //load config file history
+ warn_static("remove after migration?")
+ if (inGui["LastConfigActive"]) inGui["LastConfigActive"](config.gui.lastUsedConfigFiles);//obsolete name
+ else
+ inGui["LastUsedConfig"](config.gui.lastUsedConfigFiles);
+
+ inGui["ConfigHistory"](config.gui.cfgFileHistory);
+ inGui["ConfigHistory"].attribute("MaxSize", config.gui.cfgFileHistMax);
+
inGui["FolderHistoryLeft" ](config.gui.folderHistoryLeft);
inGui["FolderHistoryRight"](config.gui.folderHistoryRight);
inGui["FolderHistoryLeft"].attribute("MaxSize", config.gui.folderHistMax);
@@ -970,9 +1015,17 @@ void readConfig(const XmlIn& in, XmlGlobalSettings& config)
//external applications
inGui["ExternalApplications"](config.gui.externelApplications);
- //load config file history
- inGui["LastConfigActive"](config.gui.lastUsedConfigFiles);
- inGui["ConfigHistory"](config.gui.cfgFileHistory);
+
+ warn_static("remove after migration?")
+ //convert new internal macro naming convention: %name -> %item_path%; %dir -> %item_folder%
+ for (auto iter = config.gui.externelApplications.begin(); iter != config.gui.externelApplications.end(); ++iter)
+ {
+ replace(iter->second, L"%nameCo", L"%item2_path%"); //unambiguous "Co" names first
+ replace(iter->second, L"%dirCo" , L"%item2_folder%");
+ replace(iter->second, L"%name" , L"%item_path%");
+ replace(iter->second, L"%dir" , L"%item_folder%");
+ }
+
//last update check
inGui["LastUpdateCheck"](config.gui.lastUpdateCheck);
@@ -1047,8 +1100,9 @@ void writeConfig(const SyncConfig& syncCfg, XmlOut& out)
{
writeConfig(syncCfg.directionCfg, out);
- out["DeletionPolicy" ](syncCfg.handleDeletion);
- out["CustomDeletionFolder"](syncCfg.customDeletionDirectory);
+ out["DeletionPolicy" ](syncCfg.handleDeletion);
+ out["VersioningFolder"](syncCfg.versioningDirectory);
+ out["VersioningFolder"].attribute("Limit", syncCfg.versionCountLimit);
}
@@ -1057,14 +1111,14 @@ void writeConfig(const FilterConfig& filter, XmlOut& out)
out["Include"](filter.includeFilter);
out["Exclude"](filter.excludeFilter);
- out["TimeSpan" ](filter.timeSpan);
- out["UnitTimeSpan"](filter.unitTimeSpan);
+ out["TimeSpan"](filter.timeSpan);
+ out["TimeSpan"].attribute("Type", filter.unitTimeSpan);
- out["SizeMin" ](filter.sizeMin);
- out["UnitSizeMin"](filter.unitSizeMin);
+ out["SizeMin"](filter.sizeMin);
+ out["SizeMin"].attribute("Unit", filter.unitSizeMin);
- out["SizeMax" ](filter.sizeMax);
- out["UnitSizeMax"](filter.unitSizeMax);
+ out["SizeMax"](filter.sizeMax);
+ out["SizeMax"].attribute("Unit", filter.unitSizeMax);
}
@@ -1131,7 +1185,7 @@ void writeConfig(const MainConfiguration& mainCfg, XmlOut& out)
std::for_each(mainCfg.additionalPairs.begin(), mainCfg.additionalPairs.end(),
[&](const FolderPairEnh& fp) { writeConfigFolderPair(fp, outFp); });
- outMain["ExecuteWhenFinished"](mainCfg.onCompletion);
+ outMain["OnCompletion"](mainCfg.onCompletion);
}
@@ -1142,7 +1196,7 @@ void writeConfig(const XmlGuiConfig& config, XmlOut& out)
//write GUI specific config data
XmlOut outGuiCfg = out["GuiConfig"];
- outGuiCfg["HideFiltered" ](config.hideFilteredElements);
+ outGuiCfg["ShowFiltered" ](config.showFilteredElements);
outGuiCfg["HandleError" ](config.handleError);
outGuiCfg["SyncPreviewActive"](config.showSyncAction);
}
@@ -1155,10 +1209,10 @@ void writeConfig(const XmlBatchConfig& config, XmlOut& out)
//write GUI specific config data
XmlOut outBatchCfg = out["BatchConfig"];
- outBatchCfg["ShowProgress" ](config.showProgress);
- outBatchCfg["LogfileDirectory"](config.logFileDirectory);
- outBatchCfg["LogfileCountMax" ](config.logFileCountMax);
- outBatchCfg["HandleError" ](config.handleError);
+ outBatchCfg["HandleError" ](config.handleError);
+ outBatchCfg["ShowProgress" ](config.showProgress);
+ outBatchCfg["LogfileFolder" ](config.logFileDirectory);
+ outBatchCfg["LogfileFolder"].attribute("Limit", config.logfilesCountLimit);
}
@@ -1231,6 +1285,11 @@ void writeConfig(const XmlGlobalSettings& config, XmlOut& out)
outWnd["Layout"](config.gui.guiPerspectiveLast);
+ //load config file history
+ outGui["LastUsedConfig"](config.gui.lastUsedConfigFiles);
+ outGui["ConfigHistory" ](config.gui.cfgFileHistory);
+ outGui["ConfigHistory"].attribute("MaxSize", config.gui.cfgFileHistMax);
+
outGui["FolderHistoryLeft" ](config.gui.folderHistoryLeft);
outGui["FolderHistoryRight"](config.gui.folderHistoryRight);
outGui["FolderHistoryLeft" ].attribute("MaxSize", config.gui.folderHistMax);
@@ -1241,10 +1300,6 @@ void writeConfig(const XmlGlobalSettings& config, XmlOut& out)
//external applications
outGui["ExternalApplications"](config.gui.externelApplications);
- //load config file history
- outGui["LastConfigActive"](config.gui.lastUsedConfigFiles);
- outGui["ConfigHistory" ](config.gui.cfgFileHistory);
-
//last update check
outGui["LastUpdateCheck"](config.gui.lastUpdateCheck);
diff --git a/lib/process_xml.h b/lib/process_xml.h
index 540b4ef3..7191e0c2 100644
--- a/lib/process_xml.h
+++ b/lib/process_xml.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef PROCESSXML_H_INCLUDED
@@ -12,6 +12,7 @@
#include "xml_base.h"
#include "localization.h"
#include "../ui/column_attr.h"
+//#include "ffs_paths.h"
namespace xmlAccess
{
@@ -47,25 +48,23 @@ typedef std::vector<std::pair<Description, Commandline> > ExternalApps;
struct XmlGuiConfig
{
XmlGuiConfig() :
- hideFilteredElements(false),
+ showFilteredElements(true),
handleError(ON_GUIERROR_POPUP),
showSyncAction(true) {} //initialize values
zen::MainConfiguration mainCfg;
- bool hideFilteredElements;
+ bool showFilteredElements;
OnGuiError handleError; //reaction on error situation during synchronization
bool showSyncAction;
bool operator==(const XmlGuiConfig& other) const
{
- return mainCfg == other.mainCfg &&
- hideFilteredElements == other.hideFilteredElements &&
- handleError == other.handleError &&
+ return mainCfg == other.mainCfg &&
+ showFilteredElements == other.showFilteredElements &&
+ handleError == other.handleError &&
showSyncAction == other.showSyncAction;
}
-
- bool operator!=(const XmlGuiConfig& other) const { return !(*this == other); }
};
@@ -73,15 +72,15 @@ struct XmlBatchConfig
{
XmlBatchConfig() :
showProgress(true),
- logFileCountMax(200),
+ logfilesCountLimit(-1),
handleError(ON_ERROR_POPUP) {}
zen::MainConfiguration mainCfg;
bool showProgress;
- wxString logFileDirectory;
- size_t logFileCountMax;
- OnError handleError; //reaction on error situation during synchronization
+ Zstring logFileDirectory;
+ int logfilesCountLimit; //max logfiles; 0 := don't save logfiles; < 0 := no limit
+ OnError handleError; //reaction on error situation during synchronization
};
@@ -155,6 +154,7 @@ struct XmlGlobalSettings
naviLastSortColumn(zen::defaultValueLastSortColumn),
naviLastSortAscending(zen::defaultValueLastSortAscending),
showPercentBar(zen::defaultValueShowPercentage),
+ cfgFileHistMax(20),
folderHistMax(15),
onCompletionHistoryMax(8),
deleteOnBothSides(false),
@@ -171,14 +171,14 @@ struct XmlGlobalSettings
//default external apps will be translated "on the fly"!!! First entry will be used for [Enter] or mouse double-click!
#ifdef FFS_WIN
externelApplications.push_back(std::make_pair(L"Show in Explorer", //mark for extraction: _("Show in Explorer")
- L"explorer /select, \"%name\""));
+ L"explorer /select, \"%item_path%\""));
externelApplications.push_back(std::make_pair(L"Open with default application", //mark for extraction: _("Open with default application")
- L"\"%name\""));
+ L"\"%item_path%\""));
#elif defined FFS_LINUX
externelApplications.push_back(std::make_pair(L"Browse directory", //mark for extraction: _("Browse directory") Linux doesn't use the term "folder"
- L"xdg-open \"%dir\""));
+ L"xdg-open \"%item_folder%\""));
externelApplications.push_back(std::make_pair(L"Open with default application", //mark for extraction: _("Open with default application")
- L"xdg-open \"%name\""));
+ L"xdg-open \"%item_path%\""));
#endif
}
@@ -201,11 +201,13 @@ struct XmlGlobalSettings
ExternalApps externelApplications;
std::vector<wxString> cfgFileHistory;
+ size_t cfgFileHistMax;
+
std::vector<wxString> lastUsedConfigFiles;
std::vector<Zstring> folderHistoryLeft;
std::vector<Zstring> folderHistoryRight;
- unsigned int folderHistMax;
+ size_t folderHistMax;
std::vector<std::wstring> onCompletionHistory;
size_t onCompletionHistoryMax;
diff --git a/lib/resolve_path.cpp b/lib/resolve_path.cpp
index 57f4ff30..425a640b 100644
--- a/lib/resolve_path.cpp
+++ b/lib/resolve_path.cpp
@@ -1,17 +1,18 @@
#include "resolve_path.h"
-#include <wx/utils.h>
-#include <zen/time.h>
-#include <wx+/string_conv.h>
#include <map>
#include <set>
+#include <zen/time.h>
#include <zen/scope_guard.h>
#include <zen/thread.h>
+#include <wx/utils.h>
+#include <wx+/string_conv.h>
#ifdef FFS_WIN
#include <zen/dll.h>
#include <Shlobj.h>
#include <zen/win.h> //includes "windows.h"
#include <zen/long_path_prefix.h>
+#include <zen/file_handling.h>
#ifdef _MSC_VER
#pragma comment(lib, "Mpr.lib")
#endif
@@ -138,119 +139,114 @@ private:
};
//caveat: function scope static initialization is not thread-safe in VS 2010! => make sure to call at app start!
-namespace
-{
struct Dummy { Dummy() { CsidlConstants::get(); }} blah;
-}
#endif
-wxString getEnvValue(const wxString& envName) //return empty on error
+std::unique_ptr<Zstring> getEnvironmentVar(const Zstring& envName) //return nullptr if not found
{
- //try to apply environment variables
- wxString envValue;
- if (wxGetEnv(envName, &envValue))
- {
- //some postprocessing:
- trim(envValue); //remove leading, trailing blanks
-
- //remove leading, trailing double-quotes
- if (startsWith(envValue, L"\"") &&
- endsWith(envValue, L"\"") &&
- envValue.length() >= 2)
- envValue = wxString(envValue.c_str() + 1, envValue.length() - 2);
- }
- return envValue;
+ wxString value;
+ if (!wxGetEnv(utfCvrtTo<wxString>(envName), &value))
+ return nullptr;
+
+ //some postprocessing:
+ trim(value); //remove leading, trailing blanks
+
+ //remove leading, trailing double-quotes
+ if (startsWith(value, L"\"") &&
+ endsWith (value, L"\"") &&
+ value.length() >= 2)
+ value = wxString(value.c_str() + 1, value.length() - 2);
+
+ return make_unique<Zstring>(utfCvrtTo<Zstring>(value));
}
-bool replaceMacro(wxString& macro) //macro without %-characters, return true if replaced successfully
+std::unique_ptr<Zstring> resolveMacro(const Zstring& macro, //macro without %-characters
+ const std::vector<std::pair<Zstring, Zstring>>& ext) //return nullptr if not resolved
{
- if (macro.IsEmpty())
- return false;
+ auto equalNoCase = [](const Zstring& lhs, const Zstring& rhs) { return utfCvrtTo<wxString>(lhs).CmpNoCase(utfCvrtTo<wxString>(rhs)) == 0; };
- //there are equally named environment variables %TIME%, %DATE% existing, so replace these first!
- if (macro.CmpNoCase(L"time") == 0)
- {
- macro = formatTime<wxString>(L"%H%M%S");
- return true;
- }
+ //there exist environment variables named %TIME%, %DATE% so check for our internal macros first!
+ if (equalNoCase(macro, Zstr("time")))
+ return make_unique<Zstring>(formatTime<Zstring>(Zstr("%H%M%S")));
- if (macro.CmpNoCase(L"date") == 0)
- {
- macro = formatTime<wxString>(FORMAT_ISO_DATE);
- return true;
- }
+ if (equalNoCase(macro, Zstr("date")))
+ return make_unique<Zstring>(formatTime<Zstring>(FORMAT_ISO_DATE));
- auto processPhrase = [&](const wchar_t* phrase, const wchar_t* format) -> bool
+ std::unique_ptr<Zstring> cand;
+ auto processPhrase = [&](const Zchar* phrase, const Zchar* format) -> bool
{
- if (macro.CmpNoCase(phrase) != 0)
+ if (!equalNoCase(macro, phrase))
return false;
- macro = formatTime<wxString>(format);
+ cand = make_unique<Zstring>(formatTime<Zstring>(format));
return true;
};
- if (processPhrase(L"weekday", L"%A")) return true;
- if (processPhrase(L"day" , L"%d")) return true;
- if (processPhrase(L"month" , L"%B")) return true;
- if (processPhrase(L"week" , L"%U")) return true;
- if (processPhrase(L"year" , L"%Y")) return true;
- if (processPhrase(L"hour" , L"%H")) return true;
- if (processPhrase(L"min" , L"%M")) return true;
- if (processPhrase(L"sec" , L"%S")) return true;
-
- //try to apply environment variables
- {
- wxString envValue = getEnvValue(macro);
- if (!envValue.empty())
- {
- macro = envValue;
- return true;
- }
- }
+ if (processPhrase(Zstr("weekday"), Zstr("%A"))) return cand;
+ if (processPhrase(Zstr("day" ), Zstr("%d"))) return cand;
+ if (processPhrase(Zstr("month" ), Zstr("%B"))) return cand;
+ if (processPhrase(Zstr("week" ), Zstr("%U"))) return cand;
+ if (processPhrase(Zstr("year" ), Zstr("%Y"))) return cand;
+ if (processPhrase(Zstr("hour" ), Zstr("%H"))) return cand;
+ if (processPhrase(Zstr("min" ), Zstr("%M"))) return cand;
+ if (processPhrase(Zstr("sec" ), Zstr("%S"))) return cand;
+
+ //check domain-specific extensions
+ {
+ auto iter = std::find_if(ext.begin(), ext.end(), [&](const std::pair<Zstring, Zstring>& p){ return equalNoCase(macro, p.first); });
+ if (iter != ext.end())
+ return make_unique<Zstring>(iter->second);
+ }
+
+ //try to resolve as environment variable
+ if (std::unique_ptr<Zstring> value = getEnvironmentVar(macro))
+ return value;
#ifdef FFS_WIN
- //try to resolve CSIDL values
+ //try to resolve as CSIDL value
{
- auto csidlMap = CsidlConstants::get();
- auto iter = csidlMap.find(toZ(macro));
+ const auto& csidlMap = CsidlConstants::get();
+ auto iter = csidlMap.find(macro);
if (iter != csidlMap.end())
- {
- macro = toWx(iter->second);
- return true;
- }
+ return make_unique<Zstring>(iter->second);
}
#endif
- return false;
+ return nullptr;
}
+const Zchar MACRO_SEP = Zstr('%');
//returns expanded or original string
-wxString expandMacros(const wxString& text)
+Zstring expandMacros(const Zstring& text, const std::vector<std::pair<Zstring, Zstring>>& ext)
{
- const wxChar SEPARATOR = L'%';
-
- if (contains(text, SEPARATOR))
+ if (contains(text, MACRO_SEP))
{
- wxString prefix = text.BeforeFirst(SEPARATOR);
- wxString rest = text.AfterFirst(SEPARATOR);
- if (contains(rest, SEPARATOR))
+ Zstring prefix = beforeFirst(text, MACRO_SEP);
+ Zstring rest = afterFirst (text, MACRO_SEP);
+ if (contains(rest, MACRO_SEP))
{
- wxString potentialMacro = beforeFirst(rest, SEPARATOR);
- wxString postfix = afterFirst (rest, SEPARATOR); //text == prefix + SEPARATOR + potentialMacro + SEPARATOR + postfix
+ Zstring potentialMacro = beforeFirst(rest, MACRO_SEP);
+ Zstring postfix = afterFirst (rest, MACRO_SEP); //text == prefix + MACRO_SEP + potentialMacro + MACRO_SEP + postfix
- if (replaceMacro(potentialMacro))
- return prefix + potentialMacro + expandMacros(postfix);
+ if (std::unique_ptr<Zstring> value = resolveMacro(potentialMacro, ext))
+ return prefix + *value + expandMacros(postfix, ext);
else
- return prefix + SEPARATOR + potentialMacro + expandMacros(SEPARATOR + postfix);
+ return prefix + MACRO_SEP + potentialMacro + expandMacros(MACRO_SEP + postfix, ext);
}
}
return text;
}
+}
+
+
+Zstring zen::expandMacros(const Zstring& text) { return ::expandMacros(text, std::vector<std::pair<Zstring, Zstring>>()); }
+namespace
+{
#ifdef FFS_LINUX
class TraverseMedia : public zen::TraverseCallback
{
@@ -266,7 +262,7 @@ public:
devices_.insert(std::make_pair(shortName, fullName));
return nullptr; //DON'T traverse into subdirs
}
- virtual HandleError onError(const std::wstring& errorText) { return ON_ERROR_IGNORE; }
+ virtual HandleError onError(const std::wstring& msg) { return ON_ERROR_IGNORE; }
private:
DeviceList& devices_;
@@ -275,7 +271,7 @@ private:
//networks and cdrom excluded - this should not block
-Zstring volumenNameToPath(const Zstring& volumeName) //return empty string on error
+Zstring getPathByVolumenName(const Zstring& volumeName) //return empty string on error
{
#ifdef FFS_WIN
//FindFirstVolume(): traverses volumes on local hard disks only!
@@ -340,7 +336,7 @@ Zstring volumenNameToPath(const Zstring& volumeName) //return empty string on er
#ifdef FFS_WIN
//networks and cdrom excluded - this should not block
-Zstring volumePathToName(const Zstring& volumePath) //return empty string on error
+Zstring getVolumeName(const Zstring& volumePath) //return empty string on error
{
UINT rv = ::GetDriveType(volumePath.c_str()); //non-blocking call!
if (rv != DRIVE_REMOTE &&
@@ -387,7 +383,7 @@ Zstring expandVolumeName(const Zstring& text) // [volname]:\folder [volna
//[.*] pattern was found...
if (!volname.empty())
{
- Zstring volPath = volumenNameToPath(volname); //should not block?!
+ Zstring volPath = getPathByVolumenName(volname); //should not block?!
if (!volPath.empty())
return appendSeparator(volPath) + rest; //successfully replaced pattern
}
@@ -421,7 +417,7 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less
dirname[1] == L':' &&
dirname[2] == L'\\')
{
- Zstring volname = volumePathToName(Zstring(dirname.c_str(), 3)); //should not block
+ Zstring volname = getVolumeName(Zstring(dirname.c_str(), 3)); //should not block
if (!volname.empty())
output.insert(L"[" + volname + L"]" + Zstring(dirname.c_str() + 2));
}
@@ -439,11 +435,10 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less
std::map<Zstring, Zstring> envToDir;
//get list of useful variables
- auto addEnvVar = [&](const wxString& envName)
+ auto addEnvVar = [&](const Zstring& envName)
{
- wxString envVal = getEnvValue(envName); //return empty on error
- if (!envVal.empty())
- envToDir.insert(std::make_pair(toZ(envName), toZ(envVal)));
+ if (std::unique_ptr<Zstring> value = getEnvironmentVar(envName))
+ envToDir.insert(std::make_pair(envName, *value));
};
addEnvVar(L"AllUsersProfile"); // C:\ProgramData
addEnvVar(L"AppData"); // C:\Users\username\AppData\Roaming
@@ -457,9 +452,10 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less
addEnvVar(L"Temp"); // C:\Windows\Temp
//add CSIDL values: http://msdn.microsoft.com/en-us/library/bb762494(v=vs.85).aspx
- auto csidlMap = CsidlConstants::get();
+ const auto& csidlMap = CsidlConstants::get();
envToDir.insert(csidlMap.begin(), csidlMap.end());
+ //substitute paths by symbolic names
Zstring tmp = dirname;
::makeUpper(tmp);
std::for_each(envToDir.begin(), envToDir.end(),
@@ -468,13 +464,13 @@ void getDirectoryAliasesRecursive(const Zstring& dirname, std::set<Zstring, Less
Zstring tmp2 = entry.second; //case-insensitive "startsWith()"
::makeUpper(tmp2); //
if (startsWith(tmp, tmp2))
- output.insert(L"%" + entry.first + L"%" + (dirname.c_str() + tmp2.size()));
+ output.insert(MACRO_SEP + entry.first + MACRO_SEP + (dirname.c_str() + tmp2.size()));
});
}
//4. replace (all) macros: %USERPROFILE% -> C:\Users\username
{
- Zstring testMacros = toZ(expandMacros(toWx(dirname)));
+ Zstring testMacros = expandMacros(dirname);
if (testMacros != dirname)
if (output.insert(testMacros).second)
getDirectoryAliasesRecursive(testMacros, output); //recurse!
@@ -502,9 +498,9 @@ std::vector<Zstring> zen::getDirectoryAliases(const Zstring& dirString)
Zstring zen::getFormattedDirectoryName(const Zstring& dirString) // throw()
{
- //Formatting is needed since functions expect the directory to end with '\' to be able to split the relative names.
+ //formatting is needed since functions expect the directory to end with '\' to be able to split the relative names.
- Zstring dirname = toZ(expandMacros(toWx(dirString)));
+ Zstring dirname = expandMacros(dirString);
dirname = expandVolumeName(dirname); //should not block
@@ -517,7 +513,7 @@ Zstring zen::getFormattedDirectoryName(const Zstring& dirString) // throw()
return Zstring();
/*
- resolve relative names; required by:
+ need to resolve relative paths:
WINDOWS:
- \\?\-prefix which needs absolute names
- Volume Shadow Copy: volume name needs to be part of each filename
@@ -544,14 +540,68 @@ void zen::loginNetworkShare(const Zstring& dirnameOrig, bool allowUserInteractio
WebDrive | NO_ERROR | \\Webdrive-ZenJu\GNU | NO
Box.net (WebDav) | NO_ERROR | \\www.box.net\DavWWWRoot\dav | YES
NetDrive | ERROR_NOT_CONNECTED | <empty> | NO
+ ____________________________________________________________________________________________________________
+
+ Windows Login Prompt Naming Conventions:
+ user account: <Domain>\<user> e.g. WIN-XP\ZenJu
+ network share: \\<server>\<share> e.g. \\WIN-XP\test
+
+ Windows Command Line:
+ - list *all* active network connections, including deviceless ones which are hidden in Explorer:
+ net use
+ - delete active connection:
+ net use /delete \\server\share
+ ____________________________________________________________________________________________________________
+
+ Scenario: XP-shared folder is accessed by Win 7 over LAN with access limited to a certain user
+
+ Problems:
+ I. WNetAddConnection2() allows (at least certain) invalid credentials (e.g. username: a/password: a) and establishes an *unusable* connection
+ II. WNetAddConnection2() refuses to overwrite an existing (unusable) connection created in I), but shows prompt repeatedly
+ III. WNetAddConnection2() won't bring up the prompt if *wrong* credentials had been entered just recently, even with CONNECT_INTERACTIVE specified! => 2-step proccess
*/
- //if (::GetFileAttributes((driveLetter + L'\\').c_str()) == INVALID_FILE_ATTRIBUTES) <- this will seriously block if network is not reachable!!!
+ auto connect = [&](NETRESOURCE& trgRes) //blocks heavily if network is not reachable!!!
+ {
+ //1. first try to connect without user interaction - blocks!
+ DWORD rv = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource,
+ nullptr, // __in LPCTSTR lpPassword,
+ nullptr, // __in LPCTSTR lpUsername,
+ 0); //__in DWORD dwFlags
+ if (somethingExists(trgRes.lpRemoteName)) //blocks!
+ return; //success: connection usable! -> don't care about "rv"
+
+ if (rv == ERROR_BAD_NETPATH || //Windows 7
+ rv == ERROR_BAD_NET_NAME) //XP
+ return; //no need to show a prompt for an unreachable network device
+
+ //2. if first attempt failed, we need to *force* prompt by using CONNECT_PROMPT
+ if (allowUserInteraction)
+ {
+ //avoid problem II.)
+ DWORD rv2= WNetCancelConnection2(trgRes.lpRemoteName, //_In_ LPCTSTR lpName,
+ 0, //_In_ DWORD dwFlags,
+ true); //_In_ BOOL fForce
+ //enforce login prompt
+ DWORD rv3 = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource,
+ nullptr, // __in LPCTSTR lpPassword,
+ nullptr, // __in LPCTSTR lpUsername,
+ CONNECT_INTERACTIVE | CONNECT_PROMPT); //__in DWORD dwFlags
+ (void)rv2;
+ (void)rv3;
+ //Sample error codes:
+ //53L ERROR_BAD_NETPATH The network path was not found.
+ //86L ERROR_INVALID_PASSWORD
+ //1219L ERROR_SESSION_CREDENTIAL_CONFLICT Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed. Disconnect all previous connections to the server or shared resource and try again.
+ //1326L ERROR_LOGON_FAILURE Logon failure: unknown user name or bad password.
+ }
+ };
+
Zstring dirname = removeLongPathPrefix(dirnameOrig);
trim(dirname, true, false);
- //1. local path
+ //1. locally mapped network share
if (dirname.size() >= 2 && iswalpha(dirname[0]) && dirname[1] == L':')
{
Zstring driveLetter(dirname.c_str(), 2); //e.g.: "Q:"
@@ -577,22 +627,13 @@ void zen::loginNetworkShare(const Zstring& dirnameOrig, bool allowUserInteractio
trgRes.lpLocalName = const_cast<LPWSTR>(driveLetter.c_str()); //lpNetResource is marked "__in", seems WNetAddConnection2 is not const correct!
trgRes.lpRemoteName = const_cast<LPWSTR>(networkShare.c_str()); //
- //note: following function call may block heavily if network is not reachable!!!
- DWORD rv2 = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource,
- nullptr, // __in LPCTSTR lpPassword,
- nullptr, // __in LPCTSTR lpUsername,
- allowUserInteraction ? CONNECT_INTERACTIVE : 0); //__in DWORD dwFlags
- if (rv2 == NO_ERROR)
- return; //mapping reestablished
-
- //restoring connection failed for some reason...
- //we could use full UNC path instead: networkShare + (dirname.c_str() + 2); //replace "Q:\subdir" by "\\server\share\subdir"
+ connect(trgRes); //blocks!
}
}
}
}
- //2. UNC path
- else if (startsWith(dirname, L"\\\\"))
+ //2. deviceless network connection
+ else if (startsWith(dirname, L"\\\\")) //UNC path
{
const Zstring networkShare = [&]() -> Zstring //extract prefix "\\server\share"
{
@@ -612,49 +653,7 @@ void zen::loginNetworkShare(const Zstring& dirnameOrig, bool allowUserInteractio
trgRes.dwType = RESOURCETYPE_DISK;
trgRes.lpRemoteName = const_cast<LPWSTR>(networkShare.c_str()); //trgRes is "__in"
- //following function call may block heavily if network is not reachable!!!
- DWORD rv2 = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource,
- nullptr, // __in LPCTSTR lpPassword,
- nullptr, // __in LPCTSTR lpUsername,
- allowUserInteraction ? CONNECT_INTERACTIVE : 0); //__in DWORD dwFlags
- if (rv2 == NO_ERROR)
- return; //mapping reestablished
-
- /*
- NETRESOURCE nr = {};
- nr.dwType = RESOURCETYPE_DISK;
- nr.lpRemoteName = const_cast<LPWSTR>(networkShare.c_str()); //nr is "__in"
-
- DWORD bufferSize = sizeof(NETRESOURCE) + 20000;
- std::vector<char> buffer(bufferSize);
-
- LPTSTR relPath = nullptr;
-
- //note: following function call may block heavily if network is not reachable!!!
- const DWORD rv = WNetGetResourceInformation(&nr, // __in LPNETRESOURCE lpNetResource,
- &buffer[0], // __out LPVOID lpBuffer,
- &bufferSize, // __inout LPDWORD lpcbBuffer,
- &relPath); // __out LPTSTR *lplpSystem
- if (rv == NO_ERROR)
- {
- //NO_ERROR: network share is existing, *either* connected or disconnected
-
- //we have no way to check if network is already connected, so let's try to connect anyway:
-
- NETRESOURCE& trgRes = reinterpret_cast<NETRESOURCE&>(buffer[0]);
-
- if (trgRes.dwUsage & RESOURCEUSAGE_CONNECTABLE)
- {
- //note: following function call may block heavily if network is not reachable!!!
- DWORD rv2 = ::WNetAddConnection2(&trgRes, // __in LPNETRESOURCE lpNetResource,
- nullptr, // __in LPCTSTR lpPassword,
- nullptr, // __in LPCTSTR lpUsername,
- allowUserInteraction ? CONNECT_INTERACTIVE : 0); //__in DWORD dwFlags
- if (rv2 == NO_ERROR)
- return; //mapping reestablished
- }
- }
- */
+ connect(trgRes); //blocks!
}
}
}
diff --git a/lib/resolve_path.h b/lib/resolve_path.h
index bc74441a..ccc8f42e 100644
--- a/lib/resolve_path.h
+++ b/lib/resolve_path.h
@@ -1,25 +1,34 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef RESOLVE_PATH_H_INCLUDED
#define RESOLVE_PATH_H_INCLUDED
+#include <vector>
#include <zen/zstring.h>
-
namespace zen
{
-//resolve environment variables, relative paths, ect. and append file name separator
+/*
+FULL directory format:
+ - expand macros
+ - expand volume path by name
+ - convert relative paths into absolute
+ - trim whitespace and append file name separator
+*/
Zstring getFormattedDirectoryName(const Zstring& dirString); //throw() - non-blocking! no I/O!
-#ifdef FFS_WIN
-std::vector<Zstring> getDirectoryAliases(const Zstring& dirString);
+//macro substitution only
+Zstring expandMacros(const Zstring& text);
-//this call may block if network is not reachable or when showing login prompt!
+#ifdef FFS_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
+
+std::vector<Zstring> getDirectoryAliases(const Zstring& dirString);
#endif
}
diff --git a/lib/resources.cpp b/lib/resources.cpp
index 0d86279b..ac20066a 100644
--- a/lib/resources.cpp
+++ b/lib/resources.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "resources.h"
@@ -10,7 +10,6 @@
#include <wx/zipstrm.h>
#include <wx/image.h>
#include <wx/mstream.h>
-//#include <wx+/string_conv.h>
#include "ffs_paths.h"
using namespace zen;
diff --git a/lib/resources.h b/lib/resources.h
index 56b23a5f..df13340d 100644
--- a/lib/resources.h
+++ b/lib/resources.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef RESOURCES_H_INCLUDED
diff --git a/lib/return_codes.h b/lib/return_codes.h
index c5f8fd15..34ae0527 100644
--- a/lib/return_codes.h
+++ b/lib/return_codes.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef RETURN_CODES_H_INCLUDED
diff --git a/lib/shadow.cpp b/lib/shadow.cpp
index ba4e1f5e..5a5b9cef 100644
--- a/lib/shadow.cpp
+++ b/lib/shadow.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "shadow.h"
@@ -29,7 +29,6 @@ bool runningWOW64() //test if process is running under WOW64 (reference http://m
if (isWow64Process(::GetCurrentProcess(), &isWow64))
return isWow64 != FALSE;
}
-
return false;
}
}
@@ -48,7 +47,7 @@ public:
backupHandle(nullptr)
{
//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)
+ //reference: http://msdn.microsoft.com/en-us/library/aa384627(VS.85).aspx
if (runningWOW64())
throw FileError(_("Cannot access Volume Shadow Copy Service.") + L"\n" +
_("Please use FreeFileSync 64-bit version to create shadow copies on this system."));
diff --git a/lib/shadow.h b/lib/shadow.h
index 5335e95d..bb834a41 100644
--- a/lib/shadow.h
+++ b/lib/shadow.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SHADOW_H_INCLUDED
@@ -15,7 +15,7 @@
namespace shadow
{
-class ShadowCopy //buffer access to Windows Volume Shadow Copy Service
+class ShadowCopy //take and buffer Windows Volume Shadow Copy snapshots as needed
{
public:
ShadowCopy() {}
diff --git a/lib/soft_filter.h b/lib/soft_filter.h
index 1ad55ea9..b9fb2fd4 100644
--- a/lib/soft_filter.h
+++ b/lib/soft_filter.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SOFT_FILTER_H_INCLUDED
diff --git a/lib/status_handler.cpp b/lib/status_handler.cpp
index d9655c48..a7286c39 100644
--- a/lib/status_handler.cpp
+++ b/lib/status_handler.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "status_handler.h"
diff --git a/lib/status_handler.h b/lib/status_handler.h
index ca7af298..129d5ae9 100644
--- a/lib/status_handler.h
+++ b/lib/status_handler.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef STATUSHANDLER_H_INCLUDED
diff --git a/lib/status_handler_impl.h b/lib/status_handler_impl.h
index 10890dbe..16466556 100644
--- a/lib/status_handler_impl.h
+++ b/lib/status_handler_impl.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef STATUSHANDLER_IMPL_H_INCLUDED
diff --git a/lib/versioning.cpp b/lib/versioning.cpp
new file mode 100644
index 00000000..a285bb70
--- /dev/null
+++ b/lib/versioning.cpp
@@ -0,0 +1,398 @@
+#include "versioning.h"
+#include <map>
+#include <zen/file_handling.h>
+#include <zen/file_traverser.h>
+#include <zen/string_tools.h>
+
+using namespace zen;
+
+
+namespace
+{
+Zstring getExtension(const Zstring& relativeName) //including "." if extension is existing, returns empty string otherwise
+{
+ auto iterSep = find_last(relativeName.begin(), relativeName.end(), FILE_NAME_SEPARATOR);
+ auto iterName = iterSep != relativeName.end() ? iterSep + 1 : relativeName.begin(); //find beginning of short name
+ auto iterDot = find_last(iterName, relativeName.end(), Zstr('.')); //equal to relativeName.end() if file has no extension!!
+ return Zstring(&*iterDot, relativeName.end() - iterDot);
+};
+}
+
+bool impl::isMatchingVersion(const Zstring& shortname, const Zstring& shortnameVersion) //e.g. ("Sample.txt", "Sample.txt 2012-05-15 131513.txt")
+{
+ auto iter = shortnameVersion.begin();
+ auto last = shortnameVersion.end();
+
+ auto nextDigit = [&]() -> bool
+ {
+ if (iter == last || !isDigit(*iter))
+ return false;
+ ++iter;
+ return true;
+ };
+ auto nextDigits = [&](size_t count) -> bool
+ {
+ while (count-- > 0)
+ if (!nextDigit())
+ return false;
+ return true;
+ };
+ auto nextChar = [&](Zchar c) -> bool
+ {
+ if (iter == last || *iter != c)
+ return false;
+ ++iter;
+ return true;
+ };
+ auto nextStringI = [&](const Zstring& str) -> bool //windows: ignore case!
+ {
+ if (last - iter < static_cast<ptrdiff_t>(str.size()) || !EqualFilename()(str, Zstring(&*iter, str.size())))
+ return false;
+ iter += str.size();
+ return true;
+ };
+
+ return nextStringI(shortname) && //versioned file starts with original name
+ nextChar(Zstr(' ')) && //validate timestamp: e.g. "2012-05-15 131513"; Regex: \d{4}-\d{2}-\d{2} \d{6}
+ nextDigits(4) && //YYYY
+ nextChar(Zstr('-')) && //
+ nextDigits(2) && //MM
+ nextChar(Zstr('-')) && //
+ nextDigits(2) && //DD
+ nextChar(Zstr(' ')) && //
+ nextDigits(6) && //HHMMSS
+ nextStringI(getExtension(shortname)) &&
+ iter == last;
+}
+
+
+namespace
+{
+template <class Function>
+void moveItemToVersioning(const Zstring& sourceObj, //throw FileError
+ const Zstring& relativeName,
+ const Zstring& versioningDirectory,
+ const Zstring& timestamp,
+ Function moveObj) //move source -> target; allowed to throw FileError
+{
+ assert(!startsWith(relativeName, FILE_NAME_SEPARATOR));
+ assert(endsWith(sourceObj, relativeName)); //usually, yes, but we might relax this in the future
+
+ //assemble time-stamped version name
+ const Zstring targetObj = appendSeparator(versioningDirectory) + relativeName + Zstr(' ') + timestamp + getExtension(relativeName);
+ assert(impl::isMatchingVersion(afterLast(relativeName, FILE_NAME_SEPARATOR), afterLast(targetObj, FILE_NAME_SEPARATOR))); //paranoid? no!
+
+ try
+ {
+ moveObj(sourceObj, targetObj); //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!)
+ return; //object *not* processed
+
+ //create intermediate directories if missing
+ const Zstring targetDir = beforeLast(targetObj, FILE_NAME_SEPARATOR);
+ if (!dirExists(targetDir)) //->(minor) file system race condition!
+ {
+ makeDirectory(targetDir); //throw FileError
+ moveObj(sourceObj, targetObj); //throw FileError -> this should work now!
+ }
+ else
+ throw;
+ }
+}
+
+
+//move source to target across volumes; prerequisite: all super-directories of target exist
+//if target already contains some files/dirs they are seen as remnants of a previous incomplete move
+void moveFile(const Zstring& sourceFile, const Zstring& targetFile, CallbackCopyFile& callback) //throw FileError
+{
+ //first try to move directly without copying
+ 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&) {}
+
+ //create target
+ if (!fileExists(targetFile)) //check even if ErrorTargetExisting: me may have clashed with another item type of the same name!!!
+ {
+ //file is on a different volume: let's copy it
+ if (symlinkExists(sourceFile))
+ copySymlink(sourceFile, targetFile, false); //throw FileError; don't copy filesystem permissions
+ else
+ copyFile(sourceFile, targetFile, false, true, &callback); //throw FileError - permissions "false", transactional copy "true"
+ }
+
+ //delete source
+ removeFile(sourceFile); //throw FileError; newly copied file is NOT deleted if exception is thrown here!
+}
+
+
+void moveDirSymlink(const Zstring& sourceLink, const Zstring& targetLink) //throw FileError
+{
+ //first try to move directly without copying
+ try
+ {
+ renameFile(sourceLink, targetLink); //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&) {}
+
+ //create target
+ if (!symlinkExists(targetLink)) //check even if ErrorTargetExisting: me may have clashed with another item type of the same name!!!
+ {
+ //link is on a different volume: let's copy it
+ copySymlink(sourceLink, targetLink, false); //throw FileError; don't copy filesystem permissions
+ }
+
+ //delete source
+ removeDirectory(sourceLink); //throw FileError; newly copied link is NOT deleted if exception is thrown here!
+}
+
+
+struct CopyCallbackImpl : public CallbackCopyFile
+{
+ CopyCallbackImpl(CallbackMoveFile& callback) : callback_(callback) {}
+
+private:
+ virtual void deleteTargetFile(const Zstring& targetFile) { assert(!somethingExists(targetFile)); }
+ virtual void updateCopyStatus(Int64 bytesDelta) { callback_.updateStatus(bytesDelta); }
+
+ CallbackMoveFile& callback_;
+};
+
+
+class TraverseFilesOneLevel : public TraverseCallback
+{
+public:
+ TraverseFilesOneLevel(std::vector<Zstring>& files, std::vector<Zstring>& dirs) : files_(files), dirs_(dirs) {}
+
+private:
+ virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details)
+ {
+ files_.push_back(shortName);
+ }
+
+ virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details)
+ {
+ if (details.dirLink)
+ dirs_.push_back(shortName);
+ else
+ files_.push_back(shortName);
+ return LINK_SKIP;
+ }
+
+ virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName)
+ {
+ dirs_.push_back(shortName);
+ return nullptr; //DON'T traverse into subdirs; moveDirectory works recursively!
+ }
+
+ virtual HandleError onError(const std::wstring& msg) { throw FileError(msg); }
+
+ std::vector<Zstring>& files_;
+ std::vector<Zstring>& dirs_;
+};
+
+
+struct RemoveCallbackImpl : public CallbackRemoveDir
+{
+ RemoveCallbackImpl(CallbackMoveFile& callback) : callback_(callback) {}
+
+private:
+ virtual void notifyFileDeletion(const Zstring& filename) { callback_.updateStatus(0); }
+ virtual void notifyDirDeletion (const Zstring& dirname ) { callback_.updateStatus(0); }
+
+ CallbackMoveFile& callback_;
+};
+}
+
+
+void FileVersioner::revisionFile(const Zstring& sourceFile, const Zstring& relativeName, CallbackMoveFile& callback) //throw FileError
+{
+ moveItemToVersioning(sourceFile, //throw FileError
+ relativeName,
+ versioningDirectory_,
+ timeStamp_,
+ [&](const Zstring& source, const Zstring& target)
+ {
+ callback.onBeforeFileMove(source, target);
+
+ CopyCallbackImpl copyCallback(callback);
+ moveFile(source, target, copyCallback); //throw FileError
+ callback.objectProcessed();
+ });
+
+ fileRelnames.push_back(relativeName);
+}
+
+
+void FileVersioner::revisionDir(const Zstring& sourceDir, const Zstring& relativeName, CallbackMoveFile& callback) //throw FileError
+{
+ //note: we cannot support "throw exception if target already exists": If we did, we would have to do a full cleanup
+ //removing all newly created directories in case of an exception so that subsequent tries would not fail with "target already existing".
+ //However an exception may also happen during final deletion of source folder, in which case cleanup effectively leads to data loss!
+
+ //create target
+ if (symlinkExists(sourceDir)) //on Linux there is just one type of symlinks, and since we do revision file symlinks, we should revision dir symlinks as well!
+ {
+ moveItemToVersioning(sourceDir, //throw FileError
+ relativeName,
+ versioningDirectory_,
+ timeStamp_,
+ [&](const Zstring& source, const Zstring& target)
+ {
+ callback.onBeforeDirMove(source, target);
+ moveDirSymlink(source, target); //throw FileError
+ callback.objectProcessed();
+ });
+
+ fileRelnames.push_back(relativeName);
+ }
+ else
+ {
+ assert(!startsWith(relativeName, FILE_NAME_SEPARATOR));
+ assert(endsWith(sourceDir, relativeName));
+ const Zstring targetDir = appendSeparator(versioningDirectory_) + relativeName;
+
+ callback.onBeforeDirMove(sourceDir, targetDir);
+
+ //makeDirectory(targetDir); //FileError -> create only when needed in moveFileToVersioning(); avoids empty directories
+
+ //traverse source directory one level
+ std::vector<Zstring> fileList; //list of *short* names
+ std::vector<Zstring> dirList; //
+ try
+ {
+ TraverseFilesOneLevel tol(fileList, dirList); //throw FileError
+ traverseFolder(sourceDir, tol); //
+ }
+ catch (FileError&)
+ {
+ if (!somethingExists(sourceDir)) //no source at all is not an error (however a file as source when a directory is expected, *is* an error!)
+ return; //object *not* processed
+ throw;
+ }
+
+ const Zstring sourceDirPf = appendSeparator(sourceDir);
+ const Zstring relnamePf = appendSeparator(relativeName);
+
+ //move files
+ std::for_each(fileList.begin(), fileList.end(),
+ [&](const Zstring& shortname)
+ {
+ revisionFile(sourceDirPf + shortname, //throw FileError
+ relnamePf + shortname,
+ callback);
+ });
+
+ //move directories
+ std::for_each(dirList.begin(), dirList.end(),
+ [&](const Zstring& shortname)
+ {
+ revisionDir(sourceDirPf + shortname, //throw FileError
+ relnamePf + shortname,
+ callback);
+ });
+
+ //delete source
+ RemoveCallbackImpl removeCallback(callback);
+ removeDirectory(sourceDir, &removeCallback); //throw FileError
+
+ callback.objectProcessed();
+ }
+}
+
+
+namespace
+{
+class TraverseVersionsOneLevel : public TraverseCallback
+{
+public:
+ TraverseVersionsOneLevel(std::vector<Zstring>& files, std::function<void()> updateUI) : files_(files), updateUI_(updateUI) {}
+
+private:
+ virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details) { files_.push_back(shortName); updateUI_(); }
+ virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) { files_.push_back(shortName); updateUI_(); return LINK_SKIP; }
+ virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName) { updateUI_(); return nullptr; } //DON'T traverse into subdirs
+ virtual HandleError onError(const std::wstring& msg) { throw FileError(msg); }
+
+ std::vector<Zstring>& files_;
+ std::function<void()> updateUI_;
+};
+}
+
+
+void FileVersioner::limitVersions(std::function<void()> updateUI) //throw FileError
+{
+ if (versionCountLimit_ < 0) //no limit!
+ return;
+
+ //buffer map "directory |-> list of immediate child file and symlink short names"
+ std::map<Zstring, std::vector<Zstring>, LessFilename> dirBuffer;
+
+ auto getVersionsBuffered = [&](const Zstring& dirname) -> const std::vector<Zstring>&
+ {
+ auto iter = dirBuffer.find(dirname);
+ if (iter != dirBuffer.end())
+ return iter->second;
+
+ std::vector<Zstring> fileShortNames;
+ TraverseVersionsOneLevel tol(fileShortNames, updateUI); //throw FileError
+ traverseFolder(dirname, tol);
+
+ auto& newEntry = dirBuffer[dirname]; //transactional behavior!!!
+ newEntry.swap(fileShortNames); //-> until C++11 emplace is available
+
+ return newEntry;
+ };
+
+ std::for_each(fileRelnames.begin(), fileRelnames.end(),
+ [&](const Zstring& relativeName) //e.g. "subdir\Sample.txt"
+ {
+ const Zstring fullname = appendSeparator(versioningDirectory_) + relativeName; //e.g. "D:\Revisions\subdir\Sample.txt"
+ const Zstring parentDir = beforeLast(fullname, FILE_NAME_SEPARATOR); //e.g. "D:\Revisions\subdir"
+ const Zstring shortname = afterLast(relativeName, FILE_NAME_SEPARATOR); //e.g. "Sample.txt"; returns the whole string if seperator not found
+
+ const std::vector<Zstring>& allVersions = getVersionsBuffered(parentDir);
+
+ //filter out only those versions that match the given relative name
+ std::vector<Zstring> matches; //e.g. "Sample.txt 2012-05-15 131513.txt"
+
+ std::copy_if(allVersions.begin(), allVersions.end(), std::back_inserter(matches),
+ [&](const Zstring& shortnameVer) { return impl::isMatchingVersion(shortname, shortnameVer); });
+
+ //take advantage of version naming convention to find oldest versions
+ if (matches.size() <= static_cast<size_t>(versionCountLimit_))
+ return;
+ std::nth_element(matches.begin(), matches.end() - versionCountLimit_, matches.end(), LessFilename()); //windows: ignore case!
+
+ //delete obsolete versions
+ std::for_each(matches.begin(), matches.end() - versionCountLimit_,
+ [&](const Zstring& shortnameVer)
+ {
+ updateUI();
+ const Zstring fullnameVer = parentDir + FILE_NAME_SEPARATOR + shortnameVer;
+ try
+ {
+ removeFile(fullnameVer); //throw FileError
+ }
+ catch (FileError&)
+ {
+#ifdef FFS_WIN //if it's a directory symlink:
+ if (symlinkExists(fullnameVer) && dirExists(fullnameVer))
+ removeDirectory(fullnameVer); //throw FileError
+ else
+#endif
+ throw;
+ }
+ });
+ });
+}
diff --git a/lib/versioning.h b/lib/versioning.h
new file mode 100644
index 00000000..36721edb
--- /dev/null
+++ b/lib/versioning.h
@@ -0,0 +1,85 @@
+// **************************************************************************
+// * 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 VERSIONING_HEADER_8760247652438056
+#define VERSIONING_HEADER_8760247652438056
+
+#include <vector>
+#include <functional>
+#include <zen/time.h>
+#include <zen/zstring.h>
+#include <zen/int64.h>
+#include <zen/file_error.h>
+
+namespace zen
+{
+struct CallbackMoveFile;
+
+//e.g. move C:\Source\subdir\Sample.txt -> D:\Revisions\subdir\Sample.txt 2012-05-15 131513.txt
+//scheme: <revisions directory>\<relpath>\<filename>.<ext> YYYY-MM-DD HHMMSS.<ext>
+/*
+ - ignores missing source files/dirs
+ - creates missing intermediate directories
+ - does not create empty directories
+ - handles symlinks
+ - ignores already existing target files/dirs (support retry)
+ => (unlikely) risk of data loss: race-condition if two FFS instances start at the very same second and process the same filename!!
+*/
+
+class FileVersioner
+{
+public:
+ FileVersioner(const Zstring& versioningDirectory, //throw FileError
+ const TimeComp& timeStamp,
+ int versionCountLimit) : //max versions per file; < 0 := no limit
+ versioningDirectory_(versioningDirectory),
+ timeStamp_(formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"), timeStamp)), //e.g. "2012-05-15 131513"
+ versionCountLimit_(versionCountLimit)
+ {
+ if (timeStamp_.size() != 17) //formatTime() returns empty string on error; unexpected length: e.g. problem in year 10000!
+ throw FileError(_("Failure to create time stamp for versioning:") + L" \'" + timeStamp_ + L"\'");
+ }
+
+ void revisionFile(const Zstring& sourceFile, const Zstring& relativeName, CallbackMoveFile& callback); //throw FileError
+ void revisionDir (const Zstring& sourceDir, const Zstring& relativeName, CallbackMoveFile& callback); //throw FileError
+
+ void limitVersions(std::function<void()> updateUI); //throw FileError; call when done revisioning!
+
+private:
+ const Zstring versioningDirectory_;
+ const Zstring timeStamp_;
+ const int versionCountLimit_;
+
+ std::vector<Zstring> fileRelnames; //store list of revisioned files and symlinks (relativeName) for limitVersions()
+};
+
+
+struct CallbackMoveFile
+{
+ virtual ~CallbackMoveFile() {} //see CallbackCopyFile for limitations when throwing exceptions!
+
+ virtual void onBeforeFileMove(const Zstring& fileFrom, const Zstring& fileTo) = 0; //one call before each (planned) move
+ virtual void onBeforeDirMove (const Zstring& dirFrom, const Zstring& dirTo ) = 0; //
+ virtual void objectProcessed() = 0; //one call after each completed move (count objects total)
+
+ //called frequently if move has to revert to copy + delete:
+ virtual void updateStatus(Int64 bytesDelta) = 0;
+};
+
+
+
+
+
+
+
+
+namespace impl //declare for unit tests:
+{
+bool isMatchingVersion(const Zstring& shortname, const Zstring& shortnameVersion);
+}
+}
+
+#endif //VERSIONING_HEADER_8760247652438056
diff --git a/lib/xml_base.cpp b/lib/xml_base.cpp
index db33059c..9aa069c7 100644
--- a/lib/xml_base.cpp
+++ b/lib/xml_base.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "xml_base.h"
diff --git a/lib/xml_base.h b/lib/xml_base.h
index b81b406d..5c0ec3c3 100644
--- a/lib/xml_base.h
+++ b/lib/xml_base.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef XMLBASE_H_INCLUDED
diff --git a/process_callback.h b/process_callback.h
index f67b4797..e9f0955e 100644
--- a/process_callback.h
+++ b/process_callback.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef PROC_HEADER_48257827842345454545
diff --git a/structures.cpp b/structures.cpp
index 7becbf55..5e0938ae 100644
--- a/structures.cpp
+++ b/structures.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "structures.h"
diff --git a/structures.h b/structures.h
index 58c157b9..8e7d1fd3 100644
--- a/structures.h
+++ b/structures.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FREEFILESYNC_H_INCLUDED
@@ -13,7 +13,6 @@
#include <zen/assert_static.h>
#include <zen/int64.h>
-
namespace zen
{
enum CompareVariant
@@ -72,20 +71,6 @@ enum CompareSymlinkResult
SYMLINK_CONFLICT = FILE_CONFLICT
};
-/*
-inline
-CompareFilesResult convertToFilesResult(CompareDirResult value)
-{
- return static_cast<CompareFilesResult>(value);
-}
-
-
-inline
-CompareFilesResult convertToFilesResult(CompareSymlinkResult value)
-{
- return static_cast<CompareFilesResult>(value);
-}
-*/
std::wstring getSymbol(CompareFilesResult cmpRes);
@@ -181,10 +166,10 @@ std::wstring getVariantName(DirectionConfig::Variant var);
struct CompConfig
{
- CompConfig(CompareVariant cmpVar,
- SymLinkHandling handleSyml) :
- compareVar(cmpVar),
- handleSymlinks(handleSyml) {}
+ //CompConfig(CompareVariant cmpVar,
+ // SymLinkHandling handleSyml) :
+ // compareVar(cmpVar),
+ // handleSymlinks(handleSyml) {}
CompConfig() :
compareVar(CMP_BY_TIME_SIZE),
@@ -204,39 +189,42 @@ bool operator==(const CompConfig& lhs, const CompConfig& rhs)
enum DeletionPolicy
{
- DELETE_PERMANENTLY = 5,
- MOVE_TO_RECYCLE_BIN,
- MOVE_TO_CUSTOM_DIRECTORY
+ DELETE_PERMANENTLY,
+ DELETE_TO_RECYCLER,
+ DELETE_TO_VERSIONING
};
struct SyncConfig
{
- SyncConfig(const DirectionConfig& directCfg,
- const DeletionPolicy handleDel,
- const Zstring& customDelDir) :
- directionCfg(directCfg),
- handleDeletion(handleDel),
- customDeletionDirectory(customDelDir) {}
+ //SyncConfig(const DirectionConfig& directCfg,
+ // const DeletionPolicy handleDel,
+ // const Zstring& versionDir) :
+ // directionCfg(directCfg),
+ // handleDeletion(handleDel),
+ // versioningDirectory(versionDir) {}
SyncConfig() : //construct with default values
- handleDeletion(MOVE_TO_RECYCLE_BIN) {}
+ handleDeletion(DELETE_TO_RECYCLER),
+ versionCountLimit(-1) {}
//sync direction settings
DirectionConfig directionCfg;
//misc options
DeletionPolicy handleDeletion; //use Recycle, delete permanently or move to user-defined location
- Zstring customDeletionDirectory;
+ Zstring versioningDirectory;
+ int versionCountLimit; //max versions per file (DELETE_TO_VERSIONING); < 0 := no limit
};
inline
bool operator==(const SyncConfig& lhs, const SyncConfig& rhs)
{
- return lhs.directionCfg == rhs.directionCfg &&
- lhs.handleDeletion == rhs.handleDeletion &&
- (lhs.handleDeletion != MOVE_TO_CUSTOM_DIRECTORY || //only compare deletion directory if required!
- lhs.customDeletionDirectory == rhs.customDeletionDirectory);
+ return lhs.directionCfg == rhs.directionCfg &&
+ lhs.handleDeletion == rhs.handleDeletion &&
+ (lhs.handleDeletion != DELETE_TO_VERSIONING || //only compare deletion directory if required!
+ (lhs.versioningDirectory == rhs.versioningDirectory &&
+ lhs.versionCountLimit == rhs.versionCountLimit));
}
diff --git a/synchronization.cpp b/synchronization.cpp
index 73e31e68..076111be 100644
--- a/synchronization.cpp
+++ b/synchronization.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "synchronization.h"
@@ -11,6 +11,7 @@
#include <wx/file.h> //get rid!?
#include <wx+/format_unit.h>
#include <zen/scope_guard.h>
+#include <zen/process_priority.h>
#include <zen/file_handling.h>
#include <zen/recycler.h>
#include "lib/resolve_path.h"
@@ -20,6 +21,7 @@
#include <zen/file_io.h>
#include <zen/time.h>
#include "lib/status_handler_impl.h"
+#include "lib/versioning.h"
#ifdef FFS_WIN
#include <zen/long_path_prefix.h>
@@ -258,6 +260,7 @@ void SyncStatistics::calcStats(const DirMapping& dirObj)
recurse(dirObj); //since we model logical stats, we recurse, even if deletion variant is "recycler" or "versioning + same volume", which is a single physical operation!
}
+//-----------------------------------------------------------------------------------------------------------
std::vector<zen::FolderPairSyncCfg> zen::extractSyncCfg(const MainConfiguration& mainCfg)
{
@@ -278,9 +281,9 @@ std::vector<zen::FolderPairSyncCfg> zen::extractSyncCfg(const MainConfiguration&
output.push_back(
FolderPairSyncCfg(syncCfg.directionCfg.var == DirectionConfig::AUTOMATIC,
syncCfg.handleDeletion,
- syncCfg.customDeletionDirectory));
+ getFormattedDirectoryName(syncCfg.versioningDirectory),
+ syncCfg.versionCountLimit));
}
-
return output;
}
//------------------------------------------------------------------------------------------------------------
@@ -415,58 +418,17 @@ private:
DeletionType delType;
};
*/
-//#################################################################################################################
-
-FolderPairSyncCfg::FolderPairSyncCfg(bool automaticMode,
- const DeletionPolicy handleDel,
- const Zstring& custDelDir) :
- inAutomaticMode(automaticMode),
- handleDeletion(handleDel),
- custDelFolder(zen::getFormattedDirectoryName(custDelDir)) {}
-//-----------------------------------------------------------------------------------------------------------
-/*
-add some postfix to alternate deletion directory: deletionDirectory\<prefix>2010-06-30 12-59-12\
-*/
-
-Zstring findUnusedName(const Zstring& filename)
-{
- //ensure that session directory does not yet exist (must be unique)
- Zstring output = filename;
- for (int i = 1; zen::somethingExists(output); ++i)
- output = filename + Zchar('_') + numberTo<Zstring>(i);
-
- return output;
-}
-
-SyncProcess::SyncProcess(const std::wstring& jobName,
- const std::wstring& timestamp,
- xmlAccess::OptionalDialogs& warnings,
- bool verifyCopiedFiles,
- bool copyLockedFiles,
- bool copyFilePermissions,
- bool transactionalFileCopy,
- bool runWithBackgroundPriority,
- ProcessCallback& handler) :
- verifyCopiedFiles_(verifyCopiedFiles),
- copyLockedFiles_(copyLockedFiles),
- copyFilePermissions_(copyFilePermissions),
- transactionalFileCopy_(transactionalFileCopy),
- m_warnings(warnings),
- procCallback(handler),
- custDelDirShortname(utfCvrtTo<Zstring>(jobName.empty() ? timestamp : jobName + L" " + timestamp))
-{
- if (runWithBackgroundPriority)
- procBackground.reset(new ScheduleForBackgroundProcessing);
-}
//--------------------------------------------------------------------------------------------------------------
class DeletionHandling //e.g. generate name of alternate deletion directory (unique for session AND folder pair)
{
public:
- DeletionHandling(DeletionPolicy handleDel,
- const Zstring& custDelDir, // final custom deletion directory: custDelDir + \ + subdirShort
- const Zstring& subdirShort, //
+ DeletionHandling(DeletionPolicy handleDel, //nothrow!
+ const Zstring& versioningDir,
+ const TimeComp& timeStamp,
+ int versionCountLimit,
+ size_t folderIndex,
const Zstring& baseDirPf, //with separator postfix
ProcessCallback& procCallback);
~DeletionHandling() { try { tryCleanup(); } catch (...) {} /*make sure this stays non-blocking!*/ } //always (try to) clean up, even if synchronization is aborted!
@@ -474,9 +436,9 @@ public:
//clean-up temporary directory (recycle bin optimization)
void tryCleanup(); //throw FileError -> call this in non-exceptional coding, i.e. somewhere after sync!
- void removeFile (const Zstring& relativeName) const; //throw FileError
- void removeFolder(const Zstring& relativeName) const { removeFolderInt(relativeName, nullptr, nullptr); }; //throw FileError
- void removeFolderUpdateStatistics(const Zstring& relativeName, int objectsExpected, Int64 dataExpected) const { removeFolderInt(relativeName, &objectsExpected, &dataExpected); }; //throw FileError
+ void removeFile (const Zstring& relativeName); //throw FileError
+ void removeFolder(const Zstring& relativeName) { removeFolderInt(relativeName, nullptr, nullptr); }; //throw FileError
+ void removeFolderUpdateStatistics(const Zstring& relativeName, int objectsExpected, Int64 dataExpected) { removeFolderInt(relativeName, &objectsExpected, &dataExpected); }; //throw FileError
//in contrast to "removeFolder()" this function will update statistics!
const std::wstring& getTxtRemovingFile () const { return txtRemovingFile; } //
@@ -490,15 +452,25 @@ public:
#endif
private:
- void removeFolderInt(const Zstring& relativeName, const int* objectsExpected, const Int64* dataExpected) const; //throw FileError
+ DeletionHandling(const DeletionHandling&);
+ DeletionHandling& operator=(const DeletionHandling&);
+ void removeFolderInt(const Zstring& relativeName, const int* objectsExpected, const Int64* dataExpected); //throw FileError
void setDeletionPolicy(DeletionPolicy newPolicy);
- ProcessCallback* const procCallback_; //always bound! need assignment operator => not a reference
+ FileVersioner& getOrCreateVersioner() //throw FileError! => dont create in DeletionHandling()!!!
+ {
+ if (!versioner.get())
+ versioner = make_unique<FileVersioner>(versioningDir_, timeStamp_, versionCountLimit_); //throw FileError
+ return *versioner;
+ };
+
+ ProcessCallback& procCallback_;
const Zstring baseDirPf_; //ends with path separator
- const Zstring custDelDir_;
- const Zstring recyclerTmpDirPf; //temporary folder to move files to, before moving whole folder to recycler (postfixed with file name separator)
- const Zstring versioningDirPf; //timestamped versioning folder
+ const Zstring versioningDir_;
+ const TimeComp timeStamp_;
+ const int versionCountLimit_;
+ Zstring recyclerTmpDirPf; //temporary folder to move files to, before moving whole folder to recycler (postfixed with file name separator)
#ifdef FFS_WIN
bool recFallbackDelPermantently;
@@ -506,6 +478,7 @@ private:
//magage three states: allow dynamic fallback from recycler to permanent deletion
DeletionPolicy deletionPolicy_;
+ std::unique_ptr<FileVersioner> versioner; //used for DELETE_TO_VERSIONING; throw FileError in constructor => create on demand!
//buffer status texts:
std::wstring txtRemovingFile;
@@ -516,31 +489,43 @@ private:
};
-DeletionHandling::DeletionHandling(DeletionPolicy handleDel,
- const Zstring& custDelDir, // final custom deletion directory: custDelDir + \ + subdirShort
- const Zstring& subdirShort, //
+DeletionHandling::DeletionHandling(DeletionPolicy handleDel, //nothrow!
+ const Zstring& versioningDir,
+ const TimeComp& timeStamp,
+ int versionCountLimit,
+ size_t folderIndex,
const Zstring& baseDirPf, //with separator postfix
ProcessCallback& procCallback) :
- procCallback_(&procCallback),
+ procCallback_(procCallback),
baseDirPf_(baseDirPf),
- custDelDir_(custDelDir),
- recyclerTmpDirPf(!baseDirPf_.empty() ? appendSeparator(findUnusedName(baseDirPf_ + Zstr("FFS ") + formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S")))) : Zstring()),
- versioningDirPf (!custDelDir.empty() ? appendSeparator(findUnusedName(appendSeparator(custDelDir) + subdirShort)) : Zstring()),
+ versioningDir_(versioningDir),
+ timeStamp_(timeStamp),
+ versionCountLimit_(versionCountLimit),
#ifdef FFS_WIN
recFallbackDelPermantently(false),
#endif
- deletionPolicy_(MOVE_TO_RECYCLE_BIN),
+ deletionPolicy_(DELETE_TO_RECYCLER),
cleanedUp(false)
{
#ifdef FFS_WIN
if (!baseDirPf.empty())
- if (handleDel == MOVE_TO_RECYCLE_BIN && recycleBinStatus(baseDirPf) != STATUS_REC_EXISTS)
+ if (handleDel == DELETE_TO_RECYCLER && recycleBinStatus(baseDirPf) != 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
+ //assemble temporary recycler bin directory
+ if (!baseDirPf_.empty())
+ {
+ Zstring tempDir = baseDirPf_ + Zstr("FFS ") + formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"), timeStamp);
+ if (folderIndex > 0)
+ tempDir += Zstr(" [") + numberTo<Zstring>(folderIndex + 1) + Zstr("]"); //e.g. C:\Source\FFS 2012-05-15 131513 [2]
+
+ recyclerTmpDirPf = appendSeparator(tempDir);
+ }
+
setDeletionPolicy(handleDel);
}
@@ -557,16 +542,16 @@ void DeletionHandling::setDeletionPolicy(DeletionPolicy newPolicy)
txtRemovingSymlink = _("Deleting symbolic link %x");
break;
- case MOVE_TO_RECYCLE_BIN:
+ case DELETE_TO_RECYCLER:
txtRemovingFile = _("Moving file %x to recycle bin" );
txtRemovingDirectory = _("Moving folder %x to recycle bin" );
txtRemovingSymlink = _("Moving symbolic link %x to recycle bin");
break;
- case MOVE_TO_CUSTOM_DIRECTORY:
- txtRemovingFile = replaceCpy(_("Moving file %x to %y" ), L"%y", fmtFileName(custDelDir_));
- txtRemovingDirectory = replaceCpy(_("Moving folder %x to %y" ), L"%y", fmtFileName(custDelDir_));
- txtRemovingSymlink = replaceCpy(_("Moving symbolic link %x to %y"), L"%y", fmtFileName(custDelDir_));
+ case DELETE_TO_VERSIONING:
+ txtRemovingFile = replaceCpy(_("Moving file %x to %y" ), L"%y", fmtFileName(versioningDir_));
+ txtRemovingDirectory = replaceCpy(_("Moving folder %x to %y" ), L"%y", fmtFileName(versioningDir_));
+ txtRemovingSymlink = replaceCpy(_("Moving symbolic link %x to %y"), L"%y", fmtFileName(versioningDir_));
break;
}
}
@@ -576,9 +561,25 @@ void DeletionHandling::tryCleanup() //throw FileError
{
if (!cleanedUp)
{
- if (deletionPolicy_ == MOVE_TO_RECYCLE_BIN) //clean-up temporary directory (recycle bin)
- if (!recyclerTmpDirPf.empty()) //empty folder input pair
- recycleOrDelete(beforeLast(recyclerTmpDirPf, FILE_NAME_SEPARATOR)); //throw FileError
+ switch (deletionPolicy_)
+ {
+ case DELETE_PERMANENTLY:
+ break;
+
+ case DELETE_TO_RECYCLER:
+ //clean-up temporary directory (recycle bin)
+ if (!recyclerTmpDirPf.empty()) //folder input pair may be empty
+ recycleOrDelete(beforeLast(recyclerTmpDirPf, FILE_NAME_SEPARATOR)); //throw FileError
+ break;
+
+ case DELETE_TO_VERSIONING:
+ if (versioner.get())
+ {
+ procCallback_.reportStatus(_("Removing old versions..."));
+ versioner->limitVersions([&] { procCallback_.requestUiRefresh(); }); //throw FileError
+ }
+ break;
+ }
cleanedUp = true;
}
@@ -587,18 +588,17 @@ void DeletionHandling::tryCleanup() //throw FileError
namespace
{
-class CallbackMoveFileImpl : public CallbackMoveFile //callback functionality
+class CallbackMoveFileImpl : public CallbackMoveFile
{
public:
CallbackMoveFileImpl(ProcessCallback& statusHandler,
- const DeletionHandling& delHandling,
int* objectsReported) :
statusHandler_ (statusHandler),
- delHandling_ (delHandling),
objectsReported_(objectsReported),
- txtMovingFile (_("Moving file %x to %y" )),
- txtMovingFolder (_("Moving folder %x to %y")) {}
+ txtMovingFile (_("Moving file %x to %y")),
+ txtMovingFolder (_("Moving folder %x to %y")) {}
+private:
virtual void onBeforeFileMove(const Zstring& fileFrom, const Zstring& fileTo) { reportStatus(txtMovingFile, fileFrom, fileTo); }
virtual void onBeforeDirMove (const Zstring& dirFrom, const Zstring& dirTo ) { reportStatus(txtMovingFolder, dirFrom, dirTo); }
virtual void objectProcessed() //one call after each processed move
@@ -618,14 +618,12 @@ public:
statusHandler_.requestUiRefresh();
}
-private:
- void reportStatus(const std::wstring& rawText, const Zstring& fileFrom, const Zstring& fileTo) const
+ void reportStatus(const std::wstring& statusText, const Zstring& fileFrom, const Zstring& fileTo) const
{
- statusHandler_.reportStatus(replaceCpy(replaceCpy(rawText, L"%x", fmtFileName(fileFrom)), L"%y", fmtFileName(fileTo)));
+ statusHandler_.reportStatus(replaceCpy(replaceCpy(statusText, L"%x", fmtFileName(fileFrom)), L"%y", fmtFileName(fileTo)));
};
ProcessCallback& statusHandler_;
- const DeletionHandling& delHandling_;
int* objectsReported_; //optional
const std::wstring txtMovingFile;
@@ -642,11 +640,11 @@ struct CallbackRemoveDirImpl : public CallbackRemoveDir
delHandling_(delHandling),
objectsReported_(objectsReported) {}
- virtual void notifyFileDeletion(const Zstring& filename) { processSingleObject(filename, delHandling_.getTxtRemovingFile()); }
- virtual void notifyDirDeletion (const Zstring& dirname ) { processSingleObject(dirname, delHandling_.getTxtRemovingDir ()); }
-
private:
- void processSingleObject(const Zstring& objName, const std::wstring& statusText)
+ virtual void notifyFileDeletion(const Zstring& filename) { processSingleObject(delHandling_.getTxtRemovingFile(), filename); }
+ virtual void notifyDirDeletion (const Zstring& dirname ) { processSingleObject(delHandling_.getTxtRemovingDir (), dirname ); }
+
+ void processSingleObject(const std::wstring& statusText, const Zstring& objName)
{
statusHandler_.reportStatus(replaceCpy(statusText, L"%x", fmtFileName(objName)));
@@ -664,7 +662,7 @@ private:
}
-void DeletionHandling::removeFile(const Zstring& relativeName) const
+void DeletionHandling::removeFile(const Zstring& relativeName)
{
const Zstring fullName = baseDirPf_ + relativeName;
@@ -672,10 +670,10 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const
{
case DELETE_PERMANENTLY:
zen::removeFile(fullName);
- //[!] resolve nameclash!
+ //[!] scope specifier resolves nameclash!
break;
- case MOVE_TO_RECYCLE_BIN:
+ case DELETE_TO_RECYCLER:
{
const Zstring targetFile = recyclerTmpDirPf + relativeName; //ends with path separator
@@ -687,7 +685,7 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const
}
catch (FileError&)
{
- if (fileExists(fullName))
+ if (somethingExists(fullName)) //no file at all is not an error (however a directory is *not* expected!)
try
{
const Zstring targetDir = beforeLast(targetFile, FILE_NAME_SEPARATOR);
@@ -707,53 +705,34 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const
}
break;
- case MOVE_TO_CUSTOM_DIRECTORY:
+ case DELETE_TO_VERSIONING:
{
- CallbackMoveFileImpl callBack(*procCallback_, *this, nullptr); //we do *not* report statistics in this method
- const Zstring targetFile = versioningDirPf + relativeName; //ends with path separator
-
- try //... to get away cheaply!
- {
- moveFile(fullName, targetFile, &callBack); //throw FileError
- }
- catch (FileError&)
- {
- if (fileExists(fullName))
- {
- const Zstring targetDir = beforeLast(targetFile, FILE_NAME_SEPARATOR);
- if (!dirExists(targetDir))
- {
- makeDirectory(targetDir); //throw FileError
- moveFile(fullName, targetFile, &callBack); //throw FileError -> this should work now!
- }
- else
- throw;
- }
- }
+ CallbackMoveFileImpl callback(procCallback_, nullptr); //we do *not* report statistics in this method
+ getOrCreateVersioner().revisionFile(fullName, relativeName, callback); //throw FileError
}
break;
}
}
-void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* objectsExpected, const Int64* dataExpected) const //throw FileError
+void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* objectsExpected, const Int64* dataExpected) //throw FileError
{
const Zstring fullName = baseDirPf_ + relativeName;
int objectsReported = 0; //use *only* if "objectsExpected" is bound!
//in error situation: undo communication of processed amount of data
- ScopeGuard guardStatistics = makeGuard([&] { procCallback_->updateProcessedData(-objectsReported, 0); });
+ ScopeGuard guardStatistics = makeGuard([&] { procCallback_.updateProcessedData(-objectsReported, 0); });
switch (deletionPolicy_)
{
case DELETE_PERMANENTLY:
{
- CallbackRemoveDirImpl remDirCallback(*procCallback_, *this, objectsExpected ? &objectsReported : nullptr);
+ CallbackRemoveDirImpl remDirCallback(procCallback_, *this, objectsExpected ? &objectsReported : nullptr);
removeDirectory(fullName, &remDirCallback);
}
break;
- case MOVE_TO_RECYCLE_BIN:
+ case DELETE_TO_RECYCLER:
{
const Zstring targetDir = recyclerTmpDirPf + relativeName;
@@ -765,7 +744,7 @@ void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* o
}
catch (FileError&)
{
- if (dirExists(fullName))
+ if (somethingExists(fullName))
try
{
const Zstring targetSuperDir = beforeLast(targetDir, FILE_NAME_SEPARATOR);
@@ -786,34 +765,15 @@ void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* o
if (objectsExpected) //even though we have only one disk access, we completed "objectsExpected" logical operations!
{
- procCallback_->updateProcessedData(*objectsExpected, 0);
+ procCallback_.updateProcessedData(*objectsExpected, 0);
objectsReported += *objectsExpected;
}
break;
- case MOVE_TO_CUSTOM_DIRECTORY:
+ case DELETE_TO_VERSIONING:
{
- CallbackMoveFileImpl callBack(*procCallback_, *this, objectsExpected ? &objectsReported : nullptr);
- const Zstring targetDir = versioningDirPf + relativeName;
-
- try //... to get away cheaply!
- {
- moveDirectory(fullName, targetDir, &callBack); //throw FileError
- }
- catch (FileError&)
- {
- if (dirExists(fullName))
- {
- const Zstring targetSuperDir = beforeLast(targetDir, FILE_NAME_SEPARATOR);
- if (!dirExists(targetSuperDir))
- {
- makeDirectory(targetSuperDir); //throw FileError
- moveDirectory(fullName, targetDir, &callBack); //throw FileError -> this should work now!
- }
- else
- throw;
- }
- }
+ CallbackMoveFileImpl callback(procCallback_, objectsExpected ? &objectsReported : nullptr);
+ getOrCreateVersioner().revisionDir(fullName, relativeName, callback); //throw FileError
}
break;
}
@@ -824,7 +784,7 @@ void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* o
guardStatistics.dismiss();
if (*objectsExpected != objectsReported || *dataExpected != 0) //adjust total: may have changed after comparison!
- procCallback_->updateTotalData(objectsReported - *objectsExpected, -*dataExpected);
+ procCallback_.updateTotalData(objectsReported - *objectsExpected, -*dataExpected);
}
}
@@ -836,15 +796,15 @@ bool DeletionHandling::deletionFreesSpace() const
{
case DELETE_PERMANENTLY:
return true;
- case MOVE_TO_RECYCLE_BIN:
+ case DELETE_TO_RECYCLER:
return false; //in general... (unless Recycle Bin is full)
- case MOVE_TO_CUSTOM_DIRECTORY:
- switch (zen::onSameVolume(baseDirPf_, versioningDirPf))
+ case DELETE_TO_VERSIONING:
+ switch (zen::onSameVolume(baseDirPf_, versioningDir_))
{
case IS_SAME_YES:
return false;
case IS_SAME_NO:
- return true; //but other volume (sessionDelDir) may become full...
+ return true; //but other volume (versioningDir) may become full...
case IS_SAME_CANT_SAY:
return true; //a rough guess!
}
@@ -852,8 +812,8 @@ bool DeletionHandling::deletionFreesSpace() const
assert(false);
return true;
}
-//------------------------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------------------------------
namespace
{
@@ -952,8 +912,8 @@ public:
#ifdef FFS_WIN
shadow::ShadowCopy* shadowCopyHandler,
#endif
- const DeletionHandling& delHandlingLeft,
- const DeletionHandling& delHandlingRight) :
+ DeletionHandling& delHandlingLeft,
+ DeletionHandling& delHandlingRight) :
procCallback_(procCallback),
#ifdef FFS_WIN
shadowCopyHandler_(shadowCopyHandler),
@@ -1002,14 +962,14 @@ private:
template <PassId pass>
void runPass(HierarchyObject& hierObj);
- void synchronizeFile(FileMapping& fileObj) const;
- template <SelectedSide side> void synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp) const;
+ void synchronizeFile(FileMapping& fileObj);
+ template <SelectedSide side> void synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp);
- void synchronizeLink(SymLinkMapping& linkObj) const;
- template <SelectedSide sideTrg> void synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp) const;
+ void synchronizeLink(SymLinkMapping& linkObj);
+ template <SelectedSide sideTrg> void synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp);
- void synchronizeFolder(DirMapping& dirObj) const;
- template <SelectedSide sideTrg> void synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp) const;
+ void synchronizeFolder(DirMapping& dirObj);
+ template <SelectedSide sideTrg> void synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp);
void reportInfo (const std::wstring& rawText, const Zstring& objname) const { procCallback_.reportInfo (replaceCpy(rawText, L"%x", fmtFileName(objname))); };
void reportStatus(const std::wstring& rawText, const Zstring& objname) const { procCallback_.reportStatus(replaceCpy(rawText, L"%x", fmtFileName(objname))); };
@@ -1020,14 +980,14 @@ private:
void verifyFileCopy(const Zstring& source, const Zstring& target) const;
template <SelectedSide side>
- const DeletionHandling& getDelHandling() const;
+ DeletionHandling& getDelHandling();
ProcessCallback& procCallback_;
#ifdef FFS_WIN
shadow::ShadowCopy* shadowCopyHandler_; //optional!
#endif
- const DeletionHandling& delHandlingLeft_;
- const DeletionHandling& delHandlingRight_;
+ DeletionHandling& delHandlingLeft_;
+ DeletionHandling& delHandlingRight_;
const bool verifyCopiedFiles_;
const bool copyFilePermissions_;
@@ -1047,10 +1007,10 @@ private:
namespace zen
{
template <> inline
-const DeletionHandling& SynchronizeFolderPair::getDelHandling<LEFT_SIDE>() const { return delHandlingLeft_; }
+DeletionHandling& SynchronizeFolderPair::getDelHandling<LEFT_SIDE>() { return delHandlingLeft_; }
template <> inline
-const DeletionHandling& SynchronizeFolderPair::getDelHandling<RIGHT_SIDE>() const { return delHandlingRight_; }
+DeletionHandling& SynchronizeFolderPair::getDelHandling<RIGHT_SIDE>() { return delHandlingRight_; }
}
@@ -1458,7 +1418,7 @@ bool getTargetDirection(SyncOperation syncOp, SelectedSide* side)
inline
-void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
+void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj)
{
const SyncOperation syncOp = fileObj.getSyncOperation();
@@ -1475,7 +1435,7 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
template <SelectedSide sideTrg>
-void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp) const
+void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperation syncOp)
{
static const SelectedSide sideSrc = OtherSide<sideTrg>::result;
@@ -1611,7 +1571,7 @@ void SynchronizeFolderPair::synchronizeFileInt(FileMapping& fileObj, SyncOperati
inline
-void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
+void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj)
{
const SyncOperation syncOp = linkObj.getSyncOperation();
@@ -1628,7 +1588,7 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
template <SelectedSide sideTrg>
-void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp) const
+void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOperation syncOp)
{
static const SelectedSide sideSrc = OtherSide<sideTrg>::result;
@@ -1735,7 +1695,7 @@ void SynchronizeFolderPair::synchronizeLinkInt(SymLinkMapping& linkObj, SyncOper
inline
-void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
+void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj)
{
const SyncOperation syncOp = dirObj.getSyncOperation();
@@ -1752,7 +1712,7 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
template <SelectedSide sideTrg>
-void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp) const
+void SynchronizeFolderPair::synchronizeFolderInt(DirMapping& dirObj, SyncOperation syncOp)
{
static const SelectedSide sideSrc = OtherSide<sideTrg>::result;
@@ -1860,9 +1820,23 @@ struct LessDependentDirectory : public std::binary_function<Zstring, Zstring, bo
}
-void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCfg>& syncConfig, FolderComparison& folderCmp)
+void zen::synchronize(const TimeComp& timeStamp,
+ xmlAccess::OptionalDialogs& warnings,
+ bool verifyCopiedFiles,
+ bool copyLockedFiles,
+ bool copyFilePermissions,
+ bool transactionalFileCopy,
+ bool runWithBackgroundPriority,
+ const std::vector<FolderPairSyncCfg>& syncConfig,
+ FolderComparison& folderCmp,
+ ProcessCallback& callback)
{
- //prevent shutdown while synchronization is in progress
+ //specify process and resource handling priorities
+ std::unique_ptr<ScheduleForBackgroundProcessing> backgroundPrio;
+ if (runWithBackgroundPriority)
+ backgroundPrio.reset(new ScheduleForBackgroundProcessing);
+
+ //prevent operating system going into sleep state
PreventStandby dummy;
(void)dummy;
@@ -1875,38 +1849,40 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
const SyncStatistics statisticsTotal(folderCmp);
//keep at beginning so that all gui elements are initialized properly
- procCallback.initNewPhase(getCUD(statisticsTotal),
- statisticsTotal.getDataToProcess(),
- ProcessCallback::PHASE_SYNCHRONIZING);
+ callback.initNewPhase(getCUD(statisticsTotal),
+ statisticsTotal.getDataToProcess(),
+ ProcessCallback::PHASE_SYNCHRONIZING);
std::deque<bool> skipFolderPair(folderCmp.size()); //folder pairs may be skipped after fatal errors were found
//initialize deletion handling: already required when checking for warnings
- FixedList<std::pair<DeletionHandling, DeletionHandling>> delHandler;
+ FixedList<DeletionHandling> delHandlerL; //we can't use a FixedList<std::pair<>> because DeletionHandling is not copy-constructable
+ FixedList<DeletionHandling> delHandlerR;
for (auto j = begin(folderCmp); j != end(folderCmp); ++j)
{
const size_t folderIndex = j - folderCmp.begin();
const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex];
- const Zstring subDirShort = folderCmp.size() <= 1 ? custDelDirShortname : custDelDirShortname + Zstr(" (") + numberTo<Zstring>(folderIndex + 1) + Zstr(")");
- //e.g. "SyncJob 2012-05-15 131513 (1)" -> enforce different custom deletion dir when using multiple folder pairs!!!
-
- delHandler.emplace_back(DeletionHandling(folderPairCfg.handleDeletion,
- folderPairCfg.custDelFolder,
- subDirShort,
- j->getBaseDirPf<LEFT_SIDE>(),
- procCallback),
-
- DeletionHandling(folderPairCfg.handleDeletion,
- folderPairCfg.custDelFolder,
- subDirShort,
- j->getBaseDirPf<RIGHT_SIDE>(),
- procCallback));
+ delHandlerL.emplace_back(folderPairCfg.handleDeletion,
+ folderPairCfg.versioningFolder,
+ timeStamp,
+ folderPairCfg.versionCountLimit_,
+ folderIndex,
+ j->getBaseDirPf<LEFT_SIDE>(),
+ callback);
+
+ delHandlerR.emplace_back(folderPairCfg.handleDeletion,
+ folderPairCfg.versioningFolder,
+ timeStamp,
+ folderPairCfg.versionCountLimit_,
+ folderIndex,
+ j->getBaseDirPf<RIGHT_SIDE>(),
+ callback);
}
- //-------------------execute basic all at once before starting sync--------------------------------------
+ //-------------------execute basic checks all at once before starting sync--------------------------------------
auto dependentDir = [](const Zstring& lhs, const Zstring& rhs) //note: this is NOT an equivalence relation!
{
@@ -1949,8 +1925,9 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
//start checking folder pairs
{
- auto iterDelHandler = delHandler.cbegin();
- for (auto j = begin(folderCmp); j != end(folderCmp); ++j, ++iterDelHandler)
+ 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);
@@ -1984,7 +1961,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
if ((j->getBaseDirPf<LEFT_SIDE >().empty() && (writeLeft || folderPairCfg.inAutomaticMode)) ||
(j->getBaseDirPf<RIGHT_SIDE>().empty() && (writeRight || folderPairCfg.inAutomaticMode)))
{
- procCallback.reportFatalError(_("Target folder input field must not be empty."));
+ callback.reportFatalError(_("Target folder input field must not be empty."));
skipFolderPair[folderIndex] = true;
continue;
}
@@ -2016,12 +1993,12 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
if (folderPairStat.getUpdate() + folderPairStat.getDelete() > 0 &&
- folderPairCfg.handleDeletion == zen::MOVE_TO_CUSTOM_DIRECTORY)
+ folderPairCfg.handleDeletion == zen::DELETE_TO_VERSIONING)
{
//check if user-defined directory for deletion was specified
- if (folderPairCfg.custDelFolder.empty()) //already trimmed by getFormattedDirectoryName()
+ if (folderPairCfg.versioningFolder.empty()) //already trimmed by getFormattedDirectoryName()
{
- procCallback.reportFatalError(_("Folder input field for versioning must not be empty."));
+ callback.reportFatalError(_("Folder input field for versioning must not be empty."));
skipFolderPair[folderIndex] = true;
continue;
}
@@ -2042,7 +2019,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
{
if (!wasExisting) //avoid race-condition: we need to evaluate existence status from time of comparison!
{
- procCallback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtFileName(baseDirPf)));
+ callback.reportFatalError(replaceCpy(_("Source folder %x not found."), L"%x", fmtFileName(baseDirPf)));
skipFolderPair[folderIndex] = true;
return false;
}
@@ -2072,23 +2049,23 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
catch (FileError&) {}
};
const std::pair<Int64, Int64> spaceNeeded = DiskSpaceNeeded::calculate(*j,
- iterDelHandler->first .deletionFreesSpace(),
- iterDelHandler->second.deletionFreesSpace());
+ iterDelHandlerL->deletionFreesSpace(),
+ iterDelHandlerR->deletionFreesSpace());
checkSpace(j->getBaseDirPf<LEFT_SIDE >(), spaceNeeded.first);
checkSpace(j->getBaseDirPf<RIGHT_SIDE>(), spaceNeeded.second);
#ifdef FFS_WIN
//windows: check if recycle bin really exists; if not, Windows will silently delete, which is wrong
- if (folderPairCfg.handleDeletion == MOVE_TO_RECYCLE_BIN)
+ if (folderPairCfg.handleDeletion == DELETE_TO_RECYCLER)
{
if (folderPairStat.getUpdate<LEFT_SIDE>() +
folderPairStat.getDelete<LEFT_SIDE>() > 0 &&
- iterDelHandler->first.recyclerFallbackOnDelete())
+ iterDelHandlerL->recyclerFallbackOnDelete())
recyclMissing.insert(j->getBaseDirPf<LEFT_SIDE>());
if (folderPairStat.getUpdate<RIGHT_SIDE>() +
folderPairStat.getDelete<RIGHT_SIDE>() > 0 &&
- iterDelHandler->second.recyclerFallbackOnDelete())
+ iterDelHandlerR->recyclerFallbackOnDelete())
recyclMissing.insert(j->getBaseDirPf<RIGHT_SIDE>());
}
#endif
@@ -2111,7 +2088,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
warningMessage += _("You can ignore conflicts and continue synchronization.");
- procCallback.reportWarning(warningMessage, m_warnings.warningUnresolvedConflicts);
+ callback.reportWarning(warningMessage, warnings.warningUnresolvedConflicts);
}
@@ -2127,7 +2104,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
warningMessage += L"\n\n";
warningMessage += _("More than 50% of the total number of files will be copied or deleted!");
- procCallback.reportWarning(warningMessage, m_warnings.warningSignificantDifference);
+ callback.reportWarning(warningMessage, warnings.warningSignificantDifference);
}
@@ -2142,7 +2119,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
_("Required:") + L" " + filesizeToShortString(i->second.first) + L"\n" +
_("Available:") + L" " + filesizeToShortString(i->second.second);
- procCallback.reportWarning(warningMessage, m_warnings.warningNotEnoughDiskSpace);
+ callback.reportWarning(warningMessage, warnings.warningNotEnoughDiskSpace);
}
@@ -2156,7 +2133,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
std::for_each(recyclMissing.begin(), recyclMissing.end(),
[&](const Zstring& path) { warningMessage += L"\n" + utfCvrtTo<std::wstring>(path); });
- procCallback.reportWarning(warningMessage, m_warnings.warningRecyclerMissing);
+ callback.reportWarning(warningMessage, warnings.warningRecyclerMissing);
}
#endif
@@ -2175,21 +2152,22 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
std::wstring warningMessage = _("A folder will be modified which is part of multiple folder pairs. Please review synchronization settings.") + L"\n";
for (auto i = conflictDirs.begin(); i != conflictDirs.end(); ++i)
warningMessage += L"\n" + fmtFileName(*i);
- procCallback.reportWarning(warningMessage, m_warnings.warningMultiFolderWriteAccess);
+ callback.reportWarning(warningMessage, warnings.warningMultiFolderWriteAccess);
}
//-------------------end of basic checks------------------------------------------
#ifdef FFS_WIN
//shadow copy buffer: per sync-instance, not folder pair
- std::unique_ptr<shadow::ShadowCopy> shadowCopyHandler(copyLockedFiles_ ? new shadow::ShadowCopy : nullptr);
+ std::unique_ptr<shadow::ShadowCopy> shadowCopyHandler(copyLockedFiles ? new shadow::ShadowCopy : nullptr);
#endif
try
{
//loop through all directory pairs
- auto iterDelHandler = delHandler.begin();
- for (auto j = begin(folderCmp); j != end(folderCmp); ++j, ++iterDelHandler)
+ auto iterDelHandlerL = delHandlerL.begin();
+ auto iterDelHandlerR = delHandlerR.begin();
+ for (auto j = begin(folderCmp); j != end(folderCmp); ++j, ++iterDelHandlerL, ++iterDelHandlerR)
{
//exclude some pathological case (leftdir, rightdir are empty)
if (EqualFilename()(j->getBaseDirPf<LEFT_SIDE>(), j->getBaseDirPf<RIGHT_SIDE>()))
@@ -2201,9 +2179,9 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
std::wstring right = _("Right") + L": ";
makeSameLength(left, right);
- procCallback.reportInfo(_("Synchronize folder pair:") + L"\n" +
- L" " + left + fmtFileName(j->getBaseDirPf<LEFT_SIDE >()) + L"\n" +
- L" " + right + fmtFileName(j->getBaseDirPf<RIGHT_SIDE>()));
+ callback.reportInfo(_("Synchronizing folder pair:") + L"\n" +
+ L" " + left + fmtFileName(j->getBaseDirPf<LEFT_SIDE >()) + L"\n" +
+ L" " + right + fmtFileName(j->getBaseDirPf<RIGHT_SIDE>()));
//------------------------------------------------------------------------------------------
const size_t folderIndex = j - begin(folderCmp);
@@ -2223,9 +2201,9 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
//just convenience: exit sync right here instead of showing tons of error messages during file copy
return tryReportingError([&]
{
- if (!dirExistsUpdating(dirname, false, procCallback))
+ if (!dirExistsUpdating(dirname, false, callback))
throw FileError(replaceCpy(_("Cannot find folder %x."), L"%x", fmtFileName(dirname))); //this should really be a "fatal error"
- }, procCallback); //may throw in error-callback!
+ }, callback); //may throw in error-callback!
}
else //create target directory: user presumably ignored error "dir existing" in order to have it created automatically
{
@@ -2241,7 +2219,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
{
//TEMPORARY network drop: base directory not found during comparison, but reappears during synchronization
//=> sync-directions are based on false assumptions! Abort.
- procCallback.reportFatalError(replaceCpy(_("Target folder %x already existing."), L"%x", fmtFileName(baseDirPf)));
+ callback.reportFatalError(replaceCpy(_("Target folder %x already existing."), L"%x", fmtFileName(baseDirPf)));
temporaryNetworkDrop = true;
//Is it possible we're catching a "false-positive" here, could FFS have created the directory indirectly after comparison?
@@ -2249,7 +2227,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
// 2. deletion handling: versioning -> "
// 3. log file creates containing folder -> no, log only created in batch mode, and only *before* comparison
}
- }, procCallback); //may throw in error-callback!
+ }, callback); //may throw in error-callback!
return rv && !temporaryNetworkDrop;
}
}
@@ -2276,36 +2254,38 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
bool copyPermissionsFp = false;
tryReportingError([&]
{
- copyPermissionsFp = copyFilePermissions_ && //copy permissions only if asked for and supported by *both* sides!
+ copyPermissionsFp = copyFilePermissions && //copy permissions only if asked for and supported by *both* sides!
+ !j->getBaseDirPf<LEFT_SIDE >().empty() && //scenario: directory selected on one side only
+ !j->getBaseDirPf<RIGHT_SIDE>().empty() && //
supportsPermissions(beforeLast(j->getBaseDirPf<LEFT_SIDE >(), FILE_NAME_SEPARATOR)) && //throw FileError
supportsPermissions(beforeLast(j->getBaseDirPf<RIGHT_SIDE>(), FILE_NAME_SEPARATOR));
- }, procCallback); //show error dialog if necessary
+ }, callback); //show error dialog if necessary
- SynchronizeFolderPair syncFP(procCallback, verifyCopiedFiles_, copyPermissionsFp, transactionalFileCopy_,
+ SynchronizeFolderPair syncFP(callback, verifyCopiedFiles, copyPermissionsFp, transactionalFileCopy,
#ifdef FFS_WIN
shadowCopyHandler.get(),
#endif
- iterDelHandler->first, iterDelHandler->second);
+ *iterDelHandlerL, *iterDelHandlerR);
syncFP.startSync(*j);
- //(try to gracefully) cleanup temporary folders (Recycle bin optimization) -> will be done in ~DeletionHandling anyway...
- tryReportingError([&] { iterDelHandler->first .tryCleanup(); }, procCallback); //show error dialog if necessary
- tryReportingError([&] { iterDelHandler->second.tryCleanup(); }, procCallback); //
+ //(try to gracefully) cleanup temporary Recycle bin folders and versioning -> will be done in ~DeletionHandling anyway...
+ tryReportingError([&] { iterDelHandlerL->tryCleanup(); }, callback); //show error dialog if necessary
+ tryReportingError([&] { iterDelHandlerR->tryCleanup(); }, callback); //
//(try to gracefully) write database file (will be done in ~EnforceUpdateDatabase anyway...)
if (folderPairCfg.inAutomaticMode)
{
- procCallback.reportStatus(_("Generating database..."));
- procCallback.forceUiRefresh();
+ callback.reportStatus(_("Generating database..."));
+ callback.forceUiRefresh();
- tryReportingError([&] { zen::saveLastSynchronousState(*j); }, procCallback); //throw FileError
+ tryReportingError([&] { zen::saveLastSynchronousState(*j); }, callback); //throw FileError
guardUpdateDb.dismiss();
}
}
}
catch (const std::exception& e)
{
- procCallback.reportFatalError(utfCvrtTo<std::wstring>(e.what()));
+ callback.reportFatalError(utfCvrtTo<std::wstring>(e.what()));
}
}
@@ -2314,7 +2294,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
//callback functionality for smooth progress indicators
template <class DelTargetCommand>
-class WhileCopying : public zen::CallbackCopyFile //callback functionality
+class WhileCopying : public zen::CallbackCopyFile
{
public:
WhileCopying(Int64& bytesReported,
@@ -2420,15 +2400,12 @@ void SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, const
//--------------------- data verification -------------------------
-
-//callback functionality for status updates while verifying
struct VerifyCallback
{
virtual ~VerifyCallback() {}
virtual void updateStatus() = 0;
};
-
void verifyFiles(const Zstring& source, const Zstring& target, VerifyCallback& callback) // throw (FileError)
{
static std::vector<char> memory1(1024 * 1024); //1024 kb seems to be a reasonable buffer size
diff --git a/synchronization.h b/synchronization.h
index 78cd8a61..104ab03d 100644
--- a/synchronization.h
+++ b/synchronization.h
@@ -1,13 +1,13 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SYNCHRONIZATION_H_INCLUDED
#define SYNCHRONIZATION_H_INCLUDED
-#include <zen/process_priority.h>
+#include <zen/time.h>
#include "file_hierarchy.h"
#include "lib/process_xml.h"
#include "process_callback.h"
@@ -38,7 +38,7 @@ public:
const ConflictTexts& getConflictMessages() const { return conflictMsgs; }
Int64 getDataToProcess() const { return dataToProcess; }
- size_t getRowCount() const { return rowsTotal; }
+ size_t getRowCount() const { return rowsTotal; }
private:
//static const size_t MAX_CONFLICTS = 3;
@@ -60,72 +60,38 @@ private:
};
-class SynchronizeFolderPair;
-
struct FolderPairSyncCfg
{
FolderPairSyncCfg(bool automaticMode,
const DeletionPolicy handleDel,
- const Zstring& custDelDir);
+ const Zstring& versioningDirFmt,
+ int versionCountLimit) :
+ inAutomaticMode(automaticMode),
+ handleDeletion(handleDel),
+ versioningFolder(versioningDirFmt),
+ versionCountLimit_(versionCountLimit) {}
bool inAutomaticMode; //update database if in automatic mode
DeletionPolicy handleDeletion;
- Zstring custDelFolder; //formatted(!) directory name
+ Zstring versioningFolder; //formatted directory name
+ int versionCountLimit_;
};
std::vector<FolderPairSyncCfg> extractSyncCfg(const MainConfiguration& mainCfg);
+class SynchronizeFolderPair;
-//class handling synchronization process
-class SyncProcess
-{
-public:
- SyncProcess(const std::wstring& jobName, //may be empty
- const std::wstring& timestamp,
- xmlAccess::OptionalDialogs& warnings,
- bool verifyCopiedFiles,
- bool copyLockedFiles,
- bool copyFilePermissions,
- bool transactionalFileCopy,
- bool runWithBackgroundPriority,
- ProcessCallback& handler);
-
- //CONTRACT: syncConfig must have SAME SIZE as folderCmp and correspond row-wise!
- void startSynchronizationProcess(const std::vector<FolderPairSyncCfg>& syncConfig, FolderComparison& folderCmp);
-
-private:
- SyncProcess(const SyncProcess&);
- SyncProcess& operator=(const SyncProcess&);
-
- friend class SynchronizeFolderPair;
-
- const bool verifyCopiedFiles_;
- const bool copyLockedFiles_;
- const bool copyFilePermissions_;
- const bool transactionalFileCopy_;
-
- //warnings
- xmlAccess::OptionalDialogs& m_warnings;
- ProcessCallback& procCallback;
-
- std::unique_ptr<ScheduleForBackgroundProcessing> procBackground;
- const Zstring custDelDirShortname; //e.g. "SyncJob 2012-05-15 131513"
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+//FFS core routine:
+void synchronize(const TimeComp& timeStamp,
+ xmlAccess::OptionalDialogs& warnings,
+ bool verifyCopiedFiles,
+ bool copyLockedFiles,
+ bool copyFilePermissions,
+ bool transactionalFileCopy,
+ bool runWithBackgroundPriority,
+
+ const std::vector<FolderPairSyncCfg>& syncConfig, //CONTRACT: syncConfig and folderCmp correspond row-wise!
+ FolderComparison& folderCmp, //
+ ProcessCallback& callback);
diff --git a/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj b/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj
new file mode 100644
index 00000000..f3dfcd23
--- /dev/null
+++ b/ui/IFileDialog_Vista/IFileDialog_Vista.vcxproj
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="dll_main.cpp" />
+ <ClCompile Include="ifile_dialog.cpp" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="ifile_dialog.h" />
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{70394AEF-5897-4911-AFA1-82EAF0581EFA}</ProjectGuid>
+ <RootNamespace>ShadowDll</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>Windows7.1SDK</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>Windows7.1SDK</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>Windows7.1SDK</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>Windows7.1SDK</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">OBJ\$(ProjectName)_$(Configuration)_$(Platform)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">IFileDialog_Vista_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">IFileDialog_Vista_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">IFileDialog_Vista_$(Platform)</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">IFileDialog_Vista_$(Platform)</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <BuildLog>
+ <Path>$(IntDir)Build.html</Path>
+ </BuildLog>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ <DisableSpecificWarnings>4100</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ProfileGuidedDatabase>
+ </ProfileGuidedDatabase>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <BuildLog>
+ <Path>$(IntDir)Build.html</Path>
+ </BuildLog>
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4100</DisableSpecificWarnings>
+ <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
+ <SubSystem>Windows</SubSystem>
+ <ProfileGuidedDatabase>
+ </ProfileGuidedDatabase>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ <AdditionalLibraryDirectories></AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <BuildLog>
+ <Path>$(IntDir)Build.html</Path>
+ </BuildLog>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4100</DisableSpecificWarnings>
+ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <ProfileGuidedDatabase>
+ </ProfileGuidedDatabase>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX86</TargetMachine>
+ <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <BuildLog>
+ <Path>$(IntDir)Build.html</Path>
+ </BuildLog>
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;IFILE_DIALOG_VISTA_DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <WarningLevel>Level4</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4100</DisableSpecificWarnings>
+ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
+ <AdditionalIncludeDirectories>../..</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <SubSystem>Windows</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
+ <ProfileGuidedDatabase>
+ </ProfileGuidedDatabase>
+ <ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ <AdditionalLibraryDirectories></AdditionalLibraryDirectories>
+ </Link>
+ </ItemDefinitionGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/ui/IFileDialog_Vista/dll_main.cpp b/ui/IFileDialog_Vista/dll_main.cpp
new file mode 100644
index 00000000..95d14910
--- /dev/null
+++ b/ui/IFileDialog_Vista/dll_main.cpp
@@ -0,0 +1,25 @@
+// **************************************************************************
+// * 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 *
+// **************************************************************************
+
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+//optional: add init/teardown logic here
+BOOL APIENTRY DllMain(HINSTANCE hinstDLL,
+ DWORD fdwReason,
+ LPVOID lpvReserved)
+{
+ switch (fdwReason)
+ {
+ case DLL_PROCESS_ATTACH:
+ case DLL_PROCESS_DETACH:
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ break;
+ }
+ return TRUE;
+}
diff --git a/ui/IFileDialog_Vista/ifile_dialog.cpp b/ui/IFileDialog_Vista/ifile_dialog.cpp
new file mode 100644
index 00000000..dd2bc7c8
--- /dev/null
+++ b/ui/IFileDialog_Vista/ifile_dialog.cpp
@@ -0,0 +1,98 @@
+// **************************************************************************
+// * 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 *
+// **************************************************************************
+
+#include "ifile_dialog.h"
+#define WIN32_LEAN_AND_MEAN
+#include <zen/com_error.h>
+#include <zen/com_ptr.h>
+#include <Shobjidl.h>
+#include <zen/scope_guard.h>
+#include <string>
+
+using namespace zen;
+
+
+namespace
+{
+bool showFolderPickerImpl(HWND ownerWindow, //throw ComError; return "false" if cancelled by user
+ const wchar_t* defaultFolder, //optional!
+ std::wstring& selectedFolder)
+{
+ ComPtr<IFileDialog> fileDlg;
+ ZEN_CHECK_COM(::CoCreateInstance(CLSID_FileOpenDialog, //throw ComError
+ nullptr,
+ CLSCTX_ALL,
+ IID_PPV_ARGS(fileDlg.init())));
+
+ FILEOPENDIALOGOPTIONS dlgOptions = 0;
+ ZEN_CHECK_COM(fileDlg->GetOptions(&dlgOptions)); //throw ComError
+ ZEN_CHECK_COM(fileDlg->SetOptions(dlgOptions | FOS_PICKFOLDERS | FOS_NOVALIDATE | FOS_FORCEFILESYSTEM));
+
+ if (defaultFolder) //show last selection instead of top level if no default available
+ {
+ ComPtr<IShellItem> folderItem;
+ ZEN_CHECK_COM(::SHCreateItemFromParsingName(defaultFolder,
+ nullptr,
+ IID_PPV_ARGS(folderItem.init())));
+ ZEN_CHECK_COM(fileDlg->SetFolder(folderItem.get()));
+ }
+
+ try
+ {
+ ZEN_CHECK_COM(fileDlg->Show(ownerWindow)); //may fail with: HRESULT_FROM_WIN32(ERROR_CANCELLED)
+ }
+ catch (const ComError&) { return false; }
+
+ ComPtr<IShellItem> folderItem;
+ ZEN_CHECK_COM(fileDlg->GetResult(folderItem.init()));
+
+ LPWSTR folderPath = nullptr;
+ ZEN_CHECK_COM(folderItem->GetDisplayName(SIGDN_FILESYSPATH, &folderPath));
+ ZEN_ON_SCOPE_EXIT(::CoTaskMemFree(folderPath));
+
+ selectedFolder = folderPath;
+ return true;
+}
+
+const wchar_t* allocString(const std::wstring& msg) //ownership passed
+{
+ auto tmp = new wchar_t [msg.size() + 1]; //bad_alloc ?
+ ::wmemcpy(tmp, msg.c_str(), msg.size() + 1); //include 0-termination
+ return tmp;
+}
+}
+
+//##################################################################################################
+
+void ifile::showFolderPicker(void* ownerWindow,
+ const wchar_t* defaultFolder,
+ const wchar_t*& selectedFolder,
+ bool& cancelled,
+ const wchar_t*& errorMsg)
+{
+ selectedFolder = nullptr;
+ cancelled = false;
+ errorMsg = nullptr;
+
+ try
+ {
+ std::wstring folderPath;
+ if (showFolderPickerImpl(static_cast<HWND>(ownerWindow), defaultFolder, folderPath)) //throw ComError
+ selectedFolder = allocString(folderPath);
+ else
+ cancelled = true;
+ }
+ catch (const ComError& e)
+ {
+ errorMsg = allocString(e.toString());
+ }
+}
+
+
+void ifile::freeString(const wchar_t* str)
+{
+ delete [] str;
+}
diff --git a/ui/IFileDialog_Vista/ifile_dialog.h b/ui/IFileDialog_Vista/ifile_dialog.h
new file mode 100644
index 00000000..87a67625
--- /dev/null
+++ b/ui/IFileDialog_Vista/ifile_dialog.h
@@ -0,0 +1,61 @@
+// **************************************************************************
+// * 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 IFILE_DIALOG_HEADER_916743921746324
+#define IFILE_DIALOG_HEADER_916743921746324
+
+#ifdef IFILE_DIALOG_VISTA_DLL_EXPORTS
+#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllexport)
+#else
+#define DLL_FUNCTION_DECLARATION extern "C" __declspec(dllimport)
+#endif
+
+#include <zen/build_info.h>
+
+
+namespace ifile
+{
+/*--------------
+ |declarations|
+ --------------*/
+
+//COM needs to be initialized before calling any of these functions! CoInitializeEx/CoUninitialize
+//Requires Windows Vista and later
+
+DLL_FUNCTION_DECLARATION
+void showFolderPicker(void* ownerWindow, //in; ==HWND
+ const wchar_t* defaultFolder, //in, optional!
+ const wchar_t*& selectedFolder, //out: call freeString() after use!
+ bool& cancelled, //out
+ const wchar_t*& errorMsg); //out, optional: call freeString() after use!
+
+DLL_FUNCTION_DECLARATION
+void freeString(const wchar_t* str);
+
+/*----------
+ |typedefs|
+ ----------*/
+typedef bool (*FunType_showFolderPicker)(void* ownerWindow,
+ const wchar_t* defaultFolder,
+ const wchar_t*& selectedFolder,
+ bool& cancelled,
+ const wchar_t*& errorMsg);
+typedef void (*FunType_freeString)(const wchar_t* str);
+
+/*--------------
+ |symbol names|
+ --------------*/
+//(use const pointers to ensure internal linkage)
+const char funName_showFolderPicker[] = "showFolderPicker";
+const char funName_freeString [] = "freeString";
+
+/*---------------
+ |library names|
+ ---------------*/
+inline const wchar_t* getDllName() { return zen::is64BitBuild ? L"IFileDialog_Vista_x64.dll" : L"IFileDialog_Vista_Win32.dll"; }
+}
+
+#endif //IFILE_DIALOG_HEADER_916743921746324
diff --git a/ui/Taskbar_Seven/dll_main.cpp b/ui/Taskbar_Seven/dll_main.cpp
index 46c65311..95d14910 100644
--- a/ui/Taskbar_Seven/dll_main.cpp
+++ b/ui/Taskbar_Seven/dll_main.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
diff --git a/ui/Taskbar_Seven/taskbar.cpp b/ui/Taskbar_Seven/taskbar.cpp
index 6c1365a4..32a858b1 100644
--- a/ui/Taskbar_Seven/taskbar.cpp
+++ b/ui/Taskbar_Seven/taskbar.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "taskbar.h"
diff --git a/ui/Taskbar_Seven/taskbar.h b/ui/Taskbar_Seven/taskbar.h
index 6a46aad3..1f9f7bb3 100644
--- a/ui/Taskbar_Seven/taskbar.h
+++ b/ui/Taskbar_Seven/taskbar.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TASKBAR_SEVEN_DLL_H
@@ -51,17 +51,17 @@ void getLastError(wchar_t* buffer, size_t bufferSize);
/*----------
|typedefs|
----------*/
-typedef bool (*SetStatusFct )(void* hwnd, TaskBarStatus status);
-typedef bool (*SetProgressFct )(void* hwnd, size_t current, size_t total);
-typedef void (*GetLastErrorFct)(wchar_t* buffer, size_t bufferSize);
+typedef bool (*FunType_setStatus )(void* hwnd, TaskBarStatus status);
+typedef bool (*FunType_setProgress )(void* hwnd, size_t current, size_t total);
+typedef void (*FunType_getLastError)(wchar_t* buffer, size_t bufferSize);
/*--------------
|symbol names|
--------------*/
//(use const pointers to ensure internal linkage)
-const char setStatusFctName [] = "setStatus";
-const char setProgressFctName [] = "setProgress";
-const char getLastErrorFctName[] = "getLastError";
+const char funName_setStatus [] = "setStatus";
+const char funName_setProgress [] = "setProgress";
+const char funName_getLastError[] = "getLastError";
/*---------------
|library names|
diff --git a/ui/batch_config.cpp b/ui/batch_config.cpp
index 059996e8..c6d50bd2 100644
--- a/ui/batch_config.cpp
+++ b/ui/batch_config.cpp
@@ -1,25 +1,26 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "batch_config.h"
-#include <wx+/dir_picker.h>
-#include "folder_pair.h"
#include <iterator>
+#include <wx/filedlg.h>
+#include <wx/msgdlg.h>
#include <wx/wupdlock.h>
+#include <wx+/button.h>
+#include <wx+/choice_enum.h>
+#include <wx+/mouse_move_dlg.h>
#include <wx+/context_menu.h>
-#include "../lib/help_provider.h"
#include <zen/file_handling.h>
+#include "../lib/help_provider.h"
+#include "folder_pair.h"
#include "msg_popup.h"
#include "gui_generated.h"
-#include <wx/msgdlg.h>
-#include <wx+/button.h>
-#include <wx+/choice_enum.h>
-#include <wx+/mouse_move_dlg.h>
using namespace zen;
+using namespace xmlAccess;
class DirectoryPairBatchFirst;
class DirectoryPairBatch;
@@ -27,14 +28,14 @@ class DirectoryPairBatch;
class BatchDialog: public BatchDlgGenerated
{
- // friend class BatchFileDropEvent;
template <class GuiPanel>
friend class FolderPairCallback;
+ friend class DirectoryPairBatchFirst;
public:
BatchDialog(wxWindow* parent,
const wxString& referenceFile,
- const xmlAccess::XmlBatchConfig& batchCfg,
+ const XmlBatchConfig& batchCfg,
const std::shared_ptr<FolderHistory>& folderHistLeft,
const std::shared_ptr<FolderHistory>& folderHistRight,
std::vector<std::wstring>& onCompletionHistory,
@@ -46,11 +47,10 @@ private:
virtual void OnConfigureFilter(wxCommandEvent& event);
virtual void OnHelp (wxCommandEvent& event) { displayHelpEntry(L"html/Schedule a Batch Job.html"); }
- void OnCompSettingsContext(wxCommandEvent& event);
- void OnSyncSettingsContext(wxCommandEvent& event);
- void OnGlobalFilterContext(wxCommandEvent& event);
+ virtual void OnCompSettingsContext(wxCommandEvent& event);
+ virtual void OnSyncSettingsContext(wxCommandEvent& event);
+ virtual void OnGlobalFilterContext(wxCommandEvent& event);
virtual void OnCheckSaveLog (wxCommandEvent& event);
- virtual void OnChangeMaxLogCountTxt(wxCommandEvent& event);
virtual void OnClose (wxCloseEvent& event) { EndModal(0); }
virtual void OnCancel (wxCommandEvent& event) { EndModal(0); }
virtual void OnSaveBatchJob (wxCommandEvent& event);
@@ -60,6 +60,13 @@ private:
virtual void OnRemoveTopFolderPair (wxCommandEvent& event);
void OnFilesDropped(FileDropEvent& event);
+ virtual void OnErrorPopup (wxCommandEvent& event) { localBatchCfg.handleError = ON_ERROR_POPUP; updateGui(); }
+ virtual void OnErrorIgnore(wxCommandEvent& event) { localBatchCfg.handleError = ON_ERROR_IGNORE; updateGui(); }
+ virtual void OnErrorExit (wxCommandEvent& event) { localBatchCfg.handleError = ON_ERROR_EXIT; updateGui(); }
+
+ virtual void OnToggleGenerateLogfile(wxCommandEvent& event) { updateGui(); }
+ virtual void OnToggleLogfilesLimit (wxCommandEvent& event) { updateGui(); }
+
void addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront = false);
void removeAddFolderPair(int pos);
void clearAddFolderPairs();
@@ -68,17 +75,12 @@ private:
void updateGui(); //re-evaluate gui after config changes
- //error handling
- //xmlAccess::OnError getSelectionHandleError() const; -> obsolete, use getEnumVal()
- void setSelectionHandleError(xmlAccess::OnError value);
- void OnChangeErrorHandling(wxCommandEvent& event);
-
bool saveBatchFile(const wxString& filename);
void loadBatchFile(const wxString& filename);
void loadBatchFile(const std::vector<wxString>& filenames);
- void setConfig(const xmlAccess::XmlBatchConfig& batchCfg);
- xmlAccess::XmlBatchConfig getConfig() const;
+ void setConfig(const XmlBatchConfig& batchCfg);
+ XmlBatchConfig getConfig() const;
std::unique_ptr<DirectoryPairBatchFirst> firstFolderPair; //always bound!!!
std::vector<DirectoryPairBatch*> additionalFolderPairs;
@@ -86,16 +88,12 @@ private:
//used when saving batch file
wxString proposedBatchFileName;
- xmlAccess::XmlBatchConfig localBatchCfg;
-
- std::unique_ptr<DirectoryName<FolderHistoryBox>> logfileDir;
+ XmlBatchConfig localBatchCfg; //a mixture of settings some of which have OWNERSHIP WITHIN GUI CONTROLS! use getConfig() to resolve
- zen::EnumDescrList<xmlAccess::OnError> enumDescrMap;
+ std::unique_ptr<DirectoryName<FolderHistoryBox>> logfileDir; //always bound, solve circular compile-time dependency
const std::shared_ptr<FolderHistory> folderHistLeft_;
const std::shared_ptr<FolderHistory> folderHistRight_;
- std::vector<std::wstring>& onCompletionHistory_;
- size_t onCompletionHistoryMax_;
};
//###################################################################################################################################
@@ -124,25 +122,13 @@ public:
batchDlg(batchDialog) {}
private:
- virtual wxWindow* getParentWindow()
- {
- return &batchDlg;
- }
+ virtual wxWindow* getParentWindow() { return &batchDlg; }
- virtual MainConfiguration getMainConfig() const
- {
- return batchDlg.getConfig().mainCfg;
- }
+ virtual MainConfiguration getMainConfig() const { return batchDlg.getConfig().mainCfg; }
- virtual void OnAltCompCfgChange()
- {
- batchDlg.updateGui();
- }
+ virtual void OnAltCompCfgChange() { batchDlg.updateGui(); }
- virtual void OnAltSyncCfgChange()
- {
- batchDlg.updateGui();
- }
+ virtual void OnAltSyncCfgChange() { batchDlg.updateGui(); }
virtual void removeAltCompCfg()
{
@@ -170,8 +156,8 @@ public:
DirectoryPairBatch(wxWindow* parent, BatchDialog& batchDialog) :
BatchFolderPairGenerated(parent),
FolderPairCallback<BatchFolderPairGenerated>(static_cast<BatchFolderPairGenerated&>(*this), batchDialog), //pass BatchFolderPairGenerated part...
- dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft),
- dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {}
+ dirNameLeft (*m_panelLeft, *m_buttonSelectDirLeft, *m_directoryLeft),
+ dirNameRight(*m_panelRight, *m_buttonSelectDirRight, *m_directoryRight) {}
void setValues(const wxString& leftDir,
const wxString& rightDir,
@@ -201,10 +187,10 @@ public:
//prepare drag & drop
dirNameLeft(*batchDialog.m_panelLeft,
- *batchDialog.m_dirPickerLeft,
+ *batchDialog.m_buttonSelectDirLeft,
*batchDialog.m_directoryLeft),
dirNameRight(*batchDialog.m_panelRight,
- *batchDialog.m_dirPickerRight,
+ *batchDialog.m_buttonSelectDirRight,
*batchDialog.m_directoryRight) {}
void setValues(const wxString& leftDir,
@@ -230,36 +216,27 @@ private:
BatchDialog::BatchDialog(wxWindow* parent,
const wxString& referenceFile,
- const xmlAccess::XmlBatchConfig& batchCfg,
+ const XmlBatchConfig& batchCfg,
const std::shared_ptr<FolderHistory>& folderHistLeft,
const std::shared_ptr<FolderHistory>& folderHistRight,
std::vector<std::wstring>& onCompletionHistory,
size_t onCompletionHistoryMax) :
BatchDlgGenerated(parent),
folderHistLeft_(folderHistLeft),
- folderHistRight_(folderHistRight),
- onCompletionHistory_(onCompletionHistory),
- onCompletionHistoryMax_(onCompletionHistoryMax)
+ folderHistRight_(folderHistRight)
{
m_directoryLeft ->init(folderHistLeft_);
m_directoryRight->init(folderHistRight_);
+ m_comboBoxExecFinished->initHistory(onCompletionHistory, onCompletionHistoryMax);
#ifdef FFS_WIN
new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
-
wxWindowUpdateLocker dummy(this); //avoid display distortion
- enumDescrMap.
- add(xmlAccess::ON_ERROR_POPUP , _("Show pop-up") , _("Show pop-up on errors or warnings")).
- add(xmlAccess::ON_ERROR_IGNORE, _("Ignore errors") , _("Hide all error and warning messages")).
- add(xmlAccess::ON_ERROR_EXIT , _("Exit instantly"), _("Abort synchronization immediately"));
-
-
- m_bpButtonCmpConfig->SetBitmapLabel(GlobalResources::getImage(wxT("cmpConfig")));
- m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::getImage(wxT("syncConfig")));
-
- m_bpButtonHelp->SetBitmapLabel(GlobalResources::getImage(wxT("help")));
+ m_bpButtonCmpConfig ->SetBitmapLabel(GlobalResources::getImage(L"cmpConfig"));
+ m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::getImage(L"syncConfig"));
+ m_bpButtonHelp ->SetBitmapLabel(GlobalResources::getImage(L"help"));
//init handling of first folder pair
firstFolderPair.reset(new DirectoryPairBatchFirst(*this));
@@ -272,11 +249,11 @@ BatchDialog::BatchDialog(wxWindow* parent,
setupFileDrop(*this);
Connect(EVENT_DROP_FILE, FileDropEventHandler(BatchDialog::OnFilesDropped), nullptr, this);
- logfileDir.reset(new DirectoryName<FolderHistoryBox>(*m_panelBatchSettings, *m_dirPickerLogfileDir, *m_comboBoxLogfileDir));
+ logfileDir.reset(new DirectoryName<FolderHistoryBox>(*m_panelBatchSettings, *m_buttonSelectLogfileDir, *m_comboBoxLogfileDir));
//set icons for this dialog
- m_bpButtonAddPair->SetBitmapLabel(GlobalResources::getImage(wxT("addFolderPair")));
- m_bitmap27->SetBitmap(GlobalResources::getImage(wxT("batch")));
+ m_bpButtonAddPair->SetBitmapLabel(GlobalResources::getImage(L"addFolderPair"));
+ m_bitmap27->SetBitmap(GlobalResources::getImage(L"batch"));
m_buttonSave->SetFocus();
@@ -291,53 +268,30 @@ BatchDialog::BatchDialog(wxWindow* parent,
//------------------- error handling --------------------------
-void BatchDialog::setSelectionHandleError(xmlAccess::OnError value)
-{
- // if (m_checkBoxSilent->GetValue())
- setEnumVal(enumDescrMap, *m_choiceHandleError, value);
- /* else
- {
- EnumDescrList<xmlAccess::OnError> tmp(enumDescrMap);
- tmp.descrList.pop_back(); //remove "Exit instantly" -> this option shall be available for silent mode only!
- setEnumVal(tmp, *m_choiceHandleError, value);
- }
- */
-}
-
-void BatchDialog::OnChangeErrorHandling(wxCommandEvent& event)
-{
- updateTooltipEnumVal(enumDescrMap, *m_choiceHandleError);
-}
-
-
void BatchDialog::OnCmpSettings(wxCommandEvent& event)
{
//show window right next to the compare-config button
//wxPoint windowPos = m_bpButtonCmpConfig->GetScreenPosition();
//windowPos.x += m_bpButtonCmpConfig->GetSize().GetWidth() + 5;
- if (zen::showCompareCfgDialog(this,localBatchCfg.mainCfg.cmpConfig) == ReturnSmallDlg::BUTTON_OKAY)
- {
+ if (zen::showCompareCfgDialog(this, localBatchCfg.mainCfg.cmpConfig) == ReturnSmallDlg::BUTTON_OKAY)
updateGui();
- }
}
void BatchDialog::OnSyncSettings(wxCommandEvent& event)
{
- ExecWhenFinishedCfg ewfCfg = { &localBatchCfg.mainCfg.onCompletion,
- &onCompletionHistory_,
- onCompletionHistoryMax_
- };
+ //ExecWhenFinishedCfg ewfCfg = { &localBatchCfg.mainCfg.onCompletion,
+ // &onCompletionHistory_,
+ // onCompletionHistoryMax_
+ // };
if (showSyncConfigDlg(this,
localBatchCfg.mainCfg.cmpConfig.compareVar,
localBatchCfg.mainCfg.syncCfg,
nullptr,
- &ewfCfg) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter
- {
+ nullptr) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter
updateGui();
- }
}
@@ -346,19 +300,16 @@ void BatchDialog::OnConfigureFilter(wxCommandEvent& event)
if (showFilterDialog(this,
true, //is main filter dialog
localBatchCfg.mainCfg.globalFilter) == ReturnSmallDlg::BUTTON_OKAY)
- {
updateGui();
- }
}
void BatchDialog::updateGui() //re-evaluate gui after config changes
{
- xmlAccess::XmlBatchConfig cfg = getConfig();
-
- //showNotebookpage(m_panelLogging, _("Logging"), cfg.silent);
+ XmlBatchConfig cfg = getConfig();
- m_panelLogfile->Enable(cfg.logFileCountMax > 0);
+ m_panelLogfile ->Enable(m_checkBoxGenerateLogfile->GetValue());
+ m_spinCtrlLogfileLimit->Enable(m_checkBoxGenerateLogfile->GetValue() && m_checkBoxLogfilesLimit->GetValue());
//update compare variant name
m_staticTextCmpVariant->SetLabel(cfg.mainCfg.getCompVariantName());
@@ -378,6 +329,22 @@ void BatchDialog::updateGui() //re-evaluate gui after config changes
m_bpButtonFilter->SetToolTip(_("No filter selected"));
}
+ m_toggleBtnErrorIgnore->SetValue(false);
+ m_toggleBtnErrorPopup ->SetValue(false);
+ m_toggleBtnErrorExit ->SetValue(false);
+ switch (cfg.handleError)
+ {
+ case ON_ERROR_IGNORE:
+ m_toggleBtnErrorIgnore->SetValue(true);
+ break;
+ case ON_ERROR_POPUP:
+ m_toggleBtnErrorPopup->SetValue(true);
+ break;
+ case ON_ERROR_EXIT:
+ m_toggleBtnErrorExit->SetValue(true);
+ break;
+ }
+
m_panelOverview->Layout (); //adjust stuff inside scrolled window
m_panelOverview->Refresh(); //refresh filter button (if nothing else)
}
@@ -448,12 +415,6 @@ void BatchDialog::OnCheckSaveLog(wxCommandEvent& event)
}
-void BatchDialog::OnChangeMaxLogCountTxt(wxCommandEvent& event)
-{
- updateGui();
-}
-
-
void BatchDialog::OnFilesDropped(FileDropEvent& event)
{
loadBatchFile(event.getFiles());
@@ -537,26 +498,29 @@ void BatchDialog::OnLoadBatchJob(wxCommandEvent& event)
inline
-FolderPairEnh getEnhancedPair(const DirectoryPairBatch* panel)
+FolderPairEnh getPairCfg(const DirectoryPairBatch& panel)
{
- return FolderPairEnh(toZ(panel->getLeftDir()),
- toZ(panel->getRightDir()),
- panel->getAltCompConfig(),
- panel->getAltSyncConfig(),
- panel->getAltFilterConfig());
+ return FolderPairEnh(toZ(panel.getLeftDir()),
+ toZ(panel.getRightDir()),
+ panel.getAltCompConfig(),
+ panel.getAltSyncConfig(),
+ panel.getAltFilterConfig());
}
bool BatchDialog::saveBatchFile(const wxString& filename)
{
- const xmlAccess::XmlBatchConfig batchCfg = getConfig();
+ const XmlBatchConfig batchCfg = getConfig();
+
+ //a good place to commit current "on completion" history item
+ m_comboBoxExecFinished->addItemHistory();
//write config to XML
try
{
- xmlAccess::writeConfig(batchCfg, toZ(filename));
+ writeConfig(batchCfg, toZ(filename));
}
- catch (const xmlAccess::FfsXmlError& error)
+ catch (const FfsXmlError& error)
{
wxMessageBox(error.toString().c_str(), _("Error"), wxOK | wxICON_ERROR, this);
return false;
@@ -583,17 +547,17 @@ void BatchDialog::loadBatchFile(const std::vector<wxString>& filenames)
return;
//load XML settings
- xmlAccess::XmlBatchConfig batchCfg; //structure to receive gui settings
+ XmlBatchConfig batchCfg; //structure to receive gui settings
try
{
//open a *.ffs_gui or *.ffs_batch file!
- xmlAccess::convertConfig(toZ(filenames), batchCfg); //throw FfsXmlError
+ convertConfig(toZ(filenames), batchCfg); //throw FfsXmlError
- //xmlAccess::readConfig(filename, batchCfg);
+ //readConfig(filename, batchCfg);
}
- catch (const xmlAccess::FfsXmlError& error)
+ catch (const FfsXmlError& error)
{
- if (error.getSeverity() == xmlAccess::FfsXmlError::WARNING)
+ if (error.getSeverity() == FfsXmlError::WARNING)
wxMessageBox(error.toString(), _("Warning"), wxOK | wxICON_WARNING, this);
else
{
@@ -615,20 +579,23 @@ void BatchDialog::loadBatchFile(const std::vector<wxString>& filenames)
}
-void BatchDialog::setConfig(const xmlAccess::XmlBatchConfig& batchCfg)
+void BatchDialog::setConfig(const XmlBatchConfig& batchCfg)
{
wxWindowUpdateLocker dummy(this); //avoid display distortion
- //make working copy
- localBatchCfg = batchCfg;
+ localBatchCfg = batchCfg; //contains some parameters not owned by GUI controls
- m_checkBoxShowProgress->SetValue(batchCfg.showProgress);
+ //transfer parameter ownership to GUI
- //error handling is dependent from m_checkBoxShowProgress! /|\ \|/
- setSelectionHandleError(batchCfg.handleError);
+ m_checkBoxShowProgress->SetValue(batchCfg.showProgress);
+ logfileDir->setName(utfCvrtTo<wxString>(batchCfg.logFileDirectory));
+ m_comboBoxExecFinished->setValue(batchCfg.mainCfg.onCompletion);
- logfileDir->setName(batchCfg.logFileDirectory);
- m_spinCtrlLogCountMax->SetValue(static_cast<int>(batchCfg.logFileCountMax)); //attention: this one emits a "change value" event!! => updateGui() called implicitly!
+ //map single parameter "logfiles limit" to all three checkboxs and spin ctrl:
+ m_checkBoxGenerateLogfile->SetValue(batchCfg.logfilesCountLimit != 0);
+ m_checkBoxLogfilesLimit ->SetValue(batchCfg.logfilesCountLimit >= 0);
+ m_spinCtrlLogfileLimit ->SetValue(batchCfg.logfilesCountLimit >= 0 ? batchCfg.logfilesCountLimit : 100 /*XmlBatchConfig().logfilesCountLimit*/);
+ //attention: emits a "change value" event!! => updateGui() called implicitly!
//set first folder pair
firstFolderPair->setValues(toWx(batchCfg.mainCfg.firstPair.leftDirectory),
@@ -637,10 +604,8 @@ void BatchDialog::setConfig(const xmlAccess::XmlBatchConfig& batchCfg)
batchCfg.mainCfg.firstPair.altSyncConfig,
batchCfg.mainCfg.firstPair.localFilter);
- //remove existing additional folder pairs
- clearAddFolderPairs();
-
//set additional pairs
+ clearAddFolderPairs();
addFolderPair(batchCfg.mainCfg.additionalPairs);
updateGui(); //re-evaluate gui after config changes
@@ -651,9 +616,9 @@ void BatchDialog::setConfig(const xmlAccess::XmlBatchConfig& batchCfg)
}
-xmlAccess::XmlBatchConfig BatchDialog::getConfig() const
+XmlBatchConfig BatchDialog::getConfig() const
{
- xmlAccess::XmlBatchConfig batchCfg = localBatchCfg;
+ XmlBatchConfig batchCfg = localBatchCfg;
//load parameter with ownership within wxWidgets controls...
@@ -663,18 +628,17 @@ xmlAccess::XmlBatchConfig BatchDialog::getConfig() const
firstFolderPair->getAltCompConfig(),
firstFolderPair->getAltSyncConfig(),
firstFolderPair->getAltFilterConfig());
-
//add additional pairs
batchCfg.mainCfg.additionalPairs.clear();
std::transform(additionalFolderPairs.begin(), additionalFolderPairs.end(),
- std::back_inserter(batchCfg.mainCfg.additionalPairs), getEnhancedPair);
-
+ std::back_inserter(batchCfg.mainCfg.additionalPairs), [](const DirectoryPairBatch* dp) { return getPairCfg(*dp); });
//load structure with batch settings "batchCfg"
batchCfg.showProgress = m_checkBoxShowProgress->GetValue();
- batchCfg.logFileDirectory = logfileDir->getName();
- batchCfg.logFileCountMax = m_spinCtrlLogCountMax->GetValue();
- batchCfg.handleError = getEnumVal(enumDescrMap, *m_choiceHandleError);
+ batchCfg.logFileDirectory = utfCvrtTo<Zstring>(logfileDir->getName());
+ batchCfg.mainCfg.onCompletion = m_comboBoxExecFinished->getValue();
+ //get single parameter "logfiles limit" from all three checkboxes and spin ctrl:
+ batchCfg.logfilesCountLimit = m_checkBoxGenerateLogfile->GetValue() ? (m_checkBoxLogfilesLimit->GetValue() ? m_spinCtrlLogfileLimit->GetValue() : -1) : 0;
return batchCfg;
}
@@ -720,7 +684,7 @@ void BatchDialog::OnRemoveTopFolderPair(wxCommandEvent& event)
if (!additionalFolderPairs.empty())
{
//get settings from second folder pair
- const FolderPairEnh cfgSecond = getEnhancedPair(additionalFolderPairs[0]);
+ const FolderPairEnh cfgSecond = getPairCfg(*additionalFolderPairs[0]);
//reset first pair
firstFolderPair->setValues(toWx(cfgSecond.leftDirectory),
@@ -743,21 +707,14 @@ void BatchDialog::updateGuiForFolderPair()
m_bpButtonRemovePair->Show();
//adapt local filter and sync cfg for first folder pair
- if (additionalFolderPairs.empty() &&
- firstFolderPair->getAltCompConfig().get() == nullptr &&
- firstFolderPair->getAltSyncConfig().get() == nullptr &&
- isNullFilter(firstFolderPair->getAltFilterConfig()))
- {
- m_bpButtonAltCompCfg ->Hide();
- m_bpButtonLocalFilter->Hide();
- m_bpButtonAltSyncCfg ->Hide();
- }
- else
- {
- m_bpButtonAltCompCfg ->Show();
- m_bpButtonLocalFilter->Show();
- m_bpButtonAltSyncCfg ->Show();
- }
+ const bool showLocalCfgFirstPair = !additionalFolderPairs.empty() ||
+ firstFolderPair->getAltCompConfig().get() != nullptr ||
+ firstFolderPair->getAltSyncConfig().get() != nullptr ||
+ !isNullFilter(firstFolderPair->getAltFilterConfig());
+
+ m_bpButtonAltCompCfg ->Show(showLocalCfgFirstPair);
+ m_bpButtonAltSyncCfg ->Show(showLocalCfgFirstPair);
+ m_bpButtonLocalFilter->Show(showLocalCfgFirstPair);
//update controls
const int maxAddFolderPairsVisible = 2;
@@ -866,7 +823,7 @@ void BatchDialog::clearAddFolderPairs()
void zen::showSyncBatchDlg(wxWindow* parent,
const wxString& referenceFile,
- const xmlAccess::XmlBatchConfig& batchCfg,
+ const XmlBatchConfig& batchCfg,
const std::shared_ptr<FolderHistory>& folderHistLeft,
const std::shared_ptr<FolderHistory>& folderHistRight,
std::vector<std::wstring>& execFinishedhistory,
diff --git a/ui/batch_config.h b/ui/batch_config.h
index 04f0bf04..e448fba4 100644
--- a/ui/batch_config.h
+++ b/ui/batch_config.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef BATCHCONFIG_H_INCLUDED
diff --git a/ui/batch_status_handler.cpp b/ui/batch_status_handler.cpp
index baab3ed3..0fa3d01d 100644
--- a/ui/batch_status_handler.cpp
+++ b/ui/batch_status_handler.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "batch_status_handler.h"
@@ -27,6 +27,7 @@ class FindLogfiles : public TraverseCallback
public:
FindLogfiles(const Zstring& prefix, std::vector<Zstring>& logfiles) : prefix_(prefix), logfiles_(logfiles) {}
+private:
virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details)
{
const Zstring fileName(shortName);
@@ -37,9 +38,8 @@ public:
virtual std::shared_ptr<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 onError (const std::wstring& errorText) { return ON_ERROR_IGNORE; } //errors are not really critical in this context
+ virtual HandleError onError (const std::wstring& msg) { return ON_ERROR_IGNORE; } //errors are not really critical in this context
-private:
const Zstring prefix_;
std::vector<Zstring>& logfiles_;
};
@@ -48,16 +48,16 @@ private:
void limitLogfileCount(const Zstring& logdir, const std::wstring& jobname, size_t maxCount) //throw()
{
std::vector<Zstring> logFiles;
- FindLogfiles traverseCallback(toZ(jobname), logFiles);
+ FindLogfiles traverseCallback(toZ(jobname), logFiles); //throw()!
- traverseFolder(logdir, //throw();
+ traverseFolder(logdir,
traverseCallback);
if (logFiles.size() <= maxCount)
return;
- //delete oldest logfiles
- std::nth_element(logFiles.begin(), logFiles.end() - maxCount, logFiles.end()); //take advantage of logfile naming convention to find oldest files
+ //delete oldest logfiles: take advantage of logfile naming convention to find them
+ std::nth_element(logFiles.begin(), logFiles.end() - maxCount, logFiles.end(), LessFilename());
std::for_each(logFiles.begin(), logFiles.end() - maxCount,
[](const Zstring& filename) { try { removeFile(filename); } catch (FileError&) {} });
@@ -66,7 +66,7 @@ void limitLogfileCount(const Zstring& logdir, const std::wstring& jobname, size_
std::unique_ptr<FileOutput> prepareNewLogfile(const Zstring& logfileDirectory, //throw FileError
const std::wstring& jobName,
- const std::wstring& timestamp) //return value always bound!
+ const TimeComp& timeStamp) //return value always bound!
{
//create logfile directory if required
Zstring logfileDir = logfileDirectory.empty() ?
@@ -76,7 +76,7 @@ std::unique_ptr<FileOutput> prepareNewLogfile(const Zstring& logfileDirectory, /
makeDirectory(logfileDir); //throw FileError
//assemble logfile name
- const Zstring body = appendSeparator(logfileDir) + toZ(jobName) + Zstr(" ") + utfCvrtTo<Zstring>(timestamp);
+ const Zstring body = appendSeparator(logfileDir) + toZ(jobName) + Zstr(" ") + formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"), timeStamp);
//ensure uniqueness
for (int i = 0;; ++i)
@@ -97,9 +97,9 @@ std::unique_ptr<FileOutput> prepareNewLogfile(const Zstring& logfileDirectory, /
//##############################################################################################################################
BatchStatusHandler::BatchStatusHandler(bool showProgress,
const std::wstring& jobName,
- const std::wstring& timestamp,
- const wxString& logfileDirectory, //may be empty
- size_t logFileCountMax,
+ const TimeComp& timeStamp,
+ const Zstring& logfileDirectory, //may be empty
+ int logfilesCountLimit,
const xmlAccess::OnError handleError,
const SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode
FfsReturnCode& returnCode,
@@ -113,16 +113,17 @@ BatchStatusHandler::BatchStatusHandler(bool showProgress,
syncStatusFrame(*this, *this, nullptr, showProgress, jobName, execWhenFinished, execFinishedHistory),
jobName_(jobName)
{
- if (logFileCountMax > 0) //init log file: starts internal timer!
- if (!tryReportingError([&]
+ if (logfilesCountLimit != 0) //init log file: starts internal timer!
{
- logFile = prepareNewLogfile(toZ(logfileDirectory), jobName, timestamp); //throw FileError; return value always bound!
+ if (!tryReportingError([&] { logFile = prepareNewLogfile(logfileDirectory, jobName, timeStamp); }, //throw FileError; return value always bound!
+ *this))
+ {
+ returnCode_ = FFS_RC_ABORTED;
+ throw BatchAbortProcess();
+ }
- limitLogfileCount(beforeLast(logFile->getFilename(), FILE_NAME_SEPARATOR), jobName_, logFileCountMax); //throw()
- }, *this))
- {
- returnCode_ = FFS_RC_ABORTED;
- throw BatchAbortProcess();
+ if (logfilesCountLimit >= 0)
+ limitLogfileCount(beforeLast(logFile->getFilename(), FILE_NAME_SEPARATOR), jobName_, logfilesCountLimit); //throw()
}
totalTime.Start(); //measure total time
@@ -203,7 +204,10 @@ BatchStatusHandler::~BatchStatusHandler()
if (isCloseProgressDlgCommand(finalCommand))
showFinalResults = false; //take precedence over current visibility status
else if (!finalCommand.empty())
- shellExecute(finalCommand);
+ {
+ auto cmdexp = utfCvrtTo<wxString>(expandMacros(utfCvrtTo<Zstring>(finalCommand)));
+ shellExecute(cmdexp);
+ }
}
if (showFinalResults) //warning: wxWindow::Show() is called within processHasFinished()!
diff --git a/ui/batch_status_handler.h b/ui/batch_status_handler.h
index c6def13c..77a32f28 100644
--- a/ui/batch_status_handler.h
+++ b/ui/batch_status_handler.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef BATCHSTATUSHANDLER_H_INCLUDED
@@ -9,6 +9,7 @@
#include <zen/error_log.h>
#include <zen/file_io.h>
+#include <zen/time.h>
#include "../lib/status_handler.h"
#include "../lib/process_xml.h"
#include "progress_indicator.h"
@@ -25,9 +26,9 @@ class BatchStatusHandler : public zen::StatusHandler
public:
BatchStatusHandler(bool showProgress, //defines: -start minimized and -quit immediately when finished
const std::wstring& jobName, //should not be empty for a batch job!
- const std::wstring& timestamp,
- const wxString& logfileDirectory,
- size_t logFileCountMax, //0 if logging shall be inactive
+ const zen::TimeComp& timeStamp,
+ const Zstring& logfileDirectory,
+ int logfilesCountLimit, //0: logging inactive; < 0: no limit
const xmlAccess::OnError handleError,
const zen::SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode
zen::FfsReturnCode& returnCode,
diff --git a/ui/check_version.cpp b/ui/check_version.cpp
index 56896836..2a243a27 100644
--- a/ui/check_version.cpp
+++ b/ui/check_version.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "check_version.h"
diff --git a/ui/check_version.h b/ui/check_version.h
index 5a0bbd73..5c85893e 100644
--- a/ui/check_version.h
+++ b/ui/check_version.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef UPDATEVERSION_H_INCLUDED
diff --git a/ui/column_attr.h b/ui/column_attr.h
index ed98f403..414bb483 100644
--- a/ui/column_attr.h
+++ b/ui/column_attr.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef COL_ATTR_HEADER_189467891346732143214
diff --git a/ui/custom_grid.cpp b/ui/custom_grid.cpp
index 0e27f21e..9db6a405 100644
--- a/ui/custom_grid.cpp
+++ b/ui/custom_grid.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "custom_grid.h"
@@ -1399,7 +1399,7 @@ private:
//(h-scrollbar is shown due to v-scrollbar consuming horizontal width, ect...)
//while in fact both are NOT needed, this special case results in a bogus need for scrollbars!
//see https://sourceforge.net/tracker/?func=detail&aid=3514183&group_id=234430&atid=1093083
- // => since we're outside the Grid abstraction, we should not duplicate code to handle this special case as it seems to be insignificant
+ // => since we're outside the Grid abstraction, we should not duplicate code to handle this special case as it seems to be insignificant
};
Grid::ScrollBarStatus sbStatusX = needsHorizontalScrollbars(gridL_) ||
diff --git a/ui/custom_grid.h b/ui/custom_grid.h
index 98092ade..8a91e0bc 100644
--- a/ui/custom_grid.h
+++ b/ui/custom_grid.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef CUSTOMGRID_H_INCLUDED
diff --git a/ui/dir_name.cpp b/ui/dir_name.cpp
index 3d8db37d..493a7642 100644
--- a/ui/dir_name.cpp
+++ b/ui/dir_name.cpp
@@ -1,31 +1,41 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "dir_name.h"
+#include <zen/thread.h>
+#include <zen/file_handling.h>
#include <wx/dnd.h>
#include <wx/window.h>
#include <wx/textctrl.h>
#include <wx/statbox.h>
-#include <zen/thread.h>
-#include <zen/file_handling.h>
-#include "../lib/resolve_path.h"
+#include <wx/dirdlg.h>
+#include <wx/msgdlg.h>
#include <wx+/string_conv.h>
+#include "../lib/resolve_path.h"
#include "folder_history_box.h"
+#ifdef FFS_WIN
+#include <zen/dll.h>
+#include <zen/win_ver.h>
+#include "IFileDialog_Vista\ifile_dialog.h"
+#endif
+
using namespace zen;
+const wxEventType zen::EVENT_ON_DIR_SELECTED = wxNewEventType();
+
namespace
{
-void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, wxWindow& tooltipWnd, wxStaticText* staticText, size_t timeout)
+void setDirectoryNameImpl(const wxString& dirname, wxWindow& tooltipWnd, wxStaticText* staticText)
{
const wxString dirFormatted = utfCvrtTo<wxString>(getFormattedDirectoryName(toZ(dirname)));
tooltipWnd.SetToolTip(nullptr); //workaround wxComboBox bug http://trac.wxwidgets.org/ticket/10512 / http://trac.wxwidgets.org/ticket/12659
- tooltipWnd.SetToolTip(dirFormatted); //only lord knows when the real bugfix reaches mere mortals via an official release
+ tooltipWnd.SetToolTip(dirFormatted); //who knows when the real bugfix reaches mere mortals via an official release...
if (staticText)
{
@@ -37,78 +47,69 @@ void setDirectoryNameImpl(const wxString& dirname, wxDirPickerCtrl* dirPicker, w
staticText->SetLabel(dirNormalized == dirFormatted ? wxString(_("Drag && drop")) : dirFormatted);
}
-
- if (dirPicker && !dirFormatted.empty())
- {
- Zstring dir = toZ(dirFormatted); //convert to Zstring first: we don't want to pass wxString by value and risk MT issues!
- auto ft = async([=] { return zen::dirExists(dir); });
-
- if (ft.timed_wait(boost::posix_time::milliseconds(timeout)) && ft.get()) //potentially slow network access: wait 200ms at most
- dirPicker->SetPath(dirFormatted);
- }
}
void setDirectoryName(const wxString& dirname,
wxTextCtrl* txtCtrl,
- wxDirPickerCtrl* dirPicker,
wxWindow& tooltipWnd,
- wxStaticText* staticText,
- size_t timeout = 200) //pointers are optional
+ wxStaticText* staticText) //pointers are optional
{
if (txtCtrl)
txtCtrl->ChangeValue(dirname);
- setDirectoryNameImpl(dirname, dirPicker, tooltipWnd, staticText, timeout);
+ setDirectoryNameImpl(dirname, tooltipWnd, staticText);
}
void setDirectoryName(const wxString& dirname,
FolderHistoryBox* comboBox,
- wxDirPickerCtrl* dirPicker,
wxWindow& tooltipWnd,
- wxStaticText* staticText,
- size_t timeout = 200) //pointers are optional
+ wxStaticText* staticText) //pointers are optional
{
if (comboBox)
comboBox->setValue(dirname);
- setDirectoryNameImpl(dirname, dirPicker, tooltipWnd, staticText, timeout);
+ setDirectoryNameImpl(dirname, tooltipWnd, staticText);
}
}
//##############################################################################################################
template <class NameControl>
-DirectoryName<NameControl>::DirectoryName(wxWindow& dropWindow,
- wxDirPickerCtrl& dirPicker,
- NameControl& dirName,
- wxStaticText* staticText,
- wxWindow* dropWindow2) :
+DirectoryName<NameControl>::DirectoryName(wxWindow& dropWindow,
+ wxButton& selectButton,
+ NameControl& dirName,
+ wxStaticText* staticText,
+ wxWindow* dropWindow2) :
dropWindow_(dropWindow),
dropWindow2_(dropWindow2),
- dirPicker_(dirPicker),
+ selectButton_(selectButton),
dirName_(dirName),
staticText_(staticText)
{
//prepare drag & drop
- setupFileDrop(dropWindow);
- dropWindow.Connect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this);
+ setupFileDrop(dropWindow_);
+ dropWindow_.Connect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this);
- if (dropWindow2)
+ if (dropWindow2_)
{
- setupFileDrop(*dropWindow2);
- dropWindow2->Connect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this);
+ setupFileDrop(*dropWindow2_);
+ dropWindow2_->Connect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this);
}
//keep dirPicker and dirName synchronous
- dirName_ .Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DirectoryName::OnWriteDirManually), nullptr, this);
- dirPicker_.Connect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(DirectoryName::OnDirSelected ), nullptr, this);
+ dirName_ .Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DirectoryName::OnWriteDirManually), nullptr, this);
+ selectButton_.Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (DirectoryName::OnSelectDir ), nullptr, this);
}
template <class NameControl>
DirectoryName<NameControl>::~DirectoryName()
{
- dirName_ .Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DirectoryName::OnWriteDirManually), nullptr, this);
- dirPicker_.Disconnect(wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler(DirectoryName::OnDirSelected ), nullptr, this);
+ dropWindow_.Disconnect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this);
+ if (dropWindow2_)
+ dropWindow2_->Disconnect(EVENT_DROP_FILE, FileDropEventHandler(DirectoryName::OnFilesDropped), nullptr, this);
+
+ dirName_ .Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler (DirectoryName::OnWriteDirManually), nullptr, this);
+ selectButton_.Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (DirectoryName::OnSelectDir ), nullptr, this);
}
@@ -123,7 +124,7 @@ void DirectoryName<NameControl>::OnFilesDropped(FileDropEvent& event)
{
const wxString fileName = event.getFiles()[0];
if (dirExists(toZ(fileName)))
- setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticText_);
+ setDirectoryName(fileName, &dirName_, dirName_, staticText_);
else
{
wxString parentName = beforeLast(fileName, utfCvrtTo<wxString>(FILE_NAME_SEPARATOR)); //returns empty string if ch not found
@@ -132,10 +133,14 @@ void DirectoryName<NameControl>::OnFilesDropped(FileDropEvent& event)
parentName += FILE_NAME_SEPARATOR;
#endif
if (dirExists(toZ(parentName)))
- setDirectoryName(parentName, &dirName_, &dirPicker_, dirName_, staticText_);
+ setDirectoryName(parentName, &dirName_, dirName_, staticText_);
else //set original name unconditionally: usecase: inactive mapped network shares
- setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticText_);
+ setDirectoryName(fileName, &dirName_, dirName_, staticText_);
}
+
+ //notify action invoked by user
+ wxCommandEvent dummy(EVENT_ON_DIR_SELECTED);
+ ProcessEvent(dummy);
}
else
event.Skip(); //let other handlers try!!!
@@ -145,17 +150,75 @@ void DirectoryName<NameControl>::OnFilesDropped(FileDropEvent& event)
template <class NameControl>
void DirectoryName<NameControl>::OnWriteDirManually(wxCommandEvent& event)
{
- setDirectoryName(event.GetString(), static_cast<NameControl*>(nullptr), &dirPicker_, dirName_, staticText_, 100); //potentially slow network access: wait 100 ms at most
+ setDirectoryName(event.GetString(), static_cast<NameControl*>(nullptr), dirName_, staticText_); //potentially slow network access: wait 100 ms at most
+
+ //wxCommandEvent dummy(EVENT_ON_DIR_SELECTED); -> don't annoy the user!
+ //ProcessEvent(dummy);
event.Skip();
}
template <class NameControl>
-void DirectoryName<NameControl>::OnDirSelected(wxFileDirPickerEvent& event)
+void DirectoryName<NameControl>::OnSelectDir(wxCommandEvent& event)
{
- const wxString newPath = event.GetPath();
- setDirectoryName(newPath, &dirName_, nullptr, dirName_, staticText_);
- event.Skip();
+ wxString defaultDirname; //default selection for dir picker
+ {
+ const Zstring dirFmt = getFormattedDirectoryName(toZ(getName()));
+ if (!dirFmt.empty())
+ {
+ //convert to Zstring first: we don't want to pass wxString by value and risk MT issues!
+ auto ft = async([=] { return zen::dirExists(dirFmt); });
+
+ if (ft.timed_wait(boost::posix_time::milliseconds(200)) && ft.get()) //potentially slow network access: wait 200ms at most
+ defaultDirname = utfCvrtTo<wxString>(dirFmt);
+ }
+ }
+
+ //wxDirDialog internally uses lame looking SHBrowseForFolder(); Better use IFileDialog() instead! (remembers size and position!)
+ std::unique_ptr<wxString> newFolder;
+#ifdef FFS_WIN
+ if (vistaOrLater())
+ {
+ using namespace ifile;
+ const DllFun<FunType_showFolderPicker> showFolderPicker(getDllName(), funName_showFolderPicker);
+ const DllFun<FunType_freeString> freeString (getDllName(), funName_freeString);
+ if (showFolderPicker && freeString)
+ {
+ const wchar_t* selectedFolder = nullptr;
+ const wchar_t* errorMsg = nullptr;
+ bool cancelled = false;
+ ZEN_ON_SCOPE_EXIT(freeString(selectedFolder));
+ ZEN_ON_SCOPE_EXIT(freeString(errorMsg));
+
+ showFolderPicker(static_cast<HWND>(selectButton_.GetHWND()), //in; ==HWND
+ defaultDirname.empty() ? nullptr : defaultDirname.c_str(), //in, optional!
+ selectedFolder, //out: call freeString() after use!
+ cancelled, //out
+ errorMsg); //out, optional: call freeString() after use!
+ if (errorMsg)
+ {
+ wxMessageBox(errorMsg, _("Error"), wxOK | wxICON_ERROR);
+ return;
+ }
+ if (cancelled || !selectedFolder)
+ return;
+ newFolder = make_unique<wxString>(selectedFolder);
+ }
+ }
+#endif
+ if (!newFolder.get())
+ {
+ wxDirDialog dirPicker(&selectButton_, _("Select a folder"), defaultDirname); //put modal dialog on stack: creating on freestore leads to memleak!
+ if (dirPicker.ShowModal() != wxID_OK)
+ return;
+ newFolder = make_unique<wxString>(dirPicker.GetPath());
+ }
+
+ setDirectoryName(*newFolder, &dirName_, dirName_, staticText_);
+
+ //notify action invoked by user
+ wxCommandEvent dummy(EVENT_ON_DIR_SELECTED);
+ ProcessEvent(dummy);
}
@@ -169,7 +232,7 @@ wxString DirectoryName<NameControl>::getName() const
template <class NameControl>
void DirectoryName<NameControl>::setName(const wxString& dirname)
{
- setDirectoryName(dirname, &dirName_, &dirPicker_, dirName_, staticText_);
+ setDirectoryName(dirname, &dirName_, dirName_, staticText_);
}
diff --git a/ui/dir_name.h b/ui/dir_name.h
index e49b9302..3540e087 100644
--- a/ui/dir_name.h
+++ b/ui/dir_name.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DRAGANDDROP_H_INCLUDED
@@ -10,23 +10,34 @@
#include <vector>
#include <wx/event.h>
#include <wx/sizer.h>
-#include <wx/filepicker.h>
#include <wx+/file_drop.h>
#include <wx/stattext.h>
+#include <wx/button.h>
namespace zen
{
-//handle drag and drop, tooltip, label and manual input, coordinating a wxWindow, wxDirPickerCtrl, and wxComboBox/wxTextCtrl
+//handle drag and drop, tooltip, label and manual input, coordinating a wxWindow, wxButton, and wxComboBox/wxTextCtrl
+/*
+Reasons NOT to use wxDirPickerCtrl, but wxButton instead:
+ - Crash on GTK 2: http://favapps.wordpress.com/2012/06/11/freefilesync-crash-in-linux-when-syncing-solved/
+ - selection dialog remembers size, but NOT position => if user enlarges window, the next time he opens the dialog it may leap out of visible screen
+ - still uses outdated ::SHBrowseForFolder() (Windows 7)
+ - hard-codes "Browse" button label
+*/
+
+//emit event when directory is changed by the user:
+extern const wxEventType EVENT_ON_DIR_SELECTED;
+//example: wnd.Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MyDlg::OnDirSelected), nullptr, this);
template <class NameControl> //NameControl may be wxTextCtrl, FolderHistoryBox
-class DirectoryName: private wxEvtHandler
+class DirectoryName: public wxEvtHandler
{
public:
- DirectoryName(wxWindow& dropWindow,
- wxDirPickerCtrl& dirPicker,
- NameControl& dirName,
- wxStaticText* staticText = nullptr,
- wxWindow* dropWindow2 = nullptr); //optional
+ DirectoryName(wxWindow& dropWindow,
+ wxButton& selectButton,
+ NameControl& dirName,
+ wxStaticText* staticText = nullptr, //optional
+ wxWindow* dropWindow2 = nullptr); //
~DirectoryName();
@@ -38,13 +49,13 @@ private:
void OnFilesDropped(FileDropEvent& event);
void OnWriteDirManually(wxCommandEvent& event);
- void OnDirSelected(wxFileDirPickerEvent& event);
+ void OnSelectDir(wxCommandEvent& event);
- const wxWindow& dropWindow_;
- const wxWindow* dropWindow2_;
- wxDirPickerCtrl& dirPicker_;
- NameControl& dirName_;
- wxStaticText* staticText_; //optional
+ wxWindow& dropWindow_;
+ wxWindow* dropWindow2_;
+ wxButton& selectButton_;
+ NameControl& dirName_;
+ wxStaticText* staticText_; //optional
};
}
diff --git a/ui/exec_finished_box.cpp b/ui/exec_finished_box.cpp
index e776c673..0586e8e5 100644
--- a/ui/exec_finished_box.cpp
+++ b/ui/exec_finished_box.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "exec_finished_box.h"
@@ -18,7 +18,7 @@ using namespace zen;
namespace
{
-const std::wstring closeProgressDlg = L"Close progress dialog"; //special command //mark for extraction: _("Close progress dialog")
+const std::wstring cmdTxtCloseProgressDlg = L"Close progress dialog"; //special command //mark for extraction: _("Close progress dialog")
const std::wstring separationLine(L"---------------------------------------------------------------------------------------------------------------");
@@ -56,7 +56,7 @@ std::vector<std::pair<std::wstring, std::wstring>> getDefaultCommands() //(gui n
return output;
}
-const wxEventType wxEVT_REPLACE_BUILT_IN_COMMANDS = wxNewEventType();
+const wxEventType wxEVT_VALIDATE_USER_SELECTION = wxNewEventType();
}
@@ -64,36 +64,7 @@ bool isCloseProgressDlgCommand(const std::wstring& value)
{
std::wstring tmp = value;
trim(tmp);
- return tmp == closeProgressDlg;
-}
-
-
-void addValueToHistory(const std::wstring& value, std::vector<std::wstring>& history, size_t historyMax)
-{
- std::wstring command = value;
- trim(command);
-
- bool skipCmd = command == separationLine || //do not add sep. line
- command == closeProgressDlg || //do not add special command
- command.empty();
-
- //do not add built-in commands to history
- if (!skipCmd)
- {
- const auto& defaultCommands = getDefaultCommands();
- for (auto iter = defaultCommands.begin(); iter != defaultCommands.end(); ++iter)
- if (command == iter->first || command == iter->second)
- {
- skipCmd = true;
- break;
- }
- }
-
- if (!skipCmd)
- history.insert(history.begin(), command);
-
- if (history.size() > historyMax)
- history.resize(historyMax);
+ return tmp == cmdTxtCloseProgressDlg;
}
@@ -109,6 +80,7 @@ ExecFinishedBox::ExecFinishedBox(wxWindow* parent,
const wxString& name) :
wxComboBox(parent, id, value, pos, size, n, choices, style, validator, name),
history_(nullptr),
+ historyMax_(0),
defaultCommands(getDefaultCommands())
{
//#####################################
@@ -120,7 +92,38 @@ ExecFinishedBox::ExecFinishedBox(wxWindow* parent,
Connect(wxEVT_COMMAND_COMBOBOX_SELECTED, wxCommandEventHandler(ExecFinishedBox::OnSelection ), nullptr, this);
Connect(wxEVT_MOUSEWHEEL, wxMouseEventHandler (ExecFinishedBox::OnMouseWheel), nullptr, this);
- Connect(wxEVT_REPLACE_BUILT_IN_COMMANDS, wxCommandEventHandler(ExecFinishedBox::OnReplaceBuiltInCmds), nullptr, this);
+ Connect(wxEVT_VALIDATE_USER_SELECTION, wxCommandEventHandler(ExecFinishedBox::OnValidateSelection), nullptr, this);
+}
+
+
+void ExecFinishedBox::addItemHistory()
+{
+ if (history_)
+ {
+ std::wstring command = getValue();
+ trim(command);
+
+ bool skipCmd = command == separationLine || //do not add sep. line
+ command == cmdTxtCloseProgressDlg || //do not add special command
+ command.empty();
+
+ //do not add built-in commands to history
+ if (!skipCmd)
+ {
+ for (auto iter = defaultCommands.begin(); iter != defaultCommands.end(); ++iter)
+ if (command == iter->first || command == iter->second)
+ {
+ skipCmd = true;
+ break;
+ }
+ }
+
+ if (!skipCmd)
+ history_->insert(history_->begin(), command);
+
+ if (history_->size() > historyMax_)
+ history_->resize(historyMax_);
+ }
}
@@ -131,8 +134,8 @@ std::wstring ExecFinishedBox::getValue() const
{
std::wstring tmp = value;
trim(tmp);
- if (tmp == implementation::translate(closeProgressDlg)) //have this symbolic constant translated properly
- return closeProgressDlg;
+ if (tmp == implementation::translate(cmdTxtCloseProgressDlg)) //have this symbolic constant translated properly
+ return cmdTxtCloseProgressDlg;
}
return value;
@@ -144,8 +147,8 @@ void ExecFinishedBox::setValue(const std::wstring& value)
std::wstring tmp = value;
trim(tmp);
- if (tmp == closeProgressDlg)
- setValueAndUpdateList(implementation::translate(closeProgressDlg)); //have this symbolic constant translated properly
+ if (tmp == cmdTxtCloseProgressDlg)
+ setValueAndUpdateList(implementation::translate(cmdTxtCloseProgressDlg)); //have this symbolic constant translated properly
else
setValueAndUpdateList(value);
}
@@ -158,7 +161,7 @@ void ExecFinishedBox::setValueAndUpdateList(const std::wstring& value)
std::deque<std::wstring> items;
//1. special command
- items.push_back(implementation::translate(closeProgressDlg));
+ items.push_back(implementation::translate(cmdTxtCloseProgressDlg));
//2. built in commands
for (auto iter = defaultCommands.begin(); iter != defaultCommands.end(); ++iter)
@@ -191,7 +194,7 @@ void ExecFinishedBox::setValueAndUpdateList(const std::wstring& value)
void ExecFinishedBox::OnSelection(wxCommandEvent& event)
{
- wxCommandEvent dummy2(wxEVT_REPLACE_BUILT_IN_COMMANDS); //we cannot replace built-in commands at this position in call stack, so defer to a later time!
+ wxCommandEvent dummy2(wxEVT_VALIDATE_USER_SELECTION); //we cannot replace built-in commands at this position in call stack, so defer to a later time!
if (auto handler = GetEventHandler())
handler->AddPendingEvent(dummy2);
@@ -199,7 +202,7 @@ void ExecFinishedBox::OnSelection(wxCommandEvent& event)
}
-void ExecFinishedBox::OnReplaceBuiltInCmds(wxCommandEvent& event)
+void ExecFinishedBox::OnValidateSelection(wxCommandEvent& event)
{
const auto& value = getValue();
diff --git a/ui/exec_finished_box.h b/ui/exec_finished_box.h
index 7578acc6..b7232711 100644
--- a/ui/exec_finished_box.h
+++ b/ui/exec_finished_box.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef EXEC_FINISHED_BOX_18947773210473214
@@ -13,14 +13,11 @@
#include <wx/combobox.h>
#include <zen/string_tools.h>
-
//combobox with history function + functionality to delete items (DEL)
//special command
bool isCloseProgressDlgCommand(const std::wstring& value);
-void addValueToHistory(const std::wstring& value, std::vector<std::wstring>& history, size_t historyMax);
-
class ExecFinishedBox : public wxComboBox
{
@@ -36,7 +33,8 @@ public:
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxComboBoxNameStr);
- void setHistoryRef(std::vector<std::wstring>& history) { history_ = &history; }
+ void initHistory(std::vector<std::wstring>& history, size_t historyMax) { history_ = &history; historyMax_ = historyMax; }
+ void addItemHistory(); //adds current item to history
// use these two accessors instead of GetValue()/SetValue():
std::wstring getValue() const;
@@ -47,12 +45,13 @@ private:
void OnKeyEvent(wxKeyEvent& event);
void OnMouseWheel(wxMouseEvent& event) {} //swallow! this gives confusing UI feedback anyway
void OnSelection(wxCommandEvent& event);
- void OnReplaceBuiltInCmds(wxCommandEvent& event);
+ void OnValidateSelection(wxCommandEvent& event);
void OnUpdateList(wxEvent& event);
void setValueAndUpdateList(const std::wstring& value);
std::vector<std::wstring>* history_;
+ size_t historyMax_;
const std::vector<std::pair<std::wstring, std::wstring>> defaultCommands;
};
diff --git a/ui/folder_history_box.cpp b/ui/folder_history_box.cpp
index 2b773c20..528a36ce 100644
--- a/ui/folder_history_box.cpp
+++ b/ui/folder_history_box.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "folder_history_box.h"
@@ -12,6 +12,10 @@
using namespace zen;
+namespace
+{
+const wxEventType wxEVT_VALIDATE_USER_SELECTION = wxNewEventType();
+}
FolderHistoryBox::FolderHistoryBox(wxWindow* parent,
wxWindowID id,
@@ -41,6 +45,8 @@ FolderHistoryBox::FolderHistoryBox(wxWindow* parent,
Connect(wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEventHandler(FolderHistoryBox::OnShowDropDown), nullptr, this);
Connect(wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEventHandler(FolderHistoryBox::OnHideDropDown), nullptr, this);
#endif
+
+Connect(wxEVT_VALIDATE_USER_SELECTION, wxCommandEventHandler(FolderHistoryBox::OnValidateSelection), nullptr, this);
}
@@ -78,7 +84,7 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& dirname)
//std::sort(tmp.begin(), tmp.end(), LessFilename());
if (!dirList.empty() && !tmp.empty())
- dirList.push_back(FolderHistory::lineSeparator());
+ dirList.push_back(toZ(FolderHistory::separationLine()));
dirList.insert(dirList.end(), tmp.begin(), tmp.end());
}
@@ -99,10 +105,22 @@ void FolderHistoryBox::setValueAndUpdateList(const wxString& dirname)
void FolderHistoryBox::OnSelection(wxCommandEvent& event)
{
+ wxCommandEvent dummy2(wxEVT_VALIDATE_USER_SELECTION); //we cannot replace built-in commands at this position in call stack, so defer to a later time!
+ if (auto handler = GetEventHandler())
+ handler->AddPendingEvent(dummy2);
+
event.Skip();
}
+void FolderHistoryBox::OnValidateSelection(wxCommandEvent& event)
+{
+ //const auto& value = GetValue();
+ //if (value == FolderHistory::separationLine())
+ // setValueAndUpdateList(wxString()); -> not good enough (resolved folder name not updated)
+}
+
+
void FolderHistoryBox::OnKeyEvent(wxKeyEvent& event)
{
const int keyCode = event.GetKeyCode();
diff --git a/ui/folder_history_box.h b/ui/folder_history_box.h
index 68197786..49dec582 100644
--- a/ui/folder_history_box.h
+++ b/ui/folder_history_box.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef CUSTOMCOMBOBOX_H_INCLUDED
@@ -11,6 +11,7 @@
#include <memory>
#include <zen/zstring.h>
#include <zen/stl_tools.h>
+#include <zen/utf.h>
//combobox with history function + functionality to delete items (DEL)
@@ -30,11 +31,11 @@ public:
const std::vector<Zstring>& getList() const { return dirnames_; }
- static const Zstring lineSeparator() { return Zstr("---------------------------------------------------------------------------------------------------------------"); }
+ static const wxString separationLine() { return L"---------------------------------------------------------------------------------------------------------------"; }
void addItem(const Zstring& dirname)
{
- if (dirname.empty() || dirname == lineSeparator())
+ if (dirname.empty() || dirname == zen::utfCvrtTo<Zstring>(separationLine()))
return;
Zstring nameTmp = dirname;
@@ -88,6 +89,7 @@ private:
void OnKeyEvent(wxKeyEvent& event);
void OnMouseWheel(wxMouseEvent& event);
void OnSelection(wxCommandEvent& event);
+ void OnValidateSelection(wxCommandEvent& event);
void OnUpdateList(wxEvent& event) { setValueAndUpdateList(GetValue()); event.Skip(); }
void setValueAndUpdateList(const wxString& dirname);
diff --git a/ui/folder_pair.h b/ui/folder_pair.h
index c9f42259..eab07b68 100644
--- a/ui/folder_pair.h
+++ b/ui/folder_pair.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FOLDERPAIR_H_INCLUDED
diff --git a/ui/grid_view.cpp b/ui/grid_view.cpp
index 8764e233..5045fca4 100644
--- a/ui/grid_view.cpp
+++ b/ui/grid_view.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "grid_view.h"
diff --git a/ui/grid_view.h b/ui/grid_view.h
index 5fc80338..0cb5d285 100644
--- a/ui/grid_view.h
+++ b/ui/grid_view.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef GRIDVIEW_H_INCLUDED
diff --git a/ui/gui_generated.cpp b/ui/gui_generated.cpp
index 1f58d6a5..50c5ea62 100644
--- a/ui/gui_generated.cpp
+++ b/ui/gui_generated.cpp
@@ -47,7 +47,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
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_menuItemSaveAs = new wxMenuItem( m_menuFile, wxID_SAVEAS, wxString( _("Save &as...") ) , wxEmptyString, wxITEM_NORMAL );
m_menuFile->Append( m_menuItemSaveAs );
m_menuFile->AppendSeparator();
@@ -238,10 +238,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_directoryLeft = new FolderHistoryBox( m_panelTopLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizer182->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerLeft = new zen::DirPickerCtrl( m_panelTopLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerLeft->SetToolTip( _("Select a folder") );
+ m_buttonSelectDirLeft = new wxButton( m_panelTopLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
- bSizer182->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer182->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
bSizer180->Add( bSizer182, 0, wxEXPAND, 5 );
@@ -316,10 +316,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_directoryRight = new FolderHistoryBox( m_panelTopRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizer179->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerRight = new zen::DirPickerCtrl( m_panelTopRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerRight->SetToolTip( _("Select a folder") );
+ m_buttonSelectDirRight = new wxButton( m_panelTopRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
- bSizer179->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer179->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
bSizer183->Add( bSizer179, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
@@ -558,10 +558,10 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_bpButtonFilter = new wxBitmapButton( m_panelFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
bSizer171->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
- m_checkBoxHideFilt = new wxCheckBox( m_panelFilter, wxID_ANY, _("Hide excluded items"), wxDefaultPosition, wxDefaultSize, 0 );
- m_checkBoxHideFilt->SetToolTip( _("Hide filtered or temporarily excluded files") );
+ m_checkBoxShowExcluded = new wxCheckBox( m_panelFilter, wxID_ANY, _("Show excluded items"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxShowExcluded->SetToolTip( _("Show filtered or temporarily excluded files") );
- bSizer171->Add( m_checkBoxHideFilt, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer171->Add( m_checkBoxShowExcluded, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panelFilter->SetSizer( bSizer171 );
@@ -849,15 +849,13 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_buttonStartSync->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_dirPickerLeft->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this );
m_bpButtonSwapSides->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this );
- m_dirPickerRight->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this );
m_bpButtonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this );
m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ), 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_bpButtonFilter->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this );
- m_checkBoxHideFilt->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this );
+ m_checkBoxShowExcluded->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this );
m_bpButtonSyncCreateLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateLeft ), NULL, this );
m_bpButtonSyncDirOverwLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirLeft ), NULL, this );
m_bpButtonSyncDeleteLeft->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteLeft ), NULL, this );
@@ -897,15 +895,13 @@ MainDialogGenerated::~MainDialogGenerated()
m_buttonStartSync->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_dirPickerLeft->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this );
m_bpButtonSwapSides->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSwapSides ), NULL, this );
- m_dirPickerRight->Disconnect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainDialogGenerated::OnDirSelected ), NULL, this );
m_bpButtonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigLoad ), NULL, this );
m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigSaveAs ), 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_bpButtonFilter->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnConfigureFilter ), NULL, this );
- m_checkBoxHideFilt->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnHideFilteredButton ), NULL, this );
+ m_checkBoxShowExcluded->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnShowExcluded ), NULL, this );
m_bpButtonSyncCreateLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncCreateLeft ), NULL, this );
m_bpButtonSyncDirOverwLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDirLeft ), NULL, this );
m_bpButtonSyncDeleteLeft->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSyncDeleteLeft ), NULL, this );
@@ -942,10 +938,10 @@ FolderPairGenerated::FolderPairGenerated( wxWindow* parent, wxWindowID id, const
m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizer134->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerLeft = new zen::DirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerLeft->SetToolTip( _("Select a folder") );
+ m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
- bSizer134->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer134->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panelLeft->SetSizer( bSizer134 );
@@ -987,10 +983,10 @@ FolderPairGenerated::FolderPairGenerated( wxWindow* parent, wxWindowID id, const
m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizer135->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerRight = new zen::DirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerRight->SetToolTip( _("Select a folder") );
+ m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
- bSizer135->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer135->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panelRight->SetSizer( bSizer135 );
@@ -1366,10 +1362,10 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizer1141->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerLeft = new zen::DirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerLeft->SetToolTip( _("Select a folder") );
+ m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
- bSizer1141->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1141->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panelLeft->SetSizer( bSizer1141 );
@@ -1384,10 +1380,10 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizer115->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerRight = new zen::DirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerRight->SetToolTip( _("Select a folder") );
+ m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
- bSizer115->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer115->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panelRight->SetSizer( bSizer115 );
@@ -1428,9 +1424,6 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer120->Add( m_scrolledWindow6, 1, wxEXPAND, 5 );
- bSizer120->Add( 0, 5, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
bSizer67->Add( bSizer120, 1, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 10 );
@@ -1445,87 +1438,76 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
wxBoxSizer* bSizer172;
bSizer172 = new wxBoxSizer( wxVERTICAL );
- wxBoxSizer* bSizer1722;
- bSizer1722 = new wxBoxSizer( wxHORIZONTAL );
-
- wxStaticBoxSizer* sbSizer24;
- sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Status feedback") ), wxHORIZONTAL );
-
- m_checkBoxShowProgress = new wxCheckBox( m_panelBatchSettings, wxID_ANY, _("Show progress dialog"), wxDefaultPosition, wxDefaultSize, 0 );
- sbSizer24->Add( m_checkBoxShowProgress, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+ wxBoxSizer* bSizer180;
+ bSizer180 = new wxBoxSizer( wxHORIZONTAL );
- wxBoxSizer* bSizer1702;
- bSizer1702 = new wxBoxSizer( wxHORIZONTAL );
+ sbSizerErrorHandling = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Error handling") ), wxHORIZONTAL );
- m_staticText961 = new wxStaticText( m_panelBatchSettings, wxID_ANY, _("Error handling"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText961->Wrap( -1 );
- bSizer1702->Add( m_staticText961, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+ m_toggleBtnErrorIgnore = new wxToggleButton( m_panelBatchSettings, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") );
- wxArrayString m_choiceHandleErrorChoices;
- m_choiceHandleError = new wxChoice( m_panelBatchSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 );
- m_choiceHandleError->SetSelection( 0 );
- bSizer1702->Add( m_choiceHandleError, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ sbSizerErrorHandling->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+ m_toggleBtnErrorPopup = new wxToggleButton( m_panelBatchSettings, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") );
- sbSizer24->Add( bSizer1702, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+ sbSizerErrorHandling->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+ m_toggleBtnErrorExit = new wxToggleButton( m_panelBatchSettings, wxID_ANY, _("Exit"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorExit->SetToolTip( _("Abort synchronization on first error") );
- bSizer1722->Add( sbSizer24, 1, wxALIGN_CENTER_VERTICAL, 5 );
+ sbSizerErrorHandling->Add( m_toggleBtnErrorExit, 0, wxALIGN_CENTER_VERTICAL, 5 );
- bSizer1722->Add( 10, 0, 0, 0, 5 );
+ bSizer180->Add( sbSizerErrorHandling, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxEXPAND, 5 );
+ sbSizerExecFinished = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("On completion:") ), wxHORIZONTAL );
- bSizer172->Add( bSizer1722, 0, wxEXPAND, 5 );
+ m_comboBoxExecFinished = new ExecFinishedBox( m_panelBatchSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ sbSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 );
- bSizer172->Add( 0, 5, 0, 0, 5 );
+ bSizer180->Add( sbSizerExecFinished, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- sbSizerLogfileDir = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Logging") ), wxVERTICAL );
- wxBoxSizer* bSizer152;
- bSizer152 = new wxBoxSizer( wxHORIZONTAL );
+ bSizer172->Add( bSizer180, 0, wxEXPAND, 5 );
- m_staticText96 = new wxStaticText( m_panelBatchSettings, wxID_ANY, _("Maximum number of log files:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText96->Wrap( -1 );
- bSizer152->Add( m_staticText96, 1, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
- m_spinCtrlLogCountMax = new wxSpinCtrl( m_panelBatchSettings, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- bSizer152->Add( m_spinCtrlLogCountMax, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer172->Add( 0, 5, 0, 0, 5 );
+ m_checkBoxShowProgress = new wxCheckBox( m_panelBatchSettings, wxID_ANY, _("Show progress dialog"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer172->Add( m_checkBoxShowProgress, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND, 5 );
- sbSizerLogfileDir->Add( bSizer152, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+ m_checkBoxGenerateLogfile = new wxCheckBox( m_panelBatchSettings, wxID_ANY, _("Generate log file"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer172->Add( m_checkBoxGenerateLogfile, 0, wxEXPAND|wxALL, 5 );
m_panelLogfile = new wxPanel( m_panelBatchSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxBoxSizer* bSizer1721;
- bSizer1721 = new wxBoxSizer( wxVERTICAL );
+ bSizer1721 = new wxBoxSizer( wxHORIZONTAL );
- m_staticText94 = new wxStaticText( m_panelLogfile, wxID_ANY, _("Select folder to save log files:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText94->Wrap( -1 );
- bSizer1721->Add( m_staticText94, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
+ m_comboBoxLogfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ bSizer1721->Add( m_comboBoxLogfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 );
- wxBoxSizer* bSizer170;
- bSizer170 = new wxBoxSizer( wxHORIZONTAL );
+ m_buttonSelectLogfileDir = new wxButton( m_panelLogfile, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectLogfileDir->SetToolTip( _("Select folder to save log files") );
- m_comboBoxLogfileDir = new FolderHistoryBox( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer170->Add( m_comboBoxLogfileDir, 1, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1721->Add( m_buttonSelectLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerLogfileDir = new zen::DirPickerCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerLogfileDir->SetToolTip( _("Select a folder") );
+ m_checkBoxLogfilesLimit = new wxCheckBox( m_panelLogfile, wxID_ANY, _("Limit"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxLogfilesLimit->SetToolTip( _("Limit maximum number of log files") );
- bSizer170->Add( m_dirPickerLogfileDir, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1721->Add( m_checkBoxLogfilesLimit, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_spinCtrlLogfileLimit = new wxSpinCtrl( m_panelLogfile, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 50,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ m_spinCtrlLogfileLimit->SetToolTip( _("Limit maximum number of log files") );
- bSizer1721->Add( bSizer170, 0, wxEXPAND, 5 );
+ bSizer1721->Add( m_spinCtrlLogfileLimit, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panelLogfile->SetSizer( bSizer1721 );
m_panelLogfile->Layout();
bSizer1721->Fit( m_panelLogfile );
- sbSizerLogfileDir->Add( m_panelLogfile, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer172->Add( sbSizerLogfileDir, 0, wxEXPAND, 5 );
+ bSizer172->Add( m_panelLogfile, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
bSizer117->Add( bSizer172, 1, wxEXPAND|wxALL, 10 );
@@ -1546,7 +1528,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer68->Add( m_buttonLoad, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
- m_buttonSave = new wxButton( this, wxID_SAVE, _("Save &As..."), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonSave = new wxButton( this, wxID_SAVE, _("Save &as..."), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonSave->SetDefault();
m_buttonSave->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
@@ -1575,8 +1557,11 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_bpButtonSyncConfig->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSyncSettings ), NULL, this );
m_bpButtonAddPair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this );
m_bpButtonRemovePair->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this );
- m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), NULL, this );
- m_spinCtrlLogCountMax->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnChangeMaxLogCountTxt ), 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_buttonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), 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 );
@@ -1592,8 +1577,11 @@ BatchDlgGenerated::~BatchDlgGenerated()
m_bpButtonSyncConfig->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnSyncSettings ), NULL, this );
m_bpButtonAddPair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnAddFolderPair ), NULL, this );
m_bpButtonRemovePair->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnRemoveTopFolderPair ), NULL, this );
- m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( BatchDlgGenerated::OnChangeErrorHandling ), NULL, this );
- m_spinCtrlLogCountMax->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( BatchDlgGenerated::OnChangeMaxLogCountTxt ), 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_buttonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( BatchDlgGenerated::OnLoadBatchJob ), 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 );
@@ -1669,10 +1657,10 @@ BatchFolderPairGenerated::BatchFolderPairGenerated( wxWindow* parent, wxWindowID
m_directoryLeft = new FolderHistoryBox( m_panelLeft, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizer114->Add( m_directoryLeft, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerLeft = new zen::DirPickerCtrl( m_panelLeft, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerLeft->SetToolTip( _("Select a folder") );
+ m_buttonSelectDirLeft = new wxButton( m_panelLeft, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirLeft->SetToolTip( _("Select a folder") );
- bSizer114->Add( m_dirPickerLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer114->Add( m_buttonSelectDirLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panelLeft->SetSizer( bSizer114 );
@@ -1687,10 +1675,10 @@ BatchFolderPairGenerated::BatchFolderPairGenerated( wxWindow* parent, wxWindowID
m_directoryRight = new FolderHistoryBox( m_panelRight, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizer115->Add( m_directoryRight, 1, wxALIGN_CENTER_VERTICAL, 5 );
- m_dirPickerRight = new zen::DirPickerCtrl( m_panelRight, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- m_dirPickerRight->SetToolTip( _("Select a folder") );
+ m_buttonSelectDirRight = new wxButton( m_panelRight, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_buttonSelectDirRight->SetToolTip( _("Select a folder") );
- bSizer115->Add( m_dirPickerRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer115->Add( m_buttonSelectDirRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panelRight->SetSizer( bSizer115 );
@@ -1732,6 +1720,131 @@ BatchFolderPairGenerated::~BatchFolderPairGenerated()
{
}
+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 );
+
+ wxBoxSizer* bSizer136;
+ bSizer136 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer55;
+ bSizer55 = new wxBoxSizer( wxVERTICAL );
+
+ wxStaticBoxSizer* sbSizer6;
+ sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxHORIZONTAL );
+
+ wxFlexGridSizer* fgSizer16;
+ fgSizer16 = new wxFlexGridSizer( 2, 2, 8, 5 );
+ fgSizer16->SetFlexibleDirection( wxBOTH );
+ fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+ m_bitmapByTime = new wxStaticBitmap( this, 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( this, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,40 ), 0 );
+ m_toggleBtnTimeSize->SetFont( wxFont( 11, 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, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bitmapByContent = new wxStaticBitmap( this, 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( this, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,40 ), 0 );
+ m_toggleBtnContent->SetFont( wxFont( 11, 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 );
+
+
+ sbSizer6->Add( fgSizer16, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+
+
+ bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 );
+
+
+ bSizer55->Add( 0, 4, 0, 0, 5 );
+
+ wxBoxSizer* bSizer177;
+ bSizer177 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxStaticBoxSizer* sbSizer25;
+ sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Symbolic Link handling") ), wxVERTICAL );
+
+ wxArrayString m_choiceHandleSymlinksChoices;
+ m_choiceHandleSymlinks = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 );
+ m_choiceHandleSymlinks->SetSelection( -1 );
+ sbSizer25->Add( m_choiceHandleSymlinks, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer177->Add( sbSizer25, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ m_bpButtonHelp->SetToolTip( _("Help") );
+
+ bSizer177->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+
+
+ bSizer55->Add( bSizer177, 0, wxEXPAND, 5 );
+
+ wxBoxSizer* bSizer22;
+ bSizer22 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_button10 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_button10->SetDefault();
+ m_button10->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer22->Add( m_button10, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+
+ m_button6 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_button6->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
+
+ bSizer22->Add( m_button6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer55->Add( bSizer22, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer136->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL|wxALL, 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_button10->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_button10->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 );
@@ -1749,62 +1862,41 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
sbSizer7 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Select variant:") ), wxVERTICAL );
wxFlexGridSizer* fgSizer1;
- fgSizer1 = new wxFlexGridSizer( 4, 3, 8, 5 );
+ fgSizer1 = new wxFlexGridSizer( 4, 2, 8, 5 );
fgSizer1->SetFlexibleDirection( wxHORIZONTAL );
fgSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
- m_radioBtnAutomatic = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
- m_radioBtnAutomatic->SetValue( true );
- m_radioBtnAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer1->Add( m_radioBtnAutomatic, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_toggleBtnAutomatic = new wxToggleButton( this, wxID_ANY, _("<Automatic>"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
- m_buttonAutomatic = new wxButton( this, wxID_ANY, _("<Automatic>"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonAutomatic->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer1->Add( m_buttonAutomatic, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ fgSizer1->Add( m_toggleBtnAutomatic, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
m_staticTextAutomatic = new wxStaticText( this, wxID_ANY, _("Identify and propagate changes on both sides using a database. Deletions, renaming and conflicts are detected automatically."), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextAutomatic->Wrap( 410 );
fgSizer1->Add( m_staticTextAutomatic, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
- m_radioBtnMirror = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnMirror->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer1->Add( m_radioBtnMirror, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_toggleBtnMirror = new wxToggleButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnMirror->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
- m_buttonMirror = new wxButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonMirror->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer1->Add( m_buttonMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ fgSizer1->Add( m_toggleBtnMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_staticTextMirror = new wxStaticText( this, wxID_ANY, _("Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization."), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextMirror->Wrap( 410 );
fgSizer1->Add( m_staticTextMirror, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
- m_radioBtnUpdate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer1->Add( m_radioBtnUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_toggleBtnUpdate = new wxToggleButton( this, wxID_ANY, _("Update ->"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
- m_buttonUpdate = new wxButton( this, wxID_ANY, _("Update ->"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonUpdate->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer1->Add( m_buttonUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ fgSizer1->Add( m_toggleBtnUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_staticTextUpdate = new wxStaticText( this, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextUpdate->Wrap( 410 );
fgSizer1->Add( m_staticTextUpdate, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
- m_radioBtnCustom = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnCustom->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer1->Add( m_radioBtnCustom, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_toggleBtnCustom = new wxToggleButton( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnCustom->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
- m_buttonCustom = new wxButton( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonCustom->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer1->Add( m_buttonCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ fgSizer1->Add( m_toggleBtnCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
m_staticTextCustom = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextCustom->Wrap( 410 );
@@ -1819,43 +1911,80 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizer29->Add( 0, 5, 1, 0, 5 );
- sbSizerCustDelDir = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Deletion handling") ), wxHORIZONTAL );
+ wxStaticBoxSizer* sbSizer27;
+ sbSizer27 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Deletion handling") ), wxVERTICAL );
+
+ wxBoxSizer* bSizer180;
+ bSizer180 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_toggleBtnPermanent = new wxToggleButton( this, wxID_ANY, _("Permanent"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnPermanent->SetToolTip( _("Delete or overwrite files permanently") );
- wxArrayString m_choiceHandleDeletionChoices;
- m_choiceHandleDeletion = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleDeletionChoices, 0 );
- m_choiceHandleDeletion->SetSelection( 0 );
- sbSizerCustDelDir->Add( m_choiceHandleDeletion, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+ bSizer180->Add( m_toggleBtnPermanent, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
- m_panelCustomDeletionDir = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_toggleBtnRecycler = new wxToggleButton( this, wxID_ANY, _("Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnRecycler->SetToolTip( _("Use Recycle Bin when deleting or overwriting files") );
+
+ bSizer180->Add( m_toggleBtnRecycler, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_toggleBtnVersioning = new wxToggleButton( this, wxID_ANY, _("Versioning"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnVersioning->SetToolTip( _("Move time-stamped files into specified folder") );
+
+ bSizer180->Add( m_toggleBtnVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer180->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_checkBoxVersionsLimit = new wxCheckBox( this, wxID_ANY, _("Limit"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxVersionsLimit->SetToolTip( _("Limit maximum number of versions per file") );
+
+ bSizer180->Add( m_checkBoxVersionsLimit, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_spinCtrlVersionsLimit = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 50,-1 ), wxSP_ARROW_KEYS, 1, 2000000000, 1 );
+ m_spinCtrlVersionsLimit->SetToolTip( _("Limit maximum number of versions per file") );
+
+ bSizer180->Add( m_spinCtrlVersionsLimit, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ sbSizer27->Add( bSizer180, 0, wxEXPAND, 5 );
+
+ m_panelVersioning = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxBoxSizer* bSizer1151;
bSizer1151 = new wxBoxSizer( wxHORIZONTAL );
- m_customDelFolder = new FolderHistoryBox( m_panelCustomDeletionDir, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
- bSizer1151->Add( m_customDelFolder, 1, wxALIGN_CENTER_VERTICAL, 5 );
+ 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") );
- m_dirPickerCustomDelFolder = new zen::DirPickerCtrl( m_panelCustomDeletionDir, wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer1151->Add( m_dirPickerCustomDelFolder, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1151->Add( m_buttonSelectDirVersioning, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_panelCustomDeletionDir->SetSizer( bSizer1151 );
- m_panelCustomDeletionDir->Layout();
- bSizer1151->Fit( m_panelCustomDeletionDir );
- sbSizerCustDelDir->Add( m_panelCustomDeletionDir, 1, wxALIGN_CENTER_VERTICAL, 5 );
+ m_panelVersioning->SetSizer( bSizer1151 );
+ m_panelVersioning->Layout();
+ bSizer1151->Fit( m_panelVersioning );
+ sbSizer27->Add( m_panelVersioning, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP, 5 );
- bSizer29->Add( sbSizerCustDelDir, 0, wxEXPAND, 5 );
+ bSizer29->Add( sbSizer27, 0, wxEXPAND, 5 );
bSizer201 = new wxBoxSizer( wxHORIZONTAL );
sbSizerErrorHandling = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Error handling") ), wxHORIZONTAL );
- wxArrayString m_choiceHandleErrorChoices;
- m_choiceHandleError = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 );
- m_choiceHandleError->SetSelection( 0 );
- sbSizerErrorHandling->Add( m_choiceHandleError, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_toggleBtnErrorIgnore = new wxToggleButton( this, wxID_ANY, _("Ignore"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorIgnore->SetToolTip( _("Hide all error and warning messages") );
+ sbSizerErrorHandling->Add( m_toggleBtnErrorIgnore, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer201->Add( sbSizerErrorHandling, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 10 );
+ m_toggleBtnErrorPopup = new wxToggleButton( this, wxID_ANY, _("Pop-up"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_toggleBtnErrorPopup->SetToolTip( _("Show pop-up on errors or warnings") );
+
+ sbSizerErrorHandling->Add( m_toggleBtnErrorPopup, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer201->Add( sbSizerErrorHandling, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
sbSizerExecFinished = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("On completion:") ), wxHORIZONTAL );
@@ -1863,7 +1992,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
sbSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 );
- bSizer201->Add( sbSizerExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer201->Add( sbSizerExecFinished, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
bSizer29->Add( bSizer201, 0, wxEXPAND|wxTOP, 5 );
@@ -1885,26 +2014,23 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
sbSizerSyncDirections = new wxBoxSizer( wxVERTICAL );
- wxGridSizer* gSizer3;
- gSizer3 = new wxGridSizer( 1, 2, 0, 5 );
+ wxBoxSizer* bSizer1801;
+ bSizer1801 = new wxBoxSizer( wxHORIZONTAL );
- m_staticText21 = new wxStaticText( this, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText21 = new wxStaticText( this, wxID_ANY, _("Category"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
m_staticText21->Wrap( -1 );
m_staticText21->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) );
- gSizer3->Add( m_staticText21, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1801->Add( m_staticText21, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText31 = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE );
m_staticText31->Wrap( -1 );
m_staticText31->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) );
- gSizer3->Add( m_staticText31, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer1801->Add( m_staticText31, 1, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- sbSizerSyncDirections->Add( gSizer3, 0, wxBOTTOM|wxEXPAND, 5 );
-
- wxBoxSizer* bSizer121;
- bSizer121 = new wxBoxSizer( wxVERTICAL );
+ sbSizerSyncDirections->Add( bSizer1801, 0, wxEXPAND, 5 );
bSizerLeftOnly = new wxBoxSizer( wxHORIZONTAL );
@@ -1920,7 +2046,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerLeftOnly->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer121->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ sbSizerSyncDirections->Add( bSizerLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizerRightOnly = new wxBoxSizer( wxHORIZONTAL );
@@ -1936,7 +2062,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerRightOnly->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer121->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ sbSizerSyncDirections->Add( bSizerRightOnly, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizerLeftNewer = new wxBoxSizer( wxHORIZONTAL );
@@ -1952,7 +2078,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerLeftNewer->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer121->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ sbSizerSyncDirections->Add( bSizerLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizerRightNewer = new wxBoxSizer( wxHORIZONTAL );
@@ -1968,7 +2094,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerRightNewer->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer121->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ sbSizerSyncDirections->Add( bSizerRightNewer, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizerDifferent = new wxBoxSizer( wxHORIZONTAL );
@@ -1984,7 +2110,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerDifferent->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer121->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ sbSizerSyncDirections->Add( bSizerDifferent, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizerConflict = new wxBoxSizer( wxHORIZONTAL );
@@ -2000,10 +2126,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerConflict->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer121->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- sbSizerSyncDirections->Add( bSizer121, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ sbSizerSyncDirections->Add( bSizerConflict, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
sbSizer2453245->Add( sbSizerSyncDirections, 0, wxEXPAND, 5 );
@@ -2043,20 +2166,20 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
// Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) );
- m_radioBtnAutomatic->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this );
- m_buttonAutomatic->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this );
- m_buttonAutomatic->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this );
- m_radioBtnMirror->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this );
- m_buttonMirror->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this );
- m_buttonMirror->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this );
- m_radioBtnUpdate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this );
- m_buttonUpdate->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this );
- m_buttonUpdate->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this );
- m_radioBtnCustom->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this );
- m_buttonCustom->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this );
- m_buttonCustom->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this );
- m_choiceHandleDeletion->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this );
- m_choiceHandleError->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this );
+ 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_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_checkBoxVersionsLimit->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnToggleVersionsLimit ), 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_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 );
@@ -2071,20 +2194,20 @@ SyncCfgDlgGenerated::~SyncCfgDlgGenerated()
{
// Disconnect Events
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( SyncCfgDlgGenerated::OnClose ) );
- m_radioBtnAutomatic->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this );
- m_buttonAutomatic->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncAutomatic ), NULL, this );
- m_buttonAutomatic->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncAutomaticDouble ), NULL, this );
- m_radioBtnMirror->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this );
- m_buttonMirror->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this );
- m_buttonMirror->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), NULL, this );
- m_radioBtnUpdate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this );
- m_buttonUpdate->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncUpdate ), NULL, this );
- m_buttonUpdate->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncUpdateDouble ), NULL, this );
- m_radioBtnCustom->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this );
- m_buttonCustom->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this );
- m_buttonCustom->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), NULL, this );
- m_choiceHandleDeletion->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeDeletionHandling ), NULL, this );
- m_choiceHandleError->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( SyncCfgDlgGenerated::OnChangeErrorHandling ), NULL, this );
+ 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_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_checkBoxVersionsLimit->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnToggleVersionsLimit ), 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_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 );
@@ -2096,146 +2219,6 @@ SyncCfgDlgGenerated::~SyncCfgDlgGenerated()
}
-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 );
-
- wxBoxSizer* bSizer136;
- bSizer136 = new wxBoxSizer( wxVERTICAL );
-
- wxBoxSizer* bSizer55;
- bSizer55 = new wxBoxSizer( wxVERTICAL );
-
- wxStaticBoxSizer* sbSizer6;
- sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Compare by...") ), wxHORIZONTAL );
-
- wxFlexGridSizer* fgSizer16;
- fgSizer16 = new wxFlexGridSizer( 2, 3, 0, 0 );
- fgSizer16->SetFlexibleDirection( wxBOTH );
- fgSizer16->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_radioBtnSizeDate = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
- m_radioBtnSizeDate->SetValue( true );
- m_radioBtnSizeDate->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") );
-
- fgSizer16->Add( m_radioBtnSizeDate, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapByTime = new wxStaticBitmap( this, 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_buttonTimeSize = new wxButton( this, wxID_ANY, _("File time and size"), wxDefaultPosition, wxSize( -1,42 ), 0 );
- m_buttonTimeSize->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
- m_buttonTimeSize->SetToolTip( _("Files are found equal if\n - last write time and date\n - file size\nare the same") );
-
- fgSizer16->Add( m_buttonTimeSize, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxALL, 5 );
-
- m_radioBtnContent = new wxRadioButton( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- m_radioBtnContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") );
-
- fgSizer16->Add( m_radioBtnContent, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapByContent = new wxStaticBitmap( this, 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_buttonContent = new wxButton( this, wxID_ANY, _("File content"), wxDefaultPosition, wxSize( -1,42 ), 0 );
- m_buttonContent->SetFont( wxFont( 11, 70, 90, 92, false, wxEmptyString ) );
- m_buttonContent->SetToolTip( _("Files are found equal if\n - file content\nis the same") );
-
- fgSizer16->Add( m_buttonContent, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
-
-
- sbSizer6->Add( fgSizer16, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer55->Add( sbSizer6, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 2 );
-
-
- bSizer55->Add( 0, 4, 0, 0, 5 );
-
- wxBoxSizer* bSizer177;
- bSizer177 = new wxBoxSizer( wxHORIZONTAL );
-
- wxStaticBoxSizer* sbSizer25;
- sbSizer25 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Symbolic Link handling") ), wxVERTICAL );
-
- wxArrayString m_choiceHandleSymlinksChoices;
- m_choiceHandleSymlinks = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleSymlinksChoices, 0 );
- m_choiceHandleSymlinks->SetSelection( -1 );
- sbSizer25->Add( m_choiceHandleSymlinks, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer177->Add( sbSizer25, 1, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bpButtonHelp = new wxBitmapButton( this, wxID_HELP, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- m_bpButtonHelp->SetToolTip( _("Help") );
-
- bSizer177->Add( m_bpButtonHelp, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
-
-
- bSizer55->Add( bSizer177, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer22;
- bSizer22 = new wxBoxSizer( wxHORIZONTAL );
-
- m_button10 = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_button10->SetDefault();
- m_button10->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
-
- bSizer22->Add( m_button10, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
-
- m_button6 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
- m_button6->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
-
- bSizer22->Add( m_button6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer55->Add( bSizer22, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
-
-
- bSizer136->Add( bSizer55, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- this->SetSizer( bSizer136 );
- this->Layout();
- bSizer136->Fit( this );
-
- this->Centre( wxBOTH );
-
- // Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( CmpCfgDlgGenerated::OnClose ) );
- m_radioBtnSizeDate->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this );
- m_buttonTimeSize->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this );
- m_buttonTimeSize->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this );
- m_radioBtnContent->Connect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this );
- m_buttonContent->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this );
- m_buttonContent->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), 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_button10->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_radioBtnSizeDate->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this );
- m_buttonTimeSize->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnTimeSize ), NULL, this );
- m_buttonTimeSize->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnTimeSizeDouble ), NULL, this );
- m_radioBtnContent->Disconnect( wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this );
- m_buttonContent->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnContent ), NULL, this );
- m_buttonContent->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( CmpCfgDlgGenerated::OnContentDouble ), 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_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnOkay ), NULL, this );
- m_button6->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( CmpCfgDlgGenerated::OnCancel ), NULL, this );
-
-}
-
SyncStatusDlgGenerated::SyncStatusDlgGenerated( 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 );
@@ -2669,10 +2652,10 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizerCodeInfo->Add( bSizer167, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
- m_hyperlink21 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("- ZenJu -"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink21 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("- ZenJu -"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
m_hyperlink21->SetFont( wxFont( 10, 74, 93, 92, false, wxT("Segoe Print") ) );
m_hyperlink21->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- m_hyperlink21->SetToolTip( _("zhnmju123@gmx.de") );
+ m_hyperlink21->SetToolTip( _("zenju@gmx.de") );
bSizerCodeInfo->Add( m_hyperlink21, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
@@ -2704,10 +2687,10 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer178->Add( m_staticText83, 0, wxALL, 5 );
- m_hyperlink3 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Donate with PayPal"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123@gmx.de&lc=US&currency_code=EUR"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink3->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) );
+ m_hyperlink3 = new wxHyperlinkCtrl( m_panel39, wxID_ANY, _("Donate with PayPal"), wxT("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zenju@gmx.de&no_shipping=1&lc=US&currency_code=EUR"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink3->SetFont( wxFont( 11, 70, 90, 92, true, wxEmptyString ) );
m_hyperlink3->SetBackgroundColour( wxColour( 221, 221, 255 ) );
- m_hyperlink3->SetToolTip( _("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zhnmju123@gmx.de&lc=US&currency_code=EUR") );
+ m_hyperlink3->SetToolTip( _("https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=zenju@gmx.de&no_shipping=1&lc=US&currency_code=EUR") );
bSizer178->Add( m_hyperlink3, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
@@ -2738,7 +2721,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizerTranslators = new wxBoxSizer( wxVERTICAL );
- m_staticText54 = new wxStaticText( m_scrolledWindowTranslators, wxID_ANY, _("Big thanks for localizing FreeFileSync goes out to:"), wxDefaultPosition, wxDefaultSize, 0 );
+ 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 ) );
@@ -2792,9 +2775,9 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer1711->Add( 0, 0, 1, wxEXPAND, 5 );
- m_hyperlink2 = new wxHyperlinkCtrl( this, wxID_ANY, _("Email"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
+ m_hyperlink2 = new wxHyperlinkCtrl( this, wxID_ANY, _("Email"), wxT("mailto:zenju@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
m_hyperlink2->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) );
- m_hyperlink2->SetToolTip( _("zhnmju123@gmx.de") );
+ m_hyperlink2->SetToolTip( _("zenju@gmx.de") );
bSizer1711->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 );
@@ -3002,19 +2985,16 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer99;
bSizer99 = new wxBoxSizer( wxVERTICAL );
- m_checkBoxUseRecycler = new wxCheckBox( m_panel36, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer99->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 );
+ m_checkBoxUseRecycler = new wxCheckBox( m_panel36, wxID_ANY, _("Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer99->Add( m_checkBoxUseRecycler, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxEXPAND, 5 );
m_checkBoxDeleteBothSides = new wxCheckBox( m_panel36, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 );
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, 5 );
-
-
- bSizer179->Add( bSizer99, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer99->Add( m_checkBoxDeleteBothSides, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- bSizer179->Add( 0, 0, 1, wxEXPAND, 5 );
+ bSizer179->Add( bSizer99, 1, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
wxBoxSizer* bSizer25;
bSizer25 = new wxBoxSizer( wxHORIZONTAL );
@@ -3640,7 +3620,7 @@ SyncPreviewDlgGenerated::SyncPreviewDlgGenerated( wxWindow* parent, wxWindowID i
wxBoxSizer* bSizer142;
bSizer142 = new wxBoxSizer( wxHORIZONTAL );
- m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Don't show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer142->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxALL|wxALIGN_CENTER_VERTICAL, 5 );
diff --git a/ui/gui_generated.h b/ui/gui_generated.h
index 29ef091d..42f33064 100644
--- a/ui/gui_generated.h
+++ b/ui/gui_generated.h
@@ -14,7 +14,6 @@
#include "wx_form_build_hide_warnings.h"
#include "../wx+/button.h"
#include "folder_history_box.h"
-#include "../wx+/dir_picker.h"
#include "../wx+/grid.h"
#include "triple_splitter.h"
#include "../wx+/toggle_button.h"
@@ -35,7 +34,6 @@
#include <wx/bmpbuttn.h>
#include <wx/panel.h>
#include <wx/combobox.h>
-#include <wx/filepicker.h>
#include <wx/scrolwin.h>
#include <wx/statbmp.h>
#include <wx/statline.h>
@@ -45,11 +43,11 @@
#include <wx/textctrl.h>
#include <wx/gauge.h>
#include <wx/statbox.h>
-#include <wx/choice.h>
+#include <wx/tglbtn.h>
#include <wx/spinctrl.h>
#include <wx/notebook.h>
#include <wx/dialog.h>
-#include <wx/radiobut.h>
+#include <wx/choice.h>
#include <wx/animate.h>
#include <wx/listbook.h>
#include <wx/listctrl.h>
@@ -100,9 +98,11 @@ protected:
wxPanel* m_panelDirectoryPairs;
wxStaticText* m_staticTextFinalPathLeft;
wxBitmapButton* m_bpButtonAddPair;
+ wxButton* m_buttonSelectDirLeft;
wxPanel* m_panelTopMiddle;
wxBitmapButton* m_bpButtonSwapSides;
wxStaticText* m_staticTextFinalPathRight;
+ wxButton* m_buttonSelectDirRight;
wxScrolledWindow* m_scrolledWindowFolderPairs;
wxBoxSizer* bSizerAddFolderPairs;
zen::Grid* m_gridNavi;
@@ -136,7 +136,7 @@ protected:
wxListBox* m_listBoxHistory;
wxPanel* m_panelFilter;
wxBitmapButton* m_bpButtonFilter;
- wxCheckBox* m_checkBoxHideFilt;
+ wxCheckBox* m_checkBoxShowExcluded;
wxPanel* m_panelStatistics;
wxBoxSizer* bSizer1801;
wxStaticBitmap* m_bitmapCreateLeft;
@@ -189,12 +189,11 @@ protected:
virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); }
virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); }
virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnDirSelected( wxFileDirPickerEvent& 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 OnConfigureFilter( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnHideFilteredButton( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnShowExcluded( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSyncCreateLeft( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSyncDirLeft( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSyncDeleteLeft( wxCommandEvent& event ) { event.Skip(); }
@@ -215,13 +214,11 @@ public:
wxPanel* m_panelTopLeft;
wxBitmapButton* m_bpButtonRemovePair;
FolderHistoryBox* m_directoryLeft;
- zen::DirPickerCtrl* m_dirPickerLeft;
wxBitmapButton* m_bpButtonAltCompCfg;
wxBitmapButton* m_bpButtonLocalFilter;
wxBitmapButton* m_bpButtonAltSyncCfg;
wxPanel* m_panelTopRight;
FolderHistoryBox* m_directoryRight;
- zen::DirPickerCtrl* m_dirPickerRight;
wxBoxSizer* bSizerStatistics;
wxBoxSizer* bSizerData;
@@ -239,19 +236,19 @@ class FolderPairGenerated : public wxPanel
private:
protected:
+ wxButton* m_buttonSelectDirLeft;
+ wxButton* m_buttonSelectDirRight;
public:
wxPanel* m_panelLeft;
wxBitmapButton* m_bpButtonRemovePair;
FolderHistoryBox* m_directoryLeft;
- zen::DirPickerCtrl* m_dirPickerLeft;
wxPanel* m_panel20;
wxBitmapButton* m_bpButtonAltCompCfg;
wxBitmapButton* m_bpButtonLocalFilter;
wxBitmapButton* m_bpButtonAltSyncCfg;
wxPanel* m_panelRight;
FolderHistoryBox* m_directoryRight;
- zen::DirPickerCtrl* m_dirPickerRight;
FolderPairGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL );
~FolderPairGenerated();
@@ -316,17 +313,22 @@ protected:
wxPanel* m_panelMainPair;
wxStaticText* m_staticText532;
wxStaticText* m_staticText5411;
+ wxButton* m_buttonSelectDirLeft;
+ wxButton* m_buttonSelectDirRight;
wxBoxSizer* bSizerAddFolderPairs;
wxPanel* m_panelBatchSettings;
+ wxStaticBoxSizer* sbSizerErrorHandling;
+ wxToggleButton* m_toggleBtnErrorIgnore;
+ wxToggleButton* m_toggleBtnErrorPopup;
+ wxToggleButton* m_toggleBtnErrorExit;
+ wxStaticBoxSizer* sbSizerExecFinished;
+ ExecFinishedBox* m_comboBoxExecFinished;
wxCheckBox* m_checkBoxShowProgress;
- wxStaticText* m_staticText961;
- wxChoice* m_choiceHandleError;
- wxStaticBoxSizer* sbSizerLogfileDir;
- wxStaticText* m_staticText96;
- wxSpinCtrl* m_spinCtrlLogCountMax;
+ wxCheckBox* m_checkBoxGenerateLogfile;
wxPanel* m_panelLogfile;
- wxStaticText* m_staticText94;
- zen::DirPickerCtrl* m_dirPickerLogfileDir;
+ wxButton* m_buttonSelectLogfileDir;
+ wxCheckBox* m_checkBoxLogfilesLimit;
+ wxSpinCtrl* m_spinCtrlLogfileLimit;
wxButton* m_buttonLoad;
wxButton* m_buttonSave;
wxButton* m_button6;
@@ -339,8 +341,11 @@ protected:
virtual void OnSyncSettings( wxCommandEvent& event ) { event.Skip(); }
virtual void OnAddFolderPair( wxCommandEvent& event ) { event.Skip(); }
virtual void OnRemoveTopFolderPair( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnChangeMaxLogCountTxt( 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 OnLoadBatchJob( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSaveBatchJob( wxCommandEvent& event ) { event.Skip(); }
virtual void OnCancel( wxCommandEvent& event ) { event.Skip(); }
@@ -352,10 +357,8 @@ public:
wxBitmapButton* m_bpButtonRemovePair;
wxPanel* m_panelLeft;
FolderHistoryBox* m_directoryLeft;
- zen::DirPickerCtrl* m_dirPickerLeft;
wxPanel* m_panelRight;
FolderHistoryBox* m_directoryRight;
- zen::DirPickerCtrl* m_dirPickerRight;
wxBitmapButton* m_bpButtonAltCompCfg;
wxBitmapButton* m_bpButtonLocalFilter;
wxBitmapButton* m_bpButtonAltSyncCfg;
@@ -378,14 +381,14 @@ protected:
wxStaticText* m_staticText53;
wxStaticText* m_staticText541;
wxPanel* m_panelLeft;
+ wxButton* m_buttonSelectDirLeft;
wxPanel* m_panelRight;
+ wxButton* m_buttonSelectDirRight;
public:
wxBitmapButton* m_bpButtonRemovePair;
FolderHistoryBox* m_directoryLeft;
- zen::DirPickerCtrl* m_dirPickerLeft;
FolderHistoryBox* m_directoryRight;
- zen::DirPickerCtrl* m_dirPickerRight;
wxBitmapButton* m_bpButtonAltCompCfg;
wxBitmapButton* m_bpButtonLocalFilter;
wxBitmapButton* m_bpButtonAltSyncCfg;
@@ -396,6 +399,42 @@ public:
};
///////////////////////////////////////////////////////////////////////////////
+/// Class CmpCfgDlgGenerated
+///////////////////////////////////////////////////////////////////////////////
+class CmpCfgDlgGenerated : public wxDialog
+{
+private:
+
+protected:
+ wxStaticBitmap* m_bitmapByTime;
+ wxToggleButton* m_toggleBtnTimeSize;
+ wxStaticBitmap* m_bitmapByContent;
+ wxToggleButton* m_toggleBtnContent;
+ wxChoice* m_choiceHandleSymlinks;
+ wxBitmapButton* m_bpButtonHelp;
+ wxButton* m_button10;
+ 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();
+
+};
+
+///////////////////////////////////////////////////////////////////////////////
/// Class SyncCfgDlgGenerated
///////////////////////////////////////////////////////////////////////////////
class SyncCfgDlgGenerated : public wxDialog
@@ -403,26 +442,26 @@ class SyncCfgDlgGenerated : public wxDialog
private:
protected:
- wxRadioButton* m_radioBtnAutomatic;
- wxButton* m_buttonAutomatic;
+ wxToggleButton* m_toggleBtnAutomatic;
wxStaticText* m_staticTextAutomatic;
- wxRadioButton* m_radioBtnMirror;
- wxButton* m_buttonMirror;
+ wxToggleButton* m_toggleBtnMirror;
wxStaticText* m_staticTextMirror;
- wxRadioButton* m_radioBtnUpdate;
- wxButton* m_buttonUpdate;
+ wxToggleButton* m_toggleBtnUpdate;
wxStaticText* m_staticTextUpdate;
- wxRadioButton* m_radioBtnCustom;
- wxButton* m_buttonCustom;
+ wxToggleButton* m_toggleBtnCustom;
wxStaticText* m_staticTextCustom;
- wxStaticBoxSizer* sbSizerCustDelDir;
- wxChoice* m_choiceHandleDeletion;
- wxPanel* m_panelCustomDeletionDir;
- FolderHistoryBox* m_customDelFolder;
- zen::DirPickerCtrl* m_dirPickerCustomDelFolder;
+ wxToggleButton* m_toggleBtnPermanent;
+ wxToggleButton* m_toggleBtnRecycler;
+ wxToggleButton* m_toggleBtnVersioning;
+ wxCheckBox* m_checkBoxVersionsLimit;
+ wxSpinCtrl* m_spinCtrlVersionsLimit;
+ wxPanel* m_panelVersioning;
+ FolderHistoryBox* m_versioningFolder;
+ wxButton* m_buttonSelectDirVersioning;
wxBoxSizer* bSizer201;
wxStaticBoxSizer* sbSizerErrorHandling;
- wxChoice* m_choiceHandleError;
+ wxToggleButton* m_toggleBtnErrorIgnore;
+ wxToggleButton* m_toggleBtnErrorPopup;
wxStaticBoxSizer* sbSizerExecFinished;
ExecFinishedBox* m_comboBoxExecFinished;
wxStaticBitmap* m_bitmapDatabase;
@@ -452,16 +491,20 @@ protected:
// Virtual event handlers, overide them in your derived class
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnSyncAutomatic( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSyncAutomaticDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncAutomatic( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSyncMirrorDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncMirror( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSyncUpdateDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnSyncCustom( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncUpdate( wxCommandEvent& event ) { event.Skip(); }
virtual void OnSyncCustomDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnChangeDeletionHandling( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnChangeErrorHandling( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSyncCustom( 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 OnToggleVersionsLimit( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnErrorIgnore( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnErrorPopup( 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(); }
@@ -480,44 +523,6 @@ public:
};
///////////////////////////////////////////////////////////////////////////////
-/// Class CmpCfgDlgGenerated
-///////////////////////////////////////////////////////////////////////////////
-class CmpCfgDlgGenerated : public wxDialog
-{
-private:
-
-protected:
- wxRadioButton* m_radioBtnSizeDate;
- wxStaticBitmap* m_bitmapByTime;
- wxButton* m_buttonTimeSize;
- wxRadioButton* m_radioBtnContent;
- wxStaticBitmap* m_bitmapByContent;
- wxButton* m_buttonContent;
- wxChoice* m_choiceHandleSymlinks;
- wxBitmapButton* m_bpButtonHelp;
- wxButton* m_button10;
- wxButton* m_button6;
-
- // Virtual event handlers, overide them in your derived class
- virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnTimeSize( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnTimeSizeDouble( wxMouseEvent& event ) { event.Skip(); }
- virtual void OnContent( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnContentDouble( wxMouseEvent& 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 SyncStatusDlgGenerated
///////////////////////////////////////////////////////////////////////////////
class SyncStatusDlgGenerated : public wxFrame
diff --git a/ui/gui_status_handler.cpp b/ui/gui_status_handler.cpp
index b25e4249..54dd7b40 100644
--- a/ui/gui_status_handler.cpp
+++ b/ui/gui_status_handler.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "gui_status_handler.h"
@@ -11,6 +11,7 @@
#include "main_dlg.h"
#include "exec_finished_box.h"
#include "../lib/generate_logfile.h"
+#include "../lib/resolve_path.h"
using namespace zen;
using namespace xmlAccess;
@@ -236,7 +237,10 @@ SyncStatusHandler::~SyncStatusHandler()
if (isCloseProgressDlgCommand(finalCommand))
showFinalResults = false; //take precedence over current visibility status
else if (!finalCommand.empty())
- shellExecute(finalCommand);
+ {
+ auto cmdexp = utfCvrtTo<wxString>(expandMacros(utfCvrtTo<Zstring>(finalCommand)));
+ shellExecute(cmdexp);
+ }
}
//notify to syncStatusFrame that current process has ended
diff --git a/ui/gui_status_handler.h b/ui/gui_status_handler.h
index 0bda9923..3cc0a6bf 100644
--- a/ui/gui_status_handler.h
+++ b/ui/gui_status_handler.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef GUISTATUSHANDLER_H_INCLUDED
diff --git a/ui/main_dlg.cpp b/ui/main_dlg.cpp
index 7681cde2..894b0b11 100644
--- a/ui/main_dlg.cpp
+++ b/ui/main_dlg.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "main_dlg.h"
@@ -16,10 +16,10 @@
#include <wx/display.h>
#include <wx/app.h>
#include <wx/dcmemory.h>
+#include <wx/filedlg.h>
#include <wx+/context_menu.h>
#include "folder_history_box.h"
#include <wx+/button.h>
-#include <wx+/dir_picker.h>
#include "../comparison.h"
#include "../synchronization.h"
#include "../algorithm.h"
@@ -62,11 +62,12 @@ using namespace std::rel_ops;
namespace
{
-struct wxClientDataString : public wxClientData //we need a wxClientData derived class to tell wxWidgets to take object ownership!
+struct wxClientHistoryData: public wxClientData //we need a wxClientData derived class to tell wxWidgets to take object ownership!
{
- wxClientDataString(const wxString& name) : name_(name) {}
+ wxClientHistoryData(const wxString& cfgFile, int lastUseIndex) : cfgFile_(cfgFile), lastUseIndex_(lastUseIndex) {}
- wxString name_;
+ wxString cfgFile_;
+ int lastUseIndex_; //support sorting history by last usage, the higher the index the more recent the usage
};
IconBuffer::IconSize convert(xmlAccess::FileIconSize isize)
@@ -92,12 +93,11 @@ public:
DirectoryNameMainImpl(MainDialog& mainDlg,
wxWindow& dropWindow1,
Grid& dropGrid,
- wxDirPickerCtrl& dirPicker,
+ wxButton& dirSelectButton,
FolderHistoryBox& dirName,
wxStaticText& staticText) :
- DirectoryName(dropWindow1, dirPicker, dirName, &staticText, &dropGrid.getMainWin()),
- mainDlg_(mainDlg),
- dropGrid_(dropGrid) {}
+ DirectoryName(dropWindow1, dirSelectButton, dirName, &staticText, &dropGrid.getMainWin()),
+ mainDlg_(mainDlg) {}
virtual bool acceptDrop(const std::vector<wxString>& droppedFiles, const wxPoint& clientPos, const wxWindow& wnd)
{
@@ -117,7 +117,7 @@ public:
break;
}
- mainDlg_.clearGrid();
+ //mainDlg_.clearGrid();
return true;
}
@@ -126,7 +126,6 @@ private:
DirectoryNameMainImpl& operator=(const DirectoryNameMainImpl&);
MainDialog& mainDlg_;
- Grid& dropGrid_;
};
//------------------------------------------------------------------
@@ -194,8 +193,12 @@ public:
DirectoryPair(wxWindow* parent, MainDialog& mainDialog) :
FolderPairGenerated(parent),
FolderPairCallback<FolderPairGenerated>(static_cast<FolderPairGenerated&>(*this), mainDialog), //pass FolderPairGenerated part...
- dirNameLeft (*m_panelLeft, *m_dirPickerLeft, *m_directoryLeft),
- dirNameRight(*m_panelRight, *m_dirPickerRight, *m_directoryRight) {}
+ dirNameLeft (*m_panelLeft, *m_buttonSelectDirLeft, *m_directoryLeft),
+ dirNameRight(*m_panelRight, *m_buttonSelectDirRight, *m_directoryRight)
+ {
+ dirNameLeft .Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::OnDirSelected), nullptr, &mainDialog);
+ dirNameRight.Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::OnDirSelected), nullptr, &mainDialog);
+ }
void setValues(const wxString& leftDir,
const wxString& rightDir,
@@ -227,15 +230,19 @@ public:
dirNameLeft(mainDialog,
*mainDialog.m_panelTopLeft,
*mainDialog.m_gridMainL,
- *mainDialog.m_dirPickerLeft,
+ *mainDialog.m_buttonSelectDirLeft,
*mainDialog.m_directoryLeft,
*mainDialog.m_staticTextFinalPathLeft),
dirNameRight(mainDialog,
*mainDialog.m_panelTopRight,
*mainDialog.m_gridMainR,
- *mainDialog.m_dirPickerRight,
+ *mainDialog.m_buttonSelectDirRight,
*mainDialog.m_directoryRight,
- *mainDialog.m_staticTextFinalPathRight) {}
+ *mainDialog.m_staticTextFinalPathRight)
+ {
+ dirNameLeft .Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::OnDirSelected), nullptr, &mainDialog);
+ dirNameRight.Connect(EVENT_ON_DIR_SELECTED, wxCommandEventHandler(MainDialog::OnDirSelected), nullptr, &mainDialog);
+ }
void setValues(const wxString& leftDir,
const wxString& rightDir,
@@ -493,7 +500,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
wxAuiPaneInfo().Name(wxT("Panel3")).CenterPane().PaneBorder(false));
auiMgr.AddPane(m_gridNavi,
- wxAuiPaneInfo().Name(L"Panel10").Left().Layer(3).Caption(_("Overview")).MinSize(350, m_gridNavi->GetSize().GetHeight())); //MinSize(): just default size, see comment below
+ wxAuiPaneInfo().Name(L"Panel10").Left().Layer(3).Caption(_("Overview")).MinSize(230, m_gridNavi->GetSize().GetHeight())); //MinSize(): just default size, see comment below
auiMgr.AddPane(m_panelConfig,
wxAuiPaneInfo().Name(wxT("Panel4")).Layer(4).Bottom().Row(1).Position(0).Caption(_("Configuration")).MinSize(m_listBoxHistory->GetSize().GetWidth(), m_panelConfig->GetSize().GetHeight()));
@@ -664,7 +671,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
//Connect(wxEVT_MOVE, wxSizeEventHandler(MainDialog::OnResize), nullptr, this);
//calculate witdh of folder pair manually (if scrollbars are visible)
- m_panelTopLeft->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeFolderPairs), nullptr, this);
+ m_panelTopLeft->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeLeftFolderWidth), nullptr, this);
//dynamically change sizer direction depending on size
m_panelConfig ->Connect(wxEVT_SIZE, wxEventHandler(MainDialog::OnResizeConfigPanel), nullptr, this);
@@ -688,7 +695,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
//asynchronous call to wxWindow::Layout(): fix superfluous frame on right and bottom when FFS is started in fullscreen mode
Connect(wxEVT_IDLE, wxIdleEventHandler(MainDialog::OnLayoutWindowAsync), nullptr, this);
wxCommandEvent evtDummy; //call once before OnLayoutWindowAsync()
- OnResizeFolderPairs(evtDummy); //
+ OnResizeLeftFolderWidth(evtDummy); //
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
//some convenience: if FFS is started with a *.ffs_gui file as commandline parameter AND all directories contained exist, comparison shall be started right away
@@ -771,10 +778,14 @@ void MainDialog::setGlobalCfgOnInit(const xmlAccess::XmlGlobalSettings& globalSe
treeDataView->setSortDirection(globalSettings.gui.naviLastSortColumn, globalSettings.gui.naviLastSortAscending);
+ //--------------------------------------------------------------------------------
//load list of last used configuration files
std::vector<wxString> cfgFileNames = globalSettings.gui.cfgFileHistory;
- cfgFileNames.push_back(lastRunConfigName()); //make sure <Last session> is always part of history list
+ std::reverse(cfgFileNames.begin(), cfgFileNames.end()); //list is stored with last used files first in xml, however addFileToCfgHistory() needs them last!!!
+
+ cfgFileNames.push_back(lastRunConfigName()); //make sure <Last session> is always part of history list (if existing)
addFileToCfgHistory(cfgFileNames);
+ //--------------------------------------------------------------------------------
//load list of last used folders
*folderHistoryLeft = FolderHistory(globalSettings.gui.folderHistoryLeft, globalSettings.gui.folderHistMax);
@@ -794,8 +805,12 @@ void MainDialog::setGlobalCfgOnInit(const xmlAccess::XmlGlobalSettings& globalSe
auiMgr.LoadPerspective(globalSettings.gui.guiPerspectiveLast);
//restore original captions
- for (CaptionNameMapping::const_iterator i = captionNameMap.begin(); i != captionNameMap.end(); ++i)
- auiMgr.GetPane(i->second).Caption(i->first);
+ for (auto iter = captionNameMap.begin(); iter != captionNameMap.end(); ++iter)
+ auiMgr.GetPane(iter->second).Caption(iter->first);
+
+ //if MainDialog::onQueryEndSession() is called while comparison is active, this panel is saved and restored as "visible"
+ auiMgr.GetPane(compareStatus->getAsWindow()).Hide();
+
auiMgr.Update();
}
@@ -809,18 +824,6 @@ xmlAccess::XmlGlobalSettings MainDialog::getGlobalCfgBeforeExit()
globalSettings.programLanguage = getLanguage();
- //write global settings to (global) variable stored in application instance
- if (IsIconized()) //we need to (reliably) retrieve non-iconized, non-maximized size and position
- Iconize(false);
-
- globalSettings.gui.isMaximized = IsMaximized(); //evaluate AFTER uniconizing!
-
- if (IsMaximized())
- Maximize(false);
-
- globalSettings.gui.dlgSize = GetSize();
- globalSettings.gui.dlgPos = GetPosition();
-
//retrieve column attributes
globalSettings.gui.columnAttribLeft = gridview::convertConfig(m_gridMainL->getColumnConfig());
globalSettings.gui.columnAttribRight = gridview::convertConfig(m_gridMainR->getColumnConfig());
@@ -833,13 +836,24 @@ xmlAccess::XmlGlobalSettings MainDialog::getGlobalCfgBeforeExit()
globalSettings.gui.naviLastSortColumn = sortInfo.first;
globalSettings.gui.naviLastSortAscending = sortInfo.second;
+ //--------------------------------------------------------------------------------
//write list of last used configuration files
- std::vector<wxString> cfgFileHistory;
+ typedef std::pair<wxString, int> HistItem; //(cfg-file/last use index)
+ std::vector<HistItem> historyDetail;
for (unsigned int i = 0; i < m_listBoxHistory->GetCount(); ++i)
- if (auto clientString = dynamic_cast<wxClientDataString*>(m_listBoxHistory->GetClientObject(i)))
- cfgFileHistory.push_back(clientString->name_);
+ if (auto clientString = dynamic_cast<const wxClientHistoryData*>(m_listBoxHistory->GetClientObject(i)))
+ historyDetail.push_back(std::make_pair(clientString->cfgFile_, clientString->lastUseIndex_));
+ //sort by last use, most recent items *first* (looks better in xml than the reverse)
+ std::sort(historyDetail.begin(), historyDetail.end(), [](const HistItem& lhs, const HistItem& rhs) { return lhs.second > rhs.second; });
+
+ std::vector<wxString> history;
+ std::transform(historyDetail.begin(), historyDetail.end(), std::back_inserter(history), [](const HistItem& item) { return item.first; });
+
+ if (history.size() > globalSettings.gui.cfgFileHistMax) //erase oldest elements
+ history.resize(globalSettings.gui.cfgFileHistMax);
- globalSettings.gui.cfgFileHistory = cfgFileHistory;
+ globalSettings.gui.cfgFileHistory = history;
+ //--------------------------------------------------------------------------------
globalSettings.gui.lastUsedConfigFiles = activeConfigFiles;
//write list of last used folders
@@ -848,6 +862,19 @@ xmlAccess::XmlGlobalSettings MainDialog::getGlobalCfgBeforeExit()
globalSettings.gui.guiPerspectiveLast = auiMgr.SavePerspective();
+ //we need to portably retrieve non-iconized, non-maximized size and position (non-portable: GetWindowPlacement())
+ //call *after* wxAuiManager::SavePerspective()!
+ if (IsIconized())
+ Iconize(false);
+
+ globalSettings.gui.isMaximized = IsMaximized(); //evaluate AFTER uniconizing!
+
+ if (IsMaximized())
+ Maximize(false);
+
+ globalSettings.gui.dlgSize = GetSize();
+ globalSettings.gui.dlgPos = GetPosition();
+
return globalSettings;
}
@@ -871,7 +898,7 @@ void MainDialog::setSyncDirManually(const std::vector<FileSystemObject*>& select
void MainDialog::setManualFilter(const std::vector<FileSystemObject*>& selection, bool setIncluded)
{
//if hidefiltered is active, there should be no filtered elements on screen => current element was filtered out
- assert(!currentCfg.hideFilteredElements || !setIncluded);
+ assert(currentCfg.showFilteredElements || !setIncluded);
if (!selection.empty())
{
@@ -1184,11 +1211,15 @@ void MainDialog::openExternalApplication(const wxString& commandline, const zen:
wxString command = commandline;
- auto tryReplace = [&](const wxString& phrase, const wxString& replacement) -> bool
+ auto tryReplace = [&](wxString phrase, const wxString& replacement) -> bool
{
- if (command.find(phrase) != wxString::npos)
+ wxString cmdTmp = command.Upper(); //case insensitive search
+ phrase.MakeUpper(); //
+
+ size_t pos = cmdTmp.find(phrase);
+ if (pos != wxString::npos)
{
- replace(command, phrase, replacement);
+ command.replace(pos, phrase.size(), replacement);
if (replacement.empty())
return false;
}
@@ -1196,10 +1227,10 @@ void MainDialog::openExternalApplication(const wxString& commandline, const zen:
};
bool expandSuccess =
- /**/ tryReplace(L"%nameCo", nameCo); //attention: replace %nameCo, %dirCo BEFORE %name, %dir to handle dependency
- expandSuccess = tryReplace(L"%dirCo", dirCo ) && expandSuccess; //
- expandSuccess = tryReplace(L"%name", name ) && expandSuccess; //prevent short-cut behavior!
- expandSuccess = tryReplace(L"%dir", dir ) && expandSuccess; //
+ /**/ tryReplace(L"%item_path%" , name ); //prevent short-cut behavior!
+ expandSuccess = tryReplace(L"%item_folder%" , dir ) && expandSuccess; //
+ expandSuccess = tryReplace(L"%item2_path%" , nameCo) && expandSuccess; //
+ expandSuccess = tryReplace(L"%item2_folder%", dirCo ) && expandSuccess; //
const bool openFileBrowser = [&]() -> bool
{
@@ -1208,8 +1239,11 @@ void MainDialog::openExternalApplication(const wxString& commandline, const zen:
}();
if (!openFileBrowser || expandSuccess)
- zen::shellExecute(command); //just execute, show error message if command is malformed
- else //support built-in fallback!
+ {
+ auto cmdExp = utfCvrtTo<wxString>(expandMacros(utfCvrtTo<Zstring>(command)));
+ zen::shellExecute(cmdExp); //just execute, show error message if command is malformed
+ }
+ else //failed to expand file browser command: support built-in fallback instead of an error!
{
wxString fallbackDir;
if (fsObj)
@@ -1410,7 +1444,7 @@ void MainDialog::OnResizeStatisticsPanel(wxEvent& event)
}
-void MainDialog::OnResizeFolderPairs(wxEvent& event)
+void MainDialog::OnResizeLeftFolderWidth(wxEvent& event)
{
//adapt left-shift display distortion caused by scrollbars for multiple folder pairs
const int width = m_panelTopLeft->GetSize().GetWidth();
@@ -1418,7 +1452,6 @@ void MainDialog::OnResizeFolderPairs(wxEvent& event)
[&](DirectoryPair* dirPair)
{
dirPair->m_panelLeft->SetMinSize(wxSize(width, -1));
-
});
event.Skip();
@@ -2186,19 +2219,17 @@ void MainDialog::OnSyncSettingsContext(wxMouseEvent& event)
}
-void MainDialog::OnDirSelected(wxFileDirPickerEvent& event)
+void MainDialog::onNaviPanelFilesDropped(FileDropEvent& event)
{
- //left and right directory text-control and dirpicker are synchronized by MainFolderDragDrop automatically
-
- clearGrid(); //disable the sync button
-
+ loadConfiguration(event.getFiles());
event.Skip();
}
-void MainDialog::onNaviPanelFilesDropped(FileDropEvent& event)
+void MainDialog::OnDirSelected(wxCommandEvent& event)
{
- loadConfiguration(event.getFiles());
+ //left and right directory text-control and dirpicker are synchronized by MainFolderDragDrop automatically
+ clearGrid(); //disable the sync button
event.Skip();
}
@@ -2225,10 +2256,17 @@ void MainDialog::addFileToCfgHistory(const std::vector<wxString>& filenames)
//potentially slow network access: give all checks 500ms to finish
wait_for_all_timed(fileEx.begin(), fileEx.end(), boost::posix_time::milliseconds(500));
+
//------------------------------------------------------------------------------------------
+ //determine highest "last use" index number of m_listBoxHistory
+ int lastUseIndexMax = 0;
+ for (int i = 0; i < static_cast<int>(m_listBoxHistory->GetCount()); ++i)
+ if (auto histData = dynamic_cast<const wxClientHistoryData*>(m_listBoxHistory->GetClientObject(i)))
+ if (histData->lastUseIndex_ > lastUseIndexMax)
+ lastUseIndexMax = histData->lastUseIndex_;
- std::deque<bool> selections(m_listBoxHistory->GetCount());
+ std::deque<bool> selections(m_listBoxHistory->GetCount()); //items to select after update of history list
auto futIter = fileEx.begin();
for (auto iter = filenames.begin(); iter != filenames.end(); ++iter, ++futIter)
@@ -2238,37 +2276,28 @@ void MainDialog::addFileToCfgHistory(const std::vector<wxString>& filenames)
continue;
const wxString& filename = *iter;
- const Zstring file = toZ(filename);
-
- int posFound = -1;
- for (int i = 0; i < static_cast<int>(m_listBoxHistory->GetCount()); ++i)
+ auto findItem = [&]() -> int
{
- wxClientDataString* cData = dynamic_cast<wxClientDataString*>(m_listBoxHistory->GetClientObject(i));
- if (cData)
- {
- const wxString& filenameTmp = cData->name_;
+ for (int i = 0; i < static_cast<int>(m_listBoxHistory->GetCount()); ++i)
+ if (auto histData = dynamic_cast<const wxClientHistoryData*>(m_listBoxHistory->GetClientObject(i)))
+ if (samePhysicalFile(toZ(filename), toZ(histData->cfgFile_)))
+ return i;
+ return -1;
+ };
- //tests if the same filenames are specified, even if they are relative to the current working directory/include symlinks or \\?\ prefix
- if (zen::samePhysicalFile(toZ(filename), toZ(filenameTmp)))
- {
- posFound = i;
- break;
- }
- }
+ const int itemPos = findItem();
+ if (itemPos >= 0) //update
+ {
+ if (auto histData = dynamic_cast<wxClientHistoryData*>(m_listBoxHistory->GetClientObject(itemPos)))
+ histData->lastUseIndex_ = ++lastUseIndexMax;
+ selections[itemPos] = true;
}
-
- if (posFound != -1)
- selections[posFound] = true;
- else
+ else //insert
{
- int newPos = -1;
- //the default config file should receive a different name on GUI
- if (zen::samePhysicalFile(toZ(lastRunConfigName()), toZ(filename)))
- newPos = m_listBoxHistory->Append(_("<Last session>"), new wxClientDataString(filename));
- else
- newPos = m_listBoxHistory->Append(getFormattedHistoryElement(filename), new wxClientDataString(filename));
-
+ const wxString label = samePhysicalFile(toZ(lastRunConfigName()), toZ(filename)) ? //give default config file a different name
+ _("<Last session>") : getFormattedHistoryElement(filename);
+ const int newPos = m_listBoxHistory->Append(label, new wxClientHistoryData(filename, ++lastUseIndexMax)); //*insert* into sorted list
selections.insert(selections.begin() + newPos, true);
}
}
@@ -2376,7 +2405,7 @@ bool MainDialog::saveOldConfig() //return false on user abort
ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_NO | ReturnQuestionDlg::BUTTON_CANCEL,
replaceCpy(_("Do you want to save changes to %x?"), L"%x", fmtFileName(afterLast(utfCvrtTo<Zstring>(filename), FILE_NAME_SEPARATOR))),
filename, //caption
- _("Save"), _("Don't Save"),
+ _("&Save"), _("Do&n't save"),
&cb))
{
case ReturnQuestionDlg::BUTTON_YES:
@@ -2443,8 +2472,8 @@ void MainDialog::OnLoadFromHistory(wxCommandEvent& event)
std::for_each(selections.begin(), selections.end(),
[&](int pos)
{
- if (auto cData = dynamic_cast<wxClientDataString*>(m_listBoxHistory->GetClientObject(pos)))
- filenames.push_back(cData->name_);
+ if (auto histData = dynamic_cast<const wxClientHistoryData*>(m_listBoxHistory->GetClientObject(pos)))
+ filenames.push_back(histData->cfgFile_);
});
if (!filenames.empty())
@@ -2649,7 +2678,7 @@ void MainDialog::setConfig(const xmlAccess::XmlGuiConfig& newGuiCfg)
//read GUI layout
- m_checkBoxHideFilt->SetValue(currentCfg.hideFilteredElements);
+ m_checkBoxShowExcluded->SetValue(currentCfg.showFilteredElements);
showSyncAction(currentCfg.showSyncAction);
@@ -2710,7 +2739,7 @@ void MainDialog::updateGuiAfterFilterChange(int delay)
{
//signal UI that grids need to be refreshed on next Update()
- if (currentCfg.hideFilteredElements)
+ if (!currentCfg.showFilteredElements)
{
gridview::refresh(*m_gridMainL, *m_gridMainC, *m_gridMainR);
m_gridMainL->Update();
@@ -2724,12 +2753,12 @@ void MainDialog::updateGuiAfterFilterChange(int delay)
}
-void MainDialog::OnHideFilteredButton(wxCommandEvent& event)
+void MainDialog::OnShowExcluded(wxCommandEvent& event)
{
//toggle showing filtered rows
- currentCfg.hideFilteredElements = !currentCfg.hideFilteredElements;
- //make sure, checkbox and "hideFiltered" are in sync
- m_checkBoxHideFilt->SetValue(currentCfg.hideFilteredElements);
+ currentCfg.showFilteredElements = !currentCfg.showFilteredElements;
+ //make sure, checkbox and value are in sync
+ m_checkBoxShowExcluded->SetValue(currentCfg.showFilteredElements);
updateGui();
}
@@ -3043,15 +3072,14 @@ void MainDialog::OnCompare(wxCommandEvent& event)
}
}
- //begin comparison
- zen::CompareProcess compProc(globalCfg.fileTimeTolerance,
- globalCfg.optDialogs,
- true, //allow pw prompt
- globalCfg.runWithBackgroundPriority,
- statusHandler);
-
- //technical representation of comparison data
- compProc.startCompareProcess(cmpConfig, folderCmp); //throw GuiAbortProcess
+ //COMPARE DIRECTORIES
+ compare(globalCfg.fileTimeTolerance,
+ globalCfg.optDialogs,
+ true, //allow pw prompt
+ globalCfg.runWithBackgroundPriority,
+ cmpConfig,
+ folderCmp,
+ statusHandler); //throw GuiAbortProcess
}
catch (GuiAbortProcess&)
{
@@ -3082,7 +3110,7 @@ void MainDialog::OnCompare(wxCommandEvent& event)
//prepare status information
if (allElementsEqual(folderCmp))
- flashStatusInformation(_("All directories in sync!"));
+ flashStatusInformation(_("All folders are in sync!"));
}
@@ -3265,24 +3293,21 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
}
}
- //start synchronization and mark all elements processed
- zen::SyncProcess syncProc(xmlAccess::extractJobName(activeFileName),
- formatTime<std::wstring>(L"%Y-%m-%d %H%M%S"),
- globalCfg.optDialogs,
- globalCfg.verifyFileCopy,
- globalCfg.copyLockedFiles,
- globalCfg.copyFilePermissions,
- globalCfg.transactionalFileCopy,
- globalCfg.runWithBackgroundPriority,
- statusHandler);
-
+ //START SYNCHRONIZATION
const std::vector<zen::FolderPairSyncCfg> syncProcessCfg = zen::extractSyncCfg(guiCfg.mainCfg);
-
- //make sure syncProcessCfg and dataToSync have same size and correspond!
if (syncProcessCfg.size() != folderCmp.size())
throw std::logic_error("Programming Error: Contract violation!"); //should never happen: sync button is deactivated if they are not in sync
- syncProc.startSynchronizationProcess(syncProcessCfg, folderCmp);
+ synchronize(localTime(),
+ globalCfg.optDialogs,
+ globalCfg.verifyFileCopy,
+ globalCfg.copyLockedFiles,
+ globalCfg.copyFilePermissions,
+ globalCfg.transactionalFileCopy,
+ globalCfg.runWithBackgroundPriority,
+ syncProcessCfg,
+ folderCmp,
+ statusHandler);
//play (optional) sound notification after sync has completed (GUI and batch mode)
const wxString soundFile = toWx(zen::getResourceDir()) + L"Sync_Complete.wav";
@@ -3379,6 +3404,7 @@ void MainDialog::OnSwapSides(wxCommandEvent& event)
m_bpButtonLeftNewer->setActive(m_bpButtonRightNewer->isActive());
m_bpButtonRightNewer->setActive(tmp);
+ /* for sync preview and "mirror" variant swapping may create strange effect:
tmp = m_bpButtonSyncCreateLeft->isActive();
m_bpButtonSyncCreateLeft->setActive(m_bpButtonSyncCreateRight->isActive());
m_bpButtonSyncCreateRight->setActive(tmp);
@@ -3390,6 +3416,7 @@ void MainDialog::OnSwapSides(wxCommandEvent& event)
tmp = m_bpButtonSyncDirOverwLeft->isActive();
m_bpButtonSyncDirOverwLeft->setActive(m_bpButtonSyncDirOverwRight->isActive());
m_bpButtonSyncDirOverwRight->setActive(tmp);
+ */
//swap grid information
zen::swapGrids(getConfig().mainCfg, folderCmp);
@@ -3427,7 +3454,7 @@ void MainDialog::updateGridViewData()
if (showSyncAction_)
{
- const GridView::StatusSyncPreview result = gridDataView->updateSyncPreview(currentCfg.hideFilteredElements,
+ const GridView::StatusSyncPreview result = gridDataView->updateSyncPreview(!currentCfg.showFilteredElements,
m_bpButtonSyncCreateLeft-> isActive(),
m_bpButtonSyncCreateRight-> isActive(),
m_bpButtonSyncDeleteLeft-> isActive(),
@@ -3475,7 +3502,7 @@ void MainDialog::updateGridViewData()
}
else
{
- const GridView::StatusCmpResult result = gridDataView->updateCmpResult(currentCfg.hideFilteredElements,
+ const GridView::StatusCmpResult result = gridDataView->updateCmpResult(!currentCfg.showFilteredElements,
m_bpButtonLeftOnly-> isActive(),
m_bpButtonRightOnly-> isActive(),
m_bpButtonLeftNewer-> isActive(),
@@ -3518,7 +3545,7 @@ void MainDialog::updateGridViewData()
//navigation tree
if (showSyncAction_)
- treeDataView->updateSyncPreview(currentCfg.hideFilteredElements,
+ treeDataView->updateSyncPreview(!currentCfg.showFilteredElements,
m_bpButtonSyncCreateLeft-> isActive(),
m_bpButtonSyncCreateRight-> isActive(),
m_bpButtonSyncDeleteLeft-> isActive(),
@@ -3529,7 +3556,7 @@ void MainDialog::updateGridViewData()
m_bpButtonEqual-> isActive(),
m_bpButtonConflict-> isActive());
else
- treeDataView->updateCmpResult(currentCfg.hideFilteredElements,
+ treeDataView->updateCmpResult(!currentCfg.showFilteredElements,
m_bpButtonLeftOnly-> isActive(),
m_bpButtonRightOnly-> isActive(),
m_bpButtonLeftNewer-> isActive(),
@@ -3664,51 +3691,38 @@ void MainDialog::updateGuiForFolderPair()
wxWindowUpdateLocker dummy(this);
//adapt delete top folder pair button
- if (additionalFolderPairs.empty())
- m_bpButtonRemovePair->Hide();
- else
- m_bpButtonRemovePair->Show();
+ m_bpButtonRemovePair->Show(!additionalFolderPairs.empty());
m_panelTopLeft->Layout();
//adapt local filter and sync cfg for first folder pair
- if (additionalFolderPairs.empty() &&
- firstFolderPair->getAltCompConfig().get() == nullptr &&
- firstFolderPair->getAltSyncConfig().get() == nullptr &&
- isNullFilter(firstFolderPair->getAltFilterConfig()))
- {
- m_bpButtonAltCompCfg ->Hide();
- m_bpButtonAltSyncCfg ->Hide();
- m_bpButtonLocalFilter->Hide();
-
- setImage(*m_bpButtonSwapSides, GlobalResources::getImage(L"swap"));
- }
- else
- {
- m_bpButtonAltCompCfg ->Show();
- m_bpButtonAltSyncCfg ->Show();
- m_bpButtonLocalFilter->Show();
-
- setImage(*m_bpButtonSwapSides, GlobalResources::getImage(L"swapSlim"));
- }
+ const bool showLocalCfgFirstPair = !additionalFolderPairs.empty() ||
+ firstFolderPair->getAltCompConfig().get() != nullptr ||
+ firstFolderPair->getAltSyncConfig().get() != nullptr ||
+ !isNullFilter(firstFolderPair->getAltFilterConfig());
+
+ m_bpButtonAltCompCfg ->Show(showLocalCfgFirstPair);
+ m_bpButtonAltSyncCfg ->Show(showLocalCfgFirstPair);
+ m_bpButtonLocalFilter->Show(showLocalCfgFirstPair);
+ setImage(*m_bpButtonSwapSides, GlobalResources::getImage(showLocalCfgFirstPair ? L"swapSlim" : L"swap"));
m_panelTopMiddle->Layout();
int addPairMinimalHeight = 0;
int addPairOptimalHeight = 0;
if (!additionalFolderPairs.empty())
{
- int pairHeight = additionalFolderPairs[0]->GetSize().GetHeight();
- addPairMinimalHeight = std::min<double>(1.5, additionalFolderPairs.size()) * pairHeight; //have 0.5 * height indicate that more folders are there
+ const int pairHeight = additionalFolderPairs[0]->GetSize().GetHeight();
+ addPairMinimalHeight = std::min<double>(1.5, additionalFolderPairs.size()) * pairHeight; //have 1.5 * height indicate that more folders are there
addPairOptimalHeight = std::min<double>(globalCfg.gui.maxFolderPairsVisible - 1 + 0.5, //subtract first/main folder pair and add 0.5 to indicate additional folders
additionalFolderPairs.size()) * pairHeight;
addPairOptimalHeight = std::max(addPairOptimalHeight, addPairMinimalHeight); //implicitly handle corrupted values for "maxFolderPairsVisible"
}
+ const int firstPairHeight = m_panelDirectoryPairs->ClientToWindowSize(m_panelTopLeft->GetSize()).GetHeight(); //include m_panelDirectoryPairs window borders!
+
//########################################################################################################################
//wxAUI hack: set minimum height to desired value, then call wxAuiPaneInfo::Fixed() to apply it
- const int panelNewHeight = m_panelDirectoryPairs->ClientToWindowSize(m_panelTopLeft->GetSize()).GetHeight(); //respect m_panelDirectoryPairs window borders!
-
- auiMgr.GetPane(m_panelDirectoryPairs).MinSize(-1, panelNewHeight + addPairOptimalHeight);
+ auiMgr.GetPane(m_panelDirectoryPairs).MinSize(-1, firstPairHeight + addPairOptimalHeight);
auiMgr.GetPane(m_panelDirectoryPairs).Fixed();
auiMgr.Update();
@@ -3717,8 +3731,8 @@ void MainDialog::updateGuiForFolderPair()
auiMgr.Update();
//########################################################################################################################
- //ensure additional folder pairs are at least partially visible
- auiMgr.GetPane(m_panelDirectoryPairs).MinSize(-1, m_panelTopLeft->GetSize().GetHeight() + addPairMinimalHeight);
+ //make sure user cannot fully shrink additional folder pairs
+ auiMgr.GetPane(m_panelDirectoryPairs).MinSize(-1, firstPairHeight + addPairMinimalHeight);
auiMgr.Update();
m_scrolledWindowFolderPairs->Fit(); //adjust scrolled window size
diff --git a/ui/main_dlg.h b/ui/main_dlg.h
index 63eef25a..d6965375 100644
--- a/ui/main_dlg.h
+++ b/ui/main_dlg.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef MAINDIALOG_H
@@ -48,6 +48,7 @@ private:
friend class SyncStatusHandler;
friend class ManualDeletionHandler;
friend class DirectoryPairFirst;
+ friend class DirectoryPair;
friend class DirectoryNameMainImpl;
template <class GuiPanel>
friend class FolderPairCallback;
@@ -119,11 +120,11 @@ private:
void onGridButtonEventL(wxKeyEvent& event);
void onGridButtonEventC(wxKeyEvent& event);
void onGridButtonEventR(wxKeyEvent& event);
- void onGridButtonEvent(wxKeyEvent& event, zen::Grid& grid, bool leftSide);
+ void onGridButtonEvent (wxKeyEvent& event, zen::Grid& grid, bool leftSide);
- void onTreeButtonEvent (wxKeyEvent& event);
- void OnContextSetLayout (wxMouseEvent& event);
- void OnGlobalKeyEvent (wxKeyEvent& event);
+ void onTreeButtonEvent (wxKeyEvent& event);
+ void OnContextSetLayout(wxMouseEvent& event);
+ void OnGlobalKeyEvent (wxKeyEvent& event);
void OnCompSettingsContext(wxMouseEvent& event);
void OnSyncSettingsContext(wxMouseEvent& event);
@@ -142,7 +143,8 @@ private:
void onNaviSelection(zen::GridRangeSelectEvent& event);
void onNaviPanelFilesDropped(zen::FileDropEvent& event);
- void OnDirSelected(wxFileDirPickerEvent& event);
+
+ void OnDirSelected(wxCommandEvent& event);
void onCheckRows (zen::CheckRowsEvent& event);
void onSetSyncDirection(zen::SyncDirectionEvent& event);
@@ -151,9 +153,9 @@ private:
void onGridDoubleClickR(zen::GridClickEvent& event);
void onGridDoubleClickRim(int row, bool leftSide);
- void onGridLabelLeftClickC (zen::GridClickEvent& event);
- void onGridLabelLeftClickL (zen::GridClickEvent& event);
- void onGridLabelLeftClickR (zen::GridClickEvent& event);
+ void onGridLabelLeftClickC(zen::GridClickEvent& event);
+ void onGridLabelLeftClickL(zen::GridClickEvent& event);
+ void onGridLabelLeftClickR(zen::GridClickEvent& event);
void onGridLabelLeftClick(bool onLeft, zen::ColumnTypeRim type);
void onGridLabelContextL(zen::GridClickEvent& event);
@@ -161,44 +163,44 @@ private:
void onGridLabelContextR(zen::GridClickEvent& event);
void onGridLabelContext(zen::Grid& grid, zen::ColumnTypeRim type, const std::vector<zen::ColumnAttributeRim>& defaultColumnAttributes);
- void OnLeftOnlyFiles( wxCommandEvent& event);
- void OnRightOnlyFiles( wxCommandEvent& event);
- void OnLeftNewerFiles( wxCommandEvent& event);
- void OnRightNewerFiles( wxCommandEvent& event);
- void OnEqualFiles( wxCommandEvent& event);
- void OnDifferentFiles( wxCommandEvent& event);
- void OnConflictFiles( wxCommandEvent& event);
-
- void OnSyncCreateLeft( wxCommandEvent& event);
- void OnSyncCreateRight( wxCommandEvent& event);
- void OnSyncDeleteLeft( wxCommandEvent& event);
- void OnSyncDeleteRight( wxCommandEvent& event);
- void OnSyncDirLeft( wxCommandEvent& event);
- void OnSyncDirRight( wxCommandEvent& event);
- void OnSyncDirNone( wxCommandEvent& event);
-
- void OnConfigNew( wxCommandEvent& event);
- void OnConfigSave( wxCommandEvent& event);
- void OnConfigSaveAs( wxCommandEvent& event);
- void OnConfigLoad( wxCommandEvent& event);
- void OnLoadFromHistory( wxCommandEvent& event);
-
- void OnCfgHistoryKeyEvent( wxKeyEvent& event);
- void OnRegularUpdateCheck( wxIdleEvent& event);
- void OnLayoutWindowAsync( wxIdleEvent& event);
-
- void OnResizeFolderPairs( wxEvent& event);
- void OnResizeConfigPanel( wxEvent& event);
- void OnResizeViewPanel( wxEvent& event);
+ void OnLeftOnlyFiles (wxCommandEvent& event);
+ void OnRightOnlyFiles (wxCommandEvent& event);
+ void OnLeftNewerFiles (wxCommandEvent& event);
+ void OnRightNewerFiles(wxCommandEvent& event);
+ void OnEqualFiles (wxCommandEvent& event);
+ void OnDifferentFiles (wxCommandEvent& event);
+ void OnConflictFiles (wxCommandEvent& event);
+
+ void OnSyncCreateLeft (wxCommandEvent& event);
+ void OnSyncCreateRight(wxCommandEvent& event);
+ void OnSyncDeleteLeft (wxCommandEvent& event);
+ void OnSyncDeleteRight(wxCommandEvent& event);
+ void OnSyncDirLeft (wxCommandEvent& event);
+ void OnSyncDirRight (wxCommandEvent& event);
+ void OnSyncDirNone (wxCommandEvent& event);
+
+ void OnConfigNew (wxCommandEvent& event);
+ void OnConfigSave (wxCommandEvent& event);
+ void OnConfigSaveAs (wxCommandEvent& event);
+ void OnConfigLoad (wxCommandEvent& event);
+ void OnLoadFromHistory(wxCommandEvent& event);
+
+ void OnCfgHistoryKeyEvent(wxKeyEvent& event);
+ void OnRegularUpdateCheck(wxIdleEvent& event);
+ void OnLayoutWindowAsync (wxIdleEvent& event);
+
+ void OnResizeLeftFolderWidth(wxEvent& event);
+ void OnResizeConfigPanel (wxEvent& event);
+ void OnResizeViewPanel (wxEvent& event);
void OnResizeStatisticsPanel(wxEvent& event);
- void OnHideFilteredButton( wxCommandEvent& event);
- void OnConfigureFilter( wxCommandEvent& event);
- void OnSwapSides( wxCommandEvent& event);
- void OnCompare( wxCommandEvent& event);
- void OnSyncSettings( wxCommandEvent& event);
- void OnCmpSettings( wxCommandEvent& event);
- void OnStartSync( wxCommandEvent& event);
- void OnClose( wxCloseEvent& event);
+ void OnShowExcluded (wxCommandEvent& event);
+ void OnConfigureFilter (wxCommandEvent& event);
+ void OnSwapSides (wxCommandEvent& event);
+ void OnCompare (wxCommandEvent& event);
+ void OnSyncSettings (wxCommandEvent& event);
+ void OnCmpSettings (wxCommandEvent& event);
+ void OnStartSync (wxCommandEvent& event);
+ void OnClose (wxCloseEvent& event);
void updateGuiAfterFilterChange(int delay);
@@ -210,22 +212,22 @@ private:
void updateSyncEnabledStatus();
- void OnAddFolderPair( wxCommandEvent& event);
- void OnRemoveFolderPair( wxCommandEvent& event);
- void OnRemoveTopFolderPair( wxCommandEvent& event);
+ void OnAddFolderPair (wxCommandEvent& event);
+ void OnRemoveFolderPair (wxCommandEvent& event);
+ void OnRemoveTopFolderPair(wxCommandEvent& event);
void applyFilterConfig();
void applySyncConfig();
//menu events
- void OnMenuGlobalSettings( wxCommandEvent& event);
- void OnMenuExportFileList( wxCommandEvent& event);
- void OnMenuBatchJob( wxCommandEvent& event);
- void OnMenuCheckVersion( wxCommandEvent& event);
- void OnMenuAbout( wxCommandEvent& event);
- void OnShowHelp( wxCommandEvent& event);
- void OnMenuQuit( wxCommandEvent& event);
- void OnMenuLanguageSwitch( wxCommandEvent& event);
+ void OnMenuGlobalSettings(wxCommandEvent& event);
+ void OnMenuExportFileList(wxCommandEvent& event);
+ void OnMenuBatchJob (wxCommandEvent& event);
+ void OnMenuCheckVersion (wxCommandEvent& event);
+ void OnMenuAbout (wxCommandEvent& event);
+ void OnShowHelp (wxCommandEvent& event);
+ void OnMenuQuit (wxCommandEvent& event);
+ void OnMenuLanguageSwitch(wxCommandEvent& event);
void switchProgramLanguage(int langID);
diff --git a/ui/msg_popup.cpp b/ui/msg_popup.cpp
index 09bf24c9..bdb51701 100644
--- a/ui/msg_popup.cpp
+++ b/ui/msg_popup.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "msg_popup.h"
@@ -150,7 +150,7 @@ WarningDlg::WarningDlg(wxWindow* parent, int activeButtons, const wxString& mes
SetTitle(_("Warning"));
m_bitmapMsgType->SetBitmap(GlobalResources::getImage(L"warning"));
m_textCtrlMessage->SetValue(messageText);
- checkBoxDontShowAgain.SetLabel(_("Do not show this dialog again"));
+ checkBoxDontShowAgain.SetLabel(_("Don't show this dialog again"));
buttonIgnore.SetLabel(_("&Ignore"));
buttonSwitch.SetLabel(_("&Switch"));
buttonIgnore.SetId(wxID_IGNORE);
diff --git a/ui/msg_popup.h b/ui/msg_popup.h
index 48a4e8cb..fd68c3f4 100644
--- a/ui/msg_popup.h
+++ b/ui/msg_popup.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef MESSAGEPOPUP_H_INCLUDED
diff --git a/ui/progress_indicator.cpp b/ui/progress_indicator.cpp
index ff2df809..2583ecb8 100644
--- a/ui/progress_indicator.cpp
+++ b/ui/progress_indicator.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "progress_indicator.h"
@@ -680,8 +680,9 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(AbortCallback& abortCb,
m_panelGraph->addData(graphDataBytes, Graph2D::LineAttributes().setLineWidth(2).setColor(wxColor(0, 192, 0))); //medium green
//allow changing on completion command
- m_comboBoxExecFinished->setValue (execWhenFinished);
- m_comboBoxExecFinished->setHistoryRef(execFinishedHistory);
+
+ m_comboBoxExecFinished->initHistory(execFinishedHistory, execFinishedHistory.size()); //-> we won't use addItemHistory() later
+ m_comboBoxExecFinished->setValue(execWhenFinished);
updateDialogStatus(); //null-status will be shown while waiting for dir locks (if at all)
diff --git a/ui/progress_indicator.h b/ui/progress_indicator.h
index cd974408..5df04fd4 100644
--- a/ui/progress_indicator.h
+++ b/ui/progress_indicator.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef PROGRESSINDICATOR_H_INCLUDED
diff --git a/ui/search.cpp b/ui/search.cpp
index 2a9aabfb..46138875 100644
--- a/ui/search.cpp
+++ b/ui/search.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "search.h"
diff --git a/ui/search.h b/ui/search.h
index 95811244..eee4af4d 100644
--- a/ui/search.h
+++ b/ui/search.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SEARCH_H_INCLUDED
diff --git a/ui/small_dlgs.cpp b/ui/small_dlgs.cpp
index bfe8de9c..a1aca6dd 100644
--- a/ui/small_dlgs.cpp
+++ b/ui/small_dlgs.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "gui_generated.h"
@@ -89,7 +89,7 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
build += L" x86";
assert_static(zen::is32BitBuild || zen::is64BitBuild);
- m_build->SetLabel(replaceCpy(_("(Build: %x)"), L"%x", build));
+ m_build->SetLabel(replaceCpy(_("Build: %x"), L"%x", build));
//m_animationControl1->SetAnimation(GlobalResources::instance().animationMoney);
//m_animationControl1->Play();
@@ -543,8 +543,8 @@ private:
void OnCancel(wxCommandEvent& event) { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
void OnShowHelp(wxCommandEvent& event) { displayHelpEntry(L"html/Comparison Settings.html"); }
- void OnTimeSize(wxCommandEvent& event) { m_radioBtnSizeDate->SetValue(true); updateGui(); }
- void OnContent (wxCommandEvent& event) { m_radioBtnContent ->SetValue(true); updateGui(); }
+ void OnTimeSize(wxCommandEvent& event) { compareVar = CMP_BY_TIME_SIZE; updateGui(); }
+ void OnContent (wxCommandEvent& event) { compareVar = CMP_BY_CONTENT; updateGui(); }
void OnTimeSizeDouble(wxMouseEvent& event);
void OnFilesizeDouble(wxMouseEvent& event);
@@ -552,8 +552,8 @@ private:
void updateGui();
- CompConfig& cmpConfigOut;
-
+ CompConfig& cmpConfigOut; //for output only
+ CompareVariant compareVar;
zen::EnumDescrList<SymLinkHandling> enumDescrHandleSyml;
};
@@ -561,43 +561,45 @@ private:
CompareCfgDialog::CompareCfgDialog(wxWindow* parent,
CompConfig& cmpConfig) :
CmpCfgDlgGenerated(parent),
- cmpConfigOut(cmpConfig)
+ cmpConfigOut(cmpConfig),
+ compareVar(cmpConfig.compareVar)
{
#ifdef FFS_WIN
new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
+ m_bpButtonHelp->SetBitmapLabel(GlobalResources::getImage(L"help"));
enumDescrHandleSyml.
add(SYMLINK_IGNORE, _("Exclude")).
add(SYMLINK_USE_DIRECTLY, _("Direct")).
add(SYMLINK_FOLLOW_LINK, _("Follow"));
+ setEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks, cmpConfig.handleSymlinks);
+
//move dialog up so that compare-config button and first config-variant are on same level
// Move(wxPoint(position.x, std::max(0, position.y - (m_buttonTimeSize->GetScreenPosition() - GetScreenPosition()).y)));
- m_bpButtonHelp ->SetBitmapLabel(GlobalResources::getImage(L"help"));
+ updateGui();
+ Fit();
+}
+
+
+void CompareCfgDialog::updateGui()
+{
+ //update toggle buttons -> they have no parameter-ownership at all!
+ m_toggleBtnTimeSize->SetValue(false);
+ m_toggleBtnContent ->SetValue(false);
- switch (cmpConfig.compareVar)
+ switch (compareVar)
{
case CMP_BY_TIME_SIZE:
- m_radioBtnSizeDate->SetValue(true);
- m_buttonContent->SetFocus(); //set focus on the other button
+ m_toggleBtnTimeSize->SetValue(true);
break;
case CMP_BY_CONTENT:
- m_radioBtnContent->SetValue(true);
- m_buttonTimeSize->SetFocus(); //set focus on the other button
+ m_toggleBtnContent->SetValue(true);
break;
}
- setEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks, cmpConfig.handleSymlinks);
-
- updateGui();
- Fit();
-}
-
-
-void CompareCfgDialog::updateGui()
-{
auto setBitmap = [](wxStaticBitmap& bmpCtrl, bool active, const wxBitmap& bmp)
{
if (active)
@@ -605,19 +607,14 @@ void CompareCfgDialog::updateGui()
else
bmpCtrl.SetBitmap(greyScale(bmp));
};
-
- setBitmap(*m_bitmapByTime, m_radioBtnSizeDate->GetValue(), GlobalResources::getImage(L"clock"));
- setBitmap(*m_bitmapByContent, m_radioBtnContent ->GetValue(), GlobalResources::getImage(L"cmpByContent"));
+ setBitmap(*m_bitmapByTime, compareVar == CMP_BY_TIME_SIZE, GlobalResources::getImage(L"clock"));
+ setBitmap(*m_bitmapByContent, compareVar == CMP_BY_CONTENT, GlobalResources::getImage(L"cmpByContent"));
}
void CompareCfgDialog::OnOkay(wxCommandEvent& event)
{
- if (m_radioBtnContent->GetValue())
- cmpConfigOut.compareVar = CMP_BY_CONTENT;
- else
- cmpConfigOut.compareVar = CMP_BY_TIME_SIZE;
-
+ cmpConfigOut.compareVar = compareVar;
cmpConfigOut.handleSymlinks = getEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks);
EndModal(ReturnSmallDlg::BUTTON_OKAY);
@@ -696,11 +693,11 @@ GlobalSettingsDlg::GlobalSettingsDlg(wxWindow* parent, xmlAccess::XmlGlobalSetti
set(globalSettings.gui.externelApplications);
- const wxString toolTip = wxString(_("Integrate external applications into context menu. The following macros are available:")) + wxT("\n\n") +
- wxT("%name \t") + _("- full file or folder name") + wxT("\n") +
- wxT("%dir \t") + _("- folder part only") + wxT("\n") +
- wxT("%nameCo \t") + _("- Other side's counterpart to %name") + wxT("\n") +
- wxT("%dirCo \t") + _("- Other side's counterpart to %dir");
+ const wxString toolTip = wxString(_("Integrate external applications into context menu. The following macros are available:")) + L"\n\n" +
+ L"%item_path% \t" + _("- full file or folder name") + L"\n" +
+ L"%item_folder% \t" + _("- folder part only") + L"\n" +
+ L"%item2_path% \t" + _("- Other side's counterpart to %item_path%") + L"\n" +
+ L"%item2_folder% \t" + _("- Other side's counterpart to %item_folder%");
m_gridCustomCommand->GetGridWindow()->SetToolTip(toolTip);
m_gridCustomCommand->GetGridColLabelWindow()->SetToolTip(toolTip);
diff --git a/ui/small_dlgs.h b/ui/small_dlgs.h
index 98a072cf..b375aff2 100644
--- a/ui/small_dlgs.h
+++ b/ui/small_dlgs.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SMALLDIALOGS_H_INCLUDED
diff --git a/ui/sorting.h b/ui/sorting.h
index ad54bfbe..31146037 100644
--- a/ui/sorting.h
+++ b/ui/sorting.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SORTING_H_INCLUDED
diff --git a/ui/switch_to_gui.h b/ui/switch_to_gui.h
index a9a717cb..e4a14f8f 100644
--- a/ui/switch_to_gui.h
+++ b/ui/switch_to_gui.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SWITCHTOGUI_H_INCLUDED
diff --git a/ui/sync_cfg.cpp b/ui/sync_cfg.cpp
index 794569cc..d8d238b3 100644
--- a/ui/sync_cfg.cpp
+++ b/ui/sync_cfg.cpp
@@ -1,22 +1,21 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "sync_cfg.h"
#include <memory>
-#include "../lib/resources.h"
-#include "dir_name.h"
#include <wx/wupdlock.h>
#include <wx+/mouse_move_dlg.h>
-#include <wx+/dir_picker.h>
#include <wx+/rtl.h>
-#include "gui_generated.h"
#include <wx+/choice_enum.h>
#include <wx+/image_tools.h>
-#include "../file_hierarchy.h"
+#include "gui_generated.h"
#include "exec_finished_box.h"
+#include "dir_name.h"
+#include "../file_hierarchy.h"
+#include "../lib/resources.h"
using namespace zen;
using namespace xmlAccess;
@@ -32,22 +31,22 @@ public:
ExecWhenFinishedCfg* execWhenFinished); //optional input parameter
private:
- virtual void OnSyncAutomatic( wxCommandEvent& event);
- virtual void OnSyncMirror( wxCommandEvent& event);
- virtual void OnSyncUpdate( wxCommandEvent& event);
- virtual void OnSyncCustom( wxCommandEvent& event);
-
- virtual void OnSyncAutomaticDouble( 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);
- virtual void OnLeftNewer( wxCommandEvent& event);
- virtual void OnRightNewer( wxCommandEvent& event);
- virtual void OnDifferent( wxCommandEvent& event);
- virtual void OnConflict( wxCommandEvent& event);
+ 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 OnSyncAutomaticDouble(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);
+ virtual void OnLeftNewer (wxCommandEvent& event);
+ virtual void OnRightNewer (wxCommandEvent& event);
+ virtual void OnDifferent (wxCommandEvent& event);
+ virtual void OnConflict (wxCommandEvent& event);
virtual void OnClose (wxCloseEvent& event) { EndModal(ReturnSyncConfig::BUTTON_CANCEL); }
virtual void OnCancel(wxCommandEvent& event) { EndModal(ReturnSyncConfig::BUTTON_CANCEL); }
@@ -55,40 +54,37 @@ private:
void updateGui();
- void OnChangeErrorHandling(wxCommandEvent& event);
- void OnChangeDeletionHandling(wxCommandEvent& event);
+ virtual void OnDeletionPermanent (wxCommandEvent& event) { handleDeletion = DELETE_PERMANENTLY; updateGui(); }
+ virtual void OnDeletionRecycler (wxCommandEvent& event) { handleDeletion = DELETE_TO_RECYCLER; updateGui(); }
+ virtual void OnDeletionVersioning (wxCommandEvent& event) { handleDeletion = DELETE_TO_VERSIONING; updateGui(); }
- const zen::CompareVariant cmpVariant;
+ virtual void OnErrorPopup (wxCommandEvent& event) { handleGuiError = ON_GUIERROR_POPUP; updateGui(); }
+ virtual void OnErrorIgnore(wxCommandEvent& event) { handleGuiError = ON_GUIERROR_IGNORE; updateGui(); }
- //temporal copy of maindialog.cfg.directionCfg -> ownership NOT within GUI controls!
- DirectionConfig currentDirectionCfg;
+ virtual void OnToggleVersionsLimit(wxCommandEvent& event) { updateGui(); }
+
+ //parameters with ownership NOT within GUI controls!
+ DirectionConfig directionCfg;
+ const CompareVariant cmpVariant;
+ DeletionPolicy handleDeletion; //use Recycler, delete permanently or move to user-defined location
+ OnGuiError handleGuiError;
//changing data
SyncConfig& syncCfgOut;
xmlAccess::OnGuiError* refHandleError;
ExecWhenFinishedCfg* refExecWhenFinished;
- DirectoryName<FolderHistoryBox> customDelFolder;
-
- EnumDescrList<zen::DeletionPolicy> enumDelhandDescr;
- EnumDescrList<xmlAccess::OnGuiError> enumErrhandDescr;
+ DirectoryName<FolderHistoryBox> versioningFolder;
};
-
void updateConfigIcons(const DirectionConfig& directionCfg,
wxBitmapButton* buttonLeftOnly,
wxBitmapButton* buttonRightOnly,
wxBitmapButton* buttonLeftNewer,
wxBitmapButton* buttonRightNewer,
wxBitmapButton* buttonDifferent,
- wxBitmapButton* buttonConflict,
- wxStaticBitmap* bitmapLeftOnly,
- wxStaticBitmap* bitmapRightOnly,
- wxStaticBitmap* bitmapLeftNewer,
- wxStaticBitmap* bitmapRightNewer,
- wxStaticBitmap* bitmapDifferent,
- wxStaticBitmap* bitmapConflict) //sizer containing all sync-directions
+ wxBitmapButton* buttonConflict)
{
if (directionCfg.var != DirectionConfig::AUTOMATIC) //automatic mode needs no sync-directions
{
@@ -199,35 +195,28 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent,
xmlAccess::OnGuiError* handleError,
ExecWhenFinishedCfg* execWhenFinished) :
SyncCfgDlgGenerated(parent),
+ directionCfg(syncCfg.directionCfg), //make working copy
cmpVariant(compareVar),
- currentDirectionCfg(syncCfg.directionCfg), //make working copy
+ handleDeletion(syncCfg.handleDeletion),
+ handleGuiError(ON_GUIERROR_POPUP), //dummy init
syncCfgOut(syncCfg),
refHandleError(handleError),
refExecWhenFinished(execWhenFinished),
- customDelFolder(*m_panelCustomDeletionDir, *m_dirPickerCustomDelFolder, *m_customDelFolder)
+ versioningFolder(*m_panelVersioning, *m_buttonSelectDirVersioning, *m_versioningFolder)
{
#ifdef FFS_WIN
new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
- enumDelhandDescr.
- add(DELETE_PERMANENTLY, _("Delete permanently"), _("Delete or overwrite files permanently")).
- add(MOVE_TO_RECYCLE_BIN, _("Use Recycle Bin"), _("Use Recycle Bin when deleting or overwriting files")).
- add(MOVE_TO_CUSTOM_DIRECTORY, _("Versioning"), _("Move files into a time-stamped subfolder"));
-
- enumErrhandDescr.
- add(ON_GUIERROR_POPUP, _("Show pop-up"), _("Show pop-up on errors or warnings")).
- add(ON_GUIERROR_IGNORE, _("Ignore errors"), _("Hide all error and warning messages"));
-
-
- //a proper set-method may be in order some time...
- setEnumVal(enumDelhandDescr, *m_choiceHandleDeletion, syncCfg.handleDeletion);
- customDelFolder.setName(utfCvrtTo<wxString>(syncCfg.customDeletionDirectory));
+ versioningFolder.setName(utfCvrtTo<wxString>(syncCfg.versioningDirectory));
+ //map single parameter "version limit" to both checkbox and spin ctrl:
+ m_checkBoxVersionsLimit->SetValue(syncCfg.versionCountLimit >= 0);
+ m_spinCtrlVersionsLimit->SetValue(syncCfg.versionCountLimit >= 0 ? syncCfg.versionCountLimit : 10 /*SyncConfig().versionCountLimit*/);
updateGui();
//error handling
if (handleError)
- setEnumVal(enumErrhandDescr, *m_choiceHandleError, *handleError);
+ handleGuiError = *handleError;
else
{
sbSizerErrorHandling->Show(false);
@@ -236,7 +225,7 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent,
if (execWhenFinished)
{
- m_comboBoxExecFinished->setHistoryRef(*execWhenFinished->history);
+ m_comboBoxExecFinished->initHistory(*execWhenFinished->history, execWhenFinished->historyMax);
m_comboBoxExecFinished->setValue(*execWhenFinished->command);
}
else
@@ -263,13 +252,13 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent,
Fit();
}
-//#################################################################################################################
+//#################################################################################################################
void SyncCfgDialog::updateGui()
{
//wxWindowUpdateLocker dummy(this); //avoid display distortion
- wxWindowUpdateLocker dummy2(m_panelCustomDeletionDir); //avoid display distortion
+ wxWindowUpdateLocker dummy2(m_panelVersioning); //avoid display distortion
wxWindowUpdateLocker dummy3(m_bpButtonLeftOnly);
wxWindowUpdateLocker dummy4(m_bpButtonRightOnly);
wxWindowUpdateLocker dummy5(m_bpButtonLeftNewer);
@@ -277,137 +266,123 @@ void SyncCfgDialog::updateGui()
wxWindowUpdateLocker dummy7(m_bpButtonDifferent);
wxWindowUpdateLocker dummy8(m_bpButtonConflict);
- updateConfigIcons(currentDirectionCfg,
+ updateConfigIcons(directionCfg,
m_bpButtonLeftOnly,
m_bpButtonRightOnly,
m_bpButtonLeftNewer,
m_bpButtonRightNewer,
m_bpButtonDifferent,
- m_bpButtonConflict,
- m_bitmapLeftOnly,
- m_bitmapRightOnly,
- m_bitmapLeftNewer,
- m_bitmapRightNewer,
- m_bitmapDifferent,
- m_bitmapConflict);
+ m_bpButtonConflict);
//display only relevant sync options
- m_bitmapDatabase->Show(true);
- sbSizerSyncDirections->Show(true);
+ m_bitmapDatabase ->Show(directionCfg.var == DirectionConfig::AUTOMATIC);
+ sbSizerSyncDirections->Show(directionCfg.var != DirectionConfig::AUTOMATIC);
- if (currentDirectionCfg.var == DirectionConfig::AUTOMATIC)
- {
- sbSizerSyncDirections->Show(false);
- }
- else
+ switch (cmpVariant)
{
- m_bitmapDatabase->Show(false);
- switch (cmpVariant)
- {
- case CMP_BY_TIME_SIZE:
- bSizerDifferent ->Show(false);
- break;
+ case CMP_BY_TIME_SIZE:
+ bSizerDifferent ->Show(false);
+ break;
- case CMP_BY_CONTENT:
- bSizerLeftNewer ->Show(false);
- bSizerRightNewer->Show(false);
- break;
- }
+ case CMP_BY_CONTENT:
+ bSizerLeftNewer ->Show(false);
+ bSizerRightNewer->Show(false);
+ break;
}
- //set radiobuttons -> have no parameter-ownership at all!
+ //update toggle buttons -> they have no parameter-ownership at all!
m_staticTextAutomatic->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
m_staticTextMirror ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
m_staticTextUpdate ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
m_staticTextCustom ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
- switch (currentDirectionCfg.var)
+
+ m_toggleBtnAutomatic->SetValue(false);
+ m_toggleBtnMirror ->SetValue(false);
+ m_toggleBtnUpdate ->SetValue(false);
+ m_toggleBtnCustom ->SetValue(false);
+
+ switch (directionCfg.var)
{
case DirectionConfig::AUTOMATIC:
- m_radioBtnAutomatic->SetValue(true); //automatic mode
+ m_toggleBtnAutomatic->SetValue(true);
m_staticTextAutomatic->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
break;
case DirectionConfig::MIRROR:
- m_radioBtnMirror->SetValue(true); //one way ->
+ m_toggleBtnMirror->SetValue(true);
m_staticTextMirror->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
break;
case DirectionConfig::UPDATE:
- m_radioBtnUpdate->SetValue(true); //Update ->
+ m_toggleBtnUpdate->SetValue(true);
m_staticTextUpdate->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
break;
case DirectionConfig::CUSTOM:
- m_radioBtnCustom->SetValue(true); //custom
+ m_toggleBtnCustom->SetValue(true);
m_staticTextCustom->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
break;
}
+ m_toggleBtnPermanent ->SetValue(false);
+ m_toggleBtnRecycler ->SetValue(false);
+ m_toggleBtnVersioning->SetValue(false);
+ switch (handleDeletion)
+ {
+ case DELETE_PERMANENTLY:
+ m_toggleBtnPermanent->SetValue(true);
+ break;
+ case DELETE_TO_RECYCLER:
+ m_toggleBtnRecycler->SetValue(true);
+ break;
+ case DELETE_TO_VERSIONING:
+ m_toggleBtnVersioning->SetValue(true);
+ break;
+ }
+
+ m_panelVersioning ->Show(handleDeletion == DELETE_TO_VERSIONING);
+ m_checkBoxVersionsLimit->Show(handleDeletion == DELETE_TO_VERSIONING);
+ m_spinCtrlVersionsLimit->Show(handleDeletion == DELETE_TO_VERSIONING);
+ m_spinCtrlVersionsLimit->Enable(m_checkBoxVersionsLimit->GetValue());
+
+ m_toggleBtnErrorIgnore->SetValue(false);
+ m_toggleBtnErrorPopup ->SetValue(false);
+ switch (handleGuiError)
+ {
+ case ON_GUIERROR_IGNORE:
+ m_toggleBtnErrorIgnore->SetValue(true);
+ break;
+ case ON_GUIERROR_POPUP:
+ m_toggleBtnErrorPopup->SetValue(true);
+ break;
+ }
+
Layout();
+ Refresh(); //removes a few artifacts when toggling display of versioning folder
GetSizer()->SetSizeHints(this); //this works like a charm for GTK2 with window resizing problems!!! (includes call to Fit())
-
- m_panelCustomDeletionDir->Enable(getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion) == zen::MOVE_TO_CUSTOM_DIRECTORY);
}
void SyncCfgDialog::OnApply(wxCommandEvent& event)
{
//write configuration to main dialog
- syncCfgOut.directionCfg = currentDirectionCfg;
- syncCfgOut.handleDeletion = getEnumVal(enumDelhandDescr, *m_choiceHandleDeletion);
- syncCfgOut.customDeletionDirectory = utfCvrtTo<Zstring>(customDelFolder.getName());
+ syncCfgOut.directionCfg = directionCfg;
+ syncCfgOut.handleDeletion = handleDeletion;
+ syncCfgOut.versioningDirectory = utfCvrtTo<Zstring>(versioningFolder.getName());
+ //get single parameter "version limit" from both checkbox and spin ctrl:
+ syncCfgOut.versionCountLimit = m_checkBoxVersionsLimit->GetValue() ? m_spinCtrlVersionsLimit->GetValue() : -1;
if (refHandleError)
- *refHandleError = getEnumVal(enumErrhandDescr, *m_choiceHandleError);
+ *refHandleError = handleGuiError;
if (refExecWhenFinished)
{
*refExecWhenFinished->command = m_comboBoxExecFinished->getValue();
- addValueToHistory(*refExecWhenFinished->command, *refExecWhenFinished->history, refExecWhenFinished->historyMax);
+ //a good place to commit current "on completion" history item
+ m_comboBoxExecFinished->addItemHistory();
}
EndModal(ReturnSyncConfig::BUTTON_OKAY);
}
-void SyncCfgDialog::OnChangeErrorHandling(wxCommandEvent& event)
-{
- updateTooltipEnumVal(enumErrhandDescr, *m_choiceHandleError);
-}
-
-
-void SyncCfgDialog::OnChangeDeletionHandling(wxCommandEvent& event)
-{
- updateTooltipEnumVal(enumDelhandDescr, *m_choiceHandleDeletion);
- updateGui();
-}
-
-
-void SyncCfgDialog::OnSyncAutomatic(wxCommandEvent& event)
-{
- currentDirectionCfg.var = DirectionConfig::AUTOMATIC;
- updateGui();
-}
-
-
-void SyncCfgDialog::OnSyncMirror(wxCommandEvent& event)
-{
- currentDirectionCfg.var = DirectionConfig::MIRROR;
- updateGui();
-}
-
-
-void SyncCfgDialog::OnSyncUpdate(wxCommandEvent& event)
-{
- currentDirectionCfg.var = DirectionConfig::UPDATE;
- updateGui();
-}
-
-
-void SyncCfgDialog::OnSyncCustom(wxCommandEvent& event)
-{
- currentDirectionCfg.var = DirectionConfig::CUSTOM;
- updateGui();
-}
-
-
void SyncCfgDialog::OnSyncAutomaticDouble(wxMouseEvent& event)
{
wxCommandEvent dummy;
@@ -436,7 +411,8 @@ void SyncCfgDialog::OnSyncCustomDouble(wxMouseEvent& event)
OnApply(dummy);
}
-
+namespace
+{
void toggleSyncDirection(SyncDirection& current)
{
switch (current)
@@ -492,46 +468,46 @@ void pressCustomDir(DirectionConfig& directionCfg, SyncDirection& syncdir)
break;
}
}
-
+}
void SyncCfgDialog::OnExLeftSideOnly(wxCommandEvent& event )
{
- pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.exLeftSideOnly);
+ pressCustomDir(directionCfg, directionCfg.custom.exLeftSideOnly);
updateGui();
}
void SyncCfgDialog::OnExRightSideOnly(wxCommandEvent& event )
{
- pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.exRightSideOnly);
+ pressCustomDir(directionCfg, directionCfg.custom.exRightSideOnly);
updateGui();
}
void SyncCfgDialog::OnLeftNewer(wxCommandEvent& event )
{
- pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.leftNewer);
+ pressCustomDir(directionCfg, directionCfg.custom.leftNewer);
updateGui();
}
void SyncCfgDialog::OnRightNewer(wxCommandEvent& event )
{
- pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.rightNewer);
+ pressCustomDir(directionCfg, directionCfg.custom.rightNewer);
updateGui();
}
void SyncCfgDialog::OnDifferent(wxCommandEvent& event )
{
- pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.different);
+ pressCustomDir(directionCfg, directionCfg.custom.different);
updateGui();
}
void SyncCfgDialog::OnConflict(wxCommandEvent& event)
{
- pressCustomDir(currentDirectionCfg, currentDirectionCfg.custom.conflict);
+ pressCustomDir(directionCfg, directionCfg.custom.conflict);
updateGui();
}
@@ -550,4 +526,3 @@ ReturnSyncConfig::ButtonPressed zen::showSyncConfigDlg(wxWindow* parent,
return static_cast<ReturnSyncConfig::ButtonPressed>(syncDlg.ShowModal());
}
-
diff --git a/ui/sync_cfg.h b/ui/sync_cfg.h
index 3d5eb88c..350dd71e 100644
--- a/ui/sync_cfg.h
+++ b/ui/sync_cfg.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SYNCCONFIG_H_INCLUDED
diff --git a/ui/taskbar.cpp b/ui/taskbar.cpp
index 0611d739..864db24d 100644
--- a/ui/taskbar.cpp
+++ b/ui/taskbar.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
//
#include "taskbar.h"
@@ -29,8 +29,8 @@ class Taskbar::Pimpl //throw TaskbarNotAvailable
public:
Pimpl(const wxTopLevelWindow& window) :
assocWindow(window.GetHWND()),
- setStatus_ (getDllName(), setStatusFctName),
- setProgress_(getDllName(), setProgressFctName)
+ setStatus_ (getDllName(), funName_setStatus),
+ setProgress_(getDllName(), funName_setProgress)
{
if (!assocWindow || !setProgress_ || !setStatus_)
throw TaskbarNotAvailable();
@@ -73,8 +73,8 @@ public:
private:
void* assocWindow; //HWND
- const DllFun<SetStatusFct> setStatus_;
- const DllFun<SetProgressFct> setProgress_;
+ const DllFun<FunType_setStatus> setStatus_;
+ const DllFun<FunType_setProgress> setProgress_;
};
#elif defined HAVE_UBUNTU_UNITY //Ubuntu unity
diff --git a/ui/taskbar.h b/ui/taskbar.h
index 048bf9e8..80900af4 100644
--- a/ui/taskbar.h
+++ b/ui/taskbar.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TASKBARPROGRESS_H_INCLUDED
diff --git a/ui/tray_icon.cpp b/ui/tray_icon.cpp
index cd61ae29..95df6bb3 100644
--- a/ui/tray_icon.cpp
+++ b/ui/tray_icon.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "tray_icon.h"
diff --git a/ui/tray_icon.h b/ui/tray_icon.h
index 50480b54..9337a648 100644
--- a/ui/tray_icon.h
+++ b/ui/tray_icon.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TRAYICON_H_INCLUDED
diff --git a/ui/tree_view.cpp b/ui/tree_view.cpp
index e4dc022e..578690d9 100644
--- a/ui/tree_view.cpp
+++ b/ui/tree_view.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include <set>
diff --git a/ui/tree_view.h b/ui/tree_view.h
index 331e1f30..42970342 100644
--- a/ui/tree_view.h
+++ b/ui/tree_view.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TREE_H_INCLUDED_841703190201835280256673425
diff --git a/ui/triple_splitter.cpp b/ui/triple_splitter.cpp
index 5783bc4f..bbbc684a 100644
--- a/ui/triple_splitter.cpp
+++ b/ui/triple_splitter.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "triple_splitter.h"
@@ -189,6 +189,10 @@ void TripleSplitter::onMouseMovement(wxMouseEvent& event)
{
centerOffset = activeMove->getCenterPosXStart() - getCenterPosXOptimal() + event.GetPosition().x - activeMove->getMousePosXStart();
+ //CAVEAT: centerOffset is evaluated *before* normalization in getCenterPosX()!
+ //This can lead to the strange effect of window not immediately resizing when centerOffset is extremely off limits => normalize right here
+ centerOffset = getCenterPosX() - getCenterPosXOptimal();
+
updateWindowSizes();
Update(); //no time to wait until idle event!
}
diff --git a/ui/triple_splitter.h b/ui/triple_splitter.h
index e95671c7..5fd189a5 100644
--- a/ui/triple_splitter.h
+++ b/ui/triple_splitter.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TRIPPLE_SPLIT_HEADER_8257804292846842573942534254
diff --git a/ui/wx_form_build_hide_warnings.h b/ui/wx_form_build_hide_warnings.h
index 5b852e0f..1b43db2f 100644
--- a/ui/wx_form_build_hide_warnings.h
+++ b/ui/wx_form_build_hide_warnings.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef WX_FORM_BUILD_230948324234234
diff --git a/version/version.h b/version/version.h
index fc0bbc3b..357426ee 100644
--- a/version/version.h
+++ b/version/version.h
@@ -3,7 +3,7 @@
namespace zen
{
-const wchar_t currentVersion[] = L"5.6"; //internal linkage!
+const wchar_t currentVersion[] = L"5.7"; //internal linkage!
}
#endif
diff --git a/version/version.rc b/version/version.rc
index c7955130..cadf15c7 100644
--- a/version/version.rc
+++ b/version/version.rc
@@ -1,2 +1,2 @@
-#define VER_FREEFILESYNC 5,6,0,0
-#define VER_FREEFILESYNC_STR "5.6\0"
+#define VER_FREEFILESYNC 5,7,0,0
+#define VER_FREEFILESYNC_STR "5.7\0"
diff --git a/wx+/app_main.h b/wx+/app_main.h
index 0177fbf3..47331982 100644
--- a/wx+/app_main.h
+++ b/wx+/app_main.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef APPMAIN_H_INCLUDED
diff --git a/wx+/button.cpp b/wx+/button.cpp
index 0b193cfb..c710c158 100644
--- a/wx+/button.cpp
+++ b/wx+/button.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "button.h"
diff --git a/wx+/button.h b/wx+/button.h
index bf741945..89e376a2 100644
--- a/wx+/button.h
+++ b/wx+/button.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef CUSTOMBUTTON_H_INCLUDED
diff --git a/wx+/choice_enum.h b/wx+/choice_enum.h
index e12c7a9b..e591a67f 100644
--- a/wx+/choice_enum.h
+++ b/wx+/choice_enum.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef WX_CHOICE_ENUM_H_INCLUDED
@@ -19,9 +19,9 @@ Member variable:
Constructor code:
enumDescrMap.
- add(ON_ERROR_POPUP , _("Show pop-up") , _("Show pop-up on errors or warnings")).
- add(ON_ERROR_IGNORE, _("Ignore errors") , _("Hide all error and warning messages")).
- add(ON_ERROR_EXIT , _("Exit instantly"), _("Abort synchronization immediately"));
+ add(ON_ERROR_POPUP , "Show pop-up" , "Show pop-up on errors or warnings"). <- add localization
+ add(ON_ERROR_IGNORE, "Ignore errors" , "Hide all error and warning messages").
+ add(ON_ERROR_EXIT , "Exit instantly", "Abort synchronization immediately");
Set enum value:
setEnumVal(enumDescrMap, *m_choiceHandleError, value);
diff --git a/wx+/context_menu.h b/wx+/context_menu.h
index 9f2f844b..a2534291 100644
--- a/wx+/context_menu.h
+++ b/wx+/context_menu.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef CONTEXT_HEADER_18047302153418174632141234
diff --git a/wx+/create_pch.cpp b/wx+/create_pch.cpp
index a9b2ea37..406ce5b4 100644
--- a/wx+/create_pch.cpp
+++ b/wx+/create_pch.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
//dummy file for Visual Studio to compile precompiled header:
diff --git a/wx+/dir_picker.h b/wx+/dir_picker.h
deleted file mode 100644
index 51bd9757..00000000
--- a/wx+/dir_picker.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef DIR_PICKER_I18N_H_INCLUDED
-#define DIR_PICKER_I18N_H_INCLUDED
-
-#include <wx/filepicker.h>
-#include <zen/i18n.h>
-
-namespace zen
-{
-class DirPickerCtrl : public wxDirPickerCtrl
-{
-public:
- DirPickerCtrl(wxWindow* parent, wxWindowID id,
- const wxString& path = wxEmptyString,
- const wxString& message = wxDirSelectorPromptStr,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = wxDIRP_DEFAULT_STYLE,
- const wxValidator& validator = wxDefaultValidator,
- const wxString& name = wxDirPickerCtrlNameStr) :
- wxDirPickerCtrl(parent, id, path, message, pos, size, style, validator, name)
- {
-#ifdef FFS_WIN
- //fix wxWidgets localization gap:
- wxButton* button = dynamic_cast<wxButton*>(m_pickerIface);
- if (button)
- {
- button->SetLabel(_("Browse")); //button width needs to be adapted for very long translations
- SetMinSize(button->GetBestSize()); //SetSize and wxButton::SetSize just do nothing!!??
- }
-#endif
- }
-};
-}
-
-#endif // DIR_PICKER_I18N_H_INCLUDED
diff --git a/wx+/file_drop.h b/wx+/file_drop.h
index cdb19f4b..1d905c7a 100644
--- a/wx+/file_drop.h
+++ b/wx+/file_drop.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FILE_DROP_H_INCLUDED
diff --git a/wx+/format_unit.cpp b/wx+/format_unit.cpp
index 9d805f41..a2190397 100644
--- a/wx+/format_unit.cpp
+++ b/wx+/format_unit.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "format_unit.h"
@@ -133,7 +133,7 @@ std::wstring zen::remainingTimeToShortString(double timeInSec)
std::wstring zen::fractionToShortString(double fraction)
{
//return replaceCpy(_("%x%"), L"%x", printNumber<std::wstring>(L"%3.2f", fraction * 100.0), false);
- return printNumber<std::wstring>(L"%3.2f", fraction * 100.0) + L'%'; //no need to internationalize faction!?
+ return printNumber<std::wstring>(L"%3.2f", fraction * 100.0) + L'%'; //no need to internationalize fraction!?
}
@@ -182,9 +182,10 @@ private:
IntegerFormat() : fmt(), valid_(false)
{
- //all we want is default NUMBERFMT, but set NumDigits to 0. what a disgrace:
+ //all we want is default NUMBERFMT, but set NumDigits to 0
fmt.NumDigits = 0;
+ //what a disgrace:
std::wstring grouping;
if (getUserSetting(LOCALE_ILZERO, fmt.LeadingZero) &&
getUserSetting(LOCALE_SGROUPING, grouping) &&
@@ -241,8 +242,8 @@ std::wstring zen::ffs_Impl::includeNumberSeparator(const std::wstring& number)
//::setlocale (LC_ALL, ""); -> implicitly called by wxLocale
const lconv* localInfo = ::localeconv(); //always bound according to doc
const std::wstring& thousandSep = utfCvrtTo<std::wstring>(localInfo->thousands_sep);
- // why not working?
- // THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep();
+
+ // THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep(); - why not working?
// DECIMAL_POINT = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).decimal_point();
std::wstring output(number);
@@ -293,6 +294,8 @@ const bool useNewLocalTimeCalculation = zen::vistaOrLater();
std::wstring zen::utcToLocalTimeString(Int64 utcTime)
{
+ auto errorMsg = [&] { return _("Error") + L" (time_t: " + numberTo<std::wstring>(utcTime) + L")"; };
+
#ifdef FFS_WIN
FILETIME lastWriteTimeUtc = tofiletime(utcTime); //convert ansi C time to FILETIME
@@ -303,23 +306,23 @@ std::wstring zen::utcToLocalTimeString(Int64 utcTime)
SYSTEMTIME systemTimeUtc = {};
if (!::FileTimeToSystemTime(&lastWriteTimeUtc, //__in const FILETIME *lpFileTime,
&systemTimeUtc)) //__out LPSYSTEMTIME lpSystemTime
- return _("Error");
+ return errorMsg();
if (!::SystemTimeToTzSpecificLocalTime(nullptr, //__in_opt LPTIME_ZONE_INFORMATION lpTimeZone,
&systemTimeUtc, //__in LPSYSTEMTIME lpUniversalTime,
&systemTimeLocal)) //__out LPSYSTEMTIME lpLocalTime
- return _("Error");
+ return errorMsg();
}
else //use DST setting (like in Windows 2000 and XP)
{
FILETIME fileTimeLocal = {};
if (!::FileTimeToLocalFileTime(&lastWriteTimeUtc, //pointer to UTC file time to convert
&fileTimeLocal)) //pointer to converted file time
- return _("Error");
+ return errorMsg();
if (!::FileTimeToSystemTime(&fileTimeLocal, //pointer to file time to convert
&systemTimeLocal)) //pointer to structure to receive system time
- return _("Error");
+ return errorMsg();
}
zen::TimeComp loc;
@@ -334,5 +337,6 @@ std::wstring zen::utcToLocalTimeString(Int64 utcTime)
zen::TimeComp loc = zen::localTime(to<time_t>(utcTime));
#endif
- return formatTime<std::wstring>(L"%x %X", loc);
+ std::wstring dateString = formatTime<std::wstring>(L"%x %X", loc);
+ return !dateString.empty() ? dateString : errorMsg();
}
diff --git a/wx+/format_unit.h b/wx+/format_unit.h
index 361e7d86..6d29d9a8 100644
--- a/wx+/format_unit.h
+++ b/wx+/format_unit.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef UTIL_H_INCLUDED
@@ -20,7 +20,7 @@ std::wstring fractionToShortString(double fraction); //within [0, 1]
template <class NumberType>
std::wstring toGuiString(NumberType number); //format integer number including thousands separator
-std::wstring utcToLocalTimeString(Int64 utcTime); //throw std::runtime_error
+std::wstring utcToLocalTimeString(Int64 utcTime);
diff --git a/wx+/graph.cpp b/wx+/graph.cpp
index 6ba794b0..b69173bb 100644
--- a/wx+/graph.cpp
+++ b/wx+/graph.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "graph.h"
diff --git a/wx+/graph.h b/wx+/graph.h
index 70da5dc3..d500dcc0 100644
--- a/wx+/graph.h
+++ b/wx+/graph.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef WX_PLOT_HEADER_2344252459
diff --git a/wx+/grid.cpp b/wx+/grid.cpp
index 33419c8e..5f49b9fa 100644
--- a/wx+/grid.cpp
+++ b/wx+/grid.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "grid.h"
@@ -2126,11 +2126,12 @@ void Grid::setColWidthAndNotify(ptrdiff_t width, size_t col, size_t compPos, boo
const ptrdiff_t offset = width - getColStretchedWidth(vcRs.stretch_, stretchTotal, mainWinWidth); //width := stretchedWidth + (normalized) offset
vcRs.offset_ = offset;
+ //CAVEAT:
//I. width may be < COLUMN_MIN_WIDTH: for non-stretched columns this doesn't matter, since it's normalized in getColWidths() anyway,
// for stretched columns on the other hand negative width would be evaluated *before* normalization! => need to normalize here!
//II. worse: resizing any column should normalize *all* other stretched columns' offsets considering current mainWinWidth!
- // Testcase: 1. make main window so small in width that horizontal scrollbars are shown despite existing streched column.
- // 2. resize a fixed size column so that scrollbars vanish. 3. verify that the stretched column is resizing immediately while main dialog is enlarged
+ // Testcase: 1. make main window so small in width that horizontal scrollbars are shown despite existing streched column.
+ // 2. resize a fixed size column so that scrollbars vanish. 3. verify that the stretched column is resizing immediately while main dialog is enlarged
std::for_each(comp.begin(), comp.end(), [&](Component& c)
{
std::for_each(c.visibleCols.begin(), c.visibleCols.end(), [&](VisibleColumn& vc)
diff --git a/wx+/grid.h b/wx+/grid.h
index e5284cdb..448e5486 100644
--- a/wx+/grid.h
+++ b/wx+/grid.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef GENERIC_GRID_HEADER_83470213483173
diff --git a/wx+/image_tools.h b/wx+/image_tools.h
index 772189a6..c5011634 100644
--- a/wx+/image_tools.h
+++ b/wx+/image_tools.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef IMAGE_TOOLS_HEADER_45782456427634254
diff --git a/wx+/mouse_move_dlg.cpp b/wx+/mouse_move_dlg.cpp
index 697a5d47..72e464d6 100644
--- a/wx+/mouse_move_dlg.cpp
+++ b/wx+/mouse_move_dlg.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "mouse_move_dlg.h"
diff --git a/wx+/mouse_move_dlg.h b/wx+/mouse_move_dlg.h
index 142dac49..29e62cd9 100644
--- a/wx+/mouse_move_dlg.h
+++ b/wx+/mouse_move_dlg.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef MOUSEMOVEWINDOW_H_INCLUDED
diff --git a/wx+/no_flicker.h b/wx+/no_flicker.h
index 22952977..d96e0134 100644
--- a/wx+/no_flicker.h
+++ b/wx+/no_flicker.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef NO_FLICKER_HEADER_893421590321532
diff --git a/wx+/pch.h b/wx+/pch.h
index 93244b1d..ff014056 100644
--- a/wx+/pch.h
+++ b/wx+/pch.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FFS_PRECOMPILED_HEADER
diff --git a/wx+/rtl.h b/wx+/rtl.h
index b8844ca8..eff05823 100644
--- a/wx+/rtl.h
+++ b/wx+/rtl.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef RTL_H_0183487180058718273432148
diff --git a/wx+/shell_execute.h b/wx+/shell_execute.h
index 953efc43..62b6ab41 100644
--- a/wx+/shell_execute.h
+++ b/wx+/shell_execute.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef EXECUTE_HEADER_23482134578134134
diff --git a/wx+/string_conv.h b/wx+/string_conv.h
index ba6f8d48..815cf881 100644
--- a/wx+/string_conv.h
+++ b/wx+/string_conv.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef STRINGCONV_H_INCLUDED
diff --git a/wx+/timespan.h b/wx+/timespan.h
index 58d5df4e..56f0a2db 100644
--- a/wx+/timespan.h
+++ b/wx+/timespan.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef WX_TIMESPAN_CTRL_HEADER_INCLUDED
diff --git a/wx+/toggle_button.h b/wx+/toggle_button.h
index 74f90974..d213e024 100644
--- a/wx+/toggle_button.h
+++ b/wx+/toggle_button.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TOGGLEBUTTON_H_INCLUDED
diff --git a/wx+/tooltip.cpp b/wx+/tooltip.cpp
index 6d81cdae..fdb62618 100644
--- a/wx+/tooltip.cpp
+++ b/wx+/tooltip.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "tooltip.h"
diff --git a/wx+/tooltip.h b/wx+/tooltip.h
index 195ceaf7..127ad86c 100644
--- a/wx+/tooltip.h
+++ b/wx+/tooltip.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef CUSTOMTOOLTIP_H_INCLUDED
diff --git a/wx+/zlib_wrap.cpp b/wx+/zlib_wrap.cpp
index a27a4fa4..fa0c54f0 100644
--- a/wx+/zlib_wrap.cpp
+++ b/wx+/zlib_wrap.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "zlib_wrap.h"
diff --git a/wx+/zlib_wrap.h b/wx+/zlib_wrap.h
index c229a589..9fa50240 100644
--- a/wx+/zlib_wrap.h
+++ b/wx+/zlib_wrap.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SIMPLE_H_INCLUDED_18134135134135345489
@@ -55,27 +55,28 @@ template <class BinContainer>
BinContainer compress(const BinContainer& stream, int level) //throw ZlibInternalError
{
BinContainer contOut;
-
- //save uncompressed stream size for decompression
- const std::uint64_t uncompressedSize = stream.size(); //use portable number type!
- contOut.resize(sizeof(uncompressedSize));
- std::copy(reinterpret_cast<const char*>(&uncompressedSize),
- reinterpret_cast<const char*>(&uncompressedSize) + sizeof(uncompressedSize),
- &*contOut.begin());
-
- const size_t bufferEstimate = impl::zlib_compressBound(stream.size()); //upper limit for buffer size, larger than input size!!!
-
- contOut.resize(contOut.size() + bufferEstimate);
-
- const size_t bytesWritten = impl::zlib_compress(&*stream.begin(),
- stream.size(),
- &*contOut.begin() + contOut.size() - bufferEstimate,
- bufferEstimate,
- level); //throw ZlibInternalError
- if (bytesWritten < bufferEstimate)
- contOut.resize(contOut.size() - (bufferEstimate - bytesWritten)); //caveat: unsigned arithmetics
- //caveat: physical memory consumption still *unchanged*!
-
+ if (!stream.empty()) //don't dereference iterator into empty container!
+ {
+ //save uncompressed stream size for decompression
+ const std::uint64_t uncompressedSize = stream.size(); //use portable number type!
+ contOut.resize(sizeof(uncompressedSize));
+ std::copy(reinterpret_cast<const char*>(&uncompressedSize),
+ reinterpret_cast<const char*>(&uncompressedSize) + sizeof(uncompressedSize),
+ &*contOut.begin());
+
+ const size_t bufferEstimate = impl::zlib_compressBound(stream.size()); //upper limit for buffer size, larger than input size!!!
+
+ contOut.resize(contOut.size() + bufferEstimate);
+
+ const size_t bytesWritten = impl::zlib_compress(&*stream.begin(),
+ stream.size(),
+ &*contOut.begin() + contOut.size() - bufferEstimate,
+ bufferEstimate,
+ level); //throw ZlibInternalError
+ if (bytesWritten < bufferEstimate)
+ contOut.resize(contOut.size() - (bufferEstimate - bytesWritten)); //caveat: unsigned arithmetics
+ //caveat: physical memory consumption still *unchanged*!
+ }
return contOut;
}
@@ -83,31 +84,37 @@ BinContainer compress(const BinContainer& stream, int level) //throw ZlibInterna
template <class BinContainer>
BinContainer decompress(const BinContainer& stream) //throw ZlibInternalError
{
- //retrieve size of uncompressed data
- std::uint64_t uncompressedSize = 0; //use portable number type!
- if (stream.size() < sizeof(uncompressedSize))
- throw ZlibInternalError();
- std::copy(&*stream.begin(),
- &*stream.begin() + sizeof(uncompressedSize),
- reinterpret_cast<char*>(&uncompressedSize));
-
BinContainer contOut;
- try
- {
- contOut.resize(uncompressedSize); //throw std::bad_alloc
- }
- catch (std::bad_alloc&) //most likely due to data corruption!
+ if (!stream.empty()) //don't dereference iterator into empty container!
{
- throw ZlibInternalError();
+ //retrieve size of uncompressed data
+ std::uint64_t uncompressedSize = 0; //use portable number type!
+ if (stream.size() < sizeof(uncompressedSize))
+ throw ZlibInternalError();
+ std::copy(&*stream.begin(),
+ &*stream.begin() + sizeof(uncompressedSize),
+ reinterpret_cast<char*>(&uncompressedSize));
+ try
+ {
+ //attention: contOut MUST NOT be empty! Else it will pass a nullptr to zlib_decompress() => Z_STREAM_ERROR although "uncompressedSize == 0"!!!
+ //secondary bug: don't dereference iterator into empty container!
+ if (uncompressedSize == 0) //cannot be 0: compress() directly maps empty -> empty container skipping zlib!
+ throw ZlibInternalError();
+
+ contOut.resize(uncompressedSize); //throw std::bad_alloc
+ }
+ catch (std::bad_alloc&) //most likely due to data corruption!
+ {
+ throw ZlibInternalError();
+ }
+
+ const size_t bytesWritten = impl::zlib_decompress(&*stream.begin() + sizeof(uncompressedSize),
+ stream.size() - sizeof(uncompressedSize),
+ &*contOut.begin(),
+ uncompressedSize); //throw ZlibInternalError
+ if (bytesWritten != uncompressedSize)
+ throw ZlibInternalError();
}
-
- const size_t bytesWritten = impl::zlib_decompress(&*stream.begin() + sizeof(uncompressedSize),
- stream.size() - sizeof(uncompressedSize),
- &*contOut.begin(),
- uncompressedSize); //throw ZlibInternalError
- if (bytesWritten != uncompressedSize)
- throw ZlibInternalError();
-
return contOut;
}
}
diff --git a/zen/FindFilePlus/dll_main.cpp b/zen/FindFilePlus/dll_main.cpp
index 02755010..a7637be4 100644
--- a/zen/FindFilePlus/dll_main.cpp
+++ b/zen/FindFilePlus/dll_main.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
diff --git a/zen/FindFilePlus/find_file_plus.cpp b/zen/FindFilePlus/find_file_plus.cpp
index a6e82617..9b146008 100644
--- a/zen/FindFilePlus/find_file_plus.cpp
+++ b/zen/FindFilePlus/find_file_plus.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "find_file_plus.h"
diff --git a/zen/FindFilePlus/find_file_plus.h b/zen/FindFilePlus/find_file_plus.h
index 49b18733..a2f61cdc 100644
--- a/zen/FindFilePlus/find_file_plus.h
+++ b/zen/FindFilePlus/find_file_plus.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FIND_FIRST_FILE_PLUS_HEADER_087483434
diff --git a/zen/FindFilePlus/init_dll_binding.h b/zen/FindFilePlus/init_dll_binding.h
index 5f2c9fa9..993a3790 100644
--- a/zen/FindFilePlus/init_dll_binding.h
+++ b/zen/FindFilePlus/init_dll_binding.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef INIT_DLL_BINDING_HEADER_ß018356031467832145
diff --git a/zen/FindFilePlus/load_dll.cpp b/zen/FindFilePlus/load_dll.cpp
index 9e8dbf17..5f72e31b 100644
--- a/zen/FindFilePlus/load_dll.cpp
+++ b/zen/FindFilePlus/load_dll.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "load_dll.h"
diff --git a/zen/FindFilePlus/load_dll.h b/zen/FindFilePlus/load_dll.h
index 2dde5d70..ce414733 100644
--- a/zen/FindFilePlus/load_dll.h
+++ b/zen/FindFilePlus/load_dll.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef LOAD_DLL_HEADER_0312463214872163832174
diff --git a/zen/IFileOperation/FileOperation_Vista.vcxproj b/zen/IFileOperation/FileOperation_Vista.vcxproj
index a387dcb5..4bd5b509 100644
--- a/zen/IFileOperation/FileOperation_Vista.vcxproj
+++ b/zen/IFileOperation/FileOperation_Vista.vcxproj
@@ -144,7 +144,7 @@
</ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -215,7 +215,7 @@
</ProfileGuidedDatabase>
<ImportLibrary>$(IntDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX64</TargetMachine>
- <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage64\lib</AdditionalLibraryDirectories>
+ <AdditionalLibraryDirectories>C:\Program Files\C++\Boost\stage_x64\lib</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
diff --git a/zen/IFileOperation/dll_main.cpp b/zen/IFileOperation/dll_main.cpp
index 46c65311..95d14910 100644
--- a/zen/IFileOperation/dll_main.cpp
+++ b/zen/IFileOperation/dll_main.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
diff --git a/zen/IFileOperation/file_op.cpp b/zen/IFileOperation/file_op.cpp
index b7bc9f9c..3861c5c0 100644
--- a/zen/IFileOperation/file_op.cpp
+++ b/zen/IFileOperation/file_op.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "file_op.h"
diff --git a/zen/IFileOperation/file_op.h b/zen/IFileOperation/file_op.h
index fb157301..c9df1e1e 100644
--- a/zen/IFileOperation/file_op.h
+++ b/zen/IFileOperation/file_op.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef RECYCLER_DLL_H
diff --git a/zen/assert_static.h b/zen/assert_static.h
index d61dd1e3..0f2a150a 100644
--- a/zen/assert_static.h
+++ b/zen/assert_static.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef ASSERTSTATIC_H_INCLUDED
diff --git a/zen/base64.h b/zen/base64.h
index 273f6c00..fd4e3611 100644
--- a/zen/base64.h
+++ b/zen/base64.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * 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 6678b91e..2c0381bf 100644
--- a/zen/basic_math.h
+++ b/zen/basic_math.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef BASIC_MATH_HEADER_34726398432
diff --git a/zen/build_info.h b/zen/build_info.h
index 6857a855..822a78d1 100644
--- a/zen/build_info.h
+++ b/zen/build_info.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef BUILDINFO_H_INCLUDED
diff --git a/zen/com_error.h b/zen/com_error.h
index d891fa13..f5463d68 100644
--- a/zen/com_error.h
+++ b/zen/com_error.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef COM_ERROR_HEADER
diff --git a/zen/com_ptr.h b/zen/com_ptr.h
index 98963cd1..9328d645 100644
--- a/zen/com_ptr.h
+++ b/zen/com_ptr.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SMART_COM_PTR_H
diff --git a/zen/com_util.h b/zen/com_util.h
index fe02eadd..ac733566 100644
--- a/zen/com_util.h
+++ b/zen/com_util.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef COM_UTILITY_HEADER
diff --git a/zen/debug_log.h b/zen/debug_log.h
index d65f5e36..04c42a91 100644
--- a/zen/debug_log.h
+++ b/zen/debug_log.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DEBUG_LOG_HEADER_017324601673246392184621895740256342
diff --git a/zen/debug_new.cpp b/zen/debug_new.cpp
index 6cc0e2da..f8273163 100644
--- a/zen/debug_new.cpp
+++ b/zen/debug_new.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "debug_new.h"
@@ -15,12 +15,13 @@ namespace
{
LONG WINAPI writeDumpOnException(EXCEPTION_POINTERS* pExceptionInfo)
{
- HANDLE hFile = ::CreateFile(L"exception.dmp", GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
+ HANDLE hFile = ::CreateFile(L"exception.dmp", GENERIC_READ | GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
if (hFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION exInfo = {};
exInfo.ThreadId = ::GetCurrentThreadId();
exInfo.ExceptionPointers = pExceptionInfo;
+ exInfo.ClientPointers = FALSE;
MINIDUMP_EXCEPTION_INFORMATION* exceptParam = pExceptionInfo ? &exInfo : nullptr;
@@ -45,5 +46,10 @@ struct Dummy { Dummy() { ::SetUnhandledExceptionFilter(writeDumpOnException); }}
void mem_check::writeMinidump()
{
- writeDumpOnException(nullptr);
+ //force exception to catch the state of this thread and hopefully get a valid call stack
+ __try
+ {
+ ::RaiseException(EXCEPTION_BREAKPOINT, 0, 0, nullptr);
+ }
+ __except (writeDumpOnException(GetExceptionInformation()), EXCEPTION_CONTINUE_EXECUTION) {}
}
diff --git a/zen/debug_new.h b/zen/debug_new.h
index 8d616360..ed732a87 100644
--- a/zen/debug_new.h
+++ b/zen/debug_new.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DEBUGNEW_H_INCLUDED
@@ -15,17 +15,25 @@
#error currently for use with MSC only
#endif
-/*overwrite "operator new" to get more detailed error messages on bad_alloc, detect memory leaks and write memory dumps
-Usage:
-- Include everywhere before any other file: $(ProjectDir)\shared\debug_new.h
+/*
+Better std::bad_alloc
+---------------------
+overwrite "operator new" to automatically write mini dump and get info about bytes requested
-For Minidumps:
--------------
+1. Compile "debug_new.cpp"
+2. C/C++ -> Advanced: Forced Include File: zen/debug_new.h
+
+Minidumps http://msdn.microsoft.com/en-us/library/windows/desktop/ee416349(v=vs.85).aspx
+---------
1. Compile "debug_new.cpp"
2. Compile "release" build with:
- - debugging symbols
- - optimization deactivated
- - do not suppress frame pointer(/Oy-) - avoid call stack mess up
+ - C/C++ -> General: Debug Information Format: "Program Database" (/Zi).
+ - C/C++ -> Optimization: Omit Frame Pointers: No (/Oy-) - avoid call stack mess up!
+ - Linker -> Debugging: Generate Debug Info: Yes (/DEBUG)
+ - Linker -> Optimization: References: Yes (/OPT:REF).
+ - Linker -> Optimization: Enable COMDAT Folding: Yes (/OPT:ICF).
+Optional:
+ - C/C++ -> Optimization: Disabled (/Od)
*/
namespace mem_check
diff --git a/zen/deprecate.h b/zen/deprecate.h
index 33130710..cd7c1e08 100644
--- a/zen/deprecate.h
+++ b/zen/deprecate.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DEPRECATE_HEADER_2348970348
diff --git a/zen/dir_watcher.cpp b/zen/dir_watcher.cpp
index 29a2a3cf..a76c0cc3 100644
--- a/zen/dir_watcher.cpp
+++ b/zen/dir_watcher.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "dir_watcher.h"
@@ -14,7 +14,7 @@
#include "notify_removal.h"
#include "win.h" //includes "windows.h"
#include "long_path_prefix.h"
-#include "privilege.h"
+//#include "privilege.h"
#elif defined FFS_LINUX
#include <sys/inotify.h>
@@ -191,8 +191,9 @@ public:
//async I/O is a resource that needs to be guarded since it will write to local variable "buffer"!
zen::ScopeGuard guardAio = zen::makeGuard([&]
{
- //http://msdn.microsoft.com/en-us/library/aa363789(v=vs.85).aspx
- if (::CancelIo(hDir) != FALSE) //cancel all async I/O related to this handle and thread
+ //Canceling Pending I/O Operations: http://msdn.microsoft.com/en-us/library/aa363789(v=vs.85).aspx
+ //if (::CancelIoEx(hDir, &overlapped) /*!= FALSE*/ || ::GetLastError() != ERROR_NOT_FOUND) -> Vista only
+ if (::CancelIo(hDir) /*!= FALSE*/ || ::GetLastError() != ERROR_NOT_FOUND)
{
DWORD bytesWritten = 0;
::GetOverlappedResult(hDir, &overlapped, &bytesWritten, true); //wait until cancellation is complete
@@ -361,7 +362,7 @@ public:
dirs_.push_back(fullName);
return otherMe_;
}
- virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); }
+ virtual HandleError onError(const std::wstring& msg) { throw FileError(msg); }
private:
const std::shared_ptr<TraverseCallback>& otherMe_; //lifetime management, two options: 1. use std::weak_ptr 2. ref to shared_ptr
diff --git a/zen/dir_watcher.h b/zen/dir_watcher.h
index 67f2bce0..52a08226 100644
--- a/zen/dir_watcher.h
+++ b/zen/dir_watcher.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DIR_WATCHER_348577025748023458
diff --git a/zen/dll.h b/zen/dll.h
index f80a5f45..837e21a0 100644
--- a/zen/dll.h
+++ b/zen/dll.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DLLLOADER_H_INCLUDED
diff --git a/zen/error_log.h b/zen/error_log.h
index bbb36f00..c591e470 100644
--- a/zen/error_log.h
+++ b/zen/error_log.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef ERRORLOGGING_H_INCLUDED
diff --git a/zen/file_error.h b/zen/file_error.h
index 622d6a47..e5ff6515 100644
--- a/zen/file_error.h
+++ b/zen/file_error.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FILEERROR_H_INCLUDED
@@ -32,6 +32,7 @@ DEFINE_NEW_FILE_ERROR(ErrorNotExisting);
DEFINE_NEW_FILE_ERROR(ErrorTargetExisting);
DEFINE_NEW_FILE_ERROR(ErrorTargetPathMissing);
DEFINE_NEW_FILE_ERROR(ErrorFileLocked);
+DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume);
diff --git a/zen/file_handling.cpp b/zen/file_handling.cpp
index e176f3a6..732c90f4 100644
--- a/zen/file_handling.cpp
+++ b/zen/file_handling.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "file_handling.h"
@@ -91,7 +91,7 @@ bool zen::symlinkExists(const Zstring& linkname)
}
-bool zen::somethingExists(const Zstring& objname) //throw() check whether any object with this name exists
+bool zen::somethingExists(const Zstring& objname)
{
#ifdef FFS_WIN
const DWORD rv = ::GetFileAttributes(applyLongPathPrefix(objname).c_str());
@@ -349,8 +349,6 @@ bool zen::removeFile(const Zstring& filename) //throw FileError
namespace
{
-DEFINE_NEW_FILE_ERROR(ErrorDifferentVolume);
-
/* Usage overview: (avoid circular pattern!)
renameFile() --> renameFile_sub()
@@ -567,214 +565,6 @@ void zen::renameFile(const Zstring& oldName, const Zstring& newName) //throw Fil
}
-class CopyCallbackImpl : public zen::CallbackCopyFile //callback functionality
-{
-public:
- CopyCallbackImpl(const Zstring& sourceFile,
- const Zstring& targetFile,
- CallbackMoveFile* callback) : sourceFile_(sourceFile),
- targetFile_(targetFile),
- moveCallback(callback) {}
-
- virtual void deleteTargetFile(const Zstring& targetFile) { assert(!fileExists(targetFile)); }
-
- virtual void updateCopyStatus(Int64 bytesDelta)
- {
- if (moveCallback)
- moveCallback->updateStatus(bytesDelta);
- }
-
-private:
- CopyCallbackImpl(const CopyCallbackImpl&);
- CopyCallbackImpl& operator=(const CopyCallbackImpl&);
-
- const Zstring sourceFile_;
- const Zstring targetFile_;
- CallbackMoveFile* moveCallback; //optional
-};
-
-
-void zen::moveFile(const Zstring& sourceFile, const Zstring& targetFile, CallbackMoveFile* callback) //throw FileError
-{
- if (callback) callback->onBeforeFileMove(sourceFile, targetFile); //call back once *after* work was done
-
- //first try to move the file directly without copying
- try
- {
- renameFile(sourceFile, targetFile); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
- //great, we get away cheaply!
- if (callback) callback->objectProcessed();
- return;
- }
- //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&) {}
-
- //create target
- if (!fileExists(targetFile)) //check even if ErrorTargetExisting: me may have clashed with a directory of the same name!!!
- {
- //file is on a different volume: let's copy it
- if (symlinkExists(sourceFile))
- copySymlink(sourceFile, targetFile, false); //throw FileError; don't copy filesystem permissions
- else
- {
- CopyCallbackImpl copyCallback(sourceFile, targetFile, callback);
- copyFile(sourceFile, targetFile, false, true, &copyCallback); //throw FileError - permissions "false", transactional copy "true"
- }
- }
-
- //delete source
- removeFile(sourceFile); //throw FileError
-
- //note: newly copied file is NOT deleted in case of exception: currently this function is called in context of user-defined deletion dir, where this behavior is fine
- if (callback) callback->objectProcessed();
-}
-
-namespace
-{
-class TraverseOneLevel : public zen::TraverseCallback
-{
-public:
- typedef std::pair<Zstring, Zstring> ShortLongNames;
- typedef std::vector<ShortLongNames> NameList;
-
- TraverseOneLevel(NameList& files, NameList& dirs) :
- files_(files),
- dirs_(dirs) {}
-
- virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details)
- {
- files_.push_back(std::make_pair(shortName, fullName));
- }
-
- virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details)
- {
- if (details.dirLink)
- dirs_.push_back(std::make_pair(shortName, fullName));
- else
- files_.push_back(std::make_pair(shortName, fullName));
- return LINK_SKIP;
- }
-
- virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName)
- {
- dirs_.push_back(std::make_pair(shortName, fullName));
- return nullptr; //DON'T traverse into subdirs; moveDirectory works recursively!
- }
-
- virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); }
-
-private:
- TraverseOneLevel(const TraverseOneLevel&);
- TraverseOneLevel& operator=(const TraverseOneLevel&);
-
- NameList& files_;
- NameList& dirs_;
-};
-
-
-struct RemoveCallbackImpl : public CallbackRemoveDir
-{
- RemoveCallbackImpl(CallbackMoveFile* moveCallback) : moveCallback_(moveCallback) {}
-
- virtual void notifyFileDeletion(const Zstring& filename) { if (moveCallback_) moveCallback_->updateStatus(0); }
- virtual void notifyDirDeletion (const Zstring& dirname ) { if (moveCallback_) moveCallback_->updateStatus(0); }
-
-private:
- RemoveCallbackImpl(const RemoveCallbackImpl&);
- RemoveCallbackImpl& operator=(const RemoveCallbackImpl&);
-
- CallbackMoveFile* moveCallback_; //optional
-};
-}
-
-
-void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, CallbackMoveFile* callback) //throw FileError
-{
- //note: we cannot support "throw exception if target already exists": If we did, we would have to do a full cleanup
- //removing all newly created directories in case of an exception so that subsequent tries would not fail with "target already existing".
- //However an exception may also happen during final deletion of source folder, in which case cleanup effectively leads to data loss!
-
- if (callback) callback->onBeforeDirMove(sourceDir, targetDir); //call back once *after* work was done
-
- //first try to move the directory directly without copying
- try
- {
- renameFile(sourceDir, targetDir); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
- //great, we get away cheaply!
- if (callback) callback->objectProcessed();
- return;
- }
- //if moving failed treat as error (except when it tried to move to a different volume: in this case we will copy the directory)
- catch (const ErrorDifferentVolume&) {}
- catch (const ErrorTargetExisting& ) {}
-
- //create target
- if (symlinkExists(sourceDir))
- {
- if (!symlinkExists(targetDir))
- copySymlink(sourceDir, targetDir, false); //throw FileError -> don't copy permissions
- }
- else
- {
- try
- {
- makeNewDirectory(targetDir, sourceDir, false); //FileError, ErrorTargetExisting
- }
- catch (const ErrorTargetExisting&)
- {
- if (!dirExists(targetDir))
- throw; //clashed with a file or symlink of the same name!!!
- }
-
- //move files/folders recursively
- TraverseOneLevel::NameList fileList; //list of names: 1. short 2.long
- TraverseOneLevel::NameList dirList; //
-
- //traverse source directory one level
- TraverseOneLevel traverseCallback(fileList, dirList);
- traverseFolder(sourceDir, traverseCallback); //traverse one level
-
- const Zstring targetDirPf = appendSeparator(targetDir);
-
- //move files
- for (TraverseOneLevel::NameList::const_iterator i = fileList.begin(); i != fileList.end(); ++i)
- moveFile(i->second, targetDirPf + i->first, callback); //throw FileError
-
- //move directories
- for (TraverseOneLevel::NameList::const_iterator i = dirList.begin(); i != dirList.end(); ++i)
- ::moveDirectoryImpl(i->second, targetDirPf + i->first, callback);
- }
-
- //delete source
- RemoveCallbackImpl removeCallback(callback);
- removeDirectory(sourceDir, &removeCallback); //throw FileError
-
- if (callback) callback->objectProcessed();
-}
-
-
-void zen::moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, CallbackMoveFile* callback) //throw FileError
-{
-#ifdef FFS_WIN
- const Zstring& sourceDirFormatted = sourceDir;
- const Zstring& targetDirFormatted = targetDir;
-
-#elif defined FFS_LINUX
- const Zstring sourceDirFormatted = //remove trailing slash
- sourceDir.size() > 1 && endsWith(sourceDir, FILE_NAME_SEPARATOR) ? //exception: allow '/'
- beforeLast(sourceDir, FILE_NAME_SEPARATOR) :
- sourceDir;
- const Zstring targetDirFormatted = //remove trailing slash
- targetDir.size() > 1 && endsWith(targetDir, FILE_NAME_SEPARATOR) ? //exception: allow '/'
- beforeLast(targetDir, FILE_NAME_SEPARATOR) :
- targetDir;
-#endif
-
- ::moveDirectoryImpl(sourceDirFormatted, targetDirFormatted, callback);
-}
-
-
class FilesDirsOnlyTraverser : public zen::TraverseCallback
{
public:
@@ -799,7 +589,7 @@ public:
m_dirs.push_back(fullName);
return nullptr; //DON'T traverse into subdirs; removeDirectory works recursively!
}
- virtual HandleError onError(const std::wstring& errorText) { throw FileError(errorText); }
+ virtual HandleError onError(const std::wstring& msg) { throw FileError(msg); }
private:
FilesDirsOnlyTraverser(const FilesDirsOnlyTraverser&);
@@ -1213,20 +1003,6 @@ void copySecurityContext(const Zstring& source, const Zstring& target, ProcSymli
void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSymlink procSl) //throw FileError
{
#ifdef FFS_WIN
- //setting privileges requires admin rights!
-
- //enable privilege: required to read/write SACL information (only)
- activatePrivilege(SE_SECURITY_NAME); //throw FileError
- //Note: trying to copy SACL (SACL_SECURITY_INFORMATION) may return ERROR_PRIVILEGE_NOT_HELD (1314) on Samba shares. This is not due to missing privileges!
- //However, this is okay, since copying NTFS permissions doesn't make sense in this case anyway
-
- //enable privilege: required to copy owner information
- activatePrivilege(SE_RESTORE_NAME); //throw FileError
-
- //the following privilege may be required according to http://msdn.microsoft.com/en-us/library/aa364399(VS.85).aspx (although not needed nor active in my tests)
- activatePrivilege(SE_BACKUP_NAME); //throw FileError
-
-
//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!
@@ -1234,6 +1010,26 @@ void copyObjectPermissions(const Zstring& source, const Zstring& target, ProcSym
const Zstring sourceResolved = procSl == SYMLINK_FOLLOW && symlinkExists(source) ? getSymlinkTargetPath(source) : source;
const Zstring targetResolved = procSl == SYMLINK_FOLLOW && symlinkExists(target) ? getSymlinkTargetPath(target) : target;
+ //setting privileges requires admin rights!
+ try
+ {
+ //enable privilege: required to read/write SACL information (only)
+ activatePrivilege(SE_SECURITY_NAME); //throw FileError
+ //Note: trying to copy SACL (SACL_SECURITY_INFORMATION) may return ERROR_PRIVILEGE_NOT_HELD (1314) on Samba shares. This is not due to missing privileges!
+ //However, this is okay, since copying NTFS permissions doesn't make sense in this case anyway
+
+ //enable privilege: required to copy owner information
+ activatePrivilege(SE_RESTORE_NAME); //throw FileError
+
+ //the following privilege may be required according to http://msdn.microsoft.com/en-us/library/aa364399(VS.85).aspx (although not needed nor active in my tests)
+ activatePrivilege(SE_BACKUP_NAME); //throw FileError
+ }
+ 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());
+ }
+
+
std::vector<char> buffer(10000); //example of actually required buffer size: 192 bytes
for (;;)
{
@@ -1571,7 +1367,8 @@ void zen::makeDirectory(const Zstring& directory)
}
catch (const FileError& e)
{
- assert(dynamic_cast<const ErrorTargetExisting*>(&e)); (void)e;
+ assert(dynamic_cast<const ErrorTargetExisting*>(&e));
+ (void)e;
//could there be situations where a directory/network path exists, but creation fails with
//error different than "ErrorTargetExisting"?? => better catch all "FileError" and check existence again
if (dirExists(directory)) //technically a file system race-condition!
@@ -2127,7 +1924,7 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize,
//some odd check for some possible(?) error condition
if (totalBytesTransferred.QuadPart < 0) //let's see if someone answers the call...
::MessageBox(nullptr, L"You've just discovered a bug in WIN32 API function \"CopyFileEx\"! \n\n\
- Please write a mail to the author of FreeFileSync at zhnmju123@gmx.de and simply state that\n\
+ Please write a mail to the author of FreeFileSync at zenju@gmx.de and simply state that\n\
\"totalBytesTransferred.HighPart can be below zero\"!\n\n\
This will then be handled in future versions of FreeFileSync.\n\nThanks -ZenJu",
nullptr, 0);
diff --git a/zen/file_handling.h b/zen/file_handling.h
index d1dcca22..12fbb31c 100644
--- a/zen/file_handling.h
+++ b/zen/file_handling.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FILE_HANDLING_H_INCLUDED
@@ -15,7 +15,6 @@
namespace zen
{
struct CallbackRemoveDir;
-struct CallbackMoveFile;
struct CallbackCopyFile;
@@ -51,14 +50,8 @@ UInt64 getFreeDiskSpace(const Zstring& path); //throw FileError
bool removeFile(const Zstring& filename); //throw FileError; return "true" if file was actually deleted
void removeDirectory(const Zstring& directory, CallbackRemoveDir* callback = nullptr); //throw FileError
-
//rename file or directory: no copying!!!
-void renameFile(const Zstring& oldName, const Zstring& newName); //throw FileError
-
-//move source to target across volumes; prerequisite: all super-directories of target exist
-//if target already contains some files/dirs they are seen as remnants of a previous incomplete move - see comment in moveDirectoryImpl
-void moveFile (const Zstring& sourceFile, const Zstring& targetFile, CallbackMoveFile* callback); //throw FileError
-void moveDirectory(const Zstring& sourceDir, const Zstring& targetDir, CallbackMoveFile* callback); //throw FileError
+void renameFile(const Zstring& oldName, const Zstring& newName); //throw FileError, ErrorDifferentVolume, ErrorTargetExisting
bool supportsPermissions(const Zstring& dirname); //throw FileError, derefernces symlinks
@@ -97,7 +90,7 @@ struct CallbackRemoveDir
};
-struct CallbackCopyFile //callback functionality
+struct CallbackCopyFile
{
virtual ~CallbackCopyFile() {}
@@ -110,19 +103,6 @@ struct CallbackCopyFile //callback functionality
//Windows: first exception is swallowed, updateCopyStatus() is then called again where it should throw again and exception will propagate as expected
virtual void updateCopyStatus(Int64 bytesDelta) = 0; //accummulated delta != file size! consider ADS, sparse, compressed files
};
-
-
-struct CallbackMoveFile //callback functionality
-{
- virtual ~CallbackMoveFile() {} //see CallbackCopyFile for limitations when trowing exceptions!
-
- virtual void onBeforeFileMove(const Zstring& fileFrom, const Zstring& fileTo) = 0; //one call before each (planned) move
- virtual void onBeforeDirMove (const Zstring& dirFrom, const Zstring& dirTo ) = 0; //
- virtual void objectProcessed() = 0; //one call after each completed move (count objects total)
-
- //called frequently if move has to revert to copy + delete:
- virtual void updateStatus(Int64 bytesDelta) = 0;
-};
}
#endif //FILE_HANDLING_H_INCLUDED
diff --git a/zen/file_id.cpp b/zen/file_id.cpp
index 40efa373..6730252e 100644
--- a/zen/file_id.cpp
+++ b/zen/file_id.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "file_id.h"
diff --git a/zen/file_id.h b/zen/file_id.h
index 1170c2a2..ba11483d 100644
--- a/zen/file_id.h
+++ b/zen/file_id.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FILEID_H_INCLUDED
diff --git a/zen/file_id_def.h b/zen/file_id_def.h
index c51a0ecc..cb80dc19 100644
--- a/zen/file_id_def.h
+++ b/zen/file_id_def.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FILE_ID_INTERNAL_HEADER_013287632486321493
@@ -21,7 +21,10 @@
namespace zen
{
#ifdef FFS_WIN
-typedef std::pair<DWORD, ULONGLONG> FileId; //(volume serial number, file ID)
+typedef DWORD DeviceId;
+typedef ULONGLONG FileIndex;
+
+typedef std::pair<DeviceId, FileIndex> FileId;
inline
FileId extractFileID(const BY_HANDLE_FILE_INFORMATION& fileInfo)
@@ -49,7 +52,10 @@ assert_static(sizeof(FileId().second) == sizeof(ULARGE_INTEGER));
#elif defined FFS_LINUX
namespace impl { typedef struct ::stat StatDummy; } //sigh...
-typedef std::pair<decltype(impl::StatDummy::st_dev), decltype(impl::StatDummy::st_ino)> FileId; //(device id, inode)
+typedef decltype(impl::StatDummy::st_dev) DeviceId;
+typedef decltype(impl::StatDummy::st_ino) FileIndex;
+
+typedef std::pair<DeviceId, FileIndex> FileId;
inline
FileId extractFileID(const struct ::stat& fileInfo)
diff --git a/zen/file_io.cpp b/zen/file_io.cpp
index f935de7a..279b3a72 100644
--- a/zen/file_io.cpp
+++ b/zen/file_io.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "file_io.h"
diff --git a/zen/file_io.h b/zen/file_io.h
index b134e47a..f37554f3 100644
--- a/zen/file_io.h
+++ b/zen/file_io.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FILEIO_H_INCLUDED
diff --git a/zen/file_traverser.cpp b/zen/file_traverser.cpp
index 986e0ad8..37b83ce6 100644
--- a/zen/file_traverser.cpp
+++ b/zen/file_traverser.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "file_traverser.h"
@@ -195,7 +195,7 @@ struct Win32Traverser
hnd.searchHandle = ::FindFirstFile(applyLongPathPrefix(directoryPf + L'*').c_str(), &hnd.data);
//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)
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted());
+ throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted());
//::GetLastError() == ERROR_FILE_NOT_FOUND -> *usually* NOT okay:
//directory may not exist *or* it is completely empty: not all directories contain "., .." entries, e.g. a drive's root directory
@@ -220,7 +220,7 @@ struct Win32Traverser
if (::GetLastError() == ERROR_NO_MORE_FILES) //not an error situation
return false;
//else we have a problem... report it:
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted());
+ throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted());
}
return true;
}
@@ -256,7 +256,7 @@ struct FilePlusTraverser
{
hnd.searchHandle = ::openDir(applyLongPathPrefix(directory).c_str());
if (hnd.searchHandle == nullptr)
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted() + L" (+)");
+ throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted() + L" (+)");
}
static void destroy(DirHandle hnd) { ::closeDir(hnd.searchHandle); } //throw()
@@ -281,7 +281,7 @@ struct FilePlusTraverser
}
//else we have a problem... report it:
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (+)");
+ throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (+)");
}
return true;
@@ -336,7 +336,7 @@ private:
tryReportingError([&]
{
if (level == 100) //notify endless recursion
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion."));
+ throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion."));
}, sink);
typename Trav::DirHandle searchHandle;
@@ -382,29 +382,26 @@ private:
switch (sink.onSymlink(shortName, fullName, linkInfo))
{
case TraverseCallback::LINK_FOLLOW:
- {
- //try to resolve symlink (and report error on failure!!!)
- TraverseCallback::FileInfo targetInfo;
- const bool validLink = tryReportingError([&]
+ if (Trav::isDirectory(findData))
{
- if (!getTargetInfoFromSymlink(fullName, targetInfo))
- throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(fullName)) + L"\n\n" + getLastErrorFormatted());
- }, sink);
-
- if (validLink)
+ if (const std::shared_ptr<TraverseCallback>& rv = sink.onDir(shortName, fullName))
+ traverse<Trav>(fullName, *rv, level + 1);
+ }
+ else //a file
{
- if (Trav::isDirectory(findData))
+ TraverseCallback::FileInfo targetInfo;
+ const bool validLink = tryReportingError([&] //try to resolve symlink (and report error on failure!!!)
{
- if (const std::shared_ptr<TraverseCallback>& rv = sink.onDir(shortName, fullName))
- traverse<Trav>(fullName, *rv, level + 1);
- }
- else //a file
+ if (!getTargetInfoFromSymlink(fullName, targetInfo))
+ throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(fullName)) + L"\n\n" + getLastErrorFormatted());
+ }, sink);
+
+ if (validLink)
sink.onFile(shortName, fullName, targetInfo);
+ else //broken symlink
+ sink.onFile(shortName, fullName, TraverseCallback::FileInfo());
}
- else //report broken symlink as file!
- sink.onFile(shortName, fullName, TraverseCallback::FileInfo());
- }
- break;
+ break;
case TraverseCallback::LINK_SKIP:
break;
@@ -525,7 +522,7 @@ private:
tryReportingError([&]
{
if (level == 100) //notify endless recursion
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion."));
+ throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion."));
}, sink);
@@ -534,7 +531,7 @@ private:
{
dirObj = ::opendir(directory.c_str()); //directory must NOT end with path separator, except "/"
if (!dirObj)
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted());
+ throw FileError(replaceCpy(_("Cannot open directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted());
}, sink))
return; //ignored error
ZEN_ON_SCOPE_EXIT(::closedir(dirObj)); //never close nullptr handles! -> crash
@@ -545,7 +542,7 @@ private:
tryReportingError([&]
{
if (::readdir_r(dirObj, reinterpret_cast< ::dirent*>(&buffer[0]), &dirEntry) != 0)
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted());
+ throw FileError(replaceCpy(_("Cannot enumerate directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted());
}, sink);
if (!dirEntry) //no more items or ignored error
return;
diff --git a/zen/file_traverser.h b/zen/file_traverser.h
index c29d987d..3fc9b57c 100644
--- a/zen/file_traverser.h
+++ b/zen/file_traverser.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FILETRAVERSER_H_INCLUDED
@@ -26,6 +26,7 @@ struct TraverseCallback
UInt64 fileSize; //unit: bytes!
Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
FileId id; //optional: may be initial!
+ //bool isFollowedSymlink;
};
struct SymlinkInfo
@@ -52,7 +53,7 @@ struct TraverseCallback
/**/ 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 HandleError onError (const std::wstring& errorText) = 0;
+ virtual HandleError onError (const std::wstring& msg) = 0;
};
diff --git a/zen/fixed_list.h b/zen/fixed_list.h
index 60d7e0e7..6d083f8b 100644
--- a/zen/fixed_list.h
+++ b/zen/fixed_list.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FIXED_LIST_01238467085684139453534
@@ -20,12 +20,13 @@ class FixedList
{
Node() : next(nullptr), val() {}
//no variadic templates on VC2010... :(
- template <class A> Node(A&& a) : next(nullptr), val(std::forward<A>(a)) {}
- template <class A, class B> Node(A&& a, B&& b) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b)) {}
- template <class A, class B, class C> Node(A&& a, B&& b, C&& c) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c)) {}
- template <class A, class B, class C, class D> Node(A&& a, B&& b, C&& c, D&& d) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d)) {}
- template <class A, class B, class C, class D, class E> Node(A&& a, B&& b, C&& c, D&& d, E&& e) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e)) {}
- template <class A, class B, class C, class D, class E, class F> Node(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f)) {}
+ template <class A> Node(A&& a) : next(nullptr), val(std::forward<A>(a)) {}
+ template <class A, class B> Node(A&& a, B&& b) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b)) {}
+ template <class A, class B, class C> Node(A&& a, B&& b, C&& c) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c)) {}
+ template <class A, class B, class C, class D> Node(A&& a, B&& b, C&& c, D&& d) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d)) {}
+ template <class A, class B, class C, class D, class E> Node(A&& a, B&& b, C&& c, D&& d, E&& e) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e)) {}
+ template <class A, class B, class C, class D, class E, class F> Node(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f)) {}
+ template <class A, class B, class C, class D, class E, class F, class G> Node(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f, G&& g) : next(nullptr), val(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f), std::forward<G>(g)) {}
Node* next; //singly linked list is sufficient
T val;
@@ -75,12 +76,13 @@ public:
const_reference& back() const { return lastInsert->val; }
void emplace_back() { pushNode(new Node); }
- template <class A> void emplace_back(A&& a) { pushNode(new Node(std::forward<A>(a))); }
- template <class A, class B> void emplace_back(A&& a, B&& b) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b))); }
- template <class A, class B, class C> void emplace_back(A&& a, B&& b, C&& c) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c))); }
- template <class A, class B, class C, class D> void emplace_back(A&& a, B&& b, C&& c, D&& d) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d))); }
- template <class A, class B, class C, class D, class E> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e))); }
- template <class A, class B, class C, class D, class E, class F> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f))); }
+ template <class A> void emplace_back(A&& a) { pushNode(new Node(std::forward<A>(a))); }
+ template <class A, class B> void emplace_back(A&& a, B&& b) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b))); }
+ template <class A, class B, class C> void emplace_back(A&& a, B&& b, C&& c) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c))); }
+ template <class A, class B, class C, class D> void emplace_back(A&& a, B&& b, C&& c, D&& d) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d))); }
+ template <class A, class B, class C, class D, class E> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e))); }
+ template <class A, class B, class C, class D, class E, class F> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f))); }
+ template <class A, class B, class C, class D, class E, class F, class G> void emplace_back(A&& a, B&& b, C&& c, D&& d, E&& e, F&& f, G&& g) { pushNode(new Node(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d), std::forward<E>(e), std::forward<F>(f), std::forward<G>(g))); }
template <class Predicate>
void remove_if(Predicate pred)
diff --git a/zen/guid.h b/zen/guid.h
index acc07fa0..5308af6a 100644
--- a/zen/guid.h
+++ b/zen/guid.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef GUID_H_INCLUDED
diff --git a/zen/i18n.h b/zen/i18n.h
index 8c740b23..ece55311 100644
--- a/zen/i18n.h
+++ b/zen/i18n.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef I18_N_HEADER_3843489325045
diff --git a/zen/int64.h b/zen/int64.h
index ea51b23b..17c34b9f 100644
--- a/zen/int64.h
+++ b/zen/int64.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef FFS_LARGE_64_BIT_INTEGER_H_INCLUDED
diff --git a/zen/last_error.h b/zen/last_error.h
index 76850f6a..e5665989 100644
--- a/zen/last_error.h
+++ b/zen/last_error.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SYSTEMFUNCTIONS_H_INCLUDED
diff --git a/zen/long_path_prefix.h b/zen/long_path_prefix.h
index 1476e87d..cd81b8b2 100644
--- a/zen/long_path_prefix.h
+++ b/zen/long_path_prefix.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef LONGPATHPREFIX_H_INCLUDED
diff --git a/zen/notify_removal.cpp b/zen/notify_removal.cpp
index 35ffc4e1..e2940036 100644
--- a/zen/notify_removal.cpp
+++ b/zen/notify_removal.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "notify_removal.h"
diff --git a/zen/notify_removal.h b/zen/notify_removal.h
index 613d5357..91e462bd 100644
--- a/zen/notify_removal.h
+++ b/zen/notify_removal.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef NOTIFY_H_INCLUDED
diff --git a/zen/optional.h b/zen/optional.h
index 34e3d21d..4003824b 100644
--- a/zen/optional.h
+++ b/zen/optional.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef OPTIONAL_H_2857428578342203589
diff --git a/zen/perf.h b/zen/perf.h
index f7f7e6d0..8760ef0b 100644
--- a/zen/perf.h
+++ b/zen/perf.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef DEBUG_PERF_HEADER
diff --git a/zen/privilege.h b/zen/privilege.h
index b940279a..9e5f12e8 100644
--- a/zen/privilege.h
+++ b/zen/privilege.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef PRIVILEGE_H_INCLUDED
diff --git a/zen/read_txt.h b/zen/read_txt.h
index d0e3f4dc..402403d8 100644
--- a/zen/read_txt.h
+++ b/zen/read_txt.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef PARSE_TXT_H_INCLUDED
diff --git a/zen/recycler.cpp b/zen/recycler.cpp
index 3de795a5..3fd86c33 100644
--- a/zen/recycler.cpp
+++ b/zen/recycler.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "recycler.h"
diff --git a/zen/recycler.h b/zen/recycler.h
index 955dfbee..8a9ab13b 100644
--- a/zen/recycler.h
+++ b/zen/recycler.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef RECYCLER_H_INCLUDED
diff --git a/zen/scope_guard.h b/zen/scope_guard.h
index 86d22c91..f25b7dc3 100644
--- a/zen/scope_guard.h
+++ b/zen/scope_guard.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef ZEN_SCOPEGUARD_8971632487321434
diff --git a/zen/serialize.h b/zen/serialize.h
index ff9695b1..cc694bb5 100644
--- a/zen/serialize.h
+++ b/zen/serialize.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SERIALIZE_H_INCLUDED
diff --git a/zen/stl_tools.h b/zen/stl_tools.h
index ace6ebaa..8f1ee704 100644
--- a/zen/stl_tools.h
+++ b/zen/stl_tools.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef STL_TOOLS_HEADER_84567184321434
diff --git a/zen/string_base.h b/zen/string_base.h
index e2e9f19a..834aff05 100644
--- a/zen/string_base.h
+++ b/zen/string_base.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef Z_BASE_H_INCLUDED
diff --git a/zen/string_tools.h b/zen/string_tools.h
index 80232086..87d5d4d0 100644
--- a/zen/string_tools.h
+++ b/zen/string_tools.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef STRING_TOOLS_HEADER_213458973046
diff --git a/zen/string_traits.h b/zen/string_traits.h
index eea9ae02..38ae9116 100644
--- a/zen/string_traits.h
+++ b/zen/string_traits.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef STRING_TRAITS_HEADER_813274321443234
diff --git a/zen/symlink_target.h b/zen/symlink_target.h
index 6d44d845..d1576990 100644
--- a/zen/symlink_target.h
+++ b/zen/symlink_target.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef SYMLINK_WIN_H_INCLUDED
diff --git a/zen/thread.h b/zen/thread.h
index 1fda016d..cffed5ed 100644
--- a/zen/thread.h
+++ b/zen/thread.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef BOOST_THREAD_WRAP_H
diff --git a/zen/tick_count.h b/zen/tick_count.h
index 30b0295d..5c7daa00 100644
--- a/zen/tick_count.h
+++ b/zen/tick_count.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef ZEN_TICK_COUNT_HEADER_3807326
diff --git a/zen/time.h b/zen/time.h
index 729b30bc..932deca8 100644
--- a/zen/time.h
+++ b/zen/time.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef ZEN_TIME_HEADER_845709281432434
@@ -164,6 +164,9 @@ struct GetFormat<FormatIsoDateTimeTag> //%Y-%m-%d %H:%M:%S - e.g. 2001-08-23 14:
};
+//strftime() craziness on invalid input:
+// VS 2010: CRASH unless "_invalid_parameter_handler" is set: http://msdn.microsoft.com/en-us/library/ksazx244.aspx
+// GCC: returns 0, apparently no crash. Still, considering some clib maintainer's comments, we should expect the worst!
inline
size_t strftimeWrap(char* buffer, size_t bufferSize, const char* format, const struct std::tm* timeptr)
{
@@ -178,6 +181,24 @@ size_t strftimeWrap(wchar_t* buffer, size_t bufferSize, const wchar_t* format, c
}
+inline
+bool isValid(const struct std::tm& t)
+{
+ auto inRange = [](int value, int minVal, int maxVal) { return minVal <= value && value <= maxVal; };
+
+ //http://www.cplusplus.com/reference/clibrary/ctime/tm/
+ return inRange(t.tm_sec , 0, 61) &&
+ inRange(t.tm_min , 0, 59) &&
+ inRange(t.tm_hour, 0, 23) &&
+ inRange(t.tm_mday, 1, 31) &&
+ inRange(t.tm_mon , 0, 11) &&
+ //tm_year
+ inRange(t.tm_wday, 0, 6) &&
+ inRange(t.tm_yday, 0, 365);
+ //tm_isdst
+};
+
+
struct UserDefinedFormatTag {};
struct PredefinedFormatTag {};
@@ -185,11 +206,13 @@ template <class String, class String2> inline
String formatTime(const String2& format, const TimeComp& comp, UserDefinedFormatTag) //format as specified by "std::strftime", returns empty string on failure
{
typedef typename GetCharType<String>::Type CharType;
-
struct std::tm ctc = toClibTimeComponents(comp);
std::mktime(&ctc); // unfortunately std::strftime() needs all elements of "struct tm" filled, e.g. tm_wday, tm_yday
//note: although std::mktime() explicitly expects "local time", calculating weekday and day of year *should* be time-zone and DST independent
+ if (!isValid(ctc)) //strftime() might kill the app otherwise, std::mktime does *not* help here at all!
+ return String();
+
CharType buffer[256];
const size_t charsWritten = strftimeWrap(buffer, 256, strBegin(format), &ctc);
return String(buffer, charsWritten);
@@ -209,11 +232,13 @@ TimeComp localTime(time_t utc)
{
#ifdef _MSC_VER
struct tm lt = {};
- /*errno_t rv = */
- ::localtime_s(&lt, &utc); //more secure?
+ errno_t rv = ::localtime_s(&lt, &utc); //more secure?
+ if (rv != 0)
+ return TimeComp();
return implementation::toZenTimeComponents(lt);
#else
- return implementation::toZenTimeComponents(*std::localtime(&utc));
+ struct tm* lt = std::localtime(&utc); //returns nullptr for invalid time_t on Visual 2010!!! (testvalue "-1")
+ return lt ? implementation::toZenTimeComponents(*lt) : TimeComp();
#endif
}
diff --git a/zen/type_tools.h b/zen/type_tools.h
index b221954c..7bf75ae0 100644
--- a/zen/type_tools.h
+++ b/zen/type_tools.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TYPE_TOOLS_HEADER_45237590734254545
diff --git a/zen/type_traits.h b/zen/type_traits.h
index 0b15eef1..4945da19 100644
--- a/zen/type_traits.h
+++ b/zen/type_traits.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef TYPE_TRAITS_HEADER_3425628658765467
diff --git a/zen/utf.h b/zen/utf.h
index 2ba6eaa3..fa96dcb1 100644
--- a/zen/utf.h
+++ b/zen/utf.h
@@ -2,7 +2,7 @@
// * This file is part of the zenXML project. It is distributed under the *
// * Boost Software License, Version 1.0. See accompanying file *
// * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt. *
-// * Copyright (C) ZenJu (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef STRING_UTF8_HEADER_01832479146991573473545
diff --git a/zen/warn_static.h b/zen/warn_static.h
index a71308bb..6beefee7 100644
--- a/zen/warn_static.h
+++ b/zen/warn_static.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef WARN_STATIC_HEADER_08724567834560832745
diff --git a/zen/win.h b/zen/win.h
index db86b7ca..ebc54064 100644
--- a/zen/win.h
+++ b/zen/win.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef YAWFWH_YET_ANOTHER_WRAPPER_FOR_WINDOWS_H
diff --git a/zen/win_ver.h b/zen/win_ver.h
index 3a6f23c1..0c18a822 100644
--- a/zen/win_ver.h
+++ b/zen/win_ver.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef WINDOWS_VERSION_HEADER_238470348254325
diff --git a/zen/zstring.cpp b/zen/zstring.cpp
index 182bad91..96566638 100644
--- a/zen/zstring.cpp
+++ b/zen/zstring.cpp
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#include "zstring.h"
diff --git a/zen/zstring.h b/zen/zstring.h
index 94d5b1a4..ff38f966 100644
--- a/zen/zstring.h
+++ b/zen/zstring.h
@@ -1,7 +1,7 @@
// **************************************************************************
// * 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 (zhnmju123 AT gmx DOT de) - All Rights Reserved *
+// * Copyright (C) ZenJu (zenju AT gmx DOT de) - All Rights Reserved *
// **************************************************************************
#ifndef ZSTRING_H_INCLUDED
bgstack15