summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Application.cpp119
-rw-r--r--Application.h5
-rw-r--r--BUILD/Changelog.txt27
-rw-r--r--BUILD/FreeFileSync.chmbin663954 -> 667858 bytes
-rw-r--r--BUILD/Help/FreeFileSync.hhp27
-rw-r--r--BUILD/Help/Table of Contents.hhc28
-rw-r--r--BUILD/Help/html/Backup Strategies.html (renamed from BUILD/Help/html/BackupStrategy.html)27
-rw-r--r--BUILD/Help/html/Batch Scripting.html112
-rw-r--r--BUILD/Help/html/Compare by File Size.html (renamed from BUILD/Help/html/CompareFileSize.html)12
-rw-r--r--BUILD/Help/html/Comparison Settings.html (renamed from BUILD/Help/html/ComparisonSettings.html)25
-rw-r--r--BUILD/Help/html/Daylight Saving Time.html (renamed from BUILD/Help/html/DaylightSavingTime.html)26
-rw-r--r--BUILD/Help/html/Exclude Items.html (renamed from BUILD/Help/html/ExcludeSubfolder.html)115
-rw-r--r--BUILD/Help/html/External Applications.html (renamed from BUILD/Help/html/ExternalApp.html)14
-rw-r--r--BUILD/Help/html/FreeFileSync.html24
-rw-r--r--BUILD/Help/html/Links.html10
-rw-r--r--BUILD/Help/html/Macros.html12
-rw-r--r--BUILD/Help/html/RealtimeSync.html57
-rw-r--r--BUILD/Help/html/Run as Service.html (renamed from BUILD/Help/html/RunAsService.html)42
-rw-r--r--BUILD/Help/html/Schedule a Batch Job.html (renamed from BUILD/Help/html/ScheduleBatch.html)60
-rw-r--r--BUILD/Help/html/SendMail.html56
-rw-r--r--BUILD/Help/html/Synchronize with FTP.html (renamed from BUILD/Help/html/Ftp.html)12
-rw-r--r--BUILD/Help/html/Variable Drive Letters.html (renamed from BUILD/Help/html/VariableDrive.html)17
-rw-r--r--BUILD/Help/html/Volume Shadow Copy.html (renamed from BUILD/Help/html/ShadowCopy.html)26
-rw-r--r--BUILD/Help/img/MainDialog.pngbin75788 -> 75443 bytes
-rw-r--r--BUILD/Help/img/RealtimeSync.pngbin32699 -> 42122 bytes
-rw-r--r--BUILD/Help/img/SetupBatch.pngbin35821 -> 31640 bytes
-rw-r--r--BUILD/Help/img/SourceTarget.pngbin4857 -> 4736 bytes
-rw-r--r--BUILD/Help/img/WatchUsbInsert.pngbin34801 -> 35572 bytes
-rw-r--r--BUILD/HideConsole.vbs (renamed from BUILD/RunSilent.vbs)2
-rw-r--r--BUILD/Languages/chinese_simple.lng337
-rw-r--r--BUILD/Languages/chinese_traditional.lng287
-rw-r--r--BUILD/Languages/croatian.lng307
-rw-r--r--BUILD/Languages/czech.lng293
-rw-r--r--BUILD/Languages/danish.lng305
-rw-r--r--BUILD/Languages/dutch.lng303
-rw-r--r--BUILD/Languages/english_uk.lng302
-rw-r--r--BUILD/Languages/finnish.lng318
-rw-r--r--BUILD/Languages/french.lng305
-rw-r--r--BUILD/Languages/german.lng353
-rw-r--r--BUILD/Languages/greek.lng299
-rw-r--r--BUILD/Languages/hebrew.lng294
-rw-r--r--BUILD/Languages/hungarian.lng293
-rw-r--r--BUILD/Languages/italian.lng304
-rw-r--r--BUILD/Languages/japanese.lng303
-rw-r--r--BUILD/Languages/korean.lng297
-rw-r--r--BUILD/Languages/lithuanian.lng315
-rw-r--r--BUILD/Languages/norwegian.lng277
-rw-r--r--BUILD/Languages/polish.lng275
-rw-r--r--BUILD/Languages/portuguese.lng305
-rw-r--r--BUILD/Languages/portuguese_br.lng353
-rw-r--r--BUILD/Languages/romanian.lng300
-rw-r--r--BUILD/Languages/russian.lng307
-rw-r--r--BUILD/Languages/slovenian.lng307
-rw-r--r--BUILD/Languages/spanish.lng289
-rw-r--r--BUILD/Languages/swedish.lng357
-rw-r--r--BUILD/Languages/turkish.lng295
-rw-r--r--BUILD/Languages/ukrainian.lng308
-rw-r--r--BUILD/Resources.zipbin272579 -> 268638 bytes
-rw-r--r--BUILD/Sync_Complete.wavbin364076 -> 364076 bytes
-rw-r--r--FreeFileSync.cbp1
-rw-r--r--Makefile2
-rw-r--r--RealtimeSync/RealtimeSync.cbp2
-rw-r--r--RealtimeSync/application.cpp8
-rw-r--r--RealtimeSync/gui_generated.cpp103
-rw-r--r--RealtimeSync/gui_generated.h10
-rw-r--r--RealtimeSync/main_dlg.cpp16
-rw-r--r--RealtimeSync/makefile2
-rw-r--r--RealtimeSync/tray_menu.cpp25
-rw-r--r--RealtimeSync/watcher.cpp25
-rw-r--r--RealtimeSync/watcher.h4
-rw-r--r--RealtimeSync/xml_proc.cpp3
-rw-r--r--algorithm.cpp162
-rw-r--r--comparison.cpp44
-rw-r--r--file_hierarchy.cpp36
-rw-r--r--file_hierarchy.h2
-rw-r--r--lib/binary.cpp42
-rw-r--r--lib/db_file.cpp10
-rw-r--r--lib/dir_exist_async.h3
-rw-r--r--lib/dir_lock.cpp46
-rw-r--r--lib/help_provider.h5
-rw-r--r--lib/localization.cpp23
-rw-r--r--lib/parallel_scan.cpp80
-rw-r--r--lib/parallel_scan.h8
-rw-r--r--lib/parse_lng.h25
-rw-r--r--lib/perf_check.cpp7
-rw-r--r--lib/process_xml.cpp20
-rw-r--r--lib/process_xml.h14
-rw-r--r--lib/resolve_path.cpp10
-rw-r--r--lib/resources.cpp2
-rw-r--r--lib/return_codes.h22
-rw-r--r--lib/shadow.cpp2
-rw-r--r--lib/status_handler.h1
-rw-r--r--lib/xml_base.cpp3
-rw-r--r--structures.cpp2
-rw-r--r--structures.h2
-rw-r--r--synchronization.cpp274
-rw-r--r--synchronization.h16
-rw-r--r--ui/batch_config.cpp29
-rw-r--r--ui/batch_status_handler.cpp38
-rw-r--r--ui/batch_status_handler.h8
-rw-r--r--ui/check_version.cpp47
-rw-r--r--ui/custom_grid.cpp181
-rw-r--r--ui/custom_grid.h2
-rw-r--r--ui/dir_name.cpp2
-rw-r--r--ui/exec_finished_box.cpp12
-rw-r--r--ui/folder_history_box.cpp9
-rw-r--r--ui/folder_pair.h19
-rw-r--r--ui/grid_view.cpp7
-rw-r--r--ui/gui_generated.cpp1240
-rw-r--r--ui/gui_generated.h163
-rw-r--r--ui/main_dlg.cpp521
-rw-r--r--ui/main_dlg.h6
-rw-r--r--ui/msg_popup.cpp6
-rw-r--r--ui/progress_indicator.cpp43
-rw-r--r--ui/small_dlgs.cpp138
-rw-r--r--ui/sync_cfg.cpp10
-rw-r--r--ui/tray_icon.cpp2
-rw-r--r--ui/tree_view.cpp16
-rw-r--r--version/version.h2
-rw-r--r--version/version.rc4
-rw-r--r--wx+/app_main.h7
-rw-r--r--wx+/context_menu.h11
-rw-r--r--wx+/format_unit.cpp134
-rw-r--r--wx+/format_unit.h11
-rw-r--r--wx+/graph.cpp32
-rw-r--r--wx+/grid.cpp102
-rw-r--r--wx+/image_tools.h4
-rw-r--r--wx+/shell_execute.h6
-rw-r--r--wx+/string_conv.h6
-rw-r--r--zen/FindFilePlus/FindFilePlus.vcxproj8
-rw-r--r--zen/FindFilePlus/find_file_plus.cpp43
-rw-r--r--zen/FindFilePlus/find_file_plus.h3
-rw-r--r--zen/debug_log.h2
-rw-r--r--zen/dir_watcher.cpp21
-rw-r--r--zen/dst_hack.cpp8
-rw-r--r--zen/file_error.h11
-rw-r--r--zen/file_handling.cpp348
-rw-r--r--zen/file_handling.h4
-rw-r--r--zen/file_io.cpp29
-rw-r--r--zen/file_io.h2
-rw-r--r--zen/file_traverser.cpp297
-rw-r--r--zen/file_traverser.h23
-rw-r--r--zen/file_update_handle.h33
-rw-r--r--zen/i18n.h17
-rw-r--r--zen/last_error.h4
-rw-r--r--zen/long_path_prefix.h2
-rw-r--r--zen/privilege.cpp2
-rw-r--r--zen/recycler.cpp2
-rw-r--r--zen/string_base.h37
-rw-r--r--zen/symlink_target.h11
-rw-r--r--zen/thread.h8
-rw-r--r--zen/tick_count.h11
-rw-r--r--zen/utf.h (renamed from zen/utf8.h)186
-rw-r--r--zen/win_ver.h5
-rw-r--r--zen/zstring.h14
155 files changed, 7012 insertions, 7442 deletions
diff --git a/Application.cpp b/Application.cpp
index 899c86c8..21fe958e 100644
--- a/Application.cpp
+++ b/Application.cpp
@@ -60,7 +60,7 @@ bool Application::OnInit()
std::set_terminate(onTerminationRequested); //unlike wxWidgets uncaught exception handling, this works for all worker threads
#endif
- returnValue = 0;
+ returnCode = FFS_RC_SUCCESS;
//do not call wxApp::OnInit() to avoid using default commandline parser
//Note: initialization is done in the FIRST idle event instead of OnInit. Reason: batch mode requires the wxApp eventhandler to be established
@@ -73,13 +73,67 @@ bool Application::OnInit()
}
+std::vector<wxString> getCommandlineArgs(const wxApp& app)
+{
+ std::vector<wxString> args;
+#ifdef FFS_WIN
+ //we do the job ourselves! both wxWidgets and ::CommandLineToArgvW() parse "C:\" "D:\" as single line C:\" D:\"
+ //-> "solution": we just don't support protected quotation mark!
+ std::wstring cmdLine = ::GetCommandLine(); //only way to get a unicode commandline
+ while (endsWith(cmdLine, L' ')) //may end with space
+ cmdLine.resize(cmdLine.size() - 1);
+
+ auto iterStart = cmdLine.end(); //end() means: no token
+ for (auto iter = cmdLine.begin(); iter != cmdLine.end(); ++iter)
+ if (*iter == L' ') //space commits token
+ {
+ if (iterStart != cmdLine.end())
+ {
+ args.push_back(std::wstring(iterStart, iter));
+ iterStart = cmdLine.end(); //expect consecutive blanks!
+ }
+ }
+ else
+ {
+ //start new token
+ if (iterStart == cmdLine.end())
+ iterStart = iter;
+
+ if (*iter == L'\"')
+ {
+ iter = std::find(iter + 1, cmdLine.end(), L'\"');
+ if (iter == cmdLine.end())
+ break;
+ }
+ }
+ if (iterStart != cmdLine.end())
+ args.push_back(std::wstring(iterStart, cmdLine.end()));
+
+ if (!args.empty())
+ args.erase(args.begin()); //remove first argument which is exe path by convention: http://blogs.msdn.com/b/oldnewthing/archive/2006/05/15/597984.aspx
+
+ std::for_each(args.begin(), args.end(),
+ [](wxString& str)
+ {
+ if (str.size() >= 2 && startsWith(str, L'\"') && endsWith(str, L'\"'))
+ str = wxString(str.c_str() + 1, str.size() - 2);
+ });
+
+#else
+ for (int i = 1; i < app.argc; ++i) //wxWidgets screws up once again making "argv implicitly convertible to a wxChar**" in 2.9.3,
+ args.push_back(app.argv[i]); //so we are forced to use this pitiful excuse for a range construction!!
+#endif
+ return args;
+}
+
+
void Application::OnStartApplication(wxIdleEvent&)
{
Disconnect(wxEVT_IDLE, wxIdleEventHandler(Application::OnStartApplication), nullptr, this);
//wxWidgets app exit handling is weird... we want the app to exit only if the logical main window is closed
wxTheApp->SetExitOnFrameDelete(false); //avoid popup-windows from becoming temporary top windows leading to program exit after closure
- auto app = wxTheApp; //fix lambda/wxWigets/VC fuck up
+ auto app = wxTheApp; //fix lambda/wxWigets/VC fuck up
ZEN_ON_SCOPE_EXIT(if (!mainWindowWasSet()) app->ExitMainLoop();); //quit application, if no main window was set (batch silent mode)
//if appname is not set, the default is the executable's name!
@@ -121,9 +175,7 @@ void Application::OnStartApplication(wxIdleEvent&)
setLanguage(globalSettings.programLanguage);
//determine FFS mode of operation
- std::vector<wxString> commandArgs; //wxWidgets screws up once again making "argv implicitly convertible to a wxChar**" in 2.9.3,
- for (int i = 1; i < argc; ++i) //so we are forced to use this pitiful excuse for a range construction!!
- commandArgs.push_back(argv[i]);
+ std::vector<wxString> commandArgs = getCommandlineArgs(*this);
if (commandArgs.empty())
runGuiMode(commandArgs, globalSettings);
@@ -150,7 +202,7 @@ void Application::OnStartApplication(wxIdleEvent&)
if (index % 2 == 0)
fp.leftDirectory = toZ(*iter);
- else if (index % 2 == 1)
+ else
fp.rightDirectory = toZ(*iter);
}
@@ -180,7 +232,7 @@ void Application::OnStartApplication(wxIdleEvent&)
{
case MERGE_BATCH: //pure batch config files
if (commandArgs.size() == 1)
- runBatchMode(commandArgs[0], globalSettings);
+ runBatchMode(utfCvrtTo<Zstring>(commandArgs[0]), globalSettings);
else
runGuiMode(commandArgs, globalSettings);
break;
@@ -199,7 +251,7 @@ void Application::OnStartApplication(wxIdleEvent&)
{
case XML_TYPE_GLOBAL:
case XML_TYPE_OTHER:
- wxMessageBox(_("The file does not contain a valid configuration:") + L" " + fmtFileName(toZ(filename)), _("Error"), wxOK | wxICON_ERROR);
+ wxMessageBox(replaceCpy(_("File %x does not contain a valid configuration."), L"%x", fmtFileName(toZ(filename))), _("Error"), wxOK | wxICON_ERROR);
return true;
case XML_TYPE_GUI:
@@ -231,10 +283,10 @@ int Application::OnRun()
{
//it's not always possible to display a message box, e.g. corrupted stack, however (non-stream) file output works!
wxFile safeOutput(toWx(getConfigDir()) + L"LastError.txt", wxFile::write);
- safeOutput.Write(utf8CvrtTo<wxString>(e.what()));
+ safeOutput.Write(utfCvrtTo<wxString>(e.what()));
- wxSafeShowMessage(_("An exception occurred!") + L" - FFS", utf8CvrtTo<wxString>(e.what()));
- return -9;
+ wxSafeShowMessage(_("An exception occurred!") + L" - FFS", utfCvrtTo<wxString>(e.what()));
+ return FFS_RC_EXCEPTION;
}
catch (...) //catch the rest
{
@@ -244,10 +296,10 @@ int Application::OnRun()
safeOutput.Write(msg);
wxSafeShowMessage(_("An exception occurred!"), msg);
- return -9;
+ return FFS_RC_EXCEPTION;
}
- return returnValue;
+ return returnCode;
}
@@ -277,7 +329,7 @@ void Application::OnQueryEndSession(wxEvent& event)
mainWin->onQueryEndSession();
OnExit();
//wxEntryCleanup(); -> gives popup "dll init failed" on XP
- std::exit(returnValue); //Windows will terminate anyway: destruct global objects
+ std::exit(returnCode); //Windows will terminate anyway: destruct global objects
}
@@ -295,15 +347,13 @@ void Application::runGuiMode(const std::vector<wxString>& cfgFileNames, xmlAcces
}
-void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSettings& globSettings)
+void Application::runBatchMode(const Zstring& filename, xmlAccess::XmlGlobalSettings& globSettings)
{
- using namespace xmlAccess;
- using namespace zen;
//load XML settings
XmlBatchConfig batchCfg; //structure to receive gui settings
try
{
- readConfig(toZ(filename), batchCfg);
+ readConfig(filename, batchCfg);
}
catch (const xmlAccess::FfsXmlError& error)
{
@@ -318,16 +368,19 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet
try //begin of synchronization process (all in one try-catch block)
{
- const SwitchToGui switchBatchToGui(filename, batchCfg, globSettings); //prepare potential operational switch
+ const std::wstring timestamp = formatTime<std::wstring>(L"%Y-%m-%d %H%M%S");
+
+ 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,
batchCfg.logFileDirectory,
batchCfg.logFileCountMax,
batchCfg.handleError,
switchBatchToGui,
- returnValue,
+ returnCode,
batchCfg.mainCfg.onCompletion,
globSettings.gui.onCompletionHistory);
@@ -369,14 +422,15 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet
cmpProc.startCompareProcess(cmpConfig, folderCmp);
//START SYNCHRONIZATION
- SyncProcess syncProc(
- globSettings.optDialogs,
- globSettings.verifyFileCopy,
- globSettings.copyLockedFiles,
- globSettings.copyFilePermissions,
- globSettings.transactionalFileCopy,
- globSettings.runWithBackgroundPriority,
- statusHandler);
+ 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());
@@ -386,15 +440,10 @@ void Application::runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSet
//play (optional) sound notification after sync has completed -> don't play in silent mode, consider RealtimeSync!
if (batchCfg.showProgress)
{
- const wxString soundFile = toWx(getResourceDir()) + wxT("Sync_Complete.wav");
+ const wxString soundFile = toWx(getResourceDir()) + L"Sync_Complete.wav";
if (fileExists(toZ(soundFile)))
wxSound::Play(soundFile, wxSOUND_ASYNC); //warning: this may fail and show a wxWidgets error message! => must not play when running FFS as a service!
}
}
- catch (BatchAbortProcess&) //exit used by statusHandler
- {
- if (returnValue >= 0)
- returnValue = -12;
- return;
- }
+ catch (BatchAbortProcess&) {} //exit used by statusHandler
}
diff --git a/Application.h b/Application.h
index 4940c910..0d247796 100644
--- a/Application.h
+++ b/Application.h
@@ -9,6 +9,7 @@
#include <wx/app.h>
#include "lib/process_xml.h"
+#include "lib/return_codes.h"
class Application : public wxApp
@@ -25,10 +26,10 @@ public:
private:
void runGuiMode(const xmlAccess::XmlGuiConfig& guiCfg, xmlAccess::XmlGlobalSettings& settings);
void runGuiMode(const std::vector<wxString>& cfgFileName, xmlAccess::XmlGlobalSettings& settings);
- void runBatchMode(const wxString& filename, xmlAccess::XmlGlobalSettings& globSettings);
+ void runBatchMode(const Zstring& filename, xmlAccess::XmlGlobalSettings& globSettings);
xmlAccess::XmlGlobalSettings globalSettings; //settings used by GUI, batch mode or both
- int returnValue;
+ zen::FfsReturnCode returnCode;
};
#endif // FREEFILESYNCAPP_H
diff --git a/BUILD/Changelog.txt b/BUILD/Changelog.txt
index f300e42c..2591ad63 100644
--- a/BUILD/Changelog.txt
+++ b/BUILD/Changelog.txt
@@ -2,6 +2,33 @@
|FreeFileSync|
--------------
+Changelog v5.4
+--------------
+Copy all NTFS extended attributes
+Improved statistics panel
+Improved main grid
+Support context menu for files in overview tree
+Process double-clicks outside main grid
+Allow quoted paths ending with backslash in command line: "C:\"
+Fully localized number formatting (Windows)
+Fixed deletion dialog header being trimmed (Linux)
+Fixed exclusion via context menu (Linux)
+Preserve row label width after comparison (Linux)
+Updated help file
+New batch mode return codes, see help file
+Prefix custom deletion directory with job name
+Use the same time stamp for log file and versioning
+Handle folder drag and drop outside main grid
+Avoid name clash having multiple folder pairs delete into the same versioning folder
+Exit FreeFileSync automatically while upgrading to new version
+Accessibility: Support high contrast color schemes
+Yet another UI design overhaul
+Fixed "access denied" issue on OS X-hosted network shares
+Support Citrix folder shares
+Support Arch Linux (Chakra)
+Updated translation files
+
+
Changelog v5.3
--------------
Show which processes lock a file during synchronization (Windows Vista and later)
diff --git a/BUILD/FreeFileSync.chm b/BUILD/FreeFileSync.chm
index 497b848e..09d8adab 100644
--- a/BUILD/FreeFileSync.chm
+++ b/BUILD/FreeFileSync.chm
Binary files differ
diff --git a/BUILD/Help/FreeFileSync.hhp b/BUILD/Help/FreeFileSync.hhp
index 4f2effed..1604194a 100644
--- a/BUILD/Help/FreeFileSync.hhp
+++ b/BUILD/Help/FreeFileSync.hhp
@@ -10,23 +10,22 @@ Title=FreeFileSync - Help
[FILES]
-html\Links.html
-html\CompareFileSize.html
-html\ExcludeSubfolder.html
-html\ExternalApp.html
-html\Ftp.html
-html\ScheduleBatch.html
-html\SendMail.html
-html\BackupStrategy.html
-html\VariableDrive.html
html\FreeFileSync.html
-html\DaylightSavingTime.html
+html\Backup Strategies.html
+html\Batch Scripting.html
+html\Compare by File Size.html
+html\Comparison Settings.html
+html\Daylight Saving Time.html
+html\Exclude Items.html
+html\External Applications.html
html\Macros.html
+html\Schedule a Batch Job.html
+html\Synchronize with FTP.html
+html\Variable Drive Letters.html
+html\Volume Shadow Copy.html
html\RealtimeSync.html
-html\ShadowCopy.html
-html\RunAsService.html
-html\Batch Scripting.html
-html\ComparisonSettings.html
+html\Run as Service.html
+html\Links.html
[INFOTYPES]
diff --git a/BUILD/Help/Table of Contents.hhc b/BUILD/Help/Table of Contents.hhc
index 3dad4ac0..acee8f36 100644
--- a/BUILD/Help/Table of Contents.hhc
+++ b/BUILD/Help/Table of Contents.hhc
@@ -21,7 +21,7 @@
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Backup Strategies">
- <param name="Local" value="html\BackupStrategy.html">
+ <param name="Local" value="html\Backup Strategies.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Batch Scripting">
@@ -29,27 +29,23 @@
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Compare by file size">
- <param name="Local" value="html\CompareFileSize.html">
+ <param name="Local" value="html\Compare by File Size.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Comparison Settings">
- <param name="Local" value="html\ComparisonSettings.html">
+ <param name="Local" value="html\Comparison Settings.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Daylight saving time">
- <param name="Local" value="html\DaylightSavingTime.html">
+ <param name="Local" value="html\Daylight Saving Time.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
- <param name="Name" value="Error notification">
- <param name="Local" value="html\SendMail.html">
- </OBJECT>
- <LI> <OBJECT type="text/sitemap">
- <param name="Name" value="Exclude files">
- <param name="Local" value="html\ExcludeSubfolder.html">
+ <param name="Name" value="Exclude items">
+ <param name="Local" value="html\Exclude Items.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="External applications">
- <param name="Local" value="html\ExternalApp.html">
+ <param name="Local" value="html\External Applications.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Macros">
@@ -57,19 +53,19 @@
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Schedule a Batch Job">
- <param name="Local" value="html\ScheduleBatch.html">
+ <param name="Local" value="html\Schedule a Batch Job.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Synchronize with FTP">
- <param name="Local" value="html\Ftp.html">
+ <param name="Local" value="html\Synchronize with FTP.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Variable drive letters">
- <param name="Local" value="html\VariableDrive.html">
+ <param name="Local" value="html\Variable Drive Letters.html">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Volume Shadow Copy">
- <param name="Local" value="html\ShadowCopy.html">
+ <param name="Local" value="html\Volume Shadow Copy.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
@@ -84,7 +80,7 @@
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="Run as Service">
- <param name="Local" value="html\RunAsService.html">
+ <param name="Local" value="html\Run as Service.html">
</OBJECT>
</UL>
<LI> <OBJECT type="text/sitemap">
diff --git a/BUILD/Help/html/BackupStrategy.html b/BUILD/Help/html/Backup Strategies.html
index 9cec9364..95f33a47 100644
--- a/BUILD/Help/html/BackupStrategy.html
+++ b/BUILD/Help/html/Backup Strategies.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="20110901;20151400">
+ <META NAME="CHANGED" CONTENT="20120511;23131500">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -14,27 +14,26 @@
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Backup strategies</FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Backup
+Strategies</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>1.
Full backup with versioning of old files</B></FONT></P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In
-synchronization settings select and specify a &quot;User-defined
-directory&quot; for deletion handling. FreeFileSync will place files
-that have been deleted or overwritten with newer versions into
-corresponding time-stamped sub directories. This provides a
-space-optimized way to retain all older versions of files while the
-most recent ones are available in main source and target directories.</FONT></P>
+synchronization settings select and specify &quot;Versioning&quot;
+for deletion handling. FreeFileSync will place files that have been
+deleted or overwritten with newer versions into corresponding
+time-stamped sub directories. This provides a space-optimized way to
+save all older versions of files separately while the most recent
+ones are available in main source and target directories.</FONT></P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><BR>
@@ -62,7 +61,7 @@ Base directories are set up accordingly:</FONT></P>
will be interactively replaced with the current date during
synchronization. In order to further automate this process, you can
create a *.ffs_batch file with this configuration and choose &quot;<I>ignore
-errors</I>&quot; to avoid the warning that target directory is not
-(yet) existing.</FONT></P>
+errors</I>&quot; to avoid the popup message that target directory is
+not (yet) existing.</FONT></P>
</BODY>
</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Batch Scripting.html b/BUILD/Help/html/Batch Scripting.html
index 5ecddba7..526d3d79 100644
--- a/BUILD/Help/html/Batch Scripting.html
+++ b/BUILD/Help/html/Batch Scripting.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="20111019;20535600">
+ <META NAME="CHANGED" CONTENT="20120511;23115700">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -14,92 +14,74 @@
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Batch Scripting
-<SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Batch
+Scripting</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In
-order to facilitate using FreeFileSync and RealtimeSync in advanced
-synchronization scenarios, creating batch files is a good way to
-provide additional functionality. The following section will give
-some general hints and examples for custom *.cmd and *.bat files.</FONT></P>
+<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync
+can be called from command line and supports integration into batch
+scripts. This section gives some general hints and examples for
+Windows *.cmd and *.bat scripts.</FONT></P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
-<UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">When
- starting a batch file from RealtimeSync make synchronous calls to
- FreeFileSync only. This will prevent RealtimeSync continue detecting
- changes while synchronization is still in progress.<BR>&nbsp;</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">During
- execution of a Windows Batch file (*.bat/*.cmd) a black console
- window is shown. You can hide it using the Visual Basic script
- &quot;RunSilent.vbs&quot; located in FreeFileSync's installation
- directory.</FONT></P>
-</UL>
-<OL>
- <P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Usage:</B></FONT></P>
-</OL>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" 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">wscript C:\Program
- files\FreeFileSync\Invisible.vbs C:\MyBatchFile.cmd</FONT></P>
+<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">When
+FreeFileSync is started in batch mode (a *.ffs_batch file is passed
+as argument) it returns one of the following status codes:</FONT></P>
+<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">
+ <UL>
+ <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><B>Return
+ Codes</B></SPAN><SPAN STYLE="font-style: normal"><BR>0 -
+ Synchronization completed successfully<BR>1 - Synchronization
+ completed with errors<BR>2 - Synchronization was aborted</SPAN></FONT></P>
+ </UL>
</SPAN><BR CLEAR=LEFT><BR>
</P>
-<UL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync
- returns with an Errorlevel below zero if unresolved problems remain:</FONT></P>
-</UL>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
+<P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT FACE="Tahoma, sans-serif">Now
+you can check if synchronization was successful from a script:</FONT></P>
+<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen6" 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="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">&quot;C:\Program
- Files\FreeFileSync\FreeFileSync.exe&quot;
- &quot;H:\Silent_Config.ffs_batch&quot;<BR>if not errorlevel 0
- (<BR>&nbsp;&nbsp;</FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::if
- something went wrong, add special treatment here<BR>&nbsp;&nbsp;</B></I></FONT></FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">echo
+ Files\FreeFileSync\FreeFileSync.exe&quot; &quot;H:\some
+ folder\SyncJob.ffs_batch&quot;<BR>if errorlevel 1 (<BR>&nbsp;&nbsp;</FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::if
+ return code is 1 or greater, something went wrong, add special
+ treatment here<BR>&nbsp;&nbsp;</B></I></FONT></FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">echo
Errors occurred during synchronization...</SPAN></SPAN></FONT></FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B><BR>&nbsp;&nbsp;</B></I></FONT></FONT><FONT FACE="Courier New, monospace">pause<BR>)</FONT></FONT></P>
</SPAN><BR CLEAR=LEFT><BR>
</P>
+<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Instead
+of displaying &quot;An error occurred!&quot; you can also send an
+email notification (using a third party tool).</FONT>
+</P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B>
-Shutdown PC after synchronization</FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
+<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" 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">
- &nbsp;&nbsp;<FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::start
- FreeFileSync Batch
- Job<BR></B></I></FONT></FONT><FONT FACE="Courier New, monospace">&quot;C:\Users\ZenJu\Desktop\SyncJob.ffs_batch&quot;<BR>&nbsp;&nbsp;</FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::schedule
- shutdown after 10 seconds<BR></B></I></FONT></FONT><FONT FACE="Courier New, monospace">shutdown
- /s /t 10</FONT></P>
+ <FONT FACE="Tahoma, sans-serif"><B>Attention<BR></B>Make sure your
+ script is not blocked by a popup dialog. Consider the following
+ options when setting up a FreeFileSync batch job:</FONT></P>
+ <UL>
+ <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Disable
+ checkbox &quot;<I>Show progress dialog</I>&quot; or have &quot;On
+ completion&quot; automatically close the results dialog after
+ synchronization.</FONT></P>
+ <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Set
+ &quot;</SPAN></FONT><FONT FACE="Tahoma, sans-serif"><I><SPAN STYLE="font-weight: normal">Error
+ handling</SPAN></I></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">&quot;
+ to &quot;</SPAN></FONT><FONT FACE="Tahoma, sans-serif"><I><SPAN STYLE="font-weight: normal">Exit
+ instantly</SPAN></I></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">&quot;
+ or &quot;</SPAN></FONT><FONT FACE="Tahoma, sans-serif"><I><SPAN STYLE="font-weight: normal">Ignore
+ errors</SPAN></I></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">&quot;.</SPAN></FONT></P>
+ </UL>
</SPAN><BR CLEAR=LEFT><BR>
</P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B>
-A simple locking facility &ndash; (<SPAN STYLE="font-style: normal"><B>Note:</B></SPAN>
-<I>FreeFileSync already has a more powerful directory locking
-mechanism implemented that allows multiple writers in parallel</I>)</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="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">:tryAgain<BR>if
- not exist \\share\folder\lock (<BR>&nbsp;&nbsp;</FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::create
- the lock<BR>&nbsp;&nbsp;</B></I></FONT></FONT><FONT FACE="Courier New, monospace">echo
- This is a lock file &gt; \\share\folder\lock<BR>&nbsp;&nbsp;</FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::execute
- the synchronization batch job synchronously<BR>&nbsp;&nbsp;</B></I></FONT></FONT><FONT FACE="Courier New, monospace">&quot;C:\Program
- Files\FreeFileSync\FreeFileSync.exe&quot;
- &quot;C:\MySyncJob.ffs_batch&quot;<BR>&nbsp;&nbsp;del
- \\share\folder\lock<BR>) else (<BR>&nbsp;&nbsp;</FONT><FONT COLOR="#808080"><FONT FACE="Courier New, monospace"><I><B>::wait
- 5 seconds then try starting sync again:<BR>&nbsp;&nbsp;</B></I></FONT></FONT><FONT FACE="Courier New, monospace">choice
- /C:AB /T:5 /D:A &gt; NUL<BR>&nbsp;&nbsp;goto tryAgain<BR>)</FONT></FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
</BODY>
</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/CompareFileSize.html b/BUILD/Help/html/Compare by File Size.html
index af184fd9..81e4ab62 100644
--- a/BUILD/Help/html/CompareFileSize.html
+++ b/BUILD/Help/html/Compare by File Size.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="20100902;19144900">
+ <META NAME="CHANGED" CONTENT="20120511;23114500">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -14,17 +14,15 @@
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Compare by file
-size</FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Compare
+by file size</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Sometimes
diff --git a/BUILD/Help/html/ComparisonSettings.html b/BUILD/Help/html/Comparison Settings.html
index 7af12727..55b49830 100644
--- a/BUILD/Help/html/ComparisonSettings.html
+++ b/BUILD/Help/html/Comparison Settings.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="20120227;12315700">
+ <META NAME="CHANGED" CONTENT="20120511;23113800">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -18,13 +18,15 @@
H3.western { font-family: "Arial", sans-serif }
H3.cjk { font-family: "MS Mincho" }
H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Comparison
-Settings</FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Comparison
+Settings</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><IMG SRC="../img/CmpSettings.png" NAME="Grafik1" ALIGN=BOTTOM WIDTH=250 HEIGHT=257 BORDER=0></P>
<H3 CLASS="western" STYLE="page-break-after: avoid"><FONT FACE="Tahoma, sans-serif">I.
Compare by &quot;File time and size&quot;</FONT></H3>
@@ -144,17 +146,16 @@ called symlinks or soft links):</FONT></P>
</OL>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
-<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">
- <FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P>
+<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
<UL>
+ <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT></P>
<LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In
- Windows the symbolic link options apply to </FONT><FONT FACE="Tahoma, sans-serif"><I>&quot;Reparse
- Points&quot;</I></FONT><FONT FACE="Tahoma, sans-serif">. Reparse
- Points are a more general concept including symbolic links,
- junctions and mount points.</FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm; font-style: normal"><FONT FACE="Tahoma, sans-serif">Copying
- symbolic links requires administrator rights.</FONT></P>
+ Windows the symbolic link options apply to <I>&quot;Reparse
+ Points&quot;</I>. Reparse Points are a more general concept
+ including symbolic links, junctions and mount points.</FONT></P>
+ <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm; font-style: normal">
+ <FONT FACE="Tahoma, sans-serif">Copying symbolic links requires
+ administrator rights.</FONT></P>
</UL>
</SPAN><BR CLEAR=LEFT><BR>
</P>
diff --git a/BUILD/Help/html/DaylightSavingTime.html b/BUILD/Help/html/Daylight Saving Time.html
index a15ea521..d088d807 100644
--- a/BUILD/Help/html/DaylightSavingTime.html
+++ b/BUILD/Help/html/Daylight Saving Time.html
@@ -5,7 +5,7 @@
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)">
<META NAME="CREATED" CONTENT="20091208;20054200">
- <META NAME="CHANGED" CONTENT="20110301;19000400">
+ <META NAME="CHANGED" CONTENT="20120511;23112900">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -14,17 +14,15 @@
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal">Daylight
-saving time </SPAN><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">(Windows)</SPAN></SPAN></FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt"><SPAN STYLE="font-style: normal">Daylight
+saving time </SPAN><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">(Windows)</SPAN></SPAN></FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">A
@@ -62,19 +60,21 @@ only solves all DST issues but also time shifts that occur due to
travel between different time zones.</FONT></P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
-<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
- <P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P>
+<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">
<UL>
+ <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT></P>
<LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In
order for FreeFileSync to start handling DST and timezone
differences, an initial full synchronization is required.
Subsequent syncs will never show a time difference again.</FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If
- a FAT volume is scanned the first time by FreeFileSync this will
- take longer than usual since additional meta data is written for
- each file.</FONT></P>
+ <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm; font-style: normal">
+ <FONT FACE="Tahoma, sans-serif">If a FAT volume is scanned the
+ first time by FreeFileSync this will take longer than usual since
+ additional meta data is written for each file.</FONT></P>
</UL>
</SPAN><BR CLEAR=LEFT><BR>
</P>
+<P STYLE="margin-bottom: 0cm"><BR>
+</P>
</BODY>
</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/ExcludeSubfolder.html b/BUILD/Help/html/Exclude Items.html
index c3261463..239b639a 100644
--- a/BUILD/Help/html/ExcludeSubfolder.html
+++ b/BUILD/Help/html/Exclude Items.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="20120323;22023000">
+ <META NAME="CHANGED" CONTENT="20120511;23112100">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -14,26 +14,62 @@
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Exclude files</FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Exclude
+items</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Files
-and directories can be excluded from synchronization by specifying
-include and exclude filter lists. Only if they match at least one
-entry in the include list and none of the entries in the exclude list
-they pass filtering. Each list item is a file or directory path
-relative to synchronization base directories. Optionally wild cards
-like '*' or '?' may be used.</FONT></P>
+and directories are only considered for synchronization if they pass
+the filter. They have to match at least one entry in the include list
+and none of the entries in the exclude list:</FONT></P>
+<OL>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Each
+ list item must be a file or directory path </FONT><FONT FACE="Tahoma, sans-serif"><B>relative</B></FONT>
+ <FONT FACE="Tahoma, sans-serif">to synchronization base directories</FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Multiple
+ items must be separated by ';' or a new line</FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Wild
+ cards like '*' or '?' may be used</FONT></P>
+</OL>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B>
+Exclude items for m<SPAN STYLE="font-weight: normal">irror-sync from
+</SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">C:\Source</SPAN></FONT>
+<SPAN STYLE="font-weight: normal">to </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">D:\Target</SPAN></FONT></FONT></P>
+<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
+ <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Single
+ file </SPAN></FONT><FONT FACE="Courier New, monospace">C:\Source\file.txt:<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude:
+ </SPAN></FONT><FONT FACE="Courier New, monospace">\file.txt</FONT></P>
+ <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Single
+ folder </SPAN></FONT><FONT FACE="Courier New, monospace">C:\Source\subfolder:<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude:
+ </SPAN></FONT><FONT FACE="Courier New, monospace">\subfolder\</FONT></P>
+ <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">All
+ files (and folders) named </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">thumbs.db</SPAN></FONT><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">:<BR></SPAN></FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude:
+ </SPAN></FONT><FONT FACE="Courier New, monospace">*\thumbs.db</FONT></P>
+ <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">All
+ </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">*.tmp</SPAN></FONT>
+ <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">files
+ located in </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">subfolder</SPAN></FONT>
+ <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">only:<BR></SPAN></FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude:
+ </SPAN></FONT><FONT FACE="Courier New, monospace">\subfolder\*.tmp</FONT></P>
+ <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Files
+ and folders containing </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">temp</SPAN></FONT>
+ <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">somewhere
+ in their path:<BR></SPAN></FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude:
+ </SPAN></FONT><FONT FACE="Courier New, monospace">*temp*</FONT></P>
+ <P ALIGN=LEFT STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Multiple
+ entries separated by semicolon:<BR></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN STYLE="font-weight: normal">Exclude:
+ </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">*.tmp;
+ *.doc; *.bak</SPAN></FONT></FONT></P>
+</SPAN><BR CLEAR=LEFT><BR>
+</P>
+<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B>
Exclude all files and folders located in subdirectories of base
directories</FONT></P>
<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
@@ -49,54 +85,23 @@ located in subdirectories of base directories</SPAN></FONT></P>
<FONT FACE="Tahoma, sans-serif">Include: <FONT FACE="Courier New, monospace">*\*</FONT></FONT></P>
</SPAN><BR CLEAR=LEFT><BR>
</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B>
-<SPAN STYLE="font-weight: normal">Mirror-sync from </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">C:\Source</SPAN></FONT>
-<SPAN STYLE="font-weight: normal">to </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">D:\Target</SPAN></FONT></FONT></P>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen1" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: none; padding: 0cm; background: #e6e6e6">
- <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude
- single file </SPAN></FONT><FONT FACE="Courier New, monospace">C:\Source\file.txt:<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter:
- </SPAN></FONT><FONT FACE="Courier New, monospace">\file.txt</FONT></P>
- <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude
- single folder </SPAN></FONT><FONT FACE="Courier New, monospace">C:\Source\sample\subfolder:<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter:
- </SPAN></FONT><FONT FACE="Courier New, monospace">\sample\subfolder\</FONT></P>
- <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude
- all </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">*.tmp</SPAN></FONT>
- <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">files
- located in </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">subfolder</SPAN></FONT>
- <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">only:<BR></SPAN></FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter:
- </SPAN></FONT><FONT FACE="Courier New, monospace">\sample\subfolder\*.tmp</FONT></P>
- <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude
- files (and folders) named </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">thumbs.db</SPAN></FONT>
- <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">in
- all directories:<BR></SPAN></FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter:
- </SPAN></FONT><FONT FACE="Courier New, monospace">*\thumbs.db</FONT></P>
- <P STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude
- files and folders that have </SPAN></FONT><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">test</SPAN></FONT>
- <FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">as
- part of their name:<BR></SPAN></FONT>&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Filter:
- </SPAN></FONT><FONT FACE="Courier New, monospace">*test*</FONT></P>
- <P ALIGN=LEFT STYLE="margin-left: 0.82cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-weight: normal">Exclude
- multiple entries; separate by semicolon or newlines:<BR></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN STYLE="font-weight: normal">Filter:
- </SPAN><FONT FACE="Courier New, monospace"><SPAN STYLE="font-weight: normal">*.tmp;
- *.doc; *.bak</SPAN></FONT></FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
-<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" 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">
- <FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P>
+<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen4" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
<UL>
- <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">A
- filter string is generally compared against both file and directory
- names. If you want to consider directories only, you can give a
- hint by appending a path separator: &quot;<FONT FACE="Courier New, monospace">string\</FONT>&quot;.</FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">In
- most cases manually specifying a filter phrase is not necessary!
- You can exclude files, directories and even complete lists of both
- directly on main grid via context menu.</FONT></P>
+ <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT></P>
+ <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">For
+ simple exclusions just right-click and exclude one or a list of
+ items directly on main grid via context menu.</FONT></P>
+ <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm; font-style: normal">
+ <FONT FACE="Tahoma, sans-serif">A filter string is compared against
+ both file and directory paths. If you want to consider directories
+ only, you can give a hint by appending a path separator:
+ &quot;dirname<FONT FACE="Courier New, monospace">\</FONT>&quot;.</FONT></P>
</UL>
</SPAN><BR CLEAR=LEFT><BR>
</P>
+<P STYLE="margin-bottom: 0cm"><BR>
+</P>
</BODY>
</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/ExternalApp.html b/BUILD/Help/html/External Applications.html
index 01d3269a..16a7134d 100644
--- a/BUILD/Help/html/ExternalApp.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="20120118;19302500">
+ <META NAME="CHANGED" CONTENT="20120511;23111200">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -14,17 +14,15 @@
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">External
-applications</FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">External
+applications</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">By
@@ -68,7 +66,7 @@ used:</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">
- <FONT FACE="Tahoma, sans-serif"><B>Note:</B><BR>Don't forget to use
+ <FONT FACE="Tahoma, sans-serif"><B>Note</B><BR>Don't forget to use
quotation marks if file names contain spaces!</FONT></P>
</SPAN><BR CLEAR=LEFT><BR>
</P>
diff --git a/BUILD/Help/html/FreeFileSync.html b/BUILD/Help/html/FreeFileSync.html
index 446a5aa0..f08d1600 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="20120408;21065300">
+ <META NAME="CHANGED" CONTENT="20120504;2110200">
<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 WIDTH=427 HEIGHT=52 BORDER=0></P>
+ left and right directories.<BR></FONT><IMG SRC="../img/SourceTarget.png" NAME="Grafik4" ALIGN=TEXTTOP 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>
@@ -95,15 +95,17 @@ Features</FONT></H3>
comparison</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Full
support for Symbolic Links</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Run
- as a batch job</FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Automate
+ sync as a batch job</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Multiple
folder pairs</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Preserve
- NTFS sparse files</FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Copy
+ NTFS extended attributes (compressed, encrypted, sparse)</FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Copy
+ NTFS security permissions</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Support
- very long path names &gt; 260 characters</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Transactional
+ long path names &gt; 260 characters</FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Fail-safe
file copy</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Cross-platform:
Windows/Linux</FONT></P>
@@ -113,8 +115,8 @@ Features</FONT></H3>
variable drive letters by volume name (USB sticks)</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Native
32 and 64-bit builds</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Versioning
- of deleted files</FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Keep
+ versions of deleted/updated files</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Optimal
sync sequence prevents disc space bottlenecks</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Full
@@ -124,7 +126,7 @@ Features</FONT></H3>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Include/exclude
files via filter</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Local
- or portable installation</FONT></P>
+ and portable installation</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Handle
daylight saving time changes on FAT/FAT32</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Use
diff --git a/BUILD/Help/html/Links.html b/BUILD/Help/html/Links.html
index 527146d4..5fcafa9d 100644
--- a/BUILD/Help/html/Links.html
+++ b/BUILD/Help/html/Links.html
@@ -5,21 +5,19 @@
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)">
<META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20110928;12294600">
+ <META NAME="CHANGED" CONTENT="20120511;23101500">
<STYLE TYPE="text/css">
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="de-DE" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Links</FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Links</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Homepage:<BR></FONT><A HREF="http://freefilesync.sourceforge.net/"><FONT COLOR="#000080"><FONT FACE="Tahoma, sans-serif"><SPAN LANG="zxx"><U>http://freefilesync.sourceforge.net</U></SPAN></FONT></FONT></A></P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
diff --git a/BUILD/Help/html/Macros.html b/BUILD/Help/html/Macros.html
index 3e9c93d1..17b0979e 100644
--- a/BUILD/Help/html/Macros.html
+++ b/BUILD/Help/html/Macros.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="20111022;16542200">
+ <META NAME="CHANGED" CONTENT="20120511;23110400">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -14,16 +14,14 @@
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="de-DE" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Macros</FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Macros</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">All
@@ -137,7 +135,7 @@ batch configuration file <FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batc
<UL>
<P><SPAN ID="Rahmen3" 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">
- <FONT FACE="Tahoma, sans-serif"><B>Note:</B><BR>Temporary
+ <FONT FACE="Tahoma, sans-serif"><B>Note</B><BR>Temporary
environment variables created with the &quot;<FONT FACE="Courier New, monospace">set</FONT>&quot;
command are only valid if the batch job is started by calling the
executable directly! Using &quot;<FONT FACE="Courier New, monospace">start
diff --git a/BUILD/Help/html/RealtimeSync.html b/BUILD/Help/html/RealtimeSync.html
index 7fd3b6c9..0a302a0a 100644
--- a/BUILD/Help/html/RealtimeSync.html
+++ b/BUILD/Help/html/RealtimeSync.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="20120324;18334600">
+ <META NAME="CHANGED" CONTENT="20120511;21275200">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -38,36 +38,37 @@ this command line will simply trigger a FreeFileSync batch job.</FONT></P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT>
<FONT FACE="Tahoma, sans-serif">Real time synchronization - in
combination with FreeFileSync</FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">First
-start up RealtimeSync.exe located in FreeFileSync's installation
-directory. Then specify all directories that shall be monitored.
-Instead of doing this manually you can import a </FONT><FONT FACE="Courier New, monospace">*.ffs_batch</FONT>
+<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Start
+RealtimeSync.exe located in FreeFileSync's installation directory.
+Then specify all folders that shall be monitored. Instead of doing
+this manually you can import a </FONT><FONT FACE="Courier New, monospace">*.ffs_batch</FONT>
<FONT FACE="Tahoma, sans-serif">file via </FONT><FONT FACE="Tahoma, sans-serif"><I>Menu
--&gt; File -&gt; Load configuration</I></FONT><FONT FACE="Tahoma, sans-serif">.
+-&gt; Program -&gt; Open</I></FONT><FONT FACE="Tahoma, sans-serif">.
This not only extracts all directories relevant for synchronization
but also sets up the command line to execute the </FONT><FONT FACE="Courier New, monospace">*.ffs_batch</FONT>
<FONT FACE="Tahoma, sans-serif">file each time changes are detected.
Now press &quot;</FONT><FONT FACE="Tahoma, sans-serif"><I>Start</I></FONT><FONT FACE="Tahoma, sans-serif">&quot;
to begin monitoring.</FONT></P>
<UL>
- <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/RealtimeSync.png" NAME="Grafik3" ALIGN=MIDDLE WIDTH=420 HEIGHT=480 BORDER=0></P>
+ <P STYLE="margin-bottom: 0cm"><IMG SRC="../img/RealtimeSync.png" NAME="Grafik3" ALIGN=MIDDLE WIDTH=461 HEIGHT=446 BORDER=0></P>
</UL>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<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">
<UL>
- <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P>
+ <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT></P>
<LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The
- command-line should <B>not</B> <B>block</B> the progress. If a
- FreeFileSync batch file is called make sure it is running
- &quot;minimized&quot; and &quot;error handling&rdquo; is set to
- &quot;ignore errors&quot; or &quot;exit instantly<SPAN STYLE="text-decoration: none">&quot;.<BR>&nbsp;</SPAN></FONT></P>
+ command should </FONT><FONT FACE="Tahoma, sans-serif"><B>not</B></FONT><FONT FACE="Tahoma, sans-serif">
+ </FONT><FONT FACE="Tahoma, sans-serif"><B>block</B></FONT><FONT FACE="Tahoma, sans-serif">
+ progress. Make sure the FreeFileSync batch job does not show any
+ popup dialogs. See notes in <A HREF="Batch%20Scripting.html">Batch
+ Scripting</A>.</FONT><SPAN STYLE="text-decoration: none"><FONT FACE="Tahoma, sans-serif"><BR>&nbsp;</FONT></SPAN></P>
<LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The
settings dialog can be skipped by passing a RealtimeSync
configuration file (<FONT FACE="Courier New, monospace">*.ffs_real</FONT>)
<B>or</B> a FreeFileSync batch file (<FONT FACE="Courier New, monospace">*.ffs_batch</FONT>)
- as first command-line argument to RealtimeSync.exe. This allows for
- integration with the operating system's auto start
+ as first command-line argument to RealtimeSync.exe. This can be
+ integrated into the operating system's auto start
facility:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Courier New, monospace">&quot;C:\Program
Files\FreeFileSync\RealtimeSync.exe&quot;
&quot;C:\MyConfig.ffs_real&quot;<BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Courier New, monospace">&quot;C:\Program
@@ -75,10 +76,7 @@ to begin monitoring.</FONT></P>
<LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Using
RealtimeSync is not restricted to starting FreeFileSync. It can
also be used in other scenarios, like sending an email whenever a
- certain directory is modified.<BR>&nbsp;</FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If
- you schedule a Windows batch file (.bat, .cmd), see notes in <A HREF="Batch%20Scripting.html">Batch
- Scripting</A>.</FONT></P>
+ certain directory is modified.</FONT></P>
</UL>
</SPAN><BR CLEAR=LEFT><BR>
</P>
@@ -87,12 +85,12 @@ to begin monitoring.</FONT></P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Example:</B></FONT>
<FONT FACE="Tahoma, sans-serif">Automatic synchronization when USB
stick is inserted</FONT></P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Save
-the relevant configuration on the USB stick's root directory to have
+<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Save a
+ffs_batch configuration into the USB stick's root directory and have
it called when the stick is mounted. Then configure RealtimeSync as
shown in the following:</FONT></P>
<UL>
- <P><IMG SRC="../img/WatchUsbInsert.png" NAME="Grafik2" ALIGN=BOTTOM WIDTH=436 HEIGHT=447 BORDER=0></P>
+ <P><IMG SRC="../img/WatchUsbInsert.png" NAME="Grafik2" ALIGN=BOTTOM WIDTH=442 HEIGHT=440 BORDER=0></P>
</UL>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
@@ -107,7 +105,7 @@ files are modified in &quot;</FONT><FONT FACE="Courier New, monospace">H:\Data</
</P>
<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen2" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
<UL>
- <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note:<BR></B></FONT><FONT FACE="Tahoma, sans-serif">The
+ <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note<BR></B></FONT><FONT FACE="Tahoma, sans-serif">The
n</FONT><SPAN STYLE="text-decoration: none"><FONT FACE="Tahoma, sans-serif">ame
of the last changed file is written to an environment variable
named </FONT></SPAN><SPAN STYLE="text-decoration: none"><FONT FACE="Courier New, monospace">&quot;changed_file&quot;.</FONT></SPAN></P>
@@ -132,6 +130,21 @@ directories. (Windows)</FONT></P>
</UL>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
+<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
+ <UL>
+ <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note<BR></B></FONT><FONT FACE="Tahoma, sans-serif">During
+ execution of a Windows Batch file (*.bat/*.cmd) a black console
+ window is shown. You can hide it using the Visual Basic script
+ &quot;HideConsole.vbs&quot; located in FreeFileSync's installation
+ directory:</FONT></P>
+ <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Courier New, monospace"><B>wscript
+ &quot;C:\Program files\FreeFileSync\HideConsole.vbs&quot;
+ C:\MyBatchFile.cmd</B></FONT></P>
+ </UL>
+</SPAN><BR CLEAR=LEFT><BR>
+</P>
+<P STYLE="margin-bottom: 0cm"><BR>
+</P>
<P STYLE="margin-bottom: 0cm; text-decoration: none"><FONT FACE="Tahoma, sans-serif">Limitations:</FONT></P>
<UL>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If
diff --git a/BUILD/Help/html/RunAsService.html b/BUILD/Help/html/Run as Service.html
index dcd0b029..b1bc5171 100644
--- a/BUILD/Help/html/RunAsService.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="20120217;11243000">
+ <META NAME="CHANGED" CONTENT="20120511;23105500">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -14,17 +14,15 @@
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Run as Service
-<SPAN STYLE="font-weight: normal">(Windows only)</SPAN></FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Run
+as Service <SPAN STYLE="font-weight: normal">(Windows only)</SPAN></FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">The
@@ -37,11 +35,15 @@ into Windows' Autostart folder, 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:
+<A HREF="http://support.microsoft.com/kb/137890">http://support.microsoft.com/kb/137890</A></FONT></P>
+<P STYLE="margin-bottom: 0cm"><BR>
+</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">1. Get
access to the command-line tools &quot;</FONT><FONT FACE="Courier New, monospace">instsrv.exe</FONT><FONT FACE="Tahoma, sans-serif">&quot;
and &quot;</FONT><FONT FACE="Courier New, monospace">srvany.exe</FONT><FONT FACE="Tahoma, sans-serif">&quot;
which come with the Windows Server 2003 Resource Kit Tools:</FONT></P>
-<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Download:
+<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Download:
<A HREF="http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;displaylang=en">http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&amp;displaylang=en</A></FONT></P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
@@ -76,9 +78,9 @@ service is now ready for operation!</FONT></P>
</P>
<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">
- <FONT FACE="Tahoma, sans-serif"><B>Attention:</B><BR>When running
+ <FONT FACE="Tahoma, sans-serif"><B>Attention</B><BR>When running
RealtimeSync as a service the application has no means to interact
- with the user. Therefore any popup dialog will halt the process!
+ with the user. Therefore any popup dialog will block progress!
Consider the following options when setting up a FreeFileSync batch
job:</FONT></P>
<UL>
@@ -86,18 +88,16 @@ service is now ready for operation!</FONT></P>
checkbox &quot;<I>Show progress dialog</I>&quot; or automatically
close it after synchronization.</FONT></P>
<LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Set
- &quot;<I>Error handling</I>&quot; to either &quot;<I>Exit
- instantly</I>&quot; or &quot;<I>Ignore errors</I>&quot;.</FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">At
- least for debugging purposes or initial setup &quot;Allow service
- to interact with desktop&quot;. The may show error dialogs
- otherwise hidden by the SYSTEM account.</FONT></P>
+ &quot;<I>Error handling</I>&quot; to &quot;<I>Exit instantly</I>&quot;
+ or &quot;<I>Ignore errors</I>&quot;.</FONT></P>
+ <LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">To
+ ease debugging or initial setup &quot;Allow service to interact
+ with desktop&quot;. The may show error dialogs otherwise hidden by
+ the SYSTEM account.</FONT></P>
</UL>
</SPAN><BR CLEAR=LEFT><BR><IMG SRC="../img/RunAsService_html_13819326743214.png" NAME="Grafik2" ALIGN=TEXTTOP WIDTH=535 HEIGHT=589 BORDER=0></P>
<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><BR>
</P>
-<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR>
-</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">You can
start the service now via command line or Windows Service
administration:</FONT></P>
@@ -109,11 +109,9 @@ administration:</FONT></P>
</UL>
<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR>
</P>
-<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR>
-</P>
<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen7" 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">
- <FONT FACE="Tahoma, sans-serif"><B>Note:</B><BR>By default the
+ <FONT FACE="Tahoma, sans-serif"><B>Note</B><BR>By default the
service is created with start-up type &quot;automatic&quot; which
runs it on Windows start. This behavior can be changed in Windows
Service administration.</FONT></P>
@@ -134,7 +132,5 @@ Service shall be removed from the system, enter via command line:</FONT></P>
</UL>
<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR>
</P>
-<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">(Reference:
-<A HREF="http://support.microsoft.com/kb/137890">http://support.microsoft.com/kb/137890</A>)</FONT></P>
</BODY>
</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/ScheduleBatch.html b/BUILD/Help/html/Schedule a Batch Job.html
index 9a40cce5..19b1eca2 100644
--- a/BUILD/Help/html/ScheduleBatch.html
+++ b/BUILD/Help/html/Schedule a Batch Job.html
@@ -5,40 +5,37 @@
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)">
<META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20120221;18051600">
+ <META NAME="CHANGED" CONTENT="20120512;16135500">
<STYLE TYPE="text/css">
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="de-DE" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Schedule a Batch
-Job</FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Schedule
+a Batch Job</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<OL>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create
a new batch job via FreeFileSync's main
dialog:<BR></FONT><FONT FACE="Tahoma, sans-serif"><I>Menu-&gt;Advanced-&gt;Create
- batch job</I></FONT> <FONT FACE="Tahoma, sans-serif">and save it,
- for example, as &quot;</FONT><FONT FACE="Courier New, monospace">C:\SyncJob.ffs_batch</FONT><FONT FACE="Tahoma, sans-serif">&quot;.<BR>&nbsp;</FONT></P>
+ batch job</I></FONT><FONT FACE="Tahoma, sans-serif"><BR>&nbsp;</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">If
- the batch job shall run without user interaction or as part of a
- batch script, make sure that no popup dialog stops the progress:
- Disable checkbox &quot;<I>Show progress dialog</I>&quot; to avoid
- blocking while showing the result after synchronization.
+ the batch job shall run without user interaction or as part of an
+ unattended batch script, make sure that no popup dialog stops the
+ progress:<BR>Disable checkbox &quot;<I>Show progress dialog</I>&quot;
+ to avoid blocking while showing the result after synchronization.
Alternatively you can select the &quot;On completion&quot; action
&quot;Close progress dialog&quot; located in synchronization
- settings. Note that even if the progress is not shown initially it
- can be displayed interactively at any time during synchronization,
- by double-clicking the corresponding systray icon.<BR><IMG SRC="../img/SetupBatch.png" NAME="Grafik3" ALIGN=BOTTOM BORDER=0></FONT></P>
+ 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>
<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
@@ -70,9 +67,19 @@ Job</FONT></H3>
<UL>
<LI><P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT FACE="Tahoma, sans-serif"><FONT COLOR="#000000"><FONT SIZE=3>Use
quotes if any paths contain spaces, e.g.: </FONT></FONT><FONT COLOR="#000000"><FONT FACE="Courier New, monospace"><FONT SIZE=3>&quot;C:\some
- folder\SyncJob.ffs_batch&quot;</FONT></FONT></FONT><FONT COLOR="#000000"><FONT SIZE=3><BR></FONT></FONT><IMG SRC="../img/win7scheduler.png" NAME="Grafik1" ALIGN=BOTTOM WIDTH=708 HEIGHT=321 BORDER=0><BR>&nbsp;</FONT></P>
+ folder\SyncJob.ffs_batch&quot;</FONT></FONT></FONT><FONT COLOR="#000000"><FONT SIZE=3><BR></FONT></FONT><IMG SRC="../img/win7scheduler.png" NAME="Grafik1" ALIGN=BOTTOM WIDTH=708 HEIGHT=321 BORDER=0></FONT></P>
</UL>
</OL>
+ <P STYLE="margin-bottom: 0cm"><SPAN ID="Rahmen2" 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">
+ <FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT><FONT FACE="Tahoma, sans-serif"><BR>Beginning
+ with Windows Vista the &quot;Program/script&quot; always needs to
+ be a path to &quot;FreeFileSync.exe&quot; even if ffs_batch file
+ associations are set!</FONT> <FONT FACE="Tahoma, sans-serif">Else
+ the task will return with error code 0xC1, &quot;%1 is not a valid
+ Win32 application&quot; if a ffs_batch file is entered directly.</FONT></P>
+ </SPAN><BR CLEAR=LEFT>&nbsp;
+ </P>
</OL>
<OL>
<OL TYPE=A START=2>
@@ -84,10 +91,10 @@ Job</FONT></H3>
select &quot;<I>Add Scheduled Task</I>&quot;.</FONT></P>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Follow
the wizard and select FreeFileSync.exe as program to run.</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT FACE="Tahoma, sans-serif">Make
- sure &quot;Run:&quot; is specified as: <FONT FACE="Courier New, monospace">&lt;FreeFileSync
- installation directory&gt;\FreeFileSync.exe &lt;ffs_batch
- file&gt;</FONT><BR><IMG SRC="../img/ScheduleBatch_html_m10bf0d36.gif" NAME="Grafik2" ALIGN=BOTTOM WIDTH=406 HEIGHT=455 BORDER=0><BR>&nbsp;</FONT></P>
+ <LI><P STYLE="margin-bottom: 0cm; font-weight: normal"><FONT FACE="Tahoma, sans-serif">Enter
+ &quot;Run:&quot; as: <FONT FACE="Courier New, monospace">&lt;FreeFileSync
+ installation directory&gt;\FreeFileSync.exe &lt;job
+ name&gt;.ffs_batch</FONT><BR><IMG SRC="../img/ScheduleBatch_html_m10bf0d36.gif" NAME="Grafik2" ALIGN=BOTTOM WIDTH=406 HEIGHT=455 BORDER=0><BR>&nbsp;</FONT></P>
</UL>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Ubuntu
Linux Gnome-schedule:</B></FONT></P>
@@ -112,20 +119,11 @@ Job</FONT></H3>
<UL>
<LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><SPAN STYLE="font-style: normal"><SPAN STYLE="font-weight: normal">Specify
the command as:</SPAN></SPAN></FONT> <FONT FACE="Courier New, monospace"><I><SPAN STYLE="font-weight: normal">&lt;FreeFileSync
- installation directory&gt;/FreeFileSync &lt;ffs_batch file&gt;<BR></SPAN></I></FONT><IMG SRC="../img/ubuntuScheduler.png" NAME="Grafik5" ALIGN=BOTTOM WIDTH=629 HEIGHT=560 BORDER=0></P>
+ installation directory&gt;/FreeFileSync &lt;job name&gt;.ffs_batch<BR></SPAN></I></FONT><IMG SRC="../img/ubuntuScheduler.png" NAME="Grafik5" ALIGN=BOTTOM WIDTH=629 HEIGHT=560 BORDER=0></P>
</UL>
</OL>
</OL>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
-<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">
- <FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT><FONT FACE="Tahoma, sans-serif"><BR>Beginning
- with Windows Vista, the command always needs to start with the path
- to &quot;FreeFileSync.exe&quot; even if file associations are set!</FONT>
- <FONT FACE="Tahoma, sans-serif">Else the task will return with error
- code 0xC1, &quot;%1 is not a valid Win32 application&quot;.</FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
</BODY>
</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/SendMail.html b/BUILD/Help/html/SendMail.html
deleted file mode 100644
index 87e96ad4..00000000
--- a/BUILD/Help/html/SendMail.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<HTML>
-<HEAD>
- <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
- <TITLE></TITLE>
- <META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)">
- <META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20110901;20164500">
- <META NAME="Info 1" CONTENT="">
- <META NAME="Info 2" CONTENT="">
- <META NAME="Info 3" CONTENT="">
- <META NAME="Info 4" CONTENT="">
- <STYLE TYPE="text/css">
- <!--
- @page { margin: 2cm }
- P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
- A:link { so-language: zxx }
- -->
- </STYLE>
-</HEAD>
-<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Send error
-notification via email</FONT></H3>
-<P STYLE="margin-bottom: 0cm"><BR>
-</P>
-<OL>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create
- a FreeFileSync batch file using &quot;<I>Run minimized</I>&quot;.<BR>&nbsp;</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Set
- error handling to &quot;<I>Exit instantly</I>&quot; or &quot;<I>Ignore
- errors</I>&quot; to avoid having a pop-up stop the program flow. In
- case errors occur FreeFileSync will exit with a return code &lt; 0
- that can be checked via the ERRORLEVEL batch command.<BR>&nbsp;</FONT></P>
- <LI><P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Create
- a *.cmd or *.bat file to specify the location of FreeFileSync.exe
- and pass the name of the ffs_batch file as first argument; e.g.:</FONT></P>
-</OL>
-<P STYLE="margin-left: 1.32cm; margin-bottom: 0cm"><SPAN ID="Rahmen5" 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="Tahoma, sans-serif"><FONT FACE="Courier New, monospace">&quot;C:\Program
- Files\FreeFileSync\FreeFileSync.exe&quot; &quot;C:\SyncJob.ffs_batch&quot;<BR>@if
- not errorlevel 0 (<BR>&nbsp;&nbsp;&nbsp;&nbsp;echo An error
- occured!<BR>&nbsp;&nbsp;&nbsp;&nbsp;pause<BR>)</FONT></FONT></P>
-</SPAN><BR CLEAR=LEFT><BR>
-</P>
-<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Instead
-of displaying &quot;An error occurred!&quot; you can specify another
-command like sending an email notification (using a third party
-tool).</FONT>
-</P>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/BUILD/Help/html/Ftp.html b/BUILD/Help/html/Synchronize with FTP.html
index c11dcd24..2f452c6e 100644
--- a/BUILD/Help/html/Ftp.html
+++ b/BUILD/Help/html/Synchronize with FTP.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="20110901;20315700">
+ <META NAME="CHANGED" CONTENT="20120511;23103900">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -18,13 +18,15 @@
H3.western { font-family: "Arial", sans-serif }
H3.cjk { font-family: "MS Mincho" }
H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Synchronize with
-FTP/WebDAV <SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Synchronize
+with FTP/WebDAV <SPAN STYLE="font-weight: normal">(Windows)</SPAN></FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync
@@ -45,8 +47,8 @@ drive letter:</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">
- <FONT FACE="Tahoma, sans-serif"><B>Note:</B><BR>Most FTP drives set
- a file's time stamp to the current time when synchronizing ignoring
+ <FONT FACE="Tahoma, sans-serif"><B>Note</B><BR>Most FTP drives set a
+ file's time stamp to the current time when synchronizing ignoring
the source file's time and date. As a workaround you can do a
&quot;<I>compare by filesize</I>&quot;; see corresponding section.</FONT></P>
</SPAN><BR CLEAR=LEFT><BR>
diff --git a/BUILD/Help/html/VariableDrive.html b/BUILD/Help/html/Variable Drive Letters.html
index 87283a12..2effaadd 100644
--- a/BUILD/Help/html/VariableDrive.html
+++ b/BUILD/Help/html/Variable Drive Letters.html
@@ -5,22 +5,20 @@
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.2 (Win32)">
<META NAME="CREATED" CONTENT="20091206;16574000">
- <META NAME="CHANGED" CONTENT="20120206;18412300">
+ <META NAME="CHANGED" CONTENT="20120511;23102900">
<STYLE TYPE="text/css">
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="de-DE" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Variable drive
-letters</FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Variable
+drive letters</FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">USB
@@ -37,12 +35,13 @@ name]\path</FONT></FONT></P>
<FONT FACE="Tahoma, sans-serif">Use &quot;<FONT FACE="Courier New, monospace">[ZENJU-USB]\folder</FONT>&quot;
instead of &quot;<FONT FACE="Courier New, monospace">G:\folder</FONT>&quot;
where &quot;<FONT FACE="Courier New, monospace">ZENJU-USB</FONT>&quot;
- is the name of the USB stick that is currently mounted in volume G:\.</FONT></P>
+ is the name of the USB stick that is currently mounted in volume
+ G:\.</FONT></P>
</SPAN><BR CLEAR=LEFT><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">It is
not required to look up and enter the volume name manually! Just
-select the corresponding entry in the drop down menu.<BR></FONT><IMG SRC="../img/VolumeName.png" NAME="Grafik1" ALIGN=BOTTOM></P>
+select the corresponding entry in the drop down menu.<BR></FONT><IMG SRC="../img/VolumeName.png" NAME="Grafik1" ALIGN=BOTTOM WIDTH=424 HEIGHT=86 BORDER=0></P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Option
diff --git a/BUILD/Help/html/ShadowCopy.html b/BUILD/Help/html/Volume Shadow Copy.html
index ce66ccee..fa10a9e0 100644
--- a/BUILD/Help/html/ShadowCopy.html
+++ b/BUILD/Help/html/Volume Shadow Copy.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="20110901;20302700">
+ <META NAME="CHANGED" CONTENT="20120511;23094200">
<META NAME="Info 1" CONTENT="">
<META NAME="Info 2" CONTENT="">
<META NAME="Info 3" CONTENT="">
@@ -14,17 +14,15 @@
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
- H3 { margin-bottom: 0.21cm }
- H3.western { font-family: "Arial", sans-serif }
- H3.cjk { font-family: "MS Mincho" }
- H3.ctl { font-family: "Mangal" }
+ H2.cjk { font-family: "SimSun" }
+ H2.ctl { font-family: "Mangal" }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="en-US" DIR="LTR">
-<H3 CLASS="western"><FONT FACE="Tahoma, sans-serif">Volume Shadow
-Copy Service <SPAN STYLE="font-weight: normal">(Windows only)</SPAN></FONT></H3>
+<H2 CLASS="western"><FONT FACE="Tahoma, sans-serif"><FONT SIZE=4 STYLE="font-size: 15pt">Volume
+Shadow Copy Service <SPAN STYLE="font-weight: normal">(Windows only)</SPAN></FONT></FONT></H2>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">FreeFileSync
@@ -33,13 +31,13 @@ Copy of the source drive. To enable this feature go to </FONT><FONT FACE="Tahoma
-&gt; Advanced -&gt; Global settings: Copy locked files</I></FONT><FONT FACE="Tahoma, sans-serif">.</FONT></P>
<P STYLE="margin-left: 1.46cm; margin-bottom: 0cm"><SPAN ID="Rahmen3" DIR="LTR" STYLE="float: left; width: 80%; height: 0.14cm; border: 1px solid #000080; padding: 0.05cm; background: #ccccff">
<UL>
- <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note:</B></FONT></P>
+ <P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif"><B>Note</B></FONT></P>
<LI><P ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">This
functionality is applied to locked files only. Regular files will
not use Volume Shadow Copy Service when being synchronized.</FONT></P>
- <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><SPAN STYLE="font-style: normal"><FONT FACE="Tahoma, sans-serif">Creating
- Volume Snapshots using VSS requires the application to be started
- with administrator rights.</FONT></SPAN></P>
+ <LI><P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm; font-style: normal">
+ <FONT FACE="Tahoma, sans-serif">Creating Volume Snapshots using VSS
+ requires the application to be started with administrator rights.</FONT></P>
</UL>
</SPAN><BR CLEAR=LEFT><BR>
</P>
@@ -58,9 +56,7 @@ the follow content or enter directly via command line:</FONT></P>
msxml3.dll<BR>regsvr32 msxml4.dll</FONT></P>
</SPAN><BR CLEAR=LEFT><BR>
</P>
-<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><BR>
-</P>
-<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">(Reference:
-<A HREF="http://support.microsoft.com/kb/940032">http://support.microsoft.com/kb/940032</A>)</FONT></P>
+<P ALIGN=LEFT STYLE="margin-right: 0.98cm; margin-bottom: 0cm"><FONT FACE="Tahoma, sans-serif">Reference:
+<A HREF="http://support.microsoft.com/kb/940032">http://support.microsoft.com/kb/940032</A></FONT></P>
</BODY>
</HTML> \ No newline at end of file
diff --git a/BUILD/Help/img/MainDialog.png b/BUILD/Help/img/MainDialog.png
index 6d7271a1..984e1305 100644
--- a/BUILD/Help/img/MainDialog.png
+++ b/BUILD/Help/img/MainDialog.png
Binary files differ
diff --git a/BUILD/Help/img/RealtimeSync.png b/BUILD/Help/img/RealtimeSync.png
index 20d582c6..56e55aea 100644
--- a/BUILD/Help/img/RealtimeSync.png
+++ b/BUILD/Help/img/RealtimeSync.png
Binary files differ
diff --git a/BUILD/Help/img/SetupBatch.png b/BUILD/Help/img/SetupBatch.png
index d3dc81a0..469d632b 100644
--- a/BUILD/Help/img/SetupBatch.png
+++ b/BUILD/Help/img/SetupBatch.png
Binary files differ
diff --git a/BUILD/Help/img/SourceTarget.png b/BUILD/Help/img/SourceTarget.png
index 2a3a834e..df8921d6 100644
--- a/BUILD/Help/img/SourceTarget.png
+++ b/BUILD/Help/img/SourceTarget.png
Binary files differ
diff --git a/BUILD/Help/img/WatchUsbInsert.png b/BUILD/Help/img/WatchUsbInsert.png
index 9d106fb8..a4d17a4d 100644
--- a/BUILD/Help/img/WatchUsbInsert.png
+++ b/BUILD/Help/img/WatchUsbInsert.png
Binary files differ
diff --git a/BUILD/RunSilent.vbs b/BUILD/HideConsole.vbs
index a6fe4f6b..6a178410 100644
--- a/BUILD/RunSilent.vbs
+++ b/BUILD/HideConsole.vbs
@@ -3,7 +3,7 @@ num = argIn.Count
if num = 0 then
WScript.Echo "Call a Windows batch file (*.cmd, *.bat) without showing the console window" & VbCrLf & VbCrLf &_
- "Command line:" & VbCrLf & "WScript RunSilent.vbs MyBatchfile.cmd <command line arguments>"
+ "Command line:" & VbCrLf & "WScript HideConsole.vbs MyBatchfile.cmd <command line arguments>"
WScript.Quit 1
end if
diff --git a/BUILD/Languages/chinese_simple.lng b/BUILD/Languages/chinese_simple.lng
index e40d8afc..acd8a931 100644
--- a/BUILD/Languages/chinese_simple.lng
+++ b/BUILD/Languages/chinese_simple.lng
@@ -7,8 +7,8 @@
<plural definition>0</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>正在æœç´¢ç›®å½• %x...</target>
+<source>Searching for folder %x...</source>
+<target>正在æœç´¢æ–‡ä»¶å¤¹ %x...</target>
<source>Show in Explorer</source>
<target>在Explorer中显示</target>
@@ -20,23 +20,26 @@
<target>æµè§ˆç›®å½•</target>
<source>Abort requested: Waiting for current operation to finish...</source>
-<target>å–消请求: 正在等待当å‰æ“作完æˆ...</target>
+<target>请求中止: 正在等待当å‰æ“作完æˆ...</target>
<source>RealtimeSync - Automated Synchronization</source>
<target>实时åŒæ­¥ - 自动åŒæ­¥</target>
+<source>Error</source>
+<target>错误</target>
+
<source>Select alternate comparison settings</source>
<target>选择替æ¢çš„比较设置</target>
<source>Select alternate synchronization settings</source>
<target>选择替æ¢åŒæ­¥è®¾ç½®</target>
+<source>Filter is active</source>
+<target>过滤器已生效</target>
+
<source>No filter selected</source>
<target>没有选定过滤器</target>
-<source>Filter is active</source>
-<target>过滤器已激活</target>
-
<source>Remove alternate settings</source>
<target>移除替æ¢è®¾ç½®</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>关于</target>
-<source>Error</source>
-<target>错误</target>
-
<source>Warning</source>
<target>警告</target>
@@ -68,13 +68,13 @@
<target>确认</target>
<source>Configure filter</source>
-<target>é…置过滤</target>
+<target>é…置过滤器</target>
<source>Global settings</source>
<target>全局设置</target>
-<source>Synchronization Preview</source>
-<target>åŒæ­¥é¢„览</target>
+<source>Summary</source>
+<target>总结</target>
<source>Find</source>
<target>查找</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>æµè§ˆ</target>
-<source>Invalid command line: %x</source>
-<target>无效的命令行: %x</target>
+<source>Invalid command line:</source>
+<target>无效的命令行:</target>
<source>Info</source>
<target>ä¿¡æ¯</target>
@@ -119,7 +119,7 @@
<target>Linuxé”™è¯¯ä»£ç  %x:</target>
<source>Cannot resolve symbolic link %x.</source>
-<target>无法解决 %x 的符å·è¿žæŽ¥.</target>
+<target>无法解决符å·è¿žæŽ¥ %x.</target>
<source>%x MB</source>
<target>%x MB</target>
@@ -223,29 +223,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>å·å %x 并éžæ–‡ä»¶å %y 的一部分!</target>
-<source>Cannot find file %x.</source>
-<target>无法找到文件 %x .</target>
-
<source>Cannot read the following XML elements:</source>
<target>无法读å–如下XML元素:</target>
-<source>S&ave configuration...</source>
-<target>ä¿å­˜é…ç½®(&A)...</target>
+<source>Cannot find file %x.</source>
+<target>无法找到文件 %x .</target>
+
+<source>&Open...</source>
+<target>打开(&O)...</target>
-<source>&Load configuration...</source>
-<target>加载é…ç½®(&L)...</target>
+<source>&Save...</source>
+<target>ä¿å­˜(&S)...</target>
<source>&Quit</source>
<target>退出(&Q)</target>
-<source>&File</source>
-<target>文件(&F)</target>
+<source>&Program</source>
+<target>程åº(&P)</target>
<source>&Content</source>
<target>内容(&C)</target>
-<source>&About...</source>
-<target>关于(&A)...</target>
+<source>&About</source>
+<target>关于(&A)</target>
<source>&Help</source>
<target>帮助(&H)</target>
@@ -253,8 +253,8 @@
<source>Usage:</source>
<target>用法:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. 选择è¦ç›‘视的目录.</target>
+<source>1. Select folders to watch.</source>
+<target>1. 选择è¦ç›‘视的文件夹.</target>
<source>2. Enter a command line.</source>
<target>2. 输入一个命令行.</target>
@@ -262,41 +262,50 @@
<source>3. Press 'Start'.</source>
<target>3. 点击'开始'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-æ¯æ¬¡æœ‰å¦‚下情况时执行这个命令行:
-- 所有目录转为å¯ç”¨çŠ¶æ€(例如æ’å…¥U盘)
-- 目录或å­ç›®å½•é‡Œçš„文件被修改
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>è¦å¼€å§‹åªéœ€å¯¼å…¥ä¸€ä¸ª .ffs_batch文件.</target>
-<source>Directories to watch</source>
-<target>è¦ç›‘视的目录</target>
+<source>Folders to watch</source>
+<target>è¦ç›‘视的文件夹</target>
<source>Add folder</source>
<target>添加文件夹</target>
<source>Remove folder</source>
-<target>删除文件夹</target>
+<target>移除文件夹</target>
<source>Select a folder</source>
<target>选择一个文件夹</target>
+<source>Delay [seconds]</source>
+<target>延时 [秒]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>最åŽæ£€æµ‹åˆ°æ”¹å˜å’Œå‘½ä»¤æ‰§è¡Œä¹‹é—´çš„空闲时间</target>
+
<source>Command line</source>
<target>命令行</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>最å°ç©ºé—²æ—¶é—´[秒]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>以秒计的最åŽå˜æ›´å’Œæ‰§è¡Œå‘½ä»¤è¡Œä¹‹é—´çš„空闲时间</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+命令将被触å‘如果:
+- 文件或å­æ–‡ä»¶å¤¹æ”¹å˜
+- 新文件夹到达(例如U盘æ’å…¥)
+</target>
<source>Start</source>
<target>开始</target>
+<source>&Retry</source>
+<target>é‡è¯•(&R)</target>
+
+<source>Cancel</source>
+<target>å–消</target>
+
<source>(Build: %x)</source>
<target>(Build: %x)</target>
@@ -315,14 +324,14 @@ The command line is executed each time:
<source>Waiting for missing directories...</source>
<target>正在等待丢失的目录...</target>
-<source>A directory input field is empty.</source>
-<target>有一个目录输入字段是空的.</target>
+<source>An input folder name is empty.</source>
+<target>有一个输入的文件夹å为空.</target>
<source>Logging</source>
<target>记录</target>
<source>File time and size</source>
-<target>文件时间和日期</target>
+<target>文件时间和大å°</target>
<source>File content</source>
<target>文件内容</target>
@@ -361,7 +370,7 @@ The command line is executed each time:
<target>åœæ­¢</target>
<source>Synchronization aborted!</source>
-<target>åŒæ­¥å·²æ”¾å¼ƒ!</target>
+<target>åŒæ­¥å·²è¢«ä¸­æ­¢!</target>
<source>Synchronization completed with errors!</source>
<target>åŒæ­¥å·²å®Œæˆä½†æœ‰é”™è¯¯.</target>
@@ -387,12 +396,12 @@ The command line is executed each time:
<source>Download now?</source>
<target>ç«‹å³ä¸‹è½½?</target>
-<source>Information</source>
-<target>ä¿¡æ¯</target>
-
<source>FreeFileSync is up to date!</source>
<target>FreeFileSync 已是最新!</target>
+<source>Information</source>
+<target>ä¿¡æ¯</target>
+
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
<target>è¦è®© FreeFileSync ä¿æŒæ¯å‘¨æ£€æŸ¥ä¸€æ¬¡æ›´æ–°å—?</target>
@@ -402,8 +411,8 @@ The command line is executed each time:
<source><Symlink></source>
<target><符å·è¿žæŽ¥></target>
-<source><Directory></source>
-<target><目录></target>
+<source><Folder></source>
+<target><文件夹></target>
<source>Full path</source>
<target>完整路径</target>
@@ -414,8 +423,8 @@ The command line is executed each time:
<source>Relative path</source>
<target>相对路径</target>
-<source>Directory</source>
-<target>目录</target>
+<source>Base folder</source>
+<target>主文件夹</target>
<source>Size</source>
<target>大å°</target>
@@ -426,8 +435,11 @@ The command line is executed each time:
<source>Extension</source>
<target>扩展å</target>
-<source>Comparison Result</source>
-<target>比较结果</target>
+<source>Action</source>
+<target>动作</target>
+
+<source>Category</source>
+<target>分类</target>
<source>Drag && drop</source>
<target>拖放</target>
@@ -435,14 +447,14 @@ The command line is executed each time:
<source>Close progress dialog</source>
<target>关闭进度对è¯æ¡†</target>
-<source>Shut down</source>
-<target>关机</target>
+<source>Standby</source>
+<target>待机</target>
<source>Log off</source>
<target>注销</target>
-<source>Standby</source>
-<target>待机</target>
+<source>Shut down</source>
+<target>关机</target>
<source>Hibernate</source>
<target>休眠</target>
@@ -450,15 +462,12 @@ The command line is executed each time:
<source>1. &Compare</source>
<target>1. 比较(&C)</target>
-<source>2. &Synchronize...</source>
-<target>2. åŒæ­¥(&S)...</target>
+<source>2. &Synchronize</source>
+<target>2. åŒæ­¥(&S)</target>
<source>&New</source>
<target>新建(&N)</target>
-<source>&Program</source>
-<target>程åº(&P)</target>
-
<source>&Language</source>
<target>切æ¢è¯­è¨€(&L)</target>
@@ -486,8 +495,8 @@ The command line is executed each time:
<source>&Abort</source>
<target>å–消(&A)</target>
-<source>Synchronize...</source>
-<target>åŒæ­¥...</target>
+<source>Synchronize</source>
+<target>åŒæ­¥</target>
<source>Start synchronization</source>
<target>开始åŒæ­¥</target>
@@ -496,17 +505,17 @@ The command line is executed each time:
<target>添加æˆå¯¹æ–‡ä»¶å¤¹</target>
<source>Remove folder pair</source>
-<target>删除文件夹对</target>
+<target>移除文件夹对</target>
<source>Swap sides</source>
<target>两侧互æ¢</target>
-<source>Save current configuration to file</source>
-<target>ä¿å­˜å½“å‰é…置到文件</target>
-
<source>Load configuration from file</source>
<target>从文件加载é…ç½®</target>
+<source>Save current configuration to file</source>
+<target>ä¿å­˜å½“å‰é…置到文件</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>最åŽä½¿ç”¨çš„é…ç½®(按DEL键将其从列表中移除)</target>
@@ -516,17 +525,17 @@ The command line is executed each time:
<source>Hide filtered or temporarily excluded files</source>
<target>éšè—已过滤或临时排除的文件</target>
-<source>Number of files and directories that will be created</source>
-<target>一些文件和目录将被创建</target>
+<source>Number of files and folders that will be created</source>
+<target>将被创建的文件和文件夹数</target>
<source>Number of files that will be overwritten</source>
-<target>一些文件和目录将被覆盖</target>
+<target>将被覆盖的文件数</target>
-<source>Number of files and directories that will be deleted</source>
-<target>一些文件和目录将被删除</target>
+<source>Number of files and folders that will be deleted</source>
+<target>将被删除的文件和文件夹数</target>
<source>Total amount of data that will be transferred</source>
-<target>将被转移的总数æ®</target>
+<target>将被传输的数æ®æ€»é‡</target>
<source>Operation:</source>
<target>æ“作:</target>
@@ -546,14 +555,14 @@ The command line is executed each time:
<source>Batch job</source>
<target>批处ç†ä½œä¸š</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>创建批处ç†æ–‡ä»¶å¹¶è‡ªåŠ¨åŒæ­¥. è¦åœ¨æ‰¹å¤„ç†æ¨¡å¼ä¸‹å¼€å§‹, åªéœ€ç®€å•åŒå‡»æ­¤æ–‡ä»¶æˆ–è¿è¡Œå¦‚下命令: FreeFileSync.exe SyncJob.ffs_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>创建一个用于自动åŒæ­¥çš„批处ç†æ–‡ä»¶. åŒå‡»è¿™ä¸ªæ–‡ä»¶æˆ–者在你的系统的任务计划中定时执行: FreeFileSync.exe <作业å>.ffs_batch</target>
<source>Help</source>
<target>帮助</target>
<source>Filter files</source>
-<target>过滤文件</target>
+<target>过滤器文件</target>
<source>Left</source>
<target>左侧</target>
@@ -573,21 +582,12 @@ The command line is executed each time:
<source>Maximum number of log files:</source>
<target>最大的日志文件数:</target>
-<source>Select log file directory:</source>
-<target>选择日志ä¿å­˜ä½ç½®:</target>
+<source>Select folder to save log files:</source>
+<target>选择è¦ä¿å­˜æ—¥å¿—的文件夹:</target>
<source>Batch settings</source>
<target>批处ç†è®¾ç½®</target>
-<source>&Save</source>
-<target>ä¿å­˜(&S)</target>
-
-<source>&Load</source>
-<target>加载(&L)</target>
-
-<source>Cancel</source>
-<target>å–消</target>
-
<source>Select variant:</source>
<target>选择å˜åŒ–çš„:</target>
@@ -612,29 +612,23 @@ The command line is executed each time:
<source>Configuration</source>
<target>é…ç½®</target>
-<source>Category</source>
-<target>分类</target>
-
-<source>Action</source>
-<target>动作</target>
-
-<source>File/folder exists on left side only</source>
-<target>文件/文件夹仅存在于左侧</target>
+<source>Item exists on left side only</source>
+<target>项目仅存在于左侧</target>
-<source>File/folder exists on right side only</source>
-<target>文件/文件夹仅存在于å³ä¾§</target>
+<source>Item exists on right side only</source>
+<target>项目仅存在于å³ä¾§</target>
-<source>Left file is newer</source>
-<target>左侧文件较新</target>
+<source>Left side is newer</source>
+<target>左侧较新</target>
-<source>Right file is newer</source>
-<target>å³ä¾§æ–‡ä»¶è¾ƒæ–°</target>
+<source>Right side is newer</source>
+<target>å³ä¾§è¾ƒæ–°</target>
-<source>Files have different content</source>
-<target>文件内容ä¸åŒ</target>
+<source>Items have different content</source>
+<target>项目有ä¸åŒçš„内容</target>
-<source>Conflict/file cannot be categorized</source>
-<target>冲çª/文件ä¸èƒ½è¢«åˆ†ç±»</target>
+<source>Conflict/item cannot be categorized</source>
+<target>冲çª/项目未能被分类</target>
<source>OK</source>
<target>确定</target>
@@ -663,7 +657,7 @@ is the same
<target>
文件被认为是相åŒçš„,如果
- 文件内容
-相åŒ
+是相åŒçš„
</target>
<source>Symbolic Link handling</source>
@@ -711,9 +705,6 @@ is the same
<source>&Ignore</source>
<target>忽略(&I)</target>
-<source>&Retry</source>
-<target>é‡è¯•(&R)</target>
-
<source>Do not show this dialog again</source>
<target>ä¸è¦å†æ˜¾ç¤ºæ­¤å¯¹è¯æ¡†</target>
@@ -744,33 +735,6 @@ Note: File names must be relative to base directories!
注:文件å必须是主目录的相对路径!
</target>
-<source>Hints:</source>
-<target>æ示:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. 输入相对文件或文件夹å称,用';'或空行分隔.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. 使用通é…符‘*’和‘?’.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. 通过å³é”®èœå•åœ¨ä¸»ç½‘格排除文件.</target>
-
-<source>Example</source>
-<target>例如</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-包括: *.doc;*.zip;*.exe
-排除: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>åŒæ­¥æ‰€æœ‰ .doc, .zipå’Œ .exe 文件, 除了"temp"中的一切.</target>
-
<source>Include</source>
<target>包括</target>
@@ -792,8 +756,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>默认(&D)</target>
-<source>Transactional file copy</source>
-<target>事务文件å¤åˆ¶</target>
+<source>Fail-safe file copy</source>
+<target>无风险的文件å¤åˆ¶</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>首先写入到一个临时文件(*.ffs_tmp)然åŽå†é‡å‘½å. 这样å³ä½¿å‡ºçŽ°è‡´å‘½é”™è¯¯ä¹Ÿèƒ½ä¿æŒä¸€è‡´çš„状æ€.</target>
@@ -807,8 +771,8 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>å¤åˆ¶æ–‡ä»¶å­˜å–æƒé™</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>转移文件和目录的æƒé™(需è¦ç®¡ç†å‘˜æƒé™)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>传输文件和文件夹的æƒé™(需è¦ç®¡ç†å‘˜æƒé™)</target>
<source>Restore hidden dialogs</source>
<target>æ¢å¤è¢«éšè—的对è¯æ¡†</target>
@@ -997,7 +961,7 @@ Exclude: \stuff\temp\*
<target>显示将ä¸è¢«å¤åˆ¶çš„文件</target>
<source>All directories in sync!</source>
-<target>所有目录åŒæ­¥!</target>
+<target>所有目录已åŒæ­¥!</target>
<source>Please run a Compare first before synchronizing!</source>
<target>åŒæ­¥ä¹‹å‰è¯·å…ˆè¿›è¡Œå¯¹æ¯”</target>
@@ -1112,11 +1076,11 @@ Exclude: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>集æˆå¤–部应用程åºåˆ°å³é”®èœå•. 如下å®å¯ç”¨:</target>
-<source>- full file or directory name</source>
-<target>- 完整的文件å或目录å</target>
+<source>- full file or folder name</source>
+<target>- 完整的文件或文件夹å</target>
-<source>- directory part only</source>
-<target>- åªå¯¹ç›®å½•éƒ¨åˆ†</target>
+<source>- folder part only</source>
+<target>- åªå¯¹æ–‡ä»¶å¤¹éƒ¨åˆ†</target>
<source>- Other side's counterpart to %name</source>
<target>- å¦ä¸€ä¾§å‚ç…§ %name</target>
@@ -1158,8 +1122,8 @@ Exclude: \stuff\temp\*
<source>Versioning</source>
<target>ä¿ç•™åŽ†å²ç‰ˆæœ¬</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>移动文件到时间标记å­ç›®å½•</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>移动文件到一个以时间标记命åçš„å­æ–‡ä»¶å¤¹</target>
<source>Files</source>
<target>文件</target>
@@ -1251,8 +1215,8 @@ Exclude: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>无法读å–目录 %x.</target>
-<source>Endless loop.</source>
-<target>æ— é™å¾ªçŽ¯.</target>
+<source>Detected endless directory recursion.</source>
+<target>检测到无é™çš„目录递归.</target>
<source>Cannot set privilege %x.</source>
<target>无法设置 %x 的特æƒ.</target>
@@ -1278,14 +1242,11 @@ Exclude: \stuff\temp\*
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>设置默认的åŒæ­¥æ–¹å‘:旧文件会被新文件覆盖.</target>
-<source>The file does not contain a valid configuration:</source>
-<target>该文件ä¸åŒ…å«æœ‰æ•ˆçš„é…ç½®:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>ä½ å¯ä»¥å¿½ç•¥è¿™ä¸ªé”™è¯¯è€Œè®¤ä¸ºç›®å½•æ˜¯ç©ºçš„.</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target>ä½ å¯ä»¥å¿½ç•¥è¿™ä¸ªé”™è¯¯è€Œè®¤ä¸ºæ–‡ä»¶å¤¹æ˜¯ç©ºçš„.</target>
-<source>Cannot find directory %x.</source>
-<target>无法找到目录 %x.</target>
+<source>Cannot find folder %x.</source>
+<target>无法找到文件夹 %x</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>目录有ä¾èµ–性ï¼åœ¨è®¾ç«‹åŒæ­¥è§„则时请å°å¿ƒ:</target>
@@ -1294,7 +1255,7 @@ Exclude: \stuff\temp\*
<target>正在准备åŒæ­¥...</target>
<source>Conflict detected:</source>
-<target>检测到冲çª:</target>
+<target>检测到的冲çª:</target>
<source>File %x has an invalid date!</source>
<target>文件 %x 的日期éžæ³•!</target>
@@ -1317,20 +1278,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>两侧相等</target>
-<source>Files/folders differ in attributes only</source>
-<target>文件/文件夹仅属性ä¸åŒ</target>
+<source>Items have different attributes</source>
+<target>项目有ä¸åŒçš„属性</target>
-<source>Copy new file/folder to left</source>
-<target>å¤åˆ¶æ–°æ–‡ä»¶/文件夹至左侧</target>
+<source>Copy new item to left</source>
+<target>å¤åˆ¶æ–°é¡¹ç›®åˆ°å·¦ä¾§</target>
-<source>Copy new file/folder to right</source>
-<target>å¤åˆ¶æ–°æ–‡ä»¶/文件夹至å³ä¾§</target>
+<source>Copy new item to right</source>
+<target>å¤åˆ¶æ–°é¡¹ç›®åˆ°å³ä¾§</target>
-<source>Delete left file/folder</source>
-<target>删除左侧文件/文件夹</target>
+<source>Delete left item</source>
+<target>删除左侧项目</target>
-<source>Delete right file/folder</source>
-<target>删除å³ä¾§æ–‡ä»¶/文件夹</target>
+<source>Delete right item</source>
+<target>删除å³ä¾§é¡¹ç›®</target>
<source>Move file on left</source>
<target>移动左侧的文件</target>
@@ -1338,20 +1299,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>移动å³ä¾§çš„文件</target>
-<source>Overwrite left file/folder with right one</source>
-<target>从å³ä¾§è¦†ç›–左侧的文件/文件夹</target>
+<source>Overwrite left item</source>
+<target>覆盖左侧的项目</target>
-<source>Overwrite right file/folder with left one</source>
-<target>从左侧覆盖å³ä¾§çš„文件/文件夹</target>
+<source>Overwrite right item</source>
+<target>覆盖å³ä¾§çš„项目</target>
<source>Do nothing</source>
<target>ä¿æŒä¸åŠ¨</target>
-<source>Copy file attributes only to left</source>
-<target>ä»…å¤åˆ¶æ–‡ä»¶å±žæ€§åˆ°å·¦ä¾§</target>
+<source>Update attributes on left</source>
+<target>更新左侧的文件属性</target>
-<source>Copy file attributes only to right</source>
-<target>ä»…å¤åˆ¶æ–‡ä»¶å±žæ€§åˆ°å³ä¾§</target>
+<source>Update attributes on right</source>
+<target>æ›´æ–°å³ä¾§çš„文件属性</target>
<source>Multiple...</source>
<target>并è”...</target>
@@ -1404,11 +1365,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>更新 %x 的属性</target>
-<source>Target directory name must not be empty!</source>
-<target>目标目录åä¸èƒ½ä¸ºç©º!</target>
+<source>Target folder name must not be empty.</source>
+<target>目标文件夹åå¿…é¡»ä¸æ˜¯ç©ºçš„.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>用于ä¿å­˜æ–‡ä»¶åŽ†å²ç‰ˆæœ¬çš„目录没有æä¾›!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>存放历å²ç‰ˆæœ¬çš„文件夹åå¿…é¡»ä¸æ˜¯ç©ºçš„.</target>
<source>Source directory %x not found.</source>
<target>æ¥æºç›®å½• %x 无法找到.</target>
@@ -1437,8 +1398,8 @@ Exclude: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>如下路径的回收站ä¸å¯ç”¨! 文件会被永久删除:</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</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>
diff --git a/BUILD/Languages/chinese_traditional.lng b/BUILD/Languages/chinese_traditional.lng
index 69414e19..72e3cfe2 100644
--- a/BUILD/Languages/chinese_traditional.lng
+++ b/BUILD/Languages/chinese_traditional.lng
@@ -7,8 +7,8 @@
<plural definition>0</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>正在æœå°‹ç›®éŒ„ %x...</target>
+<source>Searching for folder %x...</source>
+<target>正在æœå°‹è³‡æ–™å¤¾ %x...</target>
<source>Show in Explorer</source>
<target>在資æºç®¡ç†å™¨ä¸­é¡¯ç¤º</target>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>é¸æ“‡æ›¿ä»£çš„åŒæ­¥è¨­å®š</target>
-<source>No filter selected</source>
-<target>沒有é¸æ“‡ç¯©é¸å™¨</target>
-
<source>Filter is active</source>
<target>篩é¸å™¨ç‚ºå•Ÿå‹•</target>
+<source>No filter selected</source>
+<target>沒有é¸æ“‡ç¯©é¸å™¨</target>
+
<source>Remove alternate settings</source>
<target>移除替代設定</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>整體設定</target>
-<source>Synchronization Preview</source>
-<target>åŒæ­¥é è¦½</target>
+<source>Summary</source>
+<target>概è¦</target>
<source>Find</source>
<target>尋找</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>ç€è¦½</target>
-<source>Invalid command line: %x</source>
-<target>無效的命令列:%x</target>
+<source>Invalid command line:</source>
+<target>無效的命令列:</target>
<source>Info</source>
<target>訊æ¯</target>
@@ -223,29 +223,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>å·å %x 並éžæª”å %y 的一部份ï¼</target>
-<source>Cannot find file %x.</source>
-<target>找ä¸åˆ°æª”案 %x。</target>
-
<source>Cannot read the following XML elements:</source>
<target>無法讀å–下列XML元素:</target>
-<source>S&ave configuration...</source>
-<target>儲存é…ç½®(&A)...</target>
+<source>Cannot find file %x.</source>
+<target>找ä¸åˆ°æª”案 %x。</target>
-<source>&Load configuration...</source>
-<target>載入é…ç½®(&L)...</target>
+<source>&Open...</source>
+<target>é–‹å•Ÿ(&O)...</target>
+
+<source>&Save...</source>
+<target>儲存(&S)...</target>
<source>&Quit</source>
<target>離開(&Q)</target>
-<source>&File</source>
-<target>檔案(&F)</target>
+<source>&Program</source>
+<target>程å¼(&P)</target>
<source>&Content</source>
<target>內容(&C)</target>
-<source>&About...</source>
-<target>關於(&A)...</target>
+<source>&About</source>
+<target>關於(&A)</target>
<source>&Help</source>
<target>說明(&H)</target>
@@ -253,8 +253,8 @@
<source>Usage:</source>
<target>使用é‡ï¼š</target>
-<source>1. Select directories to monitor.</source>
-<target>1. é¸æ“‡è¦ç›£æ¸¬çš„目錄。</target>
+<source>1. Select folders to watch.</source>
+<target>1. é¸æ“‡è¦ç›£çœ‹çš„資料夾。</target>
<source>2. Enter a command line.</source>
<target>2. 輸入命令列。</target>
@@ -262,19 +262,11 @@
<source>3. Press 'Start'.</source>
<target>3. 按下 '開始'。</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-命令列æ¯æ¬¡åŸ·è¡Œï¼š
-- 所有目錄為å¯ç”¨(例如æ’å…¥USB隨身碟)
-- 檔案在這些目錄或å­ç›®éŒ„會被修改
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>開始åªæ˜¯å°Žå…¥ä¸€å€‹.ffs_batch檔。</target>
-<source>Directories to watch</source>
-<target>è¦ç›£çœ‹çš„目錄</target>
+<source>Folders to watch</source>
+<target>è¦ç›£çœ‹çš„資料夾</target>
<source>Add folder</source>
<target>新增資料夾</target>
@@ -285,14 +277,25 @@ The command line is executed each time:
<source>Select a folder</source>
<target>é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾</target>
+<source>Delay [seconds]</source>
+<target>å»¶é² [秒]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>最後檢測到更改和執行命令之間的閒置時間</target>
+
<source>Command line</source>
<target>命令列</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>最å°é–’置時間 [秒]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>在幾秒é˜å…§æª¢æ¸¬ä¸Šæ¬¡æ›´æ”¹å’ŒåŸ·è¡Œå‘½ä»¤åˆ—之間的閒置時間</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+å‡å¦‚è¦è§¸ç™¼è©²å‘½ä»¤ï¼š
+- 檔案或å­è³‡æ–™å¤¾æ›´æ”¹
+- 新資料夾到來(例如æ’å…¥USB隨身碟)
+</target>
<source>Start</source>
<target>開始</target>
@@ -321,8 +324,8 @@ The command line is executed each time:
<source>Waiting for missing directories...</source>
<target>等待缺少的目錄...</target>
-<source>A directory input field is empty.</source>
-<target>目錄輸入的欄ä½ç‚ºç©º</target>
+<source>An input folder name is empty.</source>
+<target>輸入的資料夾å稱為空。</target>
<source>Logging</source>
<target>日誌記錄</target>
@@ -408,8 +411,8 @@ The command line is executed each time:
<source><Symlink></source>
<target><符號連çµ></target>
-<source><Directory></source>
-<target><目錄></target>
+<source><Folder></source>
+<target><資料夾></target>
<source>Full path</source>
<target>完整路徑</target>
@@ -420,8 +423,8 @@ The command line is executed each time:
<source>Relative path</source>
<target>相å°è·¯å¾‘</target>
-<source>Directory</source>
-<target>目錄</target>
+<source>Base folder</source>
+<target>底層資料夾</target>
<source>Size</source>
<target>大å°</target>
@@ -432,8 +435,11 @@ The command line is executed each time:
<source>Extension</source>
<target>擴展</target>
-<source>Comparison Result</source>
-<target>比å°çµæžœ</target>
+<source>Action</source>
+<target>動作</target>
+
+<source>Category</source>
+<target>分類</target>
<source>Drag && drop</source>
<target>拖放</target>
@@ -441,14 +447,14 @@ The command line is executed each time:
<source>Close progress dialog</source>
<target>關閉進度å°è©±æ¡†</target>
-<source>Shut down</source>
-<target>關機</target>
+<source>Standby</source>
+<target>å¾…æ©Ÿ</target>
<source>Log off</source>
<target>登出</target>
-<source>Standby</source>
-<target>å¾…æ©Ÿ</target>
+<source>Shut down</source>
+<target>關機</target>
<source>Hibernate</source>
<target>休眠</target>
@@ -456,15 +462,12 @@ The command line is executed each time:
<source>1. &Compare</source>
<target>1. 比å°(&C)</target>
-<source>2. &Synchronize...</source>
-<target>2. åŒæ­¥(&S)...</target>
+<source>2. &Synchronize</source>
+<target>2. åŒæ­¥(&S)</target>
<source>&New</source>
<target>新增專案(&N)</target>
-<source>&Program</source>
-<target>程å¼(&P)</target>
-
<source>&Language</source>
<target>語言(&L)</target>
@@ -492,8 +495,8 @@ The command line is executed each time:
<source>&Abort</source>
<target>å–消(&A)</target>
-<source>Synchronize...</source>
-<target>åŒæ­¥...</target>
+<source>Synchronize</source>
+<target>åŒæ­¥</target>
<source>Start synchronization</source>
<target>開始åŒæ­¥</target>
@@ -507,12 +510,12 @@ The command line is executed each time:
<source>Swap sides</source>
<target>兩邊交æ›</target>
-<source>Save current configuration to file</source>
-<target>將目å‰é…置儲存到檔案</target>
-
<source>Load configuration from file</source>
<target>從檔案載入é…ç½®</target>
+<source>Save current configuration to file</source>
+<target>將目å‰é…置儲存到檔案</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>上次使用的é…ç½®(按DELéµï¼Œå¾žæ¸…單中移除)</target>
@@ -522,14 +525,14 @@ The command line is executed each time:
<source>Hide filtered or temporarily excluded files</source>
<target>éš±è—篩é¸æˆ–暫時被排除的檔案</target>
-<source>Number of files and directories that will be created</source>
-<target>一些檔案和目錄將被新建</target>
+<source>Number of files and folders that will be created</source>
+<target>將被新建的檔案和資料夾數é‡</target>
<source>Number of files that will be overwritten</source>
<target>一些檔案和目錄將被覆蓋</target>
-<source>Number of files and directories that will be deleted</source>
-<target>一些檔案和目錄將被刪除</target>
+<source>Number of files and folders that will be deleted</source>
+<target>將被刪除的檔案和資料夾數é‡</target>
<source>Total amount of data that will be transferred</source>
<target>將被傳輸的總資料é‡</target>
@@ -552,8 +555,8 @@ The command line is executed each time:
<source>Batch job</source>
<target>批次處ç†ä½œæ¥­</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>新建一個批次檔,並自動執行åŒæ­¥ã€‚è‹¥è¦é–‹å§‹æ‰¹æ¬¡è™•ç†æ¨¡å¼åªéœ€æŒ‰å…©ä¸‹æ­¤æª”或通éŽå‘½ä»¤åˆ—執行:FreeFileSync.exe SyncJob.ffs批次處ç†ã€‚é‚„å¯ä»¥å®‰æŽ’在您的作業系統的任務計畫中。</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 <工作å稱>.ffs_batch</target>
<source>Help</source>
<target>說明</target>
@@ -579,18 +582,12 @@ The command line is executed each time:
<source>Maximum number of log files:</source>
<target>日誌檔的最大數目:</target>
-<source>Select log file directory:</source>
-<target>é¸æ“‡æ—¥èªŒæª”目錄:</target>
+<source>Select folder to save log files:</source>
+<target>é¸æ“‡è¦å„²å­˜æ—¥èªŒæª”的資料夾:</target>
<source>Batch settings</source>
<target>批次處ç†è¨­å®š</target>
-<source>&Save</source>
-<target>儲存(&S)</target>
-
-<source>&Load</source>
-<target>載入(&L)</target>
-
<source>Select variant:</source>
<target>é¸æ“‡è®Šæ•¸ï¼š</target>
@@ -615,29 +612,23 @@ The command line is executed each time:
<source>Configuration</source>
<target>é…ç½®</target>
-<source>Category</source>
-<target>分類</target>
+<source>Item exists on left side only</source>
+<target>åªå­˜åœ¨æ–¼å·¦é‚Šçš„é …ç›®</target>
-<source>Action</source>
-<target>動作</target>
-
-<source>File/folder exists on left side only</source>
-<target>åªå­˜åœ¨æ–¼å·¦é‚Šçš„檔案/資料夾</target>
-
-<source>File/folder exists on right side only</source>
-<target>åªå­˜åœ¨æ–¼å³é‚Šçš„檔案/資料夾</target>
+<source>Item exists on right side only</source>
+<target>åªå­˜åœ¨æ–¼å³é‚Šçš„é …ç›®</target>
-<source>Left file is newer</source>
-<target>左邊檔案較新</target>
+<source>Left side is newer</source>
+<target>左邊較新</target>
-<source>Right file is newer</source>
-<target>å³é‚Šæª”案較新</target>
+<source>Right side is newer</source>
+<target>å³é‚Šè¼ƒæ–°</target>
-<source>Files have different content</source>
-<target>檔案的內容ä¸åŒ</target>
+<source>Items have different content</source>
+<target>項目具有ä¸åŒå…§å®¹</target>
-<source>Conflict/file cannot be categorized</source>
-<target>è¡çª/檔案無法分類</target>
+<source>Conflict/item cannot be categorized</source>
+<target>è¡çª/é …ç›®ä¸èƒ½è¢«åˆ†é¡ž</target>
<source>OK</source>
<target>確定</target>
@@ -735,33 +726,6 @@ Note: File names must be relative to base directories!
注æ„:檔å必須相å°åˆ°åŸºæœ¬ç›®éŒ„ï¼
</target>
-<source>Hints:</source>
-<target>æ示:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. 輸入相å°æª”案或目錄å稱,使用 ';' 或空行分隔。</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. 使用è¬ç”¨å­—å…ƒ '*' å’Œ '?'。</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. 經由內容é¸å–®ç›´æŽ¥åœ¨ä¸»è¦ç¶²æ ¼æŽ’除檔案。</target>
-
-<source>Example</source>
-<target>例如</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-包括:*.doc; *.zip; *.exe
-排除:\stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>åŒæ­¥æ‰€æœ‰ .docã€.zip å’Œ .exe 檔案,除了 "temp" å­è³‡æ–™å¤¾ä¸­çš„所有檔案。</target>
-
<source>Include</source>
<target>包括</target>
@@ -783,8 +747,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>é è¨­(&D)</target>
-<source>Transactional file copy</source>
-<target>異動檔案副本</target>
+<source>Fail-safe file copy</source>
+<target>æ•…éšœä¿è­·æª”案複製</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>第一次將檔寫入到一個暫存(*.ffs_tmp),順便將它們é‡æ–°å‘½å。å³ä½¿åœ¨åš´é‡éŒ¯èª¤çš„情æ³ä¸‹ï¼Œé‚„å¯ç¢ºä¿ä¸€è‡´çš„狀態。</target>
@@ -798,8 +762,8 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>複製檔案系統權é™</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>傳輸檔案和目錄權é™(需è¦ç®¡ç†å“¡æ¬Šé™)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>傳輸檔案和資料夾權é™(需è¦ç®¡ç†å“¡æ¬Šé™)</target>
<source>Restore hidden dialogs</source>
<target>還原隱è—çš„å°è©±æ¡†</target>
@@ -1103,11 +1067,11 @@ Exclude: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>æ•´åˆä¸Šä¸‹æ–‡åŠŸèƒ½è¡¨ä¸­çš„外部應用程å¼ã€‚å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„巨集:</target>
-<source>- full file or directory name</source>
-<target>- 完整的檔å或目錄å稱</target>
+<source>- full file or folder name</source>
+<target>- 完整檔案或資料夾å稱</target>
-<source>- directory part only</source>
-<target>- åªæœ‰ç›®éŒ„部份</target>
+<source>- folder part only</source>
+<target>- åªæœ‰è³‡æ–™å¤¾ä¸€éƒ¨åˆ†</target>
<source>- Other side's counterpart to %name</source>
<target>- å¦ä¸€é‚Šå°æ‡‰åˆ° %name</target>
@@ -1149,8 +1113,8 @@ Exclude: \stuff\temp\*
<source>Versioning</source>
<target>版本控制</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>移動檔案到一個時間標記的å­ç›®éŒ„</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>將檔移動到一個有時間戳記的å­è³‡æ–™å¤¾</target>
<source>Files</source>
<target>檔案</target>
@@ -1242,8 +1206,8 @@ Exclude: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>無法讀å–目錄 %x。</target>
-<source>Endless loop.</source>
-<target>ç„¡é™è¿´åœˆã€‚</target>
+<source>Detected endless directory recursion.</source>
+<target>檢測到無é™ç›®éŒ„éžè¿´ã€‚</target>
<source>Cannot set privilege %x.</source>
<target>ç„¡æ³•è¨­å®šæ¬Šé™ %x。</target>
@@ -1269,14 +1233,11 @@ Exclude: \stuff\temp\*
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>設定é è¨­åŒæ­¥æ–¹å‘:舊檔案會被較新的檔案覆蓋。</target>
-<source>The file does not contain a valid configuration:</source>
-<target>該檔案ä¸åŒ…å«æœ‰æ•ˆçš„é…置:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>您å¯ä»¥å¿½ç•¥æ­¤éŒ¯èª¤ï¼Œè€ƒæ…®è©²ç›®éŒ„為空。</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target>您å¯ä»¥å¿½ç•¥æ­¤éŒ¯èª¤ï¼Œè€ƒæ…®åˆ°ç©ºçš„資料夾。</target>
-<source>Cannot find directory %x.</source>
-<target>找ä¸åˆ°ç›®éŒ„ %x。</target>
+<source>Cannot find folder %x.</source>
+<target>找ä¸åˆ°è³‡æ–™å¤¾ %x。</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>目錄有ä¾é æ€§ï¼è«‹å°å¿ƒè¨­å®šåŒæ­¥è¦å‰‡ï¼š</target>
@@ -1308,20 +1269,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>兩邊都相åŒ</target>
-<source>Files/folders differ in attributes only</source>
-<target>檔案/資料夾僅在於ä¸åŒçš„屬性</target>
+<source>Items have different attributes</source>
+<target>項目具有ä¸åŒå±¬æ€§</target>
-<source>Copy new file/folder to left</source>
-<target>複製新檔案/資料夾到左邊</target>
+<source>Copy new item to left</source>
+<target>複製新的項目到左邊</target>
-<source>Copy new file/folder to right</source>
-<target>複製新檔案/資料夾到å³é‚Š</target>
+<source>Copy new item to right</source>
+<target>複製新的項目到å³é‚Š</target>
-<source>Delete left file/folder</source>
-<target>刪除左邊檔案/資料夾</target>
+<source>Delete left item</source>
+<target>刪除左邊項目</target>
-<source>Delete right file/folder</source>
-<target>刪除å³é‚Šæª”案/資料夾</target>
+<source>Delete right item</source>
+<target>刪除å³é‚Šé …ç›®</target>
<source>Move file on left</source>
<target>移動左邊的檔案</target>
@@ -1329,20 +1290,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>移動å³é‚Šçš„檔案</target>
-<source>Overwrite left file/folder with right one</source>
-<target>用é©åˆæª”案/資料夾覆蓋左邊檔案/資料夾</target>
+<source>Overwrite left item</source>
+<target>覆蓋左邊項目</target>
-<source>Overwrite right file/folder with left one</source>
-<target>用é©åˆæª”案/資料夾覆蓋å³é‚Šæª”案/資料夾</target>
+<source>Overwrite right item</source>
+<target>覆蓋å³é‚Šé …ç›®</target>
<source>Do nothing</source>
<target>維æŒåŽŸç‹€</target>
-<source>Copy file attributes only to left</source>
-<target>åªè¤‡è£½æª”案屬性到左邊</target>
+<source>Update attributes on left</source>
+<target>更新左邊的屬性</target>
-<source>Copy file attributes only to right</source>
-<target>åªè¤‡è£½æª”案屬性到å³é‚Š</target>
+<source>Update attributes on right</source>
+<target>æ›´æ–°å³é‚Šçš„屬性</target>
<source>Multiple...</source>
<target>多個...</target>
@@ -1395,11 +1356,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>正在更新 %x 個屬性</target>
-<source>Target directory name must not be empty!</source>
-<target>目標目錄å稱ä¸èƒ½ç©ºç™½ï¼</target>
+<source>Target folder name must not be empty.</source>
+<target>目的資料夾å稱ä¸èƒ½ç‚ºç©ºã€‚</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>版本控制檔的目錄ä¸æä¾›ï¼</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>檔案版本控制資料夾的å稱ä¸èƒ½ç‚ºç©ºã€‚</target>
<source>Source directory %x not found.</source>
<target>來æºç›®éŒ„ %x 找ä¸åˆ°ã€‚</target>
@@ -1428,8 +1389,8 @@ Exclude: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>資æºå›žæ”¶ç­’ä¸å¯ç”¨æ–¼ä»¥ä¸‹è·¯å¾‘ï¼ç›¸å的,檔案將永é è¢«åˆªé™¤ï¼š</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</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>
diff --git a/BUILD/Languages/croatian.lng b/BUILD/Languages/croatian.lng
index ff56257e..bad3c10d 100644
--- a/BUILD/Languages/croatian.lng
+++ b/BUILD/Languages/croatian.lng
@@ -7,8 +7,8 @@
<plural definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Tražim direktorij %x...</target>
+<source>Searching for folder %x...</source>
+<target>Tražim mapu %x...</target>
<source>Show in Explorer</source>
<target>Prikaži u Exploreru</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automatska Sinkronizacija</target>
+<source>Error</source>
+<target>Greška</target>
+
<source>Select alternate comparison settings</source>
<target>Izaberite alternativne postavke usporedbe</target>
<source>Select alternate synchronization settings</source>
<target>Izaberite alternativne postavke sinkronizacije</target>
-<source>No filter selected</source>
-<target>Nijedan filter odabran</target>
-
<source>Filter is active</source>
<target>Filter je aktivan</target>
+<source>No filter selected</source>
+<target>Nijedan filter odabran</target>
+
<source>Remove alternate settings</source>
<target>Ukloni alternativne postavke</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>O programu</target>
-<source>Error</source>
-<target>Greška</target>
-
<source>Warning</source>
<target>Oprez</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Globalne postavke</target>
-<source>Synchronization Preview</source>
-<target>Pregled sinkronizacije</target>
+<source>Summary</source>
+<target>Pregled</target>
<source>Find</source>
<target>Pronađi</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Odaberi</target>
-<source>Invalid command line: %x</source>
-<target>NetoÄna naredba: %x</target>
+<source>Invalid command line:</source>
+<target>NetoÄna naredba:</target>
<source>Info</source>
<target>Info</target>
@@ -229,29 +229,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Naziv particije %x dio naziva datoteke %y!</target>
-<source>Cannot find file %x.</source>
-<target>Ne mogu pronaći datoteku %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Ne mogu Äitati slijedeće XML elemente</target>
-<source>S&ave configuration...</source>
-<target>&Spremi postavke...</target>
+<source>Cannot find file %x.</source>
+<target>Ne mogu pronaći datoteku %x.</target>
-<source>&Load configuration...</source>
-<target>&Uvezi postavke...</target>
+<source>&Open...</source>
+<target>&Otvori...</target>
+
+<source>&Save...</source>
+<target>&Spremi...</target>
<source>&Quit</source>
<target>&Izlaz</target>
-<source>&File</source>
-<target>&Datoteka</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>&Sadržaj</target>
-<source>&About...</source>
-<target>&O programu...</target>
+<source>&About</source>
+<target>&O programu</target>
<source>&Help</source>
<target>&Pomoć</target>
@@ -259,8 +259,8 @@
<source>Usage:</source>
<target>Uporaba:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Izaberite mape za nadziranje</target>
+<source>1. Select folders to watch.</source>
+<target>1. Odaberite mape za nadzirati</target>
<source>2. Enter a command line.</source>
<target>2. Unesite naredbu.</target>
@@ -268,18 +268,10 @@
<source>3. Press 'Start'.</source>
<target>3. Pretisnite 'Start'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Naredba će biti izvršena kada:
-- sve mape postanu dostupne (npr. USB stick je umetnut)
-- datoteke unutar tih mapa ili podmapa budu mijenjane
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Za zapoÄeti uvezite .ffs slijednu datoteku.</target>
-<source>Directories to watch</source>
+<source>Folders to watch</source>
<target>Mape za nadziranje</target>
<source>Add folder</source>
@@ -291,18 +283,35 @@ Naredba će biti izvršena kada:
<source>Select a folder</source>
<target>Izaberite mapu</target>
+<source>Delay [seconds]</source>
+<target>Odgoditi [sekunda]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Vrijeme Äekanja izmeÄ‘u zadnje prepoznate promjene i izvrÅ¡enja naredbe</target>
+
<source>Command line</source>
<target>Naredbena linija</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimalno vrijeme pripravnosti [sekunde]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Vrijeme pripravnosti između pronalaska zadnje promjene i izvršenja naredbe u sekundama</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Naredba će biti pokrenuta ako se:
+- datoteke ili podmape promijene
+- nove mape pojave (npr. umetanje USB sticka)
+</target>
<source>Start</source>
<target>Start</target>
+<source>&Retry</source>
+<target>&Ponovi</target>
+
+<source>Cancel</source>
+<target>Odustani</target>
+
<source>(Build: %x)</source>
<target>(InaÄnica: %x)</target>
@@ -321,8 +330,8 @@ Naredba će biti izvršena kada:
<source>Waiting for missing directories...</source>
<target>Čekam nedostajuće direktorije...</target>
-<source>A directory input field is empty.</source>
-<target>Upisno polje za direktorij je prazno.</target>
+<source>An input folder name is empty.</source>
+<target>Ime ulazne mape je prazno.</target>
<source>Logging</source>
<target>Zapisivanje</target>
@@ -393,12 +402,12 @@ Naredba će biti izvršena kada:
<source>Download now?</source>
<target>Preuzeti sada?</target>
-<source>Information</source>
-<target>Informacija</target>
-
<source>FreeFileSync is up to date!</source>
<target>FreeFileSync je ažuriran!</target>
+<source>Information</source>
+<target>Informacija</target>
+
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
<target>Dali želite da FreeFileSync automatski traži ažuriranja svaki tjedan?</target>
@@ -408,8 +417,8 @@ Naredba će biti izvršena kada:
<source><Symlink></source>
<target><Poveznica simbola></target>
-<source><Directory></source>
-<target><Direktorij></target>
+<source><Folder></source>
+<target><Mapa></target>
<source>Full path</source>
<target>Puna putanja</target>
@@ -420,8 +429,8 @@ Naredba će biti izvršena kada:
<source>Relative path</source>
<target>Relativna Putanja</target>
-<source>Directory</source>
-<target>Direktorij</target>
+<source>Base folder</source>
+<target>Izvorna mapa</target>
<source>Size</source>
<target>VeliÄina</target>
@@ -432,8 +441,11 @@ Naredba će biti izvršena kada:
<source>Extension</source>
<target>Ekstenzija</target>
-<source>Comparison Result</source>
-<target>Rezultati usporedbe</target>
+<source>Action</source>
+<target>Radnja</target>
+
+<source>Category</source>
+<target>Kategorija</target>
<source>Drag && drop</source>
<target>Povuci && ispusti</target>
@@ -441,14 +453,14 @@ Naredba će biti izvršena kada:
<source>Close progress dialog</source>
<target>Zatvori prozor zadatka</target>
-<source>Shut down</source>
-<target>IskljuÄi raÄunalo</target>
+<source>Standby</source>
+<target>Spavaj</target>
<source>Log off</source>
<target>Odlogiraj se</target>
-<source>Standby</source>
-<target>Spavaj</target>
+<source>Shut down</source>
+<target>IskljuÄi raÄunalo</target>
<source>Hibernate</source>
<target>Hibernacija</target>
@@ -456,15 +468,12 @@ Naredba će biti izvršena kada:
<source>1. &Compare</source>
<target>1. &Usporedi</target>
-<source>2. &Synchronize...</source>
-<target>2. &Sinkroniziraj...</target>
+<source>2. &Synchronize</source>
+<target>2. &Sinkroniziraj</target>
<source>&New</source>
<target>&Novo</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>&Jezik</target>
@@ -492,8 +501,8 @@ Naredba će biti izvršena kada:
<source>&Abort</source>
<target>&Odustani</target>
-<source>Synchronize...</source>
-<target>Sinkroniziraj...</target>
+<source>Synchronize</source>
+<target>Sinkroniziraj</target>
<source>Start synchronization</source>
<target>ZapoÄni sinkronizaciju</target>
@@ -507,12 +516,12 @@ Naredba će biti izvršena kada:
<source>Swap sides</source>
<target>Zamjeni strane</target>
-<source>Save current configuration to file</source>
-<target>Spremi sadašnje postavke u datoteku</target>
-
<source>Load configuration from file</source>
<target>Uvezi postavke iz datoteke</target>
+<source>Save current configuration to file</source>
+<target>Spremi sadašnje postavke u datoteku</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Zadnje korištene postavke (pretisite DEL za ukloniti s liste)</target>
@@ -522,14 +531,14 @@ Naredba će biti izvršena kada:
<source>Hide filtered or temporarily excluded files</source>
<target>Sakrij filtrirane ili trenutno iskljuÄene datoteke</target>
-<source>Number of files and directories that will be created</source>
-<target>Broj datoteka i direktorija koji će biti napravljeni</target>
+<source>Number of files and folders that will be created</source>
+<target>Broj datoteka i foldera koji će se stvoriti</target>
<source>Number of files that will be overwritten</source>
<target>Broj datoteka koje će biti prepisane</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Broj datoteka i direktorija koji će biti izbrisani</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Broj datoteka i mapa koje će se izbrisati</target>
<source>Total amount of data that will be transferred</source>
<target>Ukupna koliÄina podataka koja će biti prebeÄana</target>
@@ -552,8 +561,8 @@ Naredba će biti izvršena kada:
<source>Batch job</source>
<target>Slijedni zadatak</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Izradi slijednu datoteku i automatiziraj sinkronizaciju. Za zapoÄeti u slijednom modu dvostruki klik na ovu datoteku ili pokrenuti naredbu: FreeFileSync.exe SyncJob.ffs_batch. Ovo takoÄ‘er može biti zadano u vaÅ¡em sistemskom planeru zadataka</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>Izradite slijednu datoteku za automatizirati sinkronizaciju. Dvostruki klik na ovu datoteku ili dodajte obvezu u vašem sistemskom planeru: FreeFileSync.exe <naziv zadatka>.ffs_batch</target>
<source>Help</source>
<target>Pomoć</target>
@@ -579,21 +588,12 @@ Naredba će biti izvršena kada:
<source>Maximum number of log files:</source>
<target>Maksimalan broj izvješća:</target>
-<source>Select log file directory:</source>
-<target>Odaberite direktorij izvješća:</target>
+<source>Select folder to save log files:</source>
+<target>Odabrati mapu za spremanje izvješća</target>
<source>Batch settings</source>
<target>Slijedne postavke</target>
-<source>&Save</source>
-<target>&Spremi</target>
-
-<source>&Load</source>
-<target>&Uvezi</target>
-
-<source>Cancel</source>
-<target>Odustani</target>
-
<source>Select variant:</source>
<target>Izaberite varijantu:</target>
@@ -618,29 +618,23 @@ Naredba će biti izvršena kada:
<source>Configuration</source>
<target>Postavke</target>
-<source>Category</source>
-<target>Kategorija</target>
-
-<source>Action</source>
-<target>Radnja</target>
-
-<source>File/folder exists on left side only</source>
-<target>Datoteka/mapa postoji samo na lijevoj strani</target>
+<source>Item exists on left side only</source>
+<target>Stavka postoji samo na lijevoj strani</target>
-<source>File/folder exists on right side only</source>
-<target>Datoteka/mapa postoji samo na desnoj strani</target>
+<source>Item exists on right side only</source>
+<target>Stavka postoji samo na desnoj strani</target>
-<source>Left file is newer</source>
-<target>Lijeva datoteka je novija</target>
+<source>Left side is newer</source>
+<target>Lijeva strana je novija</target>
-<source>Right file is newer</source>
-<target>Desna datoteka je novija</target>
+<source>Right side is newer</source>
+<target>Desna strana je novija</target>
-<source>Files have different content</source>
-<target>Datoteke imaju razliÄit sadržaj</target>
+<source>Items have different content</source>
+<target>Stavke imaju razliÄit sadržaj</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Konflikt/datoteka ne more biti kategorizirana</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Sukob/stavka ne može biti razvrstana</target>
<source>OK</source>
<target>U redu</target>
@@ -717,9 +711,6 @@ jednak
<source>&Ignore</source>
<target>&Ignoriraj</target>
-<source>&Retry</source>
-<target>&Ponovi</target>
-
<source>Do not show this dialog again</source>
<target>Ne prikazuj ovaj prozor ponovno</target>
@@ -750,33 +741,6 @@ Samo datoteke koje odgovaraju svim filterskim postavkama će biti sinkronizirane
Napomena: Imena datoteka moraju biti srodni s glavnim mapama!
</target>
-<source>Hints:</source>
-<target>Savjeti:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Unesite relativno ime datoteke ili naziva direktorija odvojeno ';' ili novim redom.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Uporabite znakove poput '*' ili '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. IskljuÄite datoteke neposredno na glavnoj mreži s kontekstnog menija.</target>
-
-<source>Example</source>
-<target>Primjer</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-UkljuÄi: *.doc;*.zip;*.exe
-IskljuÄi: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Sinkroniziraj sve .doc, .zip i .exe datoteke, izuzev svega iz podmape "temp".</target>
-
<source>Include</source>
<target>UkljuÄi</target>
@@ -798,8 +762,8 @@ IskljuÄi: \stuff\temp\*
<source>&Default</source>
<target>&Zadano</target>
-<source>Transactional file copy</source>
-<target>Transakcijsko kopiranje datoteke</target>
+<source>Fail-safe file copy</source>
+<target>Kopiranje zaštićeno od grešaka</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>ZapiÅ¡i u privremenu datoteku (*.ffs_tmp) najprije a onda ju preimenuj. Ovo garantira nepromjenjivost Äak u sluÄaju kritiÄne greÅ¡ke.</target>
@@ -813,8 +777,8 @@ IskljuÄi: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Kopiraj datoteÄna dopuÅ¡tenja</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Prebaci datoteÄna dopuÅ¡tenja (Zahtjeva Administratorske ovlasti)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Premjesti datoteÄna dopuÅ¡tenja (Zahtjeva Administratorska prava)</target>
<source>Restore hidden dialogs</source>
<target>Prikaži skrivene prozore</target>
@@ -1126,11 +1090,11 @@ IskljuÄi: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integriraj vanjske aplikacije u kontekstni meni. Sljedeći makroi su dostupni:</target>
-<source>- full file or directory name</source>
-<target>- puno ime datoteke ili direktorija</target>
+<source>- full file or folder name</source>
+<target>- cijelo ime datoteke ili mape</target>
-<source>- directory part only</source>
-<target>- samo dio direktorija</target>
+<source>- folder part only</source>
+<target>- samo mapa</target>
<source>- Other side's counterpart to %name</source>
<target>- Duplikat s druge strane k %name</target>
@@ -1176,8 +1140,8 @@ IskljuÄi: \stuff\temp\*
<source>Versioning</source>
<target>Verzija</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Premjesti datoteke u vremenski-oznaÄen podfolder</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Prebaci datoteke u vremenski-blokirani podfolder</target>
<source>Files</source>
<target>Datoteke</target>
@@ -1275,8 +1239,8 @@ IskljuÄi: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Ne mogu Äitati mapu %x.</target>
-<source>Endless loop.</source>
-<target>Beskrajna petlja</target>
+<source>Detected endless directory recursion.</source>
+<target>Detektiran bezograniÄeni direktorij</target>
<source>Cannot set privilege %x.</source>
<target>Ne mogu postaviti prava za %x.</target>
@@ -1302,13 +1266,10 @@ IskljuÄi: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Datoteka ne sadrži ispravne postavke:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Možete ignorirati ovu grešku uzimajući datoteku kao praznu .</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>
-<source>Cannot find directory %x.</source>
+<source>Cannot find folder %x.</source>
<target>Ne mogu pronaći mapu %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
@@ -1341,20 +1302,20 @@ IskljuÄi: \stuff\temp\*
<source>Both sides are equal</source>
<target>Obje strane su jednake</target>
-<source>Files/folders differ in attributes only</source>
-<target>Datoteke/mape se razlikuju samo u atributima</target>
+<source>Items have different attributes</source>
+<target>Stavke imaju razliÄite atribute</target>
-<source>Copy new file/folder to left</source>
-<target>Kopiraj novu datoteku/mapu na lijevo</target>
+<source>Copy new item to left</source>
+<target>Kopiraj novu stavku lijevo</target>
-<source>Copy new file/folder to right</source>
-<target>Kopiraj novu datoteku/mapu na desno</target>
+<source>Copy new item to right</source>
+<target>Kopiraj novu stavku desno</target>
-<source>Delete left file/folder</source>
-<target>Izbriši lijevu datoteku/mapu</target>
+<source>Delete left item</source>
+<target>Izbriši lijevu stavku</target>
-<source>Delete right file/folder</source>
-<target>Izbriši desnu datoteku/mapu</target>
+<source>Delete right item</source>
+<target>Izbriši desnu stavku</target>
<source>Move file on left</source>
<target>Premjesti datoteku lijevo</target>
@@ -1362,20 +1323,20 @@ IskljuÄi: \stuff\temp\*
<source>Move file on right</source>
<target>Premjest datoteku desno</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Prepiši lijevu datoteku/mapu s onom sa desne strane</target>
+<source>Overwrite left item</source>
+<target>Prepiši lijevu stavku</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Prepiši desnu datoteku/mapu s onom sa lijeve strane</target>
+<source>Overwrite right item</source>
+<target>Prepiši desnu stavku</target>
<source>Do nothing</source>
<target>Ne radi ništa</target>
-<source>Copy file attributes only to left</source>
-<target>Kopiraj atribute datoteke samo na levo</target>
+<source>Update attributes on left</source>
+<target>Osvježi atribute lijevo</target>
-<source>Copy file attributes only to right</source>
-<target>Kopiraj atribute datoteke samo na desno</target>
+<source>Update attributes on right</source>
+<target>Osvježi atribute desno</target>
<source>Multiple...</source>
<target>Mnogostruko...</target>
@@ -1428,11 +1389,11 @@ IskljuÄi: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Obnavljam atribute od %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Ime ciljnog direktorija ne smije biti prazno!</target>
+<source>Target folder name must not be empty.</source>
+<target>Naziv odredišne mape ne može biti prazan.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Mapa za ovakvu datoteku nije isporuÄena</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Naziv mape za datoteÄni raspored ne može biti prazan</target>
<source>Source directory %x not found.</source>
<target>Izvorna mapa %x nije pronađena</target>
@@ -1461,8 +1422,8 @@ IskljuÄi: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Direktorij će biti mjenjan koji je dio više parova mapa! Molimo pogledajte postavke sinkronizacije!</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>
diff --git a/BUILD/Languages/czech.lng b/BUILD/Languages/czech.lng
index 3230b30b..bfc42fc0 100644
--- a/BUILD/Languages/czech.lng
+++ b/BUILD/Languages/czech.lng
@@ -7,8 +7,8 @@
<plural definition>n==1 ? 0 : n>=2 && n<=4 ? 1 : 2</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Otevírání adresáře %x</target>
+<source>Searching for folder %x...</source>
+<target>Otevírání složky %x</target>
<source>Show in Explorer</source>
<target>Zobrazit v Průzkumníkovi</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automatická synchronizace</target>
+<source>Error</source>
+<target>Chyba</target>
+
<source>Select alternate comparison settings</source>
<target>Změnit nastavení porovnání</target>
<source>Select alternate synchronization settings</source>
<target>Změnit nastavení synchronizace</target>
-<source>No filter selected</source>
-<target>Není vybrán žádný filtr</target>
-
<source>Filter is active</source>
<target>Filtr je zapnutý</target>
+<source>No filter selected</source>
+<target>Není vybrán žádný filtr</target>
+
<source>Remove alternate settings</source>
<target>Zrušit jiné nastavení</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>O Programu</target>
-<source>Error</source>
-<target>Chyba</target>
-
<source>Warning</source>
<target>Varování</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Nastavení programu</target>
-<source>Synchronization Preview</source>
-<target>Náhled synchronizace</target>
+<source>Summary</source>
+<target>Přehled</target>
<source>Find</source>
<target>Najít</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Procházet</target>
-<source>Invalid command line: %x</source>
-<target>Neplatný příkaz: %x</target>
+<source>Invalid command line:</source>
+<target>Neplatný příkaz:</target>
<source>Info</source>
<target>Info</target>
@@ -235,23 +235,23 @@
<source>Cannot read the following XML elements:</source>
<target>Nelze naÄíst následující XML elementy:</target>
-<source>S&ave configuration...</source>
-<target>&Uložení konfigurace...</target>
+<source>&Open...</source>
+<target>&Otevřít...</target>
-<source>&Load configuration...</source>
-<target>&NaÄíst konfiguraci...</target>
+<source>&Save...</source>
+<target>&Uložit</target>
<source>&Quit</source>
<target>U&konÄit</target>
-<source>&File</source>
-<target>&Soubor</target>
+<source>&Program</source>
+<target>&Nástroje</target>
<source>&Content</source>
<target>&Obsah</target>
-<source>&About...</source>
-<target>&O Programu...</target>
+<source>&About</source>
+<target>O &Programu</target>
<source>&Help</source>
<target>&Pomoc</target>
@@ -259,8 +259,8 @@
<source>Usage:</source>
<target>Použití:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Vyberte adresáře pro sledování.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Vyberte složku ke sledování.</target>
<source>2. Enter a command line.</source>
<target>2. Zadejte příkazovou řádku.</target>
@@ -268,19 +268,11 @@
<source>3. Press 'Start'.</source>
<target>3. ZmáÄknÄ›te 'Start'</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Příkazová řádka je spuštěna pokaždé když:
-- jsou k dispozici všechny adresáře (např. vložením USB disku)
-- dojde ke změně souborů v adresáři nebo podadresářích
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Můžete naÄíst také konfiguraÄní soubor soubor .ffs_batch</target>
-<source>Directories to watch</source>
-<target>Sledované adresáře</target>
+<source>Folders to watch</source>
+<target>Složka ke sledování</target>
<source>Add folder</source>
<target>Přidat adresář</target>
@@ -291,18 +283,35 @@ Příkazová řádka je spuštěna pokaždé když:
<source>Select a folder</source>
<target>Vyberte adresář</target>
+<source>Delay [seconds]</source>
+<target>Prodleva (v sekundách)</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Prodleva mezi zjištěním poslední změny a spuštěním příkazu</target>
+
<source>Command line</source>
<target>Příkazová řádka</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimální Äas prodlevy [v sekundách]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Prodleva mezi detekcí poslední změny a spuštěním příkazu (v sekundách)</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Příkaz je spuštěn když:
+- dojde ke změně v souboru nebo ve složce
+- je zjištěna nová složka (např. vložením USB disku)
+</target>
<source>Start</source>
<target>Start</target>
+<source>&Retry</source>
+<target>&Opakovat</target>
+
+<source>Cancel</source>
+<target>Zrušit</target>
+
<source>(Build: %x)</source>
<target>(Build: %x)</target>
@@ -321,8 +330,8 @@ Příkazová řádka je spuštěna pokaždé když:
<source>Waiting for missing directories...</source>
<target>Čekání na nedostupné adresáře...</target>
-<source>A directory input field is empty.</source>
-<target>Není zadán vstupní adresář.</target>
+<source>An input folder name is empty.</source>
+<target>Není zadána vstupní složka.</target>
<source>Logging</source>
<target>Záznam zpracování</target>
@@ -408,8 +417,8 @@ Příkazová řádka je spuštěna pokaždé když:
<source><Symlink></source>
<target><Symlink></target>
-<source><Directory></source>
-<target><Adresář></target>
+<source><Folder></source>
+<target><Složka></target>
<source>Full path</source>
<target>Plná cesta</target>
@@ -420,8 +429,8 @@ Příkazová řádka je spuštěna pokaždé když:
<source>Relative path</source>
<target>Relativní cesta</target>
-<source>Directory</source>
-<target>Adresář</target>
+<source>Base folder</source>
+<target>Složka</target>
<source>Size</source>
<target>Velikost</target>
@@ -432,23 +441,26 @@ Příkazová řádka je spuštěna pokaždé když:
<source>Extension</source>
<target>Přípona</target>
-<source>Comparison Result</source>
-<target>Výsledek porovnání</target>
+<source>Action</source>
+<target>Akce</target>
+
+<source>Category</source>
+<target>Kategorie</target>
<source>Drag && drop</source>
-<target>Drag && Drop</target>
+<target>Přetáhni sem && pusť</target>
<source>Close progress dialog</source>
<target>Zavřít průběh zpracování</target>
-<source>Shut down</source>
-<target>Vypnout poÄítaÄ</target>
+<source>Standby</source>
+<target>Přepnout do úsporného režimu</target>
<source>Log off</source>
<target>Odhlásit uživatele</target>
-<source>Standby</source>
-<target>Přepnout do úsporného režimu</target>
+<source>Shut down</source>
+<target>Vypnout poÄítaÄ</target>
<source>Hibernate</source>
<target>Přepnout do režimu spánku</target>
@@ -456,15 +468,12 @@ Příkazová řádka je spuštěna pokaždé když:
<source>1. &Compare</source>
<target>1. &Porovnat</target>
-<source>2. &Synchronize...</source>
-<target>2. &Synchronizovat...</target>
+<source>2. &Synchronize</source>
+<target>2. &Synchronizovat</target>
<source>&New</source>
<target>&Nový</target>
-<source>&Program</source>
-<target>&Nástroje</target>
-
<source>&Language</source>
<target>&Jazyk</target>
@@ -492,7 +501,7 @@ Příkazová řádka je spuštěna pokaždé když:
<source>&Abort</source>
<target>&UkonÄit</target>
-<source>Synchronize...</source>
+<source>Synchronize</source>
<target>Synchronizace</target>
<source>Start synchronization</source>
@@ -507,12 +516,12 @@ Příkazová řádka je spuštěna pokaždé když:
<source>Swap sides</source>
<target>Změna stran</target>
-<source>Save current configuration to file</source>
-<target>Uložit zmÄ›ny do konfiguraÄního souboru</target>
-
<source>Load configuration from file</source>
<target>NaÄíst konfiguraci ze souboru</target>
+<source>Save current configuration to file</source>
+<target>Uložit zmÄ›ny do konfiguraÄního souboru</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Posledně použité konfigurace (pomocí DEL můžete položku smazat)</target>
@@ -522,14 +531,14 @@ Příkazová řádka je spuštěna pokaždé když:
<source>Hide filtered or temporarily excluded files</source>
<target>Skrýt filtrované nebo doÄasnÄ› vynechané soubory</target>
-<source>Number of files and directories that will be created</source>
-<target>PoÄet souborů a adresářů k vytvoÅ™ení</target>
+<source>Number of files and folders that will be created</source>
+<target>PoÄet souborů a složek k vytvoÅ™ení</target>
<source>Number of files that will be overwritten</source>
<target>PoÄet souborů a adresářů k pÅ™epsání</target>
-<source>Number of files and directories that will be deleted</source>
-<target>PoÄet souborů a adresářů ke smazání</target>
+<source>Number of files and folders that will be deleted</source>
+<target>PoÄet souborů a složek ke smazání</target>
<source>Total amount of data that will be transferred</source>
<target>Celkový objem dat, který bude přenesen</target>
@@ -552,8 +561,8 @@ Příkazová řádka je spuštěna pokaždé když:
<source>Batch job</source>
<target>Dávkový soubor</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Vytvoří dávkový souboru pro automatický provoz. Ke spuÅ¡tÄ›ní dávky jednoduÅ¡e poklikejte na vytvoÅ™ený soubor nebo jeho jméno zadejte jako parametr pÅ™i spuÅ¡tÄ›ní FreeFileSync: FreeFileSync.exe <jméno_souboru>. StejnÄ› tak můžete ke spuÅ¡tÄ›ní využít plánovaÄ Ãºloh vaÅ¡eho operaÄního systému.</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>Vytvoří dávkový souboru pro automatickou synchronizaci. Ke spuÅ¡tÄ›ní dávky jednoduÅ¡e poklikejte na vytvoÅ™ený soubor nebo jeho jméno zadejte jako parametr pÅ™i spuÅ¡tÄ›ní FreeFileSync: FreeFileSync.exe <jméno_souboru>. StejnÄ› tak můžete ke spuÅ¡tÄ›ní využít plánovaÄ Ãºloh vaÅ¡eho operaÄního systému.</target>
<source>Help</source>
<target>Nápověda</target>
@@ -579,21 +588,12 @@ Příkazová řádka je spuštěna pokaždé když:
<source>Maximum number of log files:</source>
<target>Maximální poÄet záznamových souborů:</target>
-<source>Select log file directory:</source>
-<target>Vyberte adresář pro záznamové soubory:</target>
+<source>Select folder to save log files:</source>
+<target>Vyberte složku pro záznamové soubory:</target>
<source>Batch settings</source>
<target>Nastavení</target>
-<source>&Save</source>
-<target>&Uložit</target>
-
-<source>&Load</source>
-<target>&NaÄíst</target>
-
-<source>Cancel</source>
-<target>Zrušit</target>
-
<source>Select variant:</source>
<target>Vyberte variantu:</target>
@@ -618,29 +618,23 @@ Příkazová řádka je spuštěna pokaždé když:
<source>Configuration</source>
<target>Konfigurace</target>
-<source>Category</source>
-<target>Kategorie</target>
-
-<source>Action</source>
-<target>Akce</target>
-
-<source>File/folder exists on left side only</source>
-<target>Soubory/adresáře, které existují pouze vlevo</target>
+<source>Item exists on left side only</source>
+<target>Položky existující pouze vlevo</target>
-<source>File/folder exists on right side only</source>
-<target>Soubory/adresáře, které existují pouze vpravo</target>
+<source>Item exists on right side only</source>
+<target>Položky existující pouze vpravo</target>
-<source>Left file is newer</source>
-<target>Levý soubor je novější</target>
+<source>Left side is newer</source>
+<target>Vlevo je novější</target>
-<source>Right file is newer</source>
-<target>Pravý soubor je novější</target>
+<source>Right side is newer</source>
+<target>Vpravo je novější</target>
-<source>Files have different content</source>
-<target>Soubory, které mají rozdílný obsah</target>
+<source>Items have different content</source>
+<target>Obsah položek je rozdílný</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Konflikty/soubory které nelze zařadit</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Konflikty/položky které nelze zařadit</target>
<source>OK</source>
<target>OK</target>
@@ -717,9 +711,6 @@ je stejný
<source>&Ignore</source>
<target>&PokraÄovat</target>
-<source>&Retry</source>
-<target>&Opakovat</target>
-
<source>Do not show this dialog again</source>
<target>Tento dialog již nezobrazovat</target>
@@ -750,33 +741,6 @@ Pouze soubory odpovídající nastavenému filtru budou vybrány pro synchroniza
Poznámka: Filtr je aplikován relativně k základním adresářům.
</target>
-<source>Hints:</source>
-<target>Nápověda:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Můžete použít relativní cesty k souboru nebo adresáři oddělené ';' nebo řádkem.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Můžete použít zástupné znaky (wildcard) '*' a '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Můžete použít pro vynechávání souborů přímo kontextového menu.</target>
-
-<source>Example</source>
-<target>Příklad</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Přidat: *.doc;*.zip;*.exe
-Vynechat: \někde\něco\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Synchronizovat všechny soubory .doc, .zip a .exe s výjimkou všeho v podadresáři "někde\něco"</target>
-
<source>Include</source>
<target>Přidat</target>
@@ -798,7 +762,7 @@ Vynechat: \někde\něco\*
<source>&Default</source>
<target>&Předdefinované</target>
-<source>Transactional file copy</source>
+<source>Fail-safe file copy</source>
<target>BezpeÄné kopírování souborů</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>
@@ -813,8 +777,8 @@ Vynechat: \někde\něco\*
<source>Copy file access permissions</source>
<target>Kopírovat přístupová oprávnění k souborům</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Přenést přístupová oprávnění souborů a adresářů (Vyžaduje administrátorké oprávnění)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Přenést přístupová oprávnění souborů a složek (Vyžaduje administrátorké oprávnění)</target>
<source>Restore hidden dialogs</source>
<target>Obnovit skryté dialogy</target>
@@ -1126,10 +1090,10 @@ Vynechat: \někde\něco\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrace externí aplikace do kontextového menu. K dispozici jsou následující makra:</target>
-<source>- full file or directory name</source>
+<source>- full file or folder name</source>
<target>- celá cesta nebo jméno souboru</target>
-<source>- directory part only</source>
+<source>- folder part only</source>
<target>- pouze cesta</target>
<source>- Other side's counterpart to %name</source>
@@ -1176,8 +1140,8 @@ Vynechat: \někde\něco\*
<source>Versioning</source>
<target>Verzování</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>PÅ™esunout soubory do ÄasovÄ› oznaÄeného podadresáře</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>
@@ -1275,8 +1239,8 @@ Vynechat: \někde\něco\*
<source>Cannot read directory %x.</source>
<target>Nelze Äíst adresář %x.</target>
-<source>Endless loop.</source>
-<target>NekoneÄná smyÄka.</target>
+<source>Detected endless directory recursion.</source>
+<target>Nalezena nekoneÄná adresářová smyÄka.</target>
<source>Cannot set privilege %x.</source>
<target>Nelze nastavit práva pro %x.</target>
@@ -1302,14 +1266,11 @@ Vynechat: \někde\něco\*
<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>The file does not contain a valid configuration:</source>
-<target>Soubor neobsahuje platnou konfiguraci:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Tuto chybu můžete pÅ™eskoÄit a považovat neexistující adresář jako prázdný.</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>
-<source>Cannot find directory %x.</source>
-<target>Nelze najít adresář %x.</target>
+<source>Cannot find folder %x.</source>
+<target>>Nelze najít složku %x.</target>
<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>
@@ -1341,20 +1302,20 @@ Vynechat: \někde\něco\*
<source>Both sides are equal</source>
<target>Obě strany jsou shodné</target>
-<source>Files/folders differ in attributes only</source>
-<target>Soubory/adresáře se liší pouze ve vlastnostech</target>
+<source>Items have different attributes</source>
+<target>Položky se liší ve vlastnostech</target>
-<source>Copy new file/folder to left</source>
-<target>Kopírovat nový soubor/adresář do leva</target>
+<source>Copy new item to left</source>
+<target>Kopírovat novou položku do leva</target>
-<source>Copy new file/folder to right</source>
-<target>Kopírovat nový soubor/adresář do prava</target>
+<source>Copy new item to right</source>
+<target>Kopírovat novou položku do prava</target>
-<source>Delete left file/folder</source>
-<target>Smazat soubor/adresář z leva</target>
+<source>Delete left item</source>
+<target>Smazat položku z leva</target>
-<source>Delete right file/folder</source>
-<target>Smazat soubor/adresáře z prava</target>
+<source>Delete right item</source>
+<target>Smazat položku z prava</target>
<source>Move file on left</source>
<target>Přesunout soubor nalevo</target>
@@ -1362,20 +1323,20 @@ Vynechat: \někde\něco\*
<source>Move file on right</source>
<target>Přesunout soubor napravo</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Přepsat levý soubor/adresář tím z prava</target>
+<source>Overwrite left item</source>
+<target>Přepsat levou položku tou z prava</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Přepsat pravý soubor/adresář tím z leva</target>
+<source>Overwrite right item</source>
+<target>Přepsat pravou položku tou z leva</target>
<source>Do nothing</source>
<target>Nic nedělat</target>
-<source>Copy file attributes only to left</source>
-<target>Kopírovat vlastnosti souboru pouze do leva</target>
+<source>Update attributes on left</source>
+<target>Nastavit vlastnosti v levo</target>
-<source>Copy file attributes only to right</source>
-<target>Kopírovat vlastnosti souboru pouze do prava</target>
+<source>Update attributes on right</source>
+<target>Nastavit vlastnoti v pravo</target>
<source>Multiple...</source>
<target>Různé...</target>
@@ -1428,11 +1389,11 @@ Vynechat: \někde\něco\*
<source>Updating attributes of %x</source>
<target>Aktualizace atributů souboru %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Není zadán cílový adresář!</target>
+<source>Target folder name must not be empty.</source>
+<target>Cílová složka nesmí být prázdná.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Nebyl zadán adresář pro verzování souborů!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Složka pro verzování souborů nesmí být prázdná.</target>
<source>Source directory %x not found.</source>
<target>Zdrojový adresář %x nelze najít.</target>
@@ -1461,8 +1422,8 @@ Vynechat: \někde\něco\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Bude zmÄ›nÄ› adresář, který je souÄástí adresářového páru vícenásobného porovnání! Prosím zkontrolujte si nastavení synchronizace!</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>
diff --git a/BUILD/Languages/danish.lng b/BUILD/Languages/danish.lng
index d524b0bd..4c9c2cac 100644
--- a/BUILD/Languages/danish.lng
+++ b/BUILD/Languages/danish.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Søger efter bibliotek %x...</target>
+<source>Searching for folder %x...</source>
+<target>Søger efter mappen %x...</target>
<source>Show in Explorer</source>
<target>Vis i Explorer</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSynk - Automatisk Synkronisering</target>
+<source>Error</source>
+<target>Fejl</target>
+
<source>Select alternate comparison settings</source>
<target>Vælg alternative sammenlignings indstillinger</target>
<source>Select alternate synchronization settings</source>
<target>Vælg alternative indstillinger</target>
-<source>No filter selected</source>
-<target>Intet filter valgt</target>
-
<source>Filter is active</source>
<target>Filter er aktivt</target>
+<source>No filter selected</source>
+<target>Intet filter valgt</target>
+
<source>Remove alternate settings</source>
<target>Fjern alternative indstillinger</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>Om</target>
-<source>Error</source>
-<target>Fejl</target>
-
<source>Warning</source>
<target>Advarsel</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Fælles indstillinger</target>
-<source>Synchronization Preview</source>
-<target>Vis Synkronisering</target>
+<source>Summary</source>
+<target>Opsummering</target>
<source>Find</source>
<target>Find</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Gennemse</target>
-<source>Invalid command line: %x</source>
-<target>Ugyldig kommando: %x</target>
+<source>Invalid command line:</source>
+<target>Ugyldig kommando:</target>
<source>Info</source>
<target>Info</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Drev navn %x ikke en del af filnavn %y!</target>
-<source>Cannot find file %x.</source>
-<target>Kan ikke finde filen %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Kan ikke læse følgende XML emner:</target>
-<source>S&ave configuration...</source>
-<target>G&em konfiguration...</target>
+<source>Cannot find file %x.</source>
+<target>Kan ikke finde filen %x.</target>
-<source>&Load configuration...</source>
-<target>&Hent konfiguration...</target>
+<source>&Open...</source>
+<target>&Ã…ben...</target>
+
+<source>&Save...</source>
+<target>&Gem...</target>
<source>&Quit</source>
<target>&Afslut</target>
-<source>&File</source>
-<target>&Fil</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>&Indhold</target>
-<source>&About...</source>
-<target>&Om...</target>
+<source>&About</source>
+<target>&Om</target>
<source>&Help</source>
<target>&Hjælp</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Forbrug:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Vælg biblioteker at holde øje med.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Vælg mappe at overvåge.</target>
<source>2. Enter a command line.</source>
<target>2. Skriv en kommando linje.</target>
@@ -265,19 +265,11 @@
<source>3. Press 'Start'.</source>
<target>3. Tryk 'Start'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Kommando linjen bliver afviklet hver gang:
-- Alle biblioteker bliver tilgængelige (eks. USB stick sættes i)
-- Filer i disse biblioteker eller underbiblioteker bliver ændret
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Importer en .ffs_batch for at komme igang.</target>
-<source>Directories to watch</source>
-<target>Biblioteker at overvåge</target>
+<source>Folders to watch</source>
+<target>Mapper der overvåges</target>
<source>Add folder</source>
<target>Tilføj mappe</target>
@@ -288,18 +280,35 @@ Kommando linjen bliver afviklet hver gang:
<source>Select a folder</source>
<target>Vælg en mappe</target>
+<source>Delay [seconds]</source>
+<target>Forsinkelse [sekunder]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Tid imellem sidste ændring og udførelse</target>
+
<source>Command line</source>
<target>Kommando linje</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimum pausetid [sekunder]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Tid imellem sidste ændring og afvikling af kommando linjen i sekunder</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Kommandoen udføres hvis:
+- filer eller undermapper ændres
+- nye mapper ankommer (Hvis en USB nøgle sættes til)
+</target>
<source>Start</source>
<target>Start</target>
+<source>&Retry</source>
+<target>&Prøv igen</target>
+
+<source>Cancel</source>
+<target>Anuller</target>
+
<source>(Build: %x)</source>
<target>(Build: %x)</target>
@@ -318,8 +327,8 @@ Kommando linjen bliver afviklet hver gang:
<source>Waiting for missing directories...</source>
<target>Venter på manglende biblioteker...</target>
-<source>A directory input field is empty.</source>
-<target>Et biblioteks felt er tomt.</target>
+<source>An input folder name is empty.</source>
+<target>Et mappe navn er blankt.</target>
<source>Logging</source>
<target>Logger</target>
@@ -405,8 +414,8 @@ Kommando linjen bliver afviklet hver gang:
<source><Symlink></source>
<target><Symlink></target>
-<source><Directory></source>
-<target><Directory></target>
+<source><Folder></source>
+<target><Mappe></target>
<source>Full path</source>
<target>Fuld Sti</target>
@@ -417,8 +426,8 @@ Kommando linjen bliver afviklet hver gang:
<source>Relative path</source>
<target>Filsti</target>
-<source>Directory</source>
-<target>Bibliotek</target>
+<source>Base folder</source>
+<target>Grund mappe</target>
<source>Size</source>
<target>Størrelse</target>
@@ -429,8 +438,11 @@ Kommando linjen bliver afviklet hver gang:
<source>Extension</source>
<target>Udvidelse</target>
-<source>Comparison Result</source>
-<target>Sammenlignings Resultat</target>
+<source>Action</source>
+<target>Handling</target>
+
+<source>Category</source>
+<target>Kategori</target>
<source>Drag && drop</source>
<target>Træk && slip</target>
@@ -438,14 +450,14 @@ Kommando linjen bliver afviklet hver gang:
<source>Close progress dialog</source>
<target>Luk dialog boksen</target>
-<source>Shut down</source>
-<target>Luk ned</target>
+<source>Standby</source>
+<target>Standby</target>
<source>Log off</source>
<target>Log af</target>
-<source>Standby</source>
-<target>Standby</target>
+<source>Shut down</source>
+<target>Luk ned</target>
<source>Hibernate</source>
<target>Dvale</target>
@@ -453,15 +465,12 @@ Kommando linjen bliver afviklet hver gang:
<source>1. &Compare</source>
<target>1. &Sammenlign</target>
-<source>2. &Synchronize...</source>
-<target>2. &Synkroniser...</target>
+<source>2. &Synchronize</source>
+<target>2. &Synkroniser</target>
<source>&New</source>
<target>&Ny</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>&Sprog</target>
@@ -489,8 +498,8 @@ Kommando linjen bliver afviklet hver gang:
<source>&Abort</source>
<target>&Afbryd</target>
-<source>Synchronize...</source>
-<target>Synkroniser...</target>
+<source>Synchronize</source>
+<target>Synkroniser</target>
<source>Start synchronization</source>
<target>Start synkronisering</target>
@@ -504,12 +513,12 @@ Kommando linjen bliver afviklet hver gang:
<source>Swap sides</source>
<target>Byt sider</target>
-<source>Save current configuration to file</source>
-<target>Gem nuværende konfiguration i fil</target>
-
<source>Load configuration from file</source>
<target>Læs konfiguration fra fil</target>
+<source>Save current configuration to file</source>
+<target>Gem nuværende konfiguration i fil</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Senest brugte konfigurationer (tryk DEL for at fjerne fra listen)</target>
@@ -519,14 +528,14 @@ Kommando linjen bliver afviklet hver gang:
<source>Hide filtered or temporarily excluded files</source>
<target>Skjul filtrerede eller midlertidigt udelukkede filer</target>
-<source>Number of files and directories that will be created</source>
-<target>Antal filer og biblioteker der vil blive oprettet</target>
+<source>Number of files and folders that will be created</source>
+<target>Antallet af filer og mapper der vil blive oprettet</target>
<source>Number of files that will be overwritten</source>
<target>Antal filer der vil blive overskrevet</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Antal filer og biblioteker der vil blive slettet</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Antal filer og mapper der vil blive slettet</target>
<source>Total amount of data that will be transferred</source>
<target>Samlet antal data der vil blive overført</target>
@@ -549,8 +558,8 @@ Kommando linjen bliver afviklet hver gang:
<source>Batch job</source>
<target>Batch job</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Lav en batch fil og automatiser synkronisering. For at starte i batch mode dobbelt-klik på filen eller kør kommandoen: FreeFileSync.exe SyncJob.ffs_batch. Dette kan også planlægges i dit systems opgavestyring.</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>Opret en batch fil for at automatiserer synkronisering. Dobbelt-klik på denne fil eller planlæg den i dit systems opgavestyring: FreeFileSync.exe <opgave navn>.ffs_batch</target>
<source>Help</source>
<target>Hjælp</target>
@@ -576,21 +585,12 @@ Kommando linjen bliver afviklet hver gang:
<source>Maximum number of log files:</source>
<target>Maksimalt antal log filer:</target>
-<source>Select log file directory:</source>
-<target>Vælg log fil bibliotek:</target>
+<source>Select folder to save log files:</source>
+<target>Vælg hvor log filer skal gemmes:</target>
<source>Batch settings</source>
<target>Batch indstillinger</target>
-<source>&Save</source>
-<target>&Gem</target>
-
-<source>&Load</source>
-<target>&Hent</target>
-
-<source>Cancel</source>
-<target>Anuller</target>
-
<source>Select variant:</source>
<target>Vælg variant:</target>
@@ -615,29 +615,23 @@ Kommando linjen bliver afviklet hver gang:
<source>Configuration</source>
<target>Konfiguration</target>
-<source>Category</source>
-<target>Kategori</target>
-
-<source>Action</source>
-<target>Handling</target>
-
-<source>File/folder exists on left side only</source>
-<target>Fil/mappe findes kun til venstre</target>
+<source>Item exists on left side only</source>
+<target>Enheden findes kun på venstre side</target>
-<source>File/folder exists on right side only</source>
-<target>Fil/mappe findes kun til højre</target>
+<source>Item exists on right side only</source>
+<target>Enheden findes kun på højre side</target>
-<source>Left file is newer</source>
-<target>Fil til venstre er nyere</target>
+<source>Left side is newer</source>
+<target>Venstre side er nyest</target>
-<source>Right file is newer</source>
-<target>Fil til højre er nyere</target>
+<source>Right side is newer</source>
+<target>Højre side er nyest</target>
-<source>Files have different content</source>
-<target>Filer har forskelligt indhold</target>
+<source>Items have different content</source>
+<target>Enhederne har forskelligt indhold</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Konflikt/filen kan ikke kategoriseres</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Advarsel/enheden kan ikke kategoriseres</target>
<source>OK</source>
<target>OK</target>
@@ -714,9 +708,6 @@ er det samme
<source>&Ignore</source>
<target>&Ignorer</target>
-<source>&Retry</source>
-<target>&Prøv igen</target>
-
<source>Do not show this dialog again</source>
<target>Vis ikke denne dialog igen</target>
@@ -747,33 +738,6 @@ Synkroniserer kun filer der passer alle filtre.
Note: Fil navne må skal passe til grund bibliotekerne!
</target>
-<source>Hints:</source>
-<target>Vejledninger:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Skriv faktiske fil eller bibliotek navne adskilt af ';' eller en ny linje.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Brug wildcard tegn '*' og '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Udeluk filer direkte.</target>
-
-<source>Example</source>
-<target>Eksempel</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Inkluder: *.doc;*.zip;*.exe
-Udeluk: \ting\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Synkroniserer alle .doc, .zip and .exe filer pånær alt i undermappen "temp".</target>
-
<source>Include</source>
<target>Inkluder</target>
@@ -795,8 +759,8 @@ Udeluk: \ting\temp\*
<source>&Default</source>
<target>&Standard</target>
-<source>Transactional file copy</source>
-<target>Transaktionel fil kopiering</target>
+<source>Fail-safe file copy</source>
+<target>Fejlsikret fil kopiering</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>Skriv til en midlertidig fil (*.ffs_tmp) først så omdøb den. Dette garanterer sikkerheden selv ved en kritisk fejl.</target>
@@ -810,8 +774,8 @@ Udeluk: \ting\temp\*
<source>Copy file access permissions</source>
<target>Kopier fil adgangs tilladelser</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Overfør fil og biblioteks tilladelser (Kræver Administrator rettigheder)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Overfør fil og mappe tilladelser (Kræver Administrator rettigheder)</target>
<source>Restore hidden dialogs</source>
<target>Gendan skjulte dialoger</target>
@@ -1119,11 +1083,11 @@ Udeluk: \ting\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrere eksterne programme. Følgende macroer er mulige:</target>
-<source>- full file or directory name</source>
-<target>- komplet fil eller bibliotek navn</target>
+<source>- full file or folder name</source>
+<target>- fulde fil eller mappe navn</target>
-<source>- directory part only</source>
-<target>- kun bibliotek</target>
+<source>- folder part only</source>
+<target>- kun mappe delen</target>
<source>- Other side's counterpart to %name</source>
<target>- Modsatte sides modpart til %name</target>
@@ -1167,8 +1131,8 @@ Udeluk: \ting\temp\*
<source>Versioning</source>
<target>Versionering</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Flyt filer til et datomærket underbibliotek</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Flyt filer til tids-stemplet undermappe</target>
<source>Files</source>
<target>Filer</target>
@@ -1263,8 +1227,8 @@ Udeluk: \ting\temp\*
<source>Cannot read directory %x.</source>
<target>Kan ikke læse biblioteket %x.</target>
-<source>Endless loop.</source>
-<target>Uendelig løkke.</target>
+<source>Detected endless directory recursion.</source>
+<target>Opdaget en uendelig biblioteks løkke.</target>
<source>Cannot set privilege %x.</source>
<target>Kan ikke sætte privilegier til %x.</target>
@@ -1290,14 +1254,11 @@ Udeluk: \ting\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Filen indeholder ikke en gyldig konfiguration:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Du kan ignorer denne fejl, og opfatte biblioteket som tomt.</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>
-<source>Cannot find directory %x.</source>
-<target>Kan ikke finde biblioteket %x.</target>
+<source>Cannot find folder %x.</source>
+<target>Kan ikke finde mappen %x.</target>
<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>
@@ -1329,20 +1290,20 @@ Udeluk: \ting\temp\*
<source>Both sides are equal</source>
<target>Begge sider er ens</target>
-<source>Files/folders differ in attributes only</source>
-<target>Filer/mapper har forskellige attributter</target>
+<source>Items have different attributes</source>
+<target>Enhederne har forskellige attributter</target>
-<source>Copy new file/folder to left</source>
-<target>Kopiere ny fil/mappe til venstre</target>
+<source>Copy new item to left</source>
+<target>Kopiere nyt emne mod venstre</target>
-<source>Copy new file/folder to right</source>
-<target>Kopiere ny fil/mappe til højre</target>
+<source>Copy new item to right</source>
+<target>Kopiere nyt emne mod højre</target>
-<source>Delete left file/folder</source>
-<target>Slet venstre fil/mappe</target>
+<source>Delete left item</source>
+<target>Slet emne til venstre</target>
-<source>Delete right file/folder</source>
-<target>Slet højre fil/mappe</target>
+<source>Delete right item</source>
+<target>Slet emne til højre</target>
<source>Move file on left</source>
<target>Flyt filen til venstre</target>
@@ -1350,20 +1311,20 @@ Udeluk: \ting\temp\*
<source>Move file on right</source>
<target>flyt filen til højre</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Overskriv venstre fil/mappe med højre</target>
+<source>Overwrite left item</source>
+<target>Overskriv emne til venstre</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Overskriv højre fil/mappe med venstre</target>
+<source>Overwrite right item</source>
+<target>Overskriv emne til højre</target>
<source>Do nothing</source>
<target>Gør intet</target>
-<source>Copy file attributes only to left</source>
-<target>Kopiere fil attributter kun til venstre</target>
+<source>Update attributes on left</source>
+<target>Opdater attributter mod venstre</target>
-<source>Copy file attributes only to right</source>
-<target>Kopiere fil attributter kun til højre</target>
+<source>Update attributes on right</source>
+<target>Opdater attributter mod højre</target>
<source>Multiple...</source>
<target>Flere...</target>
@@ -1416,11 +1377,11 @@ Udeluk: \ting\temp\*
<source>Updating attributes of %x</source>
<target>Opdaterer attributter af %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Navnet på destinations biblioteket må ikke være tomt!</target>
+<source>Target folder name must not be empty.</source>
+<target>Destinations makken må ikke være tom.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Fil versions biblioteket blev ikke angivet!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Mappe navnet for fil versionering må ikke være tomt.</target>
<source>Source directory %x not found.</source>
<target>Kildebiblioteket %x blev ikke fundet.</target>
@@ -1449,8 +1410,8 @@ Udeluk: \ting\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Et bibliotek vil blive ændret som er en del af et mappe par! Gennemse venligst synkroniserings indstillingerne!</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>
diff --git a/BUILD/Languages/dutch.lng b/BUILD/Languages/dutch.lng
index 0e7c3cb9..08f738aa 100644
--- a/BUILD/Languages/dutch.lng
+++ b/BUILD/Languages/dutch.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Zoeken naar map %x...</target>
+<source>Searching for folder %x...</source>
+<target>Bezig met zoeken naar map %x...</target>
<source>Show in Explorer</source>
<target>Toon in de verkenner</target>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>Selecteer alternatieve synchronisatie instellingen</target>
-<source>No filter selected</source>
-<target>Geen filter geselecteerd</target>
-
<source>Filter is active</source>
<target>Filter is actief</target>
+<source>No filter selected</source>
+<target>Geen filter geselecteerd</target>
+
<source>Remove alternate settings</source>
<target>Verwijder alternatieve instellingen</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Algemene instellingen</target>
-<source>Synchronization Preview</source>
-<target>Synchronisatie voorbeeldweergave</target>
+<source>Summary</source>
+<target>Overzicht</target>
<source>Find</source>
<target>Vind</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Verkennen</target>
-<source>Invalid command line: %x</source>
-<target>Ongeldige opdrachtregel: %x</target>
+<source>Invalid command line:</source>
+<target>Ongeldige opdrachtregel:</target>
<source>Info</source>
<target>Info</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Schijfnaam %x maakt geen deel uit van bestandsnaam %y!</target>
-<source>Cannot find file %x.</source>
-<target>Kan bestand %x niet vinden.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Kan de volgende XML elementen niet lezen:</target>
-<source>S&ave configuration...</source>
-<target>Sl&a configuratie op...</target>
+<source>Cannot find file %x.</source>
+<target>Kan bestand %x niet vinden.</target>
+
+<source>&Open...</source>
+<target>&Open...</target>
-<source>&Load configuration...</source>
-<target>&Laad configuratie...</target>
+<source>&Save...</source>
+<target>&Opslaan...</target>
<source>&Quit</source>
<target>&Afsluiten</target>
-<source>&File</source>
-<target>&Bestand</target>
+<source>&Program</source>
+<target>&Programma</target>
<source>&Content</source>
<target>&Inhoud</target>
-<source>&About...</source>
-<target>&Informatie...</target>
+<source>&About</source>
+<target>&Over</target>
<source>&Help</source>
<target>&Help</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Gebruik:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Selecteer mappen om te observeren.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Selecteer mappen om te bekijken.</target>
<source>2. Enter a command line.</source>
<target>2. Geef een opdrachtregel in.</target>
@@ -265,18 +265,10 @@
<source>3. Press 'Start'.</source>
<target>3. Klik op 'Start'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-De opdrachtregel wordt telkens uitgevoerd indien:
-- alle mappen beschikbaar worden (bijv. invoegen van USB stick)
-- bestanden binnen deze mappen of submappen veranderd zijn
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Importeer een .ffs_batch bestand om te beginnen.</target>
-<source>Directories to watch</source>
+<source>Folders to watch</source>
<target>Mappen om te bekijken</target>
<source>Add folder</source>
@@ -288,14 +280,25 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Select a folder</source>
<target>Selecteer een map</target>
+<source>Delay [seconds]</source>
+<target>Vertraging [seconden]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Tijd tussen de laatste gedetecteerde verandering en de uitvoering van het commando</target>
+
<source>Command line</source>
<target>Opdrachtregel</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimale inactieve tijd [seconden]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Aantal inactieve seconden tussen detectie van de laatste verandering en uitvoering van een commando</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+De opdracht word geactiveerd als>:
+- bestanden of subfolders veranderen
+- nieuwe folders worden gevonden (bijvoorbeeld bij invoeging van USB stick)
+</target>
<source>Start</source>
<target>Start</target>
@@ -309,8 +312,8 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>(Build: %x)</source>
<target>(Build: %x)</target>
-<source>RealtimeSync configuration</source>
-<target>RealtimeSync configuratie</target>
+<source>All files</source>
+<target></target>
<source>&Restore</source>
<target>&Herstellen</target>
@@ -324,8 +327,8 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Waiting for missing directories...</source>
<target>Wacht op missende mappen...</target>
-<source>A directory input field is empty.</source>
-<target>Een tekstveld over de map is leeg.</target>
+<source>An input folder name is empty.</source>
+<target>Een input map naam is leeg.</target>
<source>Logging</source>
<target>Loggen</target>
@@ -351,9 +354,6 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>FreeFileSync batch file</source>
<target>FreeFileSync taakbestand</target>
-<source>FreeFileSync configuration</source>
-<target>FreeFileSync configuratie</target>
-
<source>Batch execution</source>
<target>Taak uitvoeren</target>
@@ -396,12 +396,12 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Download now?</source>
<target>Nu downloaden?</target>
-<source>Information</source>
-<target>Informatie</target>
-
<source>FreeFileSync is up to date!</source>
<target>U gebruikt de nieuwste versie van FreeFileSync!</target>
+<source>Information</source>
+<target>Informatie</target>
+
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
<target>Wilt u FreeFileSync elke week automatisch laten controleren of er een nieuwe versie is?</target>
@@ -411,8 +411,8 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source><Symlink></source>
<target><Symlink></target>
-<source><Directory></source>
-<target><Map></target>
+<source><Folder></source>
+<target>Map</target>
<source>Full path</source>
<target>Volledig pad</target>
@@ -423,8 +423,8 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Relative path</source>
<target>Relatief pad</target>
-<source>Directory</source>
-<target>Map</target>
+<source>Base folder</source>
+<target>Hoofdmap</target>
<source>Size</source>
<target>Grootte</target>
@@ -435,8 +435,11 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Extension</source>
<target>Extensie</target>
-<source>Comparison Result</source>
-<target>Resultaat vergelijken</target>
+<source>Action</source>
+<target>Actie</target>
+
+<source>Category</source>
+<target>Categorie</target>
<source>Drag && drop</source>
<target>Drag en drop</target>
@@ -444,14 +447,14 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Close progress dialog</source>
<target>Sluit voortgangsvenster</target>
-<source>Shut down</source>
-<target>Afsluiten</target>
+<source>Standby</source>
+<target>Stand-by</target>
<source>Log off</source>
<target>Afmelden</target>
-<source>Standby</source>
-<target>Stand-by</target>
+<source>Shut down</source>
+<target>Afsluiten</target>
<source>Hibernate</source>
<target>Slaapstand</target>
@@ -459,15 +462,12 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>1. &Compare</source>
<target>1. &Vergelijk</target>
-<source>2. &Synchronize...</source>
-<target>2. &Synchroniseer...</target>
+<source>2. &Synchronize</source>
+<target>2. &Synchroniseer</target>
<source>&New</source>
<target>&Nieuw</target>
-<source>&Program</source>
-<target>&Programma</target>
-
<source>&Language</source>
<target>&Taal</target>
@@ -495,8 +495,8 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>&Abort</source>
<target>&Afbreken</target>
-<source>Synchronize...</source>
-<target>Synchroniseer...</target>
+<source>Synchronize</source>
+<target>Synchroniseer</target>
<source>Start synchronization</source>
<target>Start synchronisatie</target>
@@ -510,12 +510,12 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Swap sides</source>
<target>Wissel zijdes</target>
-<source>Save current configuration to file</source>
-<target>Sla de huidige configuratie op in een bestand</target>
-
<source>Load configuration from file</source>
<target>Laad configuratie uit bestand</target>
+<source>Save current configuration to file</source>
+<target>Sla de huidige configuratie op in een bestand</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Laatst gebruikte instellingen (druk op DEL om iets te verwijderen)</target>
@@ -525,21 +525,18 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Hide filtered or temporarily excluded files</source>
<target>Verberg gefilterde of tijdelijk uitgesloten bestanden</target>
-<source>Number of files and directories that will be created</source>
-<target>Aantal bestanden en mappen die aangemaakt zullen worden</target>
+<source>Number of files and folders that will be created</source>
+<target>Aantal bestanden en mappen die zullen worden aangemaakt</target>
<source>Number of files that will be overwritten</source>
<target>Aantal bestanden die overschreven zullen worden</target>
-<source>Number of files and directories that will be deleted</source>
+<source>Number of files and folders that will be deleted</source>
<target>Aantal bestanden en mappen die verwijderd zullen worden</target>
<source>Total amount of data that will be transferred</source>
<target>Totale hoeveelheid data die verplaatst wordt</target>
-<source>Operation:</source>
-<target>Bewerking:</target>
-
<source>Items found:</source>
<target>Onderdelen gevonden:</target>
@@ -555,8 +552,8 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Batch job</source>
<target>Taaklijst</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Maak een batch bestand en automatiseer synchronisatie. Om te starten in batch modus dubbelklik je op dit bestand of voer het volgende commando uit: FreeFileSync.exe SyncJob.ffs_batch. Dit kan ook worden gepland in uw taakplanner van uw systeem.</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>Maak een batch bestand om synchronisatie te automatiseren. Dubbelklik op dit bestand of plan dit in de systeem taakplanner: FreeFileSync.exe <batch naam>.ffs_batch</target>
<source>Help</source>
<target>Help</target>
@@ -582,18 +579,12 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Maximum number of log files:</source>
<target>Maximale aantal van logbestanden:</target>
-<source>Select log file directory:</source>
-<target>Selecteer een map voor het logbestand:</target>
+<source>Select folder to save log files:</source>
+<target>Selecteer de map voor het bewaren van log bestanden:</target>
<source>Batch settings</source>
<target>Batch instellingen</target>
-<source>&Save</source>
-<target>&Opslaan</target>
-
-<source>&Load</source>
-<target>&Laden</target>
-
<source>Select variant:</source>
<target>Selecteer een variant:</target>
@@ -618,29 +609,23 @@ De opdrachtregel wordt telkens uitgevoerd indien:
<source>Configuration</source>
<target>Configuratie</target>
-<source>Category</source>
-<target>Categorie</target>
-
-<source>Action</source>
-<target>Actie</target>
-
-<source>File/folder exists on left side only</source>
-<target>Bestand/Map bestaat alleen aan de linkerkant</target>
+<source>Item exists on left side only</source>
+<target>Item bestaat alleen aan de linkerkant</target>
-<source>File/folder exists on right side only</source>
-<target>Bestand/Map bestaat alleen aan de rechterkant</target>
+<source>Item exists on right side only</source>
+<target>Item bestaat alleen aan de rechterkant</target>
-<source>Left file is newer</source>
-<target>Linker bestand is nieuwer</target>
+<source>Left side is newer</source>
+<target>De linkerkant is nieuwer</target>
-<source>Right file is newer</source>
-<target>Rechter bestand is nieuwer</target>
+<source>Right side is newer</source>
+<target>De rechterkant is nieuwer</target>
-<source>Files have different content</source>
-<target>Bestanden hebben verschillende inhoud</target>
+<source>Items have different content</source>
+<target>De items hebben een andere inhoud</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Conflict/Bestand kan niet worden gecategoriseerd</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Conflict/item kan niet worden gecategoriseerd</target>
<source>OK</source>
<target>OK</target>
@@ -747,33 +732,6 @@ Alleen bestanden die met alle filter instellingen overeen komen worden gesynchro
Opmerking: Bestandsnamen moeten relatief zijn aan de basis mappen!
</target>
-<source>Hints:</source>
-<target>Tips:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Vul de relatieve bestands- of mapnaam in, gescheiden door ';' of een nieuwe regel.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Gebruik wildcard karakters zoals '*' en '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Sluit bestanden in het hoofdscherm direct uit via het contextmenu</target>
-
-<source>Example</source>
-<target>Voorbeeld</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Opnemen: *.doc;*.zip;*.exe
-Uitsluiten: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Synchroniseer alle .doc, .zip en .exe bestanden behalve wat in submap "temp" staat.</target>
-
<source>Include</source>
<target>Opnemen</target>
@@ -795,8 +753,8 @@ Uitsluiten: \stuff\temp\*
<source>&Default</source>
<target>&Standaard</target>
-<source>Transactional file copy</source>
-<target>Transactionele bestands kopie</target>
+<source>Fail-safe file copy</source>
+<target>Fail-safe bestandskopie</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>Schrijf eerst naar een tijdelijk bestand (*.ffs_tmp) en hernoem dan. Dit garandeert een consistente toestand, zelfs in het geval van een fatale fout.</target>
@@ -810,8 +768,8 @@ Uitsluiten: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Kopiëer toegangsrechten van bestand.</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Zet bestand en map permissies over (Vereist Administrator rechten)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Overdragen van bestands en maps permissies (Administrator rechten nodig)</target>
<source>Restore hidden dialogs</source>
<target>Herstel verborgen dialogen</target>
@@ -1119,11 +1077,11 @@ Uitsluiten: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integreer externe applicaties in het context menu. De volgende macros zijn beschikbaar:</target>
-<source>- full file or directory name</source>
-<target>- volledig bestand of mapnaam</target>
+<source>- full file or folder name</source>
+<target>- volledige bestands of maps naam</target>
-<source>- directory part only</source>
-<target>- alleen de map</target>
+<source>- folder part only</source>
+<target>- alleen het map gedeelte</target>
<source>- Other side's counterpart to %name</source>
<target>- Tegenhanger andere zijde naar %naam</target>
@@ -1167,8 +1125,8 @@ Uitsluiten: \stuff\temp\*
<source>Versioning</source>
<target>Versiebeheer</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Verplaats de bestanden naar een tijd-gemarkeerde submap</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Verplaats bestanden in een tijdsaangeduide submap</target>
<source>Files</source>
<target>Bestanden</target>
@@ -1233,6 +1191,9 @@ Uitsluiten: \stuff\temp\*
<source>Cannot write modification time of %x.</source>
<target>Kan wijzigings tijd van %x niet toevoegen.</target>
+<source>Cannot write file attributes of %x.</source>
+<target>Kan bestandskenmerken van %x niet schrijven.</target>
+
<source>Cannot find system function %x.</source>
<target>Kan systeemfunctie %x niet vinden.</target>
@@ -1254,17 +1215,14 @@ Uitsluiten: \stuff\temp\*
<source>Cannot copy symbolic link %x to %y.</source>
<target>Kan snelkoppeling %x niet kopiëren naar %y.</target>
-<source>Cannot write file attributes of %x.</source>
-<target>Kan bestandskenmerken van %x niet schrijven.</target>
-
<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>Endless loop.</source>
-<target>Oneindige loop.</target>
+<source>Detected endless directory recursion.</source>
+<target>Eindeloze map recursie gedetecteerd.</target>
<source>Cannot set privilege %x.</source>
<target>Kan privilege %x niet instellen.</target>
@@ -1290,13 +1248,10 @@ Uitsluiten: \stuff\temp\*
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Stel standaard synchronisatie richtingen in: Oude bestanden worden door nieuwere bestanden overschreven.</target>
-<source>The file does not contain a valid configuration:</source>
-<target>Het bestand bevat geen geldige configuratie:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Je kan deze error negeren als de map leeg is.</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target>U kunt deze waarschuwing negeren om de map als leeg te laten gelden.</target>
-<source>Cannot find directory %x.</source>
+<source>Cannot find folder %x.</source>
<target>Kan map %x niet vinden.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
@@ -1329,20 +1284,20 @@ Uitsluiten: \stuff\temp\*
<source>Both sides are equal</source>
<target>Beide kanten zijn gelijk</target>
-<source>Files/folders differ in attributes only</source>
-<target>Bestanden/Mappen verschillen alleen in attributen</target>
+<source>Items have different attributes</source>
+<target>Items hebben verschillende attributen</target>
-<source>Copy new file/folder to left</source>
-<target>Kopiëer nieuw bestand/map naar links</target>
+<source>Copy new item to left</source>
+<target>Kopieër nieuw item naar de linkerkant</target>
-<source>Copy new file/folder to right</source>
-<target>Kopiëer nieuw bestand/map naar rechts</target>
+<source>Copy new item to right</source>
+<target>Kopieër nieuw item naar de rechterkant</target>
-<source>Delete left file/folder</source>
-<target>Verwijder linker bestand/map</target>
+<source>Delete left item</source>
+<target>Verwijder linker item</target>
-<source>Delete right file/folder</source>
-<target>Verwijder rechter bestand/map</target>
+<source>Delete right item</source>
+<target>Verwijder rechter item</target>
<source>Move file on left</source>
<target>Verplaats bestand aan de linkerkant</target>
@@ -1350,20 +1305,20 @@ Uitsluiten: \stuff\temp\*
<source>Move file on right</source>
<target>Verplaats bestand aan de rechterkant</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Overschrijf linker bestand/map met de rechter</target>
+<source>Overwrite left item</source>
+<target>Overschrijf linker item</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Overschrijf rechter bestand/map met de linker</target>
+<source>Overwrite right item</source>
+<target>Overschrijf rechter item</target>
<source>Do nothing</source>
<target>Geen actie ondernemen</target>
-<source>Copy file attributes only to left</source>
-<target>Kopiëer bestandsattributen alleen naar links</target>
+<source>Update attributes on left</source>
+<target>Update attributen aan de linkerkant</target>
-<source>Copy file attributes only to right</source>
-<target>Kopiëer bestandsattributen alleen naar rechts</target>
+<source>Update attributes on right</source>
+<target>Update attributen aan de rechterkant</target>
<source>Multiple...</source>
<target>Meerdere...</target>
@@ -1416,11 +1371,11 @@ Uitsluiten: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Attributen bijwerken van %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Doel mapnaam mag niet leeg zijn!</target>
+<source>Target folder name must not be empty.</source>
+<target>Doelmap mag geen lege naam hebben.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Map voor bestands versiebeheer is niet ingegeven!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Mapnaam voor bestandsversies mag niet leeg zijn.</target>
<source>Source directory %x not found.</source>
<target>Bronmap %x niet gevonden.</target>
@@ -1449,8 +1404,8 @@ Uitsluiten: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>Prullenbak is niet beschikbaar voor de volgende locaties! De bestanden worden permanent verwijderd:</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Een map wordt bewerkt die deel is van meerdere mappen! Controleer de synchronisatie instellingen!</target>
+<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>Processing folder pair:</source>
<target>Verwerking van gekoppelde mappen:</target>
diff --git a/BUILD/Languages/english_uk.lng b/BUILD/Languages/english_uk.lng
index abed9c59..751cf0be 100644
--- a/BUILD/Languages/english_uk.lng
+++ b/BUILD/Languages/english_uk.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Searching for directory %x...</target>
+<source>Searching for folder %x...</source>
+<target>Searching for folder %x...</target>
<source>Show in Explorer</source>
<target>Show in Explorer</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automated Synchronisation</target>
+<source>Error</source>
+<target>Error</target>
+
<source>Select alternate comparison settings</source>
<target>Select alternate comparison settings</target>
<source>Select alternate synchronization settings</source>
<target>Select alternate synchronisation settings</target>
-<source>No filter selected</source>
-<target>No filter selected</target>
-
<source>Filter is active</source>
<target>Filter is active</target>
+<source>No filter selected</source>
+<target>No filter selected</target>
+
<source>Remove alternate settings</source>
<target>Remove alternate settings</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>About</target>
-<source>Error</source>
-<target>Error</target>
-
<source>Warning</source>
<target>Warning</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Global settings</target>
-<source>Synchronization Preview</source>
-<target>Synchronisation Preview</target>
+<source>Summary</source>
+<target>Summary</target>
<source>Find</source>
<target>Find</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Browse</target>
-<source>Invalid command line: %x</source>
-<target>Invalid command line: %x</target>
+<source>Invalid command line:</source>
+<target>Invalid command line:</target>
<source>Info</source>
<target>Info</target>
@@ -232,23 +232,23 @@
<source>Cannot read the following XML elements:</source>
<target>Cannot read the following XML elements:</target>
-<source>S&ave configuration...</source>
-<target>S&ave configuration...</target>
+<source>&Open...</source>
+<target>&Open...</target>
-<source>&Load configuration...</source>
-<target>&Load configuration...</target>
+<source>&Save...</source>
+<target>&Save...</target>
<source>&Quit</source>
<target>&Quit</target>
-<source>&File</source>
-<target>&File</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>&Content</target>
-<source>&About...</source>
-<target>&About...</target>
+<source>&About</source>
+<target>&About</target>
<source>&Help</source>
<target>&Help</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Usage:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Select directories to monitor.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Select folders to watch.</target>
<source>2. Enter a command line.</source>
<target>2. Enter a command line.</target>
@@ -265,19 +265,11 @@
<source>3. Press 'Start'.</source>
<target>3. Press 'Start'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>To get started just import a .ffs_batch file.</target>
-<source>Directories to watch</source>
-<target>Directories to watch</target>
+<source>Folders to watch</source>
+<target>Folders to watch</target>
<source>Add folder</source>
<target>Add folder</target>
@@ -288,18 +280,35 @@ The command line is executed each time:
<source>Select a folder</source>
<target>Select a folder</target>
+<source>Delay [seconds]</source>
+<target>Delay [seconds]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Idle time between last detected change and execution of command</target>
+
<source>Command line</source>
<target>Command line</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimum Idle Time [seconds]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Idle time between detection of last change and execution of command line in seconds</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</target>
<source>Start</source>
<target>Start</target>
+<source>&Retry</source>
+<target>&Retry</target>
+
+<source>Cancel</source>
+<target>Cancel</target>
+
<source>(Build: %x)</source>
<target>(Build: %x)</target>
@@ -318,8 +327,8 @@ The command line is executed each time:
<source>Waiting for missing directories...</source>
<target>Waiting for missing directories...</target>
-<source>A directory input field is empty.</source>
-<target>A directory input field is empty.</target>
+<source>An input folder name is empty.</source>
+<target>An input folder name is empty.</target>
<source>Logging</source>
<target>Logging</target>
@@ -348,9 +357,6 @@ The command line is executed each time:
<source>FreeFileSync configuration</source>
<target>FreeFileSync configuration</target>
-<source>FreeFileSync Batch Job</source>
-<target>FreeFileSync Batch Job</target>
-
<source>Batch execution</source>
<target>Batch execution</target>
@@ -408,8 +414,8 @@ The command line is executed each time:
<source><Symlink></source>
<target><Symlink></target>
-<source><Directory></source>
-<target><Directory></target>
+<source><Folder></source>
+<target><Folder></target>
<source>Full path</source>
<target>Full path</target>
@@ -420,8 +426,8 @@ The command line is executed each time:
<source>Relative path</source>
<target>Relative path</target>
-<source>Directory</source>
-<target>Directory</target>
+<source>Base folder</source>
+<target>Base folder</target>
<source>Size</source>
<target>Size</target>
@@ -432,8 +438,11 @@ The command line is executed each time:
<source>Extension</source>
<target>Extension</target>
-<source>Comparison Result</source>
-<target>Comparison Result</target>
+<source>Action</source>
+<target>Action</target>
+
+<source>Category</source>
+<target>Category</target>
<source>Drag && drop</source>
<target>Drag && drop</target>
@@ -441,14 +450,14 @@ The command line is executed each time:
<source>Close progress dialog</source>
<target>Close progress dialog</target>
-<source>Shut down</source>
-<target>Shut down</target>
+<source>Standby</source>
+<target>Standby</target>
<source>Log off</source>
<target>Log off</target>
-<source>Standby</source>
-<target>Standby</target>
+<source>Shut down</source>
+<target>Shut down</target>
<source>Hibernate</source>
<target>Hibernate</target>
@@ -456,15 +465,12 @@ The command line is executed each time:
<source>1. &Compare</source>
<target>1. &Compare</target>
-<source>2. &Synchronize...</source>
-<target>2. &Synchronise...</target>
+<source>2. &Synchronize</source>
+<target>2. &Synchronise</target>
<source>&New</source>
<target>&New</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>&Language</target>
@@ -492,8 +498,8 @@ The command line is executed each time:
<source>&Abort</source>
<target>&Abort</target>
-<source>Synchronize...</source>
-<target>Synchronise...</target>
+<source>Synchronize</source>
+<target>Synchronise</target>
<source>Start synchronization</source>
<target>Start synchronisation</target>
@@ -507,12 +513,12 @@ The command line is executed each time:
<source>Swap sides</source>
<target>Swap sides</target>
-<source>Save current configuration to file</source>
-<target>Save current configuration to file</target>
-
<source>Load configuration from file</source>
<target>Load configuration from file</target>
+<source>Save current configuration to file</source>
+<target>Save current configuration to file</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Last used configurations (press DEL to remove from list)</target>
@@ -522,14 +528,14 @@ The command line is executed each time:
<source>Hide filtered or temporarily excluded files</source>
<target>Hide filtered or temporarily excluded files</target>
-<source>Number of files and directories that will be created</source>
-<target>Number of files and directories that will be created</target>
+<source>Number of files and folders that will be created</source>
+<target>Number of files and folders that will be created</target>
<source>Number of files that will be overwritten</source>
<target>Number of files that will be overwritten</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Number of files and directories that will be deleted</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Number of files and folders that will be deleted</target>
<source>Total amount of data that will be transferred</source>
<target>Total amount of data that will be transferred</target>
@@ -552,8 +558,8 @@ The command line is executed each time:
<source>Batch job</source>
<target>Batch job</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Create a batch file and automate synchronisation. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</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>Create a batch file to automate synchronisation. Double-click this file or schedule in your system's task planner: FreeFileSync.exe <job name>.ffs_batch</target>
<source>Help</source>
<target>Help</target>
@@ -579,21 +585,12 @@ The command line is executed each time:
<source>Maximum number of log files:</source>
<target>Maximum number of log files:</target>
-<source>Select log file directory:</source>
-<target>Select log file directory:</target>
+<source>Select folder to save log files:</source>
+<target>Select folder to save log files:</target>
<source>Batch settings</source>
<target>Batch settings</target>
-<source>&Save</source>
-<target>&Save</target>
-
-<source>&Load</source>
-<target>&Load</target>
-
-<source>Cancel</source>
-<target>Cancel</target>
-
<source>Select variant:</source>
<target>Select variant:</target>
@@ -618,29 +615,23 @@ The command line is executed each time:
<source>Configuration</source>
<target>Configuration</target>
-<source>Category</source>
-<target>Category</target>
-
-<source>Action</source>
-<target>Action</target>
-
-<source>File/folder exists on left side only</source>
-<target>File/folder exists on left side only</target>
+<source>Item exists on left side only</source>
+<target>Item exists on left side only</target>
-<source>File/folder exists on right side only</source>
-<target>File/folder exists on right side only</target>
+<source>Item exists on right side only</source>
+<target>Item exists on right side only</target>
-<source>Left file is newer</source>
-<target>Left file is newer</target>
+<source>Left side is newer</source>
+<target>Left side is newer</target>
-<source>Right file is newer</source>
-<target>Right file is newer</target>
+<source>Right side is newer</source>
+<target>Right side is newer</target>
-<source>Files have different content</source>
-<target>Files have different content</target>
+<source>Items have different content</source>
+<target>Items have different content</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Conflict/file cannot be categorised</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Conflict/item cannot be categorised</target>
<source>OK</source>
<target>OK</target>
@@ -717,9 +708,6 @@ is the same
<source>&Ignore</source>
<target>&Ignore</target>
-<source>&Retry</source>
-<target>&Retry</target>
-
<source>Do not show this dialog again</source>
<target>Do not show this dialogue again</target>
@@ -750,33 +738,6 @@ Only files that match all filter settings will be synchronised.
Note: File names must be relative to base directories!
</target>
-<source>Hints:</source>
-<target>Hints:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Enter relative file or directory names separated by ';' or a new line.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Use wildcard characters '*' and '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Exclude files directly on main grid via context menu.</target>
-
-<source>Example</source>
-<target>Example</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Synchronise all .doc, .zip and .exe files except everything in subfolder "temp".</target>
-
<source>Include</source>
<target>Include</target>
@@ -798,8 +759,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>&Default</target>
-<source>Transactional file copy</source>
-<target>Transactional file copy</target>
+<source>Fail-safe file copy</source>
+<target>Fail-safe file copy</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>Write to a temporary file (*.ffs_tmp) first then rename it. This guarantees a consistent state even in case of fatal error.</target>
@@ -813,8 +774,8 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Copy file access permissions</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Transfer file and directory permissions (Requires Administrator rights)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Transfer file and folder permissions (Requires Administrator rights)</target>
<source>Restore hidden dialogs</source>
<target>Restore hidden dialogs</target>
@@ -1122,11 +1083,11 @@ Exclude: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrate external applications into context menu. The following macros are available:</target>
-<source>- full file or directory name</source>
-<target>- full file or directory name</target>
+<source>- full file or folder name</source>
+<target>- full file or folder name</target>
-<source>- directory part only</source>
-<target>- directory part only</target>
+<source>- folder part only</source>
+<target>- folder part only</target>
<source>- Other side's counterpart to %name</source>
<target>- Other side's counterpart to %name</target>
@@ -1170,8 +1131,8 @@ Exclude: \stuff\temp\*
<source>Versioning</source>
<target>Versioning</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Move files into a time-stamped subdirectory</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>
@@ -1266,8 +1227,8 @@ Exclude: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Cannot read directory %x.</target>
-<source>Endless loop.</source>
-<target>Endless loop.</target>
+<source>Detected endless directory recursion.</source>
+<target>Detected endless directory recursion.</target>
<source>Cannot set privilege %x.</source>
<target>Cannot set privilege %x.</target>
@@ -1293,14 +1254,11 @@ Exclude: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>The file does not contain a valid configuration:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>You can ignore this error to consider the directory as empty.</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>
-<source>Cannot find directory %x.</source>
-<target>Cannot find directory %x.</target>
+<source>Cannot find folder %x.</source>
+<target>Cannot find folder %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Directories are dependent! Be careful when setting up synchronisation rules:</target>
@@ -1332,20 +1290,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>Both sides are equal</target>
-<source>Files/folders differ in attributes only</source>
-<target>Files/folders differ in attributes only</target>
+<source>Items have different attributes</source>
+<target>Items have different attributes</target>
-<source>Copy new file/folder to left</source>
-<target>Copy new file/folder to left</target>
+<source>Copy new item to left</source>
+<target>Copy new item to left</target>
-<source>Copy new file/folder to right</source>
-<target>Copy new file/folder to right</target>
+<source>Copy new item to right</source>
+<target>Copy new item to right</target>
-<source>Delete left file/folder</source>
-<target>Delete left file/folder</target>
+<source>Delete left item</source>
+<target>Delete left item</target>
-<source>Delete right file/folder</source>
-<target>Delete right file/folder</target>
+<source>Delete right item</source>
+<target>Delete right item</target>
<source>Move file on left</source>
<target>Move file on left</target>
@@ -1353,20 +1311,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>Move file on right</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Overwrite left file/folder with right one</target>
+<source>Overwrite left item</source>
+<target>Overwrite left item</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Overwrite right file/folder with left one</target>
+<source>Overwrite right item</source>
+<target>Overwrite right item</target>
<source>Do nothing</source>
<target>Do nothing</target>
-<source>Copy file attributes only to left</source>
-<target>Copy file attributes only to left</target>
+<source>Update attributes on left</source>
+<target>Update attributes on left</target>
-<source>Copy file attributes only to right</source>
-<target>Copy file attributes only to right</target>
+<source>Update attributes on right</source>
+<target>Update attributes on right</target>
<source>Multiple...</source>
<target>Multiple...</target>
@@ -1419,11 +1377,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Updating attributes of %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Target directory name must not be empty!</target>
+<source>Target folder name must not be empty.</source>
+<target>Target folder name must not be empty.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Directory for file versioning was not supplied!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Folder name for file versioning must not be empty.</target>
<source>Source directory %x not found.</source>
<target>Source directory %x not found.</target>
@@ -1452,8 +1410,8 @@ Exclude: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>A directory will be modified which is part of multiple folder pairs! Please review synchronisation settings!</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>
diff --git a/BUILD/Languages/finnish.lng b/BUILD/Languages/finnish.lng
index 48cfc636..8ccf5448 100644
--- a/BUILD/Languages/finnish.lng
+++ b/BUILD/Languages/finnish.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Hakemistoja etsitään %x...</target>
+<source>Searching for folder %x...</source>
+<target>Etsitään hakemistoa %x...</target>
<source>Show in Explorer</source>
<target>Näytä Explorerissa</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automaattisoitu täsmäytys</target>
+<source>Error</source>
+<target>Virhe</target>
+
<source>Select alternate comparison settings</source>
<target>Valitse toinen asetus vertailulle</target>
<source>Select alternate synchronization settings</source>
<target>Valitse täsmäykselle toinen asetus</target>
-<source>No filter selected</source>
-<target>Suodin valitsematta</target>
-
<source>Filter is active</source>
<target>Suodin aktivoitu</target>
+<source>No filter selected</source>
+<target>Suodin valitsematta</target>
+
<source>Remove alternate settings</source>
<target>Poista toinen asetus</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>Ohje</target>
-<source>Error</source>
-<target>Virhe</target>
-
<source>Warning</source>
<target>Varoitus</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Yleiset asetukset</target>
-<source>Synchronization Preview</source>
-<target>Täsmäytyksen esikatselu</target>
+<source>Summary</source>
+<target>Yhteenveto</target>
<source>Find</source>
<target>Etsi</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Selaa</target>
-<source>Invalid command line: %x</source>
-<target>Virheellinen komentokehote: %x</target>
+<source>Invalid command line:</source>
+<target>Virheellinen komentokehote:</target>
<source>Info</source>
<target>Info</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Taltion nimi %x ei esiinny tiedostonimessä %y!</target>
-<source>Cannot find file %x.</source>
-<target>Tiedosto %x ei löydy.</target>
-
<source>Cannot read the following XML elements:</source>
<target>XML elementit lukukelvottimia:</target>
-<source>S&ave configuration...</source>
-<target>Asetukset t&allennetaan...</target>
+<source>Cannot find file %x.</source>
+<target>Tiedosto %x ei löydy.</target>
-<source>&Load configuration...</source>
-<target>Asetusten &lataus...</target>
+<source>&Open...</source>
+<target>&Avaa...</target>
+
+<source>&Save...</source>
+<target>&Avaa...</target>
<source>&Quit</source>
<target>&Lopeta</target>
-<source>&File</source>
-<target>&Tiedosto</target>
+<source>&Program</source>
+<target>&Ohjelma</target>
<source>&Content</source>
<target>&Sisältö</target>
-<source>&About...</source>
-<target>&Ohje...</target>
+<source>&About</source>
+<target>&Ohje</target>
<source>&Help</source>
<target>&Ohje</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Käyttö:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Valitse seurattavat hakemistot</target>
+<source>1. Select folders to watch.</source>
+<target>1. Valitse seurattavat hakemistot.</target>
<source>2. Enter a command line.</source>
<target>2. Anna komentokehote</target>
@@ -265,18 +265,10 @@
<source>3. Press 'Start'.</source>
<target>3. Paina 'Käynnistä'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Komentokehoite suoritetaan kun:
-- Kaikki hakemistot ovat saatavilla (esim. USB tikku asennetaan)
-- Tiedostot näissä hakemistoissa tai alihakemistoissa muutetaan
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Aloita lataamalla joku .ffs_batch -tiedosto.</target>
-<source>Directories to watch</source>
+<source>Folders to watch</source>
<target>Tarkkailtavat hakemistot</target>
<source>Add folder</source>
@@ -288,18 +280,35 @@ Komentokehoite suoritetaan kun:
<source>Select a folder</source>
<target>Valitse hakemisto</target>
+<source>Delay [seconds]</source>
+<target>Viive [sekunttia]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Joutoaika edellisen muutoksen ja käskyn suorittamisen välillä</target>
+
<source>Command line</source>
<target>Komentokehote</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimi joutoaika [sekunttia]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Joutoaika viimeisen muutos havainnon ja käskyn suorittamisen välillä, sekunneissa</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Käsky suoritetaan jos:
+- tiedosto tai alihakemisto muuttu
+- uusi hakemisto ilmestyy (esim. USB tikku)
+</target>
<source>Start</source>
<target>Käynnistä</target>
+<source>&Retry</source>
+<target>&Uudestaan</target>
+
+<source>Cancel</source>
+<target>Lopeta</target>
+
<source>(Build: %x)</source>
<target>(Versio: %x)</target>
@@ -318,8 +327,8 @@ Komentokehoite suoritetaan kun:
<source>Waiting for missing directories...</source>
<target>Odottaa puuttuvia hakemistoja...</target>
-<source>A directory input field is empty.</source>
-<target>Hakemistokenttä on tyhjä.</target>
+<source>An input folder name is empty.</source>
+<target>Tulohakemiston nimi on tyhjä.</target>
<source>Logging</source>
<target>Kirjaa</target>
@@ -405,7 +414,7 @@ Komentokehoite suoritetaan kun:
<source><Symlink></source>
<target><Pikakuvake></target>
-<source><Directory></source>
+<source><Folder></source>
<target><Hakemisto></target>
<source>Full path</source>
@@ -417,8 +426,8 @@ Komentokehoite suoritetaan kun:
<source>Relative path</source>
<target>Suhteellinen polku</target>
-<source>Directory</source>
-<target>Hakemisto</target>
+<source>Base folder</source>
+<target>Juurihakemisto</target>
<source>Size</source>
<target>Koko</target>
@@ -429,8 +438,11 @@ Komentokehoite suoritetaan kun:
<source>Extension</source>
<target>Laajennus</target>
-<source>Comparison Result</source>
-<target>Vertailun tulos</target>
+<source>Action</source>
+<target>Suorita</target>
+
+<source>Category</source>
+<target>Luokka</target>
<source>Drag && drop</source>
<target>Vedä ja pudota</target>
@@ -438,14 +450,14 @@ Komentokehoite suoritetaan kun:
<source>Close progress dialog</source>
<target>Sulje etenämän dialoogi</target>
-<source>Shut down</source>
-<target>Sulje</target>
+<source>Standby</source>
+<target>Lepotila</target>
<source>Log off</source>
<target>Kirjaudu ulos</target>
-<source>Standby</source>
-<target>Lepotila</target>
+<source>Shut down</source>
+<target>Sulje</target>
<source>Hibernate</source>
<target>Horrostila</target>
@@ -453,15 +465,12 @@ Komentokehoite suoritetaan kun:
<source>1. &Compare</source>
<target>1. &Vertaa</target>
-<source>2. &Synchronize...</source>
-<target>2. &Täsmäytä...</target>
+<source>2. &Synchronize</source>
+<target>2. &Täsmäytä</target>
<source>&New</source>
<target>&Uusi</target>
-<source>&Program</source>
-<target>&Ohjelma</target>
-
<source>&Language</source>
<target>&Kieli</target>
@@ -489,8 +498,8 @@ Komentokehoite suoritetaan kun:
<source>&Abort</source>
<target>&Lopeta</target>
-<source>Synchronize...</source>
-<target>Täsmäytä...</target>
+<source>Synchronize</source>
+<target>Täsmäytä</target>
<source>Start synchronization</source>
<target>Käynnistä täsmäytys</target>
@@ -504,12 +513,12 @@ Komentokehoite suoritetaan kun:
<source>Swap sides</source>
<target>Puolten vaihto</target>
-<source>Save current configuration to file</source>
-<target>Tallenna nämä asetukset tiedostoon</target>
-
<source>Load configuration from file</source>
<target>Lataa asetuksia tiedostosta</target>
+<source>Save current configuration to file</source>
+<target>Tallenna nämä asetukset tiedostoon</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Viimeksi käytetty asetus (poista listalta paina DEL)</target>
@@ -519,14 +528,14 @@ Komentokehoite suoritetaan kun:
<source>Hide filtered or temporarily excluded files</source>
<target>Piilota suodatetut ja tilapäisesti poistetut</target>
-<source>Number of files and directories that will be created</source>
-<target>Kirjataan tiedostojen ja hakemistojen lukumäärää</target>
+<source>Number of files and folders that will be created</source>
+<target>Luotavien tiedostojen ja hakemistojen määrä</target>
<source>Number of files that will be overwritten</source>
-<target>Ylikirjoitettavien tiedostojen ja hakemistojen lukumäärä</target>
+<target>Korvattavien tiedostojen ja hakemistojen määrä</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Poistetaan tiedostojen ja hakemistojen lukumäärää</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Poistettavien tiedostojen ja hakemistojen määrä</target>
<source>Total amount of data that will be transferred</source>
<target>Siirrettävän datan määrä</target>
@@ -549,8 +558,8 @@ Komentokehoite suoritetaan kun:
<source>Batch job</source>
<target>Eräajo</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Luo eräajotiedosto automatisoidaksesi täsmäytyksen. Käynnistä tuplaklikkaamalla tai suorita komento: FreeFileSync.exe SyncJob.ffs_batch. Voit ajastaa eräajo Tehtävien ajoitus -toiminnolla.</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>Täsmäytyken automatisoinnen eräajotiedoston teko. Tehtävien ajoitus; Tuplaklikkaa tai ajoita tämä tiedosto: FreeFileSync.exe <job name>.ffs_batch</target>
<source>Help</source>
<target>Ohje</target>
@@ -576,21 +585,12 @@ Komentokehoite suoritetaan kun:
<source>Maximum number of log files:</source>
<target>Lokitiedostojen enimmäismäärä:</target>
-<source>Select log file directory:</source>
-<target>Lokitiedoston hakemisto:</target>
+<source>Select folder to save log files:</source>
+<target>Lokitiedostojen tallennushakemisto:</target>
<source>Batch settings</source>
<target>Eräajo asetukset</target>
-<source>&Save</source>
-<target>&Tallenna</target>
-
-<source>&Load</source>
-<target>&Lataa</target>
-
-<source>Cancel</source>
-<target>Lopeta</target>
-
<source>Select variant:</source>
<target>Valitse vaihtoehto:</target>
@@ -615,29 +615,23 @@ Komentokehoite suoritetaan kun:
<source>Configuration</source>
<target>Asetukset</target>
-<source>Category</source>
-<target>Luokka</target>
-
-<source>Action</source>
-<target>Suorita</target>
-
-<source>File/folder exists on left side only</source>
-<target>Tiedosto/hakemisto löytyy vain vasemmalta</target>
+<source>Item exists on left side only</source>
+<target>Kohde löytyy vain vasemmalta</target>
-<source>File/folder exists on right side only</source>
-<target>Tiedosto/hakemisto löytyy vain oiealta</target>
+<source>Item exists on right side only</source>
+<target>Kohde löytyy vain oikealta</target>
-<source>Left file is newer</source>
-<target>Vasen tiedosto uudempi</target>
+<source>Left side is newer</source>
+<target>Uudempi vasemmalla</target>
-<source>Right file is newer</source>
-<target>Oikea tiedosto uudempi</target>
+<source>Right side is newer</source>
+<target>Uudempi oikealla</target>
-<source>Files have different content</source>
-<target>Tiedostojen sisältö on erilaisia</target>
+<source>Items have different content</source>
+<target>Kohteilla eri sisältö</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Poikkeaman/tiedoston luokittelu ei onnistu</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Ristiriita, ei määriteltävissä</target>
<source>OK</source>
<target>OK</target>
@@ -714,9 +708,6 @@ on sama
<source>&Ignore</source>
<target>&Unohda</target>
-<source>&Retry</source>
-<target>&Uudestaan</target>
-
<source>Do not show this dialog again</source>
<target>Älä enää näytä valintaikkunaa</target>
@@ -747,33 +738,6 @@ Vain tiedostot, jotka vastaavat kaikkia suodattimen asetuksia synkronoidaan.
Huom: Tiedostojen nimet täytyy olla suhteessa pää hakemistoihin!
</target>
-<source>Hints:</source>
-<target>Vihje:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Anna tiedostojen tai hakemistojen suhteelliset nimet eroteltuina ';' tai rivivaihto</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Käytä jokerimerkkejä '*' ja '?' .</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Sulje tiedostoja pois suoraan pääikkunassa viitehakemiston avulla.</target>
-
-<source>Example</source>
-<target>Esimerkki</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Sisällytä : *.doc;*.zip;*.exe
-Sulje pois: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Täsmäytä kaikki .doc, .zip und .exe tiedostot paitsi kaikki hakemistossa "temp" olevat.</target>
-
<source>Include</source>
<target>Sisällytä</target>
@@ -795,8 +759,8 @@ Sulje pois: \stuff\temp\*
<source>&Default</source>
<target>&Vakio</target>
-<source>Transactional file copy</source>
-<target>Transaktio pohjainen kopiointi</target>
+<source>Fail-safe file copy</source>
+<target>Varmennettu tiedostokopiointi</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>Kirjoittaa ensin tilapäistiedostoon (*.ffs_tmp) ja nimeä sen uudestaan. Varmistaa eheyden myös Vakavan Virheen tapahtuessa.</target>
@@ -810,8 +774,8 @@ Sulje pois: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Kopioi tiedoston käyttöoikeuksia</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Siirrä tiedosto- ja hakemisto-oikeuksia (Vaatii Järjestelmävalvojan oikeuksia)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Kopioi tiedosto ja hakemisto käyttöoikeuksia (Pääkäyttäjän oikeudet tarvitaan)</target>
<source>Restore hidden dialogs</source>
<target>Palauta piilotetut ikkunat</target>
@@ -982,16 +946,16 @@ Sulje pois: \stuff\temp\*
<target>Näytä oikealta poistettavat tiedostot</target>
<source>Hide files that will be overwritten on left side</source>
-<target>Piilota tiedostot jotka ylikirjoitetaan vasemmalla</target>
+<target>Piilota tiedostot jotka korvataan vasemmalla</target>
<source>Show files that will be overwritten on left side</source>
-<target>Näytä vasemmalla ylikirjoitettavat tiedostot</target>
+<target>Näytä vasemmalla korvattavat tiedostot</target>
<source>Hide files that will be overwritten on right side</source>
-<target>Piilota tiedostot jotka ylikirjoitetaan oikealla</target>
+<target>Piilota tiedostot jotka korvataan oikealla</target>
<source>Show files that will be overwritten on right side</source>
-<target>Näytä oikealla ylikirjoitettavat tiedostot</target>
+<target>Näytä oikealla korvattavat tiedostot</target>
<source>Hide files that won't be copied</source>
<target>Piilota tiedostot jotka eivät kopioida</target>
@@ -1119,10 +1083,10 @@ Sulje pois: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Liitä ulkoinen sovellus viitekehysvalikkoon. Seuraavat makrot ovat valittavissa:</target>
-<source>- full file or directory name</source>
-<target>- tiedoston tai hakemiston koko nimi</target>
+<source>- full file or folder name</source>
+<target>- tiedoston/hakemiston koko nimi</target>
-<source>- directory part only</source>
+<source>- folder part only</source>
<target>- vain hakemisto-osa</target>
<source>- Other side's counterpart to %name</source>
@@ -1159,16 +1123,16 @@ Sulje pois: \stuff\temp\*
<target>Poista pysyvästi</target>
<source>Delete or overwrite files permanently</source>
-<target>Poista tai ylikirjoita tiedostoja pysyvästi</target>
+<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 ylikirjoitat tiedostoja</target>
+<target>Käytä Roskakoria kun poistat tai korvaat tiedostoja</target>
<source>Versioning</source>
<target>Versiointi</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Siirrä tiedostot aikaleimattuun hakemistoon</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>Siirrä tiedostot aikaleimattuun alihakemistoon</target>
<source>Files</source>
<target>Tiedostot</target>
@@ -1263,8 +1227,8 @@ Sulje pois: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Hakemisto %x ei voida lukea.</target>
-<source>Endless loop.</source>
-<target>Ääretön silmukka.</target>
+<source>Detected endless directory recursion.</source>
+<target>Päättymätön hakemiston toisto.</target>
<source>Cannot set privilege %x.</source>
<target>Oikeuksia %x ei voitu asettaa.</target>
@@ -1288,15 +1252,12 @@ Sulje pois: \stuff\temp\*
<target>Tiedostoa ei käsitelty viime täsmäyksessä!</target>
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
-<target>Aseta oletussuunta täsmäykselle: Vanhat tiedostot ylikirjoitetaan uudemilla tiedostoilla.</target>
-
-<source>The file does not contain a valid configuration:</source>
-<target>Asetustiedosto ei ole kelvollinen:</target>
+<target>Aseta oletussuunta täsmäykselle: Vanhat tiedostot korvataan uudemilla tiedostoilla.</target>
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Jätää virhe huomiotta ja tulkitse hakemisto tyhjäksi.</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>
-<source>Cannot find directory %x.</source>
+<source>Cannot find folder %x.</source>
<target>Hakemisto %x ei löydy.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
@@ -1329,20 +1290,20 @@ Sulje pois: \stuff\temp\*
<source>Both sides are equal</source>
<target>Puolet ovat identtiset</target>
-<source>Files/folders differ in attributes only</source>
-<target>Tiedostot/hakemistot eroavat vain ominaisuuksiltaan</target>
+<source>Items have different attributes</source>
+<target>Kohteilla poikkeavat ominaisuudet</target>
-<source>Copy new file/folder to left</source>
-<target>Kopioi uusi tiedosto/hakemisto vasemmalle</target>
+<source>Copy new item to left</source>
+<target>Monista uusi vasemmalle</target>
-<source>Copy new file/folder to right</source>
-<target>Kopioi uusi tiedosto/hakemisto oikealle</target>
+<source>Copy new item to right</source>
+<target>Monista uusi oikealle</target>
-<source>Delete left file/folder</source>
-<target>Poista tiedosto/hakemisto vasemmalta</target>
+<source>Delete left item</source>
+<target>Poista vasen</target>
-<source>Delete right file/folder</source>
-<target>Poista tiedosto/hakemisto oikealta</target>
+<source>Delete right item</source>
+<target>Poista oikea</target>
<source>Move file on left</source>
<target>Siirä vasen tiedosto</target>
@@ -1350,20 +1311,20 @@ Sulje pois: \stuff\temp\*
<source>Move file on right</source>
<target>Siirrä oikea tiedosto</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Ylikirjoita vasen tiedosto/hakemista oikealla olevalla</target>
+<source>Overwrite left item</source>
+<target>Korvaa vasen</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Ylikirjoita oikea tiedosto/hakemista vasemmalla olevalla</target>
+<source>Overwrite right item</source>
+<target>Korvaa oikea</target>
<source>Do nothing</source>
<target>Älä tee mitään</target>
-<source>Copy file attributes only to left</source>
-<target>Monista tiedosto-ominaisuudet vasemmalle</target>
+<source>Update attributes on left</source>
+<target>Päivitä oikeudet vasemmalla</target>
-<source>Copy file attributes only to right</source>
-<target>Monista tiedosto-ominaisuudet oikealle</target>
+<source>Update attributes on right</source>
+<target>Päivitä oikeudet oikealla</target>
<source>Multiple...</source>
<target>Moninkertainen...</target>
@@ -1416,11 +1377,11 @@ Sulje pois: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Päivitän %x:n ominaisuudet</target>
-<source>Target directory name must not be empty!</source>
-<target>Kohdehakemiston nimi ei saa olla tyhjä!</target>
+<source>Target folder name must not be empty.</source>
+<target>Kohdehakemistolla on oltava nimi.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Tiedostoversioinnin hakemisto on antamatta!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Versioinnin kohdehakemistolla on oltava nimi.</target>
<source>Source directory %x not found.</source>
<target>Lähdehakemisto %x ei löydy.</target>
@@ -1449,14 +1410,17 @@ Sulje pois: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Yksi moniosaisen hakemistoparin hakemisto muutetaan! Tarkista täsmäysasetuksia!</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>Generating database...</source>
-<target>Luodaan tietokantaa...</target>
+<target>
+Tietokanta luodaan.
+..
+</target>
<source>Data verification error: Source and target file have different content!</source>
<target>Tiedon varmennusvirhe: Lähteellä ja kohteella on eri sisältö!</target>
diff --git a/BUILD/Languages/french.lng b/BUILD/Languages/french.lng
index 2fca8158..65759025 100644
--- a/BUILD/Languages/french.lng
+++ b/BUILD/Languages/french.lng
@@ -7,8 +7,8 @@
<plural definition>n <= 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Recherche du répertoire %x...</target>
+<source>Searching for folder %x...</source>
+<target>Recherche du dossier %x...</target>
<source>Show in Explorer</source>
<target>Montrer dans l'explorateur</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Synchronisation Automatisée</target>
+<source>Error</source>
+<target>Erreur</target>
+
<source>Select alternate comparison settings</source>
<target>Choisir d'autres paramètres de comparaison</target>
<source>Select alternate synchronization settings</source>
<target>Sélectionner une autre configuration de la synchronisation</target>
-<source>No filter selected</source>
-<target>Aucun filtre sélectionné</target>
-
<source>Filter is active</source>
<target>Le filtre est actif</target>
+<source>No filter selected</source>
+<target>Aucun filtre sélectionné</target>
+
<source>Remove alternate settings</source>
<target>Supprimer les paramètres de rechange</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>A propos de</target>
-<source>Error</source>
-<target>Erreur</target>
-
<source>Warning</source>
<target>Attention</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Paramètres généraux</target>
-<source>Synchronization Preview</source>
-<target>Prévisualisation de la Synchronisation</target>
+<source>Summary</source>
+<target>Résumé</target>
<source>Find</source>
<target>Chercher</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Parcourir</target>
-<source>Invalid command line: %x</source>
-<target>Ligne de commande incorrecte : %x</target>
+<source>Invalid command line:</source>
+<target>Ligne de commande incorrecte :</target>
<source>Info</source>
<target>Info</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Le nom de volume %x ne fait pas partie du nom de fichier %y !</target>
-<source>Cannot find file %x.</source>
-<target>Impossible de trouver le fichier %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Impossible de lire les données XML suivantes :</target>
-<source>S&ave configuration...</source>
-<target>S&auvegarder la configuration...</target>
+<source>Cannot find file %x.</source>
+<target>Impossible de trouver le fichier %x.</target>
-<source>&Load configuration...</source>
-<target>&Charger la configuration...</target>
+<source>&Open...</source>
+<target>&Ouvrir...</target>
+
+<source>&Save...</source>
+<target>&Sauvegarder...</target>
<source>&Quit</source>
<target>&Quitter</target>
-<source>&File</source>
-<target>&Fichier</target>
+<source>&Program</source>
+<target>&Actions</target>
<source>&Content</source>
<target>&Contenu</target>
-<source>&About...</source>
-<target>&A propos de...</target>
+<source>&About</source>
+<target>&A propos de</target>
<source>&Help</source>
<target>&Aide</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Utilisation :</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Sélectionner les répertoires à surveiller.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Choisir les dossiers à examiner.</target>
<source>2. Enter a command line.</source>
<target>2. Entrez une ligne de commande.</target>
@@ -265,19 +265,11 @@
<source>3. Press 'Start'.</source>
<target>3. Cliquez sur 'Démarrer'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-La ligne de commande est exécutée chaque fois que :
-- tous les répertoires deviennent accessibles (par exemple, lors de l'insertion d'une clé USB)
-- les fichiers de ces répertoires ou sous-répertoires sont modifiés
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Pour démarrer il faur importer un fichier .ffs_batch.</target>
-<source>Directories to watch</source>
-<target>Réperoires à surveiller</target>
+<source>Folders to watch</source>
+<target>Dossiers à examiner</target>
<source>Add folder</source>
<target>Ajout d'un dossier</target>
@@ -288,18 +280,35 @@ La ligne de commande est exécutée chaque fois que :
<source>Select a folder</source>
<target>Choisissez un dossier</target>
+<source>Delay [seconds]</source>
+<target>Latence [secondes]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Délai entre le dernier changement détecté et la dernière exécution de la commande</target>
+
<source>Command line</source>
<target>Ligne de commande</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Délai minimum (secondes)</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Temps mort entre la détection de la dernière modification et l'éxécution de la ligne de commande en secondes</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+La commande est déclenchée si :
+- un fichier ou un dossier est modifié
+- un nouveau dossier apparait (par exemple : insertion d'une clé USB)
+</target>
<source>Start</source>
<target>Démarrer</target>
+<source>&Retry</source>
+<target>&Réessayer</target>
+
+<source>Cancel</source>
+<target>Annuler</target>
+
<source>(Build: %x)</source>
<target>(Généré : %x)</target>
@@ -318,8 +327,8 @@ La ligne de commande est exécutée chaque fois que :
<source>Waiting for missing directories...</source>
<target>En attente des répertoires absents ...</target>
-<source>A directory input field is empty.</source>
-<target>Un champ répertoire est vide</target>
+<source>An input folder name is empty.</source>
+<target>Le nom d'un dossier entré est vide.</target>
<source>Logging</source>
<target>Connexion</target>
@@ -405,8 +414,8 @@ La ligne de commande est exécutée chaque fois que :
<source><Symlink></source>
<target><Lien_symbolique></target>
-<source><Directory></source>
-<target><Répertoire></target>
+<source><Folder></source>
+<target><Dossier></target>
<source>Full path</source>
<target>Chemin complet</target>
@@ -417,8 +426,8 @@ La ligne de commande est exécutée chaque fois que :
<source>Relative path</source>
<target>Chemin relatif</target>
-<source>Directory</source>
-<target>Répertoire</target>
+<source>Base folder</source>
+<target>Dossier de base</target>
<source>Size</source>
<target>Taille</target>
@@ -429,8 +438,11 @@ La ligne de commande est exécutée chaque fois que :
<source>Extension</source>
<target>Extension</target>
-<source>Comparison Result</source>
-<target>Résultat de la comparaison</target>
+<source>Action</source>
+<target>Action</target>
+
+<source>Category</source>
+<target>Catégorie</target>
<source>Drag && drop</source>
<target>Glisser && Déposer</target>
@@ -438,14 +450,14 @@ La ligne de commande est exécutée chaque fois que :
<source>Close progress dialog</source>
<target>Fermer la fenêtre de progression</target>
-<source>Shut down</source>
-<target>Arrêter</target>
+<source>Standby</source>
+<target>Pause</target>
<source>Log off</source>
<target>Quitter</target>
-<source>Standby</source>
-<target>Pause</target>
+<source>Shut down</source>
+<target>Arrêter</target>
<source>Hibernate</source>
<target>Figer</target>
@@ -453,15 +465,12 @@ La ligne de commande est exécutée chaque fois que :
<source>1. &Compare</source>
<target>1. &Comparer</target>
-<source>2. &Synchronize...</source>
-<target>2. &Synchroniser...</target>
+<source>2. &Synchronize</source>
+<target>2. &Synchroniser</target>
<source>&New</source>
<target>&Nouveau</target>
-<source>&Program</source>
-<target>&Actions</target>
-
<source>&Language</source>
<target>&Langue</target>
@@ -489,8 +498,8 @@ La ligne de commande est exécutée chaque fois que :
<source>&Abort</source>
<target>&Abandonner</target>
-<source>Synchronize...</source>
-<target>Synchroniser...</target>
+<source>Synchronize</source>
+<target>Synchroniser</target>
<source>Start synchronization</source>
<target>Démarrer la synchronisation</target>
@@ -504,12 +513,12 @@ La ligne de commande est exécutée chaque fois que :
<source>Swap sides</source>
<target>Permuter les côtés</target>
-<source>Save current configuration to file</source>
-<target>Enregistrer la configuration actuelle</target>
-
<source>Load configuration from file</source>
<target>Charger la configuration à partir du fichier</target>
+<source>Save current configuration to file</source>
+<target>Enregistrer la configuration actuelle</target>
+
<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>
@@ -519,14 +528,14 @@ La ligne de commande est exécutée chaque fois que :
<source>Hide filtered or temporarily excluded files</source>
<target>Masquer les fichiers filtrés ou exclus temporairement</target>
-<source>Number of files and directories that will be created</source>
-<target>Nombre de fichiers et de répertoires qui seront créés</target>
+<source>Number of files and folders that will be created</source>
+<target>Nombre de fichiers et de dossiers qui seront créés</target>
<source>Number of files that will be overwritten</source>
<target>Nombre de fichiers qui seront remplacés</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Nombre de fichiers et de répertoires qui seront supprimés</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Nombre de fichiers et de dossiers qui seront supprimés</target>
<source>Total amount of data that will be transferred</source>
<target>Volume de données à transférer</target>
@@ -549,8 +558,8 @@ La ligne de commande est exécutée chaque fois que :
<source>Batch job</source>
<target>Traitement batch</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Crée un fichier batch et une synchronisation automatique. Pour démarrer en mode batch double-cliquez sur ce fichier ou exécutez la commande : FreeFileSync.exe SyncJob.ffs_batch. Vous pouvez aussi utilisez le planificateur de tâches de votre système.</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>
<source>Help</source>
<target>Aide</target>
@@ -576,21 +585,12 @@ La ligne de commande est exécutée chaque fois que :
<source>Maximum number of log files:</source>
<target>Nombre maximum de fichiers Log</target>
-<source>Select log file directory:</source>
-<target>Choisissez un dossier pour le fichier .log :</target>
+<source>Select folder to save log files:</source>
+<target>Choisissez un dossier pour sauvegarder les fichiers log :</target>
<source>Batch settings</source>
<target>Configuration du traitement batch</target>
-<source>&Save</source>
-<target>&Sauvegarder</target>
-
-<source>&Load</source>
-<target>&Charger</target>
-
-<source>Cancel</source>
-<target>Annuler</target>
-
<source>Select variant:</source>
<target>Choisissez une variante :</target>
@@ -615,29 +615,23 @@ La ligne de commande est exécutée chaque fois que :
<source>Configuration</source>
<target>Configuration</target>
-<source>Category</source>
-<target>Catégorie</target>
-
-<source>Action</source>
-<target>Action</target>
-
-<source>File/folder exists on left side only</source>
-<target>Fichier/Dossier existant seulement à gauche</target>
+<source>Item exists on left side only</source>
+<target>Cet élément existe seulement à gauche</target>
-<source>File/folder exists on right side only</source>
-<target>Fichier/Dossier existant seulement à droite</target>
+<source>Item exists on right side only</source>
+<target>Cet élément existe seulement à droite</target>
-<source>Left file is newer</source>
-<target>Le fichier à gauche est nouveau</target>
+<source>Left side is newer</source>
+<target>L'élément de gauche est plus récent</target>
-<source>Right file is newer</source>
-<target>Le fichier à droite est nouveau</target>
+<source>Right side is newer</source>
+<target>L'élément de droite est plus récent</target>
-<source>Files have different content</source>
-<target>Les fichiers ont un contenu différent</target>
+<source>Items have different content</source>
+<target>Les élement ont un contenu différent</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Conflit ou fichier indéterminé</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Conflit/élément impossible à classer</target>
<source>OK</source>
<target>OK</target>
@@ -714,9 +708,6 @@ est identique
<source>&Ignore</source>
<target>&Ignorer</target>
-<source>&Retry</source>
-<target>&Réessayer</target>
-
<source>Do not show this dialog again</source>
<target>Ne plus afficher ce message la prochaine fois</target>
@@ -747,33 +738,6 @@ Seuls les fichiers correspondant à tous les paramètres de filtrage seront sync
Attention : les noms de fichiers doivent être relatifs aux répertoires de base !
</target>
-<source>Hints:</source>
-<target>Conseils :</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Entrez les noms relatifs des fichiers ou des répertoires séparés par un ';' ou par un passage à la ligne.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Les caractères génériques '*' et '?' sont acceptés.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Exclure les fichiers directement sur le tableau principal à l'aide du menu contextuel.</target>
-
-<source>Example</source>
-<target>Exemple</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Synchroniser tous les fichiers .doc, .zip et .exe sauf ceux du dossier "temp".</target>
-
<source>Include</source>
<target>Inclure</target>
@@ -795,8 +759,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>&Défaut</target>
-<source>Transactional file copy</source>
-<target>Copie de fichiers transactionnelle</target>
+<source>Fail-safe file copy</source>
+<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>
@@ -810,8 +774,8 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Copie des droits d'accès aux fichiers</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Transfert des attributs système des fichiers et des répertoires (avec les droits administrateur)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Transférer les permissions des fichiers et des dossiers (Nécessite les droits administrateur)</target>
<source>Restore hidden dialogs</source>
<target>Afficher les boîtes de dialogue masquées</target>
@@ -1119,11 +1083,11 @@ Exclude: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Inclure les applications externes dans le menu contextuel. Les macros suivantes sont disponibles :</target>
-<source>- full file or directory name</source>
-<target>- nom complet du fichier ou du répertoire</target>
+<source>- full file or folder name</source>
+<target>- nom du fichier ou du dossier complet</target>
-<source>- directory part only</source>
-<target>- seulement les répertoires</target>
+<source>- folder part only</source>
+<target>- Partie dossier seulement</target>
<source>- Other side's counterpart to %name</source>
<target>- équivalent de %name de l'autre côté</target>
@@ -1167,8 +1131,8 @@ Exclude: \stuff\temp\*
<source>Versioning</source>
<target>Choisir un dossier</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Déplacer les fichiers vers un sous-répertoire daté</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>
@@ -1263,8 +1227,8 @@ Exclude: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Impossible de lire le répertoire %x.</target>
-<source>Endless loop.</source>
-<target>Boucle infinie.</target>
+<source>Detected endless directory recursion.</source>
+<target>Une boucle sans fin détectée dans un répertoire.</target>
<source>Cannot set privilege %x.</source>
<target>Impossible de fixer le privilège %x.</target>
@@ -1290,14 +1254,11 @@ Exclude: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Le fichier ne contient pas de configuration valide :</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Vous pouvez ignorer cette erreur en considérant le répertoire comme vide.</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>
-<source>Cannot find directory %x.</source>
-<target>Impossible de trouver le répertoire %x.</target>
+<source>Cannot find folder %x.</source>
+<target>Impossible de trouver le dossier %x.</target>
<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>
@@ -1329,20 +1290,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>Les deux cotés sont identiques</target>
-<source>Files/folders differ in attributes only</source>
-<target>Fichiers/Dossiers différant seulement par leurs attributs</target>
+<source>Items have different attributes</source>
+<target>Les éléments ont des attributs différents</target>
-<source>Copy new file/folder to left</source>
-<target>Copier les nouveaux fichiers/dossiers à gauche</target>
+<source>Copy new item to left</source>
+<target>Copie du nouvel élément à gauche</target>
-<source>Copy new file/folder to right</source>
-<target>Copier les nouveaux fichiers/dossiers à droite</target>
+<source>Copy new item to right</source>
+<target>Copie du nouvel élément à droite</target>
-<source>Delete left file/folder</source>
-<target>Supprimer les fichiers/dossiers de gauche</target>
+<source>Delete left item</source>
+<target>Suppression de l'élément de gauche</target>
-<source>Delete right file/folder</source>
-<target>Supprimer les fichiers/dossiers de droite</target>
+<source>Delete right item</source>
+<target>Suppression de l'élément de droite</target>
<source>Move file on left</source>
<target>Déplacer les fichiers à gauche</target>
@@ -1350,20 +1311,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>Déplacer les fichiers à droite</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Remplacer le fichier/dossier de gauche avec celui de droite</target>
+<source>Overwrite left item</source>
+<target>Remplacement de l'élément de gauche</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Remplacer le fichier/dossier de droite avec celui de gauche</target>
+<source>Overwrite right item</source>
+<target>Remplacement de l'élément de droite</target>
<source>Do nothing</source>
<target>Ne rien faire</target>
-<source>Copy file attributes only to left</source>
-<target>Copier seulement les attributs du fichier à gauche</target>
+<source>Update attributes on left</source>
+<target>Mise à jour des attributs à gauche</target>
-<source>Copy file attributes only to right</source>
-<target>Copier seulement les attributs du fichier à droite</target>
+<source>Update attributes on right</source>
+<target>Mise à jour des attributs à droite</target>
<source>Multiple...</source>
<target>Multiple...</target>
@@ -1416,11 +1377,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Mise à jour des attributs de %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Le répertoire destination ne doit pas être vide !</target>
+<source>Target folder name must not be empty.</source>
+<target>Le nom du dossier Destination ne doit pas etre vide.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Le répertoire des versions de fichiers n'a pas été indiqué !</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Le nom du dossier Version ne doit pas être vide.</target>
<source>Source directory %x not found.</source>
<target>Impossible de trouver le répertoire source %x.</target>
@@ -1449,8 +1410,8 @@ Exclude: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Un répertoire faisant partie de paires multiples doit être modifié ! Vérifiez les paramètres de la synchronisation !</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>
diff --git a/BUILD/Languages/german.lng b/BUILD/Languages/german.lng
index 96ebaf75..78f2c847 100644
--- a/BUILD/Languages/german.lng
+++ b/BUILD/Languages/german.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Suche Verzeichnis %x...</target>
+<source>Searching for folder %x...</source>
+<target>Suche Ordner %x...</target>
<source>Show in Explorer</source>
<target>Im Explorer anzeigen</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automatisierte Synchronisation</target>
+<source>Error</source>
+<target>Fehler</target>
+
<source>Select alternate comparison settings</source>
<target>Alternative Vergleichseinstellungen auswählen</target>
<source>Select alternate synchronization settings</source>
<target>Alternative Synchronisationseinstellungen auswählen</target>
-<source>No filter selected</source>
-<target>Kein Filter gesetzt</target>
-
<source>Filter is active</source>
<target>Filter ist aktiv</target>
+<source>No filter selected</source>
+<target>Kein Filter gesetzt</target>
+
<source>Remove alternate settings</source>
<target>Alternative Einstellungen entfernen</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>Ãœber</target>
-<source>Error</source>
-<target>Fehler</target>
-
<source>Warning</source>
<target>Warnung</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Globale Einstellungen</target>
-<source>Synchronization Preview</source>
-<target>Synchronisationsvorschau</target>
+<source>Summary</source>
+<target>Zusammenfassung</target>
<source>Find</source>
<target>Suchen</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Auswählen</target>
-<source>Invalid command line: %x</source>
-<target>Ungültige Befehlszeile: %x</target>
+<source>Invalid command line:</source>
+<target>Ungültige Befehlszeile:</target>
<source>Info</source>
<target>Info</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Laufwerksname %x ist kein Teil des Dateinamens %y!</target>
-<source>Cannot find file %x.</source>
-<target>Die Datei %x wurde nicht gefunden.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Die folgenden XML-Elemente können nicht gelesen werden:</target>
-<source>S&ave configuration...</source>
-<target>Konfiguration s&peichern...</target>
+<source>Cannot find file %x.</source>
+<target>Die Datei %x wurde nicht gefunden.</target>
+
+<source>&Open...</source>
+<target>Ö&ffnen...</target>
-<source>&Load configuration...</source>
-<target>Konfiguration &laden...</target>
+<source>&Save...</source>
+<target>&Speichern...</target>
<source>&Quit</source>
<target>&Beenden</target>
-<source>&File</source>
-<target>&Datei</target>
+<source>&Program</source>
+<target>&Programm</target>
<source>&Content</source>
<target>&Inhalt</target>
-<source>&About...</source>
-<target>&Ãœber...</target>
+<source>&About</source>
+<target>&Ãœber</target>
<source>&Help</source>
<target>&Hilfe</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Verwendung:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Zu überwachende Verzeichnisse wählen.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Zu überwachende Ordner wählen.</target>
<source>2. Enter a command line.</source>
<target>2. Eine Befehlszeile angeben.</target>
@@ -265,46 +265,55 @@
<source>3. Press 'Start'.</source>
<target>3. 'Start' drücken.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Die Befehlszeile wird ausgeführt wenn:
-- alle Verzeichnisse verfügbar werden (z.B. beim Anschluss eines USB Sticks)
-- Dateien innerhalb dieser Verzeichnisse oder Unterverzeichnisse geändert werden
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Zum Schnelleinstieg einfach eine .ffs_batch Datei importieren.</target>
-<source>Directories to watch</source>
-<target>Zu überwachende Verzeichnisse</target>
+<source>Folders to watch</source>
+<target>Zu überwachende Ordner</target>
<source>Add folder</source>
-<target>Verzeichnis hinzufügen</target>
+<target>Ordner hinzufügen</target>
<source>Remove folder</source>
-<target>Verzeichnis entfernen</target>
+<target>Ordner entfernen</target>
<source>Select a folder</source>
-<target>Verzeichnis auswählen</target>
+<target>Ordner auswählen</target>
+
+<source>Delay [seconds]</source>
+<target>Verzögerung [Sekunden]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Ruhezeit zwischen der letzten erkannten Änderung und dem Aufruf der Befehlszeile</target>
<source>Command line</source>
<target>Befehlszeile</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimale Ruhezeit [Sekunden]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Ruhezeit zwischen Erkennung der letzten Änderung und Aufrufen der Kommandozeile in Sekunden</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Die Befehlszeile wird ausgelöst wenn:
+- Dateien oder Unterordner sich ändern
+- neue Ordner erscheinen (z.B. Anschluss eines USB Sticks)
+</target>
<source>Start</source>
<target>Start</target>
+<source>&Retry</source>
+<target>&Wiederholen</target>
+
+<source>Cancel</source>
+<target>Abbrechen</target>
+
<source>(Build: %x)</source>
<target>(Build: %x)</target>
-<source>RealtimeSync configuration</source>
-<target>RealtimeSync Konfiguration</target>
+<source>All files</source>
+<target>Alle Dateien</target>
<source>&Restore</source>
<target>&Wiederherstellen</target>
@@ -318,8 +327,8 @@ Die Befehlszeile wird ausgeführt wenn:
<source>Waiting for missing directories...</source>
<target>Warte auf fehlende Verzeichnisse...</target>
-<source>A directory input field is empty.</source>
-<target>Ein Verzeichniseingabefeld ist leer.</target>
+<source>An input folder name is empty.</source>
+<target>Der Name eines Eingabeordners ist leer.</target>
<source>Logging</source>
<target>Protokoll</target>
@@ -345,9 +354,6 @@ Die Befehlszeile wird ausgeführt wenn:
<source>FreeFileSync batch file</source>
<target>FreeFileSync Batchdatei</target>
-<source>FreeFileSync configuration</source>
-<target>FreeFileSync Konfiguration</target>
-
<source>Batch execution</source>
<target>Batchlauf</target>
@@ -390,12 +396,12 @@ Die Befehlszeile wird ausgeführt wenn:
<source>Download now?</source>
<target>Jetzt herunterladen?</target>
-<source>Information</source>
-<target>Information</target>
-
<source>FreeFileSync is up to date!</source>
<target>FreeFileSync ist auf dem neuesten Stand!</target>
+<source>Information</source>
+<target>Information</target>
+
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
<target>Soll FreeFileSync automatisch jede Woche nach Aktualisierungen suchen?</target>
@@ -405,8 +411,8 @@ Die Befehlszeile wird ausgeführt wenn:
<source><Symlink></source>
<target><Symlink></target>
-<source><Directory></source>
-<target><Verzeichnis></target>
+<source><Folder></source>
+<target><Ordner></target>
<source>Full path</source>
<target>Absoluter Pfad</target>
@@ -417,8 +423,8 @@ Die Befehlszeile wird ausgeführt wenn:
<source>Relative path</source>
<target>Relativer Pfad</target>
-<source>Directory</source>
-<target>Verzeichnis</target>
+<source>Base folder</source>
+<target>Basisordner</target>
<source>Size</source>
<target>Größe</target>
@@ -429,8 +435,11 @@ Die Befehlszeile wird ausgeführt wenn:
<source>Extension</source>
<target>Dateiendung</target>
-<source>Comparison Result</source>
-<target>Ergebnis des Vergleichs</target>
+<source>Action</source>
+<target>Aktion</target>
+
+<source>Category</source>
+<target>Kategorie</target>
<source>Drag && drop</source>
<target>Drag && Drop</target>
@@ -438,14 +447,14 @@ Die Befehlszeile wird ausgeführt wenn:
<source>Close progress dialog</source>
<target>Schließe Fortschrittsdialog</target>
-<source>Shut down</source>
-<target>Herunterfahren</target>
+<source>Standby</source>
+<target>Energie sparen</target>
<source>Log off</source>
<target>Abmelden</target>
-<source>Standby</source>
-<target>Energie sparen</target>
+<source>Shut down</source>
+<target>Herunterfahren</target>
<source>Hibernate</source>
<target>Ruhezustand</target>
@@ -453,15 +462,12 @@ Die Befehlszeile wird ausgeführt wenn:
<source>1. &Compare</source>
<target>1. &Vergleichen</target>
-<source>2. &Synchronize...</source>
-<target>2. &Synchronisieren...</target>
+<source>2. &Synchronize</source>
+<target>2. &Synchronisieren</target>
<source>&New</source>
<target>&Neu</target>
-<source>&Program</source>
-<target>&Programm</target>
-
<source>&Language</source>
<target>&Sprache</target>
@@ -489,27 +495,27 @@ Die Befehlszeile wird ausgeführt wenn:
<source>&Abort</source>
<target>&Abbrechen</target>
-<source>Synchronize...</source>
+<source>Synchronize</source>
<target>Synchronisieren</target>
<source>Start synchronization</source>
<target>Synchronisation starten</target>
<source>Add folder pair</source>
-<target>Verzeichnispaar hinzufügen</target>
+<target>Ordnerpaar hinzufügen</target>
<source>Remove folder pair</source>
-<target>Verzeichnispaar entfernen</target>
+<target>Ordnerpaar entfernen</target>
<source>Swap sides</source>
<target>Seiten vertauschen</target>
-<source>Save current configuration to file</source>
-<target>Aktuelle Konfiguration in Datei speichern</target>
-
<source>Load configuration from file</source>
<target>Konfiguration aus Datei laden</target>
+<source>Save current configuration to file</source>
+<target>Aktuelle Konfiguration in Datei speichern</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Zuletzt benutzte Konfigurationen (Entf-Taste löscht Einträge)</target>
@@ -519,21 +525,18 @@ Die Befehlszeile wird ausgeführt wenn:
<source>Hide filtered or temporarily excluded files</source>
<target>Gefilterte oder temporär ausgeschlossene Dateien ausblenden</target>
-<source>Number of files and directories that will be created</source>
-<target>Anzahl der zu erstellenden Dateien und Verzeichnisse</target>
+<source>Number of files and folders that will be created</source>
+<target>Anzahl der zu erstellenden Dateien und Ordner</target>
<source>Number of files that will be overwritten</source>
<target>Anzahl der zu überschreibenden Dateien</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Anzahl der zu löschenden Dateien und Verzeichnisse</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Anzahl der zu löschenden Dateien und Ordner</target>
<source>Total amount of data that will be transferred</source>
<target>Gesamtmenge der zu übertragenden Daten</target>
-<source>Operation:</source>
-<target>Vorgang:</target>
-
<source>Items found:</source>
<target>Gefundene Elemente:</target>
@@ -549,8 +552,8 @@ Die Befehlszeile wird ausgeführt wenn:
<source>Batch job</source>
<target>Batch-Job</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Erzeuge eine Batchdatei für die automatisierte Synchronisation. Um den Batchmodus zu starten, einfach auf diese Datei doppelklicken oder den Befehl ausführen: FreeFileSync.exe SyncJob.ffs_batch. Dies kann auch in den Taskplaner des Betriebssystems eingetragen werden.</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>Erstellt eine Batchdatei für die automatisierte Synchronisation. Anschließend die Datei doppelklicken oder in den Taskplaner des Betriebssystems eintragen: FreeFileSync.exe <Jobname>.ffs_batch.</target>
<source>Help</source>
<target>Hilfe</target>
@@ -576,21 +579,12 @@ Die Befehlszeile wird ausgeführt wenn:
<source>Maximum number of log files:</source>
<target>Maximale Anzahl an Logdateien:</target>
-<source>Select log file directory:</source>
-<target>Verzeichnis für Logdatei wählen:</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>&Save</source>
-<target>&Speichern</target>
-
-<source>&Load</source>
-<target>&Laden</target>
-
-<source>Cancel</source>
-<target>Abbrechen</target>
-
<source>Select variant:</source>
<target>Variante auswählen:</target>
@@ -598,10 +592,10 @@ Die Befehlszeile wird ausgeführt wenn:
<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 Verzeichnisses erstellen. Das rechte Verzeichnis wird dem linken exakt angeglichen.</target>
+<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 vom linken in das rechte Verzeichnis kopieren.</target>
+<target>Neue oder aktualisierte Dateien vom linken in den rechten Ordner kopieren.</target>
<source>Configure your own synchronization rules.</source>
<target>Eigene Synchronisationsregeln definieren.</target>
@@ -615,29 +609,23 @@ Die Befehlszeile wird ausgeführt wenn:
<source>Configuration</source>
<target>Konfiguration</target>
-<source>Category</source>
-<target>Kategorie</target>
+<source>Item exists on left side only</source>
+<target>Element existiert nur links</target>
-<source>Action</source>
-<target>Aktion</target>
-
-<source>File/folder exists on left side only</source>
-<target>Datei/Ordner existiert nur links</target>
-
-<source>File/folder exists on right side only</source>
-<target>Datei/Ordner existiert nur rechts</target>
+<source>Item exists on right side only</source>
+<target>Element existiert nur rechts</target>
-<source>Left file is newer</source>
-<target>Linke Datei ist neuer</target>
+<source>Left side is newer</source>
+<target>Linke Seite ist neuer</target>
-<source>Right file is newer</source>
-<target>Rechte Datei ist neuer</target>
+<source>Right side is newer</source>
+<target>Rechte Seite ist neuer</target>
-<source>Files have different content</source>
-<target>Dateien haben unterschiedlichen Inhalt</target>
+<source>Items have different content</source>
+<target>Elemente haben unterschiedlichen Inhalt</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Konflikt/Datei, die nicht eingeordnet werden kann</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Konflikt/Element, das nicht eingeordnet werden kann</target>
<source>OK</source>
<target>OK</target>
@@ -714,9 +702,6 @@ gleich ist
<source>&Ignore</source>
<target>&Ignorieren</target>
-<source>&Retry</source>
-<target>&Wiederholen</target>
-
<source>Do not show this dialog again</source>
<target>Diesen Dialog nicht mehr anzeigen</target>
@@ -747,33 +732,6 @@ Nur Dateien, die zu allen Filtereinstellungen passen, werden synchronisiert.
Achtung: Dateinamen müssen relativ zu den Basisverzeichnissen sein!
</target>
-<source>Hints:</source>
-<target>Tipps:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Relative Datei- oder Verzeichnisnamen getrennt durch ';' oder eine Neuzeile eingeben.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Die Platzhalter '*' und '?' werden unterstützt.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Dateien können direkt über das Kontextmenü im Hauptfenster ausgeschlossen werden.</target>
-
-<source>Example</source>
-<target>Beispiel</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Einschließen: *.doc;*.zip;*.exe
-Ausschließen: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Alle .doc, .zip und .exe Dateien mit Ausnahme des Unterordners "temp" werden synchronisiert.</target>
-
<source>Include</source>
<target>Einschließen</target>
@@ -795,8 +753,8 @@ Ausschließen: \stuff\temp\*
<source>&Default</source>
<target>&Standard</target>
-<source>Transactional file copy</source>
-<target>Dateien als Transaktion kopieren</target>
+<source>Fail-safe file copy</source>
+<target>Dateien ausfallsicher kopieren</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>Schreibe zunächst in eine temporäre Datei (*.ffs_tmp) und benenne diese anschließend um. Dadurch wird ein konsistenter Status auch im größten Fehlerfall sichergestellt.</target>
@@ -810,8 +768,8 @@ Ausschließen: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Dateizugriffsberechtigungen kopieren</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Übertrage Datei- und Verzeichnisberechtigungen (Benötigt Administratorrechte)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Übertrage Datei- und Ordnerberechtigungen (Benötigt Administratorrechte)</target>
<source>Restore hidden dialogs</source>
<target>Versteckte Dialoge wiederherstellen</target>
@@ -844,7 +802,7 @@ Ausschließen: \stuff\temp\*
<target>Hauptleiste</target>
<source>Folder pairs</source>
-<target>Verzeichnispaare</target>
+<target>Ordnerpaare</target>
<source>Overview</source>
<target>Ãœbersicht</target>
@@ -913,7 +871,7 @@ Ausschließen: \stuff\temp\*
<target>Konfiguration geladen!</target>
<source>Folder Comparison and Synchronization</source>
-<target>Verzeichnisvergleich und Synchronisation</target>
+<target>Ordnervergleich und Synchronisation</target>
<source>Hide files that exist on left side only</source>
<target>Nur links existierende Dateien ausblenden</target>
@@ -1119,11 +1077,11 @@ Ausschließen: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integriert externe Anwendungen in das Kontextmenü. Die folgenden Makros stehen zur Verfügung:</target>
-<source>- full file or directory name</source>
-<target>- kompletter Datei oder Verzeichnisname</target>
+<source>- full file or folder name</source>
+<target>- kompletter Datei oder Ordnername</target>
-<source>- directory part only</source>
-<target>- nur Verzeichnisanteil</target>
+<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>
@@ -1167,8 +1125,8 @@ Ausschließen: \stuff\temp\*
<source>Versioning</source>
<target>Versionierung</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Verschiebe Dateien in ein Unterverzeichnis mit Zeitstempel</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>
@@ -1233,6 +1191,9 @@ Ausschließen: \stuff\temp\*
<source>Cannot write modification time of %x.</source>
<target>Die Änderungszeit von %x kann nicht geschrieben werden.</target>
+<source>Cannot write file attributes of %x.</source>
+<target>Die Dateiattribute von %x können nicht geschrieben werden.</target>
+
<source>Cannot find system function %x.</source>
<target>Die Systemfunktion %x wurde nicht gefunden.</target>
@@ -1254,17 +1215,14 @@ Ausschließen: \stuff\temp\*
<source>Cannot copy symbolic link %x to %y.</source>
<target>Der Symbolische Link %x kann nicht nach %y kopiert werden.</target>
-<source>Cannot write file attributes of %x.</source>
-<target>Die Dateiattribute von %x können nicht geschrieben werden.</target>
-
<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>Endless loop.</source>
-<target>Endlosschleife.</target>
+<source>Detected endless directory recursion.</source>
+<target>Eine endlose Verzeichnisrekursion wurde erkannt.</target>
<source>Cannot set privilege %x.</source>
<target>Das Privileg %x kann nicht gesetzt werden.</target>
@@ -1290,14 +1248,11 @@ Ausschließen: \stuff\temp\*
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Setze Standardwerte für Synchronisationsrichtungen: Alte Dateien werden durch neuere überschrieben.</target>
-<source>The file does not contain a valid configuration:</source>
-<target>Die Datei enthält keine gültige Konfiguration:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Dieser Fehler kann ignoriert werden, um das Verzeichnis als leer anzusehen.</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target>Dieser Fehler kann ignoriert werden, um den Ordner als leer anzusehen.</target>
-<source>Cannot find directory %x.</source>
-<target>Das Verzeichnis %x wurde nicht gefunden.</target>
+<source>Cannot find folder %x.</source>
+<target>Der Ordner %x wurde nicht gefunden.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Die Verzeichnisse sind voneinander abhängig! Achtung beim Festlegen der Synchronisationsregeln:</target>
@@ -1329,20 +1284,20 @@ Ausschließen: \stuff\temp\*
<source>Both sides are equal</source>
<target>Beide Seiten sind gleich</target>
-<source>Files/folders differ in attributes only</source>
-<target>Dateien/Ordner unterscheiden sich nur in Attributen</target>
+<source>Items have different attributes</source>
+<target>Die Elemente haben unterschiedliche Attribute</target>
-<source>Copy new file/folder to left</source>
-<target>Kopiere neue Datei nach links</target>
+<source>Copy new item to left</source>
+<target>Kopiere neues Element nach links</target>
-<source>Copy new file/folder to right</source>
-<target>Kopiere neue Datei nach rechts</target>
+<source>Copy new item to right</source>
+<target>Kopiere neues Element nach rechts</target>
-<source>Delete left file/folder</source>
-<target>Lösche linke Datei</target>
+<source>Delete left item</source>
+<target>Lösche linkes Element</target>
-<source>Delete right file/folder</source>
-<target>Lösche rechte Datei</target>
+<source>Delete right item</source>
+<target>Lösche rechtes Element</target>
<source>Move file on left</source>
<target>Verschiebe linke Datei</target>
@@ -1350,20 +1305,20 @@ Ausschließen: \stuff\temp\*
<source>Move file on right</source>
<target>Verschiebe rechte Datei</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Ãœberschreibe linke Datei mit rechter</target>
+<source>Overwrite left item</source>
+<target>Ãœberschreibe linkes Element</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Ãœberschreibe rechte Datei mit linker</target>
+<source>Overwrite right item</source>
+<target>Ãœberschreibe rechtes Element</target>
<source>Do nothing</source>
<target>Nichts tun</target>
-<source>Copy file attributes only to left</source>
-<target>Kopiere nur die Dateiattribute nach links</target>
+<source>Update attributes on left</source>
+<target>Aktualisiere Attribute des linken Elements</target>
-<source>Copy file attributes only to right</source>
-<target>Kopiere nur die Dateiattribute nach rechts</target>
+<source>Update attributes on right</source>
+<target>Aktualisiere Attribute des rechten Elements</target>
<source>Multiple...</source>
<target>Verschiedene...</target>
@@ -1372,7 +1327,7 @@ Ausschließen: \stuff\temp\*
<target>Lösche Datei %x</target>
<source>Deleting folder %x</source>
-<target>Lösche Verzeichnis %x</target>
+<target>Lösche Ordner %x</target>
<source>Deleting symbolic link %x</source>
<target>Lösche Symbolischen Link %x</target>
@@ -1381,7 +1336,7 @@ Ausschließen: \stuff\temp\*
<target>Verschiebe Datei %x in den Papierkorb</target>
<source>Moving folder %x to recycle bin</source>
-<target>Verschiebe Verzeichnis %x in den Papierkorb</target>
+<target>Verschiebe Ordner %x in den Papierkorb</target>
<source>Moving symbolic link %x to recycle bin</source>
<target>Verschiebe Symbolischen Link %x in den Papierkorb</target>
@@ -1390,7 +1345,7 @@ Ausschließen: \stuff\temp\*
<target>Verschiebe Datei %x nach %y</target>
<source>Moving folder %x to %y</source>
-<target>Verschiebe Verzeichnis %x nach %y</target>
+<target>Verschiebe Ordner %x nach %y</target>
<source>Moving symbolic link %x to %y</source>
<target>Verschiebe Symbolischen Link %x nach %y</target>
@@ -1402,7 +1357,7 @@ Ausschließen: \stuff\temp\*
<target>Erstelle Symbolischen Link %x</target>
<source>Creating folder %x</source>
-<target>Erstelle Verzeichnis %x</target>
+<target>Erstelle Ordner %x</target>
<source>Overwriting file %x</source>
<target>Ãœberschreibe Datei %x</target>
@@ -1416,11 +1371,11 @@ Ausschließen: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Aktualisiere Attribute von %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Der Zielverzeichnisname darf nicht leer sein!</target>
+<source>Target folder name must not be empty.</source>
+<target>Der Name des Zielordners darf nicht leer sein.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Das Verzeichnis für die Versionierung wurde nicht angegeben!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Der Ordnername für die Versionierung darf nicht leer sein.</target>
<source>Source directory %x not found.</source>
<target>Das Quellverzeichnis %x wurde nicht gefunden.</target>
@@ -1449,11 +1404,11 @@ Ausschließen: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>Der Papierkorb ist auf nachfolgenden Verzeichnissen nicht verfügbar! Die Dateien werden stattdessen permanent gelöscht:</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Ein Verzeichnis wird verändert werden, das Teil mehrerer Verzeichnispaare ist! Bitte überprüfen Sie die Synchronisationseinstellungen!</target>
+<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>Processing folder pair:</source>
-<target>Bearbeite Verzeichnispaar:</target>
+<target>Bearbeite Ordnerpaar:</target>
<source>Generating database...</source>
<target>Erzeuge Synchronisationsdatenbank...</target>
diff --git a/BUILD/Languages/greek.lng b/BUILD/Languages/greek.lng
index 5d1dfa8a..0d750585 100644
--- a/BUILD/Languages/greek.lng
+++ b/BUILD/Languages/greek.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Αναζήτηση υποκαταλόγου %x...</target>
+<source>Searching for folder %x...</source>
+<target>Αναζήτηση του υποκαταλόγου %x...</target>
<source>Show in Explorer</source>
<target>Εμφάνιση στην ΕξεÏεÏνηση</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Αυτοματοποιημένος ΣυγχÏονισμός</target>
+<source>Error</source>
+<target>Σφάλματα</target>
+
<source>Select alternate comparison settings</source>
<target>Επιλογή διαφοÏοποιημένων Ïυθμίσεων σÏγκÏισης</target>
<source>Select alternate synchronization settings</source>
<target>Επιλογή διαφοÏοποιημένων Ïυθμίσεων συγχÏονισμοÏ</target>
-<source>No filter selected</source>
-<target>Δεν έχει επιλεχθεί φίλτÏο</target>
-
<source>Filter is active</source>
<target>Το φίλτÏο είναι ενεÏγό</target>
+<source>No filter selected</source>
+<target>Δεν έχει επιλεχθεί φίλτÏο</target>
+
<source>Remove alternate settings</source>
<target>ΔιαγÏαφή των διαφοÏοποιημένων Ïυθμίσεων</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>Σχετικά με το...</target>
-<source>Error</source>
-<target>Σφάλματα</target>
-
<source>Warning</source>
<target>ΠÏοειδοποίηση</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Γενικές Ïυθμίσεις</target>
-<source>Synchronization Preview</source>
-<target>ΠÏοεπισκόπηση του συγχÏονισμοÏ</target>
+<source>Summary</source>
+<target>ΣÏνοψη</target>
<source>Find</source>
<target>Αναζήτηση</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Αναζήτηση</target>
-<source>Invalid command line: %x</source>
-<target>Σφάλμα στη γÏαμμή εντολών: %x</target>
+<source>Invalid command line:</source>
+<target>Σφάλμα στη γÏαμμή εντολών:</target>
<source>Info</source>
<target>ΠληÏοφοÏία</target>
@@ -232,23 +232,23 @@
<source>Cannot read the following XML elements:</source>
<target>Δεν ήταν δυνατό να αναγνωσθοÏν τα ακόλουθα στοιχεία XML:</target>
-<source>S&ave configuration...</source>
-<target>Α&ποθήκευση διάταξης...</target>
+<source>&Open...</source>
+<target>Ά&νοιγμα...</target>
-<source>&Load configuration...</source>
-<target>&Άνοιγμα διάταξης...</target>
+<source>&Save...</source>
+<target>Α&ποθήκευση...</target>
<source>&Quit</source>
-<target>&Έξοδος</target>
+<target>Έ&ξοδος</target>
-<source>&File</source>
-<target>&ΑÏχείο</target>
+<source>&Program</source>
+<target>&ΠÏόγÏαμμα</target>
<source>&Content</source>
<target>&ΠεÏιεχόμενα</target>
-<source>&About...</source>
-<target>&Σχετικά...</target>
+<source>&About</source>
+<target>&Σχετικά</target>
<source>&Help</source>
<target>&Βοήθεια</target>
@@ -256,7 +256,7 @@
<source>Usage:</source>
<target>ΧÏήση:</target>
-<source>1. Select directories to monitor.</source>
+<source>1. Select folders to watch.</source>
<target>1. Επιλέξτε τους υποκαταλόγους που θα παÏακολουθοÏνται.</target>
<source>2. Enter a command line.</source>
@@ -265,19 +265,11 @@
<source>3. Press 'Start'.</source>
<target>3. Πατήστε το 'ΈναÏξη'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Η γÏαμμή ενεÏγειών εκτελείται κάθε φοÏά που:
-- όλοι οι υποκατάλογοι γίνονται διαθέσιμοι (π.χ. εισαγωγή ενός USB stick)
-- κάποια αÏχεία σε αυτοÏÏ‚ τους καταλόγους ή υποκαταλόγους τους έχουν Ï„Ïοποποιηθεί
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Για να ξεκινήσετε μποÏείτε απλά να εισάγεται ένα αÏχείο .ffs_batch.</target>
-<source>Directories to watch</source>
-<target>Υποκατάλογοι για παÏακολοÏθηση</target>
+<source>Folders to watch</source>
+<target>Υποκατάλογοι που θα παÏακολουθοÏνται</target>
<source>Add folder</source>
<target>ΠÏοσθήκη υποκαταλόγου</target>
@@ -288,18 +280,35 @@ The command line is executed each time:
<source>Select a folder</source>
<target>Επιλογή υποκαταλόγου</target>
+<source>Delay [seconds]</source>
+<target>ΚαθυστέÏηση [δευτεÏόλεπτα]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Λανθάνων χÏόνος Î¼ÎµÏ„Î±Î¾Ï Ï„ÎµÎ»ÎµÏ…Ï„Î±Î¯Î±Ï‚ αλλαγής που ανιχνεÏθηκε και εκτέλεσης της εντολής</target>
+
<source>Command line</source>
<target>ΓÏαμμή εντολών</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Ελάχιστος ΧÏόνος Αναμονής [δευτεÏόλεπτα]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>ΧÏόνος αναμονής Î¼ÎµÏ„Î±Î¾Ï Ï„Î·Ï‚ ανίχνευσης της τελευταίας αλλαγής και της εκτέλεσης της γÏαμμής εντολών [δευτεÏόλεπτα]</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Αυτή η εντολή Ï€Ïαγματοποιείται εάν:
+-αÏχεία ή υποκτάλογοι αλλάξουν
+-παÏουσιαστοÏν νέοι υποκατάλογοι (Ï€.χ. εισαχθεί ένα φλασάκι USB)
+</target>
<source>Start</source>
<target>ΈναÏξη</target>
+<source>&Retry</source>
+<target>&Επανάληψη</target>
+
+<source>Cancel</source>
+<target>ΆκυÏο</target>
+
<source>(Build: %x)</source>
<target>(ΔημιουÏγήθηκε : %x)</target>
@@ -318,8 +327,8 @@ The command line is executed each time:
<source>Waiting for missing directories...</source>
<target>Αναμονή για τους υποκαταλόγους που απουσιάζουν...</target>
-<source>A directory input field is empty.</source>
-<target>Ένα πεδίο εισόδου είναι κενό.</target>
+<source>An input folder name is empty.</source>
+<target>Το όνομα ενός υποκαταλόγου είναι κενό.</target>
<source>Logging</source>
<target>ΚαταγÏαφή μηνυμάτων</target>
@@ -405,8 +414,8 @@ The command line is executed each time:
<source><Symlink></source>
<target><Συμβολικός δεσμός></target>
-<source><Directory></source>
-<target><Υποκατάλογος></target>
+<source><Folder></source>
+<target>Υποκατάλογος</target>
<source>Full path</source>
<target>ΠλήÏης διαδÏομή</target>
@@ -417,8 +426,8 @@ The command line is executed each time:
<source>Relative path</source>
<target>Σχετική διαδÏομή</target>
-<source>Directory</source>
-<target>Υποκατάλογος</target>
+<source>Base folder</source>
+<target>Βασικός υποκατάλογος</target>
<source>Size</source>
<target>Μέγεθος</target>
@@ -429,8 +438,11 @@ The command line is executed each time:
<source>Extension</source>
<target>Επέκταση</target>
-<source>Comparison Result</source>
-<target>Αποτέλεσμα της σÏγκÏισης</target>
+<source>Action</source>
+<target>ΕνέÏγεια</target>
+
+<source>Category</source>
+<target>ΚατηγοÏία</target>
<source>Drag && drop</source>
<target>ΜεταφοÏά && Απόθεση</target>
@@ -438,14 +450,14 @@ The command line is executed each time:
<source>Close progress dialog</source>
<target>Κλείσιμο του παÏάθυÏου αναφοÏάς</target>
-<source>Shut down</source>
-<target>ΤεÏματισμός λειτουÏγίας</target>
+<source>Standby</source>
+<target>Αναστολή λειτουÏγίας</target>
<source>Log off</source>
<target>ΑποσÏνδεση</target>
-<source>Standby</source>
-<target>Αναστολή λειτουÏγίας</target>
+<source>Shut down</source>
+<target>ΤεÏματισμός λειτουÏγίας</target>
<source>Hibernate</source>
<target>ΑδÏανοποίηση</target>
@@ -453,32 +465,29 @@ The command line is executed each time:
<source>1. &Compare</source>
<target>1. &ΣÏγκÏιση</target>
-<source>2. &Synchronize...</source>
-<target>2. &ΣυγχÏονισμός...</target>
+<source>2. &Synchronize</source>
+<target>2. Συ&γχÏονισμός</target>
<source>&New</source>
<target>&ΔημιουÏγία</target>
-<source>&Program</source>
-<target>&ΠÏόγÏαμμα</target>
-
<source>&Language</source>
<target>&Γλώσσα</target>
<source>&Global settings...</source>
-<target>&Γενικές Ïυθμίσεις...</target>
+<target>Γε&νικές Ïυθμίσεις...</target>
<source>&Create batch job...</source>
<target>&ΔημιουÏγία μιας δέσμης ενεÏγειών...</target>
<source>&Export file list...</source>
-<target>&Εξαγωγή καταλόγου αÏχείων...</target>
+<target>Ε&ξαγωγή καταλόγου αÏχείων...</target>
<source>&Advanced</source>
<target>&Για Ï€ÏοχωÏημένους</target>
<source>&Check for new version</source>
-<target>&Έλεγχος για νέα έκδοση</target>
+<target>Έ&λεγχος για νέα έκδοση</target>
<source>Compare</source>
<target>ΣÏγκÏιση</target>
@@ -489,8 +498,8 @@ The command line is executed each time:
<source>&Abort</source>
<target>&ΆκυÏο</target>
-<source>Synchronize...</source>
-<target>ΣυγχÏονισμός...</target>
+<source>Synchronize</source>
+<target>ΣυγχÏονισμός</target>
<source>Start synchronization</source>
<target>ΈναÏξη του συγχÏονισμοÏ</target>
@@ -504,12 +513,12 @@ The command line is executed each time:
<source>Swap sides</source>
<target>Ανταλλαγή πλευÏών</target>
-<source>Save current configuration to file</source>
-<target>Αποθήκευση της Ï„Ïέχουσας διάταξης</target>
-
<source>Load configuration from file</source>
<target>Άνοιγμα διάταξης από αÏχείο</target>
+<source>Save current configuration to file</source>
+<target>Αποθήκευση της Ï„Ïέχουσας διάταξης</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Διατάξεις που χÏησιμοποιήθηκαν τελευταία (πατήστε DEL για διαγÏαφή από τη λίστα)</target>
@@ -519,13 +528,13 @@ The command line is executed each time:
<source>Hide filtered or temporarily excluded files</source>
<target>ΑπόκÏυψη των αÏχείων που φιλτÏαÏίστηκαν ή εξαιÏέθηκαν Ï€ÏοσωÏινά</target>
-<source>Number of files and directories that will be created</source>
+<source>Number of files and folders that will be created</source>
<target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα δημιουÏγηθοÏν</target>
<source>Number of files that will be overwritten</source>
<target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα αντικατασταθοÏν</target>
-<source>Number of files and directories that will be deleted</source>
+<source>Number of files and folders that will be deleted</source>
<target>ΑÏιθμός αÏχείων και υποκαταλόγων που θα διαγÏαφοÏν</target>
<source>Total amount of data that will be transferred</source>
@@ -549,8 +558,8 @@ The command line is executed each time:
<source>Batch job</source>
<target>Δέσμη ενεÏγειών</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>ΔημιουÏγία μιας δέσμης ενεÏγειών που αυτοματοποιεί το συγχÏονισμό. Για να ξεκινήσετε τη λειτουÏγία δέσμης, απλώς κάντε διπλό κλικ στο αÏχείο δέσμης ή πληκτÏολογείστε την εντολή: FreeFileSync.exe SyncJob.ffs_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>ΔημιουÏγείστε ένα αÏχείο δέσμης για να αυτοματοποιήσετε το συγχÏονισμό. Κάντε διπλό κλικ στο αÏχείο αυτό ή Ï€ÏογÏαμματίστε το στο χÏονοδιάγÏαμμα εÏγασιών του συστήματός σας: FreeFileSync.exe <όνομα δέσμης>.ffs_batch</target>
<source>Help</source>
<target>Βοήθεια</target>
@@ -576,21 +585,12 @@ The command line is executed each time:
<source>Maximum number of log files:</source>
<target>Μέγιστος αÏιθμός αÏχείων καταγÏαφής:</target>
-<source>Select log file directory:</source>
-<target>Επιλέξτε έναν κατάλογο για τα αÏχεία καταγÏαφής:</target>
+<source>Select folder to save log files:</source>
+<target>Επιλέξτε τον υποκατάλογο όπου θα αποθηκευτοÏν τα αÏχεία καταγÏαφής:</target>
<source>Batch settings</source>
<target>Ρυθμίσεις δέσμης ενεÏγειών</target>
-<source>&Save</source>
-<target>&Αποθήκευση</target>
-
-<source>&Load</source>
-<target>&Άνοιγμα</target>
-
-<source>Cancel</source>
-<target>ΆκυÏο</target>
-
<source>Select variant:</source>
<target>Επιλέξτε μια μέθοδο:</target>
@@ -615,29 +615,23 @@ The command line is executed each time:
<source>Configuration</source>
<target>Διάταξη</target>
-<source>Category</source>
-<target>ΚατηγοÏία</target>
-
-<source>Action</source>
-<target>ΕνέÏγεια</target>
-
-<source>File/folder exists on left side only</source>
-<target>Το αÏχείο / ο υποκατάλογος υπάÏχει μόνο στην αÏιστεÏή πλευÏά</target>
+<source>Item exists on left side only</source>
+<target>Το αντικείμενο υπάÏχει μόνο στην αÏιστεÏή πλευÏά</target>
-<source>File/folder exists on right side only</source>
-<target>Το αÏχείο / ο υποκατάλογος υπάÏχει μόνο στη δεξιά πλευÏά</target>
+<source>Item exists on right side only</source>
+<target>Το αντικείμενο υπάÏχει μόνο στη δεξιά πλευÏά</target>
-<source>Left file is newer</source>
-<target>Το αÏχείο στα αÏιστεÏά είναι πιο Ï€Ïόσφατο</target>
+<source>Left side is newer</source>
+<target>Το αντικείμενο στην αÏιστεÏή πλευÏά είναι πιο Ï€Ïόσφατο</target>
-<source>Right file is newer</source>
-<target>Το αÏχείο στα δεξιά είναι πιο Ï€Ïόσφατο</target>
+<source>Right side is newer</source>
+<target>Το αντικείμενο στη δεξιά πλευÏά είναι πιο Ï€Ïόσφατο</target>
-<source>Files have different content</source>
-<target>Τα αÏχεία έχουν διαφοÏετικό πεÏιεχόμενο</target>
+<source>Items have different content</source>
+<target>Τα αντικείμενα έχουν διαφοÏετικό πεÏιεχόμενο</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Η διένεξη / το αÏχείο δεν μποÏεί να κατηγοÏιοποιηθεί</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Διένεξη/το αντικείμενο δεν μποÏεί να κατηγοÏιοποιηθεί</target>
<source>OK</source>
<target>OK</target>
@@ -714,9 +708,6 @@ is the same
<source>&Ignore</source>
<target>&ΠαÏάβλεψη</target>
-<source>&Retry</source>
-<target>&Επανάληψη</target>
-
<source>Do not show this dialog again</source>
<target>Îα μην εμφανιστεί ξανά αυτό το μήνυμα</target>
@@ -747,33 +738,6 @@ Note: File names must be relative to base directories!
Σημείωση: ΠÏέπει να χÏησιμοποιοÏνται οι σχετικές διαδÏομές των αÏχείων ως Ï€Ïος τους υποκαταλόγους που συγχÏονίζονται.
</target>
-<source>Hints:</source>
-<target>Συμβουλές:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Εισάγετε τα σχετικά ονόματα των αÏχείων ή των υποκαταλόγων χωÏισμένα με ';' ή με αλλαγή γÏαμμής.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. ΜποÏείτε να χÏησιμοποιήσετε τους χαÏακτήÏες-Î¼Ï€Î±Î»Î±Î½Ï„Î­Ï '*' και '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. ΜποÏείτε να εξαιÏέσετε αÏχεία στη βασική οθόνη κάνοντας δεξί κλικ.</target>
-
-<source>Example</source>
-<target>ΠαÏάδειγμα</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-ΣυμπεÏίληψη: *.doc;*.zip;*.exe
-ΕξαίÏεση: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>ΣυγχÏονισμός όλων των αÏχείων .doc, .zip και .exe εκτός αυτών στον υποκατάλογο "temp".</target>
-
<source>Include</source>
<target>ΣυμπεÏίληψη</target>
@@ -795,8 +759,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>&ΠÏοεπιλογή</target>
-<source>Transactional file copy</source>
-<target>Συνδιαλλακτική αντιγÏαφή αÏχείων</target>
+<source>Fail-safe file copy</source>
+<target>Ασφαλής αντιγÏαφή αÏχείων</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>ΕγγÏαφή Ï€Ïώτα σε Ï€ÏοσωÏινό αÏχείο (*.ffs_tmp) και μετά μετονομασία του. Αυτή η ÏÏθμιση εγγυάται συνέπεια ακόμα και στην πεÏίπτωση σοβαÏÎ¿Ï ÏƒÏ†Î¬Î»Î¼Î±Ï„Î¿Ï‚.</target>
@@ -810,8 +774,8 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>ΑντιγÏαφή των αδειών Ï€Ïοσπέλασης των αÏχείων</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>ΜεταφοÏά των αδειών για τα αÏχεία και τους υποκαταλόγους (Απαιτεί δικαιώματα Aministrator)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>ΜεταφοÏά των αδειών των αÏχείων και των υποκαταλόγων (Απαιτεί δικαιώματα ΔιαχειÏιστή)</target>
<source>Restore hidden dialogs</source>
<target>Επανεμφάνιση κÏυμμένων μηνυμάτων</target>
@@ -1119,11 +1083,11 @@ Exclude: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Ένταξη εξωτεÏικών εφαÏμογών στο Î¼ÎµÎ½Î¿Ï Ï€ÎµÏιβάλλοντος. Οι ακόλουθες μακÏοεντολές είναι διαθέσιμες:</target>
-<source>- full file or directory name</source>
-<target>- πλήÏες όνομα του αÏχείου ή υποκαταλόγου</target>
+<source>- full file or folder name</source>
+<target>- πλήÏε όνομα αÏχείου ή υποκαταλόγου</target>
-<source>- directory part only</source>
-<target>- μόνο τους υποκαταλόγους</target>
+<source>- folder part only</source>
+<target>- μέÏος μόνο του υποκαταλόγου</target>
<source>- Other side's counterpart to %name</source>
<target>- Το αντίστοιχο %name της άλλης πλευÏάς</target>
@@ -1167,8 +1131,8 @@ Exclude: \stuff\temp\*
<source>Versioning</source>
<target>ΔιατήÏηση παλιών εκδόσεων</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>ΜεταφοÏά των αÏχείων σε έναν υποκατάλογο με ένδειξη ÏŽÏας</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>ΜεταφοÏά αÏχείων σε υποκατάλογο με χÏονική πεÏιγÏαφή</target>
<source>Files</source>
<target>ΑÏχεία</target>
@@ -1263,8 +1227,8 @@ Exclude: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Δεν μποÏεί να αναγνωσθεί ο υποκατάλογος %x.</target>
-<source>Endless loop.</source>
-<target>ΑτέÏμων βÏόχος.</target>
+<source>Detected endless directory recursion.</source>
+<target>ΑνιχνεÏτηκε αέναος βÏόχος υποκαταλόγων.</target>
<source>Cannot set privilege %x.</source>
<target>Τα δικαιώματα %x δεν μποÏοÏν να οÏιστοÏν.</target>
@@ -1290,13 +1254,10 @@ Exclude: \stuff\temp\*
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>ΡÏθμιση Ï€Ïοεπιλεγμένης κατεÏθυνσης συγχÏονισμοÏ: Τα νεότεÏα αÏχεία θα αντικαταστήσουν τα παλιότεÏα.</target>
-<source>The file does not contain a valid configuration:</source>
-<target>Το αÏχείο δεν πεÏιέχει μια έγκυÏη διάταξη:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>ΜποÏείτε να αγνοήσετε αυτό το σφάλμα και να θεωÏήσετε τον υποκατάλογο κενό.</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target>ΜποÏείτε να αγνοήσετε αυτό το λάθος, για να θεωÏήσετε ότι ο υποκατάλογος είναι κενός.</target>
-<source>Cannot find directory %x.</source>
+<source>Cannot find folder %x.</source>
<target>Ο υποκατάλογος %x δεν μποÏεί να βÏεθεί.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
@@ -1329,20 +1290,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>Οι δυο πλευÏές είναι ίδιες</target>
-<source>Files/folders differ in attributes only</source>
-<target>Τα αÏχεία / οι υποκατάλογοι διαφέÏουν μόνο στα χαÏακτηÏιστικά τους</target>
+<source>Items have different attributes</source>
+<target>Τα στοιχεία έχουν διαφοÏετικά χαÏακτηÏιστικά</target>
-<source>Copy new file/folder to left</source>
-<target>ΑντιγÏαφή του νέου αÏχείου/υποκαταλόγου στα αÏιστεÏά</target>
+<source>Copy new item to left</source>
+<target>ΑντιγÏαφή του νέου στοιχείου στα αÏιστεÏά</target>
-<source>Copy new file/folder to right</source>
-<target>ΑντιγÏαφή του νέου αÏχείου/υποκαταλόγου στα δεξιά</target>
+<source>Copy new item to right</source>
+<target>ΑντιγÏαφή του νέου στοιχείου στα δεξιά</target>
-<source>Delete left file/folder</source>
-<target>ΔιαγÏαφή του αÏχείου/υποκαταλόγου στα αÏιστεÏά</target>
+<source>Delete left item</source>
+<target>ΔιαγÏαφή του στοιχείου στα αÏιστεÏά</target>
-<source>Delete right file/folder</source>
-<target>ΔιαγÏαφή του αÏχείου/υποκαταλόγου στα δεξιά</target>
+<source>Delete right item</source>
+<target>ΔιαγÏαφή του στοιχείου στα δεξιά</target>
<source>Move file on left</source>
<target>ΜεταφοÏά του αÏχείου που βÏίσκεται αÏιστεÏά</target>
@@ -1350,20 +1311,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>ΜεταφοÏά του αÏχείου που βÏίσκεται δεξιά</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Αντικατάσταση του αÏχείου/υποκαταλόγου στα αÏιστεÏά από το(ν) αντίστοιχο στα δεξιά</target>
+<source>Overwrite left item</source>
+<target>Αντικατάσταση του στοιχείου που βÏίσκεται στα αÏιστεÏά</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Αντικατάσταση του αÏχείου/υποκαταλόγου στα δεξιά από το(ν) αντίστοιχο στα αÏιστεÏά</target>
+<source>Overwrite right item</source>
+<target>Αντικατάσταση του στοιχείου που βÏίσκεται στα δεξιά</target>
<source>Do nothing</source>
<target>Καμία ενέÏγεια</target>
-<source>Copy file attributes only to left</source>
-<target>ΑντιγÏαφή μόνο των χαÏακτηÏιστικών του αÏχείου στα αÏιστεÏά</target>
+<source>Update attributes on left</source>
+<target>ΕνημέÏωση των στοιχείων στα αÏιστεÏά</target>
-<source>Copy file attributes only to right</source>
-<target>ΑντιγÏαφή μόνο των χαÏακτηÏιστικών του αÏχείου στα δεξιά</target>
+<source>Update attributes on right</source>
+<target>ΕνημέÏωση των στοιχείων στα δεξιά</target>
<source>Multiple...</source>
<target>Πολλαπλές Ïυθμίσεις...</target>
@@ -1416,11 +1377,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>ΕνημέÏωση των χαÏακτηÏιστικών αÏχείου του %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Το όνομα του υποκαταλόγου Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€Ïέπει να μην είναι κενό!</target>
+<source>Target folder name must not be empty.</source>
+<target>Ο υποκατάλογος στόχος Ï€Ïέπει να μην είναι κενός</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Δεν έχει οÏιστεί υποκατάλογος για τη διατήÏηση παλιών εκδόσεων!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Το όνομα του υποκαταλόγου για τη διατήÏηση παλιών εκδόσεων δεν μποÏεί να είναι κενό.</target>
<source>Source directory %x not found.</source>
<target>Ο υποκατάλογος πηγής %x δεν βÏέθηκε.</target>
@@ -1449,8 +1410,8 @@ Exclude: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>Ο Κάδος ΑνακÏκλωσης δεν είναι διαθέσιμος για τις ακόλουθες διαδÏομές! Τα αÏχεία θα διαγÏαφοÏν μόνιμα:</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</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>
diff --git a/BUILD/Languages/hebrew.lng b/BUILD/Languages/hebrew.lng
index 7c2bb384..e17ef10b 100644
--- a/BUILD/Languages/hebrew.lng
+++ b/BUILD/Languages/hebrew.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>מחפש מחיצה %x</target>
+<source>Searching for folder %x...</source>
+<target>מחפש ×ת תיקייה %x...</target>
<source>Show in Explorer</source>
<target>הר××” בסייר הקבצי×</target>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>בחר הגדרות סנכרון חליפיות</target>
-<source>No filter selected</source>
-<target>×œ× × ×‘×—×¨ מסנן פעיל</target>
-
<source>Filter is active</source>
<target>מסנן פעיל</target>
+<source>No filter selected</source>
+<target>×œ× × ×‘×—×¨ מסנן פעיל</target>
+
<source>Remove alternate settings</source>
<target>הסר הגדרות תצורה חליפיות</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>×ž×©×ª× ×™× ×’×œ×•×‘×œ×™×™×</target>
-<source>Synchronization Preview</source>
-<target>תצוגה מקדימה של סנכרון</target>
+<source>Summary</source>
+<target>תקציר</target>
<source>Find</source>
<target>חפש</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>עיין</target>
-<source>Invalid command line: %x</source>
-<target>שורת פקודה בלתי חוקית: %x</target>
+<source>Invalid command line:</source>
+<target>שורת פקודה בלתי חוקית:</target>
<source>Info</source>
<target>מידע</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>ככונן %x ×œ× ×‘× ×ª×™×‘ של קובץ %y!</target>
-<source>Cannot find file %x.</source>
-<target>×œ× ×™×›×•×œ ×œ×ž×¦×•× ×§×•×‘×¥ %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>×œ× ×™×›×•×œ ×œ×§×¨×•× ×ת שמות צמתי XML:</target>
-<source>S&ave configuration...</source>
-<target>&שמור תצורה...</target>
+<source>Cannot find file %x.</source>
+<target>×œ× ×™×›×•×œ ×œ×ž×¦×•× ×§×•×‘×¥ %x.</target>
+
+<source>&Open...</source>
+<target>&פתח...</target>
-<source>&Load configuration...</source>
-<target>&טען תצורה...</target>
+<source>&Save...</source>
+<target>&שמור...</target>
<source>&Quit</source>
<target>&יצי××”</target>
-<source>&File</source>
-<target>&קובץ</target>
+<source>&Program</source>
+<target>&תוכנה</target>
<source>&Content</source>
<target>&תוכן</target>
-<source>&About...</source>
-<target>&×ודות...</target>
+<source>&About</source>
+<target>&×ודות</target>
<source>&Help</source>
<target>&עזרה</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>שימוש:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. בחר מחיצות לניטור.</target>
+<source>1. Select folders to watch.</source>
+<target>1. בחר תיקיות לצפייה.</target>
<source>2. Enter a command line.</source>
<target>2. הקש שורת פקודות.</target>
@@ -265,19 +265,11 @@
<source>3. Press 'Start'.</source>
<target>3. לחץ 'הפעל'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-שורת הפקודה מבוצעת בכל ×¤×¢× ×›×שר:
-- כל המחיצות הופכות זמינות (לדוגמה חיבור זכרון נתיק)
-- ×§×‘×¦×™× ×‘×ž×—×™×¦×•×ª ×לו משתני×
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>בכדי להתחיל ×™×‘× ×§×•×‘×¥ .ffs_batch</target>
-<source>Directories to watch</source>
-<target>מחיצות לניטור</target>
+<source>Folders to watch</source>
+<target>תיקיות לצפייה</target>
<source>Add folder</source>
<target>הוסף מחיצה</target>
@@ -288,14 +280,25 @@ The command line is executed each time:
<source>Select a folder</source>
<target>בחר מחיצה</target>
+<source>Delay [seconds]</source>
+<target>השהייה [שניות]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>זמן המתנה בין שינויי מ×ובחן ×חרון לבין ביצוע של פקודה</target>
+
<source>Command line</source>
<target>שורת פקודות</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>זמן מנוחה מינימלי [שניות]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>זמן מנוחה מגילוי שינוי ×חרון עד לביצוע שורת פקודה בשניות</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+הפקודה מופעלת ×›×שר:
+- ×§×‘×¦×™× ×ו תת-תיקיות משתני×
+- תיקיות חדשות מופיעות (לדוגמה התקן USB מוכנס)
+</target>
<source>Start</source>
<target>התחל</target>
@@ -324,8 +327,8 @@ The command line is executed each time:
<source>Waiting for missing directories...</source>
<target>מחכה למחיצות חסרות...</target>
-<source>A directory input field is empty.</source>
-<target>שדה כניסת מחיצה ריק.</target>
+<source>An input folder name is empty.</source>
+<target>×©× ×ª×™×§×™×™×ª קלט ריק.</target>
<source>Logging</source>
<target>×¨×™×©×•× ×‘×™×•×ž×Ÿ</target>
@@ -396,12 +399,12 @@ The command line is executed each time:
<source>Download now?</source>
<target>הורד עכשיו?</target>
-<source>Information</source>
-<target>מידע</target>
-
<source>FreeFileSync is up to date!</source>
<target>FreeFileSync מעודכן לגירסה ×”×חרונה!</target>
+<source>Information</source>
+<target>מידע</target>
+
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
<target>×”×× ×‘×¨×¦×•× ×š שהתוכנה תבדוק לעדכון בכל שבוע?</target>
@@ -411,8 +414,8 @@ The command line is executed each time:
<source><Symlink></source>
<target><קשור סימבולי></target>
-<source><Directory></source>
-<target><מחיצה></target>
+<source><Folder></source>
+<target><תיקייה></target>
<source>Full path</source>
<target>נתיב מל×</target>
@@ -423,8 +426,8 @@ The command line is executed each time:
<source>Relative path</source>
<target>נתיב יחסי</target>
-<source>Directory</source>
-<target>מחיצה</target>
+<source>Base folder</source>
+<target>תיקיית בסיס</target>
<source>Size</source>
<target>גודל</target>
@@ -435,8 +438,11 @@ The command line is executed each time:
<source>Extension</source>
<target>סיומת</target>
-<source>Comparison Result</source>
-<target>תוצ×ות ההשוו××”</target>
+<source>Action</source>
+<target>פעולה</target>
+
+<source>Category</source>
+<target>קטגוריה</target>
<source>Drag && drop</source>
<target>גרור והשלך</target>
@@ -444,14 +450,14 @@ The command line is executed each time:
<source>Close progress dialog</source>
<target>סגור שיח התקדמות</target>
-<source>Shut down</source>
-<target>כבה מחשב</target>
+<source>Standby</source>
+<target>עבור למצב המתנה</target>
<source>Log off</source>
<target>התנתק כמשתמש</target>
-<source>Standby</source>
-<target>עבור למצב המתנה</target>
+<source>Shut down</source>
+<target>כבה מחשב</target>
<source>Hibernate</source>
<target>עבור למצב שינה</target>
@@ -459,15 +465,12 @@ The command line is executed each time:
<source>1. &Compare</source>
<target>1. &השווה</target>
-<source>2. &Synchronize...</source>
-<target>2. &סנכרן...</target>
+<source>2. &Synchronize</source>
+<target>2. &סנכרן</target>
<source>&New</source>
<target>&חדש</target>
-<source>&Program</source>
-<target>&תוכנה</target>
-
<source>&Language</source>
<target>&שפה</target>
@@ -495,8 +498,8 @@ The command line is executed each time:
<source>&Abort</source>
<target>&נטוש</target>
-<source>Synchronize...</source>
-<target>...סנכרן</target>
+<source>Synchronize</source>
+<target>סנכרן</target>
<source>Start synchronization</source>
<target>התחל סנכרון</target>
@@ -510,12 +513,12 @@ The command line is executed each time:
<source>Swap sides</source>
<target>החלף צדדי×</target>
-<source>Save current configuration to file</source>
-<target>שמור תצורה נוכחית לקובץ</target>
-
<source>Load configuration from file</source>
<target>טען קונפיגורציה מקובץ</target>
+<source>Save current configuration to file</source>
+<target>שמור תצורה נוכחית לקובץ</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>תצורות ×חרונות שהיו בשמוש (לחץ DEL להסרה מהרשימה)</target>
@@ -525,21 +528,18 @@ The command line is executed each time:
<source>Hide filtered or temporarily excluded files</source>
<target>×”×—×‘× ×§×‘×¦×™× ×ž×¡×•× × ×™× ×ו נשללי×</target>
-<source>Number of files and directories that will be created</source>
-<target>מספר התקיות ×•×”×§×‘×¦×™× ×שר ×¢×•×ž×“×™× ×œ×”×™×•×¦×¨</target>
+<source>Number of files and folders that will be created</source>
+<target>מספר ×”×§×‘×¦×™× ×•×”×ª×™×§×™×•×ª שייוצרו</target>
<source>Number of files that will be overwritten</source>
<target>מספר ×”×§×‘×¦×™× ×”×¢×•×ž×“×™× ×œ×”×™×›×ª×‘ מחדש</target>
-<source>Number of files and directories that will be deleted</source>
-<target>מספר ×”×§×‘×¦×™× ×•×”×ª×™×§×™×•×ª ×”×¢×•×ž×“×™× ×œ×”×™×ž×—×§</target>
+<source>Number of files and folders that will be deleted</source>
+<target>מספר ×”×§×‘×¦×™× ×•×”×ª×™×§×™×•×ª שימחקו</target>
<source>Total amount of data that will be transferred</source>
<target>סך הכל × ×ª×•× ×™× ×œ×”×¢×‘×¨×”</target>
-<source>Operation:</source>
-<target>פעולה:</target>
-
<source>Items found:</source>
<target>××œ×ž× ×˜×™× × ×ž×¦×ו:</target>
@@ -555,8 +555,8 @@ The command line is executed each time:
<source>Batch job</source>
<target>עבודת ×צווה</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>צור קובץ ×צווה ומכן הסינכרון. הפעל ב×מצעות הקשה כפולה על ×©× ×”×§×•×‘×¥ ×ו הפעל שורת פקודה: FreeFileSync.exe <ffs_batch file>. ההפעלה ניתנת לתזמון במתזמן המשימות של מערכת ההפעלה.</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</target>
<source>Help</source>
<target>עזרה</target>
@@ -582,18 +582,12 @@ The command line is executed each time:
<source>Maximum number of log files:</source>
<target>מספר מכסימלי של קבצי יומן</target>
-<source>Select log file directory:</source>
-<target>בחר מחיצה לקבצי יומן</target>
+<source>Select folder to save log files:</source>
+<target>בחר תיקייה לשמירה קבצי יומן:</target>
<source>Batch settings</source>
<target>הגדרות ×צווה</target>
-<source>&Save</source>
-<target>&שמירה</target>
-
-<source>&Load</source>
-<target>&טען</target>
-
<source>Select variant:</source>
<target>בחר משתנה:</target>
@@ -618,29 +612,23 @@ The command line is executed each time:
<source>Configuration</source>
<target>תצורה</target>
-<source>Category</source>
-<target>קטגוריה</target>
-
-<source>Action</source>
-<target>פעולה</target>
+<source>Item exists on left side only</source>
+<target>הפריט ×§×™×™× ×‘×¦×“ ימין בלבד</target>
-<source>File/folder exists on left side only</source>
-<target>קובץ\מחיצה ×§×™×™× ×‘×¦×“ ימין בלבד</target>
+<source>Item exists on right side only</source>
+<target>הפריט ×§×™×™× ×‘×¦×“ שמ×ל בלבד</target>
-<source>File/folder exists on right side only</source>
-<target>קובץ\מחיצה ×§×™×™× ×‘×¦×“ שמ×ל בלבד</target>
+<source>Left side is newer</source>
+<target>צד ימין חדש יותר</target>
-<source>Left file is newer</source>
-<target>קובץ בצד ימין חדש יותר</target>
-
-<source>Right file is newer</source>
+<source>Right side is newer</source>
<target>צד שמ×ל חדש יותר</target>
-<source>Files have different content</source>
-<target>×”×§×‘×¦×™× ×‘×¢×œ×™ תכולה שונה</target>
+<source>Items have different content</source>
+<target>×”×¤×¨×™×˜×™× ×”× ×‘×¢×œ×™ תוכן שונה</target>
-<source>Conflict/file cannot be categorized</source>
-<target>קונפליקט\קובץ ×ינו יכול לקבל סיווג</target>
+<source>Conflict/item cannot be categorized</source>
+<target>סתירה/פריט ×ינו ניתן לסיווג</target>
<source>OK</source>
<target>×שר</target>
@@ -747,33 +735,6 @@ Note: File names must be relative to base directories!
הערה: שמות ×§×‘×¦×™× ×—×™×™×‘×™× ×œ×”×™×•×ª ×ž×•×’×“×¨×™× ×‘×ופן יחסי למחיצות הר×שיות!
</target>
-<source>Hints:</source>
-<target>טיפי×:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. הכנס ×©× ×§×•×‘×¥ ×ו ×©× ×ª×™×§×™×” ×ž×•×¤×¨×“×™× ×¢"×™ ';' ×ו דורה חדשה</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. השתמש ב××©×¤×™× '*' ×ו '?'לבחירה מרובה.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. ×”×•×¦× ×§×‘×¦×™× ×”×™×™×©×¨ ב×סכלה עיקרית דרך תפריט הקשר.</target>
-
-<source>Example</source>
-<target>דוגמה</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-כלול: *.doc;*.zip;*.exe
-×ל תכלול: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>סנכרן .doc, .zip und .exe כל ×”×§×‘×¦×™× ×‘×ª×™×§×™×ª משנה "temp".</target>
-
<source>Include</source>
<target>כלול</target>
@@ -795,8 +756,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>&ברירת מחדל</target>
-<source>Transactional file copy</source>
-<target>העתקת קובץ בעסקה</target>
+<source>Fail-safe file copy</source>
+<target>כשלון ב×בטחת העתקת קובץ</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>×¨×©×•× ×œ×§×•×‘×¥ זמני (*.ffs_tmp) תחילה ושנה ש×. פעולה זו מבטיחה עקביות המצב ×’× ×‘×ž×§×¨×” של שגי××” חמורה.</target>
@@ -810,8 +771,8 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>העתק הרש×ות גישה של הקובץ</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>העבר הרש×ות ×§×‘×¦×™× ×•×ž×—×™×¦×•×ª (דורש הרש×ות מנהל מערכת)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>העבר הרש×ות של תיקיות ×•×§×‘×¦×™× (דורש זכויות מנהל)</target>
<source>Restore hidden dialogs</source>
<target>שחזר די××œ×•×’×™× ×ž×•×¡×ª×¨×™×</target>
@@ -1119,11 +1080,11 @@ Exclude: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>הטמע תוכנות חיצוניות. תפריטי המקרו הב××™× ×–×ž×™× ×™×:</target>
-<source>- full file or directory name</source>
-<target>- ×©× ×ž×œ× ×©×œ קובץ ×ו תיקיה</target>
+<source>- full file or folder name</source>
+<target>- ×©× ×ž×œ× ×©×œ קובץ ×ו תיקייה</target>
-<source>- directory part only</source>
-<target>- חלק התיקיה בלבד</target>
+<source>- folder part only</source>
+<target>- תיקייה בלבד</target>
<source>- Other side's counterpart to %name</source>
<target>- הצד השני מקביל ל- %name</target>
@@ -1167,8 +1128,8 @@ Exclude: \stuff\temp\*
<source>Versioning</source>
<target>עדכון גרס×ות</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>העבר ×§×‘×¦×™× ×œ×ª×•×š מחיצות ×¢× ×©× ×”×ž×›×™×œ טביעת זמן ות×ריך</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>העבר ×§×‘×¦×™× ×œ×ª×™×§×™×™×” המסומנת בחותמת-זמן</target>
<source>Files</source>
<target>קבצי×</target>
@@ -1263,8 +1224,8 @@ Exclude: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>×œ× ×™×›×•×œ ×œ×§×¨×•× ×ž×—×™×¦×” %x.</target>
-<source>Endless loop.</source>
-<target>לול××” ×ינסופית.</target>
+<source>Detected endless directory recursion.</source>
+<target>×ובחנה רקורסית תיקיות ×ינסופית.</target>
<source>Cannot set privilege %x.</source>
<target>×œ× ×™×›×•×œ להגדיר זבות %x.</target>
@@ -1290,14 +1251,11 @@ Exclude: \stuff\temp\*
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>בחר ברירת מחדל של סנכרון: ×§×‘×¦×™× ×™×©× ×™× ×™×“×¨×¡×• ×¢"×™ ×§×‘×¦×™× ×—×“×©×™× ×™×•×ª×¨.</target>
-<source>The file does not contain a valid configuration:</source>
-<target>קובץ ×–×” ×œ× ×ž×›×™×œ קונפיגורציה ברת תוקף</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>×פשר ×œ×”×ª×¢×œ× ×ž×©×’×™××” זו ולהניח ×›×™ המחיצה ריקה.</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target>ניתן ×œ×”×ª×¢×œ× ×ž×©×’×™××” זו ולהחשיב התיקייה כריקה.</target>
-<source>Cannot find directory %x.</source>
-<target>×œ× ×™×›×•×œ ×œ×ž×¦×•× ×ž×—×™×¦×” %x.</target>
+<source>Cannot find folder %x.</source>
+<target>×œ× ×ž×•×¦× ×ª×™×§×™×™×” %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>מחיצות תלויות! זהירות בהגדרת כללי סנכרון:</target>
@@ -1329,20 +1287,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>שני ×”×¦×“×“×™× ×©×•×•×™×</target>
-<source>Files/folders differ in attributes only</source>
-<target>קבצי×\מחיצות ×©×•× ×™× ×‘×¢×¨×›×™ התכונות בלבד</target>
+<source>Items have different attributes</source>
+<target>×”×¤×¨×™×˜×™× ×”× ×‘×¢×œ×™ תכונות שונות</target>
-<source>Copy new file/folder to left</source>
-<target>העתק קובץ\מחיצה חדש\×” משמ×ל לימין</target>
+<source>Copy new item to left</source>
+<target>העתק פריט חדש לצד ימין</target>
-<source>Copy new file/folder to right</source>
-<target>העתק קובץ\מחיצה חדש\×” מימין לשמ×ל</target>
+<source>Copy new item to right</source>
+<target>העתק פריט חדש לצד שמ×ל</target>
-<source>Delete left file/folder</source>
-<target>מחק קובץ\מחיצה בצד ימין</target>
+<source>Delete left item</source>
+<target>מחק פריט בצד ימין</target>
-<source>Delete right file/folder</source>
-<target>מחק קובץ\מחיצה בצד שמ×ל</target>
+<source>Delete right item</source>
+<target>מחק פריט בצד שמ×ל</target>
<source>Move file on left</source>
<target>העבר קובץ בצד ימין</target>
@@ -1350,20 +1308,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>העבר קובץ בצד שמ×ל</target>
-<source>Overwrite left file/folder with right one</source>
-<target>העתק ודרוס קובץ\מחיצה משמ×ל לימין</target>
+<source>Overwrite left item</source>
+<target>×¨×©×•× ×¢×œ גבי פריט בצד ימין</target>
-<source>Overwrite right file/folder with left one</source>
-<target>העתק ודרוס קובץ\מחיצה מימין לשמ×ל</target>
+<source>Overwrite right item</source>
+<target>×¨×©×•× ×¢×œ גבי פריט בצד שמ×ל</target>
<source>Do nothing</source>
<target>×ל תעשה כלו×</target>
-<source>Copy file attributes only to left</source>
-<target>העתק תכונות קובץ בלבד משמ×ל לימין</target>
+<source>Update attributes on left</source>
+<target>עדכן תכונות בצד ימין</target>
-<source>Copy file attributes only to right</source>
-<target>העתק תכונות קובץ בלבד מימין לשמ×ל</target>
+<source>Update attributes on right</source>
+<target>עדכן תכונות בצד שמ×ל</target>
<source>Multiple...</source>
<target>הכפל...</target>
@@ -1416,11 +1374,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>מעדכן תכונות של %x</target>
-<source>Target directory name must not be empty!</source>
-<target>×©× ×©×œ מחיצת מטרה ×ינו יכול להיות ריק!</target>
+<source>Target folder name must not be empty.</source>
+<target>×©× ×ª×™×§×™×™×ª מטרה ×ינו יכול להיות ריק.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>×œ× ×¡×•×¤×§×” מחיצה ×œ×¨×™×©×•× ×’×¨×¡×ות קבצי×</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>×©× ×ª×™×§×™×™×” לגרס×ות ×§×‘×¦×™× ×ינו יכול להיות ריק</target>
<source>Source directory %x not found.</source>
<target>מחיצת מקור %x ×œ× × ×ž×¦××”.</target>
@@ -1449,8 +1407,8 @@ Exclude: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>סל מחזור ×ינו זמין עבור ×”× ×ª×™×‘×™× ×”×‘××™×! ×§×‘×¦×™× ×™×ž×—×§×• לצמיתות:</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</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>
diff --git a/BUILD/Languages/hungarian.lng b/BUILD/Languages/hungarian.lng
index 67b2ac34..d06b0529 100644
--- a/BUILD/Languages/hungarian.lng
+++ b/BUILD/Languages/hungarian.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Mappa keresése: %x...</target>
+<source>Searching for folder %x...</source>
+<target>A(z) %x mappa keresése...</target>
<source>Show in Explorer</source>
<target>Mutatás az Intézőben</target>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>Alternatív szinkronizációs beállítások kiválasztása</target>
-<source>No filter selected</source>
-<target>Nincs szűrő kiválasztva</target>
-
<source>Filter is active</source>
<target>A szűrő aktív</target>
+<source>No filter selected</source>
+<target>Nincs szűrő kiválasztva</target>
+
<source>Remove alternate settings</source>
<target>Alternatív beállítások eltávolítása</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Globális beállítások</target>
-<source>Synchronization Preview</source>
-<target>Szinkronizáció előnézete</target>
+<source>Summary</source>
+<target>Összegzés</target>
<source>Find</source>
<target>Keresés:</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Tallózás</target>
-<source>Invalid command line: %x</source>
-<target>Érvénytelen parancssor: %x</target>
+<source>Invalid command line:</source>
+<target>Érvénytelen parancssor:</target>
<source>Info</source>
<target>Információ</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>A(z) %x kötetnevet nem tartalmazza a(z) %y fájlnév!</target>
-<source>Cannot find file %x.</source>
-<target>Nem található a következő fájl: %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>A következő XML elemek olvasása sikertelen:</target>
-<source>S&ave configuration...</source>
-<target>Beállítások mentés&e...</target>
+<source>Cannot find file %x.</source>
+<target>Nem található a következő fájl: %x.</target>
-<source>&Load configuration...</source>
-<target>&Beállítások betöltése...</target>
+<source>&Open...</source>
+<target>&Megnyitás...</target>
+
+<source>&Save...</source>
+<target>Me&ntés...</target>
<source>&Quit</source>
<target>&Kilépés</target>
-<source>&File</source>
-<target>&Fájl</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>&Tartalom</target>
-<source>&About...</source>
-<target>&A programról...</target>
+<source>&About</source>
+<target>&A programról</target>
<source>&Help</source>
<target>&Súgó</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Használat:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Válaszd ki a figyelendő mappákat.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Válaszd ki a figyelendő mappát.</target>
<source>2. Enter a command line.</source>
<target>2. Add meg a parancssort.</target>
@@ -265,18 +265,10 @@
<source>3. Press 'Start'.</source>
<target>3. Nyomd meg a Start gombot.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-A parancssor végrehajtódik minden alkalommal, ha:
-- minden mappa elérhetővé válik (pl. USB-kulcs csatlakoztatása)
-- fájlok módosulnak az adott mappákban és almappákban
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Az induláshoz importálj be egy .ffs_batch fájlt.</target>
-<source>Directories to watch</source>
+<source>Folders to watch</source>
<target>Figyelendő mappák</target>
<source>Add folder</source>
@@ -288,14 +280,25 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Select a folder</source>
<target>Mappa kiválasztása</target>
+<source>Delay [seconds]</source>
+<target>Késleltetés (másodperc)</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Tétlenség időtartama az utolsó változás észlelése és a parancs végrehajtása között</target>
+
<source>Command line</source>
<target>Parancssor</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimális tétlenségi idő (másodpercek)</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>A tétlenség hossza másodpercekben az utolsó változás észlelése és a parancssor végrehajtása között.</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+A parancs végrehajtódik, ha:
+- fájlok vagy almappák megváltoznak
+- új mappák jelennek meg (pl. USB-kulcs csatlakoztatása)
+</target>
<source>Start</source>
<target>Indítás</target>
@@ -309,8 +312,8 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>(Build: %x)</source>
<target>(Build: %x)</target>
-<source>RealtimeSync configuration</source>
-<target>RealtimeSync beállítások</target>
+<source>All files</source>
+<target></target>
<source>&Restore</source>
<target>&Visszaállítás</target>
@@ -324,8 +327,8 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Waiting for missing directories...</source>
<target>Várakozás a hiányzó mappákra...</target>
-<source>A directory input field is empty.</source>
-<target>Valamelyik mappa megadására szolgáló mező üres.</target>
+<source>An input folder name is empty.</source>
+<target>A megadott mappa neve üres.</target>
<source>Logging</source>
<target>Naplózás</target>
@@ -351,9 +354,6 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>FreeFileSync batch file</source>
<target>FreeFileSync kötegelt fájl</target>
-<source>FreeFileSync configuration</source>
-<target>FreeFileSync beállítások</target>
-
<source>Batch execution</source>
<target>Kötegelt végrehajtás</target>
@@ -396,12 +396,12 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Download now?</source>
<target>Letöltsem most?</target>
-<source>Information</source>
-<target>Információ</target>
-
<source>FreeFileSync is up to date!</source>
<target>A FreeFileSync naprakész!</target>
+<source>Information</source>
+<target>Információ</target>
+
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
<target>Akarod, hogy a FreeFileSync automatikusan minden héten keressen frissítést?</target>
@@ -411,7 +411,7 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source><Symlink></source>
<target><Symlink></target>
-<source><Directory></source>
+<source><Folder></source>
<target><Mappa></target>
<source>Full path</source>
@@ -423,8 +423,8 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Relative path</source>
<target>Relatív útvonal</target>
-<source>Directory</source>
-<target>Mappa</target>
+<source>Base folder</source>
+<target>FÅ‘mappa</target>
<source>Size</source>
<target>Méret</target>
@@ -435,8 +435,11 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Extension</source>
<target>Kiterjesztés</target>
-<source>Comparison Result</source>
-<target>Az összehasonlítás eredménye</target>
+<source>Action</source>
+<target>Művelet</target>
+
+<source>Category</source>
+<target>Kategória</target>
<source>Drag && drop</source>
<target>Húzd && Ejtsd</target>
@@ -444,14 +447,14 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Close progress dialog</source>
<target>Folyamatjelző párbeszédablak bezárása</target>
-<source>Shut down</source>
-<target>Gép leállítása</target>
+<source>Standby</source>
+<target>Készenléti állapot</target>
<source>Log off</source>
<target>Kijelentkezés</target>
-<source>Standby</source>
-<target>Készenléti állapot</target>
+<source>Shut down</source>
+<target>Gép leállítása</target>
<source>Hibernate</source>
<target>Hibernálás</target>
@@ -459,15 +462,12 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>1. &Compare</source>
<target>1. &Összehasonlítás</target>
-<source>2. &Synchronize...</source>
+<source>2. &Synchronize</source>
<target>2. &Szinkronizálás</target>
<source>&New</source>
<target>&Új</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>&Nyelv</target>
@@ -495,7 +495,7 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>&Abort</source>
<target>&Megszakít</target>
-<source>Synchronize...</source>
+<source>Synchronize</source>
<target>Szinkronizálás</target>
<source>Start synchronization</source>
@@ -510,12 +510,12 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Swap sides</source>
<target>Oldalak felcserélése</target>
-<source>Save current configuration to file</source>
-<target>Aktuális beállítások mentése fájlba</target>
-
<source>Load configuration from file</source>
<target>Beállítások betöltése fájlból</target>
+<source>Save current configuration to file</source>
+<target>Aktuális beállítások mentése fájlba</target>
+
<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>
@@ -525,21 +525,18 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Hide filtered or temporarily excluded files</source>
<target>A kiszűrt vagy ideiglenesen kizárt fájlok elrejtése</target>
-<source>Number of files and directories that will be created</source>
+<source>Number of files and folders that will be created</source>
<target>A létrehozandó fájlok és mappák száma</target>
<source>Number of files that will be overwritten</source>
<target>A felülírandó fájlok száma</target>
-<source>Number of files and directories that will be deleted</source>
+<source>Number of files and folders that will be deleted</source>
<target>A törlendő fájlok és mappák száma</target>
<source>Total amount of data that will be transferred</source>
<target>A mozgatandó adatok összmérete</target>
-<source>Operation:</source>
-<target>Művelet:</target>
-
<source>Items found:</source>
<target>Talált elemek száma:</target>
@@ -555,8 +552,8 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Batch job</source>
<target>Kötegelt feladat</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Kötegelt feladat fájl létrehozása és automatikus szinkronizálás. A kötegelt feladat módban való indításhoz csak egyszerűen kattints duplát a fájlon vagy futtasd a következő parancsot: FreeFileSync.exe SzinkFeladat.ffs_batch. Ez ütemezhető is az operációs rendszer ütemezőjének a segítségével.</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>Kötegelt fájl létrehozása a szinkronizálás automatizálásához. Kattints duplán a fájlon vagy ütemezed be a rendszered feladatütemezőjével: FreeFileSync.exe <feladatnév>.ffs_batch</target>
<source>Help</source>
<target>Súgó</target>
@@ -582,18 +579,12 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Maximum number of log files:</source>
<target>Naplófájlok maximális száma:</target>
-<source>Select log file directory:</source>
-<target>Naplófájl mappájának kiválasztása:</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>Batch settings</source>
<target>Beállítások</target>
-<source>&Save</source>
-<target>&Mentés</target>
-
-<source>&Load</source>
-<target>&Betöltés</target>
-
<source>Select variant:</source>
<target>Változat kiválasztása:</target>
@@ -618,29 +609,23 @@ A parancssor végrehajtódik minden alkalommal, ha:
<source>Configuration</source>
<target>Beállítás</target>
-<source>Category</source>
-<target>Kategória</target>
-
-<source>Action</source>
-<target>Művelet</target>
-
-<source>File/folder exists on left side only</source>
-<target>Csak a bal oldalon létező fájlok/mappák</target>
+<source>Item exists on left side only</source>
+<target>Az elem csak a bal oldalon létezik</target>
-<source>File/folder exists on right side only</source>
-<target>Csak a jobb oldalon létező fájlok/mappák</target>
+<source>Item exists on right side only</source>
+<target>Az elem csak a jobb oldalon létezik</target>
-<source>Left file is newer</source>
-<target>A bal oldalon lévő fájl újabb</target>
+<source>Left side is newer</source>
+<target>A bal oldal újabb</target>
-<source>Right file is newer</source>
-<target>A jobb oldalon lévő fájl újabb</target>
+<source>Right side is newer</source>
+<target>A jobb oldal újabb</target>
-<source>Files have different content</source>
-<target>A fájlok tartalma különböző</target>
+<source>Items have different content</source>
+<target>Az elemek tartalma különbözik</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Kategorizálhatatlan ütközések/fájlok</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Az ütközés vagy elem nem kategorizálható</target>
<source>OK</source>
<target>OK</target>
@@ -748,33 +733,6 @@ Csak azok a fájlok lesznek szinkronizálva, amelyek megfelelnek az összes szű
Megjegyzés: A fájlneveknek relatívnak kell lenniük az alap mappához viszonyítva!
</target>
-<source>Hints:</source>
-<target>Tippek:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. A relatív fájl- és mappanevek megadása pontosvesszővel elválasztva vagy új sorban.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. A csillag ('*') és a kérdőjel ('?') helyettesítő karakterek megengedettek.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Fájlok közvetlen kizárása a fő listából helyi menü segítségével.</target>
-
-<source>Example</source>
-<target>Példa</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Csatolni: *.doc; *.zip; *.exe
-Kizárni: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Minden .doc, .zip és .exe fájl szinkronizálása a "temp" almappában találhatók kivételével.</target>
-
<source>Include</source>
<target>Csatolni</target>
@@ -796,8 +754,8 @@ Kizárni: \stuff\temp\*
<source>&Default</source>
<target>&Alapértelmezett</target>
-<source>Transactional file copy</source>
-<target>Tranzakciós fájlmásolás</target>
+<source>Fail-safe file copy</source>
+<target>Hibamentes fájlmásolás</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>Ãrás egy ideiglenes fájlba (*.ffs_tmp), majd annak átnevezése. Ez egyezÅ‘ állapotot garantál még végzetes hiba esetén is.</target>
@@ -811,8 +769,8 @@ Kizárni: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Fájl hozzáférési jogosultságainak másolása</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Fájlok és mappák jogosultságainak átvitele (Adminisztrátori jogok szükségesek)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Fájlok és mappák jogosultságának átvitele (adminisztrátori jogok szükségesek)</target>
<source>Restore hidden dialogs</source>
<target>Rejtett párbeszédablakok visszaállítása</target>
@@ -1120,11 +1078,11 @@ Kizárni: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Külső alkalmazás integrálása a helyi menübe. Az elérhető makrók a következők:</target>
-<source>- full file or directory name</source>
+<source>- full file or folder name</source>
<target>- teljes fájl- vagy mappanév</target>
-<source>- directory part only</source>
-<target>- csak a mappa részét</target>
+<source>- folder part only</source>
+<target>- csak mappa rész</target>
<source>- Other side's counterpart to %name</source>
<target>- A %name másik oldalon szereplő párja</target>
@@ -1168,8 +1126,8 @@ Kizárni: \stuff\temp\*
<source>Versioning</source>
<target>Verziókövetés</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Fájlok másolása időbélyeggel ellátott almappába</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>
@@ -1234,6 +1192,9 @@ Kizárni: \stuff\temp\*
<source>Cannot write modification time of %x.</source>
<target>Az utolsó módosítás dátumának a beállítása sikertelen a következő fájlnál: %x.</target>
+<source>Cannot write file attributes of %x.</source>
+<target>A következő fájl attribútumainak írása sikertelen: %x.</target>
+
<source>Cannot find system function %x.</source>
<target>Nem található a következő rendszerfunkció: %x.</target>
@@ -1255,17 +1216,14 @@ Kizárni: \stuff\temp\*
<source>Cannot copy symbolic link %x to %y.</source>
<target>%x symlink másolása a(z) %y symlinkbe sikertelen.</target>
-<source>Cannot write file attributes of %x.</source>
-<target>A következő fájl attribútumainak írása sikertelen: %x.</target>
-
<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>Endless loop.</source>
-<target>Végtelen hurok.</target>
+<source>Detected endless directory recursion.</source>
+<target>Végtelen mapparekurzió detektálva.</target>
<source>Cannot set privilege %x.</source>
<target>A következő privilégium beállítása sikertelen: %x.</target>
@@ -1291,13 +1249,10 @@ Kizárni: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>A következő fájl nem tartalmaz érvényes beállításokat:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Figyelmen kívül hagyhatod ezt a hibát, üresnek tekintve a mappát.</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>
-<source>Cannot find directory %x.</source>
+<source>Cannot find folder %x.</source>
<target>Nem található a következő mappa: %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
@@ -1330,20 +1285,20 @@ Kizárni: \stuff\temp\*
<source>Both sides are equal</source>
<target>Mindkét oldal egyforma</target>
-<source>Files/folders differ in attributes only</source>
-<target>Csak attribútumokban különböző fájlok/mappák</target>
+<source>Items have different attributes</source>
+<target>Az elemek attribútumai különböznek</target>
-<source>Copy new file/folder to left</source>
-<target>Új fájl/mappa másolása a bal oldalra</target>
+<source>Copy new item to left</source>
+<target>Új elemek másolása a bal oldalra</target>
-<source>Copy new file/folder to right</source>
-<target>Új fájl/mappa másolása a jobb oldalra</target>
+<source>Copy new item to right</source>
+<target>Új elemek másolása a jobb oldalra</target>
-<source>Delete left file/folder</source>
-<target>Bal oldali fájl/mappa törlése</target>
+<source>Delete left item</source>
+<target>Bal oldali elem törlése</target>
-<source>Delete right file/folder</source>
-<target>Jobb oldali fájl/mappa törlése</target>
+<source>Delete right item</source>
+<target>Jobb oldali elem törlése</target>
<source>Move file on left</source>
<target>Bal oldali fájl mozgatása</target>
@@ -1351,20 +1306,20 @@ Kizárni: \stuff\temp\*
<source>Move file on right</source>
<target>Jobb oldali fájl mozgatása</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Bal oldali fájl/mappa felülírása a jobb oldalival</target>
+<source>Overwrite left item</source>
+<target>Bal oldali elem fölülírása</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Jobb oldali fájl/mappa felülírása a bal oldalival</target>
+<source>Overwrite right item</source>
+<target>Jobb oldali elem fölülírása</target>
<source>Do nothing</source>
<target>Nincs mit csinálni</target>
-<source>Copy file attributes only to left</source>
-<target>Fájl attribútumok másolása csak a bal oldalra</target>
+<source>Update attributes on left</source>
+<target>Attribútumok frissítése a bal oldalon</target>
-<source>Copy file attributes only to right</source>
-<target>Fájl attribútumok másolása csak a jobb oldalra</target>
+<source>Update attributes on right</source>
+<target>Attribútumok frissítése a jobb oldalon</target>
<source>Multiple...</source>
<target>Sokszorosítás</target>
@@ -1417,11 +1372,11 @@ Kizárni: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>A(z) %x attribútumainak frissítése</target>
-<source>Target directory name must not be empty!</source>
-<target>A célmappa neve nem lehet üres!</target>
+<source>Target folder name must not be empty.</source>
+<target>A célmappa nem lehet üres.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Nem lett megadva mappa a fájlok verziókezeléséhez!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>A fájlok verziókövetéséhez használatos mappa neve nem lehet üres.</target>
<source>Source directory %x not found.</source>
<target>Nem található a következő forrásmappa: %x.</target>
@@ -1450,8 +1405,8 @@ Kizárni: \stuff\temp\*
<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>A directory 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 tagja több mappa párosnak! Kérjük, nézd át a szinkronizációs beállításokat!</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>
diff --git a/BUILD/Languages/italian.lng b/BUILD/Languages/italian.lng
index 27523f4d..f80146fb 100644
--- a/BUILD/Languages/italian.lng
+++ b/BUILD/Languages/italian.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Ricerca cartella %x in corso...</target>
+<source>Searching for folder %x...</source>
+<target>Ricerca della cartella %x...</target>
<source>Show in Explorer</source>
<target>Mostra in Esplora Risorse</target>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>Seleziona impostazioni di sincronizzazione alternative</target>
-<source>No filter selected</source>
-<target>Nessun filtro selezionato</target>
-
<source>Filter is active</source>
<target>Il filtro e' attivo</target>
+<source>No filter selected</source>
+<target>Nessun filtro selezionato</target>
+
<source>Remove alternate settings</source>
<target>Rimuovi impostazioni alternative</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Preferenze</target>
-<source>Synchronization Preview</source>
-<target>Anteprima sincronizzazione</target>
+<source>Summary</source>
+<target>Sommario</target>
<source>Find</source>
<target>Trova</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Sfoglia</target>
-<source>Invalid command line: %x</source>
-<target>Linea di comando non valida: %x</target>
+<source>Invalid command line:</source>
+<target>Linea di comando non valida:</target>
<source>Info</source>
<target>Info</target>
@@ -119,7 +119,7 @@
<target>Linux - Errore codice %x:</target>
<source>Cannot resolve symbolic link %x.</source>
-<target></target>
+<target>Impossibile risolvere collegamento %x.</target>
<source>%x MB</source>
<target>%x MB</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Il nome volume %x non è parte del nome file %y!</target>
-<source>Cannot find file %x.</source>
-<target>Impossibile trovare il file %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Impossibile leggere i seguenti elementi XML:</target>
-<source>S&ave configuration...</source>
-<target>S&alva configurazione...</target>
+<source>Cannot find file %x.</source>
+<target>Impossibile trovare il file %x.</target>
+
+<source>&Open...</source>
+<target>&Apri...</target>
-<source>&Load configuration...</source>
-<target>&Carica configurazione...</target>
+<source>&Save...</source>
+<target>&Salva...</target>
<source>&Quit</source>
<target>&Esci</target>
-<source>&File</source>
-<target>&File</target>
+<source>&Program</source>
+<target>&Programma</target>
<source>&Content</source>
<target>&Contenuto</target>
-<source>&About...</source>
-<target>&Informazioni...</target>
+<source>&About</source>
+<target>&Informazioni</target>
<source>&Help</source>
<target>&?</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Uso:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Seleziona cartelle da monitorare.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Seleziona cartelle da controllare.</target>
<source>2. Enter a command line.</source>
<target>2. Inserisci linea di comando.</target>
@@ -265,18 +265,10 @@
<source>3. Press 'Start'.</source>
<target>3. Premi 'Start'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-La linea di comando è eseguita ogni volta che:
-- tutte le cartelle diventano disponibili (es: inserimento memoria USB)
-- file in queste cartelle o sottocartelle vengono modificati
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Per iniziare è sufficiente importare un file con estensione .ffs_batch</target>
-<source>Directories to watch</source>
+<source>Folders to watch</source>
<target>Cartelle da controllare</target>
<source>Add folder</source>
@@ -288,14 +280,25 @@ La linea di comando è eseguita ogni volta che:
<source>Select a folder</source>
<target>Seleziona una cartella</target>
+<source>Delay [seconds]</source>
+<target>Ritardo [secondi]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Tempo di attesa tra ultimo cambiamento rilevato ed esecuzione dei comandi</target>
+
<source>Command line</source>
<target>Linea di comando</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Tempo minimo di attesa [seconds]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Tempo di attesa in secondi fra il rilevamento dell'ultima modifica e l'esecuzione della linea di comando</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Il comando è attivato se:
+- file o sottocartelle cambiano
+- nuove cartelle vengono aggiunte (es. inserimento di memoria USB)
+</target>
<source>Start</source>
<target>Avvia</target>
@@ -324,8 +327,8 @@ La linea di comando è eseguita ogni volta che:
<source>Waiting for missing directories...</source>
<target>In attesa delle cartelle mancanti...</target>
-<source>A directory input field is empty.</source>
-<target>Un campo cartella di input è vuoto.</target>
+<source>An input folder name is empty.</source>
+<target>Il nome di una cartella di input è vuoto.</target>
<source>Logging</source>
<target>Registo attività</target>
@@ -396,12 +399,12 @@ La linea di comando è eseguita ogni volta che:
<source>Download now?</source>
<target>Scaricarla ora?</target>
-<source>Information</source>
-<target>Informazioni</target>
-
<source>FreeFileSync is up to date!</source>
<target>FreeFileSync è aggiornato!</target>
+<source>Information</source>
+<target>Informazioni</target>
+
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
<target>Vuoi che FreeFileSync controlli automaticamente gli aggiornamenti ogni settimana?</target>
@@ -411,7 +414,7 @@ La linea di comando è eseguita ogni volta che:
<source><Symlink></source>
<target><Symlink></target>
-<source><Directory></source>
+<source><Folder></source>
<target><Cartella></target>
<source>Full path</source>
@@ -423,8 +426,8 @@ La linea di comando è eseguita ogni volta che:
<source>Relative path</source>
<target>Percorso relativo</target>
-<source>Directory</source>
-<target>Cartella</target>
+<source>Base folder</source>
+<target>Cartella di partenza</target>
<source>Size</source>
<target>Dimensione</target>
@@ -435,23 +438,26 @@ La linea di comando è eseguita ogni volta che:
<source>Extension</source>
<target>Estensione</target>
-<source>Comparison Result</source>
-<target>Risultato della comparazione</target>
+<source>Action</source>
+<target>Azioni</target>
+
+<source>Category</source>
+<target>Categoria</target>
<source>Drag && drop</source>
-<target>Drag && drop</target>
+<target>Trascina</target>
<source>Close progress dialog</source>
<target>Chiudi stato di avanzamento</target>
-<source>Shut down</source>
-<target>Arresta</target>
+<source>Standby</source>
+<target>Sospendi</target>
<source>Log off</source>
<target>Termina sessione</target>
-<source>Standby</source>
-<target>Sospendi</target>
+<source>Shut down</source>
+<target>Arresta</target>
<source>Hibernate</source>
<target>Iberna</target>
@@ -459,15 +465,12 @@ La linea di comando è eseguita ogni volta che:
<source>1. &Compare</source>
<target>1. &Compara</target>
-<source>2. &Synchronize...</source>
-<target>2. &Sincronizza...</target>
+<source>2. &Synchronize</source>
+<target>2. &Sincronizza</target>
<source>&New</source>
<target>&Nuovo</target>
-<source>&Program</source>
-<target>&Programma</target>
-
<source>&Language</source>
<target>&Lingua</target>
@@ -495,8 +498,8 @@ La linea di comando è eseguita ogni volta che:
<source>&Abort</source>
<target>&Abbandona</target>
-<source>Synchronize...</source>
-<target>Sincronizza...</target>
+<source>Synchronize</source>
+<target>Sincronizza</target>
<source>Start synchronization</source>
<target>Avvia sincronizzazione</target>
@@ -510,12 +513,12 @@ La linea di comando è eseguita ogni volta che:
<source>Swap sides</source>
<target>Inverti i lati</target>
-<source>Save current configuration to file</source>
-<target>Salva la configurazione corrente in un file</target>
-
<source>Load configuration from file</source>
<target>Carica configurazione da file</target>
+<source>Save current configuration to file</source>
+<target>Salva la configurazione corrente in un file</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Ultima configurazione utilizzata (premi CANC per rimuovere dall'elenco)</target>
@@ -525,21 +528,18 @@ La linea di comando è eseguita ogni volta che:
<source>Hide filtered or temporarily excluded files</source>
<target>Nascondi file filtrati o temporaneamente esclusi</target>
-<source>Number of files and directories that will be created</source>
+<source>Number of files and folders that will be created</source>
<target>Numero di file e cartelle che verranno creati</target>
<source>Number of files that will be overwritten</source>
<target>Numero di file che verranno sovrascritti</target>
-<source>Number of files and directories that will be deleted</source>
+<source>Number of files and folders that will be deleted</source>
<target>Numero di file e cartelle che verranno eliminati</target>
<source>Total amount of data that will be transferred</source>
<target>Volume dei dati che verranno trasferiti</target>
-<source>Operation:</source>
-<target>Operazione:</target>
-
<source>Items found:</source>
<target>Elementi trovati:</target>
@@ -555,8 +555,8 @@ La linea di comando è eseguita ogni volta che:
<source>Batch job</source>
<target>Attivitò batch</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Crea un file batch e automatizza la sincronizzazione. Per lanciare in modalità batch fai semplicemente doppio-click su questo file o esegui da linea di comando: FreeFileSync.exe SyncJob.ffs_batch. Puoi anche schedularlo nelle operazioni pianificate del tuo sistema.</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>Crea un file batch per automatizzare la sincronizzazione. Doppio click su questo file o schedula nelle operazioni pianificate del tuo sistema: FreeFileSync.exe <nome file batch>.ffs_batch</target>
<source>Help</source>
<target>?</target>
@@ -582,18 +582,12 @@ La linea di comando è eseguita ogni volta che:
<source>Maximum number of log files:</source>
<target>Numero massimo di file registro:</target>
-<source>Select log file directory:</source>
-<target>Seleziona cartella per il file di registro:</target>
+<source>Select folder to save log files:</source>
+<target>Seleziona cartella per il salvataggio dei file registro:</target>
<source>Batch settings</source>
<target>Impostazioni batch</target>
-<source>&Save</source>
-<target>&Salva</target>
-
-<source>&Load</source>
-<target>&Carica</target>
-
<source>Select variant:</source>
<target>Seleziona una variante:</target>
@@ -618,29 +612,23 @@ La linea di comando è eseguita ogni volta che:
<source>Configuration</source>
<target>Configurazione</target>
-<source>Category</source>
-<target>Categoria</target>
-
-<source>Action</source>
-<target>Azioni</target>
+<source>Item exists on left side only</source>
+<target>L'elemento esiste solo sul lato sinistro</target>
-<source>File/folder exists on left side only</source>
-<target>File/cartella esiste solo sul lato sinistro</target>
+<source>Item exists on right side only</source>
+<target>L'elemento esiste solo sul lato destro</target>
-<source>File/folder exists on right side only</source>
-<target>File/cartella esiste solo sul lato destro</target>
+<source>Left side is newer</source>
+<target>Il più recente è sul lato sinistro</target>
-<source>Left file is newer</source>
-<target>Il file di sinistra è più recente</target>
+<source>Right side is newer</source>
+<target>Il più recente è sul lato destro</target>
-<source>Right file is newer</source>
-<target>Il file di destra è più recente</target>
+<source>Items have different content</source>
+<target>Gli elementi hanno contenuto differente</target>
-<source>Files have different content</source>
-<target>I file hanno differente contenuto</target>
-
-<source>Conflict/file cannot be categorized</source>
-<target>I conflitti/file non possono essere categorizzati</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Conflitto/elemento non categorizzabile</target>
<source>OK</source>
<target>OK</target>
@@ -673,7 +661,7 @@ I file sono considerati identici se
</target>
<source>Symbolic Link handling</source>
-<target>Gestione link simbolico</target>
+<target>Gestione Collegamenti</target>
<source>Synchronizing...</source>
<target>Sincronizzazione...</target>
@@ -747,33 +735,6 @@ Solo i file che corrispondono esattamente a tutti i filtri impostati verrranno s
Nota: I nomi dei file devono essere relativi alle cartelle di appartenenza!
</target>
-<source>Hints:</source>
-<target>Consigli:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Inserisci i nomi relativi di file o cartella separati da ';' o su una nuova riga.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Sono ammessi i caratteri generici '*' e '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Escludi i file direttamente sulla griglia principale tramite il menu contestuale.</target>
-
-<source>Example</source>
-<target>Esempio</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Includi: *.doc;*.zip;*.exe
-Escludi: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Sincronizza tutti i file .doc, .zip e .exe eccetto tutti quelli nella cartella "temp".</target>
-
<source>Include</source>
<target>Includi</target>
@@ -795,8 +756,8 @@ Escludi: \stuff\temp\*
<source>&Default</source>
<target>&Predefinito</target>
-<source>Transactional file copy</source>
-<target>Copia transazionale file</target>
+<source>Fail-safe file copy</source>
+<target>Copia file sicura</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>Scrivi in un file temporaneo (*.ffs_tmp) prima di rinominarlo. Ciò garantisce uno stato consistente anche in caso di errore fatale.</target>
@@ -810,8 +771,8 @@ Escludi: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Copia permessi di accesso file</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Trasferisci permessi file cartelle (richiede diritti di amministrazione)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Permessi di traferimento file e cartelle (Richiede diritti di Amministratore)</target>
<source>Restore hidden dialogs</source>
<target>Ripristina i messaggi nascosti</target>
@@ -1119,11 +1080,11 @@ Escludi: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integra applicazioni esterne nel menu contestuale. Sono disponibili le seguenti macro:</target>
-<source>- full file or directory name</source>
-<target>- file completo o nome cartella</target>
+<source>- full file or folder name</source>
+<target>- nome completo file o cartella</target>
-<source>- directory part only</source>
-<target>- solo parte di cartella</target>
+<source>- folder part only</source>
+<target>- solo porzione cartella</target>
<source>- Other side's counterpart to %name</source>
<target>- l'altro lato e' equivalente a %name</target>
@@ -1167,8 +1128,8 @@ Escludi: \stuff\temp\*
<source>Versioning</source>
<target>Versione</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Sposta file in una sotto cartella datata</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>
@@ -1252,7 +1213,7 @@ Escludi: \stuff\temp\*
<target>Impossibile creare cartella %x.</target>
<source>Cannot copy symbolic link %x to %y.</source>
-<target>Impossibile copiare collegamento simbolico %x su %y.</target>
+<target>Impossibile copiare collegamento %x su %y.</target>
<source>Cannot write file attributes of %x.</source>
<target>Impossibile scrivere attributi file di %x.</target>
@@ -1263,8 +1224,8 @@ Escludi: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Impossibile leggere cartella %x.</target>
-<source>Endless loop.</source>
-<target>Loop senza fine.</target>
+<source>Detected endless directory recursion.</source>
+<target>Rilevato percorso ricorsivo senza fine.</target>
<source>Cannot set privilege %x.</source>
<target>Impossibile impostare privilegi %x.</target>
@@ -1290,13 +1251,10 @@ Escludi: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Il file non contiene una configurazione valida</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
+<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>
-<source>Cannot find directory %x.</source>
+<source>Cannot find folder %x.</source>
<target>Impossibile trovare cartella %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
@@ -1315,7 +1273,7 @@ Escludi: \stuff\temp\*
<target>I file %x hanno la stessa data ma dimensione diversa!</target>
<source>Symbolic links %x have the same date but a different target.</source>
-<target>Collegamento simbolico %x ha stessa data ma un diverso puntamento.</target>
+<target>Il collegamento %x ha stessa data ma un diverso puntamento.</target>
<source>Comparing content of files %x</source>
<target>Comparazione contenuto del file %x</target>
@@ -1329,20 +1287,20 @@ Escludi: \stuff\temp\*
<source>Both sides are equal</source>
<target>Entrambi i lati sono uguali</target>
-<source>Files/folders differ in attributes only</source>
-<target>File/cartelle differiscono solo negli attributi</target>
+<source>Items have different attributes</source>
+<target>Gli elementi hanno differenti attributi</target>
-<source>Copy new file/folder to left</source>
-<target>Copia nuovo file/cartella verso sinistra</target>
+<source>Copy new item to left</source>
+<target>Copia nuovo elemento a sinistra</target>
-<source>Copy new file/folder to right</source>
-<target>Copia nuovo file/cartella verso destra</target>
+<source>Copy new item to right</source>
+<target>Copia nuovo elemento a destra</target>
-<source>Delete left file/folder</source>
-<target>Cancella file/cartella di sinistra</target>
+<source>Delete left item</source>
+<target>Elimina elemento di sinistra</target>
-<source>Delete right file/folder</source>
-<target>Cancella file/cartella di destra</target>
+<source>Delete right item</source>
+<target>Elimina elemento di destra</target>
<source>Move file on left</source>
<target>Sposta il file a sinistra</target>
@@ -1350,20 +1308,20 @@ Escludi: \stuff\temp\*
<source>Move file on right</source>
<target>Sposta il file a destra</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Sovrascrivi file/cartella di sinistra con quello di destra</target>
+<source>Overwrite left item</source>
+<target>Sovrascrivi elemento di sinistra</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Sovrascrivi file/cartella di destra con quello di sinistra</target>
+<source>Overwrite right item</source>
+<target>Sovrascrivi elemento di destra</target>
<source>Do nothing</source>
<target>Non fare nulla</target>
-<source>Copy file attributes only to left</source>
-<target>Copia i soli attributi file verso sinistra</target>
+<source>Update attributes on left</source>
+<target>Aggiorna attributi a sinistra</target>
-<source>Copy file attributes only to right</source>
-<target>Copia i soli attributi file verso destra</target>
+<source>Update attributes on right</source>
+<target>Aggiorna attributi a destra</target>
<source>Multiple...</source>
<target>Multiplo...</target>
@@ -1375,7 +1333,7 @@ Escludi: \stuff\temp\*
<target>Eliminazione cartella %x</target>
<source>Deleting symbolic link %x</source>
-<target>Eliminazione link simbolico %x</target>
+<target>Eliminazione collegamento %x</target>
<source>Moving file %x to recycle bin</source>
<target>Spostamento file %x nel Cestino</target>
@@ -1384,7 +1342,7 @@ Escludi: \stuff\temp\*
<target>Spostamento cartella %x nel Cestino</target>
<source>Moving symbolic link %x to recycle bin</source>
-<target>Spostamento link simbolico %x nel Cestino</target>
+<target>Spostamento collegamento %x nel Cestino</target>
<source>Moving file %x to %y</source>
<target>Spostamento file %x in %y</target>
@@ -1393,13 +1351,13 @@ Escludi: \stuff\temp\*
<target>Spostamento cartella %x in %y</target>
<source>Moving symbolic link %x to %y</source>
-<target>Spostamento link simbolico %x in %y</target>
+<target>Spostamento collegamento %x in %y</target>
<source>Creating file %x</source>
<target>Creazione file %x</target>
<source>Creating symbolic link %x</source>
-<target>Creazione link simbolico %x</target>
+<target>Creazione collegamento %x</target>
<source>Creating folder %x</source>
<target>Creazione cartella %x</target>
@@ -1408,7 +1366,7 @@ Escludi: \stuff\temp\*
<target>Sovrascrittura file %x</target>
<source>Overwriting symbolic link %x</source>
-<target>Sovrascrittura link simbolico %x</target>
+<target>Sovrascrittura collegamento %x</target>
<source>Verifying file %x</source>
<target>Verifica file %x</target>
@@ -1416,11 +1374,11 @@ Escludi: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Aggiornamento attributi di %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Il nome della cartella di destinazione non può essere vuoto!</target>
+<source>Target folder name must not be empty.</source>
+<target>Il nome della cartella di destinazione non può essere vuoto.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Non è stata indicata una cartella per il file delle versioni!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Il nome della cartella per le versioni dei file non può essere vuoto.</target>
<source>Source directory %x not found.</source>
<target>Cartella sorgente %x non trovata.</target>
@@ -1449,8 +1407,8 @@ Escludi: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Una cartella che fa parte di più coppie di cartelle sarà modificata! Ricontrolla le impostazioni di sincronizzazione!</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>
diff --git a/BUILD/Languages/japanese.lng b/BUILD/Languages/japanese.lng
index 1d7b1b65..bd10d465 100644
--- a/BUILD/Languages/japanese.lng
+++ b/BUILD/Languages/japanese.lng
@@ -7,8 +7,8 @@
<plural definition>0</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>ディレクトリ %x を検索中...</target>
+<source>Searching for folder %x...</source>
+<target>フォルダ %x を検索中...</target>
<source>Show in Explorer</source>
<target>エクスプローラã§è¡¨ç¤º</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>リアルタイムåŒæœŸ - 自動åŒæœŸ</target>
+<source>Error</source>
+<target>エラー</target>
+
<source>Select alternate comparison settings</source>
<target>代替比較設定をé¸æŠž</target>
<source>Select alternate synchronization settings</source>
<target>代替åŒæœŸè¨­å®šã‚’é¸æŠž</target>
-<source>No filter selected</source>
-<target>フィルターé¸æŠžãªã—</target>
-
<source>Filter is active</source>
<target>フィルターを有効化</target>
+<source>No filter selected</source>
+<target>フィルターé¸æŠžãªã—</target>
+
<source>Remove alternate settings</source>
<target>代替設定を除去</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>情報</target>
-<source>Error</source>
-<target>エラー</target>
-
<source>Warning</source>
<target>警告</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>全般的ãªè¨­å®š</target>
-<source>Synchronization Preview</source>
-<target>åŒæœŸå‡¦ç†ã®ãƒ—レビュー</target>
+<source>Summary</source>
+<target>概è¦</target>
<source>Find</source>
<target>検索</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>å‚ç…§</target>
-<source>Invalid command line: %x</source>
-<target>無効ãªã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³: %x</target>
+<source>Invalid command line:</source>
+<target>無効ãªã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³:</target>
<source>Info</source>
<target>情報</target>
@@ -229,23 +229,23 @@
<source>Cannot read the following XML elements:</source>
<target>次㮠XMLè¦ç´ ã‚’読ã¿è¾¼ã‚ã¾ã›ã‚“:</target>
-<source>S&ave configuration...</source>
-<target>構æˆè¨­å®šã‚’ä¿å­˜(&A)...</target>
+<source>&Open...</source>
+<target>é–‹ã(&O)...</target>
-<source>&Load configuration...</source>
-<target>構æˆè¨­å®šã®èª­ã¿è¾¼ã¿(&L)...</target>
+<source>&Save...</source>
+<target>ä¿å­˜(&S)...</target>
<source>&Quit</source>
-<target>終了(&Q)</target>
+<target>終了(&Q)(&Q)</target>
-<source>&File</source>
-<target>ファイル(&F)</target>
+<source>&Program</source>
+<target>プログラム(&P)</target>
<source>&Content</source>
<target>トピック(&C)</target>
-<source>&About...</source>
-<target>情報(&A)...</target>
+<source>&About</source>
+<target>情報(&A)</target>
<source>&Help</source>
<target>ヘルプ(&H)</target>
@@ -253,8 +253,8 @@
<source>Usage:</source>
<target>使用方法:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. 監視ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž</target>
+<source>1. Select folders to watch.</source>
+<target>1. 監視ã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž</target>
<source>2. Enter a command line.</source>
<target>2. コマンドラインを入力</target>
@@ -262,19 +262,11 @@
<source>3. Press 'Start'.</source>
<target>3. 'スタート'をクリック</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ãã®éƒ½åº¦å®Ÿè¡Œã•ã‚Œã¾ã™:
-- ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§åˆ©ç”¨å¯èƒ½ã§ã™ (例. USB スティックã®æŒ¿å…¥æ™‚)
-- ディレクトリã€ã¾ãŸã¯ã‚µãƒ–ディレクトリ内ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ›´æ–°ã•ã‚Œã¾ã™ã€‚
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>一括ファイル(.ffs)ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¦é–‹å§‹</target>
-<source>Directories to watch</source>
-<target>ディレクトリを監視</target>
+<source>Folders to watch</source>
+<target>監視ã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€</target>
<source>Add folder</source>
<target>フォルダを追加</target>
@@ -285,18 +277,35 @@ The command line is executed each time:
<source>Select a folder</source>
<target>フォルダをé¸æŠž</target>
+<source>Delay [seconds]</source>
+<target>é…延[秒]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>最後ã«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¦ã‹ã‚‰ã€æ¬¡ã«å¤‰æ›´ã‚’検出ã™ã‚‹ã¾ã§ã®å¾…機時間</target>
+
<source>Command line</source>
<target>コマンドライン</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>最å°å¾…機時間[秒]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>最後ã®å¤‰æ›´ã®æ¤œå‡ºã‹ã‚‰ã€æ¬¡ã«ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚’実行ã™ã‚‹ã¾ã§ã®å¾…機時間(秒)</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã®ãƒˆãƒªã‚¬æ¡ä»¶:
+- ファイルã¾ãŸã¯ã‚µãƒ–フォルダã®å¤‰æ›´
+- æ–°è¦ãƒ•ã‚©ãƒ«ãƒ€ã®è¿½åŠ  (例. USB ã®æŒ¿å…¥)
+</target>
<source>Start</source>
<target>開始</target>
+<source>&Retry</source>
+<target>å†è©¦è¡Œ(&R)</target>
+
+<source>Cancel</source>
+<target>キャンセル</target>
+
<source>(Build: %x)</source>
<target>(ビルド: %x)</target>
@@ -315,8 +324,8 @@ The command line is executed each time:
<source>Waiting for missing directories...</source>
<target>見失ã£ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å¾…機中...</target>
-<source>A directory input field is empty.</source>
-<target>ディレクトリãŒå…¥åŠ›ã•ã‚Œã¦ã„ã¾ã›ã‚“</target>
+<source>An input folder name is empty.</source>
+<target>空ã®ãƒ•ã‚©ãƒ«ãƒ€å入力</target>
<source>Logging</source>
<target>ログ</target>
@@ -402,8 +411,8 @@ The command line is executed each time:
<source><Symlink></source>
<target><シンボリックリンク></target>
-<source><Directory></source>
-<target><ディレクトリ></target>
+<source><Folder></source>
+<target><フォルダ></target>
<source>Full path</source>
<target>フルパス</target>
@@ -414,8 +423,8 @@ The command line is executed each time:
<source>Relative path</source>
<target>相対パス</target>
-<source>Directory</source>
-<target>ディレクトリ</target>
+<source>Base folder</source>
+<target>基準フォルダ</target>
<source>Size</source>
<target>サイズ</target>
@@ -426,8 +435,11 @@ The command line is executed each time:
<source>Extension</source>
<target>æ‹¡å¼µå­</target>
-<source>Comparison Result</source>
-<target>比較çµæžœ</target>
+<source>Action</source>
+<target>æ“作</target>
+
+<source>Category</source>
+<target>カテゴリ</target>
<source>Drag && drop</source>
<target>ドラッグ && ドロップ</target>
@@ -435,14 +447,14 @@ The command line is executed each time:
<source>Close progress dialog</source>
<target>進æ—ダイアログを閉ã˜ã‚‹</target>
-<source>Shut down</source>
-<target>シャットダウン</target>
+<source>Standby</source>
+<target>スタンãƒã‚¤</target>
<source>Log off</source>
<target>ログオフ</target>
-<source>Standby</source>
-<target>スタンãƒã‚¤</target>
+<source>Shut down</source>
+<target>シャットダウン</target>
<source>Hibernate</source>
<target>休止状態</target>
@@ -450,15 +462,12 @@ The command line is executed each time:
<source>1. &Compare</source>
<target>1. 比較(&C)</target>
-<source>2. &Synchronize...</source>
-<target>2. åŒæœŸå‡¦ç†(&S)...</target>
+<source>2. &Synchronize</source>
+<target>2. åŒæœŸå‡¦ç†(&S)</target>
<source>&New</source>
<target>æ–°è¦(&N)</target>
-<source>&Program</source>
-<target>プログラム(&P)</target>
-
<source>&Language</source>
<target>使用言語(&L)</target>
@@ -486,8 +495,8 @@ The command line is executed each time:
<source>&Abort</source>
<target>情報(&A)</target>
-<source>Synchronize...</source>
-<target>åŒæœŸå‡¦ç†...</target>
+<source>Synchronize</source>
+<target>åŒæœŸå‡¦ç†</target>
<source>Start synchronization</source>
<target>åŒæœŸã®é–‹å§‹</target>
@@ -501,12 +510,12 @@ The command line is executed each time:
<source>Swap sides</source>
<target>パãƒãƒ«ã‚’入れ替ãˆ</target>
-<source>Save current configuration to file</source>
-<target>ç¾åœ¨ã®è¨­å®šã‚’ファイルã«ä¿å­˜</target>
-
<source>Load configuration from file</source>
<target>外部ファイルã‹ã‚‰æ§‹æˆè¨­å®šã‚’読ã¿è¾¼ã¿ã¾ã™</target>
+<source>Save current configuration to file</source>
+<target>ç¾åœ¨ã®è¨­å®šã‚’ファイルã«ä¿å­˜</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>å‰å›žä½¿ç”¨ã—ãŸæ§‹æˆè¨­å®š(DEL キーã§ãƒªã‚¹ãƒˆã‹ã‚‰é™¤åŽ»ã—ã¾ã™)</target>
@@ -516,14 +525,14 @@ The command line is executed each time:
<source>Hide filtered or temporarily excluded files</source>
<target>フィルターã€ã¾ãŸã¯ä¸€æ™‚除外ファイルを隠ã™</target>
-<source>Number of files and directories that will be created</source>
-<target>作æˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•°</target>
+<source>Number of files and folders that will be created</source>
+<target>作æˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã€ãŠã‚ˆã³ãƒ•ã‚©ãƒ«ãƒ€ã®æ•°</target>
<source>Number of files that will be overwritten</source>
<target>上書ãã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«æ•°</target>
-<source>Number of files and directories that will be deleted</source>
-<target>削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ•°</target>
+<source>Number of files and folders that will be deleted</source>
+<target>削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã€ãŠã‚ˆã³ãƒ•ã‚©ãƒ«ãƒ€ã®æ•°</target>
<source>Total amount of data that will be transferred</source>
<target>転é€ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ç·é‡</target>
@@ -546,14 +555,14 @@ The command line is executed each time:
<source>Batch job</source>
<target>一括処ç†</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>一括ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¦ã€åŒæœŸã‚’自動化ã—ã¾ã™ã€é–‹å§‹æ–¹æ³•ã¯ãƒãƒƒãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’ダブルクリックã™ã‚‹ã‹æ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¾ã™:FreeFileSync.exe SyncJob.ffs_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>åŒæœŸå‡¦ç†ã‚’自動的ã«è¡Œã†ãŸã‚ã®ä¸€æ‹¬ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚ファイルをダブルクリック,ã¾ãŸã¯æ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’タスクã‹ã‚‰å®Ÿè¡Œ:FreeFileSync.exe <ジョブå>.ffs_batch</target>
<source>Help</source>
<target>ヘルプ</target>
<source>Filter files</source>
-<target>ファイルフィルター</target>
+<target>ファイルフィルター</target>
<source>Left</source>
<target>å·¦å´</target>
@@ -573,21 +582,12 @@ The command line is executed each time:
<source>Maximum number of log files:</source>
<target>ログファイルã®æœ€å¤§æ•°:</target>
-<source>Select log file directory:</source>
-<target>ログファイルã®ä¿å­˜å…ˆã‚’é¸æŠž:</target>
+<source>Select folder to save log files:</source>
+<target>ログファイルä¿å­˜å…ˆãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž:</target>
<source>Batch settings</source>
<target>一括設定</target>
-<source>&Save</source>
-<target>ä¿å­˜(&S)</target>
-
-<source>&Load</source>
-<target>読ã¿è¾¼ã¿(&L)</target>
-
-<source>Cancel</source>
-<target>キャンセル</target>
-
<source>Select variant:</source>
<target>変数をé¸æŠž:</target>
@@ -612,29 +612,23 @@ The command line is executed each time:
<source>Configuration</source>
<target>構æˆè¨­å®š</target>
-<source>Category</source>
-<target>カテゴリ</target>
-
-<source>Action</source>
-<target>æ“作</target>
-
-<source>File/folder exists on left side only</source>
-<target>å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ</target>
+<source>Item exists on left side only</source>
+<target>å·¦å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹é …ç›®</target>
-<source>File/folder exists on right side only</source>
-<target>å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダ</target>
+<source>Item exists on right side only</source>
+<target>å³å´ã®ã¿ã«å­˜åœ¨ã™ã‚‹é …ç›®</target>
-<source>Left file is newer</source>
-<target>å·¦å´ã®æ–°ã—ã„ファイル</target>
+<source>Left side is newer</source>
+<target>å·¦å´ãŒã‚ˆã‚Šæ–°ã—ã„</target>
-<source>Right file is newer</source>
-<target>å³å´ã®æ–°ã—ã„ファイル</target>
+<source>Right side is newer</source>
+<target>å³å´ãŒã‚ˆã‚Šæ–°ã—ã„</target>
-<source>Files have different content</source>
-<target>ファイル内容ã¯ç•°ãªã‚Šã¾ã™</target>
+<source>Items have different content</source>
+<target>内容ãŒç•°ãªã‚‹é …ç›®</target>
-<source>Conflict/file cannot be categorized</source>
-<target>競åˆãŒã‚ã‚‹ãŸã‚分類ã§ãã¾ã›ã‚“</target>
+<source>Conflict/item cannot be categorized</source>
+<target>競åˆ/項目を分類化ã§ãã¾ã›ã‚“</target>
<source>OK</source>
<target>OK</target>
@@ -711,9 +705,6 @@ is the same
<source>&Ignore</source>
<target>無視(&I)</target>
-<source>&Retry</source>
-<target>å†è©¦è¡Œ(&R)</target>
-
<source>Do not show this dialog again</source>
<target>次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„</target>
@@ -744,33 +735,6 @@ Note: File names must be relative to base directories!
注æ„: ファイルåã¯åŸºæº–ディレクトリã«æ¯”例ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™!
</target>
-<source>Hints:</source>
-<target>ヒント:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. 相対ファイルã€ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ ';' ã¾ãŸã¯ 改行ã§åŒºåˆ‡ã£ã¦å…¥åŠ›</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. ワイルドカード㫠' * ' 㨠' ? ' を使用出æ¥ã¾ã™ã€‚</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. コンテキストメニューã‹ã‚‰ç›´æŽ¥ãƒ•ã‚¡ã‚¤ãƒ«ã‚’除外出æ¥ã¾ã™ã€‚</target>
-
-<source>Example</source>
-<target>例</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-å«ã‚ã‚‹: *.doc;*.zip;*.exe
-除外: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>"temp" ã®ã‚µãƒ–フォルダを除ã„ã¦ã€ã™ã¹ã¦ã®.docã€.zipã€ãŠã‚ˆã³.exeファイルをåŒæœŸ</target>
-
<source>Include</source>
<target>å«ã‚ã‚‹</target>
@@ -792,8 +756,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>デフォルト(&D)</target>
-<source>Transactional file copy</source>
-<target>トランザクション・コピーを使用</target>
+<source>Fail-safe file copy</source>
+<target>ファイルコピーã®å¤±æ•—</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>最åˆã«ä¸€æ™‚ファイル(*.ffs_tmp)ã«æ›¸ãè¾¼ã¿ã€ãれをリãƒãƒ¼ãƒ ã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€è‡´å‘½çš„ãªã‚¨ãƒ©ãƒ¼ãŒèµ·ã“ã£ã¦ã‚‚状態ã¯ä¿è¨¼ã•ã‚Œã¾ã™</target>
@@ -807,8 +771,8 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>ファイルã®ã‚¢ã‚¯ã‚»ã‚¹ãƒ‘ーミッションをコピーã™ã‚‹</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘ーミッション転é€(管ç†è€…権é™ãŒå¿…è¦)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>転é€ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ•ã‚©ãƒ«ãƒ€ã®ãƒ‘ーミッション(管ç†è€…権é™ãŒå¿…è¦)</target>
<source>Restore hidden dialogs</source>
<target>éš ã—ãŸãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã‚’復帰</target>
@@ -1112,11 +1076,11 @@ Exclude: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>外部ã®ã‚¢ãƒ—リケーションをコンテキストメニューã«çµ±åˆã€ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ãŒåˆ©ç”¨ã§ãã¾ã™:</target>
-<source>- full file or directory name</source>
-<target>- 完全ãªãƒ•ã‚¡ã‚¤ãƒ«/フォルダå</target>
+<source>- full file or folder name</source>
+<target>- ファイルã€ãƒ•ã‚©ãƒ«ãƒ€ã®å®Œå…¨ãªåå‰</target>
-<source>- directory part only</source>
-<target>- ディレクトリ部ã®ã¿</target>
+<source>- folder part only</source>
+<target>- フォルダ部分ã®ã¿</target>
<source>- Other side's counterpart to %name</source>
<target>- %name ã®å対å´ã®å¯¾è±¡</target>
@@ -1158,8 +1122,8 @@ Exclude: \stuff\temp\*
<source>Versioning</source>
<target>ãƒãƒ¼ã‚¸ãƒ§ãƒ³ä»˜ã‘</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>ファイルをタイムスタンプåã®ã‚µãƒ–フォルダã«ç§»å‹•</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>サブフォルダã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’移動</target>
<source>Files</source>
<target>ファイル</target>
@@ -1251,8 +1215,8 @@ Exclude: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>ディレクトリ %x を読ã¿è¾¼ã‚ã¾ã›ã‚“.</target>
-<source>Endless loop.</source>
-<target>エンドレスループ</target>
+<source>Detected endless directory recursion.</source>
+<target>ディレクトリå†å¸°å‡¦ç†ã§ãƒ«ãƒ¼ãƒ—を検出</target>
<source>Cannot set privilege %x.</source>
<target>%x ã®ç‰¹æ¨©ã‚’セットã§ãã¾ã›ã‚“.</target>
@@ -1278,14 +1242,11 @@ Exclude: \stuff\temp\*
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>åŒæœŸæ–¹å‘ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨­å®š: å¤ã„ファイルã«æ–°ã—ã„ファイルを上書ã</target>
-<source>The file does not contain a valid configuration:</source>
-<target>ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯æœ‰åŠ¹ãªæ§‹æˆãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>ディレクトリãŒç©ºã¨è€ƒæ…®ã™ã‚‹å ´åˆã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™ã€‚</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target>フォルダを空ã¨æƒ³å®šã™ã‚‹å ´åˆã¯ã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ç„¡è¦–ã§ãã¾ã™.</target>
-<source>Cannot find directory %x.</source>
-<target>ディレクトリ %x ãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“.</target>
+<source>Cannot find folder %x.</source>
+<target>フォルダ %x ãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>ディレクトリãŒä¾å­˜é–¢ä¿‚ã«ã‚ã‚Šã¾ã™! åŒæœŸè¦å‰‡ã®è¨­å®šæ™‚ã«ã¯æ³¨æ„ã—ã¦ãã ã•ã„:</target>
@@ -1317,20 +1278,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>両å´ã¨ã‚‚ç­‰ã—ã</target>
-<source>Files/folders differ in attributes only</source>
-<target>属性ã®ç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã®ã¿</target>
+<source>Items have different attributes</source>
+<target>属性ãŒç•°ãªã‚‹é …ç›®</target>
-<source>Copy new file/folder to left</source>
-<target>æ–°ã—ã„ファイル/フォルダを左å´ã«ã‚³ãƒ”ー</target>
+<source>Copy new item to left</source>
+<target>æ–°ã—ã„項目を左ã«ã‚³ãƒ”ー</target>
-<source>Copy new file/folder to right</source>
-<target>æ–°ã—ã„ファイル/フォルダをå³å´ã«ã‚³ãƒ”ー</target>
+<source>Copy new item to right</source>
+<target>æ–°ã—ã„項目をå³ã«ã‚³ãƒ”ー</target>
-<source>Delete left file/folder</source>
-<target>å·¦å´ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除</target>
+<source>Delete left item</source>
+<target>å·¦ã®é …目を削除</target>
-<source>Delete right file/folder</source>
-<target>å³å´ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダを削除</target>
+<source>Delete right item</source>
+<target>å³ã®é …目を削除</target>
<source>Move file on left</source>
<target>ファイルを左ã«ç§»å‹•</target>
@@ -1338,20 +1299,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>ファイルをå³ã«ç§»å‹•</target>
-<source>Overwrite left file/folder with right one</source>
-<target>å³å´ã®ã‚‚ã®ã‚’å·¦å´ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã«ä¸Šæ›¸ã</target>
+<source>Overwrite left item</source>
+<target>å·¦ã®é …ç›®ã«ä¸Šæ›¸ã</target>
-<source>Overwrite right file/folder with left one</source>
-<target>å·¦å´ã®ã‚‚ã®ã‚’å³å´ã®ãƒ•ã‚¡ã‚¤ãƒ«/フォルダã«ä¸Šæ›¸ã</target>
+<source>Overwrite right item</source>
+<target>å³ã®é …ç›®ã«ä¸Šæ›¸ã</target>
<source>Do nothing</source>
<target>何もã—ãªã„</target>
-<source>Copy file attributes only to left</source>
-<target>ファイル属性ã®ã¿å·¦å´ã«ã‚³ãƒ”ー</target>
+<source>Update attributes on left</source>
+<target>å·¦ã®å±žæ€§ã‚’æ›´æ–°</target>
-<source>Copy file attributes only to right</source>
-<target>ファイル属性ã®ã¿å³å´ã«ã‚³ãƒ”ー</target>
+<source>Update attributes on right</source>
+<target>å³ã®å±žæ€§ã‚’æ›´æ–°</target>
<source>Multiple...</source>
<target>複数処ç†...</target>
@@ -1404,11 +1365,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>%x ã®å±žæ€§ã‚’æ›´æ–°</target>
-<source>Target directory name must not be empty!</source>
-<target>対象ディレクトリåãŒç©ºç™½ã§ã™!</target>
+<source>Target folder name must not be empty.</source>
+<target>対象フォルダåã«ç©ºç™½ã¯ä½¿ç”¨å‡ºæ¥ã¾ã›ã‚“.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>ファイルãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨ã§ããªã„ディレクトリã§ã™!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>ファイルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ•ã‚©ãƒ«ãƒ€åã«ç©ºç™½ã¯ä½¿ç”¨å‡ºæ¥ã¾ã›ã‚“.</target>
<source>Source directory %x not found.</source>
<target>ソースディレクトリ %x ãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“.</target>
@@ -1437,8 +1398,8 @@ Exclude: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>以下ã®ãƒ‘スã«ã‚るゴミ箱ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“! 代ã‚ã‚Šã«ãƒ•ã‚¡ã‚¤ãƒ«ã¯å®Œå…¨å‰Šé™¤ã•ã‚Œã¾ã™:</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</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>
diff --git a/BUILD/Languages/korean.lng b/BUILD/Languages/korean.lng
index b7952f45..47561dfe 100644
--- a/BUILD/Languages/korean.lng
+++ b/BUILD/Languages/korean.lng
@@ -7,8 +7,8 @@
<plural definition>0</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>디렉토리 %x 검색 중...</target>
+<source>Searching for folder %x...</source>
+<target>í´ë” %x 검색 중...</target>
<source>Show in Explorer</source>
<target>íƒìƒ‰ê¸°ì— 표시</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>실시간 ë™ê¸°í™” - ìžë™ ë™ê¸°í™”</target>
+<source>Error</source>
+<target>오류</target>
+
<source>Select alternate comparison settings</source>
<target>대체 ë¹„êµ ì„¤ì • ì„ íƒ</target>
<source>Select alternate synchronization settings</source>
<target>대체 ë™ê¸°í™” 설정 ì„ íƒ</target>
-<source>No filter selected</source>
-<target>ì„ íƒí•œ í•„í„°ê°€ ì—†ìŒ</target>
-
<source>Filter is active</source>
<target>필터 활성화</target>
+<source>No filter selected</source>
+<target>ì„ íƒí•œ í•„í„°ê°€ ì—†ìŒ</target>
+
<source>Remove alternate settings</source>
<target>대체설정 제거</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>ìƒì„¸ ì •ë³´</target>
-<source>Error</source>
-<target>오류</target>
-
<source>Warning</source>
<target>경고</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>전체 설정</target>
-<source>Synchronization Preview</source>
-<target>ë™ê¸°í™” 미리보기</target>
+<source>Summary</source>
+<target>개요</target>
<source>Find</source>
<target>검색</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>찾아보기</target>
-<source>Invalid command line: %x</source>
-<target>ìž˜ëª»ëœ ëª…ë ¹ì¤„ : %x</target>
+<source>Invalid command line:</source>
+<target>ìž˜ëª»ëœ ëª…ë ¹ì¤„ :</target>
<source>Info</source>
<target>ì •ë³´</target>
@@ -229,22 +229,22 @@
<source>Cannot read the following XML elements:</source>
<target>ë‹¤ìŒ XML 요소를 ì½ì„ 수 없습니다 :</target>
-<source>S&ave configuration...</source>
-<target>설정 저장</target>
+<source>&Open...</source>
+<target>열기(&O)</target>
-<source>&Load configuration...</source>
-<target>설정 로드</target>
+<source>&Save...</source>
+<target>저장(&S)</target>
<source>&Quit</source>
-<target>종료</target>
+<target>종료(&Q)</target>
-<source>&File</source>
-<target>파ì¼(&F)</target>
+<source>&Program</source>
+<target>프로그램(&P)</target>
<source>&Content</source>
-<target>ë„ì›€ë§ ë‚´ìš©</target>
+<target>ë„ì›€ë§ ë‚´ìš©(&C)</target>
-<source>&About...</source>
+<source>&About</source>
<target>ìƒì„¸ ì •ë³´(&A)</target>
<source>&Help</source>
@@ -253,8 +253,8 @@
<source>Usage:</source>
<target>사용 :</target>
-<source>1. Select directories to monitor.</source>
-<target>1. 모니터 대ìƒì´ ë  ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”.</target>
+<source>1. Select folders to watch.</source>
+<target>1. ì—´ì–´ ë³¼ í´ë”를 ì„ íƒí•˜ì„¸ìš”.</target>
<source>2. Enter a command line.</source>
<target>2. ëª…ë ¹ì¤„ì„ ìž…ë ¥í•˜ì„¸ìš”.</target>
@@ -262,19 +262,11 @@
<source>3. Press 'Start'.</source>
<target>3. '시작'ì„ ëˆ„ë¥´ì„¸ìš”.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-ëª…ë ¹ì¤„ì€ ë‹¤ìŒê³¼ ê°™ì€ ê²½ìš°ì— ë§¤ë²ˆ 실행 ë©ë‹ˆë‹¤:
-- 모든 디렉토리가 사용 가능할 경우 (예 : USB 스틱 삽입시)
-- 해당 디렉토리 ë˜ëŠ” 서브디렉토리 ë‚´ì˜ íŒŒì¼ì´ ë³€ê²½ë  ê²½ìš°
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>시작하려면 .ffs_batch file (ì¼ê´„ 파ì¼)만 가져오면 ë©ë‹ˆë‹¤.</target>
-<source>Directories to watch</source>
-<target>ê°ì‹œ ëŒ€ìƒ ë””ë ‰í† ë¦¬</target>
+<source>Folders to watch</source>
+<target>ì—´ì–´ ë³¼ í´ë”</target>
<source>Add folder</source>
<target>í´ë” 추가</target>
@@ -285,18 +277,35 @@ The command line is executed each time:
<source>Select a folder</source>
<target>í´ë” ì„ íƒ</target>
+<source>Delay [seconds]</source>
+<target>지연 [초]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>마지막으로 ê°ì§€ëœ 변화와 명령 실행 ê°„ì˜ ìœ íœ´ 시간</target>
+
<source>Command line</source>
<target>명령줄(커맨드ë¼ì¸)</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>최소 대기시간 [초 단위]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>마지막 변경내용 ê°ì§€ë¡œë¶€í„° ë‹¤ìŒ ëª…ë ¹ì¤„ 실행까지 대기시간 [ì´ˆ 단위]</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+ëª…ë ¹ì€ ë‹¤ìŒê³¼ ê²½ìš°ì— ì‹¤í–‰ë©ë‹ˆë‹¤ :
+- 파ì¼ì´ë‚˜ 하위 í´ë” 변경 ì‹œ
+- 새 í´ë”ê°€ ìƒê²¼ì„ ì‹œ (예 : USB 스틱 삽입)
+</target>
<source>Start</source>
<target>시작</target>
+<source>&Retry</source>
+<target>다시 ì‹œë„(&R)</target>
+
+<source>Cancel</source>
+<target>취소</target>
+
<source>(Build: %x)</source>
<target>(빌드: %x)</target>
@@ -315,8 +324,8 @@ The command line is executed each time:
<source>Waiting for missing directories...</source>
<target>ëˆ„ë½ ë””ë ‰í† ë¦¬ 대기 중...</target>
-<source>A directory input field is empty.</source>
-<target>디렉토리 입력 필드가 비어 있습니다.</target>
+<source>An input folder name is empty.</source>
+<target>ìž…ë ¥ í´ë” ì´ë¦„ì´ ë¹„ì–´ 있습니다.</target>
<source>Logging</source>
<target>로깅</target>
@@ -402,8 +411,8 @@ The command line is executed each time:
<source><Symlink></source>
<target><심ë§í¬></target>
-<source><Directory></source>
-<target><디렉토리></target>
+<source><Folder></source>
+<target><í´ë”></target>
<source>Full path</source>
<target>전체 경로</target>
@@ -414,8 +423,8 @@ The command line is executed each time:
<source>Relative path</source>
<target>ëŒ€ìƒ ê²½ë¡œ</target>
-<source>Directory</source>
-<target>디렉토리</target>
+<source>Base folder</source>
+<target>기본 í´ë”</target>
<source>Size</source>
<target>í¬ê¸°</target>
@@ -426,8 +435,11 @@ The command line is executed each time:
<source>Extension</source>
<target>확장ìž</target>
-<source>Comparison Result</source>
-<target>ë¹„êµ ê²°ê³¼</target>
+<source>Action</source>
+<target>실행</target>
+
+<source>Category</source>
+<target>카테고리</target>
<source>Drag && drop</source>
<target>드래그 && ë“œëž (마우스로 íŒŒì¼ ëŒì–´ë‹¤ 놓기)</target>
@@ -435,14 +447,14 @@ The command line is executed each time:
<source>Close progress dialog</source>
<target>프로그레스 다ì´ì–¼ë¡œê·¸ (진행창) 닫기</target>
-<source>Shut down</source>
-<target>종료</target>
+<source>Standby</source>
+<target>대기</target>
<source>Log off</source>
<target>로그오프</target>
-<source>Standby</source>
-<target>대기</target>
+<source>Shut down</source>
+<target>종료</target>
<source>Hibernate</source>
<target>최대절전모드</target>
@@ -450,15 +462,12 @@ The command line is executed each time:
<source>1. &Compare</source>
<target>1. 비êµ</target>
-<source>2. &Synchronize...</source>
+<source>2. &Synchronize</source>
<target>2. ë™ê¸°í™”</target>
<source>&New</source>
<target>신규 작업</target>
-<source>&Program</source>
-<target>프로그램(&P)</target>
-
<source>&Language</source>
<target>언어 ì„ íƒ(&L)</target>
@@ -486,7 +495,7 @@ The command line is executed each time:
<source>&Abort</source>
<target>작업 중지(&A)</target>
-<source>Synchronize...</source>
+<source>Synchronize</source>
<target>ë™ ê¸° í™”</target>
<source>Start synchronization</source>
@@ -501,12 +510,12 @@ The command line is executed each time:
<source>Swap sides</source>
<target>양측 위치 바꾸기</target>
-<source>Save current configuration to file</source>
-<target>현재 ì„¤ì •ì„ íŒŒì¼ë¡œ 저장</target>
-
<source>Load configuration from file</source>
<target>외부 파ì¼ë¡œë¶€í„° 설정 로드</target>
+<source>Save current configuration to file</source>
+<target>현재 ì„¤ì •ì„ íŒŒì¼ë¡œ 저장</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>마지막으로 사용한 설정 (DEL 키를 누르면 리스트ì—ì„œ ì‚­ì œ)</target>
@@ -516,14 +525,14 @@ The command line is executed each time:
<source>Hide filtered or temporarily excluded files</source>
<target>í•„í„°ë§ ë˜ê±°ë‚˜ ìž„ì‹œ ì œì™¸ë  íŒŒì¼ ìˆ¨ê¸°ê¸°</target>
-<source>Number of files and directories that will be created</source>
-<target>ìƒì„±ë  íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수</target>
+<source>Number of files and folders that will be created</source>
+<target>ìƒì„±ë  íŒŒì¼ ë° í´ë” ​​개수</target>
<source>Number of files that will be overwritten</source>
<target>ë®ì–´ 씌어질 íŒŒì¼ ê°œìˆ˜</target>
-<source>Number of files and directories that will be deleted</source>
-<target>ì‚­ì œë  íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 개수</target>
+<source>Number of files and folders that will be deleted</source>
+<target>ì‚­ì œë  íŒŒì¼ ë° í´ë” ​​개수</target>
<source>Total amount of data that will be transferred</source>
<target>전송하게 ë  ì „ì²´ ë°ì´í„° 용량</target>
@@ -546,8 +555,8 @@ The command line is executed each time:
<source>Batch job</source>
<target>ì¼ê´„ ìž‘ì—…</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>ì¼ê´„ íŒŒì¼ ìƒì„± ë° ìžë™ ë™ê¸°í™”. 배치모드 ì‹œìž‘ì€ ë³¸ 파ì¼ì„ ë”블í´ë¦­í•˜ê±°ë‚˜ ë‹¤ìŒ ëª…ë ¹ì„ ì‹¤í–‰ : FreeFileSync.exe SyncJob.ffs_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>ìžë™ ë™ê¸°í™” ìž‘ì—…ì„ ìœ„í•œ ì¼ê´„ 파ì¼ì„ 만듭니다. 본 파ì¼ì„ ë”블 í´ë¦­í•˜ê±°ë‚˜ 시스템 íƒœìŠ¤í¬ í”Œëž˜ë„ˆì— ë‹¤ìŒê³¼ ê°™ì´ ì˜ˆì•½í•˜ì„¸ìš” : FreeFileSync.exe <job name>.ffs_batch</target>
<source>Help</source>
<target>ë„움ë§</target>
@@ -573,21 +582,12 @@ The command line is executed each time:
<source>Maximum number of log files:</source>
<target>최대 ë¡œê·¸íŒŒì¼ ê°œìˆ˜ :</target>
-<source>Select log file directory:</source>
-<target>ë¡œê·¸íŒŒì¼ ë””ë ‰í† ë¦¬ ì„ íƒ :</target>
+<source>Select folder to save log files:</source>
+<target>로그 파ì¼ì„ 저장할 í´ë”를 ì„ íƒ :</target>
<source>Batch settings</source>
<target>ì¼ê´„ 설정</target>
-<source>&Save</source>
-<target>저장(&S)</target>
-
-<source>&Load</source>
-<target>로드(&L)</target>
-
-<source>Cancel</source>
-<target>취소</target>
-
<source>Select variant:</source>
<target>옵션 ì„ íƒ :</target>
@@ -612,29 +612,23 @@ The command line is executed each time:
<source>Configuration</source>
<target>구성 설정</target>
-<source>Category</source>
-<target>카테고리</target>
-
-<source>Action</source>
-<target>실행</target>
-
-<source>File/folder exists on left side only</source>
-<target>파ì¼/í´ë”ê°€ 좌측ì—만 존재</target>
+<source>Item exists on left side only</source>
+<target>í•­ëª©ì´ ì¢Œì¸¡ì—만 존재합니다.</target>
-<source>File/folder exists on right side only</source>
-<target>파ì¼/í´ë”ê°€ 우측ì—만 존재</target>
+<source>Item exists on right side only</source>
+<target>í•­ëª©ì´ ìš°ì¸¡ì—만 존재합니다.</target>
-<source>Left file is newer</source>
-<target>좌측 파ì¼ì´ ë” ìµœì‹ </target>
+<source>Left side is newer</source>
+<target>ì¢Œì¸¡ì´ ë” ì‹ ê·œìž…ë‹ˆë‹¤.</target>
-<source>Right file is newer</source>
-<target>우측 파ì¼ì´ ë” ìµœì‹ </target>
+<source>Right side is newer</source>
+<target>ìš°ì¸¡ì´ ë” ì‹ ê·œìž…ë‹ˆë‹¤.</target>
-<source>Files have different content</source>
-<target>íŒŒì¼ ë‚´ìš©ì´ ë‹¤ë¦„</target>
+<source>Items have different content</source>
+<target>항목 ë‚´ìš©ì´ ì„œë¡œ 다릅니다.</target>
-<source>Conflict/file cannot be categorized</source>
-<target>충ëŒ/íŒŒì¼ ë¶„ë¥˜ 불가능</target>
+<source>Conflict/item cannot be categorized</source>
+<target>ì¶©ëŒ / í•­ëª©ì„ ë¶„ë¥˜í•  수 ì—†ìŒ</target>
<source>OK</source>
<target>OK</target>
@@ -711,9 +705,6 @@ is the same
<source>&Ignore</source>
<target>무시(&I)</target>
-<source>&Retry</source>
-<target>다시 ì‹œë„(&R)</target>
-
<source>Do not show this dialog again</source>
<target>다ìŒë¶€í„° 표시하지 ì•ŠìŒ</target>
@@ -744,33 +735,6 @@ Note: File names must be relative to base directories!
참고 : íŒŒì¼ ì´ë¦„ì€ ê¸°ë³¸ 디렉토리와 ìƒì‘해야 합니다!
</target>
-<source>Hints:</source>
-<target>힌트 :</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. 관련 파ì¼ì´ë‚˜ 디렉토리 ì´ë¦„ì„ ';'ë¡œ 구분하거나, ì¤„ì„ ë°”ê¿” 입력하세요.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. 와ì¼ë“œì¹´ë“œ ë¬¸ìž '*' ë° '?' ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. 컨í…스트 메뉴ì—ì„œ ì§ì ‘ 파ì¼ì„ 제외합니다.</target>
-
-<source>Example</source>
-<target>보기/예</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-í¬í•¨ : *.doc;*.zip;*.exe
-제외 : \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>서브í´ë” "temp" ì— ìžˆëŠ” 파ì¼ë“¤ì€ 제외하고, ì´ì™¸ 모든 .doc, .zip, .exe í™•ìž¥ìž íŒŒì¼ ë™ê¸°í™”</target>
-
<source>Include</source>
<target>í¬í•¨</target>
@@ -792,8 +756,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>기본 설정/값(&D)</target>
-<source>Transactional file copy</source>
-<target>트랜잭션 íŒŒì¼ ë³µì‚¬</target>
+<source>Fail-safe file copy</source>
+<target>실패 - 안전 íŒŒì¼ ë³µì‚¬</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>ìž„ì‹œ íŒŒì¼ (*.ffs_tmp)ë¡œ ìš°ì„  작성 후, 파ì¼ëª…ì„ ë³€ê²½í•©ë‹ˆë‹¤. ì´ëŸ¬ë©´ 치명ì ì¸ 오류가 ë°œìƒí•˜ë”ë¼ë„ ì¼ê´€ëœ ìƒíƒœë¥¼ 보장할 수 있습니다.</target>
@@ -807,8 +771,8 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>íŒŒì¼ ì ‘ê·¼ 권한 복사</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>íŒŒì¼ ë° ë””ë ‰í† ë¦¬ 권한 전송 (ê´€ë¦¬ìž ê¶Œí•œì´ í•„ìš”í•¨)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>íŒŒì¼ ë° í´ë” 사용 권한 전송 (ê´€ë¦¬ìž ê¶Œí•œ í•„ìš”)</target>
<source>Restore hidden dialogs</source>
<target>숨겨진 대화창 ë³µì›</target>
@@ -1112,11 +1076,11 @@ Exclude: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>외부 ì‘ìš© í”„ë¡œê·¸ëž¨ì„ Context Menuì— í†µí•©. ë‹¤ìŒ ë§¤í¬ë¡œê°€ 사용 가능합니다 :</target>
-<source>- full file or directory name</source>
-<target>- ì „ì²´ íŒŒì¼ ë˜ëŠ” 디렉토리 ì´ë¦„</target>
+<source>- full file or folder name</source>
+<target>- ì „ì²´ íŒŒì¼ ë˜ëŠ” í´ë” ì´ë¦„</target>
-<source>- directory part only</source>
-<target>- 디렉토리 부분만</target>
+<source>- folder part only</source>
+<target>- í´ë” 부분만</target>
<source>- Other side's counterpart to %name</source>
<target>- %name ì˜ ë°˜ëŒ€ì¸¡ 대ìƒ</target>
@@ -1158,8 +1122,8 @@ Exclude: \stuff\temp\*
<source>Versioning</source>
<target>버저ë‹</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>파ì¼ì„ 타임스탬프 ëœ ì„œë¸Œ í´ë”ë¡œ ì´ë™</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>시간 기ë¡ì´ 남는 하위 í´ë”ë¡œ íŒŒì¼ ì´ë™</target>
<source>Files</source>
<target>파ì¼</target>
@@ -1251,8 +1215,8 @@ Exclude: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>디렉토리 %x ì„(를) ì½ì„ 수 없습니다.</target>
-<source>Endless loop.</source>
-<target>무한 루프</target>
+<source>Detected endless directory recursion.</source>
+<target>ì‚­ì œëœ ë¬´í•œ 디렉토리 재귀(반복)</target>
<source>Cannot set privilege %x.</source>
<target>권한 %x ì„(를) 설정할 수 없습니다.</target>
@@ -1278,14 +1242,11 @@ Exclude: \stuff\temp\*
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>기본값 ë™ê¸°í™” ë°©í–¥ 설정 : ì´ì „ 파ì¼ë“¤ì€ ì‹ ê·œ 파ì¼ë“¤ë¡œ ë®ì–´ 쓰여집니다.</target>
-<source>The file does not contain a valid configuration:</source>
-<target>ì´ íŒŒì¼ì€ 유효한 설정 ê°’ì„ ê°–ê³  있지 않습니다 :</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>디렉토리가 비었다는 오류는 무시 가능합니다.</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target>í´ë”를 빈 ìƒíƒœë¡œ 가정할 경우, ì´ ì˜¤ë¥˜ëŠ” ë¬´ì‹œë  ìˆ˜ 있습니다.</target>
-<source>Cannot find directory %x.</source>
-<target>디렉토리 %x ì„(를) ì°¾ì„ ìˆ˜ 없습니다.</target>
+<source>Cannot find folder %x.</source>
+<target>í´ë” %x ì„(를) ì°¾ì„ ìˆ˜ 없습니다.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>디렉토리가 ì˜ì¡´ ê´€ê³„ì— ìžˆìŠµë‹ˆë‹¤. ë™ê¸°í™” 규칙 설정시 주ì˜í•˜ì‹­ì‹œì˜¤.</target>
@@ -1317,20 +1278,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>ì–‘ì¸¡ì´ ê°™ìŒ</target>
-<source>Files/folders differ in attributes only</source>
-<target>파ì¼/í´ë”ê°€ ì†ì„±ë§Œ 다름</target>
+<source>Items have different attributes</source>
+<target>í•­ëª©ì˜ ì†ì„±ì´ 서로 다릅니다.</target>
-<source>Copy new file/folder to left</source>
-<target>ì‹ ê·œ 파ì¼/í´ë”를 좌측으로 복사</target>
+<source>Copy new item to left</source>
+<target>ì¢Œì¸¡ì— ìƒˆ 항목 복사</target>
-<source>Copy new file/folder to right</source>
-<target>ì‹ ê·œ 파ì¼/í´ë”를 우측으로 복사</target>
+<source>Copy new item to right</source>
+<target>ìš°ì¸¡ì— ìƒˆ 항목 복사</target>
-<source>Delete left file/folder</source>
-<target>ë‚¨ì€ íŒŒì¼/í´ë” ì‚­ì œ</target>
+<source>Delete left item</source>
+<target>좌측 항목 삭제</target>
-<source>Delete right file/folder</source>
-<target>우측 파ì¼/í´ë” ì‚­ì œ</target>
+<source>Delete right item</source>
+<target>우측 항목 삭제</target>
<source>Move file on left</source>
<target>좌측 íŒŒì¼ ì´ë™</target>
@@ -1338,20 +1299,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>우측 íŒŒì¼ ì´ë™</target>
-<source>Overwrite left file/folder with right one</source>
-<target>우측 파ì¼/í´ë”ë¡œ 좌측 파ì¼/í´ë” ë®ì–´ì“°ê¸°</target>
+<source>Overwrite left item</source>
+<target>좌측 항목 ë®ì–´ì“°ê¸°</target>
-<source>Overwrite right file/folder with left one</source>
-<target>좌측 파ì¼/í´ë”ë¡œ 우측 파ì¼/í´ë” ë®ì–´ì“°ê¸°</target>
+<source>Overwrite right item</source>
+<target>우측 항목 ë®ì–´ì“°ê¸°</target>
<source>Do nothing</source>
<target>아무 ê²ƒë„ í•˜ì§€ ì•ŠìŒ</target>
-<source>Copy file attributes only to left</source>
-<target>íŒŒì¼ ì†ì„±ë§Œ 좌측으로 복사</target>
+<source>Update attributes on left</source>
+<target>좌측 ì†ì„± ì—…ë°ì´íŠ¸</target>
-<source>Copy file attributes only to right</source>
-<target>íŒŒì¼ ì†ì„±ë§Œ 우측으로 복사</target>
+<source>Update attributes on right</source>
+<target>우측 ì†ì„± ì—…ë°ì´íŠ¸</target>
<source>Multiple...</source>
<target>다중처리 (멀티플) 작업...</target>
@@ -1404,11 +1365,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>%x ì†ì„± ì—…ë°ì´íŠ¸ 중</target>
-<source>Target directory name must not be empty!</source>
-<target>ëŒ€ìƒ ë””ë ‰í† ë¦¬ ì´ë¦„ì´ ë¹„ì–´ì„œëŠ” 안 ë©ë‹ˆë‹¤!</target>
+<source>Target folder name must not be empty.</source>
+<target>ëŒ€ìƒ í´ë” ì´ë¦„ì€ ë¹„ì›Œë‘˜ 수 없습니다.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>íŒŒì¼ ë²„ì €ë‹ì„ 위한 디렉토리가 제공ë˜ì§€ 않았습니다!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>íŒŒì¼ ë²„ì €ë‹ì„ 위한 í´ë” ì´ë¦„ì€ ë¹„ì›Œë‘˜ 수 없습니다.</target>
<source>Source directory %x not found.</source>
<target>소스 디렉토리 %x ì„(를) ì°¾ì„ ìˆ˜ 없습니다.</target>
@@ -1437,8 +1398,8 @@ Exclude: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>ë‹¤ìŒ ê²½ë¡œë¡œëŠ” íœ´ì§€í†µì„ ì‚¬ìš©í•  수 없습니다! 대신 파ì¼ì„ ì˜êµ¬ì ìœ¼ë¡œ 삭제합니다 :</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</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>
diff --git a/BUILD/Languages/lithuanian.lng b/BUILD/Languages/lithuanian.lng
index 9506c48c..e30eb48c 100644
--- a/BUILD/Languages/lithuanian.lng
+++ b/BUILD/Languages/lithuanian.lng
@@ -7,8 +7,8 @@
<plural definition>n==1 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>IÅ¡koma aplanko %x...</target>
+<source>Searching for folder %x...</source>
+<target>Ieškoma aplanko %x...</target>
<source>Show in Explorer</source>
<target>Rodyti naršyklėje</target>
@@ -17,7 +17,7 @@
<target>Atverti su numatyta programa</target>
<source>Browse directory</source>
-<target>Naršyti aplanką</target>
+<target>Naršyti katalogą</target>
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Nutraukti: laukiama kol baigsis esama operacija...</target>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>Pasirinkite alternatyvius sinchronizavimo nustatymus</target>
-<source>No filter selected</source>
-<target>Nepažymėti jokie filtrai</target>
-
<source>Filter is active</source>
<target>Filtas yra aktyvus</target>
+<source>No filter selected</source>
+<target>Nepažymėti jokie filtrai</target>
+
<source>Remove alternate settings</source>
<target>Pašalinti alternatyvius nustatymus</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Bendri nustatymai</target>
-<source>Synchronization Preview</source>
-<target>Sinchronizavimo peržiūra</target>
+<source>Summary</source>
+<target>SuvestinÄ—</target>
<source>Find</source>
<target>Rasti</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Naršyti</target>
-<source>Invalid command line: %x</source>
-<target>Netinkama komandinÄ— eilutÄ—: %x</target>
+<source>Invalid command line:</source>
+<target>Netinkama komandinÄ— eilutÄ—:</target>
<source>Info</source>
<target>Informacija</target>
@@ -172,10 +172,10 @@
<target>Nepavyksta gauti eigos informacijos.</target>
<source>Waiting while directory is locked (%x)...</source>
-<target>Laikiama kol aplankas bus užrakintas (%x)...</target>
+<target>Laikiama kol katalogas bus užrakintas (%x)...</target>
<source>Cannot set directory lock %x.</source>
-<target>Nepavyksta nustatyti aplanko užrakto %x.</target>
+<target>Nepavyksta nustatyti katalogo užrakto %x.</target>
<source>
<pluralform>1 sec</pluralform>
@@ -232,29 +232,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Tomo pavadinimas %x nÄ—ra dalis failo pavadinimo %y!</target>
-<source>Cannot find file %x.</source>
-<target>Nepavyksta rasti failo %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Nepavyksta perskaityti sekanÄių XML elementų:</target>
-<source>S&ave configuration...</source>
-<target>IÅ¡s&augoti nustatymus...</target>
+<source>Cannot find file %x.</source>
+<target>Nepavyksta rasti failo %x.</target>
-<source>&Load configuration...</source>
-<target>Įke&lti nustatymus...</target>
+<source>&Open...</source>
+<target>&Atverti...</target>
+
+<source>&Save...</source>
+<target>&IÅ¡saugoti...</target>
<source>&Quit</source>
<target>&IÅ¡eiti</target>
-<source>&File</source>
-<target>&Failas</target>
+<source>&Program</source>
+<target>&Programa</target>
<source>&Content</source>
<target>&Turinys</target>
-<source>&About...</source>
-<target>&Apie...</target>
+<source>&About</source>
+<target>&Apie</target>
<source>&Help</source>
<target>&Pagalba</target>
@@ -262,8 +262,8 @@
<source>Usage:</source>
<target>Naudojimas:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Pažymėti aplankus stebėjimui.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Pasirinkite stebimus aplankus.</target>
<source>2. Enter a command line.</source>
<target>2. Įvesti komandinę eilutę.</target>
@@ -271,19 +271,11 @@
<source>3. Press 'Start'.</source>
<target>3. Spauskite „Pradėti“'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Komandinė eilutė yra įvykdoma kas kart:
-- visi aplankai tampa pasiekiamais (pvz. USB atmintukas įkišamas)
-- failai Å¡iuose aplankuose ar poaplankiuose yra pakeisti
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Kad pradÄ—ti tiesiog importuokite .ffs_batch failÄ….</target>
-<source>Directories to watch</source>
-<target>Aplankai stebÄ—jimui</target>
+<source>Folders to watch</source>
+<target>Stebimi aplankai</target>
<source>Add folder</source>
<target>PridÄ—ti aplankÄ…</target>
@@ -294,14 +286,25 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>Select a folder</source>
<target>Pažymėti aplanką</target>
+<source>Delay [seconds]</source>
+<target>AtidÄ—ti [sekundÄ—s]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Neveiklus laikas tarp paskutinio aptikto pokyÄio ir komandos įvykdymo</target>
+
<source>Command line</source>
<target>KomandinÄ— eilutÄ—</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Mažiausias neveikimo laikas [sekundės]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Neveikimo laikas tarp paskutinio pakeitimo nustatymo ir komandinės eilutės įvykdymo sekundėmis</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Komanda inicijuojama jei:
+- failai arba poaplankiai keiÄiasi
+- atsiranda nauji aplankai (pvz.: įkišamas USB raktas)
+</target>
<source>Start</source>
<target>PradÄ—ti</target>
@@ -328,10 +331,10 @@ Komandinė eilutė yra įvykdoma kas kart:
<target>StebÄ—jimas aktyvus...</target>
<source>Waiting for missing directories...</source>
-<target>Laikiama trūkstamų aplankų...</target>
+<target>Laikiama trūkstamų katalogų...</target>
-<source>A directory input field is empty.</source>
-<target>Aplanko įvedimo laukelis yra tuÅ¡Äias.</target>
+<source>An input folder name is empty.</source>
+<target>Ä®vesties aplanko pavadinimas yra tuÅ¡Äias.</target>
<source>Logging</source>
<target>Užduoties duomenys</target>
@@ -417,8 +420,8 @@ Komandinė eilutė yra įvykdoma kas kart:
<source><Symlink></source>
<target><SimbolinÄ— nuoroda></target>
-<source><Directory></source>
-<target><Aplankas></target>
+<source><Folder></source>
+<target><Aplankai></target>
<source>Full path</source>
<target>Pilnas kelias</target>
@@ -429,8 +432,8 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>Relative path</source>
<target>Atitinkamas kelias</target>
-<source>Directory</source>
-<target>Aplankas</target>
+<source>Base folder</source>
+<target>Bazinis aplankas</target>
<source>Size</source>
<target>Dydis</target>
@@ -441,8 +444,11 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>Extension</source>
<target>PlÄ—tinys</target>
-<source>Comparison Result</source>
-<target>Sulyginimo rezultatas</target>
+<source>Action</source>
+<target>Veiksmas</target>
+
+<source>Category</source>
+<target>Kategorija</target>
<source>Drag && drop</source>
<target>Vilkti ir numesti</target>
@@ -450,14 +456,14 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>Close progress dialog</source>
<target>Uždaryti eigos langą</target>
-<source>Shut down</source>
-<target>Išjungti kompiuterį</target>
+<source>Standby</source>
+<target>Stabdyti į diską</target>
<source>Log off</source>
<target>Atsijungti</target>
-<source>Standby</source>
-<target>Stabdyti į diską</target>
+<source>Shut down</source>
+<target>Išjungti kompiuterį</target>
<source>Hibernate</source>
<target>Stabdyti į operatyviąją atmintį</target>
@@ -465,15 +471,12 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>1. &Compare</source>
<target>1. &Sulyginti</target>
-<source>2. &Synchronize...</source>
-<target>2. &Sinchronizuoti...</target>
+<source>2. &Synchronize</source>
+<target>2. &Sinchronizuoti</target>
<source>&New</source>
<target>&Naujas</target>
-<source>&Program</source>
-<target>&Programa</target>
-
<source>&Language</source>
<target>&Kalba</target>
@@ -501,8 +504,8 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>&Abort</source>
<target>&Nutraukti</target>
-<source>Synchronize...</source>
-<target>Sinchronizuoti...</target>
+<source>Synchronize</source>
+<target>Sinchronizuoti</target>
<source>Start synchronization</source>
<target>PradÄ—ti sinchronizavimÄ…</target>
@@ -516,12 +519,12 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>Swap sides</source>
<target>Sukeisti puses</target>
-<source>Save current configuration to file</source>
-<target>Išsaugoti esamus nustatymus į failą</target>
-
<source>Load configuration from file</source>
<target>Įkelti nustatymus iš failo</target>
+<source>Save current configuration to file</source>
+<target>Išsaugoti esamus nustatymus į failą</target>
+
<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>
@@ -531,14 +534,14 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>Hide filtered or temporarily excluded files</source>
<target>Slėpti išfiltruotus ar laikinai neįtrauktus failus</target>
-<source>Number of files and directories that will be created</source>
-<target>SkaiÄius failų ir aplankų, kurie bus sukurti</target>
+<source>Number of files and folders that will be created</source>
+<target>Failų ir aplankų, kurie bus sukurti, skaiÄius</target>
<source>Number of files that will be overwritten</source>
<target>SkaiÄius failų, kurie bus perraÅ¡yti</target>
-<source>Number of files and directories that will be deleted</source>
-<target>SkaiÄius failų ir aplankų, kurie bus iÅ¡trinti</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Failų ir aplankų, kurie bus iÅ¡trinti, skaiÄius</target>
<source>Total amount of data that will be transferred</source>
<target>Visas duomenų kiekis, kuris bus perduotas</target>
@@ -561,8 +564,8 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>Batch job</source>
<target>Paketinė užduotis</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Sukurti paketinÄ—s užduoties failÄ… ir automatizuoti sinchronizavimÄ…. Kad paleisti paketinÄ—s užduoties veiksenoje tiesiog du kartus spustelÄ—kite ant Å¡io failo arba paleiskite komandÄ…: FreeFileSync.exe SyncJob.ffs_batch. Tai taip pat gali bÅ«ti įtraukta į JÅ«sų sistemos užduoÄių tvarkyklÄ—s planÄ….</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>Sukurkite paketinÄ—s užduoties failÄ…, kad automatizuoti sinchronizacijÄ…. SpragtelÄ—kite du kartus šį failÄ… arba nustatykite JÅ«sų sistemos užduoÄių planuoklÄ—je: FreeFileSync.exe <užduoties pavadinimas>.ffs_batch</target>
<source>Help</source>
<target>Pagalba</target>
@@ -588,18 +591,12 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>Maximum number of log files:</source>
<target>Didžiausias ataskaitų failų skaiÄius:</target>
-<source>Select log file directory:</source>
-<target>Pažymėti ataskaitos failų aplanką:</target>
+<source>Select folder to save log files:</source>
+<target>Pasirinkite aplanką, kuriame saugoti ataskaitų failus:</target>
<source>Batch settings</source>
<target>Paketinės užduoties nustatymai</target>
-<source>&Save</source>
-<target>&IÅ¡saugoti</target>
-
-<source>&Load</source>
-<target>Ä®&kelti</target>
-
<source>Select variant:</source>
<target>Pažymėkite variantą:</target>
@@ -624,29 +621,23 @@ Komandinė eilutė yra įvykdoma kas kart:
<source>Configuration</source>
<target>Nustatymai</target>
-<source>Category</source>
-<target>Kategorija</target>
+<source>Item exists on left side only</source>
+<target>Elementas egzistuoja tik kairÄ—je pusÄ—je</target>
-<source>Action</source>
-<target>Veiksmas</target>
-
-<source>File/folder exists on left side only</source>
-<target>Failas/aplankas egzistuoja tik kairiame aplanke</target>
-
-<source>File/folder exists on right side only</source>
-<target>Failas/aplankas egzistuoja tik dešiniame aplanke</target>
+<source>Item exists on right side only</source>
+<target>Elementas egzistuoja tik dešinėje pusėje</target>
-<source>Left file is newer</source>
-<target>Kairysis failas yra naujesnis</target>
+<source>Left side is newer</source>
+<target>KairÄ— pusÄ— yra naujesnÄ—</target>
-<source>Right file is newer</source>
-<target>Dešinysis failas yra naujesnis</target>
+<source>Right side is newer</source>
+<target>Dešinė pusė yra naujesnė</target>
-<source>Files have different content</source>
-<target>Failai turi skirtingą turinį</target>
+<source>Items have different content</source>
+<target>Elementai turi skirtingą turinį</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Konfliktas/failo negalima kategorizuoti</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Konfliktas/elementas negali būti kategorizuojamas</target>
<source>OK</source>
<target>Gerai</target>
@@ -750,36 +741,9 @@ Note: File names must be relative to base directories!
</source>
<target>
Tik failai, kurie atitinka visus filtro nustatymus bus sinchronizuoti.
-Pastaba: Failų pavadinimai privalo atitikti bazinius aplankus!
-</target>
-
-<source>Hints:</source>
-<target>Patarimai:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Įveskite atitinkamus failo ar aplanko pavadinimus atskirtus su ';' ar naujoje eilutėje.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Naudokite pakaitos simbolius '*' ir '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Išskirkite failus tiesiogiai pagrindiniame tinklelyje per kontekstinį meniu.</target>
-
-<source>Example</source>
-<target>Pavyzdys</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Įtraukti: *.doc;*.zip;*.exe
-IÅ¡sirti: \stuff\temp\*
+Pastaba: Failų pavadinimai privalo atitikti bazinius katalogus!
</target>
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Sinchronizuoti visus .doc, .zip ir .exe failus iškyrus viską poaplankyje „temp“.</target>
-
<source>Include</source>
<target>Įtraukti</target>
@@ -801,8 +765,8 @@ IÅ¡sirti: \stuff\temp\*
<source>&Default</source>
<target>&Numatyta</target>
-<source>Transactional file copy</source>
-<target>Suderintas failų kopijavimas</target>
+<source>Fail-safe file copy</source>
+<target>ApsauginÄ— failo kopija</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>Pirmiausiai rašyti į laikinąjį failą (*.ffs_tmp), tada pervardinti jį. Tai garantuoja pastovumą net ir kritinės klaidos atveju.</target>
@@ -816,8 +780,8 @@ IÅ¡sirti: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Kopijuoti failo leidimus</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Perkelti failo ir aplanko leidimus (Reikalingos administratoriaus teisÄ—s)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Perkelti failo ir aplanko leidimus (Reikalauja administratoriaus teisų)</target>
<source>Restore hidden dialogs</source>
<target>Atstatyti paslÄ—ptus langus</target>
@@ -1006,7 +970,7 @@ IÅ¡sirti: \stuff\temp\*
<target>Rodyti failus, kurie ne bus kopijuojami</target>
<source>All directories in sync!</source>
-<target>Visi aplankai sinchronizavime!</target>
+<target>Visi katalogai sinchronizuoti!</target>
<source>Please run a Compare first before synchronizing!</source>
<target>Prašome paleisti sulyginimą prieš sinchronizavimą!</target>
@@ -1036,10 +1000,10 @@ IÅ¡sirti: \stuff\temp\*
<pluralform>%x directories</pluralform>
</source>
<target>
-<pluralform>1 aplankas</pluralform>
-<pluralform>%x aplankai</pluralform>
-<pluralform>%x aplankų</pluralform>
-<pluralform>%x aplankai</pluralform>
+<pluralform>1 katalogas</pluralform>
+<pluralform>%x katalogai</pluralform>
+<pluralform>%x katalogų</pluralform>
+<pluralform>%x katalogai</pluralform>
</target>
<source>
@@ -1133,10 +1097,10 @@ IÅ¡sirti: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integruoti išorines programas į kontekstinį meniu. Sekantys makro galimi:</target>
-<source>- full file or directory name</source>
+<source>- full file or folder name</source>
<target>- pilnas failo ar aplanko pavadinimas</target>
-<source>- directory part only</source>
+<source>- folder part only</source>
<target>- tik aplanko dalis</target>
<source>- Other side's counterpart to %name</source>
@@ -1185,8 +1149,8 @@ IÅ¡sirti: \stuff\temp\*
<source>Versioning</source>
<target>Versijavimas</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Perkelti failus į laiku pažymėtą poaplankį</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>
@@ -1237,7 +1201,7 @@ IÅ¡sirti: \stuff\temp\*
</target>
<source>Cannot monitor directory %x.</source>
-<target>Nepavyko stebÄ—ti aplanko %x.</target>
+<target>Nepavyko stebÄ—ti katalogo %x.</target>
<source>Conversion error:</source>
<target>Konvertavimo klaida:</target>
@@ -1252,7 +1216,7 @@ IÅ¡sirti: \stuff\temp\*
<target>Nepavyksta perkelti failo %x į %y.</target>
<source>Cannot delete directory %x.</source>
-<target>Nepavyksta ištrinti aplanko %x.</target>
+<target>Nepavyksta ištrinti katalogo %x.</target>
<source>Cannot write modification time of %x.</source>
<target>Nepavyksta šrašyti pakeitimo datos %x.</target>
@@ -1273,7 +1237,7 @@ IÅ¡sirti: \stuff\temp\*
<target>Nepavyksta įrašyti leidimų %x.</target>
<source>Cannot create directory %x.</source>
-<target>Nepavyksta sukurti aplanko %x.</target>
+<target>Nepavyksta sukurti katalogo %x.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Nepavyksta nukopijuoti simbolinės nuorodos %x į %y.</target>
@@ -1285,10 +1249,10 @@ IÅ¡sirti: \stuff\temp\*
<target>Nepavyksta nukopijuoti failo %x į %y.</target>
<source>Cannot read directory %x.</source>
-<target>Nepavyksta nuskaityti aplanko %x.</target>
+<target>Nepavyksta nuskaityti katalogo %x.</target>
-<source>Endless loop.</source>
-<target>Nesibaigiantis ciklas</target>
+<source>Detected endless directory recursion.</source>
+<target>Aptikri nesibaigianÄiÄ… katalogo rekursijÄ….</target>
<source>Cannot set privilege %x.</source>
<target>Nepavyksta nustatyti privilegijos %x.</target>
@@ -1314,17 +1278,14 @@ IÅ¡sirti: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Failas neturi tinkamų nustatymų:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>JÅ«s galite ignoruoti Å¡iÄ… klaidÄ…, kad laikyti aplankÄ… tuÅ¡Äiu.</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>
-<source>Cannot find directory %x.</source>
-<target>Nepavyksta rasti aplanko %x</target>
+<source>Cannot find folder %x.</source>
+<target>Nepavyksta rasti aplanko %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
-<target>Aplankai yra priklausomi! Būkite atsargūs nustatydami sinchronizavimo taisykles:</target>
+<target>Katalogai yra priklausomi! Būkite atsargūs nustatydami sinchronizavimo taisykles:</target>
<source>Preparing synchronization...</source>
<target>Ruošiamas sinchronizavimas...</target>
@@ -1353,20 +1314,20 @@ IÅ¡sirti: \stuff\temp\*
<source>Both sides are equal</source>
<target>Abi pusÄ—s yra lygios</target>
-<source>Files/folders differ in attributes only</source>
-<target>Failai/aplankai skiriasi tik pagal atributus</target>
+<source>Items have different attributes</source>
+<target>Elementai turi skirtingus atributus</target>
-<source>Copy new file/folder to left</source>
-<target>Kopijuoti naują failą/aplanką į kairę</target>
+<source>Copy new item to left</source>
+<target>Kopijuoti naują elementą į kairę</target>
-<source>Copy new file/folder to right</source>
-<target>Kopijuoti naują failą/aplanką į dešinę</target>
+<source>Copy new item to right</source>
+<target>Kopijuoti naują elementą į dešinę</target>
-<source>Delete left file/folder</source>
-<target>Trinti kairį failą/aplanką</target>
+<source>Delete left item</source>
+<target>Ištrinti kairįjį elementą</target>
-<source>Delete right file/folder</source>
-<target>Trinti dešinį failą/aplanką</target>
+<source>Delete right item</source>
+<target>Ištrinti dešinįjį elementą</target>
<source>Move file on left</source>
<target>Perkelti failą į kairę</target>
@@ -1374,20 +1335,20 @@ IÅ¡sirti: \stuff\temp\*
<source>Move file on right</source>
<target>Perkelti failą į dešinę</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Perrašyti kairį failą/aplanką su dešiniuoju</target>
+<source>Overwrite left item</source>
+<target>Perrašyti kairįjį elementą</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Perrašyti dešinįjį failą/aplanką su kairiuoju</target>
+<source>Overwrite right item</source>
+<target>Perrašyti dešinįjį elementą</target>
<source>Do nothing</source>
<target>Nieko nedaryti</target>
-<source>Copy file attributes only to left</source>
-<target>Kopijuoti failo atributus tik į kairę</target>
+<source>Update attributes on left</source>
+<target>Atnaujinti atributus kairÄ—je</target>
-<source>Copy file attributes only to right</source>
-<target>Kopijuoti failo atributus tik į dešinę</target>
+<source>Update attributes on right</source>
+<target>Atnaujinti atributus dešinėje</target>
<source>Multiple...</source>
<target>Keletas...</target>
@@ -1440,14 +1401,14 @@ IÅ¡sirti: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Atnaujinami atributai %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Tikslo aplankas privalo bÅ«ti ne tuÅ¡Äias!</target>
+<source>Target folder name must not be empty.</source>
+<target>Tikslo aplanko pavadinimas privalo nebÅ«ti tuÅ¡Äias.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Aplankas failo versijavimui nebuvo pateiktas!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Aplanko pavadinimas failų versionavimui privalo nebÅ«ti tuÅ¡Äias.</target>
<source>Source directory %x not found.</source>
-<target>Å altinio aplankas %x nerastas.</target>
+<target>Å altinio katalogas %x nerastas.</target>
<source>Unresolved conflicts existing!</source>
<target>Yra neišspręstų konfliktų!</target>
@@ -1473,8 +1434,8 @@ IÅ¡sirti: \stuff\temp\*
<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>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Aplankas, kuris bus keiÄiamas yra dalis keletos aplankų porų! PraÅ¡ome peržiÅ«rÄ—ti sinchronizavimo nustatymus!</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>
diff --git a/BUILD/Languages/norwegian.lng b/BUILD/Languages/norwegian.lng
index 31474eb8..89bac192 100644
--- a/BUILD/Languages/norwegian.lng
+++ b/BUILD/Languages/norwegian.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Søker etter mappe %x...</target>
+<source>Searching for folder %x...</source>
+<target></target>
<source>Show in Explorer</source>
<target>Vis i Utforsker</target>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>Velg alternative synkroniseringsinnstillinger</target>
-<source>No filter selected</source>
-<target>Ingen filter valgt</target>
-
<source>Filter is active</source>
<target>Filter er aktivt</target>
+<source>No filter selected</source>
+<target>Ingen filter valgt</target>
+
<source>Remove alternate settings</source>
<target>Fjern alternative innstillinger</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Felles innstillinger</target>
-<source>Synchronization Preview</source>
-<target>Forhåndsvisning for synkronisering</target>
+<source>Summary</source>
+<target></target>
<source>Find</source>
<target>Søk</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Bla gjennom</target>
-<source>Invalid command line: %x</source>
-<target>Ugyldig kommando: %x</target>
+<source>Invalid command line:</source>
+<target>Ugyldig kommando:</target>
<source>Info</source>
<target>Info</target>
@@ -232,23 +232,23 @@
<source>Cannot read the following XML elements:</source>
<target>Kan ikke lese følgende XML-elementer:</target>
-<source>S&ave configuration...</source>
-<target>L&agre innstilling...</target>
+<source>&Open...</source>
+<target></target>
-<source>&Load configuration...</source>
-<target>&Last innstilling...</target>
+<source>&Save...</source>
+<target></target>
<source>&Quit</source>
<target>&Avslutt</target>
-<source>&File</source>
-<target>&Fil</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>&Innhold</target>
-<source>&About...</source>
-<target>&Om programmet...</target>
+<source>&About</source>
+<target>&Om programmet</target>
<source>&Help</source>
<target>&Hjelp</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Bruk:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Velg mapper å overvåke.</target>
+<source>1. Select folders to watch.</source>
+<target></target>
<source>2. Enter a command line.</source>
<target>2. Oppfør en kommandolinje.</target>
@@ -265,19 +265,11 @@
<source>3. Press 'Start'.</source>
<target>3. Trykk 'Start'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Kommandolinjen kjøres hver gang:
-- Alle mapper blir tilgjengelige (f.eks. ved innsetting av USB-minnepinne)
-- Filer i disse mapper eller undermapper endres
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target></target>
-<source>Directories to watch</source>
-<target>Mapper å overvåke</target>
+<source>Folders to watch</source>
+<target></target>
<source>Add folder</source>
<target>Legg til mappe</target>
@@ -288,14 +280,21 @@ Kommandolinjen kjøres hver gang:
<source>Select a folder</source>
<target>Velg en mappe</target>
+<source>Delay [seconds]</source>
+<target></target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target></target>
+
<source>Command line</source>
<target>Kommandolinje</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimum pausetid [sekunder]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Uvirksom tid mellom oppdaging av siste endring og kjøring av kommandolinje i sekunder</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target></target>
<source>Start</source>
<target>Start</target>
@@ -324,8 +323,8 @@ Kommandolinjen kjøres hver gang:
<source>Waiting for missing directories...</source>
<target>Venter på manglende mapper...</target>
-<source>A directory input field is empty.</source>
-<target>Et inndatafelt for mappe er tomt.</target>
+<source>An input folder name is empty.</source>
+<target></target>
<source>Logging</source>
<target>Logging</target>
@@ -411,8 +410,8 @@ Kommandolinjen kjøres hver gang:
<source><Symlink></source>
<target><Symbolsk lenke></target>
-<source><Directory></source>
-<target><Mappe></target>
+<source><Folder></source>
+<target></target>
<source>Full path</source>
<target>Full bane</target>
@@ -423,8 +422,8 @@ Kommandolinjen kjøres hver gang:
<source>Relative path</source>
<target>Relativ bane</target>
-<source>Directory</source>
-<target>Mappe</target>
+<source>Base folder</source>
+<target></target>
<source>Size</source>
<target>Størrelse</target>
@@ -435,8 +434,11 @@ Kommandolinjen kjøres hver gang:
<source>Extension</source>
<target>Filendelse</target>
-<source>Comparison Result</source>
-<target>Sammenligningsresultat</target>
+<source>Action</source>
+<target>Handling</target>
+
+<source>Category</source>
+<target>Kategori</target>
<source>Drag && drop</source>
<target>Dra && slipp</target>
@@ -444,14 +446,14 @@ Kommandolinjen kjøres hver gang:
<source>Close progress dialog</source>
<target>Lukk framdriftsvindu</target>
-<source>Shut down</source>
-<target>Slå av maskinen</target>
+<source>Standby</source>
+<target>Standby</target>
<source>Log off</source>
<target>Logg av</target>
-<source>Standby</source>
-<target>Standby</target>
+<source>Shut down</source>
+<target>Slå av maskinen</target>
<source>Hibernate</source>
<target>Sett i dvalemodus</target>
@@ -459,15 +461,12 @@ Kommandolinjen kjøres hver gang:
<source>1. &Compare</source>
<target>1. Sammen&lign</target>
-<source>2. &Synchronize...</source>
-<target>2. &Synkroniser...</target>
+<source>2. &Synchronize</source>
+<target>2. &Synkroniser</target>
<source>&New</source>
<target>&Ny</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>&Språk</target>
@@ -495,8 +494,8 @@ Kommandolinjen kjøres hver gang:
<source>&Abort</source>
<target>&Avbryt</target>
-<source>Synchronize...</source>
-<target>Synkroniser...</target>
+<source>Synchronize</source>
+<target>Synkroniser</target>
<source>Start synchronization</source>
<target>Start synkronisering</target>
@@ -510,12 +509,12 @@ Kommandolinjen kjøres hver gang:
<source>Swap sides</source>
<target>Bytt sider</target>
-<source>Save current configuration to file</source>
-<target>Lagre gjeldende innstilling til fil</target>
-
<source>Load configuration from file</source>
<target>Last innstilling fra fil</target>
+<source>Save current configuration to file</source>
+<target>Lagre gjeldende innstilling til fil</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Sist brukte innstillinger (trykk DEL for å fjerne fra liste)</target>
@@ -525,14 +524,14 @@ Kommandolinjen kjøres hver gang:
<source>Hide filtered or temporarily excluded files</source>
<target>Skjul filtrerte eller midlertidig ekskluderte filer</target>
-<source>Number of files and directories that will be created</source>
-<target>Antall filer og mapper som blir opprettet</target>
+<source>Number of files and folders that will be created</source>
+<target></target>
<source>Number of files that will be overwritten</source>
<target>Antall filer som blir overskrevet</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Antal filer og mapper som blir slettet</target>
+<source>Number of files and folders that will be deleted</source>
+<target></target>
<source>Total amount of data that will be transferred</source>
<target>Totale antall data som blir overført</target>
@@ -555,8 +554,8 @@ Kommandolinjen kjøres hver gang:
<source>Batch job</source>
<target>Batch-jobb</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Opprett en batch-fil og automatiser synkronisering. For å starte i batch-modus dobbeltklikk denne filen eller kjør kommandoen: FreeFileSync.exe SyncJob.ffs_batch. Dette kan også planlegges i ditt systems oppgaveplanlegger.</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></target>
<source>Help</source>
<target>Hjelp</target>
@@ -582,18 +581,12 @@ Kommandolinjen kjøres hver gang:
<source>Maximum number of log files:</source>
<target>Maksimale antall loggfiler:</target>
-<source>Select log file directory:</source>
-<target>Velg loggfilmappe:</target>
+<source>Select folder to save log files:</source>
+<target></target>
<source>Batch settings</source>
<target>Batch-innstillinger</target>
-<source>&Save</source>
-<target>La&gre</target>
-
-<source>&Load</source>
-<target>&Last</target>
-
<source>Select variant:</source>
<target>Velg variant:</target>
@@ -618,29 +611,23 @@ Kommandolinjen kjøres hver gang:
<source>Configuration</source>
<target>Innstilling</target>
-<source>Category</source>
-<target>Kategori</target>
+<source>Item exists on left side only</source>
+<target></target>
-<source>Action</source>
-<target>Handling</target>
+<source>Item exists on right side only</source>
+<target></target>
-<source>File/folder exists on left side only</source>
-<target>Fil/mappe finnes bare på venstre side</target>
+<source>Left side is newer</source>
+<target></target>
-<source>File/folder exists on right side only</source>
-<target>Fil/mappe finnes bare på høyre side</target>
+<source>Right side is newer</source>
+<target></target>
-<source>Left file is newer</source>
-<target>Fil til venstre er nyere</target>
+<source>Items have different content</source>
+<target></target>
-<source>Right file is newer</source>
-<target>Fil til høyre er nyere</target>
-
-<source>Files have different content</source>
-<target>Filer har forskjellig innhold</target>
-
-<source>Conflict/file cannot be categorized</source>
-<target>Konflikt/filen kan ikke kategoriseres</target>
+<source>Conflict/item cannot be categorized</source>
+<target></target>
<source>OK</source>
<target>OK</target>
@@ -747,33 +734,6 @@ Synkroniserer kun filer som passer til alle filterinnstillinger.
Merk: Filnavn må være relative til basismapper!
</target>
-<source>Hints:</source>
-<target>Veiledninger:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Oppfør relative fil- eller mappenavn adskilt med ';' eller en ny linje.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Bruk jokertegn '*' og '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Ekskluder filer direkte i hovedvindu via høyreklikkmeny.</target>
-
-<source>Example</source>
-<target>Eksempel</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Inkluder: *.doc;*.zip;*.exe
-Ekskluder: \ting\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Synkroniserer alle .doc, .zip og .exe-filer unntatt alt i undermappen "temp".</target>
-
<source>Include</source>
<target>Inkluder</target>
@@ -795,8 +755,8 @@ Ekskluder: \ting\temp\*
<source>&Default</source>
<target>&Standard</target>
-<source>Transactional file copy</source>
-<target>Transaksjonell filkopiering</target>
+<source>Fail-safe file copy</source>
+<target></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>Skriv til en midlertidig fil (*.ffs_tmp) først så endre navn på den. Dette garanterer en konsistent tilstand selv ved alvorlige feil.</target>
@@ -810,8 +770,8 @@ Ekskluder: \ting\temp\*
<source>Copy file access permissions</source>
<target>Kopier filadgangstillatelser</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Overfør fil- og mappetillatelser (Krever administratorrettigheter)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target></target>
<source>Restore hidden dialogs</source>
<target>Gjenopprett skjulte dialoger</target>
@@ -1119,11 +1079,11 @@ Ekskluder: \ting\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrer eksterne programmer i høyreklikkmeny. Følgende makroer er tilgjengelige:</target>
-<source>- full file or directory name</source>
-<target>- fullt fil- eller mappenavn</target>
+<source>- full file or folder name</source>
+<target></target>
-<source>- directory part only</source>
-<target>- bare mappedel</target>
+<source>- folder part only</source>
+<target></target>
<source>- Other side's counterpart to %name</source>
<target>- Andre sides motstykke til %name</target>
@@ -1167,8 +1127,8 @@ Ekskluder: \ting\temp\*
<source>Versioning</source>
<target>Versjonshåndtering</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Flytt filer til en datomerket undermappe</target>
+<source>Move files into a time-stamped subfolder</source>
+<target></target>
<source>Files</source>
<target>Filer</target>
@@ -1263,8 +1223,8 @@ Ekskluder: \ting\temp\*
<source>Cannot read directory %x.</source>
<target>Kan ikke lese mappen %x.</target>
-<source>Endless loop.</source>
-<target>Endeløs sløyfe.</target>
+<source>Detected endless directory recursion.</source>
+<target></target>
<source>Cannot set privilege %x.</source>
<target>Kan ikke sette privilegie %x.</target>
@@ -1290,14 +1250,11 @@ Ekskluder: \ting\temp\*
<source>Setting default synchronization directions: Old files will be overwritten with newer files.</source>
<target>Stiller inn standard synkroniseringsretning: Gamle filer blir overskrevet med nyere filer.</target>
-<source>The file does not contain a valid configuration:</source>
-<target>Filen inneholder ingen gyldig innstilling:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Du kan ignorere denne feil og anse mappen som tom.</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target></target>
-<source>Cannot find directory %x.</source>
-<target>Kan ikke finne mappen %x.</target>
+<source>Cannot find folder %x.</source>
+<target></target>
<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>
@@ -1329,20 +1286,20 @@ Ekskluder: \ting\temp\*
<source>Both sides are equal</source>
<target>Begge sider er like</target>
-<source>Files/folders differ in attributes only</source>
-<target>Filer/mapper skiller bare i attributter</target>
+<source>Items have different attributes</source>
+<target></target>
-<source>Copy new file/folder to left</source>
-<target>Kopier ny fil/mappe til venstre</target>
+<source>Copy new item to left</source>
+<target></target>
-<source>Copy new file/folder to right</source>
-<target>Kopier ny fil/mappe til høyre</target>
+<source>Copy new item to right</source>
+<target></target>
-<source>Delete left file/folder</source>
-<target>Slett venstre fil/mappe</target>
+<source>Delete left item</source>
+<target></target>
-<source>Delete right file/folder</source>
-<target>Slett høyre fil/mappe</target>
+<source>Delete right item</source>
+<target></target>
<source>Move file on left</source>
<target>Flytt venstre fil</target>
@@ -1350,20 +1307,20 @@ Ekskluder: \ting\temp\*
<source>Move file on right</source>
<target>Flytt høyre fil</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Overskriv venstre fil/mappe med den til høyre</target>
+<source>Overwrite left item</source>
+<target></target>
-<source>Overwrite right file/folder with left one</source>
-<target>Overskriv høyre fil/mappe med den til venstre</target>
+<source>Overwrite right item</source>
+<target></target>
<source>Do nothing</source>
<target>Ikke gjør noe</target>
-<source>Copy file attributes only to left</source>
-<target>Kopier filattributter bare til venstre</target>
+<source>Update attributes on left</source>
+<target></target>
-<source>Copy file attributes only to right</source>
-<target>Kopier filattributter bare til høyre</target>
+<source>Update attributes on right</source>
+<target></target>
<source>Multiple...</source>
<target>Flere...</target>
@@ -1416,11 +1373,11 @@ Ekskluder: \ting\temp\*
<source>Updating attributes of %x</source>
<target>Oppdaterer attributter til %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Navn på målmappe må ikke være tomt!</target>
+<source>Target folder name must not be empty.</source>
+<target></target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Mappe for filversjonshåndtering ble ikke angitt!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target></target>
<source>Source directory %x not found.</source>
<target>Kildemappen %x ikke funnet.</target>
@@ -1449,8 +1406,8 @@ Ekskluder: \ting\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>Papirkurv er ikke tilgjengelig for de følgende baner! Filer blir isteden slettet permanent:</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>En mappe blir endret som er del av flere mappepar! Kontroller synkroniseringsinnstillinger!</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>Behandler mappepar:</target>
diff --git a/BUILD/Languages/polish.lng b/BUILD/Languages/polish.lng
index 74d572c5..255cd2ab 100644
--- a/BUILD/Languages/polish.lng
+++ b/BUILD/Languages/polish.lng
@@ -7,8 +7,8 @@
<plural definition>n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Szukanie katalogu %x...</target>
+<source>Searching for folder %x...</source>
+<target>Wyszukiwanie katalogu %x...</target>
<source>Show in Explorer</source>
<target>Wyświetl w Explorerze</target>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>Stwórz alternatywne reguły synchronizacji</target>
-<source>No filter selected</source>
-<target>Nie wybrano żadnego filtra</target>
-
<source>Filter is active</source>
<target>Filtr jest aktywny</target>
+<source>No filter selected</source>
+<target>Nie wybrano żadnego filtra</target>
+
<source>Remove alternate settings</source>
<target>Usuń alternatywne ustawienia</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Ustawienia programu</target>
-<source>Synchronization Preview</source>
-<target>PodglÄ…d synchronizacji</target>
+<source>Summary</source>
+<target>Podsumowanie</target>
<source>Find</source>
<target>Znajdź</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>PrzeglÄ…daj</target>
-<source>Invalid command line: %x</source>
-<target>Nieprawidłowa komenda: %x</target>
+<source>Invalid command line:</source>
+<target>Nieprawidłowa komenda:</target>
<source>Info</source>
<target>Info</target>
@@ -229,29 +229,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Dysk %x nie jest częścią pliku %y!</target>
-<source>Cannot find file %x.</source>
-<target>Nie można znaleźć pliku %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Nie można odczytać elementu XML:</target>
-<source>S&ave configuration...</source>
-<target>Z&apisz konfiguracjÄ™...</target>
+<source>Cannot find file %x.</source>
+<target>Nie można znaleźć pliku %x.</target>
-<source>&Load configuration...</source>
-<target>&Wczytaj konfiguracjÄ™...</target>
+<source>&Open...</source>
+<target>&Otwórz...</target>
+
+<source>&Save...</source>
+<target>&Zapisz</target>
<source>&Quit</source>
<target>&Zamknij</target>
-<source>&File</source>
-<target>&Plik</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>&Zawartość</target>
-<source>&About...</source>
-<target>&O Programie...</target>
+<source>&About</source>
+<target>&O Programie</target>
<source>&Help</source>
<target>&Pomoc</target>
@@ -259,8 +259,8 @@
<source>Usage:</source>
<target>Użycie:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Wprowadź katalogi do nadzorowania</target>
+<source>1. Select folders to watch.</source>
+<target>1. Określ obserwowane katalogi.</target>
<source>2. Enter a command line.</source>
<target>2. Wprowadź komendę.</target>
@@ -268,19 +268,11 @@
<source>3. Press 'Start'.</source>
<target>3. Wciśnij 'Start'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Komenda jest wykonywana za każdym razem gdy:
-- wszystkie katalogi będą dostępne (np. włożenie USB)
-- pliki w obrębie tych katalogów i podkatalogów ulegną zmianie
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Aby rozpocząć po prostu zaimportuj plik .ffs_batch</target>
-<source>Directories to watch</source>
-<target>Katalogi do obserwacji</target>
+<source>Folders to watch</source>
+<target>Obserwowane katalogi</target>
<source>Add folder</source>
<target>Dodaj folder</target>
@@ -291,14 +283,25 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Select a folder</source>
<target>Wybierz folder</target>
+<source>Delay [seconds]</source>
+<target>Opóźnienie [sekundy]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Czas pomiędzy ostatnią wykrytą zmianą, a uruchomieniem komendy</target>
+
<source>Command line</source>
<target>Linia komend</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimalny czas bezczynności [sekundy]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Odstęp czasu w sekundach pomiędzy ostatnią wykrytą zmianą, a wykonaniem komendy</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Komenda jest wykonywana gdy:
+- pliki lub podkatalogi ulegnÄ… zmianie
+- zostaną utworzony nowe katalogi (n.p włożenie pamięci USB)
+</target>
<source>Start</source>
<target>Rozpocznij</target>
@@ -327,8 +330,8 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Waiting for missing directories...</source>
<target>Oczekiwanie na brakujÄ…ce katalogi...</target>
-<source>A directory input field is empty.</source>
-<target>Pole ze ścieżką katalogu jest puste.</target>
+<source>An input folder name is empty.</source>
+<target>Nazwa katalogu jest pusta.</target>
<source>Logging</source>
<target>Tworzenie logów</target>
@@ -414,7 +417,7 @@ Komenda jest wykonywana za każdym razem gdy:
<source><Symlink></source>
<target><DowiÄ…zanie symboliczne></target>
-<source><Directory></source>
+<source><Folder></source>
<target><Katalog></target>
<source>Full path</source>
@@ -426,8 +429,8 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Relative path</source>
<target>Relatywna ścieżka</target>
-<source>Directory</source>
-<target>Katalog</target>
+<source>Base folder</source>
+<target>Katalog bazowy</target>
<source>Size</source>
<target>Rozmiar</target>
@@ -438,8 +441,11 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Extension</source>
<target>Rozszerzenie</target>
-<source>Comparison Result</source>
-<target>Rezultat porównywania</target>
+<source>Action</source>
+<target>Akcja</target>
+
+<source>Category</source>
+<target>Kategoria</target>
<source>Drag && drop</source>
<target>Drag && Drop</target>
@@ -447,14 +453,14 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Close progress dialog</source>
<target>Zamknij okno postępu</target>
-<source>Shut down</source>
-<target>Wyłącz komputer</target>
+<source>Standby</source>
+<target>Przejdź w stan uśpienia</target>
<source>Log off</source>
<target>Wyloguj użytkownika</target>
-<source>Standby</source>
-<target>Przejdź w stan uśpienia</target>
+<source>Shut down</source>
+<target>Wyłącz komputer</target>
<source>Hibernate</source>
<target>Przejdź w stan hibernacji</target>
@@ -462,15 +468,12 @@ Komenda jest wykonywana za każdym razem gdy:
<source>1. &Compare</source>
<target>1. &Porównaj</target>
-<source>2. &Synchronize...</source>
-<target>2. &Synchronizuj...</target>
+<source>2. &Synchronize</source>
+<target>2. &Synchronizuj</target>
<source>&New</source>
<target>&Nowy</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>&Język</target>
@@ -498,8 +501,8 @@ Komenda jest wykonywana za każdym razem gdy:
<source>&Abort</source>
<target>&Przerwij</target>
-<source>Synchronize...</source>
-<target>Synchronizuj...</target>
+<source>Synchronize</source>
+<target>Synchronizuj</target>
<source>Start synchronization</source>
<target>Rozpocznij synchronizacjÄ™</target>
@@ -513,12 +516,12 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Swap sides</source>
<target>Zamień stronami</target>
-<source>Save current configuration to file</source>
-<target>Zapisz aktualny plik konfiguracyjny</target>
-
<source>Load configuration from file</source>
<target>Wczytaj konfiguracjÄ™ z pliku</target>
+<source>Save current configuration to file</source>
+<target>Zapisz aktualny plik konfiguracyjny</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Ostatnio użyta konfiguracja (naciśnij DEL żeby usunąć z listy)</target>
@@ -528,13 +531,13 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Hide filtered or temporarily excluded files</source>
<target>Ukryj pliki filtrowane lub tymczasowo wykluczone</target>
-<source>Number of files and directories that will be created</source>
+<source>Number of files and folders that will be created</source>
<target>Liczba plików i katalogów, które zostaną utworzone</target>
<source>Number of files that will be overwritten</source>
<target>Liczba plików, które zostaną nadpisane</target>
-<source>Number of files and directories that will be deleted</source>
+<source>Number of files and folders that will be deleted</source>
<target>Liczba plików i katalogów, które zostaną usunięte</target>
<source>Total amount of data that will be transferred</source>
@@ -558,8 +561,8 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Batch job</source>
<target>Plik wsadowy</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Utwórz plik wsadowy aby zautomatyzować proces synchronizacji. Aby uruchomić synchronizację w trybie wsadowym kliknij dwa razy kliknij na ten plik lub wykonaj komendę: FreeFileSync.exe SyncJob.ffs_batch. Możesz to również wykorzystać w swoim harmonogramie zadań.</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>Utwórz plik wsadowy aby zautomatyzować proces synchronizacji. Kliknij dwa razy na ten plik lub dodaj go do menadżera zadań w swoim systemie: FreeFileSync.exe <nazwa_pliku>.ffs_batch</target>
<source>Help</source>
<target>Pomoc</target>
@@ -585,18 +588,12 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Maximum number of log files:</source>
<target>Maksymalna liczba plików z logami:</target>
-<source>Select log file directory:</source>
-<target>Wybierz katalog 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>&Save</source>
-<target>&Zapisz</target>
-
-<source>&Load</source>
-<target>&Wczytaj</target>
-
<source>Select variant:</source>
<target>Wybierz wariant:</target>
@@ -621,29 +618,23 @@ Komenda jest wykonywana za każdym razem gdy:
<source>Configuration</source>
<target>Konfiguracja</target>
-<source>Category</source>
-<target>Kategoria</target>
-
-<source>Action</source>
-<target>Akcja</target>
-
-<source>File/folder exists on left side only</source>
-<target>Plik/folder istnieje tylko po lewej stronie</target>
+<source>Item exists on left side only</source>
+<target>Element istnieje tylko po lewej stronie</target>
-<source>File/folder exists on right side only</source>
-<target>Plik/folder istnieje tylko po prawej stronie</target>
+<source>Item exists on right side only</source>
+<target>Element istnieje tylko po prawej stronie</target>
-<source>Left file is newer</source>
-<target>Lewy plik jest nowszy</target>
+<source>Left side is newer</source>
+<target>Lewa strona jest nowsza</target>
-<source>Right file is newer</source>
-<target>Prawy plik jest nowszy</target>
+<source>Right side is newer</source>
+<target>Prawa strona jest nowsza</target>
-<source>Files have different content</source>
-<target>Pliki różnią się zawartością</target>
+<source>Items have different content</source>
+<target><Elementy różnią się zawartością</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Konflikt/plik nie może zostać skategoryzowany</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Konflikt/element nie może zostać skategoryzowany</target>
<source>OK</source>
<target>OK</target>
@@ -750,33 +741,6 @@ Tylko pliki pasujące do wszystkich filtrów będą synchronizowane.
Uwaga: Nazwy plików muszą być podane jako relatywne względem katalogu bazowego.
</target>
-<source>Hints:</source>
-<target>Wskazówki:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Wprowadź relatywne scieżki do plików lub katalogów oddzielone ';' lub nową linią.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Użyj wieloznacznika (wildcard) '*' i '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Wyklucz pliki i foldery używając prawego przycisku myszki.</target>
-
-<source>Example</source>
-<target>Przykład</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Uwzględnik: *.doc;*zip*.exe
-Wyklucz: \moje\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Synchronizuj wszystkie pliki .doc, .zip i exe z wyjÄ…tkiem folderu "temp"</target>
-
<source>Include</source>
<target>Dołącz</target>
@@ -798,8 +762,8 @@ Wyklucz: \moje\temp\*
<source>&Default</source>
<target>&Domyślne</target>
-<source>Transactional file copy</source>
-<target>Transakcyjne kopiowanie pliku</target>
+<source>Fail-safe file copy</source>
+<target>Bezpieczne kopiowanie</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>Stwórz tymczasowy plik (*.ffs_tmp) następnie zamień jego nazwę. Gwarantuje to spójność nawet po wystąpieniu błędu.</target>
@@ -813,8 +777,8 @@ Wyklucz: \moje\temp\*
<source>Copy file access permissions</source>
<target>Kopiuj uprawnienia plików</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Transfer uprawnień plików i katalogów (Wymaga uprawnień Administratora)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Kopiuj uprawnienia plików i katalogów (Wymaga uprawnień Administratora)</target>
<source>Restore hidden dialogs</source>
<target>Przywróc ukryte dialogi</target>
@@ -1126,10 +1090,10 @@ Wyklucz: \moje\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Dołącz zewnętrzną aplikację do menu kontekstowego. Dostępne macra:</target>
-<source>- full file or directory name</source>
+<source>- full file or folder name</source>
<target>- pełna nazwa pliku lub katalogu</target>
-<source>- directory part only</source>
+<source>- folder part only</source>
<target>- tylko część katalogu</target>
<source>- Other side's counterpart to %name</source>
@@ -1176,8 +1140,8 @@ Wyklucz: \moje\temp\*
<source>Versioning</source>
<target>Wersjonowanie</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>PrzenieÅ› pliki do oznaczonego podkatalogu</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>
@@ -1275,8 +1239,8 @@ Wyklucz: \moje\temp\*
<source>Cannot read directory %x.</source>
<target>Nie można odczytać katalogu %x.</target>
-<source>Endless loop.</source>
-<target>Nieskończona pętla.</target>
+<source>Detected endless directory recursion.</source>
+<target>Wykryto nieskończoną pętlę katalogów</target>
<source>Cannot set privilege %x.</source>
<target>Nie można ustawić uprawnień %x.</target>
@@ -1302,13 +1266,10 @@ Wyklucz: \moje\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Nieprawidłowy format pliku:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Możesz zignorować ten błąd uznająć jeden z katalogów jako pusty.</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>
-<source>Cannot find directory %x.</source>
+<source>Cannot find folder %x.</source>
<target>Nie można znaleźć katalogu %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
@@ -1341,20 +1302,20 @@ Wyklucz: \moje\temp\*
<source>Both sides are equal</source>
<target>Obie strony są równe</target>
-<source>Files/folders differ in attributes only</source>
-<target>Pliki/foldery różnią się tylko atrybutami</target>
+<source>Items have different attributes</source>
+<target>Elementy mają różne atrybuty</target>
-<source>Copy new file/folder to left</source>
-<target>Skopiuj nowy plik/katalog na lewÄ… stronÄ…</target>
+<source>Copy new item to left</source>
+<target>Kopiuj nowy element na lewÄ… stronÄ™</target>
-<source>Copy new file/folder to right</source>
-<target>Skopiuj nowy plik/katalog na prawÄ… stronÄ…</target>
+<source>Copy new item to right</source>
+<target>Kopiuj nowy element na prawÄ… stronÄ™</target>
-<source>Delete left file/folder</source>
-<target>Usuń plik/katalog po lewej stronie</target>
+<source>Delete left item</source>
+<target>Usuń lewy element</target>
-<source>Delete right file/folder</source>
-<target>Usuń plik/katalog po prawej stronie</target>
+<source>Delete right item</source>
+<target>Usuń prawy element</target>
<source>Move file on left</source>
<target>PrzenieÅ› plik na lewÄ… stronÄ™</target>
@@ -1362,20 +1323,20 @@ Wyklucz: \moje\temp\*
<source>Move file on right</source>
<target>PrzenieÅ› plik na prawÄ… stronÄ™</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Nadpisz plik/katalog po lewej stronie tym po prawej</target>
+<source>Overwrite left item</source>
+<target>Nadpisz lewy element</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Nadpisz plik/katalog po prawej stronie tym po lewej</target>
+<source>Overwrite right item</source>
+<target>Nadpisz prawy element</target>
<source>Do nothing</source>
<target>Nic nie rób</target>
-<source>Copy file attributes only to left</source>
-<target>Kopiuj atrybuty plików tylko na lewą stronę</target>
+<source>Update attributes on left</source>
+<target>Aktualizuj atrybuty po lewej stronie</target>
-<source>Copy file attributes only to right</source>
-<target>Kopiuj atrybuty plików tylko na prawą stronę</target>
+<source>Update attributes on right</source>
+<target>Aktualizuj atrybuty po prawej stronie</target>
<source>Multiple...</source>
<target>Wiele...</target>
@@ -1428,11 +1389,11 @@ Wyklucz: \moje\temp\*
<source>Updating attributes of %x</source>
<target>Aktualizowanie atrybutów %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Katalog docelowy nie może być pusty!</target>
+<source>Target folder name must not be empty.</source>
+<target>Katalog docelowy nie może być pusty.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Nie określono katalogu do wersjonowania plików!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Nazwa katalogu do wersjonowania plików nie może być pusta.</target>
<source>Source directory %x not found.</source>
<target>Katalog źródłowy %x nie istnieje.</target>
@@ -1461,8 +1422,8 @@ Wyklucz: \moje\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Katalog zostanie zmodyfikowany w efekcie synchronizacji wielu par folderów! Zweryfikuj ustawienia synchronizacji!</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>
diff --git a/BUILD/Languages/portuguese.lng b/BUILD/Languages/portuguese.lng
index a3a07ba4..70530ccb 100644
--- a/BUILD/Languages/portuguese.lng
+++ b/BUILD/Languages/portuguese.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>A procurar o directório %x...</target>
+<source>Searching for folder %x...</source>
+<target>À procura da pasta %x...</target>
<source>Show in Explorer</source>
<target>Mostrar no Explorer</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Sincronização Automatizada</target>
+<source>Error</source>
+<target>Erro</target>
+
<source>Select alternate comparison settings</source>
<target>Selecionar opções alternativas de comparação</target>
<source>Select alternate synchronization settings</source>
<target>Selecionar opções alternativas de sincronização</target>
-<source>No filter selected</source>
-<target>Nenhum filtro selecionado</target>
-
<source>Filter is active</source>
<target>Filtro activo</target>
+<source>No filter selected</source>
+<target>Nenhum filtro selecionado</target>
+
<source>Remove alternate settings</source>
<target>Remover opções alternativas</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>Sobre</target>
-<source>Error</source>
-<target>Erro</target>
-
<source>Warning</source>
<target>Atenção</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Opções</target>
-<source>Synchronization Preview</source>
-<target>Previsualizar sincronização</target>
+<source>Summary</source>
+<target>Sumário</target>
<source>Find</source>
<target>Procurar</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Procurar</target>
-<source>Invalid command line: %x</source>
-<target>Linha de comando inválida: %x</target>
+<source>Invalid command line:</source>
+<target>Linha de comando inválida:</target>
<source>Info</source>
<target>Info</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Nome do volume %x não faz parte do ficheiro %y!</target>
-<source>Cannot find file %x.</source>
-<target>Não é possível encontrar o ficheiro %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Não é possível ler os elementos XML:</target>
-<source>S&ave configuration...</source>
-<target>G&uardar a configuração...</target>
+<source>Cannot find file %x.</source>
+<target>Não é possível encontrar o ficheiro %x.</target>
-<source>&Load configuration...</source>
-<target>&Carregar configuração...</target>
+<source>&Open...</source>
+<target>&Abrir...</target>
+
+<source>&Save...</source>
+<target>&Guardar...</target>
<source>&Quit</source>
<target>S&air</target>
-<source>&File</source>
-<target>&Ficheiro</target>
+<source>&Program</source>
+<target>&Programa</target>
<source>&Content</source>
<target>C&onteúdo</target>
-<source>&About...</source>
-<target>&Sobre...</target>
+<source>&About</source>
+<target>&Sobre</target>
<source>&Help</source>
<target>A&juda</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Uso:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Selecionar directórios a monitorizar.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Selecionar pastas para observar.</target>
<source>2. Enter a command line.</source>
<target>2. Inserir a linha de comando.</target>
@@ -265,19 +265,11 @@
<source>3. Press 'Start'.</source>
<target>3. Pressionar 'Iniciar'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-A linha de comandos é executada cada vez que:
-- os directórios ficam disponíveis (i.e. pen USB)
-- ficheiros nos directórios ou subdirectórios são modificados
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Para começar basta importar um ficheiro .ffs_batch.</target>
-<source>Directories to watch</source>
-<target>Directórios a observar</target>
+<source>Folders to watch</source>
+<target>Pastas a observar</target>
<source>Add folder</source>
<target>Adicionar pasta</target>
@@ -288,18 +280,35 @@ A linha de comandos é executada cada vez que:
<source>Select a folder</source>
<target>Selecione uma pasta</target>
+<source>Delay [seconds]</source>
+<target>Atraso [segundos]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Tempo de espera entre a última alteração detetada e a execução do comando</target>
+
<source>Command line</source>
<target>Linha de comandos</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Tempo de espera [segundos]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Tempo de espera entre a última alteração e a execução do comando, em segundos</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+O comando é executado se:
+- ficheiros ou subpastas forem alterados
+- forem detetadas novas pastas (p.e. pen USB)
+</target>
<source>Start</source>
<target>Iniciar</target>
+<source>&Retry</source>
+<target>&Tentar de Novo</target>
+
+<source>Cancel</source>
+<target>Cancelar</target>
+
<source>(Build: %x)</source>
<target>(Build: %x)</target>
@@ -318,8 +327,8 @@ A linha de comandos é executada cada vez que:
<source>Waiting for missing directories...</source>
<target>A aguardar pelos directórios em falta...</target>
-<source>A directory input field is empty.</source>
-<target>Um campo de directório está vazio.</target>
+<source>An input folder name is empty.</source>
+<target>Um dos campos de comparação está vazio.</target>
<source>Logging</source>
<target>A escrever em log</target>
@@ -405,8 +414,8 @@ A linha de comandos é executada cada vez que:
<source><Symlink></source>
<target><Link Simbólico></target>
-<source><Directory></source>
-<target><Directório></target>
+<source><Folder></source>
+<target><Pasta></target>
<source>Full path</source>
<target>Caminho completo</target>
@@ -417,8 +426,8 @@ A linha de comandos é executada cada vez que:
<source>Relative path</source>
<target>Caminho</target>
-<source>Directory</source>
-<target>Directório</target>
+<source>Base folder</source>
+<target>Pasta principal</target>
<source>Size</source>
<target>Tamanho</target>
@@ -429,8 +438,11 @@ A linha de comandos é executada cada vez que:
<source>Extension</source>
<target>Extensão</target>
-<source>Comparison Result</source>
-<target>Resultados da comparação</target>
+<source>Action</source>
+<target>Ação</target>
+
+<source>Category</source>
+<target>Categoria</target>
<source>Drag && drop</source>
<target>Arrastar && Largar</target>
@@ -438,14 +450,14 @@ A linha de comandos é executada cada vez que:
<source>Close progress dialog</source>
<target>Fechar diálogo de progresso</target>
-<source>Shut down</source>
-<target>Desligar</target>
+<source>Standby</source>
+<target>Standby</target>
<source>Log off</source>
<target>Terminar sessão</target>
-<source>Standby</source>
-<target>Standby</target>
+<source>Shut down</source>
+<target>Desligar</target>
<source>Hibernate</source>
<target>Hibernar</target>
@@ -453,15 +465,12 @@ A linha de comandos é executada cada vez que:
<source>1. &Compare</source>
<target>1. &Comparar</target>
-<source>2. &Synchronize...</source>
-<target>2. &Sincronizar...</target>
+<source>2. &Synchronize</source>
+<target>2. &Sincronizar</target>
<source>&New</source>
<target>&Novo</target>
-<source>&Program</source>
-<target>&Programa</target>
-
<source>&Language</source>
<target>&Língua</target>
@@ -489,8 +498,8 @@ A linha de comandos é executada cada vez que:
<source>&Abort</source>
<target>&Abortar</target>
-<source>Synchronize...</source>
-<target>Sincronizar...</target>
+<source>Synchronize</source>
+<target>Sincronizar</target>
<source>Start synchronization</source>
<target>Iniciar a sincronização</target>
@@ -504,12 +513,12 @@ A linha de comandos é executada cada vez que:
<source>Swap sides</source>
<target>Trocar lados</target>
-<source>Save current configuration to file</source>
-<target>Guardar configuração actual para ficheiro</target>
-
<source>Load configuration from file</source>
<target>Carregar configuração do ficheiro</target>
+<source>Save current configuration to file</source>
+<target>Guardar configuração actual para ficheiro</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Última configuração utilizada (pressione DEL para remover da lista)</target>
@@ -519,14 +528,14 @@ A linha de comandos é executada cada vez que:
<source>Hide filtered or temporarily excluded files</source>
<target>Ocultar ficheiros filtrados ou temporariamente excluidos</target>
-<source>Number of files and directories that will be created</source>
-<target>Número de itens a ser criados</target>
+<source>Number of files and folders that will be created</source>
+<target>Número de ficheiros e pastas a ser criados</target>
<source>Number of files that will be overwritten</source>
<target>Número de ficheiros substituidos</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Número de itens a ser eliminados</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Número de ficheiros e pastas a ser eliminados</target>
<source>Total amount of data that will be transferred</source>
<target>Volume de dados a ser transferido</target>
@@ -549,8 +558,8 @@ A linha de comandos é executada cada vez que:
<source>Batch job</source>
<target>Ficheiro Batch</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Criar um ficheiro batch e automatizar a sincronização. Para iniciar o batch, fazer duplo-clique no ficheiro ou correr o comando: FreeFileSync.exe SyncJob.ffs_batch. Também pode ser adicionado no planeador de tarefas do sistema.</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>Criar ficheiro batch para automatizar a sincronização. Faça duplo-clique no ficheiro ou adicione ao planeador de tarefas do sistema: FreeFileSync.exe <nome>.ffs_batch</target>
<source>Help</source>
<target>Ajuda</target>
@@ -576,21 +585,12 @@ A linha de comandos é executada cada vez que:
<source>Maximum number of log files:</source>
<target>Número máximo de ficheiros log:</target>
-<source>Select log file directory:</source>
-<target>Selecione directório para ficheiro log:</target>
+<source>Select folder to save log files:</source>
+<target>Selecionar pasta onde guardar os logs:</target>
<source>Batch settings</source>
<target>Opções do batch</target>
-<source>&Save</source>
-<target>&Guardar</target>
-
-<source>&Load</source>
-<target>C&arregar</target>
-
-<source>Cancel</source>
-<target>Cancelar</target>
-
<source>Select variant:</source>
<target>Selecione uma variante:</target>
@@ -615,29 +615,23 @@ A linha de comandos é executada cada vez que:
<source>Configuration</source>
<target>Configuração</target>
-<source>Category</source>
-<target>Categoria</target>
-
-<source>Action</source>
-<target>Ação</target>
-
-<source>File/folder exists on left side only</source>
-<target>Ficheiro/pasta existe apenas à esquerda</target>
+<source>Item exists on left side only</source>
+<target>Item existe apenas à esquerda</target>
-<source>File/folder exists on right side only</source>
-<target>Ficheiro/pasta existe apenas à direita</target>
+<source>Item exists on right side only</source>
+<target>Item existe apenas à direita</target>
-<source>Left file is newer</source>
-<target>Ficheiro mais recente à esquerda</target>
+<source>Left side is newer</source>
+<target>Esquerda é mais recente</target>
-<source>Right file is newer</source>
-<target>Ficheiro mais recente à direita</target>
+<source>Right side is newer</source>
+<target>Direita é mais recente</target>
-<source>Files have different content</source>
-<target>Ficheiros são diferentes</target>
+<source>Items have different content</source>
+<target>Itens tem conteúdo diferente</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Ficheiro/conflito não pode ser categorizado</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Conflito/item não pode ser categorizado</target>
<source>OK</source>
<target>OK</target>
@@ -713,9 +707,6 @@ Os ficheiros são considerados iguais se
<source>&Ignore</source>
<target>&Ignorar</target>
-<source>&Retry</source>
-<target>&Tentar de Novo</target>
-
<source>Do not show this dialog again</source>
<target>Não mostrar este diálogo novamente</target>
@@ -746,33 +737,6 @@ Apenas ficheiros que condigam com todos os filtros serão sincronizados.
Nota: Nome dos ficheiros tem que ser relativo aos diretórios base!
</target>
-<source>Hints:</source>
-<target>Dicas:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Inserir caminhos dos ficheiros ou pastas separados por ';' ou numa nova linha.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Usar '*' e '?' como caracteres de procura.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Excluir ficheiros directamente da grelha através do menu de contexto.</target>
-
-<source>Example</source>
-<target>Exemplo</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Incluir: *.doc;*.zip;*.exe
-Excluir: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Sincronizar todos os ficheiros .doc, .zip e .exe, excepto os da pasta "temp".</target>
-
<source>Include</source>
<target>Incluir</target>
@@ -794,8 +758,8 @@ Excluir: \stuff\temp\*
<source>&Default</source>
<target>&Config. Iniciais</target>
-<source>Transactional file copy</source>
-<target>Cópia de ficheiro transacional</target>
+<source>Fail-safe file copy</source>
+<target>Cópia à prova de falhas</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>Escrever para um ficheiro temporário (*.ffs_tmp) primeiro e depois renomear. Isto garante consistência mesmo em caso de erro fatal.</target>
@@ -809,8 +773,8 @@ Excluir: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Copiar permissões de acesso do ficheiro</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Transferir ficheiro e permissões (Requer direitos de administrador)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Transferir ficheiro e permissões (precisa de direitos de Administrador)</target>
<source>Restore hidden dialogs</source>
<target>Restaurar diálogos escondidos</target>
@@ -1118,11 +1082,11 @@ Excluir: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrar aplicações externas no menu de contexto. As seguintes macros estão disponíveis:</target>
-<source>- full file or directory name</source>
-<target>- nome completo do ficheiro ou directório</target>
+<source>- full file or folder name</source>
+<target>- nome completo de ficheiro ou pasta</target>
-<source>- directory part only</source>
-<target>- apenas parte do directório</target>
+<source>- folder part only</source>
+<target>- nome da pasta parcial</target>
<source>- Other side's counterpart to %name</source>
<target>- Contrapartida de %name</target>
@@ -1166,8 +1130,8 @@ Excluir: \stuff\temp\*
<source>Versioning</source>
<target>Manter versões anteriores</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Mover ficheiros para uma subpasta datada</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>
@@ -1262,8 +1226,8 @@ Excluir: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Não é possível ler o directório %x.</target>
-<source>Endless loop.</source>
-<target>Loop infinito.</target>
+<source>Detected endless directory recursion.</source>
+<target>Recursão infinita detetada no directório</target>
<source>Cannot set privilege %x.</source>
<target>Não é possível definir o privilégio %x.</target>
@@ -1289,14 +1253,11 @@ Excluir: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>O ficheiro não contém uma configuração válida:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Pode ignorar este erro para considerar o directório como vazio.</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>
-<source>Cannot find directory %x.</source>
-<target>Não é possível encontrar o directório %x.</target>
+<source>Cannot find folder %x.</source>
+<target>Não consigo encontrar a pasta %x.</target>
<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>
@@ -1328,20 +1289,20 @@ Excluir: \stuff\temp\*
<source>Both sides are equal</source>
<target>Ambos os lados iguais</target>
-<source>Files/folders differ in attributes only</source>
-<target>Ficheiros/pastas diferem apenas nos atributos</target>
+<source>Items have different attributes</source>
+<target>Itens tem diferentes atributos</target>
-<source>Copy new file/folder to left</source>
-<target>Copiar novo ficheiro/pasta para a esquerda</target>
+<source>Copy new item to left</source>
+<target>Copiar novo item para a esquerda</target>
-<source>Copy new file/folder to right</source>
-<target>Copiar novo ficheiro/pasta para a direita</target>
+<source>Copy new item to right</source>
+<target>Copiar novo item para a direita</target>
-<source>Delete left file/folder</source>
-<target>Eliminar ficheiro/pasta à esquerda</target>
+<source>Delete left item</source>
+<target>Apagar item esquerdo</target>
-<source>Delete right file/folder</source>
-<target>Eliminar ficheiro/pasta à direita</target>
+<source>Delete right item</source>
+<target>Apagar item direito</target>
<source>Move file on left</source>
<target>Mover ficheiro à esquerda</target>
@@ -1349,20 +1310,20 @@ Excluir: \stuff\temp\*
<source>Move file on right</source>
<target>Mover ficheiro à direita</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Substituir ficheiro/pasta da esquerda (pelo da direita)</target>
+<source>Overwrite left item</source>
+<target>Substituir item da esquerda</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Substituir ficheiro/pasta da direita (pelo da esquerda)</target>
+<source>Overwrite right item</source>
+<target>Substituir item da direita</target>
<source>Do nothing</source>
<target>Não fazer nada</target>
-<source>Copy file attributes only to left</source>
-<target>Copiar apenas atributos de ficheiro para a esquerda</target>
+<source>Update attributes on left</source>
+<target>Actualizar atributos à esquerda</target>
-<source>Copy file attributes only to right</source>
-<target>Copiar apenas atributos de ficheiro para a direita</target>
+<source>Update attributes on right</source>
+<target>Actualizar atributos à direita</target>
<source>Multiple...</source>
<target>Multiplo...</target>
@@ -1415,11 +1376,11 @@ Excluir: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Actualizar atributos de %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Nome do directório de destino não pode estar vazio!</target>
+<source>Target folder name must not be empty.</source>
+<target>Nome da pasta de destino não pode estar vazio.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Diretório para armazenar versões não foi definido!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Nome da pasta para manter versões não pode estar vazio.</target>
<source>Source directory %x not found.</source>
<target>Directório fonte %x não encontrado.</target>
@@ -1448,8 +1409,8 @@ Excluir: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Um directório que pertencente a um conjunto de vários directórios vai ser alterado! Verifique as opções de sincronização!</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>
diff --git a/BUILD/Languages/portuguese_br.lng b/BUILD/Languages/portuguese_br.lng
index 0e14cfe7..a6e83355 100644
--- a/BUILD/Languages/portuguese_br.lng
+++ b/BUILD/Languages/portuguese_br.lng
@@ -7,8 +7,8 @@
<plural definition>n <= 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Procurando pelo diretório %x...</target>
+<source>Searching for folder %x...</source>
+<target>Buscando pela pasta %x...</target>
<source>Show in Explorer</source>
<target>Mostrar no Explorer</target>
@@ -17,7 +17,7 @@
<target>Abrir com aplicativo padrão</target>
<source>Browse directory</source>
-<target>Navegar pelo diretório</target>
+<target>Procurar diretório</target>
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Cancelar solicitado: Esperando fim da operação...</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Sincronização Automatizada</target>
+<source>Error</source>
+<target>Erro</target>
+
<source>Select alternate comparison settings</source>
-<target>Selecionar configuração de comparação alternativa</target>
+<target>Selecionar configurações alternativas de comparação</target>
<source>Select alternate synchronization settings</source>
-<target>Selecionar configuração de sincronização alternativa</target>
-
-<source>No filter selected</source>
-<target>Nenhum filtro selecionado</target>
+<target>Selecionar configurações alternativas de sincronização</target>
<source>Filter is active</source>
<target>Filtro está ativo</target>
+<source>No filter selected</source>
+<target>Nenhum filtro selecionado</target>
+
<source>Remove alternate settings</source>
<target>Remover configurações alternativas</target>
@@ -50,14 +53,11 @@
<target>Parâmetros de sincronização</target>
<source>Comparison settings</source>
-<target>Configurações da comparação</target>
+<target>Parâmetros da comparação</target>
<source>About</source>
<target>Sobre</target>
-<source>Error</source>
-<target>Erro</target>
-
<source>Warning</source>
<target>Avisos</target>
@@ -73,29 +73,29 @@
<source>Global settings</source>
<target>Configurações</target>
-<source>Synchronization Preview</source>
-<target>Pré-visualização da Sincronização</target>
+<source>Summary</source>
+<target>Resumo</target>
<source>Find</source>
<target>Localizar</target>
<source>Select time span</source>
-<target>Selecionar período de tempo</target>
+<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 erros e avisos</target>
+<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 ou aviso</target>
+<target>Ocultar todas as mensagens de erro e aviso</target>
<source>Exit instantly</source>
-<target>Sair instantaneamente</target>
+<target>Sair imediatamente</target>
<source>Abort synchronization immediately</source>
<target>Cancelar a sincronização imediatamente</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Procurar</target>
-<source>Invalid command line: %x</source>
-<target>Linha de comando inválida: %x</target>
+<source>Invalid command line:</source>
+<target>Linha de comando inválida:</target>
<source>Info</source>
<target>Informações</target>
@@ -158,7 +158,7 @@
<target>Falta de memória!</target>
<source>Database files do not share a common session.</source>
-<target>Os arquivos de banco de dados não compartilham uma sessão comum.</target>
+<target>Os arquivos de banco de dados são de sessões diferentes.</target>
<source>An exception occurred!</source>
<target>Ocorreu uma exceção!</target>
@@ -170,10 +170,10 @@
<target>Não foi possível obter as informações do processo.</target>
<source>Waiting while directory is locked (%x)...</source>
-<target>Esperando enquanto o diretório é travado (%x)...</target>
+<target>Esperando enquanto o diretório é bloqueado (%x)...</target>
<source>Cannot set directory lock %x.</source>
-<target>Não foi possível ajustar o bloqueio no diretório %x.</target>
+<target>Não foi possível bloquear o diretório %x.</target>
<source>
<pluralform>1 sec</pluralform>
@@ -181,7 +181,7 @@
</source>
<target>
<pluralform>1 seg</pluralform>
-<pluralform>%x seg</pluralform>
+<pluralform>%x segs</pluralform>
</target>
<source>Error parsing file %x, row %y, column %z.</source>
@@ -209,7 +209,7 @@
<target>O arquivo %x não contém uma configuração válida.</target>
<source>Configuration file %x loaded partially only.</source>
-<target>O arquivo de configuração %x foi lido parcialmente apenas.</target>
+<target>O arquivo de configuração %x foi carregado parcialmente.</target>
<source>Cannot access Volume Shadow Copy Service.</source>
<target>Não foi possível acessar o Serviço Cópia de Sombra de Volume.</target>
@@ -232,32 +232,32 @@
<source>Cannot read the following XML elements:</source>
<target>Não foi possível ler os seguintes elementos XML:</target>
-<source>S&ave configuration...</source>
-<target>S&alvar configuração...</target>
+<source>&Open...</source>
+<target>&Abrir...</target>
-<source>&Load configuration...</source>
-<target>&Carregar configuração...</target>
+<source>&Save...</source>
+<target>&Salvar...</target>
<source>&Quit</source>
-<target>&Sair</target>
+<target>Sai&r</target>
-<source>&File</source>
-<target>&Arquivo</target>
+<source>&Program</source>
+<target>&Programa</target>
<source>&Content</source>
<target>&Conteúdo</target>
-<source>&About...</source>
-<target>&Sobre...</target>
+<source>&About</source>
+<target>&Sobre</target>
<source>&Help</source>
-<target>&Ajuda</target>
+<target>A&juda</target>
<source>Usage:</source>
<target>Uso:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Selecione os diretórios para monitorar.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Selecione as pastas para monitorar.</target>
<source>2. Enter a command line.</source>
<target>2. Entre uma linha de comando.</target>
@@ -265,19 +265,11 @@
<source>3. Press 'Start'.</source>
<target>3. Pressione 'Iniciar'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-A linha de comando é executada cada vez que:
-- todos os diretórios ficam disponíveis (ex.: inserção de uma Pen Drive)
-- arquivos dentro desses diretórios ou subdiretórios são modificados
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Para iniciar importe um arquivo .ffs_batch.</target>
-<source>Directories to watch</source>
-<target>Diretórios para monitorar</target>
+<source>Folders to watch</source>
+<target>Pastas para comparar</target>
<source>Add folder</source>
<target>Adicionar pasta</target>
@@ -288,18 +280,35 @@ A linha de comando é executada cada vez que:
<source>Select a folder</source>
<target>Selecionar uma pasta</target>
+<source>Delay [seconds]</source>
+<target>Atraso [segundos]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Tempo de espera entre última mudança detectada e execução do comando</target>
+
<source>Command line</source>
<target>Linha de comando</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Mínimo Tempo Ocioso [segundos]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Tempo ocioso entre detecção da última mudança e da execução da linha de comando em segundos</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+O comando é disparado se:
+- arquivos ou subpastas são alterados
+- novas pastas aparecem (p. ex. Uma pendrive é inserida)
+</target>
<source>Start</source>
<target>Iniciar</target>
+<source>&Retry</source>
+<target>&Tentar Novamente</target>
+
+<source>Cancel</source>
+<target>Cancelar</target>
+
<source>(Build: %x)</source>
<target>(Versão: %x)</target>
@@ -318,8 +327,8 @@ A linha de comando é executada cada vez que:
<source>Waiting for missing directories...</source>
<target>Esperando por diretórios faltantes...</target>
-<source>A directory input field is empty.</source>
-<target>Um campo de entrada de diretório está vazio.</target>
+<source>An input folder name is empty.</source>
+<target>Um nome de pasta de entrada está em branco.</target>
<source>Logging</source>
<target>Ver Log</target>
@@ -397,7 +406,7 @@ A linha de comando é executada cada vez que:
<target>FreeFileSync está atualizado!</target>
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
-<target>Deseja que o FreeFileSync procure automaticamente novas versões toda semana?</target>
+<target>Deseja que o FreeFileSync procure automaticamente novas versões todas as semanas?</target>
<source>(Requires an Internet connection!)</source>
<target>(Requer conexão com a Internet!)</target>
@@ -405,8 +414,8 @@ A linha de comando é executada cada vez que:
<source><Symlink></source>
<target><Link Simbólico></target>
-<source><Directory></source>
-<target><Diretório></target>
+<source><Folder></source>
+<target><Pasta></target>
<source>Full path</source>
<target>Caminho completo</target>
@@ -417,8 +426,8 @@ A linha de comando é executada cada vez que:
<source>Relative path</source>
<target>Caminho relativo</target>
-<source>Directory</source>
-<target>Diretório</target>
+<source>Base folder</source>
+<target>Pasta base</target>
<source>Size</source>
<target>Tamanho</target>
@@ -429,8 +438,11 @@ A linha de comando é executada cada vez que:
<source>Extension</source>
<target>Extensão</target>
-<source>Comparison Result</source>
-<target>Resultado da Comparação</target>
+<source>Action</source>
+<target>Ação</target>
+
+<source>Category</source>
+<target>Categoria</target>
<source>Drag && drop</source>
<target>Arrastar && Soltar</target>
@@ -438,30 +450,27 @@ A linha de comando é executada cada vez que:
<source>Close progress dialog</source>
<target>Fechar indicador de progresso</target>
-<source>Shut down</source>
-<target>Desligar</target>
+<source>Standby</source>
+<target>Em espera</target>
<source>Log off</source>
<target>Fazer logoff</target>
-<source>Standby</source>
-<target>Em espera</target>
+<source>Shut down</source>
+<target>Desligar</target>
<source>Hibernate</source>
<target>Hibernar</target>
<source>1. &Compare</source>
-<target>1. C&omparar</target>
+<target>1. &Comparar</target>
-<source>2. &Synchronize...</source>
-<target>2. S&incronizar...</target>
+<source>2. &Synchronize</source>
+<target>2. S&incronizar</target>
<source>&New</source>
<target>&Novo</target>
-<source>&Program</source>
-<target>&Programa</target>
-
<source>&Language</source>
<target>&Idioma</target>
@@ -489,27 +498,27 @@ A linha de comando é executada cada vez que:
<source>&Abort</source>
<target>&Abortar</target>
-<source>Synchronize...</source>
-<target>Sincronizar...</target>
+<source>Synchronize</source>
+<target>Sincronizar</target>
<source>Start synchronization</source>
-<target>Iniciar sincronização</target>
+<target>Iniciar a sincronização</target>
<source>Add folder pair</source>
-<target>Adicionar par de pastas</target>
+<target>Adicionar um par de pastas</target>
<source>Remove folder pair</source>
-<target>Remover par de pastas</target>
+<target>Remover o par de pastas</target>
<source>Swap sides</source>
<target>Inverter lados</target>
-<source>Save current configuration to file</source>
-<target>Salvar configuração atual para arquivo</target>
-
<source>Load configuration from file</source>
<target>Carregar configuração do arquivo</target>
+<source>Save current configuration to file</source>
+<target>Salvar configuração atual para arquivo</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Últimas configurações usadas (pressione DEL para remover da lista)</target>
@@ -519,14 +528,14 @@ A linha de comando é executada cada vez que:
<source>Hide filtered or temporarily excluded files</source>
<target>Ocultar arquivos filtrados ou temporariamente excluídos</target>
-<source>Number of files and directories that will be created</source>
-<target>Número de arquivos e diretórios que serão criados</target>
+<source>Number of files and folders that will be created</source>
+<target>Número de arquivos e pastas que serão criados</target>
<source>Number of files that will be overwritten</source>
<target>Número de arquivos que serão substituídos</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Número de arquivos e diretórios que serão apagados</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Número de arquivos e pastas que serão apagados</target>
<source>Total amount of data that will be transferred</source>
<target>Volume total de dados que será transferido</target>
@@ -549,8 +558,8 @@ A linha de comando é executada cada vez que:
<source>Batch job</source>
<target>Tarefa em lote</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Cria um arquivo de lote e automatiza a sincronização. Para iniciar em modo de lote, simplesmente dê um clique-duplo neste arquivo ou execute o comando: FreeFileSync.exe SyncJob.ffs_batch. Também pode ser agendado pelo Agendador de Tarefas do sistema operacional.</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>Cria um arquivo de lote para automatizar a sincronização. Dê um clique duplo ou agende no Agendador de Tarefas do sistema operacional: FreeFileSync.exe <nome>.ffs_batch</target>
<source>Help</source>
<target>Ajuda</target>
@@ -576,21 +585,12 @@ A linha de comando é executada cada vez que:
<source>Maximum number of log files:</source>
<target>Número máximo de arquivos de log:</target>
-<source>Select log file directory:</source>
-<target>Escolha um diretório para salvar o arquivo de log:</target>
+<source>Select folder to save log files:</source>
+<target>Selecione a pasta para salvar os arquivos de log:</target>
<source>Batch settings</source>
<target>Configurações da tarefa em lote</target>
-<source>&Save</source>
-<target>&Salvar</target>
-
-<source>&Load</source>
-<target>&Carregar</target>
-
-<source>Cancel</source>
-<target>Cancelar</target>
-
<source>Select variant:</source>
<target>Selecione um modo:</target>
@@ -615,29 +615,23 @@ A linha de comando é executada cada vez que:
<source>Configuration</source>
<target>Configuração</target>
-<source>Category</source>
-<target>Categoria</target>
-
-<source>Action</source>
-<target>Ação</target>
+<source>Item exists on left side only</source>
+<target>Item existe apenas no lado esquerdo</target>
-<source>File/folder exists on left side only</source>
-<target>Arquivo/pasta existente somente no lado esquerdo</target>
+<source>Item exists on right side only</source>
+<target>Item existe apenas no lado direito</target>
-<source>File/folder exists on right side only</source>
-<target>Arquivo/pasta existente somente no lado direito</target>
+<source>Left side is newer</source>
+<target>Lado esquerdo é novo</target>
-<source>Left file is newer</source>
-<target>O arquivo à esquerda é mais novo</target>
+<source>Right side is newer</source>
+<target>Lado direito é novo</target>
-<source>Right file is newer</source>
-<target>O arquivo à direita é mais novo</target>
+<source>Items have different content</source>
+<target>Itens têm conteúdos diferentes</target>
-<source>Files have different content</source>
-<target>Os arquivos possuem conteúdos diferentes</target>
-
-<source>Conflict/file cannot be categorized</source>
-<target>O conflito/arquivo não pode ser categorizado</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Conflito/item não pode ser categorizado</target>
<source>OK</source>
<target>OK</target>
@@ -714,9 +708,6 @@ Os arquivos são considerados iguais se
<source>&Ignore</source>
<target>&Ignorar</target>
-<source>&Retry</source>
-<target>&Tentar Novamente</target>
-
<source>Do not show this dialog again</source>
<target>Não mostrar este diálogo novamente</target>
@@ -747,33 +738,6 @@ Apenas arquivos que correspondem a todas as configurações do filtro serão sin
Nota: Os nomes dos arquivos devem ser relativos aos diretórios base!
</target>
-<source>Hints:</source>
-<target>Dicas:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Entre os nomes dos arquivos ou diretórios relativos separados por ';' ou uma nova linha.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Use '*' e '?' como caracteres coringa.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Exclua arquivos diretamente do grid principal através do menu de contexto.</target>
-
-<source>Example</source>
-<target>Exemplo</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Incluir: *.doc;*.zip;*.exe
-Excluir: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Sincronizar todos arquivos .doc, .zip e .exe exceto tudo que estiver na subpasta "temp".</target>
-
<source>Include</source>
<target>Incluir</target>
@@ -795,8 +759,8 @@ Excluir: \stuff\temp\*
<source>&Default</source>
<target>&Config. Padrão</target>
-<source>Transactional file copy</source>
-<target>Cópia de arquivo transacional</target>
+<source>Fail-safe file copy</source>
+<target>Cópia de arquivos a prova de falha</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>Escreve para um arquivo temporário primeiro (*.ffs_tmp) e depois o renomeia. Isto garante um estado consistente mesmo em caso de erro fatal.</target>
@@ -810,8 +774,8 @@ Excluir: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Copiar permissões de acesso aos arquivos</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Transfere as permissões de arquivos e diretórios (Requer direitos de Administrador)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Tranfere as permissões dos arquivos e pastas (requer direitos de Administrador)</target>
<source>Restore hidden dialogs</source>
<target>Restaurar diálogos ocultados</target>
@@ -889,7 +853,7 @@ Excluir: \stuff\temp\*
<target>Grande</target>
<source>Select time span...</source>
-<target>Selecionar período de tempo...</target>
+<target>Selecionar intervalo de tempo...</target>
<source>Default view</source>
<target>Visualização padrão</target>
@@ -1006,7 +970,7 @@ Excluir: \stuff\temp\*
<target>Por favor execute primeiro a Comparação antes de sincronizar!</target>
<source>Comma separated list</source>
-<target>Lista de itens separada por vírgula</target>
+<target>Lista de itens separados por vírgulas</target>
<source>Legend</source>
<target>Legenda</target>
@@ -1108,7 +1072,7 @@ Excluir: \stuff\temp\*
<target>Filtro</target>
<source>Direct</source>
-<target>Direcionar</target>
+<target>Direto</target>
<source>Follow</source>
<target>Seguir</target>
@@ -1119,11 +1083,11 @@ Excluir: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrar aplicações externas no menu de contexto. As seguintes macros estão disponíveis:</target>
-<source>- full file or directory name</source>
-<target>- nome completo do arquivo ou diretório</target>
+<source>- full file or folder name</source>
+<target>- nome completo do arquivo ou pasta</target>
-<source>- directory part only</source>
-<target>- apenas a parte do diretório</target>
+<source>- folder part only</source>
+<target>- apenas parte da pasta</target>
<source>- Other side's counterpart to %name</source>
<target>- Correspondente do outro lado a %name</target>
@@ -1167,8 +1131,8 @@ Excluir: \stuff\temp\*
<source>Versioning</source>
<target>Controle de versões</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Mover arquivos para um subdiretório com carimbo de tempo</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>
@@ -1191,7 +1155,7 @@ Excluir: \stuff\temp\*
</source>
<target>
<pluralform>1 min</pluralform>
-<pluralform>%x min</pluralform>
+<pluralform>%x mins</pluralform>
</target>
<source>
@@ -1263,8 +1227,8 @@ Excluir: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Não foi possível ler o diretório %x.</target>
-<source>Endless loop.</source>
-<target>Loop infinito.</target>
+<source>Detected endless directory recursion.</source>
+<target>Detectada recursão de diretório infinita.</target>
<source>Cannot set privilege %x.</source>
<target>Não foi possível estabelecer o privilégio %x.</target>
@@ -1290,14 +1254,11 @@ Excluir: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>O arquivo não contém uma configuração válida:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Você pode ignorar esse erro para considerar o diretório como vazio.</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>
-<source>Cannot find directory %x.</source>
-<target>Não foi possível encontrar o diretório %x.</target>
+<source>Cannot find folder %x.</source>
+<target>Não foi possível encontrar a pasta %x.</target>
<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>
@@ -1329,44 +1290,44 @@ Excluir: \stuff\temp\*
<source>Both sides are equal</source>
<target>Ambos os lados são iguais</target>
-<source>Files/folders differ in attributes only</source>
-<target>Os arquivos/pastas se diferenciam apenas nos atributos</target>
+<source>Items have different attributes</source>
+<target>Itens têm atributos diferentes</target>
-<source>Copy new file/folder to left</source>
-<target>Copiar arquivos/pastas novos para a esquerda</target>
+<source>Copy new item to left</source>
+<target>Copiar novo item para a esquerda</target>
-<source>Copy new file/folder to right</source>
-<target>Copiar arquivos/pastas novos para a direita</target>
+<source>Copy new item to right</source>
+<target>Copiar novo item para a direita</target>
-<source>Delete left file/folder</source>
-<target>Apagar arquivos/pastas da esquerda</target>
+<source>Delete left item</source>
+<target>Deletar item à esquerda</target>
-<source>Delete right file/folder</source>
-<target>Apagar arquivos/pastas da direita</target>
+<source>Delete right item</source>
+<target>Deletar item à direita</target>
<source>Move file on left</source>
-<target>Mover arquivo da esquerda</target>
+<target>Mover arquivo à esquerda</target>
<source>Move file on right</source>
-<target>Mover arquivo da direita</target>
+<target>Mover arquivo à direita</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Substituir arquivos/pastas da esquerda pelos da direita</target>
+<source>Overwrite left item</source>
+<target>Sobrescrever item à esquerda</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Substituir arquivos/pastas da direita pelos da esquerda</target>
+<source>Overwrite right item</source>
+<target>Sobrescrever item à esquerda</target>
<source>Do nothing</source>
<target>Não fazer nada</target>
-<source>Copy file attributes only to left</source>
-<target>Copiar apenas os atributos do arquivo para a esquerda</target>
+<source>Update attributes on left</source>
+<target>Atualizar atributos à esquerda</target>
-<source>Copy file attributes only to right</source>
-<target>Copiar apenas os atributos do arquivo para a direita</target>
+<source>Update attributes on right</source>
+<target>Atualizar atributos à direita</target>
<source>Multiple...</source>
-<target>Múltiplos...</target>
+<target>Múltiplo...</target>
<source>Deleting file %x</source>
<target>Apagando arquivo %x</target>
@@ -1416,11 +1377,11 @@ Excluir: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Atualizando atributos de %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Nome do diretório de destino não pode estar vazio!</target>
+<source>Target folder name must not be empty.</source>
+<target>O nome da pasta de destino não pode estar em branco.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>O diretório para controle de versões não foi fornecido!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>O nome da pasta para o controle de versões não pode estar em branco.</target>
<source>Source directory %x not found.</source>
<target>O diretório de origem %x não foi encontrado.</target>
@@ -1449,8 +1410,8 @@ Excluir: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Um diretório que faz parte de múltiplos pares de pastas será modificado! Por favor revise suas configurações de sincronização!</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>
diff --git a/BUILD/Languages/romanian.lng b/BUILD/Languages/romanian.lng
index c49c9158..1e526883 100644
--- a/BUILD/Languages/romanian.lng
+++ b/BUILD/Languages/romanian.lng
@@ -7,7 +7,7 @@
<plural definition>n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2</plural definition>
</header>
-<source>Searching for directory %x...</source>
+<source>Searching for folder %x...</source>
<target>Caut dosarul %x...</target>
<source>Show in Explorer</source>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Sincronizare Inteligentă</target>
+<source>Error</source>
+<target>Eroare</target>
+
<source>Select alternate comparison settings</source>
<target>Selectează setările alternative de comparare</target>
<source>Select alternate synchronization settings</source>
<target>Selectează o altă configurație a sincronizării</target>
+<source>Filter is active</source>
+<target>Filtrul de elemente este activ</target>
+
<source>No filter selected</source>
<target>Nu a fost selectat nici un filtru</target>
-<source>Filter is active</source>
-<target>Filtrul este activ</target>
-
<source>Remove alternate settings</source>
<target>Înlătură setările alternative</target>
@@ -44,7 +47,7 @@
<target>Curăță Setările Filtrului</target>
<source>Create a batch job</source>
-<target>Creează o Sarcină Set</target>
+<target>Creează o Sarcină Set [Batch Job]</target>
<source>Synchronization settings</source>
<target>Setările Sincronizării</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>Despre</target>
-<source>Error</source>
-<target>Eroare</target>
-
<source>Warning</source>
<target>Atenție</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Setări Globale</target>
-<source>Synchronization Preview</source>
-<target>Previzionarea Sincronizării</target>
+<source>Summary</source>
+<target>Sumar</target>
<source>Find</source>
<target>Găsește</target>
@@ -83,13 +83,13 @@
<target>Selectează intervalul de timp</target>
<source>Show pop-up</source>
-<target>Este arătat un popîc</target>
+<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>Erorile sînt ignorate</target>
+<target>Ignoră erorile</target>
<source>Hide all error and warning messages</source>
<target>Sînt ascunse toate mesajele de eroare și de avertizare</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Explorează</target>
-<source>Invalid command line: %x</source>
-<target>Linie de comandă nevalidă: %x</target>
+<source>Invalid command line:</source>
+<target>Linie de comandă nevalidă:</target>
<source>Info</source>
<target>Informații</target>
@@ -229,29 +229,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Numele volumului %x nu face parte din numele filei %y !</target>
-<source>Cannot find file %x.</source>
-<target>Nu pot găsi fila %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Nu pot citi următoarele elemente XML:</target>
-<source>S&ave configuration...</source>
-<target>S&alvează Configurația...</target>
+<source>Cannot find file %x.</source>
+<target>Nu pot găsi fila %x.</target>
+
+<source>&Open...</source>
+<target>&Deschide...</target>
-<source>&Load configuration...</source>
-<target>&Deschide Configurația...</target>
+<source>&Save...</source>
+<target>&Salvează...</target>
<source>&Quit</source>
<target>&Ieși</target>
-<source>&File</source>
-<target>&Filă</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>&Conținut</target>
-<source>&About...</source>
-<target>&Despre...</target>
+<source>&About</source>
+<target>&Despre</target>
<source>&Help</source>
<target>&Ajutor</target>
@@ -259,7 +259,7 @@
<source>Usage:</source>
<target>Utilizare:</target>
-<source>1. Select directories to monitor.</source>
+<source>1. Select folders to watch.</source>
<target>1. Selectează dosarele de monitorizat.</target>
<source>2. Enter a command line.</source>
@@ -268,19 +268,11 @@
<source>3. Press 'Start'.</source>
<target>3. Apasă 'Pornește'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Linia de comandă este executată de fiecare dată cînd:
-- toate dosarele devin disponibile (de ex. se introduce un dispozitiv USB)
-- filele conținute în aceste dosare sau subdosare sînt modificate
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Pentru a începe, importă o filă de tipul .ffs_batch.</target>
-<source>Directories to watch</source>
-<target>Dosare de monitorizat</target>
+<source>Folders to watch</source>
+<target>Dosare de Monitorizat</target>
<source>Add folder</source>
<target>Adaugă Dosar</target>
@@ -291,18 +283,35 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Select a folder</source>
<target>Selectează un Dosar</target>
+<source>Delay [seconds]</source>
+<target>Întîrziere [secunde]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Timpul de inactivitate între ultima schimbare detectată și executarea comenzii</target>
+
<source>Command line</source>
<target>Linie de comandă</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Timp Minim de Inactivitate [secunde]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Timp de inactivitate (în secunde) între detectarea ultimei modificări și executarea liniei de comandă</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Comanda este declanșată dacă:
+- sînt modificate filele sau subdosarele
+- apar dosare noi (de ex. prin atașarea unui dispozitiv USB)
+</target>
<source>Start</source>
<target>Pornește</target>
+<source>&Retry</source>
+<target>&Reîncearcă</target>
+
+<source>Cancel</source>
+<target>Anulează</target>
+
<source>(Build: %x)</source>
<target>(Compilația: %x)</target>
@@ -321,8 +330,8 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Waiting for missing directories...</source>
<target>Aștept ca dosarele lipsă să devină disponibile...</target>
-<source>A directory input field is empty.</source>
-<target>Cel puțin unul din dosarele de comparat este nespecificat.</target>
+<source>An input folder name is empty.</source>
+<target>Un cîmp de introducere a numelui de dosar este gol.</target>
<source>Logging</source>
<target>Jurnal</target>
@@ -346,7 +355,7 @@ Linia de comandă este executată de fiecare dată cînd:
<target>Sincronizare Personalizată</target>
<source>FreeFileSync batch file</source>
-<target>Filă cu set de comenzi FreeFileSync</target>
+<target>Filă Set FreeFileSync</target>
<source>FreeFileSync configuration</source>
<target>Configurație FreeFileSync</target>
@@ -408,7 +417,7 @@ Linia de comandă este executată de fiecare dată cînd:
<source><Symlink></source>
<target><Simlegătură></target>
-<source><Directory></source>
+<source><Folder></source>
<target><Dosar></target>
<source>Full path</source>
@@ -420,8 +429,8 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Relative path</source>
<target>Cale Relativă</target>
-<source>Directory</source>
-<target>Dosar</target>
+<source>Base folder</source>
+<target>Dosar Bază (Rădăcină)</target>
<source>Size</source>
<target>Mărime</target>
@@ -432,8 +441,11 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Extension</source>
<target>Extensie</target>
-<source>Comparison Result</source>
-<target>Rezultatul Comparării</target>
+<source>Action</source>
+<target>Acțiune</target>
+
+<source>Category</source>
+<target>Categorie</target>
<source>Drag && drop</source>
<target>Trage și pune un dosar mai jos sau explorează către el</target>
@@ -441,14 +453,14 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Close progress dialog</source>
<target>Închide Fereastra cu Progresul Sincronizării</target>
-<source>Shut down</source>
-<target>ÃŽnchide Calculatorul [Shut down]</target>
+<source>Standby</source>
+<target>Pune Calculatorul în Stare de Veghe [Stand-by]</target>
<source>Log off</source>
<target>Deloghează Utilizatorul [Log off]</target>
-<source>Standby</source>
-<target>Pune Calculatorul în Stare de Veghe [Stand-by]</target>
+<source>Shut down</source>
+<target>ÃŽnchide Calculatorul [Shut down]</target>
<source>Hibernate</source>
<target>Pune Calculatorul în Hibernare</target>
@@ -456,15 +468,12 @@ Linia de comandă este executată de fiecare dată cînd:
<source>1. &Compare</source>
<target>1. &Compară</target>
-<source>2. &Synchronize...</source>
-<target>2. &Sincronizează...</target>
+<source>2. &Synchronize</source>
+<target>2. &Sincronizează</target>
<source>&New</source>
<target>Configurație &Nouă</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>&Limbă</target>
@@ -492,7 +501,7 @@ Linia de comandă este executată de fiecare dată cînd:
<source>&Abort</source>
<target>&Anulează</target>
-<source>Synchronize...</source>
+<source>Synchronize</source>
<target>Sincronizează</target>
<source>Start synchronization</source>
@@ -507,12 +516,12 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Swap sides</source>
<target>Schimbă compartimentele stîng și drept între ele</target>
-<source>Save current configuration to file</source>
-<target>Salvează într-o filă modificările configurației curente</target>
-
<source>Load configuration from file</source>
<target>Deschide configurația dintr-o filă</target>
+<source>Save current configuration to file</source>
+<target>Salvează într-o filă modificările configurației curente</target>
+
<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>
@@ -522,13 +531,13 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Hide filtered or temporarily excluded files</source>
<target>Ascunde elementele (file/dosare) filtrate sau excluse temporar</target>
-<source>Number of files and directories that will be created</source>
+<source>Number of files and folders that will be created</source>
<target>Numărul de file și dosare care vor fi create</target>
<source>Number of files that will be overwritten</source>
<target>Numărul de file care vor fi suprascrise</target>
-<source>Number of files and directories that will be deleted</source>
+<source>Number of files and folders that will be deleted</source>
<target>Numărul de file și dosare care vor fi șterse</target>
<source>Total amount of data that will be transferred</source>
@@ -552,14 +561,14 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Batch job</source>
<target>Sarcină Set</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Creează o filă set [batch] și automatizează sincronizarea. Pentru a porni în modul set dublu-clichează această filă sau rulează comanda: FreeFileSync.exe SyncJob.ffs_batch. Operația poate fi de asemenea planificată folosind planificatorul de sarcini al sistemului.</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>Automatizează sincronizarea prin crearea unei file set [batch file]. Pentru efectuarea sincronizării, dublu-clichează această filă sau programează sarcina următoare în Planificatorul de Sarcini [Task Scheduler] al SO: FreeFileSync.exe <numele filei>.ffs_batch</target>
<source>Help</source>
<target>Ajutor</target>
<source>Filter files</source>
-<target>Filtru de Elemente</target>
+<target>Filtru</target>
<source>Left</source>
<target>Stînga</target>
@@ -571,7 +580,7 @@ Linia de comandă este executată de fiecare dată cînd:
<target>Afișarea Stării</target>
<source>Show progress dialog</source>
-<target>Arată caseta de dialog cu progresul</target>
+<target>Arată progresul sincronizării</target>
<source>Error handling</source>
<target>Gestionarea Erorilor</target>
@@ -579,20 +588,11 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Maximum number of log files:</source>
<target>Numărul maxim de file jurnal:</target>
-<source>Select log file directory:</source>
-<target>Selectează un dosar pentru fila .log:</target>
+<source>Select folder to save log files:</source>
+<target>Selectează dosarul unde să fie salvate filele jurnal [log files]</target>
<source>Batch settings</source>
-<target>Setările Setului de Comenzi</target>
-
-<source>&Save</source>
-<target>&Salvează</target>
-
-<source>&Load</source>
-<target>&Deschide</target>
-
-<source>Cancel</source>
-<target>Anulează</target>
+<target>Setările Setului</target>
<source>Select variant:</source>
<target>Selectează Varianta de Sincronizare:</target>
@@ -618,29 +618,23 @@ Linia de comandă este executată de fiecare dată cînd:
<source>Configuration</source>
<target>Configurație</target>
-<source>Category</source>
-<target>Categorie</target>
-
-<source>Action</source>
-<target>Acțiune</target>
+<source>Item exists on left side only</source>
+<target>Elementul există doar în partea stîngă</target>
-<source>File/folder exists on left side only</source>
-<target>Fila/Dosarul există doar în partea stîngă</target>
+<source>Item exists on right side only</source>
+<target>Elementul există doar în partea dreaptă</target>
-<source>File/folder exists on right side only</source>
-<target>Fila/Dosarul există doar în partea dreaptă</target>
+<source>Left side is newer</source>
+<target>Elementul din partea stîngă e mai nou</target>
-<source>Left file is newer</source>
-<target>Fila stîngă e mai nouă</target>
+<source>Right side is newer</source>
+<target>Elementul din partea dreaptă e mai nou</target>
-<source>Right file is newer</source>
-<target>Fila dreaptă e mai nouă</target>
+<source>Items have different content</source>
+<target>Elementele au conținut diferit</target>
-<source>Files have different content</source>
-<target>Filele au conținut diferit</target>
-
-<source>Conflict/file cannot be categorized</source>
-<target>Conflictul de file nu poate fi inclus într-o anumită categorie</target>
+<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>
@@ -673,7 +667,7 @@ este același
</target>
<source>Symbolic Link handling</source>
-<target>Prelucrarea Legăturilor Simbolice (Simlegături)</target>
+<target>Gestionarea Legăturilor Simbolice (Simleg.)</target>
<source>Synchronizing...</source>
<target>Sincronizare Aflată în Curs...</target>
@@ -714,8 +708,8 @@ este același
<source>Hide further error messages during the current process</source>
<target>Ascunde mesajele de eroare apărute ulterior în timpul acestui proces</target>
-<source>&Retry</source>
-<target>&Reîncearcă</target>
+<source>&Ignore</source>
+<target>&Ignoră</target>
<source>Do not show this dialog again</source>
<target>Nu arăta acest dialog din nou</target>
@@ -730,7 +724,7 @@ este același
<target>&Nu</target>
<source>Use Recycle Bin</source>
-<target>Mutare în Reciclator</target>
+<target>Mută în Reciclator</target>
<source>Delete on both sides</source>
<target>Șterge din ambele părți</target>
@@ -747,33 +741,6 @@ Doar filele care se potrivesc cu toate setările de filtrare vor fi sincronizate
Notă: Numele filelor trebuie să fie relative la dosarele bază (rădăcină)!
</target>
-<source>Hints:</source>
-<target>Sfaturi:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Scrie numele relative ale filelor sau dosarelor, separate de semnul ';' sau de un rînd nou.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Folosește metacaracterele '*' și '?' (asterisc și semn de întrebare).</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Exclude filele și dosarele direct de pe grila principală, cu ajutorul meniului contextual.</target>
-
-<source>Example</source>
-<target>Exemplu</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Incluse: *.doc;*.zip;*.exe
-Excluse: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Sincronizează filele .doc, .zip și .exe, cu excepția celor din subdosarul "temp".</target>
-
<source>Include</source>
<target>Incluse</target>
@@ -795,8 +762,8 @@ Excluse: \stuff\temp\*
<source>&Default</source>
<target>Coloanele &Implicite</target>
-<source>Transactional file copy</source>
-<target>Copiază filele în mod tranzacțional</target>
+<source>Fail-safe file copy</source>
+<target>Copiază filele în modul protejat la eșec [fail-safe]</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>Scrierea se face mai întîi într-o filă temporară (*.ffs_tmp), care e apoi renumită. Se garantează astfel consecvența stării filelor chiar și în cazul apariției de erori fatale.</target>
@@ -810,7 +777,7 @@ Excluse: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Copiază permisiunile de acces ale filelor</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
<target>Permisiunile filelor și dosarelor sînt și ele transferate (necesită drepturi de Administrator)</target>
<source>Restore hidden dialogs</source>
@@ -1109,7 +1076,7 @@ Excluse: \stuff\temp\*
<target>MB</target>
<source>Filter</source>
-<target>Filtrează</target>
+<target>Filtru</target>
<source>Direct</source>
<target>Direcționează</target>
@@ -1123,11 +1090,11 @@ Excluse: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Comenzi pentru aplicații externe incluse în meniul contextual al softului. Sînt disponibile următoarele macrocomenzi:</target>
-<source>- full file or directory name</source>
+<source>- full file or folder name</source>
<target>- numele complet al filei sau dosarului</target>
-<source>- directory part only</source>
-<target>- doar dosarele</target>
+<source>- folder part only</source>
+<target>- doar pentru partea dosarului</target>
<source>- Other side's counterpart to %name</source>
<target>- corespondentul din partea opusă al lui %name</target>
@@ -1162,7 +1129,7 @@ Excluse: \stuff\temp\*
<target>Lasă ca Conflict Nerezolvat</target>
<source>Delete permanently</source>
-<target>Ștergere definitivă</target>
+<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>
@@ -1171,10 +1138,10 @@ Excluse: \stuff\temp\*
<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>
+<target>Versionează</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Filele sînt mutate într-un subdosar special cu marcaj de timp</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>
@@ -1272,8 +1239,8 @@ Excluse: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Nu pot citi dosarul %x.</target>
-<source>Endless loop.</source>
-<target>Buclă infinită.</target>
+<source>Detected endless directory recursion.</source>
+<target>A fost detectată o recursivitate infinită a dosarului.</target>
<source>Cannot set privilege %x.</source>
<target>Nu pot seta privilegiul %x.</target>
@@ -1299,13 +1266,10 @@ Excluse: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Fila nu conține o configurație validă:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
+<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>
-<source>Cannot find directory %x.</source>
+<source>Cannot find folder %x.</source>
<target>Nu pot găsi dosarul %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
@@ -1338,19 +1302,19 @@ Excluse: \stuff\temp\*
<source>Both sides are equal</source>
<target>Ambele părți sînt identice</target>
-<source>Files/folders differ in attributes only</source>
-<target>File/Dosarele diferă doar prin atributele lor</target>
+<source>Items have different attributes</source>
+<target>Elementele au atribute diferite</target>
-<source>Copy new file/folder to left</source>
+<source>Copy new item to left</source>
<target>Copiază elementul nou în stînga</target>
-<source>Copy new file/folder to right</source>
+<source>Copy new item to right</source>
<target>Copiază elementul nou în dreapta</target>
-<source>Delete left file/folder</source>
+<source>Delete left item</source>
<target>Șterge elementul stîng</target>
-<source>Delete right file/folder</source>
+<source>Delete right item</source>
<target>Șterge elementul drept</target>
<source>Move file on left</source>
@@ -1359,20 +1323,20 @@ Excluse: \stuff\temp\*
<source>Move file on right</source>
<target>Mută fila în dreapta</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Suprascrie elementul stîng (fila/dosarul) cu cel drept</target>
+<source>Overwrite left item</source>
+<target>Suprascrie elementul stîng cu cel drept</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Suprascrie elementul drept (fila/dosarul) cu cel stîng</target>
+<source>Overwrite right item</source>
+<target>Suprascrie elementul drept cu cel stîng</target>
<source>Do nothing</source>
<target>Nici o Acțiune</target>
-<source>Copy file attributes only to left</source>
-<target>Copiază atributele filelor doar înspre stînga</target>
+<source>Update attributes on left</source>
+<target>Actualizează atributele în partea stîngă</target>
-<source>Copy file attributes only to right</source>
-<target>Copiază atributele filelor doar înspre dreapta</target>
+<source>Update attributes on right</source>
+<target>Actualizează atributele în partea dreaptă</target>
<source>Multiple...</source>
<target>Multiplu...</target>
@@ -1425,11 +1389,11 @@ Excluse: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Actualizez atributele lui %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Numele dosarului țintă nu poate să lipsească!</target>
+<source>Target folder name must not be empty.</source>
+<target>Numele dosarului țintă nu poate să lipsească.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Dosarul pentru versionarea filelor n-a fost specificat!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Numele dosarului pentru versionarea filelor nu poate să lipsească.</target>
<source>Source directory %x not found.</source>
<target>Dosarul sursă %x nu a fost găsit.</target>
@@ -1458,7 +1422,7 @@ Excluse: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
+<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>
diff --git a/BUILD/Languages/russian.lng b/BUILD/Languages/russian.lng
index a5008215..79b98c07 100644
--- a/BUILD/Languages/russian.lng
+++ b/BUILD/Languages/russian.lng
@@ -7,7 +7,7 @@
<plural definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<11 || n%100>14) ? 1 : 2</plural definition>
</header>
-<source>Searching for directory %x...</source>
+<source>Searching for folder %x...</source>
<target>ПоиÑк папки %x...</target>
<source>Show in Explorer</source>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - ÐвтоматичеÑÐºÐ°Ñ ÑинхронизациÑ</target>
+<source>Error</source>
+<target>Ошибка</target>
+
<source>Select alternate comparison settings</source>
<target>Выбрать альтернативные наÑтройки ÑравнениÑ</target>
<source>Select alternate synchronization settings</source>
<target>Выбрать альтернативные наÑтройки Ñинхронизации</target>
-<source>No filter selected</source>
-<target>Ðи один фильтр не выбран</target>
-
<source>Filter is active</source>
<target>Фильтр активен</target>
+<source>No filter selected</source>
+<target>Ðи один фильтр не выбран</target>
+
<source>Remove alternate settings</source>
<target>Удалить альтернативные наÑтройки</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>О программе</target>
-<source>Error</source>
-<target>Ошибка</target>
-
<source>Warning</source>
<target>Внимание</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Глобальные наÑтройки</target>
-<source>Synchronization Preview</source>
-<target>ПредпроÑмотр Ñинхронизации</target>
+<source>Summary</source>
+<target>Сводка</target>
<source>Find</source>
<target>Ðайти</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Обзор</target>
-<source>Invalid command line: %x</source>
-<target>ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока: %x</target>
+<source>Invalid command line:</source>
+<target>ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока:</target>
<source>Info</source>
<target>ИнформациÑ</target>
@@ -229,29 +229,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Ð˜Ð¼Ñ Ñ‚Ð¾Ð¼Ð° %x не ÑвлÑетÑÑ Ñ‡Ð°Ñтью имени файла %y!</target>
-<source>Cannot find file %x.</source>
-<target>Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Ðевозможно прочитать Ñледующие XML Ñлементы:</target>
-<source>S&ave configuration...</source>
-<target>Сохранить наÑтройки Ñинхронизации...</target>
+<source>Cannot find file %x.</source>
+<target>Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл %x.</target>
+
+<source>&Open...</source>
+<target>&Открыть...</target>
-<source>&Load configuration...</source>
-<target>&Загрузить наÑтройки Ñинхронизации...</target>
+<source>&Save...</source>
+<target>&Сохранить...</target>
<source>&Quit</source>
<target>&Выход</target>
-<source>&File</source>
-<target>&Файл</target>
+<source>&Program</source>
+<target>&Программа</target>
<source>&Content</source>
<target>&Справка</target>
-<source>&About...</source>
-<target>&О программе...</target>
+<source>&About</source>
+<target>&О программе</target>
<source>&Help</source>
<target>&Помощь</target>
@@ -259,7 +259,7 @@
<source>Usage:</source>
<target>ИнÑтрукциÑ:</target>
-<source>1. Select directories to monitor.</source>
+<source>1. Select folders to watch.</source>
<target>1. Выберите папки Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ;</target>
<source>2. Enter a command line.</source>
@@ -268,18 +268,10 @@
<source>3. Press 'Start'.</source>
<target>3. Ðажмите 'Старт'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока выполнÑетÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раз, когда:
-- вÑе папки ÑтановÑÑ‚ÑÑ Ð´Ð¾Ñтупны (например, подключение переноÑного ноÑителÑ)
-- файлы в папках или подпапках изменены
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑка проÑто импортируйте файл .ffs_batch.</target>
-<source>Directories to watch</source>
+<source>Folders to watch</source>
<target>Папки Ð´Ð»Ñ Ð½Ð°Ð±Ð»ÑŽÐ´ÐµÐ½Ð¸Ñ</target>
<source>Add folder</source>
@@ -291,23 +283,40 @@ The command line is executed each time:
<source>Select a folder</source>
<target>Выбрать папку</target>
+<source>Delay [seconds]</source>
+<target>Задержка [в Ñекундах]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ¸ между поÑледним обнаруженным изменением и выполнением командной Ñтроки в Ñекундах</target>
+
<source>Command line</source>
<target>ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Минимальное Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ [Ñекунд]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñƒ обнаружением поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ выполнением командной Ñтроки в Ñекундах</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Команда выполнÑетÑÑ, еÑли:
+- файлы или подпапки изменены
+- поÑвилиÑÑŒ новые папки (например, подключение переноÑного ноÑителÑ)
+</target>
<source>Start</source>
<target>Старт</target>
+<source>&Retry</source>
+<target>&Повторить</target>
+
+<source>Cancel</source>
+<target>Отмена</target>
+
<source>(Build: %x)</source>
<target>(Ñборка %x)</target>
-<source>RealtimeSync configuration</source>
-<target>ÐаÑтройка RealtimeSync</target>
+<source>All files</source>
+<target></target>
<source>&Restore</source>
<target>&ВоÑÑтановить</target>
@@ -321,8 +330,8 @@ The command line is executed each time:
<source>Waiting for missing directories...</source>
<target>Ожидание пропущенных папок...</target>
-<source>A directory input field is empty.</source>
-<target>Поле ввода пути папки пуÑтое.</target>
+<source>An input folder name is empty.</source>
+<target>Поле ввода имени папки пуÑтое.</target>
<source>Logging</source>
<target>Лог-файлы</target>
@@ -348,9 +357,6 @@ The command line is executed each time:
<source>FreeFileSync batch file</source>
<target>Файл пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ FreeFileSync</target>
-<source>FreeFileSync configuration</source>
-<target>ÐаÑтройка FreeFileSync</target>
-
<source>Batch execution</source>
<target>Выполнение пакетного заданиÑ</target>
@@ -393,12 +399,12 @@ The command line is executed each time:
<source>Download now?</source>
<target>Загрузить ÑейчаÑ?</target>
-<source>Information</source>
-<target>ИнформациÑ</target>
-
<source>FreeFileSync is up to date!</source>
<target>У Ð’Ð°Ñ ÑÐ°Ð¼Ð°Ñ Ð¿Ð¾ÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ FreeFileSync!</target>
+<source>Information</source>
+<target>ИнформациÑ</target>
+
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
<target>Ð’Ñ‹ хотите, чтобы FreeFileSync автоматичеÑки проверÑл наличие обновлений каждую неделю?</target>
@@ -408,7 +414,7 @@ The command line is executed each time:
<source><Symlink></source>
<target><Ð¡Ð¸Ð¼Ð²Ð¾Ð»ÑŒÐ½Ð°Ñ ÑÑылка></target>
-<source><Directory></source>
+<source><Folder></source>
<target><Папка></target>
<source>Full path</source>
@@ -420,8 +426,8 @@ The command line is executed each time:
<source>Relative path</source>
<target>ОтноÑительный путь</target>
-<source>Directory</source>
-<target>Папка</target>
+<source>Base folder</source>
+<target>ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°</target>
<source>Size</source>
<target>Размер</target>
@@ -432,8 +438,11 @@ The command line is executed each time:
<source>Extension</source>
<target>РаÑширение</target>
-<source>Comparison Result</source>
-<target>Результаты ÑравнениÑ</target>
+<source>Action</source>
+<target>ДейÑтвие</target>
+
+<source>Category</source>
+<target>КатегориÑ</target>
<source>Drag && drop</source>
<target>Drag && drop</target>
@@ -441,14 +450,14 @@ The command line is executed each time:
<source>Close progress dialog</source>
<target>Закрыть окно процеÑÑа</target>
-<source>Shut down</source>
-<target>Выключить компьютер</target>
+<source>Standby</source>
+<target>Перейти в оджидание</target>
<source>Log off</source>
<target>Выйти из ÑиÑтемы (разлогинитьÑÑ)</target>
-<source>Standby</source>
-<target>Перейти в оджидание</target>
+<source>Shut down</source>
+<target>Выключить компьютер</target>
<source>Hibernate</source>
<target>ГибернациÑ</target>
@@ -456,15 +465,12 @@ The command line is executed each time:
<source>1. &Compare</source>
<target>1. &Сравнить</target>
-<source>2. &Synchronize...</source>
+<source>2. &Synchronize</source>
<target>2. &Синхронизировать</target>
<source>&New</source>
<target>&ÐоваÑ</target>
-<source>&Program</source>
-<target>&Программа</target>
-
<source>&Language</source>
<target>&Язык</target>
@@ -492,7 +498,7 @@ The command line is executed each time:
<source>&Abort</source>
<target>&Отмена</target>
-<source>Synchronize...</source>
+<source>Synchronize</source>
<target>Синхронизировать</target>
<source>Start synchronization</source>
@@ -507,12 +513,12 @@ The command line is executed each time:
<source>Swap sides</source>
<target>ПоменÑÑ‚ÑŒ направление</target>
-<source>Save current configuration to file</source>
-<target>Сохранить текущие наÑтройки Ñинхронизации в файл</target>
-
<source>Load configuration from file</source>
<target>Загрузить наÑтройки Ñинхронизации из файла</target>
+<source>Save current configuration to file</source>
+<target>Сохранить текущие наÑтройки Ñинхронизации в файл</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>
ПоÑледние иÑпользованные наÑтройки Ñинхронизации
@@ -520,26 +526,23 @@ The command line is executed each time:
</target>
<source>Hide excluded items</source>
-<target>Скрыть иÑключенные пункты</target>
+<target>Скрыть иÑключенные Ñлементы</target>
<source>Hide filtered or temporarily excluded files</source>
<target>Скрыть отфильтрованные или временно иÑключенные файлы</target>
-<source>Number of files and directories that will be created</source>
-<target>ЧиÑло файлов и папок, которые будут Ñозданы</target>
+<source>Number of files and folders that will be created</source>
+<target>КоличеÑтво файлов и папок, которые будут Ñозданы</target>
<source>Number of files that will be overwritten</source>
-<target>ЧиÑло файлов, которые будут перезапиÑаны</target>
+<target>КоличеÑтво файлов, которые будут перезапиÑаны</target>
-<source>Number of files and directories that will be deleted</source>
-<target>ЧиÑло файлов и папок, которые будут удалены</target>
+<source>Number of files and folders that will be deleted</source>
+<target>КоличеÑтво файлов и папок, которые будут удалены</target>
<source>Total amount of data that will be transferred</source>
<target>Общий объем данных, который будет передаватьÑÑ</target>
-<source>Operation:</source>
-<target>ОперациÑ:</target>
-
<source>Items found:</source>
<target>Элементов найдено:</target>
@@ -555,8 +558,8 @@ The command line is executed each time:
<source>Batch job</source>
<target>Пакетное задание</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Создайте файл пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой Ñинхронизации. Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑка в пакетном режиме проÑто дважды щелкните по файлу или выполните командную Ñтроку: FreeFileSync.exe SyncJob.ffs_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>Создайте файл пакетного Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой Ñинхронизации. Ð”Ð»Ñ Ð·Ð°Ð¿ÑƒÑка дважды кликните на файле или Ñоздайте раÑпиÑание в планировщике вашей ÑиÑтемы: FreeFileSync.exe <название>.ffs_batch</target>
<source>Help</source>
<target>Помощь</target>
@@ -582,21 +585,12 @@ The command line is executed each time:
<source>Maximum number of log files:</source>
<target>МакÑимальное количеÑтво лог-файлов:</target>
-<source>Select log file directory:</source>
-<target>Выберите папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлов:</target>
+<source>Select folder to save log files:</source>
+<target>Выберите папку Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³-файлов:</target>
<source>Batch settings</source>
<target>ÐаÑтройки пакетного заданиÑ</target>
-<source>&Save</source>
-<target>&Сохранить</target>
-
-<source>&Load</source>
-<target>&Загрузить</target>
-
-<source>Cancel</source>
-<target>Отмена</target>
-
<source>Select variant:</source>
<target>Варианты Ñинхронизации</target>
@@ -621,29 +615,23 @@ The command line is executed each time:
<source>Configuration</source>
<target>ÐаÑтройки</target>
-<source>Category</source>
-<target>КатегориÑ</target>
+<source>Item exists on left side only</source>
+<target>Элемент ÑущеÑтвует только на левой Ñтороне</target>
-<source>Action</source>
-<target>ДейÑтвие</target>
-
-<source>File/folder exists on left side only</source>
-<target>Файл/папка ÑущеÑтвует только на левой Ñтороне</target>
-
-<source>File/folder exists on right side only</source>
-<target>Файл/папка ÑущеÑтвует только на правой Ñтороне</target>
+<source>Item exists on right side only</source>
+<target>Элемент ÑущеÑтвует только на правой Ñтороне</target>
-<source>Left file is newer</source>
-<target>Файл на левой Ñтороне новее</target>
+<source>Left side is newer</source>
+<target>Ðа левой Ñтороне новее</target>
-<source>Right file is newer</source>
-<target>Файл на правой Ñтороне новее</target>
+<source>Right side is newer</source>
+<target>Ðа правой Ñтороне новее</target>
-<source>Files have different content</source>
-<target>Файлы имеют различное Ñодержание</target>
+<source>Items have different content</source>
+<target>Элемент имеют различное Ñодержание</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Конфликт/файл не может быть отнеÑен к какой-либо категории</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Конфликт/Ñлемент не могут быть отнеÑены к какой-либо категории</target>
<source>OK</source>
<target>OK</target>
@@ -715,9 +703,6 @@ is the same
<source>&Ignore</source>
<target>&Игнорировать</target>
-<source>&Retry</source>
-<target>&Повторить</target>
-
<source>Do not show this dialog again</source>
<target>Больше не показывать Ñто окно</target>
@@ -748,33 +733,6 @@ Note: File names must be relative to base directories!
Примечание: Файлы должны отноÑитьÑÑ Ðº Ñинхронизируемым папкам!
</target>
-<source>Hints:</source>
-<target>ПодÑказка:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Введите имена файлов или папок, разделÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼ ';' или Ñ Ð½Ð¾Ð²Ð¾Ð¹ Ñтроки.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. ИÑпользуйте Ñимволы '*' и '?' Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ неизвеÑтных.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. ИÑключите файлы прÑмо в главном окне через контекÑтное меню.</target>
-
-<source>Example</source>
-<target>Пример</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-ВключаÑ: *.doc;*.zip;*.exe
-ИÑключаÑ: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Синхронизировать вÑе .doc, .zip и .exe файлы, за иÑключением вÑех файлов из подпапки "temp"</target>
-
<source>Include</source>
<target>Включить</target>
@@ -796,8 +754,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>&По-умолчанию</target>
-<source>Transactional file copy</source>
-<target>БезопаÑное копирование файлов</target>
+<source>Fail-safe file copy</source>
+<target>ОтказоуÑтойчивое копирование файла</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>Сначала копировать во временные файлы (*.ffs_tmp), затем переименовывать их. Это гарантирует целоÑтноÑÑ‚ÑŒ заменÑемых файлов в Ñлучае Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ„Ð°Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð¹ ошибки копированиÑ.</target>
@@ -811,7 +769,7 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Копирование прав доÑтупа к файлам</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
<target>Передача прав доÑтупа к файлам/папкам (требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÐдминиÑтратора)</target>
<source>Restore hidden dialogs</source>
@@ -1127,10 +1085,10 @@ Exclude: \stuff\temp\*
ДоÑтупны Ñледующие команды:
</target>
-<source>- full file or directory name</source>
+<source>- full file or folder name</source>
<target>- полный путь файла или папки</target>
-<source>- directory part only</source>
+<source>- folder part only</source>
<target>- чаÑÑ‚ÑŒ пути папки</target>
<source>- Other side's counterpart to %name</source>
@@ -1177,7 +1135,7 @@ Exclude: \stuff\temp\*
<source>Versioning</source>
<target>Перемещать Ñтарые верÑии файлов в заданную папку</target>
-<source>Move files into a time-stamped subdirectory</source>
+<source>Move files into a time-stamped subfolder</source>
<target>Перемещать файлы в заданную папку (можно Ñоздавать архивные верÑии удаленных файлов)</target>
<source>Files</source>
@@ -1246,6 +1204,9 @@ Exclude: \stuff\temp\*
<source>Cannot write modification time of %x.</source>
<target>Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ файла %x.</target>
+<source>Cannot write file attributes of %x.</source>
+<target>Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать атрибуты файла %x.</target>
+
<source>Cannot find system function %x.</source>
<target>Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ ÑиÑтемную функцию %x.</target>
@@ -1267,17 +1228,14 @@ Exclude: \stuff\temp\*
<source>Cannot copy symbolic link %x to %y.</source>
<target>Ðе удаетÑÑ Ñкопировать Ñимвольную ÑÑылку %x в %y.</target>
-<source>Cannot write file attributes of %x.</source>
-<target>Ðе удаетÑÑ Ð·Ð°Ð¿Ð¸Ñать атрибуты файла %x.</target>
-
<source>Cannot copy file %x to %y.</source>
<target>Ðе удаетÑÑ Ñкопировать файл %x в %y.</target>
<source>Cannot read directory %x.</source>
<target>Ðе удаетÑÑ Ð¿Ñ€Ð¾Ñ‡ÐµÑÑ‚ÑŒ папку %x.</target>
-<source>Endless loop.</source>
-<target>БеÑконечный цикл.</target>
+<source>Detected endless directory recursion.</source>
+<target>Обнаружена беÑÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐºÑƒÑ€ÑÐ¸Ñ Ð¿Ð°Ð¿Ð¾Ðº.</target>
<source>Cannot set privilege %x.</source>
<target>Ðе удаетÑÑ ÑƒÑтановить привелегии %x.</target>
@@ -1306,13 +1264,10 @@ Exclude: \stuff\temp\*
Старые файлы будут заменены более новыми файлами.
</target>
-<source>The file does not contain a valid configuration:</source>
-<target>Файл не Ñодержит дейÑтвительных наÑтроек Ñинхронизации:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
+<source>You can ignore this error to consider the folder as empty.</source>
<target>Ð’Ñ‹ можете проигнорировать ошибку, принÑв папку за пуÑтую.</target>
-<source>Cannot find directory %x.</source>
+<source>Cannot find folder %x.</source>
<target>Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ папку %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
@@ -1345,20 +1300,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>Обе Ñтороны равны</target>
-<source>Files/folders differ in attributes only</source>
-<target>Файлы/папки разнÑÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ атрибутами</target>
+<source>Items have different attributes</source>
+<target>Элементы имеют разные атрибуты</target>
-<source>Copy new file/folder to left</source>
-<target>Скопировать новый файл/папку налево</target>
+<source>Copy new item to left</source>
+<target>Скопировать новый Ñлемент налево</target>
-<source>Copy new file/folder to right</source>
-<target>Скопировать новый файл/папку направо</target>
+<source>Copy new item to right</source>
+<target>Скопировать новый Ñлемент направо</target>
-<source>Delete left file/folder</source>
-<target>Удалить файл/папку Ñлева</target>
+<source>Delete left item</source>
+<target>Удалить Ñлемент Ñлева</target>
-<source>Delete right file/folder</source>
-<target>Удалить файл/папку Ñправа</target>
+<source>Delete right item</source>
+<target>Удалить Ñлемент Ñправа</target>
<source>Move file on left</source>
<target>ПеремеÑтить файл налево</target>
@@ -1366,20 +1321,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>ПеремеÑтить файл направо</target>
-<source>Overwrite left file/folder with right one</source>
-<target>ПерезапиÑать файл/папку Ñлева на аналогичную из правой чаÑти</target>
+<source>Overwrite left item</source>
+<target>ПерезапиÑать Ñлемент Ñлева</target>
-<source>Overwrite right file/folder with left one</source>
-<target>ПерезапиÑать файл/папку Ñправа на аналогичную из левой чаÑти</target>
+<source>Overwrite right item</source>
+<target>ПерезапиÑать Ñлемент Ñправа</target>
<source>Do nothing</source>
<target>Ðичего не делать</target>
-<source>Copy file attributes only to left</source>
-<target>Скопировать только атрибуты файла налево</target>
+<source>Update attributes on left</source>
+<target>Обновление атрибутов Ñлева</target>
-<source>Copy file attributes only to right</source>
-<target>Скопировать только атрибуты файла направо</target>
+<source>Update attributes on right</source>
+<target>Обновление атрибутов Ñправа</target>
<source>Multiple...</source>
<target>Различные варианты Ñинхронизации</target>
@@ -1432,11 +1387,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Обновление атрибутов %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Путь целевой папки не должен быть пуÑтым!</target>
+<source>Target folder name must not be empty.</source>
+<target>Путь целевой папки не должен быть пуÑтым.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Папка Ð´Ð»Ñ Ñтарых верÑий файлов не была указана!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Путь папки Ð´Ð»Ñ Ñтарых верÑий файлов не должен быть пуÑтым.</target>
<source>Source directory %x not found.</source>
<target>ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° %x не найдена.</target>
@@ -1465,8 +1420,8 @@ Exclude: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>Ð”Ð»Ñ Ñтого пути "Корзина" не доÑтупна! Файлы будут удалены безвозвратно:</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</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>
diff --git a/BUILD/Languages/slovenian.lng b/BUILD/Languages/slovenian.lng
index 975074be..49461187 100644
--- a/BUILD/Languages/slovenian.lng
+++ b/BUILD/Languages/slovenian.lng
@@ -7,8 +7,8 @@
<plural definition>n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>IÅ¡Äem imenik %x...</target>
+<source>Searching for folder %x...</source>
+<target>Iskanje mape %x...</target>
<source>Show in Explorer</source>
<target>Prikaži v Raziskovalcu</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Avtomatizirana sinhronizacija</target>
+<source>Error</source>
+<target>Napaka</target>
+
<source>Select alternate comparison settings</source>
<target>Izberite alternativne nastavitve primerjanja</target>
<source>Select alternate synchronization settings</source>
<target>Izberite nadomestne nastavitve sinhronizacije</target>
-<source>No filter selected</source>
-<target>Noben filter ni izbran</target>
-
<source>Filter is active</source>
<target>Filter je aktiven</target>
+<source>No filter selected</source>
+<target>Noben filter ni izbran</target>
+
<source>Remove alternate settings</source>
<target>Odstrani nadomestne nastavitve</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>O programu(1)</target>
-<source>Error</source>
-<target>Napaka</target>
-
<source>Warning</source>
<target>Pozor</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Globalne nastavitve</target>
-<source>Synchronization Preview</source>
-<target>Predogled sinhronizacije</target>
+<source>Summary</source>
+<target>Povzetek</target>
<source>Find</source>
<target>Najdi</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Brskaj</target>
-<source>Invalid command line: %x</source>
-<target>NapaÄna ukazna vrstica: %x</target>
+<source>Invalid command line:</source>
+<target>NapaÄna ukazna vrstica:</target>
<source>Info</source>
<target>Info</target>
@@ -232,29 +232,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>Ime volumna %x ni del imena datoteke %y!</target>
-<source>Cannot find file %x.</source>
-<target>Ne morem najti datoteke %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Ne morem brati naslednje XML elemente:</target>
-<source>S&ave configuration...</source>
-<target>Shr&ani konfiguracijo...</target>
+<source>Cannot find file %x.</source>
+<target>Ne morem najti datoteke %x.</target>
-<source>&Load configuration...</source>
-<target>Na&loži konfiguracijo...</target>
+<source>&Open...</source>
+<target>&Odpri...</target>
+
+<source>&Save...</source>
+<target>&Shrani...</target>
<source>&Quit</source>
<target>&Zapri</target>
-<source>&File</source>
-<target>&Datoteka</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>&Vsebina</target>
-<source>&About...</source>
-<target>&O programu...</target>
+<source>&About</source>
+<target>&O programu</target>
<source>&Help</source>
<target>&PomoÄ</target>
@@ -262,8 +262,8 @@
<source>Usage:</source>
<target>Uporaba:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Izberite imenike za nadziranje</target>
+<source>1. Select folders to watch.</source>
+<target>1. Izberite mape za opazovanje</target>
<source>2. Enter a command line.</source>
<target>2. Vnesite ukazno-vrstico.</target>
@@ -271,19 +271,11 @@
<source>3. Press 'Start'.</source>
<target>3. Pritisnite 'ZaÄni'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
-- vsi imeniki postanejo dostopni (npr. ob vstavitvi USB kljuÄa)
-- so datoteke znotraj teh imenikov in podimenikov spremenjene
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Da zaÄnete uvozite datoteko .ffs_batch</target>
-<source>Directories to watch</source>
-<target>Imenika za nadzorovanje</target>
+<source>Folders to watch</source>
+<target>Mape za opazovanje</target>
<source>Add folder</source>
<target>Dodaj mapo</target>
@@ -294,18 +286,35 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Select a folder</source>
<target>Izberite mapo</target>
+<source>Delay [seconds]</source>
+<target>Zakasnitev [sekunde]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Čas nedejavnosti med zadnjo zaznano spremembo in izvršitvijo ukaza</target>
+
<source>Command line</source>
<target>Ukazna vrstica</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minimalen Äas nedejavnosti [sekunde]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Čas nedejavnosti med zaznavanjem zadnje spremembe in izvršitvijo ukazne vrstice v sekundah</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Ukaz se sproži Äe:
+- se spremenijo datoteke ali podmape
+- pridejo nove mape (npr. ob vstavitvi USB kljuÄka)
+</target>
<source>Start</source>
<target>ZaÄni</target>
+<source>&Retry</source>
+<target>&Ponovi</target>
+
+<source>Cancel</source>
+<target>PrekliÄi</target>
+
<source>(Build: %x)</source>
<target>(Izgradnja: %x)</target>
@@ -324,8 +333,8 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Waiting for missing directories...</source>
<target>ÄŒakam na manjkajoÄe imenike...</target>
-<source>A directory input field is empty.</source>
-<target>Vpisno polje za imenik je prazno.</target>
+<source>An input folder name is empty.</source>
+<target>Vhodno ime mape je prazno.</target>
<source>Logging</source>
<target>Beleženje</target>
@@ -411,8 +420,8 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source><Symlink></source>
<target><SimboliÄna povezava></target>
-<source><Directory></source>
-<target><Imenik></target>
+<source><Folder></source>
+<target><Mapa></target>
<source>Full path</source>
<target>Polna pot</target>
@@ -423,8 +432,8 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Relative path</source>
<target>Relativna pot</target>
-<source>Directory</source>
-<target>Imenik</target>
+<source>Base folder</source>
+<target>Osnovna mapa</target>
<source>Size</source>
<target>Velikost</target>
@@ -435,8 +444,11 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Extension</source>
<target>Razširitev</target>
-<source>Comparison Result</source>
-<target>Rezultati primerjave</target>
+<source>Action</source>
+<target>Ukrep</target>
+
+<source>Category</source>
+<target>Kategorija</target>
<source>Drag && drop</source>
<target>Povleci && spusti</target>
@@ -444,14 +456,14 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Close progress dialog</source>
<target>Zapri pogovorno okno z napredkom</target>
-<source>Shut down</source>
-<target>Ugasni</target>
+<source>Standby</source>
+<target>V pripravljenost</target>
<source>Log off</source>
<target>Odjavi</target>
-<source>Standby</source>
-<target>V pripravljenost</target>
+<source>Shut down</source>
+<target>Ugasni</target>
<source>Hibernate</source>
<target>Hibernacija</target>
@@ -459,15 +471,12 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>1. &Compare</source>
<target>1. &Primerjaj</target>
-<source>2. &Synchronize...</source>
-<target>2. &Sinhroniziraj...</target>
+<source>2. &Synchronize</source>
+<target>2. &Sinhroniziraj</target>
<source>&New</source>
<target>&Novo</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>&Jezik</target>
@@ -495,8 +504,8 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>&Abort</source>
<target>&Prekini</target>
-<source>Synchronize...</source>
-<target>Sinhroniziraj...</target>
+<source>Synchronize</source>
+<target>Sinhroniziraj</target>
<source>Start synchronization</source>
<target>ZaÄni sinhronizacijo</target>
@@ -510,12 +519,12 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Swap sides</source>
<target>Zamenjaj strani</target>
-<source>Save current configuration to file</source>
-<target>Shrani trenutno konfiguracijo v datoteko</target>
-
<source>Load configuration from file</source>
<target>Naloži konfiguracijo iz datoteke</target>
+<source>Save current configuration to file</source>
+<target>Shrani trenutno konfiguracijo v datoteko</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Zadnje uporabljene konfiguracije (pritisite DEL za odstranitev s seznama)</target>
@@ -525,17 +534,17 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Hide filtered or temporarily excluded files</source>
<target>Skrij filtrirane ali zaÄasno izkljuÄene datoteke</target>
-<source>Number of files and directories that will be created</source>
-<target>Å tevilo datotek in imenikov, ki bodo ustvarjeni</target>
+<source>Number of files and folders that will be created</source>
+<target>Å tevilo datotek in map, ki bodo ustvarjene</target>
<source>Number of files that will be overwritten</source>
<target>Å tevilo datotek, ki bodo prepisane</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Å tevilo datotek in imenikov, ki bodo izbrisani</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Å tevilo datotek in map, ki bodo izbrisane</target>
<source>Total amount of data that will be transferred</source>
-<target>KoliÄina podatkov, ki bo preneÅ¡ena</target>
+<target>KoliÄina podatkov, ki bo prenesena</target>
<source>Operation:</source>
<target>Operacija:</target>
@@ -555,8 +564,8 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Batch job</source>
<target>Paketno opravilo</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Ustvari paketno datoteko in avtomatiziraj sinhronizacijo. Da zaÄnete v paketnem naÄinu preprosto dvokliknite to datoteko ali poženite ukaz: FreeFileSync.exe SyncJob.ffs_batch. To se lahko nastavi v vaÅ¡ sistemski naÄrtovalec opravil.</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>Ustvari paketno datoteko za avtomatiziranje sinhronizacije. Dvokliknite to datoteko ali jo nastavite v razpored opravil vašega sistema: FreeFileSync.exe <ime opravila>.ffs_batch</target>
<source>Help</source>
<target>PomoÄ</target>
@@ -582,21 +591,12 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Maximum number of log files:</source>
<target>Maksimalno število datotek beleženja:</target>
-<source>Select log file directory:</source>
-<target>Izberite imenik za datoteko beleženja:</target>
+<source>Select folder to save log files:</source>
+<target>Izberite mapo za shranjevanje datotek beleženja:</target>
<source>Batch settings</source>
<target>Paketne nastavitve</target>
-<source>&Save</source>
-<target>&Shrani</target>
-
-<source>&Load</source>
-<target>&Naloži</target>
-
-<source>Cancel</source>
-<target>PrekliÄi</target>
-
<source>Select variant:</source>
<target>Izberite varianto:</target>
@@ -621,29 +621,23 @@ Ukazna vrstica se izvrÅ¡i vsakiÄ ko:
<source>Configuration</source>
<target>Konfiguracija</target>
-<source>Category</source>
-<target>Kategorija</target>
-
-<source>Action</source>
-<target>Ukrep</target>
-
-<source>File/folder exists on left side only</source>
-<target>Datoteka/mapa obstaja samo na levi strani</target>
+<source>Item exists on left side only</source>
+<target>Element obstaja samo na levi strani</target>
-<source>File/folder exists on right side only</source>
-<target>Datoteka/mapa obstaja samo na desni strani</target>
+<source>Item exists on right side only</source>
+<target>Element obstaja samo na desni strani</target>
-<source>Left file is newer</source>
-<target>Leva datoteka je novejša</target>
+<source>Left side is newer</source>
+<target>Leva stran je novejša</target>
-<source>Right file is newer</source>
-<target>Desna datoteka je novejša</target>
+<source>Right side is newer</source>
+<target>Desna stran je novejša</target>
-<source>Files have different content</source>
-<target>Datoteki imata razliÄno vsebino</target>
+<source>Items have different content</source>
+<target>Elementi imajo razliÄno vsebino</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Spor/datoteka ne more biti kategorizirana</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Spor/element ne more biti kategoriziran</target>
<source>OK</source>
<target>V redu</target>
@@ -720,9 +714,6 @@ enaka
<source>&Ignore</source>
<target>&Ignoriraj</target>
-<source>&Retry</source>
-<target>&Ponovi</target>
-
<source>Do not show this dialog again</source>
<target>Ne prikaži veÄ tega pogovornega okna</target>
@@ -753,33 +744,6 @@ Samo datoteke, ki ustrezajo vsem nastavitvam filtra bodo sinhronizirane.
Opomba: Imena datoteka morajo biti relativna osnovnim imenikom!
</target>
-<source>Hints:</source>
-<target>Namigi:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Vnesite relativna imena datotek ali imenikov loÄenih s ';' ali novo vrstico.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Uporabite lahko tudi znake '*' in '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. IzkljuÄite datoteke neposredno na glavni mreži s kontekstnim menujem.</target>
-
-<source>Example</source>
-<target>Primer</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-VkljuÄi: *.doc;*.zip;*.exe
-IzkljuÄi: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Sinhroniziraj vse .doc, .zip in .exe datoteke, razen iz podmape "temp".</target>
-
<source>Include</source>
<target>VkljuÄi</target>
@@ -801,8 +765,8 @@ IzkljuÄi: \stuff\temp\*
<source>&Default</source>
<target>&Privzeto</target>
-<source>Transactional file copy</source>
-<target>Transakcijsko kopiranje datotek</target>
+<source>Fail-safe file copy</source>
+<target>Kopiranje datotek varno pred odpovedjo</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>Najprej zapisuj v zaÄasno datoteko (*.ffs_tmp) in nato preimenuj. To zagotavlja dosledno stanje celo v primeru usodne napake.</target>
@@ -816,8 +780,8 @@ IzkljuÄi: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Kopiraj dovoljenja dostopov datoteke</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Prenesi dovoljenja datotek in imenikov (Zahteva pravice skrbnika)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Prenesi dovoljenja datotek in map (Zahteva pravice Skrbnika)</target>
<source>Restore hidden dialogs</source>
<target>Obnovi skrite pogovore</target>
@@ -1133,11 +1097,11 @@ IzkljuÄi: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integriraj zunanje aplikacije v kontekstni menu. Na voljo so naslednji makri:</target>
-<source>- full file or directory name</source>
-<target>- polno ime datoteke ali imenika</target>
+<source>- full file or folder name</source>
+<target>- polno ime datoteke ali mape</target>
-<source>- directory part only</source>
-<target>- del, ki zajema samo imenike</target>
+<source>- folder part only</source>
+<target>- samo del glede mape</target>
<source>- Other side's counterpart to %name</source>
<target>- Duplikat z druge strani od %name</target>
@@ -1185,8 +1149,8 @@ IzkljuÄi: \stuff\temp\*
<source>Versioning</source>
<target>Ustvarjanje razliÄiÄ</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Premakni datoteke v Äasovno-oznaÄen podimenik</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>
@@ -1287,8 +1251,8 @@ IzkljuÄi: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Ne morem prebrati imenika %x.</target>
-<source>Endless loop.</source>
-<target>NeskonÄno zazankano</target>
+<source>Detected endless directory recursion.</source>
+<target>Zaznana neskonÄna imeniÅ¡ka rekurzija</target>
<source>Cannot set privilege %x.</source>
<target>Ne morem nastaviti privilegija %x.</target>
@@ -1314,14 +1278,11 @@ IzkljuÄi: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Datoteka ne vsebuje veljavne konfiguracije:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>To napako z obravnavanjem imenika kot praznega lahko ignorirate.</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>
-<source>Cannot find directory %x.</source>
-<target>Ne morem najti imenika %x.</target>
+<source>Cannot find folder %x.</source>
+<target>Ne morem najti mape %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Imeniki so v odvisnosti! Bodite pozorni, ko nastavljate sinhronizacijska pravila:</target>
@@ -1353,20 +1314,20 @@ IzkljuÄi: \stuff\temp\*
<source>Both sides are equal</source>
<target>Obe strani sta enaki</target>
-<source>Files/folders differ in attributes only</source>
-<target>Datoteke/mape se razlikujejo samo v atributih</target>
+<source>Items have different attributes</source>
+<target>Elementi imajo razliÄne atribute</target>
-<source>Copy new file/folder to left</source>
-<target>Kopiraj novo datoteko/mapo na levo</target>
+<source>Copy new item to left</source>
+<target>Kopiraj nov element na levo</target>
-<source>Copy new file/folder to right</source>
-<target>Kopiraj novo datoteko/mapo na desno</target>
+<source>Copy new item to right</source>
+<target>Kopiraj nov element na desno</target>
-<source>Delete left file/folder</source>
-<target>Izbriši levo datoteko/mapo</target>
+<source>Delete left item</source>
+<target>Izbriši levi element</target>
-<source>Delete right file/folder</source>
-<target>Izbriši desno datoteko/mapo</target>
+<source>Delete right item</source>
+<target>Izbriše desni element</target>
<source>Move file on left</source>
<target>Premakni datoteko na levo</target>
@@ -1374,20 +1335,20 @@ IzkljuÄi: \stuff\temp\*
<source>Move file on right</source>
<target>Premakni datoteko na desno</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Prepiši levo datoteko/mapo s tisto na desni</target>
+<source>Overwrite left item</source>
+<target>Prepiši levi element</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Prepiši desno datoteko/mapo s tisto na levi</target>
+<source>Overwrite right item</source>
+<target>Prepiši desni element</target>
<source>Do nothing</source>
<target>Ne naredi niÄesar</target>
-<source>Copy file attributes only to left</source>
-<target>Kopiraj atribute datoteke samo na levo</target>
+<source>Update attributes on left</source>
+<target>Posodobi atribute na levi</target>
-<source>Copy file attributes only to right</source>
-<target>Kopiraj atribute datoteke samo na desno</target>
+<source>Update attributes on right</source>
+<target>Posodobi atribute na desni</target>
<source>Multiple...</source>
<target>VeÄkratno...</target>
@@ -1440,11 +1401,11 @@ IzkljuÄi: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Posodabljam atribute od %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Ime ciljnega imenika ne sme biti prazno!</target>
+<source>Target folder name must not be empty.</source>
+<target>Ime ciljne mape ne sme biti prazno.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Imenik za upravljanje z datoteÄnimi raliÄicami ni bil podan!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Ime mape za ustvarjanje razliÄic ne sme biti prazno.</target>
<source>Source directory %x not found.</source>
<target>Izvorni imenik %x ni bil najden.</target>
@@ -1473,8 +1434,8 @@ IzkljuÄi: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Imenik bo spremenjen, kar je del veÄkratnih parov map! Prosimo preglejte nastavitve sinhronizacije!</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>
diff --git a/BUILD/Languages/spanish.lng b/BUILD/Languages/spanish.lng
index f7ceb578..39f6db69 100644
--- a/BUILD/Languages/spanish.lng
+++ b/BUILD/Languages/spanish.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Buscando directorio %x...</target>
+<source>Searching for folder %x...</source>
+<target>Buscando carpeta %x...</target>
<source>Show in Explorer</source>
<target>Mostrar en Explorer</target>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>Seleccione opciones alternativas de sincronización</target>
-<source>No filter selected</source>
-<target>Ningún filtro seleccionado</target>
-
<source>Filter is active</source>
<target>Filtro activo</target>
+<source>No filter selected</source>
+<target>Ningún filtro seleccionado</target>
+
<source>Remove alternate settings</source>
<target>Eliminar opciones alternativas</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Opciones globales</target>
-<source>Synchronization Preview</source>
-<target>Previsualización de la sincronización</target>
+<source>Summary</source>
+<target>Resumen</target>
<source>Find</source>
<target>Buscar</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Examinar</target>
-<source>Invalid command line: %x</source>
-<target>Línea de comandos errónea: %x</target>
+<source>Invalid command line:</source>
+<target>Línea de comandos errónea:</target>
<source>Info</source>
<target>Info</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>El nombre del volumen %x no es una parte del nombre de archivo %y</target>
-<source>Cannot find file %x.</source>
-<target>No se puede encontrar el archivo %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Incapaz de leer los siguientes elementos XML:</target>
-<source>S&ave configuration...</source>
-<target>G&uardar configuración...</target>
+<source>Cannot find file %x.</source>
+<target>No se puede encontrar el archivo %x.</target>
-<source>&Load configuration...</source>
-<target>&Cargar configuración...</target>
+<source>&Open...</source>
+<target>&Abrir...</target>
+
+<source>&Save...</source>
+<target>&Guardar...</target>
<source>&Quit</source>
<target>&Salir</target>
-<source>&File</source>
-<target>&Archivo</target>
+<source>&Program</source>
+<target>&Programa</target>
<source>&Content</source>
<target>&Contenido</target>
-<source>&About...</source>
-<target>&Acerca de...</target>
+<source>&About</source>
+<target>&Acerca de</target>
<source>&Help</source>
<target>&Ayuda</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Uso:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Seleccione los directorios a visualizar.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Seleccionar carpetar para ver.</target>
<source>2. Enter a command line.</source>
<target>2. Introduzca una línea de comandos.</target>
@@ -265,19 +265,11 @@
<source>3. Press 'Start'.</source>
<target>3. Presione 'Inicio'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-La línea de comandos se ejecuta cada vez:
-- todos los directorios estan disponibles (ej. inserción de un lápiz USB)
-- archivos dentro de directorios o subdirectorios son modificados
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Para empezar, importe un archivo .ffs_batch</target>
-<source>Directories to watch</source>
-<target>Directorios a visualizar</target>
+<source>Folders to watch</source>
+<target>Carpetas para ver</target>
<source>Add folder</source>
<target>Añadir carpeta</target>
@@ -288,14 +280,25 @@ La línea de comandos se ejecuta cada vez:
<source>Select a folder</source>
<target>Seleccione una carpeta</target>
+<source>Delay [seconds]</source>
+<target>Retraso [segundos]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Tiempo ocioso entre el último cambio detectado y la ejecución del comando</target>
+
<source>Command line</source>
<target>Línea de comandos</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Tiempo mínimo de espera [segundos]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Tiempo de inactividad entre la detección del último cambio y la ejecución de la línea de comandos en segundos</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+El comando es disparado si::
+- hay cambios en los archivos o subcarpetas
+- aparecen nuevas carpetas (Insertando una memoria USB, por ejemplo)
+</target>
<source>Start</source>
<target>Iniciar</target>
@@ -324,8 +327,8 @@ La línea de comandos se ejecuta cada vez:
<source>Waiting for missing directories...</source>
<target>Esperando directorios faltantes...</target>
-<source>A directory input field is empty.</source>
-<target>Un campo de directorio está vacío.</target>
+<source>An input folder name is empty.</source>
+<target>Un nombre de carpeta de entrada está vacío.</target>
<source>Logging</source>
<target>Registro</target>
@@ -411,8 +414,8 @@ La línea de comandos se ejecuta cada vez:
<source><Symlink></source>
<target><Enlace simbólico></target>
-<source><Directory></source>
-<target><Directorio></target>
+<source><Folder></source>
+<target><Carpeta></target>
<source>Full path</source>
<target>Ruta completa</target>
@@ -423,8 +426,8 @@ La línea de comandos se ejecuta cada vez:
<source>Relative path</source>
<target>Ruta relativa</target>
-<source>Directory</source>
-<target>Directorio</target>
+<source>Base folder</source>
+<target>Carpeta base</target>
<source>Size</source>
<target>Tamaño</target>
@@ -435,8 +438,11 @@ La línea de comandos se ejecuta cada vez:
<source>Extension</source>
<target>Extensión</target>
-<source>Comparison Result</source>
-<target>Resultado de la comparación</target>
+<source>Action</source>
+<target>Acción</target>
+
+<source>Category</source>
+<target>Categoría</target>
<source>Drag && drop</source>
<target>Arrastrar y soltar</target>
@@ -444,14 +450,14 @@ La línea de comandos se ejecuta cada vez:
<source>Close progress dialog</source>
<target>Cerrar diálogo de progreso</target>
-<source>Shut down</source>
-<target>Apagar</target>
+<source>Standby</source>
+<target>Suspender</target>
<source>Log off</source>
<target>Finalizar sesión</target>
-<source>Standby</source>
-<target>Suspender</target>
+<source>Shut down</source>
+<target>Apagar</target>
<source>Hibernate</source>
<target>Hibernar</target>
@@ -459,15 +465,12 @@ La línea de comandos se ejecuta cada vez:
<source>1. &Compare</source>
<target>1. &Comparar</target>
-<source>2. &Synchronize...</source>
-<target>2. &Sincronizar...</target>
+<source>2. &Synchronize</source>
+<target>2. &Sincronizar</target>
<source>&New</source>
<target>&Nuevo</target>
-<source>&Program</source>
-<target>&Programa</target>
-
<source>&Language</source>
<target>&Idioma</target>
@@ -495,8 +498,8 @@ La línea de comandos se ejecuta cada vez:
<source>&Abort</source>
<target>&Abortar</target>
-<source>Synchronize...</source>
-<target>Sincronizar...</target>
+<source>Synchronize</source>
+<target>Sincronizar</target>
<source>Start synchronization</source>
<target>Iniciar sincronización</target>
@@ -510,12 +513,12 @@ La línea de comandos se ejecuta cada vez:
<source>Swap sides</source>
<target>Intercambiar lados</target>
-<source>Save current configuration to file</source>
-<target>Guardar configuración actual en un archivo</target>
-
<source>Load configuration from file</source>
<target>Cargar configuración desde archivo</target>
+<source>Save current configuration to file</source>
+<target>Guardar configuración actual en un archivo</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Últimas configuraciones usadas (Pulsar DEL para quitar de la lista)</target>
@@ -525,14 +528,14 @@ La línea de comandos se ejecuta cada vez:
<source>Hide filtered or temporarily excluded files</source>
<target>Ocultar archivos filtrados o temporalmente excluidos</target>
-<source>Number of files and directories that will be created</source>
-<target>Número de archivos y directorios que serán creados</target>
+<source>Number of files and folders that will be created</source>
+<target>Número de archivos y carpetas que serán creados</target>
<source>Number of files that will be overwritten</source>
<target>Número de archivos que serán sobreescritos</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Número de archivos y directorios que serán eliminados</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Número de archivos y carpetas que serán eliminados</target>
<source>Total amount of data that will be transferred</source>
<target>Cantidad total de datos que serán transferidos</target>
@@ -555,8 +558,8 @@ La línea de comandos se ejecuta cada vez:
<source>Batch job</source>
<target>Tarea por lotes</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Crear un archivo por lotes y automatizar la sincronización. Para empezar en modo por lotes, hacer doble clic en el archivo o ejecutar el comando: FreeFileSync.exe SyncJob.ffs_batch. Esto también puede ser programado en el planificador de tareas del sistema.</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>Crear archivo batch para sincronización automática. Haga doble clic en este archivo o prográmelo en el planificador de tareas del sistema: FreeFileSync.exe <job name>.ffs_batch</target>
<source>Help</source>
<target>Ayuda</target>
@@ -582,18 +585,12 @@ La línea de comandos se ejecuta cada vez:
<source>Maximum number of log files:</source>
<target>Número máximo de archivos de registro:</target>
-<source>Select log file directory:</source>
-<target>Seleccione directorio para el archivo de registro:</target>
+<source>Select folder to save log files:</source>
+<target>Seleccionar carpeta para guardar archivos de registro:</target>
<source>Batch settings</source>
<target>Opciones de lotes</target>
-<source>&Save</source>
-<target>&Guardar</target>
-
-<source>&Load</source>
-<target>&Cargar</target>
-
<source>Select variant:</source>
<target>Seleccione un tipo:</target>
@@ -618,29 +615,23 @@ La línea de comandos se ejecuta cada vez:
<source>Configuration</source>
<target>Configuración</target>
-<source>Category</source>
-<target>Categoría</target>
+<source>Item exists on left side only</source>
+<target>El elemento existe sólo en el lado izquierdo</target>
-<source>Action</source>
-<target>Acción</target>
-
-<source>File/folder exists on left side only</source>
-<target>Archivo/carpeta existe sólo en el lado izquierdo</target>
-
-<source>File/folder exists on right side only</source>
-<target>Archivo/carpeta existe sólo en el lado derecho</target>
+<source>Item exists on right side only</source>
+<target>El elemento existe sólo en el lado derecho</target>
-<source>Left file is newer</source>
-<target>El archivo de la izquierda es más reciente</target>
+<source>Left side is newer</source>
+<target>El lado izquierdo es más nuevo</target>
-<source>Right file is newer</source>
-<target>El archivo de la derecha es más reciente</target>
+<source>Right side is newer</source>
+<target>El lado derecho es más nuevo</target>
-<source>Files have different content</source>
-<target>Los archivos tienen contenido diferentes</target>
+<source>Items have different content</source>
+<target>Los elementos tienen contenido distinto</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Conflicto/el achivo no puede ser categorizado</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Conflicto</target>
<source>OK</source>
<target>OK</target>
@@ -747,33 +738,6 @@ Sólo archivos en que coincidan todos los filtros serán sincronizados.
Aviso: ¡Los nombres de archivos deben ser relativos a los directorios base!
</target>
-<source>Hints:</source>
-<target>Consejos:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Introduzca los nombres de los archivos o directorios relativos separados por ';' o una nueva línea.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Usar caracteres comodín '*' y '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Excluir directamente archivos sobre las celdas a través del menú de contexto.</target>
-
-<source>Example</source>
-<target>Ejemplo</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Incluir: *.doc;*.zip;*.exe
-Excluir: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Sincronizar todos los archivos .doc, .zip y .exe excepto el contenido de la subcarpeta "temp".</target>
-
<source>Include</source>
<target>Incluir</target>
@@ -795,8 +759,8 @@ Excluir: \stuff\temp\*
<source>&Default</source>
<target>&Configuración por defecto</target>
-<source>Transactional file copy</source>
-<target>Copia de archivos transaccionales</target>
+<source>Fail-safe file copy</source>
+<target>Copia de archivo a prueba de fallos</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>Escribir en archivo temporal (*.ffs_tmp) primero y después renombrarlo. Esto garantiza un estado consistente incluso en caso de error fatal.</target>
@@ -810,8 +774,8 @@ Excluir: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Copiar permisos de acceso al archivo</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Transferir permisos de archivo y directorio (Requiere derechos de administrador)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Transferir permisos de archivo y carpeta (Requiere derechos de Administrador)</target>
<source>Restore hidden dialogs</source>
<target>Restaurar diálogos ocultos</target>
@@ -1119,11 +1083,11 @@ Excluir: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrar aplicaciones externas en el menú de contexto. Los siguientes macros están disponibles:</target>
-<source>- full file or directory name</source>
-<target>- nombre completo del archivo o directorio</target>
+<source>- full file or folder name</source>
+<target>- nombre completo de archivo o carpeta</target>
-<source>- directory part only</source>
-<target>- sólo parte del directorio</target>
+<source>- folder part only</source>
+<target>- sólo parte de la carpeta</target>
<source>- Other side's counterpart to %name</source>
<target>- El otro lado equivale a %name</target>
@@ -1167,8 +1131,8 @@ Excluir: \stuff\temp\*
<source>Versioning</source>
<target>Control de versiones</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Mover archivos a un subdirectorio con marca de tiempo</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>
@@ -1263,11 +1227,11 @@ Excluir: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>No se puede leer el directorio %x.</target>
-<source>Endless loop.</source>
-<target>Bucle infinito.</target>
+<source>Detected endless directory recursion.</source>
+<target>Detectada recursividad de directorios sin fin.</target>
<source>Cannot set privilege %x.</source>
-<target>No se puede</target>
+<target>No se puede asignar el privilegio %x.</target>
<source>Unable to move %x to the Recycle Bin!</source>
<target>¡Incapaz de mover %x a la Papelera de reciclaje!</target>
@@ -1290,14 +1254,11 @@ Excluir: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>El archivo no contiene una configuración válida:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Puede ignorar este error al considerar el directorio como vacío.</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>
-<source>Cannot find directory %x.</source>
-<target>No se puede encontrar el directorio %x.</target>
+<source>Cannot find folder %x.</source>
+<target>No se puede encontrar la carpeta %x.</target>
<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>
@@ -1329,20 +1290,20 @@ Excluir: \stuff\temp\*
<source>Both sides are equal</source>
<target>Ambos lados son iguales</target>
-<source>Files/folders differ in attributes only</source>
-<target>Archivos/carpetas se diferencia sólo en los atributos</target>
+<source>Items have different attributes</source>
+<target>Los elementos tienen distintos atributos</target>
-<source>Copy new file/folder to left</source>
-<target>Copiar nuevo archivo/carpeta a la izquierda</target>
+<source>Copy new item to left</source>
+<target>Copiar nuevo elemento a la izquierda</target>
-<source>Copy new file/folder to right</source>
-<target>Copiar nuevo archivo/carpeta a la derecha</target>
+<source>Copy new item to right</source>
+<target>Copiar nuevo elemento a la derecha</target>
-<source>Delete left file/folder</source>
-<target>Eliminar archivo/carpeta de la izquierda</target>
+<source>Delete left item</source>
+<target>Eliminar elemento izquierdo</target>
-<source>Delete right file/folder</source>
-<target>Eliminar archivo/carpeta de la derecha</target>
+<source>Delete right item</source>
+<target>Eliminar elemento derecho</target>
<source>Move file on left</source>
<target>Mover archivo a la izquierda</target>
@@ -1350,20 +1311,20 @@ Excluir: \stuff\temp\*
<source>Move file on right</source>
<target>Mover archivo a la derecha</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Sobreescribir archivo/carpeta de la izquierda por el de la derecha</target>
+<source>Overwrite left item</source>
+<target>Sobreescribir elemento izquierdo</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Sobreescribir archivo/carpeta de la derecha por el de la izquierda</target>
+<source>Overwrite right item</source>
+<target>Sobreescribir elemento derecho</target>
<source>Do nothing</source>
<target>No hacer nada</target>
-<source>Copy file attributes only to left</source>
-<target>Copiar sólo atributos del archivo a la izquierda</target>
+<source>Update attributes on left</source>
+<target>Actualizar atributos en la izquierda</target>
-<source>Copy file attributes only to right</source>
-<target>Copiar sólo atributos del archivo a la derecha</target>
+<source>Update attributes on right</source>
+<target>Actualizar atributos en la derecha</target>
<source>Multiple...</source>
<target>Múltiple...</target>
@@ -1416,11 +1377,11 @@ Excluir: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Actualizar atributos de %x</target>
-<source>Target directory name must not be empty!</source>
-<target>¡El nombre del directorio de destino no debe estar vacío!</target>
+<source>Target folder name must not be empty.</source>
+<target>El nombre de la carpeta de destino no debe estar vacío.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>¡El directorio para el versionamiento de archivo no ha sido especificado!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>El nombre de la carpeta de versiones de archivos no debe estar vacío.</target>
<source>Source directory %x not found.</source>
<target>Directorio fuente %x no encontrado.</target>
@@ -1449,8 +1410,8 @@ Excluir: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Un directorio será modificado, el cual es parte de mútiples pares de carpetas. ¡Por favor, revise la configuración de la sincronización!</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>
diff --git a/BUILD/Languages/swedish.lng b/BUILD/Languages/swedish.lng
index 06a0b627..85364f34 100644
--- a/BUILD/Languages/swedish.lng
+++ b/BUILD/Languages/swedish.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>Söker efter katalogen</target>
+<source>Searching for folder %x...</source>
+<target>Söker efter mappen %x...</target>
<source>Show in Explorer</source>
<target>Visa i Utforskaren</target>
@@ -17,7 +17,7 @@
<target>Öppna med standardprogram</target>
<source>Browse directory</source>
-<target>Sök upp katalog</target>
+<target>Sök upp mapp</target>
<source>Abort requested: Waiting for current operation to finish...</source>
<target>Avbryter: Väntar på att aktuell process skall slutföras...</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - Automatiserad synkronisering</target>
+<source>Error</source>
+<target>Fel</target>
+
<source>Select alternate comparison settings</source>
<target>Välj alternativa jämförelseinställningar</target>
<source>Select alternate synchronization settings</source>
<target>Välj alternativa synkroniseringsinställningar</target>
-<source>No filter selected</source>
-<target>Inga filter aktiverade</target>
-
<source>Filter is active</source>
<target>Filter är aktiverat</target>
+<source>No filter selected</source>
+<target>Inga filter aktiverade</target>
+
<source>Remove alternate settings</source>
<target>Ta bort alternativa inställningar</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>Om</target>
-<source>Error</source>
-<target>Fel</target>
-
<source>Warning</source>
<target>Varning</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Allmäna inställningar</target>
-<source>Synchronization Preview</source>
-<target>Förhandsvisning</target>
+<source>Summary</source>
+<target>Sammanställning</target>
<source>Find</source>
<target>Sök</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Bläddra</target>
-<source>Invalid command line: %x</source>
-<target>Ogiltig kommandorad: %x</target>
+<source>Invalid command line:</source>
+<target>Ogiltig kommandorad:</target>
<source>Info</source>
<target>Info</target>
@@ -170,10 +170,10 @@
<target>Processinformation kan inte inhämtas</target>
<source>Waiting while directory is locked (%x)...</source>
-<target>Väntar medan katalogen låses (%x)...</target>
+<target>Väntar medan mappen låses (%x)...</target>
<source>Cannot set directory lock %x.</source>
-<target>Kan inte låsa katalogen %x.</target>
+<target>Kan inte låsa mappen %x.</target>
<source>
<pluralform>1 sec</pluralform>
@@ -232,23 +232,23 @@
<source>Cannot read the following XML elements:</source>
<target>Kan inte läsa följande XML-element:</target>
-<source>S&ave configuration...</source>
-<target>S&para inställningar...</target>
+<source>&Open...</source>
+<target>&Öppna...</target>
-<source>&Load configuration...</source>
-<target>&Hämta inställningar från fil...</target>
+<source>&Save...</source>
+<target>&Spara...</target>
<source>&Quit</source>
<target>&Avsluta</target>
-<source>&File</source>
-<target>&Arkiv</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>&Innehåll</target>
-<source>&About...</source>
-<target>&Om...</target>
+<source>&About</source>
+<target>&Om</target>
<source>&Help</source>
<target>&Hjälp</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Användning:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Välj kataloger att övervaka.</target>
+<source>1. Select folders to watch.</source>
+<target>1. Välj mapp att bevaka.</target>
<source>2. Enter a command line.</source>
<target>2. Mata in ett kommando.</target>
@@ -265,41 +265,50 @@
<source>3. Press 'Start'.</source>
<target>3. Tryck 'Start'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Kommandot verkställes när:
-- alla berörda kataloger blir tillgängliga (t.ex om USB-minne ansluts)
-- filer i berörda kataloger eller underkataloger ändras
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Importera en .ffs_batch-fil för att komma igång</target>
-<source>Directories to watch</source>
-<target>Kataloger att övervaka</target>
+<source>Folders to watch</source>
+<target>Mappar att bevaka</target>
<source>Add folder</source>
-<target>Lägg till katalog</target>
+<target>Lägg till mapp</target>
<source>Remove folder</source>
-<target>Ta bort katalog</target>
+<target>Ta bort mapp</target>
<source>Select a folder</source>
-<target>Markera en katalog</target>
+<target>Markera en mapp</target>
+
+<source>Delay [seconds]</source>
+<target>Fördröjning [sekunder]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Väntetid mellan senast upptäckta förändring och kommandoexekvering</target>
<source>Command line</source>
<target>Kommandofält</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Minsta ledig tid [sekunder]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Väntetid mellan upptäckt av senaste ändring och verkställande av kommando, i sekunder</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Kommandot triggas om:
+- filer eller undermappar förändras
+- nya mappar upptäcks (ex. USB-minne ansluts)
+</target>
<source>Start</source>
<target>Start</target>
+<source>&Retry</source>
+<target>&Försök igen</target>
+
+<source>Cancel</source>
+<target>Avbryt</target>
+
<source>(Build: %x)</source>
<target>(Bygge: %x)</target>
@@ -318,8 +327,8 @@ Kommandot verkställes när:
<source>Waiting for missing directories...</source>
<target>Väntar på saknade destinationer...</target>
-<source>A directory input field is empty.</source>
-<target>Ett katalogfält är tomt</target>
+<source>An input folder name is empty.</source>
+<target>Det saknas ett källmappsnamn</target>
<source>Logging</source>
<target>Loggar</target>
@@ -405,8 +414,8 @@ Kommandot verkställes när:
<source><Symlink></source>
<target><Symboliska länkar></target>
-<source><Directory></source>
-<target><Katalog></target>
+<source><Folder></source>
+<target>Mapp</target>
<source>Full path</source>
<target>Fullständig sökväg</target>
@@ -417,8 +426,8 @@ Kommandot verkställes när:
<source>Relative path</source>
<target>Sökväg</target>
-<source>Directory</source>
-<target>Katalog</target>
+<source>Base folder</source>
+<target>Basmapp</target>
<source>Size</source>
<target>Storlek</target>
@@ -429,8 +438,11 @@ Kommandot verkställes när:
<source>Extension</source>
<target>Filformat</target>
-<source>Comparison Result</source>
-<target>Jämförelseresultat</target>
+<source>Action</source>
+<target>Aktivitet</target>
+
+<source>Category</source>
+<target>Kategori</target>
<source>Drag && drop</source>
<target>Dra && släpp</target>
@@ -438,14 +450,14 @@ Kommandot verkställes när:
<source>Close progress dialog</source>
<target>Stäng förloppsindikator</target>
-<source>Shut down</source>
-<target>Stäng av datorn</target>
+<source>Standby</source>
+<target>Strömsparläge</target>
<source>Log off</source>
<target>Logga ut</target>
-<source>Standby</source>
-<target>Strömsparläge</target>
+<source>Shut down</source>
+<target>Stäng av datorn</target>
<source>Hibernate</source>
<target>Viloläge</target>
@@ -453,15 +465,12 @@ Kommandot verkställes när:
<source>1. &Compare</source>
<target>1. &Jämför</target>
-<source>2. &Synchronize...</source>
-<target>2. &Synkronisera...</target>
+<source>2. &Synchronize</source>
+<target>2. &Synkronisera</target>
<source>&New</source>
<target>&Nytt</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>&Språk</target>
@@ -489,27 +498,27 @@ Kommandot verkställes när:
<source>&Abort</source>
<target>&Avbryt</target>
-<source>Synchronize...</source>
+<source>Synchronize</source>
<target>Synkronisera</target>
<source>Start synchronization</source>
<target>Starta synkronisering</target>
<source>Add folder pair</source>
-<target>Lägg till katalogpar</target>
+<target>Lägg till mapp-par</target>
<source>Remove folder pair</source>
-<target>Ta bort katalogpar</target>
+<target>Ta bort mapp-par</target>
<source>Swap sides</source>
<target>Byt sida</target>
-<source>Save current configuration to file</source>
-<target>Spara aktuella inställningar till fil</target>
-
<source>Load configuration from file</source>
<target>Hämta inställningar från fil</target>
+<source>Save current configuration to file</source>
+<target>Spara aktuella inställningar till fil</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>Senast använda konfigurationer (Tryck DEL för att ta bort)</target>
@@ -519,14 +528,14 @@ Kommandot verkställes när:
<source>Hide filtered or temporarily excluded files</source>
<target>Visa inte filtrerade eller temporärt undantagna filer</target>
-<source>Number of files and directories that will be created</source>
-<target>Antal filer och kataloger som kommer att skapas</target>
+<source>Number of files and folders that will be created</source>
+<target>Antal filer och mappar som kommer att skapas</target>
<source>Number of files that will be overwritten</source>
<target>Antal filer som kommer att skrivas över</target>
-<source>Number of files and directories that will be deleted</source>
-<target>Antal filer och kataloger som kommer att tas bort</target>
+<source>Number of files and folders that will be deleted</source>
+<target>Antal filer och mappar som kommer att tas bort</target>
<source>Total amount of data that will be transferred</source>
<target>Total mängd data som kommer att överföras</target>
@@ -549,8 +558,8 @@ Kommandot verkställes när:
<source>Batch job</source>
<target>Batch-jobb</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Skapa en batch-fil och automatisera synkroniseringen. För att starta i batch-läge dubbelklickar du på den skapade filen, eller kör följande kommando: FreeFileSync.exe SyncJob.ffs_batch. Detta kan också schemaläggas i systemets schemaläggare.</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>Skapa en batch-fil för att automatisera synkroniseringen. Dubbelklicka på filen, eller använd systemets schemaläggare och schemalägg: FreeFileSync.exe <filnamn>.ffs_batch</target>
<source>Help</source>
<target>Hjälp</target>
@@ -576,21 +585,12 @@ Kommandot verkställes när:
<source>Maximum number of log files:</source>
<target>Max antal loggfiler:</target>
-<source>Select log file directory:</source>
-<target>Välj loggfilskatalog:</target>
+<source>Select folder to save log files:</source>
+<target>Välj mapp, att spara loggfiler i</target>
<source>Batch settings</source>
<target>Batch-inställningar</target>
-<source>&Save</source>
-<target>&Spara</target>
-
-<source>&Load</source>
-<target>&Läs in</target>
-
-<source>Cancel</source>
-<target>Avbryt</target>
-
<source>Select variant:</source>
<target>Välj variant:</target>
@@ -598,10 +598,10 @@ Kommandot verkställes när:
<target>Använd en databas för att identifiera och sprida ändringar på båda sidor. Borttagning, namnbyte och konflikter upptäcks automatiskt</target>
<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
-<target>Speglar säkerhetskopia av vänster katalog. Höger katalog ändras för att exakt matcha vänster efter synkroniseringen.</target>
+<target>Speglar säkerhetskopia av vänster mapp. Höger mapp ändras för att exakt matcha vänster efter synkroniseringen.</target>
<source>Copy new or updated files to right folder.</source>
-<target>Kopiera nya och uppdaterade filer till höger katalog.</target>
+<target>Kopiera nya och uppdaterade filer till höger mapp.</target>
<source>Configure your own synchronization rules.</source>
<target>Konfigurera dina egna synkroniseringsregler.</target>
@@ -615,29 +615,23 @@ Kommandot verkställes när:
<source>Configuration</source>
<target>Inställningar</target>
-<source>Category</source>
-<target>Kategori</target>
+<source>Item exists on left side only</source>
+<target>Objektet finns bara på vänster sida</target>
-<source>Action</source>
-<target>Aktivitet</target>
-
-<source>File/folder exists on left side only</source>
-<target>Fil/katalog finns bara på vänster sida</target>
+<source>Item exists on right side only</source>
+<target>Objektet finns bara på höger sida</target>
-<source>File/folder exists on right side only</source>
-<target>Fil/katalog finns bara på höger sida</target>
+<source>Left side is newer</source>
+<target>Vänster sida är nyare</target>
-<source>Left file is newer</source>
-<target>Vänster fil är nyare</target>
+<source>Right side is newer</source>
+<target>Höger sida är nyare</target>
-<source>Right file is newer</source>
-<target>Höger fil är nyare</target>
+<source>Items have different content</source>
+<target>Objekten har olika innehåll</target>
-<source>Files have different content</source>
-<target>Filerna har olika innehåll</target>
-
-<source>Conflict/file cannot be categorized</source>
-<target>Konflikt/Fil kan inte kategoriseras</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Konflikten/Objektet kan inte kategoriseras</target>
<source>OK</source>
<target>OK</target>
@@ -714,9 +708,6 @@ Filerna betecknas som lika om,
<source>&Ignore</source>
<target>&Ignorera</target>
-<source>&Retry</source>
-<target>&Försök igen</target>
-
<source>Do not show this dialog again</source>
<target>Visa inte den här dialogrutan igen</target>
@@ -744,36 +735,9 @@ Note: File names must be relative to base directories!
</source>
<target>
Endast filer som matchar alla filterinställningar kommer att synkroniseras.
-OBS! Filnamnen måste anges relativt till baskataloger
+OBS! Filnamnen måste anges relativt till basmappar
</target>
-<source>Hints:</source>
-<target>Tips:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Ange fil- eller katalognamn separerade med "," eller ny rad</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. Använd jokertecknen '*' och '?' .</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Undanta filer direkt i huvudfönstret, via högerklicksmenyn.</target>
-
-<source>Example</source>
-<target>Exempel</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Inkludera: *.doc;*.zip;*.exe
-Undanta: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Synkronisera alla .doc-, .zip- och .exe-filer, men utelämna allt i underkatalog "temp".</target>
-
<source>Include</source>
<target>Inkludera</target>
@@ -795,8 +759,8 @@ Undanta: \stuff\temp\*
<source>&Default</source>
<target>&Standard</target>
-<source>Transactional file copy</source>
-<target>Transaktionell filkopiering</target>
+<source>Fail-safe file copy</source>
+<target>Felsäker filkopiering</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>Skriv först till en temporär fil (*.ffs_tmp) och byt sedan namn på den. Detta garanterar en konsistent status även vid allvarliga fel</target>
@@ -810,8 +774,8 @@ Undanta: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Kopiera filåtkomstbehörigheter</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Överför fil- och katalogrättigheter (Kräver administratörsrättigheter)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Överför behörigheter för filer och mappar (Kräver administratörsrättigheter)</target>
<source>Restore hidden dialogs</source>
<target>Återställ dolda dialoger</target>
@@ -844,7 +808,7 @@ Undanta: \stuff\temp\*
<target>Huvudfält</target>
<source>Folder pairs</source>
-<target>Katalogpar</target>
+<target>Mapp-par</target>
<source>Overview</source>
<target>Översikt</target>
@@ -913,7 +877,7 @@ Undanta: \stuff\temp\*
<target>Inställningar inlästa!</target>
<source>Folder Comparison and Synchronization</source>
-<target>Katalogjämförelse och synkronisering</target>
+<target>Mappjämförelse och synkronisering</target>
<source>Hide files that exist on left side only</source>
<target>Visa inte filer som endast finns till vänster</target>
@@ -1000,7 +964,7 @@ Undanta: \stuff\temp\*
<target>Visa filer som inte kommer att kopieras</target>
<source>All directories in sync!</source>
-<target>Alla kataloger synkade!</target>
+<target>Alla mappar synkroniserade!</target>
<source>Please run a Compare first before synchronizing!</source>
<target>Du måste trycka "Jämför" innan du kan synkronisera.</target>
@@ -1028,8 +992,8 @@ Undanta: \stuff\temp\*
<pluralform>%x directories</pluralform>
</source>
<target>
-<pluralform>1 katalog</pluralform>
-<pluralform>%x kataloger</pluralform>
+<pluralform>1 mapp</pluralform>
+<pluralform>%x mappar</pluralform>
</target>
<source>
@@ -1119,11 +1083,11 @@ Undanta: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Integrera externa program i högerklicksmeny. Följande variabler finns tillgängliga:</target>
-<source>- full file or directory name</source>
-<target>- Full sökväg</target>
+<source>- full file or folder name</source>
+<target>- fullständigt fil- eller mappnamn</target>
-<source>- directory part only</source>
-<target>- Endast fil-/katalognamn</target>
+<source>- folder part only</source>
+<target>- endast mappdelen</target>
<source>- Other side's counterpart to %name</source>
<target>- Andra sidans motsvarighet till %name</target>
@@ -1167,8 +1131,8 @@ Undanta: \stuff\temp\*
<source>Versioning</source>
<target>Versionshantering</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Flytta filer till en tidsstämplad underkatalog</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>
@@ -1213,7 +1177,7 @@ Undanta: \stuff\temp\*
</target>
<source>Cannot monitor directory %x.</source>
-<target>Katalogen %x kan inte övervakas.</target>
+<target>Mappen %x kan inte övervakas.</target>
<source>Conversion error:</source>
<target>Konversionsfel:</target>
@@ -1228,7 +1192,7 @@ Undanta: \stuff\temp\*
<target>Kan inte flytta filen %x till %y.</target>
<source>Cannot delete directory %x.</source>
-<target>Kan inte ta bort katalogen %x.</target>
+<target>Kan inte ta bort mappen %x.</target>
<source>Cannot write modification time of %x.</source>
<target>Kan inte ändra tidsangivelsen för %x.</target>
@@ -1249,7 +1213,7 @@ Undanta: \stuff\temp\*
<target>Kan inte skriva behörigheter för %x.</target>
<source>Cannot create directory %x.</source>
-<target>Kan inte skapa katalogen %x.</target>
+<target>Kan inte skapa mappen %x.</target>
<source>Cannot copy symbolic link %x to %y.</source>
<target>Kan inte kopiera den symboliska länken %x till %y.</target>
@@ -1261,10 +1225,10 @@ Undanta: \stuff\temp\*
<target>Kan inte kopiera filen %x till %y.</target>
<source>Cannot read directory %x.</source>
-<target>Kan inte läsa in katalogen %x.</target>
+<target>Kan inte läsa in mappen %x.</target>
-<source>Endless loop.</source>
-<target>Oändlig loop.</target>
+<source>Detected endless directory recursion.</source>
+<target>Upptäckte ändlös mapprekursion</target>
<source>Cannot set privilege %x.</source>
<target>Kan inte att ange behörigheten %x.</target>
@@ -1273,10 +1237,10 @@ Undanta: \stuff\temp\*
<target>Kan inte flytta %x till Papperskorgen</target>
<source>Both sides have changed since last synchronization!</source>
-<target>Båda sidor har ändrats sedan senaste synkroniseringen!</target>
+<target>Bägge sidor har ändrats sedan senaste synkroniseringen!</target>
<source>Cannot determine sync-direction:</source>
-<target>Kan inte bestämma synk-riktning:</target>
+<target>Kan inte bestämma synkroniseringsriktning:</target>
<source>No change since last synchronization!</source>
<target>Inga ändringar sedan senaste synkronisering!</target>
@@ -1290,17 +1254,14 @@ Undanta: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Filen är ingen giltig konfigureringsfil:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Du kan bortse från det här felet och utgå ifrån att katalogen är tom</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>
-<source>Cannot find directory %x.</source>
-<target>Kan inte hitta katalogen %x.</target>
+<source>Cannot find folder %x.</source>
+<target>Kan inte hitta mappen %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
-<target>Kataloger är beroende! Var försiktig när du sätter upp synkroniseringsregler:</target>
+<target>Mappar är beroende! Var försiktig när du sätter upp synkroniseringsregler:</target>
<source>Preparing synchronization...</source>
<target>Förbereder synkronisering...</target>
@@ -1329,20 +1290,20 @@ Undanta: \stuff\temp\*
<source>Both sides are equal</source>
<target>Bägge sidor är lika</target>
-<source>Files/folders differ in attributes only</source>
-<target>Endast attributskillnader i filer/kataloger</target>
+<source>Items have different attributes</source>
+<target>Objekten har olika attribut</target>
-<source>Copy new file/folder to left</source>
-<target>Kopiera ny fil/katalog åt vänster</target>
+<source>Copy new item to left</source>
+<target>Kopiera nytt objekt åt vänster</target>
-<source>Copy new file/folder to right</source>
-<target>Kopiera ny fil/katalog åt höger</target>
+<source>Copy new item to right</source>
+<target>Kopiera nytt objekt åt höger</target>
-<source>Delete left file/folder</source>
-<target>Ta bort vänster fil/katalog</target>
+<source>Delete left item</source>
+<target>Ta bort vänster objekt</target>
-<source>Delete right file/folder</source>
-<target>Ta bort höger fil/katalog</target>
+<source>Delete right item</source>
+<target>Ta bort höger objekt</target>
<source>Move file on left</source>
<target>Flytta fil på vänster sida</target>
@@ -1350,29 +1311,29 @@ Undanta: \stuff\temp\*
<source>Move file on right</source>
<target>Flytta fil på höger sida</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Skriv över vänster fil/katalog med den högra</target>
+<source>Overwrite left item</source>
+<target>Skriv över vänster objekt</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Skriv över höger fil/katalog med den vänstra</target>
+<source>Overwrite right item</source>
+<target>Skriv över höger objekt</target>
<source>Do nothing</source>
<target>Gör ingenting</target>
-<source>Copy file attributes only to left</source>
-<target>Kopiera endast filattribut åt vänster</target>
+<source>Update attributes on left</source>
+<target>Uppdatera attribut på vänster sida</target>
-<source>Copy file attributes only to right</source>
-<target>Kopiera endast filattribut åt höger</target>
+<source>Update attributes on right</source>
+<target>Uppdatera attribut på höger sida</target>
<source>Multiple...</source>
-<target>Multipla...</target>
+<target>Flera...</target>
<source>Deleting file %x</source>
<target>Tar bort filen %x</target>
<source>Deleting folder %x</source>
-<target>Tar bort katalogen %x</target>
+<target>Tar bort mappen %x</target>
<source>Deleting symbolic link %x</source>
<target>Tar bort den symboliska länken %x</target>
@@ -1381,7 +1342,7 @@ Undanta: \stuff\temp\*
<target>Flyttar filen %x till papperskorgen</target>
<source>Moving folder %x to recycle bin</source>
-<target>Flyttar katalogen %x till papperskorgen</target>
+<target>Flyttar mappen %x till papperskorgen</target>
<source>Moving symbolic link %x to recycle bin</source>
<target>Flyttar den symboliska länken %x till papperskorgen</target>
@@ -1390,7 +1351,7 @@ Undanta: \stuff\temp\*
<target>Flyttar filen %x till %y</target>
<source>Moving folder %x to %y</source>
-<target>Flyttar katalogen %x till %y</target>
+<target>Flyttar mappen %x till %y</target>
<source>Moving symbolic link %x to %y</source>
<target>Flyttar den symboliska länken %x till %y</target>
@@ -1402,7 +1363,7 @@ Undanta: \stuff\temp\*
<target>Skapar den symboliska länken %x</target>
<source>Creating folder %x</source>
-<target>Skapar katalog %x</target>
+<target>Skapar mappen %x</target>
<source>Overwriting file %x</source>
<target>Skriver över filen %x</target>
@@ -1416,14 +1377,14 @@ Undanta: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>Uppdaterar attribut för %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Målkatalogens namn måste anges</target>
+<source>Target folder name must not be empty.</source>
+<target>MÃ¥lmappens namn saknas.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Katalog för versionshantering har inte specificerats</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Mappnamn för versionshantering saknas.</target>
<source>Source directory %x not found.</source>
-<target>Källkatalogen %x hittas inte</target>
+<target>Källmappen %x hittas inte</target>
<source>Unresolved conflicts existing!</source>
<target>Obehandlad konflikt upptäckt!</target>
@@ -1449,11 +1410,11 @@ Undanta: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>En katalog som är en del av flera katalogpar kommer att ändras! Kontrollera synkroniseringsinställningarna</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>Processar katalogpar:</target>
+<target>Bearbetar mapp-paret:</target>
<source>Generating database...</source>
<target>Skapar databas...</target>
diff --git a/BUILD/Languages/turkish.lng b/BUILD/Languages/turkish.lng
index 5a440333..8a654cae 100644
--- a/BUILD/Languages/turkish.lng
+++ b/BUILD/Languages/turkish.lng
@@ -7,8 +7,8 @@
<plural definition>n == 1 ? 0 : 1</plural definition>
</header>
-<source>Searching for directory %x...</source>
-<target>%x klasörü aranıyor...</target>
+<source>Searching for folder %x...</source>
+<target>%s klasörü aranıyor...</target>
<source>Show in Explorer</source>
<target>Tarayıcıda Göster</target>
@@ -25,18 +25,21 @@
<source>RealtimeSync - Automated Synchronization</source>
<target>RealtimeSync - KendiliÄŸinden EÅŸleÅŸtirme</target>
+<source>Error</source>
+<target>Hata</target>
+
<source>Select alternate comparison settings</source>
<target>Alternatif karşılaştırma ayarlarını seçin</target>
<source>Select alternate synchronization settings</source>
<target>Alternatif eşleştirme ayarlarını seçin</target>
-<source>No filter selected</source>
-<target>Seçilmiş süzgeç yok</target>
-
<source>Filter is active</source>
<target>Süzgeç etkin</target>
+<source>No filter selected</source>
+<target>Seçilmiş süzgeç yok</target>
+
<source>Remove alternate settings</source>
<target>Alternatif ayarları sil</target>
@@ -55,9 +58,6 @@
<source>About</source>
<target>Hakkında</target>
-<source>Error</source>
-<target>Hata</target>
-
<source>Warning</source>
<target>Uyarı</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Genel ayarlar</target>
-<source>Synchronization Preview</source>
-<target>Eşleştirme önizlemesi</target>
+<source>Summary</source>
+<target>Özet</target>
<source>Find</source>
<target>Bul</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>Gözat</target>
-<source>Invalid command line: %x</source>
-<target>Geçersiz komut satırı: %x</target>
+<source>Invalid command line:</source>
+<target>Geçersiz komut satırı:</target>
<source>Info</source>
<target>Bilgi</target>
@@ -226,29 +226,29 @@
<source>Volume name %x not part of file name %y!</source>
<target>%x birim adı, %y dosya adının parçası değil!</target>
-<source>Cannot find file %x.</source>
-<target>%x dosyası bulunamadı.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Şu XML elemanları okunamadı:</target>
-<source>S&ave configuration...</source>
-<target>Y&apılandırmayı kaydet...</target>
+<source>Cannot find file %x.</source>
+<target>%x dosyası bulunamadı.</target>
-<source>&Load configuration...</source>
-<target>Yapılandırmayı a&l...</target>
+<source>&Open...</source>
+<target>&Aç...</target>
+
+<source>&Save...</source>
+<target>&Kaydet</target>
<source>&Quit</source>
<target>Çı&k</target>
-<source>&File</source>
-<target>&Dosya</target>
+<source>&Program</source>
+<target>&Program</target>
<source>&Content</source>
<target>İçe&rik</target>
-<source>&About...</source>
-<target>H&akkında...</target>
+<source>&About</source>
+<target>H&akkında</target>
<source>&Help</source>
<target>&Yardım</target>
@@ -256,8 +256,8 @@
<source>Usage:</source>
<target>Kullanım:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. İzlenecek klasörleri seçin.</target>
+<source>1. Select folders to watch.</source>
+<target>1. İzlenecek klasörleri seçin</target>
<source>2. Enter a command line.</source>
<target>2. Bir komut satırı yazın.</target>
@@ -265,18 +265,10 @@
<source>3. Press 'Start'.</source>
<target>3. 'Başlat'a Tıklayın.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Her seferinde çalıştırılacak komut satırı:
-- tüm klasörler geçerli (örneğin USB bellek takıldığında)
-- bu klasörlerin ya da alt klasörlerin içindeki dosyalar değiştirildiğinde
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>.ffs_batch dosyasını yükleyerek başlayabilirsiniz.</target>
-<source>Directories to watch</source>
+<source>Folders to watch</source>
<target>İzlenecek klasörler</target>
<source>Add folder</source>
@@ -288,18 +280,35 @@ Her seferinde çalıştırılacak komut satırı:
<source>Select a folder</source>
<target>Bir klasör seçin</target>
+<source>Delay [seconds]</source>
+<target>Gecikme [saniye}</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Son algılanan değişiklik ile komutun yürütülmesi arasındaki bekleme süresi</target>
+
<source>Command line</source>
<target>Komut satırı</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>En az boşta bekleme süresi [saniye]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Son değişikliğin algılanması ile komut satırının yürütülmesi arasındaki bekleme süresi</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Komut şu durumlarda yürütülür:
+- dosya ya alt klasörler değiştiğinde
+- yeni klasörler algılandığında (örneğin bir USB bellek takıldığında)
+</target>
<source>Start</source>
<target>BaÅŸla</target>
+<source>&Retry</source>
+<target>&Yeniden dene</target>
+
+<source>Cancel</source>
+<target>Ä°ptal</target>
+
<source>(Build: %x)</source>
<target>(Yapım: %x)</target>
@@ -318,8 +327,8 @@ Her seferinde çalıştırılacak komut satırı:
<source>Waiting for missing directories...</source>
<target>Kayıp klasörler için bekleniyor...</target>
-<source>A directory input field is empty.</source>
-<target>Bir klasör giriş alanı boş</target>
+<source>An input folder name is empty.</source>
+<target>Bir giriş klasörü adı eksik.</target>
<source>Logging</source>
<target>Günlükleme</target>
@@ -405,7 +414,7 @@ Her seferinde çalıştırılacak komut satırı:
<source><Symlink></source>
<target><Smblkbağlantı></target>
-<source><Directory></source>
+<source><Folder></source>
<target><Klasör></target>
<source>Full path</source>
@@ -417,8 +426,8 @@ Her seferinde çalıştırılacak komut satırı:
<source>Relative path</source>
<target>Bağıl klasör yolu</target>
-<source>Directory</source>
-<target>Klasör</target>
+<source>Base folder</source>
+<target>Başlangıç klasörü</target>
<source>Size</source>
<target>Boyut</target>
@@ -429,8 +438,11 @@ Her seferinde çalıştırılacak komut satırı:
<source>Extension</source>
<target>Uzantı</target>
-<source>Comparison Result</source>
-<target>Karşılaştırma sonucu</target>
+<source>Action</source>
+<target>Ä°ÅŸlem</target>
+
+<source>Category</source>
+<target>Kategori</target>
<source>Drag && drop</source>
<target>Klasör ya da dosyaları buraya sürükleyip bırakabilirsiniz</target>
@@ -438,14 +450,14 @@ Her seferinde çalıştırılacak komut satırı:
<source>Close progress dialog</source>
<target>Ä°ÅŸlem penceresini kapat</target>
-<source>Shut down</source>
-<target>Bilgisayarı kapat</target>
+<source>Standby</source>
+<target>Uykuya dal</target>
<source>Log off</source>
<target>Oturumu kapat</target>
-<source>Standby</source>
-<target>Uykuya dal</target>
+<source>Shut down</source>
+<target>Bilgisayarı kapat</target>
<source>Hibernate</source>
<target>Hazırda beklet</target>
@@ -453,15 +465,12 @@ Her seferinde çalıştırılacak komut satırı:
<source>1. &Compare</source>
<target>1. &Karşılaştır</target>
-<source>2. &Synchronize...</source>
-<target>2. &EÅŸleÅŸtir...</target>
+<source>2. &Synchronize</source>
+<target>2. &EÅŸleÅŸtir</target>
<source>&New</source>
<target>Ye&ni</target>
-<source>&Program</source>
-<target>&Program</target>
-
<source>&Language</source>
<target>Di&l</target>
@@ -489,8 +498,8 @@ Her seferinde çalıştırılacak komut satırı:
<source>&Abort</source>
<target>V&azgeç</target>
-<source>Synchronize...</source>
-<target>EÅŸleÅŸtir...</target>
+<source>Synchronize</source>
+<target>EÅŸleÅŸtir</target>
<source>Start synchronization</source>
<target>EÅŸleÅŸtirmeyi baÅŸlat</target>
@@ -504,12 +513,12 @@ Her seferinde çalıştırılacak komut satırı:
<source>Swap sides</source>
<target>Sağ ve sol yanı değiştir</target>
-<source>Save current configuration to file</source>
-<target>Geçerli yapılandırmayı dosyaya kaydeder</target>
-
<source>Load configuration from file</source>
<target>Yapılandırma dosyasından ayarları alır</target>
+<source>Save current configuration to file</source>
+<target>Geçerli yapılandırmayı dosyaya kaydeder</target>
+
<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>
@@ -519,13 +528,13 @@ Her seferinde çalıştırılacak komut satırı:
<source>Hide filtered or temporarily excluded files</source>
<target>Süzülmüş ya da geçici olarak dışlanmış dosyaları gizler</target>
-<source>Number of files and directories that will be created</source>
+<source>Number of files and folders that will be created</source>
<target>Oluşturulacak dosya ve klasör sayısı</target>
<source>Number of files that will be overwritten</source>
<target>Üzerine yazılacak dosya sayısı</target>
-<source>Number of files and directories that will be deleted</source>
+<source>Number of files and folders that will be deleted</source>
<target>Silinecek dosya ve klasör sayısı</target>
<source>Total amount of data that will be transferred</source>
@@ -549,8 +558,8 @@ Her seferinde çalıştırılacak komut satırı:
<source>Batch job</source>
<target>Toplu iÅŸ</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Bir yığın dosyası oluşturarak eşleştirmeyi otomatikleştirir. Yığın kipini başlatmak için oluşturulan dosya üzerinde çift tıklamak ya da şu komutu çalıştırmak yeterlidir: FreeFileSync.exe Eşleştirmeİşi.ffs_batch. Bu işlem aynı şekilde sisteminizin zamanlanmış görev çalıştırıcısına eklenebilir.</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>Eşleştirmeyi otomatikleştirmek için bir komut yığın dosyası oluşturun. Bu dosyaya çift tıklayarak ya da sisteminizdeki görev zamanlayıcıya: FreeFileSync.exe <görev adı>.ffs_batch şeklinde yazarak ekleyin</target>
<source>Help</source>
<target>Yardım</target>
@@ -576,21 +585,12 @@ Her seferinde çalıştırılacak komut satırı:
<source>Maximum number of log files:</source>
<target>Tutulacak en fazla günlük dosyası sayısı:</target>
-<source>Select log file directory:</source>
-<target>Kayıt dosyası klasörü:</target>
+<source>Select folder to save log files:</source>
+<target>Günlük dosyalarının kaydedileceği klasörü seçin:</target>
<source>Batch settings</source>
<target>İş ayarları</target>
-<source>&Save</source>
-<target>&Kaydet</target>
-
-<source>&Load</source>
-<target>Yük&le</target>
-
-<source>Cancel</source>
-<target>Ä°ptal</target>
-
<source>Select variant:</source>
<target>Davranışı seçin:</target>
@@ -615,29 +615,23 @@ Her seferinde çalıştırılacak komut satırı:
<source>Configuration</source>
<target>Yapılandırma</target>
-<source>Category</source>
-<target>Kategori</target>
-
-<source>Action</source>
-<target>Ä°ÅŸlem</target>
-
-<source>File/folder exists on left side only</source>
-<target>Dosya/Klasör yalnız sol tarafta var</target>
+<source>Item exists on left side only</source>
+<target>Yalnız sol yanda bulunan ögeler</target>
-<source>File/folder exists on right side only</source>
-<target>Dosya/Klasör yalnız sağ tarafta var</target>
+<source>Item exists on right side only</source>
+<target>Yalnız sağ yanda bulunan ögeler</target>
-<source>Left file is newer</source>
-<target>Soldaki dosya daha yeni</target>
+<source>Left side is newer</source>
+<target>Sol yan daha yeni</target>
-<source>Right file is newer</source>
-<target>SaÄŸdaki dosya daha yeni</target>
+<source>Right side is newer</source>
+<target>SaÄŸ yan daha yeni</target>
-<source>Files have different content</source>
-<target>Farklı içeriğe sahip dosyalar</target>
+<source>Items have different content</source>
+<target>Ögelerin içeriği farklı</target>
-<source>Conflict/file cannot be categorized</source>
-<target>Çatışma/dosya kategorize edilemedi</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Uyuşmazlık/öge kategorize edilemiyor</target>
<source>OK</source>
<target>Tamam</target>
@@ -714,9 +708,6 @@ aynı olmalıdır
<source>&Ignore</source>
<target>&Yoksay</target>
-<source>&Retry</source>
-<target>&Yeniden dene</target>
-
<source>Do not show this dialog again</source>
<target>Bu iletiyi yeniden gösterme</target>
@@ -747,33 +738,6 @@ Yalnız tüm süzgeç ayarlarına uyan dosyalar eşleştirilecek.
Not: Dosya adları kök klasörlere göre bağıl olmalıdır!
</target>
-<source>Hints:</source>
-<target>İpuçları:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Bağıl dosya ya da klasör adlarını ';' ile ayırarak ya da ayrı satırlar şeklinde yazın.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. '*' ve '?' jokerleri kullanılabilsin.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Ana listedeki dosyaları sağ fare tuşu menüsüyle doğrudan dışla.</target>
-
-<source>Example</source>
-<target>Örnek</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Kat: *.doc;*.zip;*.exe
-Katma: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>"temp" alt klasöründeki herşey hariç, tüm .doc, .zip ve .exe dosyalarını eşleştir.</target>
-
<source>Include</source>
<target>Katılacaklar:</target>
@@ -795,8 +759,8 @@ Katma: \stuff\temp\*
<source>&Default</source>
<target>&Varsayılan</target>
-<source>Transactional file copy</source>
-<target>Aşamalı kopyalama kullan</target>
+<source>Fail-safe file copy</source>
+<target>Hatasız dosya kopyalama</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>Kopyalama önce geçici bir dosyaya (*.ffs_tmp) yapılır. Sonra dosya yeniden adlandırılır. Böylece hatalara karşı daha sağlıklı bir durum sağlanır</target>
@@ -810,8 +774,8 @@ Katma: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Dosya eriÅŸim izinlerini kopyala</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Dosya ve klasör izinlerini de aktarır (Yönetici izinlerine gerek duyar)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Dosya ve klasör izinlerini de kopyala (Yönetici haklarına gerek duyar)</target>
<source>Restore hidden dialogs</source>
<target>Gizli iletileri göster</target>
@@ -1119,11 +1083,11 @@ Katma: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Dış uygulamaları sağ tuş menüsüne ekler. Şu makrolar kullanılabilir:</target>
-<source>- full file or directory name</source>
+<source>- full file or folder name</source>
<target>- tam dosya ya da klasör adı</target>
-<source>- directory part only</source>
-<target>- Yalnız klasör kısmı</target>
+<source>- folder part only</source>
+<target>- yalnız klasör bölümü</target>
<source>- Other side's counterpart to %name</source>
<target>- %name diğer taraftaki karşılığı</target>
@@ -1167,8 +1131,8 @@ Katma: \stuff\temp\*
<source>Versioning</source>
<target>Eski sürüm olarak sakla</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Dosyaları zaman damgasıyla bir alt klasöre taşır</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>
@@ -1263,8 +1227,8 @@ Katma: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>%x klasörü okunamadı.</target>
-<source>Endless loop.</source>
-<target>Sonsuz çevrim.</target>
+<source>Detected endless directory recursion.</source>
+<target>Sonsuz klasör kısayol döngüsü algılandı.</target>
<source>Cannot set privilege %x.</source>
<target>%x izni verilemedi.</target>
@@ -1290,14 +1254,11 @@ Katma: \stuff\temp\*
<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>The file does not contain a valid configuration:</source>
-<target>Dosya geçerli bir yapılandırma içermiyor:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Bu hatayı, klasörü boş sayacak şekilde yok sayabilirsiniz.</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>
-<source>Cannot find directory %x.</source>
-<target>%x klasörü bulunamadı.</target>
+<source>Cannot find folder %x.</source>
+<target>%x klasörü bulunamıyor.</target>
<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>
@@ -1329,20 +1290,20 @@ Katma: \stuff\temp\*
<source>Both sides are equal</source>
<target>İki tarafta aynı</target>
-<source>Files/folders differ in attributes only</source>
-<target>Yalnız dosya/klasör öznitelikleri farklı olanlar</target>
+<source>Items have different attributes</source>
+<target>Ögeler farklı özniteliklere sahip</target>
-<source>Copy new file/folder to left</source>
-<target>Yeni dosya/klasörleri sola kopyala</target>
+<source>Copy new item to left</source>
+<target>Yeni ögeyi sola kopyala</target>
-<source>Copy new file/folder to right</source>
-<target>Yeni dosya/klasörleri sağa kopyala</target>
+<source>Copy new item to right</source>
+<target>Yeni ögeyi sağa kopyala</target>
-<source>Delete left file/folder</source>
-<target>Soldaki dosya/klasörleri sil</target>
+<source>Delete left item</source>
+<target>Soldaki ögeyi sil</target>
-<source>Delete right file/folder</source>
-<target>Sağdaki dosya/klasörleri sil</target>
+<source>Delete right item</source>
+<target>Sağdaki ögeyi sil</target>
<source>Move file on left</source>
<target>Soldaki dosyayı taşı</target>
@@ -1350,20 +1311,20 @@ Katma: \stuff\temp\*
<source>Move file on right</source>
<target>Sağdaki dosyayı taşı</target>
-<source>Overwrite left file/folder with right one</source>
-<target>Soldaki dosya/klasörlerin üzerine sağdakileri yaz</target>
+<source>Overwrite left item</source>
+<target>Soldaki ögenin üzerine yaz</target>
-<source>Overwrite right file/folder with left one</source>
-<target>Sağdaki dosya/klasörlerin üzerine soldakileri yaz</target>
+<source>Overwrite right item</source>
+<target>Sağdaki ögenin üzerine yaz</target>
<source>Do nothing</source>
<target>Hiçbir şey yapma</target>
-<source>Copy file attributes only to left</source>
-<target>Dosya özniteliklerini yalnız sola kopyalaya</target>
+<source>Update attributes on left</source>
+<target>Soldaki öznitelikleri güncelle</target>
-<source>Copy file attributes only to right</source>
-<target>Dosya özniteliklerini yalnız sağa kopyalaya</target>
+<source>Update attributes on right</source>
+<target>Sağdaki öznitelikleri güncelle</target>
<source>Multiple...</source>
<target>Çoklu...</target>
@@ -1416,11 +1377,11 @@ Katma: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>%x öznitelikleri güncelleniyor</target>
-<source>Target directory name must not be empty!</source>
-<target>Hedef klasör adı boş olamaz!</target>
+<source>Target folder name must not be empty.</source>
+<target>Hedef klasör adı boş olamaz.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Dosya sürümlemesi için klasör desteklenmiyor!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Dosya sürümlemesi için klasör adı boş olamaz.</target>
<source>Source directory %x not found.</source>
<target>%x kaynak klasörü bulunamadı.</target>
@@ -1449,8 +1410,8 @@ Katma: \stuff\temp\*
<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 directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</source>
-<target>Bir klasör, çoklu klasör çiftlerinin bir parçası olduğundan değiştirilecek! Lütfen eşleştirme ayarlarınızı gözden geçirin!</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>
diff --git a/BUILD/Languages/ukrainian.lng b/BUILD/Languages/ukrainian.lng
index 5eadfddd..b7f89539 100644
--- a/BUILD/Languages/ukrainian.lng
+++ b/BUILD/Languages/ukrainian.lng
@@ -7,7 +7,7 @@
<plural definition>n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2</plural definition>
</header>
-<source>Searching for directory %x...</source>
+<source>Searching for folder %x...</source>
<target>Пошук каталогу %x...</target>
<source>Show in Explorer</source>
@@ -34,12 +34,12 @@
<source>Select alternate synchronization settings</source>
<target>Вибрати альтернативні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації</target>
-<source>No filter selected</source>
-<target>Ðе вибрано жодного фільтра</target>
-
<source>Filter is active</source>
<target>Фільтр активний</target>
+<source>No filter selected</source>
+<target>Ðе вибрано жодного фільтра</target>
+
<source>Remove alternate settings</source>
<target>Вилучити альтернативні налаштуваннÑ</target>
@@ -73,8 +73,8 @@
<source>Global settings</source>
<target>Глобальні налаштуваннÑ</target>
-<source>Synchronization Preview</source>
-<target>Попередній оглÑд Ñинхронізації</target>
+<source>Summary</source>
+<target>ПідÑумок</target>
<source>Find</source>
<target>Знайти</target>
@@ -103,8 +103,8 @@
<source>Browse</source>
<target>ПереглÑнути</target>
-<source>Invalid command line: %x</source>
-<target>Ðеправильний командний Ñ€Ñдок: %x</target>
+<source>Invalid command line:</source>
+<target>Ðеправильний командний Ñ€Ñдок:</target>
<source>Info</source>
<target>ІнформаціÑ</target>
@@ -229,38 +229,38 @@
<source>Volume name %x not part of file name %y!</source>
<target>Ð†Ð¼â€™Ñ Ñ‚Ð¾Ð¼Ñƒ %x не Ñ” чаÑтиною імені файлу %y!</target>
-<source>Cannot find file %x.</source>
-<target>Ðе вдаєтьÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файлу %x.</target>
-
<source>Cannot read the following XML elements:</source>
<target>Ðе вдаєтьÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ такі елементи XML:</target>
-<source>S&ave configuration...</source>
-<target>Зберегти налаштуваннÑ...</target>
+<source>Cannot find file %x.</source>
+<target>Ðе вдаєтьÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файлу %x.</target>
+
+<source>&Open...</source>
+<target>Відкрити...</target>
-<source>&Load configuration...</source>
-<target>&Завантажити налаштуваннÑ...</target>
+<source>&Save...</source>
+<target>Зберегти...</target>
<source>&Quit</source>
-<target>&Вихід</target>
+<target>Вихід</target>
-<source>&File</source>
-<target>&Файл</target>
+<source>&Program</source>
+<target>Програма</target>
<source>&Content</source>
-<target>&ЗміÑÑ‚</target>
+<target>ЗміÑÑ‚</target>
-<source>&About...</source>
-<target>&Про програму...</target>
+<source>&About</source>
+<target>Про програму</target>
<source>&Help</source>
-<target>&Допомога</target>
+<target>Допомога</target>
<source>Usage:</source>
<target>ВикориÑтаннÑ:</target>
-<source>1. Select directories to monitor.</source>
-<target>1. Виберіть каталоги Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ;</target>
+<source>1. Select folders to watch.</source>
+<target>1. Виберіть папки Ð´Ð»Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ;</target>
<source>2. Enter a command line.</source>
<target>2. Уведіть Ñ€Ñдок команди;</target>
@@ -268,19 +268,11 @@
<source>3. Press 'Start'.</source>
<target>3. ÐатиÑніть 'Старт'.</target>
-<source>
-The command line is executed each time:
-- all directories become available (e.g. USB stick insert)
-- files within these directories or subdirectories are modified
-</source>
-<target>
-Командний Ñ€Ñдок виконуєтьÑÑ Ñ‰Ð¾Ñ€Ð°Ð·Ñƒ, коли:
-- вÑÑ– каталоги Ñтають доÑтупні (наприклад, Ð¿Ñ–Ð´â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñного ноÑÑ–Ñ)
-- файли в каталогах чи підкаталогах змінені
-</target>
+<source>To get started just import a .ffs_batch file.</source>
+<target>Щоб розпочати імпортуйте .ffs_batch файл.</target>
-<source>Directories to watch</source>
-<target>Каталоги Ð´Ð»Ñ ÑпоÑтереженнÑ</target>
+<source>Folders to watch</source>
+<target>Папки Ð´Ð»Ñ ÑпоÑтереженнÑ</target>
<source>Add folder</source>
<target>Додати папку</target>
@@ -291,14 +283,25 @@ The command line is executed each time:
<source>Select a folder</source>
<target>Вибрати папку</target>
+<source>Delay [seconds]</source>
+<target>Затримка [Ñекунд]</target>
+
+<source>Idle time between last detected change and execution of command</source>
+<target>Ð§Ð°Ñ Ð¿Ñ€Ð¾Ñтою між виÑвленнÑм оÑтанньої зміни та виконаннÑм команди</target>
+
<source>Command line</source>
<target>Командний Ñ€Ñдок</target>
-<source>Minimum Idle Time [seconds]</source>
-<target>Мінімальний Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ñтою [Ñекунд]</target>
-
-<source>Idle time between detection of last change and execution of command line in seconds</source>
-<target>Ð§Ð°Ñ Ð¿Ñ€Ð¾Ñтою між виÑвленнÑм оÑтанньої зміни та виконаннÑм командного Ñ€Ñдка в Ñекундах</target>
+<source>
+The command is triggered if:
+- files or subfolders change
+- new folders arrive (e.g. USB stick insert)
+</source>
+<target>
+Команда Ñпрацьовує, Ñкщо:
+- змінилиÑÑ Ñ„Ð°Ð¹Ð»Ð¸ або вкладені папки
+- поÑвилиÑÑ Ð½Ð¾Ð²Ñ– папки (наприклад, підключена USB-пам'ÑÑ‚ÑŒ)
+</target>
<source>Start</source>
<target>Старт</target>
@@ -327,8 +330,8 @@ The command line is executed each time:
<source>Waiting for missing directories...</source>
<target>ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑ‰ÐµÐ½Ð¸Ñ… каталогів...</target>
-<source>A directory input field is empty.</source>
-<target>Поле Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ ÑˆÐ»Ñху каталога порожнє.</target>
+<source>An input folder name is empty.</source>
+<target>Ðазва вхідної папки порожнÑ.</target>
<source>Logging</source>
<target>Лог-файли</target>
@@ -399,12 +402,12 @@ The command line is executed each time:
<source>Download now?</source>
<target>Завантажити зараз?</target>
-<source>Information</source>
-<target>ІнформаціÑ</target>
-
<source>FreeFileSync is up to date!</source>
<target>У Ð’Ð°Ñ Ð½Ð°Ð¹Ð½Ð¾Ð²Ñ–ÑˆÐ° верÑÑ–Ñ FreeFileSync!</target>
+<source>Information</source>
+<target>ІнформаціÑ</target>
+
<source>Do you want FreeFileSync to automatically check for updates every week?</source>
<target>Ви хочете, щоб FreeFileSync автоматично перевірÑв наÑвніÑÑ‚ÑŒ оновлень щотижнÑ?</target>
@@ -414,8 +417,8 @@ The command line is executed each time:
<source><Symlink></source>
<target><Символьне поÑиланнÑ></target>
-<source><Directory></source>
-<target><Каталог></target>
+<source><Folder></source>
+<target><Папка></target>
<source>Full path</source>
<target>Повний шлÑÑ…</target>
@@ -426,8 +429,8 @@ The command line is executed each time:
<source>Relative path</source>
<target>ВідноÑний шлÑÑ…</target>
-<source>Directory</source>
-<target>Каталог</target>
+<source>Base folder</source>
+<target>Базова папка</target>
<source>Size</source>
<target>Розмір</target>
@@ -438,8 +441,11 @@ The command line is executed each time:
<source>Extension</source>
<target>РозширеннÑ</target>
-<source>Comparison Result</source>
-<target>Результати порівнюваннÑ</target>
+<source>Action</source>
+<target>ДіÑ</target>
+
+<source>Category</source>
+<target>КатегоріÑ</target>
<source>Drag && drop</source>
<target>Drag && drop</target>
@@ -447,14 +453,14 @@ The command line is executed each time:
<source>Close progress dialog</source>
<target>Закрити вікно прогреÑу</target>
-<source>Shut down</source>
-<target>Вимкнути комп'ютер</target>
+<source>Standby</source>
+<target>СплÑчий режим</target>
<source>Log off</source>
<target>Вилогувати</target>
-<source>Standby</source>
-<target>СплÑчий режим</target>
+<source>Shut down</source>
+<target>Вимкнути комп'ютер</target>
<source>Hibernate</source>
<target>ГібернаціÑ</target>
@@ -462,15 +468,12 @@ The command line is executed each time:
<source>1. &Compare</source>
<target>1. &ПорівнÑти</target>
-<source>2. &Synchronize...</source>
+<source>2. &Synchronize</source>
<target>2. &Синхронізувати</target>
<source>&New</source>
<target>&Ðова</target>
-<source>&Program</source>
-<target>&Програма</target>
-
<source>&Language</source>
<target>&Мова</target>
@@ -498,7 +501,7 @@ The command line is executed each time:
<source>&Abort</source>
<target>&Припинити</target>
-<source>Synchronize...</source>
+<source>Synchronize</source>
<target>Синхронізувати</target>
<source>Start synchronization</source>
@@ -513,12 +516,12 @@ The command line is executed each time:
<source>Swap sides</source>
<target>ПомінÑти міÑцÑми</target>
-<source>Save current configuration to file</source>
-<target>Зберегти активні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² файлі</target>
-
<source>Load configuration from file</source>
<target>Завантажити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації з файлу</target>
+<source>Save current configuration to file</source>
+<target>Зберегти активні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² файлі</target>
+
<source>Last used configurations (press DEL to remove from list)</source>
<target>
ОÑтанні викориÑтовувані Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації
@@ -531,21 +534,18 @@ The command line is executed each time:
<source>Hide filtered or temporarily excluded files</source>
<target>Приховати відфільтровані чи тимчаÑово виключені файли</target>
-<source>Number of files and directories that will be created</source>
-<target>ЧиÑло файлів Ñ– каталогів, Ñкі будуть Ñтворені</target>
+<source>Number of files and folders that will be created</source>
+<target>КількіÑÑ‚ÑŒ файлів Ñ– папок, Ñкі будуть Ñтворені</target>
<source>Number of files that will be overwritten</source>
-<target>ЧиÑло файлів, Ñкі будуть перезапиÑані</target>
+<target>КількіÑÑ‚ÑŒ файлів, Ñкі будуть перезапиÑані</target>
-<source>Number of files and directories that will be deleted</source>
-<target>ЧиÑло файлів Ñ– каталогів, Ñкі будуть вилучені</target>
+<source>Number of files and folders that will be deleted</source>
+<target>КількіÑÑ‚ÑŒ файлів Ñ– папок, Ñкі будуть вилучені</target>
<source>Total amount of data that will be transferred</source>
<target>Загальний об’єм даних, Ñкі будуть передаватиÑÑ</target>
-<source>Operation:</source>
-<target>ОпераціÑ:</target>
-
<source>Items found:</source>
<target>Елементів знайдено:</target>
@@ -561,8 +561,8 @@ The command line is executed each time:
<source>Batch job</source>
<target>Пакетне завданнÑ</target>
-<source>Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner.</source>
-<target>Створити комакндний файл Ñ– автоматизувати Ñинхронізацію. Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ñ— Ñинхронізації проÑто двічі клацніть файл мишкою або ÑкориÑтайтеÑÑŒ командним Ñ€Ñдком: FreeFileSync.exe <ffs_batch file>. Можна також викориÑтати планувальник завдань операційної ÑиÑтеми</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 <назва завданнÑ>.ffs_batch</target>
<source>Help</source>
<target>Допомога</target>
@@ -588,18 +588,12 @@ The command line is executed each time:
<source>Maximum number of log files:</source>
<target>МакÑимальна кількіÑÑ‚ÑŒ лог-файлів:</target>
-<source>Select log file directory:</source>
-<target>Виберіть каталог Ð´Ð»Ñ Ð»Ð¾Ð³-файлів:</target>
+<source>Select folder to save log files:</source>
+<target>Вибрати папку Ð´Ð»Ñ Ð»Ð¾Ð³-файлу</target>
<source>Batch settings</source>
<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ð³Ð¾ завданнÑ</target>
-<source>&Save</source>
-<target>&Зберегти</target>
-
-<source>&Load</source>
-<target>&Завантажити</target>
-
<source>Select variant:</source>
<target>Виберіть варіант:</target>
@@ -607,7 +601,7 @@ The command line is executed each time:
<target>ВиÑвити та поширити зміни на обидві Ñторони викориÑтовуючи базу даних. ВидаленнÑ, Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° конфлікти визначаютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾.</target>
<source>Mirror backup of left folder. Right folder is modified to exactly match left folder after synchronization.</source>
-<target>Дзеркальна (резервна) ÐºÐ¾Ð¿Ñ–Ñ Ð»Ñ–Ð²Ð¾Ñ— чаÑтини. Ð’ результаті Ñинхронізації права папка змінюєтьÑÑ Ð´Ð¾ полної відповідноÑÑ‚Ñ– лівій.</target>
+<target>Дзеркальна (резервна) ÐºÐ¾Ð¿Ñ–Ñ Ð»Ñ–Ð²Ð¾Ñ— чаÑтини. Ð’ результаті Ñинхронізації права папка змінюєтьÑÑ Ð´Ð¾ повної відповідноÑÑ‚Ñ– лівій.</target>
<source>Copy new or updated files to right folder.</source>
<target>Копіювати нові чи оновлювати файли з правої Ñторони.</target>
@@ -624,29 +618,23 @@ The command line is executed each time:
<source>Configuration</source>
<target>ÐалаштуваннÑ</target>
-<source>Category</source>
-<target>КатегоріÑ</target>
-
-<source>Action</source>
-<target>ДіÑ</target>
+<source>Item exists on left side only</source>
+<target>Елемент Ñ–Ñнує тільки ліворуч</target>
-<source>File/folder exists on left side only</source>
-<target>Файл/папка Ñ–Ñнує тільки ліворуч</target>
+<source>Item exists on right side only</source>
+<target>Елемент Ñ–Ñнує тільки праворуч</target>
-<source>File/folder exists on right side only</source>
-<target>Файл/папка Ñ–Ñнує тільки праворуч</target>
+<source>Left side is newer</source>
+<target>Ліва Ñторона новіша</target>
-<source>Left file is newer</source>
-<target>Файл ліворуч є новішим</target>
+<source>Right side is newer</source>
+<target>Права Ñторона новіша</target>
-<source>Right file is newer</source>
-<target>Файл праворуч є новішим</target>
+<source>Items have different content</source>
+<target>Елементи мають різний вміÑÑ‚</target>
-<source>Files have different content</source>
-<target>Файли відрізнÑÑŽÑ‚ÑŒÑÑ Ð²Ð¼Ñ–Ñтом</target>
-
-<source>Conflict/file cannot be categorized</source>
-<target>Ðе можна категоризувати конфлікт/файл</target>
+<source>Conflict/item cannot be categorized</source>
+<target>Ðе вдаєтьÑÑ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð·ÑƒÐ²Ð°Ñ‚Ð¸ конфлікт/елемент</target>
<source>OK</source>
<target>OK</target>
@@ -749,33 +737,6 @@ Note: File names must be relative to base directories!
Увага: Ðазви файлів вказуютьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ñно базових каталогів.
</target>
-<source>Hints:</source>
-<target>Підказка:</target>
-
-<source>1. Enter relative file or directory names separated by ';' or a new line.</source>
-<target>1. Уведіть імена файлів чи каталогів, розділÑючи знаком ';' чи з нового Ñ€Ñдка.</target>
-
-<source>2. Use wildcard characters '*' and '?'.</source>
-<target>2. ВикориÑтайте Ñимволи '*' Ñ– '?'.</target>
-
-<source>3. Exclude files directly on main grid via context menu.</source>
-<target>3. Виключіть файли безпоÑередньо у головному вікні через контекÑтне меню.</target>
-
-<source>Example</source>
-<target>Приклад</target>
-
-<source>
-Include: *.doc;*.zip;*.exe
-Exclude: \stuff\temp\*
-</source>
-<target>
-Включити: *.doc;*.zip;*.exe
-Виключити: \stuff\temp\*
-</target>
-
-<source>Synchronize all .doc, .zip and .exe files except everything in subfolder "temp".</source>
-<target>Синхронізувати вÑÑ– .doc, .zip Ñ– .exe файли, за винÑтком вÑÑ–Ñ… файлів з подкаталогу "temp"</target>
-
<source>Include</source>
<target>Включити</target>
@@ -797,8 +758,8 @@ Exclude: \stuff\temp\*
<source>&Default</source>
<target>&За замовчуваннÑм</target>
-<source>Transactional file copy</source>
-<target>ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² з викориÑтаннÑм транÑакцій</target>
+<source>Fail-safe file copy</source>
+<target>Безпечне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²</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>ЗапиÑати до тимчаÑового файлу (*.ffs_tmp), а потім перейменувати. Це гарантує Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… навіть при критичній помилці.</target>
@@ -812,8 +773,8 @@ Exclude: \stuff\temp\*
<source>Copy file access permissions</source>
<target>Копіювати права доÑтупу до файлу</target>
-<source>Transfer file and directory permissions (Requires Administrator rights)</source>
-<target>Передача прав доÑтупу файлу/каталогу (потрібні права ÐдмініÑтратора)</target>
+<source>Transfer file and folder permissions (Requires Administrator rights)</source>
+<target>Дозволи переноÑу файлів та папок (Вимагає прав ÐдмініÑтратора)</target>
<source>Restore hidden dialogs</source>
<target>Відновити Ñховані діалоги</target>
@@ -915,7 +876,7 @@ Exclude: \stuff\temp\*
<target>ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації загружено!</target>
<source>Folder Comparison and Synchronization</source>
-<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñ– ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ð°Ð¿Ð¾Ðº</target>
+<target>ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¿Ð°Ð¿Ð¾Ðº</target>
<source>Hide files that exist on left side only</source>
<target>Приховати файли, Ñкі Ñ” тільки ліворуч</target>
@@ -1125,17 +1086,17 @@ Exclude: \stuff\temp\*
<source>Integrate external applications into context menu. The following macros are available:</source>
<target>Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… додатків в контекÑтному меню. ДоÑтупні макроÑи:</target>
-<source>- full file or directory name</source>
-<target>- повне Ñ–Ð¼â€™Ñ Ñ„Ð°Ð¹Ð»Ñƒ чи каталога</target>
+<source>- full file or folder name</source>
+<target>- повна назва файлу або папки</target>
-<source>- directory part only</source>
-<target>- лише каталог</target>
+<source>- folder part only</source>
+<target>- тільки папка</target>
<source>- Other side's counterpart to %name</source>
-<target>- аналогічний файл з другої Ñторони</target>
+<target>- файл-відповідник %name з протилежної Ñторони</target>
<source>- Other side's counterpart to %dir</source>
-<target>- аналогічна папка з другої Ñторони</target>
+<target>- папка-відповідник %dir з протилежної Ñторони</target>
<source>Make hidden dialogs and warning messages visible again?</source>
<target>Зробити приховані діалоги та Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð·Ð½Ð¾Ð²Ñƒ видимими?</target>
@@ -1173,10 +1134,10 @@ Exclude: \stuff\temp\*
<target>ВикориÑтовувати "Корзину" при вилученні чи перезапиÑÑ– файлів</target>
<source>Versioning</source>
-<target>Переміщати файли, Ñкі вилучаютьÑÑ, в задану папку</target>
+<target>Ð—Ð°Ð¿Ð¸Ñ Ð²ÐµÑ€Ñій</target>
-<source>Move files into a time-stamped subdirectory</source>
-<target>Переміщати файли в підкатлог з чаÑовою міткою</target>
+<source>Move files into a time-stamped subfolder</source>
+<target>ПереміÑтити файли в означену датою підпапку</target>
<source>Files</source>
<target>Файли</target>
@@ -1274,8 +1235,8 @@ Exclude: \stuff\temp\*
<source>Cannot read directory %x.</source>
<target>Ðе вдаєтьÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог %x</target>
-<source>Endless loop.</source>
-<target>ÐеÑкінченний цикл.</target>
+<source>Detected endless directory recursion.</source>
+<target>ВиÑвлено неÑкінченну рекурÑÑ–ÑŽ каталогів.</target>
<source>Cannot set privilege %x.</source>
<target>Ðе вдаєтьÑÑ Ð²Ñтановити привілеї %Ñ….</target>
@@ -1304,14 +1265,11 @@ Exclude: \stuff\temp\*
Старі файли будуть замінені новішими файлами.
</target>
-<source>The file does not contain a valid configuration:</source>
-<target>Файл не міÑтить правильних налаштувань Ñинхронізації:</target>
-
-<source>You can ignore this error to consider the directory as empty.</source>
-<target>Ви можете проігнорувати помилку, вважаючи каталог порожнім.</target>
+<source>You can ignore this error to consider the folder as empty.</source>
+<target>Ви можете ігнорувати цю помилку вважаючи папку порожньою.</target>
-<source>Cannot find directory %x.</source>
-<target>Ðе вдаєтьÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ каталог Ñ…%.</target>
+<source>Cannot find folder %x.</source>
+<target>Ðе вдаєтьÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ папку %x.</target>
<source>Directories are dependent! Be careful when setting up synchronization rules:</source>
<target>Залежні каталоги! Будьте уважні при налаштуванні правил Ñинхронізації:</target>
@@ -1343,20 +1301,20 @@ Exclude: \stuff\temp\*
<source>Both sides are equal</source>
<target>Сторони ідентичні</target>
-<source>Files/folders differ in attributes only</source>
-<target>Файли/папки відрізнÑÑŽÑ‚ÑŒÑÑ Ð»Ð¸ÑˆÐµ атрибутами</target>
+<source>Items have different attributes</source>
+<target>Елементи мають різні атрибути</target>
-<source>Copy new file/folder to left</source>
-<target>Зкопіювати новий файл/папку ліворуч</target>
+<source>Copy new item to left</source>
+<target>Копіювати нові елементи ліворуч</target>
-<source>Copy new file/folder to right</source>
-<target>Зкопіювати новий файл/папку праворуч</target>
+<source>Copy new item to right</source>
+<target>Копіювати нові елементи праворуч</target>
-<source>Delete left file/folder</source>
-<target>Вилучити файл/папку ліворуч</target>
+<source>Delete left item</source>
+<target>Вилучити елемент ліворуч</target>
-<source>Delete right file/folder</source>
-<target>Вилучити файл/папку праворуч</target>
+<source>Delete right item</source>
+<target>Вилучити елемент праворуч</target>
<source>Move file on left</source>
<target>ПереміÑтити файли ліворуч</target>
@@ -1364,20 +1322,20 @@ Exclude: \stuff\temp\*
<source>Move file on right</source>
<target>ПереміÑтити файли праворуч</target>
-<source>Overwrite left file/folder with right one</source>
-<target>ПерезапиÑати файл/папку ліворуч відповідником зправа</target>
+<source>Overwrite left item</source>
+<target>ПерезапиÑати елемент ліворуч</target>
-<source>Overwrite right file/folder with left one</source>
-<target>ПерезапиÑати файл/папку праворуч відповідником зліва</target>
+<source>Overwrite right item</source>
+<target>ПерезапиÑати елемент праворуч</target>
<source>Do nothing</source>
<target>Ðічого не робити</target>
-<source>Copy file attributes only to left</source>
-<target>Зкопіювати ліворуч лише атрибути файлу</target>
+<source>Update attributes on left</source>
+<target>Оновити атрибути ліворуч</target>
-<source>Copy file attributes only to right</source>
-<target>Зкопіювати праворуч лише атрибути файлу</target>
+<source>Update attributes on right</source>
+<target>Оновити атрибути праворуч</target>
<source>Multiple...</source>
<target>Різні варіанти...</target>
@@ -1430,11 +1388,11 @@ Exclude: \stuff\temp\*
<source>Updating attributes of %x</source>
<target>ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñ–Ð² %x</target>
-<source>Target directory name must not be empty!</source>
-<target>Кінцевий каталог не повинен бути порожнім</target>
+<source>Target folder name must not be empty.</source>
+<target>Ðазва цільової папки не повинна бути порожньою.</target>
-<source>Directory for file versioning was not supplied!</source>
-<target>Ðе вказаний каталог Ð´Ð»Ñ Ñтарих верÑій файлів!</target>
+<source>Folder name for file versioning must not be empty.</source>
+<target>Ðазва папки Ð´Ð»Ñ Ð²ÐµÑ€Ñій файлів не повинна бути порожньою.</target>
<source>Source directory %x not found.</source>
<target>Вихідний каталог %x не знайдено.</target>
@@ -1463,8 +1421,8 @@ Exclude: \stuff\temp\*
<source>Recycle Bin is not available for the following paths! Files will be deleted permanently instead:</source>
<target>Корзина Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ шлÑху недоÑтупна. Файли будуть вилучені назавжди:</target>
-<source>A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!</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>
diff --git a/BUILD/Resources.zip b/BUILD/Resources.zip
index 2a5cfacd..54e6e657 100644
--- a/BUILD/Resources.zip
+++ b/BUILD/Resources.zip
Binary files differ
diff --git a/BUILD/Sync_Complete.wav b/BUILD/Sync_Complete.wav
index f166cc4b..3fe95e5d 100644
--- a/BUILD/Sync_Complete.wav
+++ b/BUILD/Sync_Complete.wav
Binary files differ
diff --git a/FreeFileSync.cbp b/FreeFileSync.cbp
index 5fce963e..03631460 100644
--- a/FreeFileSync.cbp
+++ b/FreeFileSync.cbp
@@ -205,6 +205,7 @@
<Unit filename="lib\resolve_path.h" />
<Unit filename="lib\resources.cpp" />
<Unit filename="lib\resources.h" />
+ <Unit filename="lib\return_codes.h" />
<Unit filename="lib\shadow.cpp" />
<Unit filename="lib\shadow.h" />
<Unit filename="lib\soft_filter.h" />
diff --git a/Makefile b/Makefile
index 2d9859ee..e981b48a 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@ 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_LINK_FLAGS = -pthread
+COMMON_LINK_FLAGS = -pthread -lrt
#default build
CPPFLAGS = $(COMMON_COMPILE_FLAGS) `wx-config --cxxflags --debug=no --unicode=yes`
diff --git a/RealtimeSync/RealtimeSync.cbp b/RealtimeSync/RealtimeSync.cbp
index 1a9469a8..97ce1a5b 100644
--- a/RealtimeSync/RealtimeSync.cbp
+++ b/RealtimeSync/RealtimeSync.cbp
@@ -127,7 +127,7 @@
<Unit filename="..\zen\notify_removal.cpp" />
<Unit filename="..\zen\privilege.cpp" />
<Unit filename="..\zen\zstring.cpp" />
- <Unit filename="WxWizDialog.fbp" />
+ <Unit filename="WxWizFrame.fbp" />
<Unit filename="application.cpp" />
<Unit filename="application.h" />
<Unit filename="gui_generated.cpp" />
diff --git a/RealtimeSync/application.cpp b/RealtimeSync/application.cpp
index 4c477ce0..e756675e 100644
--- a/RealtimeSync/application.cpp
+++ b/RealtimeSync/application.cpp
@@ -52,7 +52,7 @@ void Application::OnStartApplication(wxIdleEvent& event)
::SetErrorMode(SEM_FAILCRITICALERRORS);
#elif defined FFS_LINUX
- ::gtk_rc_parse((zen::utf8CvrtTo<std::string>(zen::getResourceDir()) + "styles.rc").c_str()); //remove inner border from bitmap buttons
+ ::gtk_rc_parse((zen::getResourceDir() + "styles.rc").c_str()); //remove inner border from bitmap buttons
#endif
//set program language
@@ -105,9 +105,9 @@ int Application::OnRun()
{
//it's not always possible to display a message box, e.g. corrupted stack, however (non-stream) file output works!
wxFile safeOutput(toWx(getConfigDir()) + L"LastError.txt", wxFile::write);
- safeOutput.Write(utf8CvrtTo<wxString>(e.what()));
+ safeOutput.Write(utfCvrtTo<wxString>(e.what()));
- wxSafeShowMessage(_("An exception occurred!") + L" - RTS", utf8CvrtTo<wxString>(e.what()));
+ wxSafeShowMessage(_("An exception occurred!") + L" - RTS", utfCvrtTo<wxString>(e.what()));
return -9;
}
catch (...) //catch the rest
@@ -121,6 +121,6 @@ int Application::OnRun()
return -9;
}
- return 0; //program's return value
+ return 0; //program's return code
}
diff --git a/RealtimeSync/gui_generated.cpp b/RealtimeSync/gui_generated.cpp
index 9bcbda52..8d656e74 100644
--- a/RealtimeSync/gui_generated.cpp
+++ b/RealtimeSync/gui_generated.cpp
@@ -11,25 +11,25 @@
MainDlgGenerated::MainDlgGenerated( 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( 420,440 ), wxDefaultSize );
+ this->SetSizeHints( wxSize( 420,350 ), wxDefaultSize );
m_menubar1 = new wxMenuBar( 0 );
m_menuFile = new wxMenu();
- wxMenuItem* m_menuItem14;
- m_menuItem14 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration...") ) + wxT('\t') + wxT("CTRL+S"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItem14 );
-
wxMenuItem* m_menuItem13;
- m_menuItem13 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration...") ) + wxT('\t') + wxT("CTRL+L"), wxEmptyString, wxITEM_NORMAL );
+ m_menuItem13 = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("CTRL+O"), wxEmptyString, wxITEM_NORMAL );
m_menuFile->Append( m_menuItem13 );
+ wxMenuItem* m_menuItem14;
+ m_menuItem14 = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save...") ) + wxT('\t') + wxT("CTRL+S"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItem14 );
+
m_menuFile->AppendSeparator();
wxMenuItem* m_menuItem4;
- m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("CTRL+Q"), wxEmptyString, wxITEM_NORMAL );
+ m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) , wxEmptyString, wxITEM_NORMAL );
m_menuFile->Append( m_menuItem4 );
- m_menubar1->Append( m_menuFile, _("&File") );
+ m_menubar1->Append( m_menuFile, _("&Program") );
m_menuHelp = new wxMenu();
wxMenuItem* m_menuItemContent;
@@ -38,7 +38,7 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
m_menuHelp->AppendSeparator();
- m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("SHIFT+F1"), wxEmptyString, wxITEM_NORMAL );
+ m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("SHIFT+F1"), wxEmptyString, wxITEM_NORMAL );
m_menuHelp->Append( m_menuItemAbout );
m_menubar1->Append( m_menuHelp, _("&Help") );
@@ -51,13 +51,13 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL );
-
- bSizer1->Add( 0, 5, 0, 0, 5 );
+ wxBoxSizer* bSizer13;
+ bSizer13 = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* sbSizer41;
sbSizer41 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Usage:") ), wxVERTICAL );
- m_staticText3 = new wxStaticText( m_panelMain, wxID_ANY, _("1. Select directories to monitor."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText3 = new wxStaticText( m_panelMain, wxID_ANY, _("1. Select folders to watch."), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText3->Wrap( -1 );
sbSizer41->Add( m_staticText3, 0, wxLEFT, 10 );
@@ -70,19 +70,21 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
sbSizer41->Add( m_staticText5, 0, wxLEFT, 10 );
- sbSizer41->Add( 0, 15, 0, 0, 5 );
+ bSizer13->Add( sbSizer41, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 );
- m_staticText21 = new wxStaticText( m_panelMain, wxID_ANY, _("The command line is executed each time:\n- all directories become available (e.g. USB stick insert)\n- files within these directories or subdirectories are modified"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText21->Wrap( -1 );
- sbSizer41->Add( m_staticText21, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 );
+ m_staticText811 = new wxStaticText( m_panelMain, wxID_ANY, _("To get started just import a .ffs_batch file."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText811->Wrap( -1 );
+ m_staticText811->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
+ bSizer13->Add( m_staticText811, 0, wxLEFT, 20 );
- bSizer1->Add( sbSizer41, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 20 );
+
+ bSizer1->Add( bSizer13, 0, wxEXPAND|wxRIGHT|wxLEFT, 20 );
m_staticline2 = new wxStaticLine( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer1->Add( m_staticline2, 0, wxTOP|wxBOTTOM|wxEXPAND, 10 );
+ bSizer1->Add( m_staticline2, 0, wxEXPAND|wxTOP|wxBOTTOM, 10 );
- sbSizerDirToWatch2 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Directories to watch") ), wxVERTICAL );
+ sbSizerDirToWatch2 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Folders to watch") ), wxVERTICAL );
m_panelMainFolder = new wxPanel( m_panelMain, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
wxBoxSizer* bSizer10;
@@ -144,26 +146,28 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
bSizer1->Add( sbSizerDirToWatch2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
- wxStaticBoxSizer* sbSizer3;
- sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Command line") ), wxVERTICAL );
-
- m_textCtrlCommand = new wxTextCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
- sbSizer3->Add( m_textCtrlCommand, 0, wxEXPAND|wxBOTTOM, 5 );
-
-
- bSizer1->Add( sbSizer3, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
-
wxStaticBoxSizer* sbSizer4;
- sbSizer4 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Minimum Idle Time [seconds]") ), wxVERTICAL );
+ sbSizer4 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Delay [seconds]") ), wxVERTICAL );
m_spinCtrlDelay = new wxSpinCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 2000000000, 0 );
- m_spinCtrlDelay->SetToolTip( _("Idle time between detection of last change and execution of command line in seconds") );
+ m_spinCtrlDelay->SetToolTip( _("Idle time between last detected change and execution of command") );
sbSizer4->Add( m_spinCtrlDelay, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
bSizer1->Add( sbSizer4, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+ wxStaticBoxSizer* sbSizer3;
+ sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_panelMain, wxID_ANY, _("Command line") ), wxVERTICAL );
+
+ m_textCtrlCommand = new wxTextCtrl( m_panelMain, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ m_textCtrlCommand->SetToolTip( _("The command is triggered if:\n- files or subfolders change\n- new folders arrive (e.g. USB stick insert)") );
+
+ sbSizer3->Add( m_textCtrlCommand, 0, wxEXPAND, 5 );
+
+
+ bSizer1->Add( sbSizer3, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
m_buttonStart = new zen::BitmapButton( m_panelMain, wxID_OK, _("Start"), wxDefaultPosition, wxSize( -1,40 ), 0 );
m_buttonStart->SetDefault();
m_buttonStart->SetFont( wxFont( 14, 74, 90, 92, false, wxT("Arial Black") ) );
@@ -186,8 +190,8 @@ MainDlgGenerated::MainDlgGenerated( wxWindow* parent, wxWindowID id, const wxStr
// Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDlgGenerated::OnClose ) );
- this->Connect( m_menuItem14->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnSaveConfig ) );
this->Connect( m_menuItem13->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnLoadConfig ) );
+ this->Connect( m_menuItem14->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnSaveConfig ) );
this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnQuit ) );
this->Connect( m_menuItemContent->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnShowHelp ) );
this->Connect( m_menuItemAbout->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnMenuAbout ) );
@@ -201,8 +205,8 @@ MainDlgGenerated::~MainDlgGenerated()
{
// Disconnect Events
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDlgGenerated::OnClose ) );
- this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnSaveConfig ) );
- this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnLoadConfig ) );
+ this->Disconnect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnLoadConfig ) );
+ this->Disconnect( wxID_SAVE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnSaveConfig ) );
this->Disconnect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnQuit ) );
this->Disconnect( wxID_HELP, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnShowHelp ) );
this->Disconnect( wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDlgGenerated::OnMenuAbout ) );
@@ -250,6 +254,7 @@ FolderGenerated::~FolderGenerated()
ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxSize( 300,160 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer24;
bSizer24 = new wxBoxSizer( wxVERTICAL );
@@ -260,37 +265,51 @@ ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
wxBoxSizer* bSizer26;
bSizer26 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 );
- bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer26->Add( m_bitmap10, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
- m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY );
- m_textCtrl8->SetBackgroundColour( wxColour( 224, 224, 224 ) );
-
- bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
+ m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,150 ), wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer26->Add( m_textCtrl8, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+ m_staticline2 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline2, 0, wxEXPAND|wxTOP, 5 );
+
+ m_panel3 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel3->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer13;
+ bSizer13 = new wxBoxSizer( wxVERTICAL );
+
wxBoxSizer* bSizer25;
bSizer25 = new wxBoxSizer( wxHORIZONTAL );
- m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonRetry = new wxButton( m_panel3, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonRetry->SetDefault();
m_buttonRetry->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonRetry, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
- m_buttonAbort = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonAbort = new wxButton( m_panel3, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
- bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer13->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ m_panel3->SetSizer( bSizer13 );
+ m_panel3->Layout();
+ bSizer13->Fit( m_panel3 );
+ bSizer24->Add( m_panel3, 0, wxEXPAND, 5 );
this->SetSizer( bSizer24 );
this->Layout();
+ bSizer24->Fit( this );
this->Centre( wxBOTH );
diff --git a/RealtimeSync/gui_generated.h b/RealtimeSync/gui_generated.h
index 1989653f..50ffea2b 100644
--- a/RealtimeSync/gui_generated.h
+++ b/RealtimeSync/gui_generated.h
@@ -58,7 +58,7 @@ protected:
wxStaticText* m_staticText3;
wxStaticText* m_staticText4;
wxStaticText* m_staticText5;
- wxStaticText* m_staticText21;
+ wxStaticText* m_staticText811;
wxStaticLine* m_staticline2;
wxStaticBoxSizer* sbSizerDirToWatch2;
wxPanel* m_panelMainFolder;
@@ -68,15 +68,15 @@ protected:
wxTextCtrl* m_txtCtrlDirectoryMain;
wxScrolledWindow* m_scrolledWinFolders;
wxBoxSizer* bSizerFolders;
- wxTextCtrl* m_textCtrlCommand;
wxSpinCtrl* m_spinCtrlDelay;
+ wxTextCtrl* m_textCtrlCommand;
zen::BitmapButton* m_buttonStart;
wxButton* m_buttonCancel;
// Virtual event handlers, overide them in your derived class
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
- virtual void OnSaveConfig( wxCommandEvent& event ) { event.Skip(); }
virtual void OnLoadConfig( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSaveConfig( wxCommandEvent& event ) { event.Skip(); }
virtual void OnQuit( wxCommandEvent& event ) { event.Skip(); }
virtual void OnShowHelp( wxCommandEvent& event ) { event.Skip(); }
virtual void OnMenuAbout( wxCommandEvent& event ) { event.Skip(); }
@@ -123,6 +123,8 @@ private:
protected:
wxStaticBitmap* m_bitmap10;
wxTextCtrl* m_textCtrl8;
+ wxStaticLine* m_staticline2;
+ wxPanel* m_panel3;
wxButton* m_buttonRetry;
wxButton* m_buttonAbort;
@@ -134,7 +136,7 @@ protected:
public:
- ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 460,250 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
+ ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
~ErrorDlgGenerated();
};
diff --git a/RealtimeSync/main_dlg.cpp b/RealtimeSync/main_dlg.cpp
index dfb1a85e..40852056 100644
--- a/RealtimeSync/main_dlg.cpp
+++ b/RealtimeSync/main_dlg.cpp
@@ -44,12 +44,10 @@ MainDialog::MainDialog(wxDialog* dlg, const wxString& cfgFileName)
//prepare drag & drop
dirNameFirst.reset(new DirectoryName<wxTextCtrl>(*m_panelMainFolder, *m_dirPickerMain, *m_txtCtrlDirectoryMain, m_staticTextFinalPath));
-
#ifdef FFS_WIN
new MouseMoveWindow(*this); //ownership passed to "this"
#endif
-
//--------------------------- load config values ------------------------------------
xmlAccess::XmlRealConfig newConfig;
@@ -120,11 +118,7 @@ const wxString& MainDialog::lastConfigFileName()
void MainDialog::OnShowHelp(wxCommandEvent& event)
{
-#ifdef FFS_WIN
- zen::displayHelpEntry(wxT("html\\RealtimeSync.html"));
-#elif defined FFS_LINUX
- zen::displayHelpEntry(wxT("html/RealtimeSync.html"));
-#endif
+ zen::displayHelpEntry(L"html/RealtimeSync.html");
}
@@ -166,7 +160,7 @@ void MainDialog::OnStart(wxCommandEvent& event)
Hide();
- switch (rts::startDirectoryMonitor(currentCfg, xmlAccess::extractJobName(currentConfigFileName)))
+ switch (rts::startDirectoryMonitor(currentCfg, xmlAccess::extractJobName(utfCvrtTo<Zstring>(currentConfigFileName))))
{
case rts::EXIT_APP:
Close();
@@ -188,8 +182,8 @@ void MainDialog::OnSaveConfig(wxCommandEvent& event)
wxFileDialog filePicker(this, wxEmptyString, wxEmptyString, defaultFileName,
- _("RealtimeSync configuration") + L" (*.ffs_real)|*.ffs_real",
- wxFD_SAVE /*| wxFD_OVERWRITE_PROMPT*/);
+ wxString(L"RealtimeSync (*.ffs_real)|*.ffs_real") + L"|" +_("All files") + L" (*.*)|*",
+ wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
if (filePicker.ShowModal() != wxID_OK)
return;
@@ -252,7 +246,7 @@ void MainDialog::setLastUsedConfig(const wxString& filename)
void MainDialog::OnLoadConfig(wxCommandEvent& event)
{
wxFileDialog filePicker(this, wxEmptyString, wxEmptyString, wxEmptyString,
- _("RealtimeSync configuration") + L" (*.ffs_real;*.ffs_batch)|*.ffs_real;*.ffs_batch",
+ wxString(L"RealtimeSync (*.ffs_real;*.ffs_batch)|*.ffs_real;*.ffs_batch") + L"|" +_("All files") + L" (*.*)|*",
wxFD_OPEN);
if (filePicker.ShowModal() == wxID_OK)
loadConfig(filePicker.GetPath());
diff --git a/RealtimeSync/makefile b/RealtimeSync/makefile
index c92e2052..9f0ae16a 100644
--- a/RealtimeSync/makefile
+++ b/RealtimeSync/makefile
@@ -3,7 +3,7 @@ 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_LINK_FLAGS = -pthread
+COMMON_LINK_FLAGS = -pthread -lrt
#default build
CPPFLAGS = $(COMMON_COMPILE_FLAGS) `wx-config --cxxflags --debug=no --unicode=yes`
diff --git a/RealtimeSync/tray_menu.cpp b/RealtimeSync/tray_menu.cpp
index 4afef5e4..942a6100 100644
--- a/RealtimeSync/tray_menu.cpp
+++ b/RealtimeSync/tray_menu.cpp
@@ -66,7 +66,7 @@ private:
wxMenu* contextMenu = new wxMenu;
contextMenu->Append(CONTEXT_RESTORE, _("&Restore"));
- contextMenu->Append(CONTEXT_ABOUT, _("&About..."));
+ contextMenu->Append(CONTEXT_ABOUT, _("&About"));
contextMenu->AppendSeparator();
contextMenu->Append(CONTEXT_ABORT, _("&Exit"));
//event handling
@@ -206,7 +206,7 @@ public:
void clearSchedule() { nextSyncStart_ = std::numeric_limits<long>::max(); }
//implement WaitCallback
- virtual void requestUiRefresh() //throw StartSyncNowException, AbortMonitoring
+ virtual void requestUiRefresh(bool readyForSync) //throw StartSyncNowException, AbortMonitoring
{
if (resumeRequested)
throw AbortMonitoring(SHOW_GUI);
@@ -214,8 +214,9 @@ public:
if (abortRequested)
throw AbortMonitoring(EXIT_APP);
- if (nextSyncStart_ <= wxGetLocalTime())
- throw StartSyncNowException(); //abort wait and start sync
+ if (readyForSync)
+ if (nextSyncStart_ <= wxGetLocalTime())
+ throw StartSyncNowException(); //abort wait and start sync
if (updateUiIsAllowed())
trayIcon.doUiRefreshNow();
@@ -252,6 +253,8 @@ public:
timer.Connect(wxEVT_TIMER, wxEventHandler(ErrorDlgWithTimeout::OnTimerEvent), nullptr, this);
timer.Start(1000); //timer interval in ms
updateButtonLabel();
+
+ Fit(); //child-element widths have changed: image was set
}
enum ButtonPressed
@@ -325,12 +328,12 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf
if (cmdLine.empty())
{
- wxMessageBox(replaceCpy(_("Invalid command line: %x"), L"%x", L"\"\""), _("Error"), wxOK | wxICON_ERROR);
+ wxMessageBox(_("Invalid command line:") + L" \"\"", _("Error"), wxOK | wxICON_ERROR);
return SHOW_GUI;
}
if (dirList.empty() || std::any_of(dirList.begin(), dirList.end(), [](Zstring str) -> bool { trim(str); return str.empty(); }))
{
- wxMessageBox(_("A directory input field is empty."), _("Error"), wxOK | wxICON_ERROR);
+ wxMessageBox(_("An input folder name is empty."), _("Error"), wxOK | wxICON_ERROR);
return SHOW_GUI;
}
@@ -341,13 +344,12 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf
auto execMonitoring = [&] //throw FileError, AbortMonitoring
{
- callback.clearSchedule();
-
callback.notifyDirectoryMissing();
+ callback.clearSchedule();
waitForMissingDirs(dirList, callback); //throw FileError, StartSyncNowException(not scheduled yet), AbortMonitoring
callback.notifyAllDirectoriesExist();
- //schedule initial execution only AFTER waitForMissingDirs(), else StartSyncNowException might be thrown while directory checking hangs
+ //schedule initial execution (*after* all directories have arrived, which could take some time which we don't want to include)
callback.scheduleNextSync(wxGetLocalTime() + static_cast<long>(config.delay));
while (true)
@@ -361,9 +363,8 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf
switch (res.type)
{
case CHANGE_DIR_MISSING: //don't execute the commandline before all directories are available!
- callback.clearSchedule();
-
callback.notifyDirectoryMissing();
+ callback.clearSchedule();
waitForMissingDirs(dirList, callback); //throw FileError, StartSyncNowException(not scheduled yet), AbortMonitoring
callback.notifyAllDirectoriesExist();
break;
@@ -377,7 +378,7 @@ rts::AbortReason rts::startDirectoryMonitor(const xmlAccess::XmlRealConfig& conf
}
catch (StartSyncNowException&) {}
- ::wxSetEnv(L"changed_file", utf8CvrtTo<wxString>(lastFileChanged)); //some way to output what file changed to the user
+ ::wxSetEnv(L"changed_file", utfCvrtTo<wxString>(lastFileChanged)); //some way to output what file changed to the user
lastFileChanged.clear(); //make sure old name is not shown again after a directory reappears
//execute command
diff --git a/RealtimeSync/watcher.cpp b/RealtimeSync/watcher.cpp
index ee56bc7c..301c9c64 100644
--- a/RealtimeSync/watcher.cpp
+++ b/RealtimeSync/watcher.cpp
@@ -12,14 +12,15 @@
#include <zen/dir_watcher.h>
#include <zen/thread.h>
#include <zen/assert_static.h>
+#include <zen/tick_count.h>
#include <wx+/string_conv.h>
-#include <wx/timer.h>
#include "../lib/resolve_path.h"
//#include "../library/db_file.h" //SYNC_DB_FILE_ENDING -> complete file too much of a dependency; file ending too little to decouple into single header
//#include "../library/lock_holder.h" //LOCK_FILE_ENDING
using namespace zen;
+
namespace
{
const std::int64_t TICKS_UPDATE_INTERVAL = rts::UI_UPDATE_INTERVAL* ticksPerSec() / 1000;
@@ -40,7 +41,7 @@ bool rts::updateUiIsAllowed()
namespace
{
-const int CHECK_DIR_INTERVAL = 1000; //1 second interval
+const int CHECK_DIR_INTERVAL = 1; //unit: [s]
std::vector<Zstring> getFormattedDirs(const std::vector<Zstring>& dirs) //throw FileError
@@ -59,7 +60,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNamesNonFmt,
{
const std::vector<Zstring> dirNamesFmt = getFormattedDirs(dirNamesNonFmt); //throw FileError
if (dirNamesFmt.empty()) //pathological case, but check is needed nevertheless
- throw zen::FileError(_("A directory input field is empty.")); //should have been checked by caller!
+ throw zen::FileError(_("An input folder name is empty.")); //should have been checked by caller!
//detect when volumes are removed/are not available anymore
std::vector<std::pair<Zstring, std::shared_ptr<DirWatcher>>> watches;
@@ -76,7 +77,6 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNamesNonFmt,
if (!ftDirExists.get())
return WaitResult(CHANGE_DIR_MISSING, dirnameFmt);
-
watches.push_back(std::make_pair(dirnameFmt, std::make_shared<DirWatcher>(dirnameFmt))); //throw FileError, ErrorNotExisting
}
catch (ErrorNotExisting&) //nice atomic behavior: *no* second directory existence check!!!
@@ -91,15 +91,16 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNamesNonFmt,
}
}
- wxLongLong lastCheck;
+ const std::int64_t TICKS_DIR_CHECK_INTERVAL = CHECK_DIR_INTERVAL * ticksPerSec(); //0 on error
+ TickVal lastCheck = getTicks(); //0 on error
while (true)
{
- const bool checkDirExistNow = [&lastCheck]() -> bool //checking once per sec should suffice
+ const bool checkDirExistNow = [&]() -> bool //checking once per sec should suffice
{
- const wxLongLong current = wxGetLocalTimeMillis();
- if (current - lastCheck >= CHECK_DIR_INTERVAL)
+ const TickVal now = getTicks(); //0 on error
+ if (now - lastCheck >= TICKS_DIR_CHECK_INTERVAL)
{
- lastCheck = current;
+ lastCheck = now;
return true;
}
return false;
@@ -151,7 +152,7 @@ rts::WaitResult rts::waitForChanges(const std::vector<Zstring>& dirNamesNonFmt,
}
boost::this_thread::sleep(boost::posix_time::milliseconds(rts::UI_UPDATE_INTERVAL));
- statusHandler.requestUiRefresh();
+ statusHandler.requestUiRefresh(true); //throw ?: may start sync at this presumably idle time
}
}
@@ -190,8 +191,8 @@ void rts::waitForMissingDirs(const std::vector<Zstring>& dirNamesNonFmt, WaitCal
return;
//wait some time...
- assert_static(CHECK_DIR_INTERVAL % UI_UPDATE_INTERVAL == 0);
- for (int i = 0; i < CHECK_DIR_INTERVAL / UI_UPDATE_INTERVAL; ++i)
+ assert_static(1000 * CHECK_DIR_INTERVAL % UI_UPDATE_INTERVAL == 0);
+ for (int i = 0; i < 1000 * CHECK_DIR_INTERVAL / UI_UPDATE_INTERVAL; ++i)
{
boost::this_thread::sleep(boost::posix_time::milliseconds(UI_UPDATE_INTERVAL));
statusHandler.requestUiRefresh();
diff --git a/RealtimeSync/watcher.h b/RealtimeSync/watcher.h
index 17252535..6d68d5be 100644
--- a/RealtimeSync/watcher.h
+++ b/RealtimeSync/watcher.h
@@ -22,7 +22,7 @@ class WaitCallback
{
public:
virtual ~WaitCallback() {}
- virtual void requestUiRefresh() = 0; //opportunity to abort must be implemented in a frequently executed method like requestUiRefresh()
+ virtual void requestUiRefresh(bool readyForSync = false) = 0; //opportunity to abort must be implemented in a frequently executed method like requestUiRefresh()
};
@@ -45,7 +45,7 @@ WaitResult waitForChanges(const std::vector<Zstring>& dirNamesNonFmt,
//non-formatted dirnames that yet require call to getFormattedDirectoryName(); empty directories must be checked by caller!
WaitCallback& statusHandler); //throw FileError
-//wait until all directories become available (again)
+//wait until all directories become available (again) + logs in network share
void waitForMissingDirs(const std::vector<Zstring>& dirNamesNonFmt,
WaitCallback& statusHandler); //throw FileError
}
diff --git a/RealtimeSync/xml_proc.cpp b/RealtimeSync/xml_proc.cpp
index 891cb2df..b804ba72 100644
--- a/RealtimeSync/xml_proc.cpp
+++ b/RealtimeSync/xml_proc.cpp
@@ -38,9 +38,6 @@ bool isXmlTypeRTS(const XmlDoc& doc) //throw()
void xmlAccess::readRealConfig(const Zstring& filename, XmlRealConfig& config)
{
- if (!fileExists(filename))
- throw FfsXmlError(replaceCpy(_("Cannot find file %x."), L"%x", fmtFileName(filename)));
-
XmlDoc doc;
loadXmlDocument(filename, doc); //throw FfsXmlError
diff --git a/algorithm.cpp b/algorithm.cpp
index 498539ad..771fcaea 100644
--- a/algorithm.cpp
+++ b/algorithm.cpp
@@ -510,7 +510,7 @@ private:
}
//----------------------------------------------------------------------
- //##################### schedule potentially existing temporary files for deletion ####################
+ //##################### schedule old temporary files for deletion ####################
if (cat == FILE_LEFT_SIDE_ONLY && endsWith(fileObj.getShortName<LEFT_SIDE>(), zen::TEMP_FILE_ENDING))
{
fileObj.setSyncDir(SYNC_DIR_LEFT);
@@ -521,7 +521,7 @@ private:
fileObj.setSyncDir(SYNC_DIR_RIGHT);
return;
}
- //#####################################################################################################
+ //####################################################################################
/*
if (filterFileConflictFound(fileObj.getObjRelativeName()))
@@ -956,11 +956,11 @@ void zen::setSyncDirectionRec(SyncDirection newDirection, FileSystemObject& fsOb
}
virtual void visit(const SymLinkMapping& linkObj)
{
- dirSetter_(const_cast<SymLinkMapping&>(linkObj)); //phyiscal object is not const in this method anyway
+ dirSetter_(const_cast<SymLinkMapping&>(linkObj)); //
}
virtual void visit(const DirMapping& dirObj)
{
- dirSetter_(const_cast<DirMapping&>(dirObj)); //phyiscal object is not const in this method anyway
+ dirSetter_(const_cast<DirMapping&>(dirObj)); //
}
private:
const SetNewDirection& dirSetter_;
@@ -1343,13 +1343,13 @@ std::pair<wxString, int> zen::deleteFromGridAndHDPreview(const std::vector<FileS
{
if (!fsObj->isEmpty<LEFT_SIDE>())
{
- filesToDelete += utf8CvrtTo<zxString>(fsObj->getFullName<LEFT_SIDE>()) + L'\n';
+ filesToDelete += utfCvrtTo<zxString>(fsObj->getFullName<LEFT_SIDE>()) + L'\n';
++totalDelCount;
}
if (!fsObj->isEmpty<RIGHT_SIDE>())
{
- filesToDelete += utf8CvrtTo<zxString>(fsObj->getFullName<RIGHT_SIDE>()) + L'\n';
+ filesToDelete += utfCvrtTo<zxString>(fsObj->getFullName<RIGHT_SIDE>()) + L'\n';
++totalDelCount;
}
@@ -1363,7 +1363,7 @@ std::pair<wxString, int> zen::deleteFromGridAndHDPreview(const std::vector<FileS
{
if (!fsObj->isEmpty<LEFT_SIDE>())
{
- filesToDelete += utf8CvrtTo<zxString>(fsObj->getFullName<LEFT_SIDE>()) + L'\n';
+ filesToDelete += utfCvrtTo<zxString>(fsObj->getFullName<LEFT_SIDE>()) + L'\n';
++totalDelCount;
}
});
@@ -1373,7 +1373,7 @@ std::pair<wxString, int> zen::deleteFromGridAndHDPreview(const std::vector<FileS
{
if (!fsObj->isEmpty<RIGHT_SIDE>())
{
- filesToDelete += utf8CvrtTo<zxString>(fsObj->getFullName<RIGHT_SIDE>()) + L'\n';
+ filesToDelete += utfCvrtTo<zxString>(fsObj->getFullName<RIGHT_SIDE>()) + L'\n';
++totalDelCount;
}
});
@@ -1555,149 +1555,3 @@ void zen::deleteFromGridAndHD(const std::vector<FileSystemObject*>& rowsToDelete
useRecycleBin,
statusHandler);
}
-
-
-//############################################################################################################
-/*Statistical theory: detect daylight saving time (DST) switch by comparing files that exist on both sides (and have same filesizes). If there are "enough"
-that have a shift by +-1h then assert that DST switch occurred.
-What is "enough" =: N? N should be large enough AND small enough that the following two errors remain small:
-
-Error 1: A DST switch is detected although there was none
-Error 2: A DST switch is not detected although it took place
-
-Error 1 results in lower bound, error 2 in upper bound for N.
-
-Target: Choose N such that probability of error 1 and error 2 is lower than 0.001 (0.1%)
-
-Definitions:
-p1: probability that a file with same filesize on both sides was changed nevertheless
-p2: probability that a changed file has +1h shift in filetime due to a change
-
-M: number of files with same filesize on both sides in total
-N: number of files with same filesize and time-diff +1h when DST check shall detect "true"
-
-X: number of files with same filesize that have a +1h difference after change
-
-Error 1 ("many files have +1h shift by chance") imposes:
-Probability of error 1: (binomial distribution)
-
-P(X >= N) = 1 - P(X <= N - 1) =
-1 - sum_i=0^N-1 p3^i * (1 - p3)^(M - i) (M above i) shall be <= 0.0005
-
-with p3 := p1 * p2
-
-Probability of error 2 also will be <= 0.0005 if we choose N as lowest number that satisfies the preceding formula. Proof is left to the reader.
-
-The function M |-> N behaves almost linearly and can be empirically approximated by:
-
-N(M) =
-
-2 for 0 <= M <= 500
-125/1000000 * M + 5 for 500 < M <= 50000
-77/1000000 * M + 10 for 50000 < M <= 400000
-60/1000000 * M + 35 for 400000 < M
-
-
-#ifdef FFS_WIN
-unsigned int getThreshold(const unsigned filesWithSameSizeTotal)
-{
- if (filesWithSameSizeTotal <= 500)
- return 2;
- else if (filesWithSameSizeTotal <= 50000)
- return unsigned(125.0/1000000 * filesWithSameSizeTotal + 5.0);
- else if (filesWithSameSizeTotal <= 400000)
- return unsigned(77.0/1000000 * filesWithSameSizeTotal + 10.0);
- else
- return unsigned(60.0/1000000 * filesWithSameSizeTotal + 35.0);
-}
-
-
-void zen::checkForDSTChange(const FileCompareResult& gridData,
- const std::vector<FolderPair>& directoryPairsFormatted,
- int& timeShift, wxString& driveName)
-{
- driveName.Clear();
- timeShift = 0;
-
- TIME_ZONE_INFORMATION dummy;
- DWORD rv = GetTimeZoneInformation(&dummy);
- if (rv == TIME_ZONE_ID_UNKNOWN) return;
- bool dstActive = rv == TIME_ZONE_ID_DAYLIGHT;
-
- for (std::vector<FolderPair>::const_iterator i = directoryPairsFormatted.begin(); i != directoryPairsFormatted.end(); ++i)
- {
- bool leftDirIsFat = isFatDrive(i->leftDirectory);
- bool rightDirIsFat = isFatDrive(i->rightDirectory);
-
- if (leftDirIsFat || rightDirIsFat)
- {
- unsigned int filesTotal = 0; //total number of files (with same size on both sides)
- unsigned int plusOneHourCount = 0; //number of files with +1h time shift
- unsigned int minusOneHourCount = 0; // "
-
- for (FileCompareResult::const_iterator j = gridData.begin(); j != gridData.end(); ++j)
- {
- const FileDescrLine& leftFile = j->fileDescrLeft;
- const FileDescrLine& rightFile = j->fileDescrRight;
-
- if (leftFile.objType == FileDescrLine::TYPE_FILE && rightFile.objType == FileDescrLine::TYPE_FILE &&
- leftFile.fileSize == rightFile.fileSize &&
- leftFile.directory.CmpNoCase(i->leftDirectory.c_str()) == 0 && //Windows does NOT distinguish between upper/lower-case
- rightFile.directory.CmpNoCase(i->rightDirectory.c_str()) == 0) //
- {
- ++filesTotal;
-
- if (sameFileTime(leftFile.lastWriteTimeRaw - 3600, rightFile.lastWriteTimeRaw))
- ++plusOneHourCount;
- else if (sameFileTime(leftFile.lastWriteTimeRaw + 3600, rightFile.lastWriteTimeRaw))
- ++minusOneHourCount;
- }
- }
-
- unsigned int threshold = getThreshold(filesTotal);
- if (plusOneHourCount >= threshold)
- {
- if (dstActive)
- {
- if (rightDirIsFat) //it should be FAT; else this were some kind of error
- {
- timeShift = 3600;
- driveName = getDriveName(i->rightDirectory);
- }
- }
- else
- {
- if (leftDirIsFat) //it should be FAT; else this were some kind of error
- {
- timeShift = -3600;
- driveName = getDriveName(i->leftDirectory);
- }
- }
- return;
- }
- else if (minusOneHourCount >= threshold)
- {
- if (dstActive)
- {
- if (leftDirIsFat) //it should be FAT; else this were some kind of error
- {
- timeShift = 3600;
- driveName = getDriveName(i->leftDirectory);
- }
- }
- else
- {
- if (rightDirIsFat) //it should be FAT; else this were some kind of error
- {
- timeShift = -3600;
- driveName = getDriveName(i->rightDirectory);
- }
- }
- return;
- }
- }
- }
-}
-#endif //FFS_WIN
-*/
-
diff --git a/comparison.cpp b/comparison.cpp
index 5b359e38..5940e458 100644
--- a/comparison.cpp
+++ b/comparison.cpp
@@ -56,27 +56,23 @@ namespace
{
void checkForIncompleteInput(const std::vector<FolderPairCfg>& folderPairsForm, ProcessCallback& procCallback)
{
- int partiallyFilledPairs = 0;
- int totallyFilledPairs = 0;
+ bool havePartialPair = false;
+ bool haveFullPair = false;
std::for_each(folderPairsForm.begin(), folderPairsForm.end(),
[&](const FolderPairCfg& fpCfg)
{
if (fpCfg.leftDirectoryFmt.empty() != fpCfg.rightDirectoryFmt.empty())
- ++partiallyFilledPairs;
-
- if (!fpCfg.leftDirectoryFmt.empty() && !fpCfg.rightDirectoryFmt.empty())
- ++totallyFilledPairs;
+ havePartialPair = true;
+ else if (!fpCfg.leftDirectoryFmt.empty())
+ haveFullPair = true;
});
- //check for empty entries
tryReportingError([&]
{
- if ((totallyFilledPairs + partiallyFilledPairs == 0) || //all empty
- (partiallyFilledPairs > 0 && //partial entry is invalid
- !(totallyFilledPairs == 0 && partiallyFilledPairs == 1))) //exception: one partial pair okay: one-dir only scenario
- throw FileError(_("A directory input field is empty.") + L" \n\n" +
- _("You can ignore this error to consider the directory as empty."));
+ if (havePartialPair == haveFullPair) //error if: all empty or exist both full and partial pairs -> support single-dir scenario
+ throw FileError(_("An input folder name is empty.") + L" \n\n" +
+ _("You can ignore this error to consider the folder as empty."));
}, procCallback);
}
@@ -94,8 +90,8 @@ void determineExistentDirs(const std::set<Zstring, LessFilename>& dirnames,
if (tryReportingError([&]
{
if (!dirExistsUpdating(dirname, allowUserInteraction, procCallback))
- throw FileError(replaceCpy(_("Cannot find directory %x."), L"%x", fmtFileName(dirname)) + L"\n\n" +
- _("You can ignore this error to consider the directory as empty."));
+ 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))
dirnamesExisting.insert(dirname);
}
@@ -257,10 +253,10 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi
procCallback_(pcb),
itemsReported(0) {}
- virtual void reportStatus(const std::wstring& statusMsg, int itemTotal)
+ virtual void reportStatus(const std::wstring& statusMsg, int itemsTotal)
{
- procCallback_.updateProcessedData(itemTotal - itemsReported, 0); //processed data is communicated in subfunctions!
- itemsReported = itemTotal;
+ procCallback_.updateProcessedData(itemsTotal - itemsReported, 0); //processed data is communicated in subfunctions!
+ itemsReported = itemsTotal;
procCallback_.reportStatus(statusMsg); //may throw
//procCallback_.requestUiRefresh(); //already called by reportStatus()
@@ -271,14 +267,14 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi
switch (procCallback_.reportError(errorText))
{
case ProcessCallback::IGNORE_ERROR:
- return TRAV_ERROR_IGNORE;
+ return ON_ERROR_IGNORE;
case ProcessCallback::RETRY:
- return TRAV_ERROR_RETRY;
+ return ON_ERROR_RETRY;
}
assert(false);
- return TRAV_ERROR_IGNORE;
+ return ON_ERROR_IGNORE;
}
private:
@@ -339,11 +335,11 @@ void CompareProcess::startCompareProcess(const std::vector<FolderPairCfg>& cfgLi
}
catch (const std::bad_alloc& e)
{
- procCallback.reportFatalError(_("Out of memory!") + L" " + utf8CvrtTo<std::wstring>(e.what()));
+ procCallback.reportFatalError(_("Out of memory!") + L" " + utfCvrtTo<std::wstring>(e.what()));
}
catch (const std::exception& e)
{
- procCallback.reportFatalError(utf8CvrtTo<std::wstring>(e.what()));
+ procCallback.reportFatalError(utfCvrtTo<std::wstring>(e.what()));
}
}
@@ -365,8 +361,8 @@ std::wstring getConflictSameDateDiffSize(const FileMapping& fileObj)
{
return _("Conflict detected:") + L"\n" +
replaceCpy(_("Files %x have the same date but a different size!"), L"%x", fmtFileName(fileObj.getObjRelativeName())) + L"\n\n" +
- L"<-- " + _("Date") + L": " + utcToLocalTimeString(fileObj.getLastWriteTime<LEFT_SIDE >()) + L" " + _("Size") + L": " + toStringSep(fileObj.getFileSize<LEFT_SIDE>()) + L"\n" +
- L"--> " + _("Date") + L": " + utcToLocalTimeString(fileObj.getLastWriteTime<RIGHT_SIDE>()) + L" " + _("Size") + L": " + toStringSep(fileObj.getFileSize<RIGHT_SIDE>());
+ L"<-- " + _("Date") + L": " + utcToLocalTimeString(fileObj.getLastWriteTime<LEFT_SIDE >()) + L" " + _("Size") + L": " + toGuiString(fileObj.getFileSize<LEFT_SIDE>()) + L"\n" +
+ L"--> " + _("Date") + L": " + utcToLocalTimeString(fileObj.getLastWriteTime<RIGHT_SIDE>()) + L" " + _("Size") + L": " + toGuiString(fileObj.getFileSize<RIGHT_SIDE>());
}
}
diff --git a/file_hierarchy.cpp b/file_hierarchy.cpp
index 5a18ddbe..6f0047eb 100644
--- a/file_hierarchy.cpp
+++ b/file_hierarchy.cpp
@@ -6,7 +6,7 @@
#include "file_hierarchy.h"
#include <zen/i18n.h>
-#include <zen/utf8.h>
+#include <zen/utf.h>
#include <zen/file_error.h>
using namespace zen;
@@ -267,21 +267,21 @@ std::wstring zen::getCategoryDescription(CompareFilesResult cmpRes)
switch (cmpRes)
{
case FILE_LEFT_SIDE_ONLY:
- return _("File/folder exists on left side only");
+ return _("Item exists on left side only");
case FILE_RIGHT_SIDE_ONLY:
- return _("File/folder exists on right side only");
+ return _("Item exists on right side only");
case FILE_LEFT_NEWER:
- return _("Left file is newer");
+ return _("Left side is newer");
case FILE_RIGHT_NEWER:
- return _("Right file is newer");
+ return _("Right side is newer");
case FILE_DIFFERENT:
- return _("Files have different content");
+ return _("Items have different content");
case FILE_EQUAL:
return _("Both sides are equal");
case FILE_DIFFERENT_METADATA:
- return _("Files/folders differ in attributes only");
+ return _("Items have different attributes");
case FILE_CONFLICT:
- return _("Conflict/file cannot be categorized");
+ return _("Conflict/item cannot be categorized");
}
assert(false);
return std::wstring();
@@ -303,33 +303,33 @@ std::wstring zen::getSyncOpDescription(SyncOperation op)
switch (op)
{
case SO_CREATE_NEW_LEFT:
- return _("Copy new file/folder to left");
+ return _("Copy new item to left");
case SO_CREATE_NEW_RIGHT:
- return _("Copy new file/folder to right");
+ return _("Copy new item to right");
case SO_DELETE_LEFT:
- return _("Delete left file/folder");
+ return _("Delete left item");
case SO_DELETE_RIGHT:
- return _("Delete right file/folder");
+ return _("Delete right item");
case SO_MOVE_LEFT_SOURCE:
case SO_MOVE_LEFT_TARGET:
- return _("Move file on left");
+ return _("Move file on left"); //move only supported for files
case SO_MOVE_RIGHT_SOURCE:
case SO_MOVE_RIGHT_TARGET:
return _("Move file on right");
case SO_OVERWRITE_LEFT:
- return _("Overwrite left file/folder with right one");
+ return _("Overwrite left item");
case SO_OVERWRITE_RIGHT:
- return _("Overwrite right file/folder with left one");
+ return _("Overwrite right item");
case SO_DO_NOTHING:
return _("Do nothing");
case SO_EQUAL:
return _("Both sides are equal");
case SO_COPY_METADATA_TO_LEFT:
- return _("Copy file attributes only to left");
+ return _("Update attributes on left");
case SO_COPY_METADATA_TO_RIGHT:
- return _("Copy file attributes only to right");
+ return _("Update attributes on right");
case SO_UNRESOLVED_CONFLICT: //not used on GUI, but in .csv
- return _("Conflict/file cannot be categorized");
+ return _("Conflict/item cannot be categorized");
}
assert(false);
return std::wstring();
diff --git a/file_hierarchy.h b/file_hierarchy.h
index 4f1c549a..3a8c079a 100644
--- a/file_hierarchy.h
+++ b/file_hierarchy.h
@@ -208,7 +208,7 @@ private:
SubLinkVec subLinks; //contained symbolic link maps
SubDirVec subDirs; //contained directory maps
- Zstring objRelNamePf;
+ Zstring objRelNamePf; //postfixed or empty
BaseDirMapping& root_;
};
diff --git a/lib/binary.cpp b/lib/binary.cpp
index c01bb4d2..4fc1d408 100644
--- a/lib/binary.cpp
+++ b/lib/binary.cpp
@@ -5,12 +5,15 @@
// **************************************************************************
#include "binary.h"
-#include <wx/stopwatch.h>
+#include <zen/tick_count.h>
#include <vector>
#include <zen/file_io.h>
#include <zen/int64.h>
#include <boost/thread/tss.hpp>
+using namespace zen;
+
+
inline
void setMinSize(std::vector<char>& buffer, size_t minSize)
{
@@ -61,6 +64,9 @@ private:
size_t bufSize;
};
+
+
+const std::int64_t TICKS_PER_SEC = ticksPerSec();
}
@@ -80,33 +86,39 @@ bool zen::filesHaveSameContent(const Zstring& filename1, const Zstring& filename
std::vector<char>& memory2 = *cpyBuf2;
BufferSize bufferSize;
- zen::UInt64 bytesCompared;
+ UInt64 bytesCompared;
- wxLongLong lastDelayViolation = wxGetLocalTimeMillis();
+ TickVal lastDelayViolation = getTicks();
do
{
setMinSize(memory1, bufferSize);
setMinSize(memory2, bufferSize);
- const wxLongLong startTime = wxGetLocalTimeMillis();
+ const TickVal startTime = getTicks();
const size_t length1 = file1.read(&memory1[0], bufferSize); //returns actual number of bytes read; throw FileError()
const size_t length2 = file2.read(&memory2[0], bufferSize); //
- const wxLongLong stopTime = wxGetLocalTimeMillis();
+ const TickVal stopTime = getTicks();
- //-------- dynamically set buffer size to keep callback interval between 200 - 500ms ---------------------
- const wxLongLong loopTime = stopTime - startTime;
- if (loopTime < 200 && stopTime - lastDelayViolation > 2000) //avoid "flipping back": e.g. DVD-Roms read 32MB at once, so first read may be > 300 ms, but second one will be 0ms!
- {
- lastDelayViolation = stopTime;
- bufferSize.inc(); //practically no costs!
- }
- else if (loopTime > 500)
+ //-------- dynamically set buffer size to keep callback interval between 100 - 500ms ---------------------
+ if (TICKS_PER_SEC > 0)
{
- lastDelayViolation = stopTime;
- bufferSize.dec(); //
+ const std::int64_t loopTime = (stopTime - startTime) * 1000 / TICKS_PER_SEC; //unit: [ms]
+ if (loopTime < 100)
+ {
+ if ((stopTime - lastDelayViolation) / TICKS_PER_SEC > 2) //avoid "flipping back": e.g. DVD-Roms read 32MB at once, so first read may be > 500 ms, but second one will be 0ms!
+ {
+ lastDelayViolation = stopTime;
+ bufferSize.inc();
+ }
+ }
+ else if (loopTime > 500)
+ {
+ lastDelayViolation = stopTime;
+ bufferSize.dec();
+ }
}
//------------------------------------------------------------------------------------------------
diff --git a/lib/db_file.cpp b/lib/db_file.cpp
index 1bc75d82..33c83a0e 100644
--- a/lib/db_file.cpp
+++ b/lib/db_file.cpp
@@ -15,7 +15,7 @@
#include <zen/file_io.h>
#include <zen/scope_guard.h>
#include <zen/guid.h>
-#include <zen/utf8.h>
+#include <zen/utf.h>
#ifdef FFS_WIN
#include <zen/win.h> //includes "windows.h"
@@ -128,7 +128,7 @@ StreamMapping loadStreams(const Zstring& filename) //throw FileError
}
catch (const std::bad_alloc& e)
{
- throw FileError(_("Out of memory!") + L" " + utf8CvrtTo<std::wstring>(e.what()));
+ throw FileError(_("Out of memory!") + L" " + utfCvrtTo<std::wstring>(e.what()));
}
}
@@ -148,7 +148,7 @@ public:
}
catch (const std::bad_alloc& e)
{
- throw FileError(_("Out of memory!") + L" " + utf8CvrtTo<std::wstring>(e.what()));
+ throw FileError(_("Out of memory!") + L" " + utfCvrtTo<std::wstring>(e.what()));
}
}
@@ -160,7 +160,7 @@ private:
Zstring readStringUtf8() const
{
- return utf8CvrtTo<Zstring>(readString<Zbase<char>>());
+ return utfCvrtTo<Zstring>(readString<Zbase<char>>());
}
FileId readFileId() const
@@ -280,7 +280,7 @@ private:
writePOD<bool>(false); //mark last entry
}
- void writeStringUtf8(const Zstring& str) { writeString(utf8CvrtTo<Zbase<char>>(str)); }
+ void writeStringUtf8(const Zstring& str) { writeString(utfCvrtTo<Zbase<char>>(str)); }
void writeFileId(const FileId& id)
{
diff --git a/lib/dir_exist_async.h b/lib/dir_exist_async.h
index 40ddffc7..2ab98e94 100644
--- a/lib/dir_exist_async.h
+++ b/lib/dir_exist_async.h
@@ -9,7 +9,6 @@
#include <zen/thread.h>
#include <zen/file_handling.h>
-//#include "status_handler.h"
#include "process_callback.h"
#include <zen/file_error.h>
#include "resolve_path.h"
@@ -21,7 +20,7 @@ bool dirExistsUpdating(const Zstring& dirname, bool allowUserInteraction, Proces
{
using namespace zen;
- procCallback.reportStatus(replaceCpy(_("Searching for directory %x..."), L"%x", fmtFileName(dirname), false));
+ procCallback.reportStatus(replaceCpy(_("Searching for folder %x..."), L"%x", fmtFileName(dirname), false));
auto ft = async([=]() -> bool
{
diff --git a/lib/dir_lock.cpp b/lib/dir_lock.cpp
index 402892c6..f41bbfa8 100644
--- a/lib/dir_lock.cpp
+++ b/lib/dir_lock.cpp
@@ -5,10 +5,9 @@
// **************************************************************************
#include "dir_lock.h"
#include <utility>
-#include <wx/utils.h>
-#include <wx/timer.h>
+//#include <wx/utils.h>
#include <wx/log.h>
-#include <wx/msgdlg.h>
+//#include <wx/msgdlg.h>
#include <memory>
#include <wx+/string_conv.h>
#include <zen/last_error.h>
@@ -16,6 +15,7 @@
#include <zen/scope_guard.h>
#include <zen/guid.h>
#include <zen/file_io.h>
+#include <zen/tick_count.h>
#include <zen/assert_static.h>
#include <wx+/serialize.h>
#include <zen/int64.h>
@@ -39,9 +39,9 @@ using namespace std::rel_ops;
namespace
{
-const size_t EMIT_LIFE_SIGN_INTERVAL = 5000; //show life sign; unit: [ms]
-const size_t POLL_LIFE_SIGN_INTERVAL = 4000; //poll for life sign; unit: [ms]
-const size_t DETECT_ABANDONED_INTERVAL = 30000; //assume abandoned lock; unit: [ms]
+const int EMIT_LIFE_SIGN_INTERVAL = 5; //show life sign; unit: [s]
+const int POLL_LIFE_SIGN_INTERVAL = 4; //poll for life sign; unit: [s]
+const int DETECT_ABANDONED_INTERVAL = 30; //assume abandoned lock; unit: [s]
const char LOCK_FORMAT_DESCR[] = "FreeFileSync";
const int LOCK_FORMAT_VER = 2; //lock file format version
@@ -60,7 +60,7 @@ public:
{
while (true)
{
- boost::thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(EMIT_LIFE_SIGN_INTERVAL)); //interruption point!
+ boost::this_thread::sleep(boost::posix_time::seconds(EMIT_LIFE_SIGN_INTERVAL)); //interruption point!
//actual work
emitLifeSign(); //throw ()
@@ -68,7 +68,7 @@ public:
}
catch (const std::exception& e) //exceptions must be catched per thread
{
- wxSafeShowMessage(_("An exception occurred!") + L" (Dirlock)", utf8CvrtTo<wxString>(e.what())); //simple wxMessageBox won't do for threads
+ wxSafeShowMessage(_("An exception occurred!") + L" (Dirlock)", utfCvrtTo<wxString>(e.what())); //simple wxMessageBox won't do for threads
}
}
@@ -228,7 +228,7 @@ struct LockInformation //throw FileError
explicit LockInformation(FromCurrentProcess) :
lockId(zen::generateGUID()),
#ifdef FFS_WIN
- sessionId(utf8CvrtTo<std::string>(getLoginSid())), //throw FileError
+ sessionId(utfCvrtTo<std::string>(getLoginSid())), //throw FileError
processId(::GetCurrentProcessId()) //never fails
{
DWORD bufferSize = 0;
@@ -239,14 +239,14 @@ struct LockInformation //throw FileError
&buffer[0], //__out LPTSTR lpBuffer,
&bufferSize)) //__inout LPDWORD lpnSize
throw FileError(_("Cannot get process information.") + L"\n\n" + getLastErrorFormatted());
- computerName = "Windows." + utf8CvrtTo<std::string>(&buffer[0]);
+ computerName = "Windows." + utfCvrtTo<std::string>(&buffer[0]);
bufferSize = UNLEN + 1;
buffer.resize(bufferSize);
if (!::GetUserName(&buffer[0], //__out LPTSTR lpBuffer,
&bufferSize)) //__inout LPDWORD lpnSize
throw FileError(_("Cannot get process information.") + L"\n\n" + getLastErrorFormatted());
- userId = utf8CvrtTo<std::string>(&buffer[0]);
+ userId = utfCvrtTo<std::string>(&buffer[0]);
}
#elif defined FFS_LINUX
processId(::getpid()) //never fails
@@ -399,6 +399,9 @@ ProcessStatus getProcessStatus(const LockInformation& lockInfo) //throw FileErro
}
+const std::int64_t TICKS_PER_SEC = ticksPerSec(); //= 0 on error
+
+
void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //throw FileError
{
const std::wstring infoMsg = replaceCpy(_("Waiting while directory is locked (%x)..."), L"%x", fmtFileName(lockfilename));
@@ -429,13 +432,16 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr
catch (FileError&) {} //logfile may be only partly written -> this is no error!
UInt64 fileSizeOld;
- wxMilliClock_t lastLifeSign = wxGetLocalTimeMillis();
+ TickVal lastLifeSign = getTicks();
while (true)
{
- wxMilliClock_t currentTime = wxGetLocalTimeMillis();
+ const TickVal currentTime = getTicks();
const UInt64 fileSizeNew = ::getLockFileSize(lockfilename); //throw FileError, ErrorNotExisting
+ if (TICKS_PER_SEC <= 0 || !lastLifeSign.isValid() || !currentTime.isValid())
+ throw FileError(L"System Timer failed!"); //no i18n: "should" never throw ;)
+
if (fileSizeNew != fileSizeOld) //received life sign from lock
{
fileSizeOld = fileSizeNew;
@@ -443,7 +449,7 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr
}
if (lockOwnderDead || //no need to wait any longer...
- currentTime - lastLifeSign > DETECT_ABANDONED_INTERVAL)
+ (currentTime - lastLifeSign) / TICKS_PER_SEC > DETECT_ABANDONED_INTERVAL)
{
DirLock dummy(deleteAbandonedLockName(lockfilename), callback); //throw FileError
@@ -461,19 +467,19 @@ void waitOnDirLock(const Zstring& lockfilename, DirLockCallback* callback) //thr
}
//wait some time...
- assert_static(POLL_LIFE_SIGN_INTERVAL % GUI_CALLBACK_INTERVAL == 0);
- for (size_t i = 0; i < POLL_LIFE_SIGN_INTERVAL / GUI_CALLBACK_INTERVAL; ++i)
+ assert_static(1000 * POLL_LIFE_SIGN_INTERVAL % GUI_CALLBACK_INTERVAL == 0);
+ for (size_t i = 0; i < 1000 * POLL_LIFE_SIGN_INTERVAL / GUI_CALLBACK_INTERVAL; ++i)
{
if (callback) callback->requestUiRefresh();
- wxMilliSleep(GUI_CALLBACK_INTERVAL);
+ boost::this_thread::sleep(boost::posix_time::milliseconds(GUI_CALLBACK_INTERVAL));
if (callback)
{
//one signal missed: it's likely this is an abandoned lock => show countdown
- if (currentTime - lastLifeSign > EMIT_LIFE_SIGN_INTERVAL)
+ if ((currentTime - lastLifeSign) / TICKS_PER_SEC > EMIT_LIFE_SIGN_INTERVAL)
{
- long remainingSeconds = ((DETECT_ABANDONED_INTERVAL - (wxGetLocalTimeMillis() - lastLifeSign)) / 1000).ToLong();
- remainingSeconds = std::max(0L, remainingSeconds);
+ int remainingSeconds = DETECT_ABANDONED_INTERVAL - (getTicks() - lastLifeSign) / TICKS_PER_SEC;
+ remainingSeconds = std::max(0, remainingSeconds);
const std::wstring remSecMsg = replaceCpy(_P("1 sec", "%x sec", remainingSeconds), L"%x", numberTo<std::wstring>(remainingSeconds));
callback->reportInfo(infoMsg + L" " + remSecMsg);
diff --git a/lib/help_provider.h b/lib/help_provider.h
index 213c05e3..3b7443cb 100644
--- a/lib/help_provider.h
+++ b/lib/help_provider.h
@@ -9,10 +9,11 @@
#include <wx/help.h>
#include "ffs_paths.h"
+#include <zen/zstring.h>
namespace zen
{
-void displayHelpEntry(const wxString& section = wxEmptyString);
+void displayHelpEntry(const wxString& section = wxEmptyString); //use '/' as path separator!
@@ -52,7 +53,7 @@ void displayHelpEntry(const wxString& section)
if (section.empty())
getHelpCtrl().DisplayContents();
else
- getHelpCtrl().DisplaySection(section);
+ getHelpCtrl().DisplaySection(replaceCpy(section, L'/', utfCvrtTo<std::wstring>(FILE_NAME_SEPARATOR)));
}
}
diff --git a/lib/localization.cpp b/lib/localization.cpp
index f056aea0..5f9a4750 100644
--- a/lib/localization.cpp
+++ b/lib/localization.cpp
@@ -90,21 +90,21 @@ FFSLocale::FFSLocale(const wxString& filename, wxLanguage languageId) : langId_(
for (lngfile::TranslationMap::const_iterator i = transInput.begin(); i != transInput.end(); ++i)
{
- const std::wstring original = utf8CvrtTo<std::wstring>(i->first);
- const std::wstring translation = utf8CvrtTo<std::wstring>(i->second);
+ const std::wstring original = utfCvrtTo<std::wstring>(i->first);
+ const std::wstring translation = utfCvrtTo<std::wstring>(i->second);
assert(!translation.empty());
transMapping.insert(std::make_pair(original , translation));
}
for (lngfile::TranslationPluralMap::const_iterator i = transPluralInput.begin(); i != transPluralInput.end(); ++i)
{
- const std::wstring singular = utf8CvrtTo<std::wstring>(i->first.first);
- const std::wstring plural = utf8CvrtTo<std::wstring>(i->first.second);
+ const std::wstring singular = utfCvrtTo<std::wstring>(i->first.first);
+ const std::wstring plural = utfCvrtTo<std::wstring>(i->first.second);
const lngfile::PluralForms& plForms = i->second;
std::vector<std::wstring> plFormsWide;
for (lngfile::PluralForms::const_iterator j = plForms.begin(); j != plForms.end(); ++j)
- plFormsWide.push_back(utf8CvrtTo<std::wstring>(*j));
+ plFormsWide.push_back(utfCvrtTo<std::wstring>(*j));
assert(!plFormsWide.empty());
@@ -127,9 +127,9 @@ public:
lngFiles_.push_back(fullName);
}
- virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) {}
+ 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 TRAV_ERROR_IGNORE; } //errors are not really critical in this context
+ virtual HandleError onError(const std::wstring& errorText) { return ON_ERROR_IGNORE; } //errors are not really critical in this context
private:
std::vector<Zstring>& lngFiles_;
@@ -177,7 +177,6 @@ ExistingTranslations::ExistingTranslations()
FindLngfiles traverseCallback(lngFiles);
traverseFolder(zen::getResourceDir() + Zstr("Languages"), //throw();
- false, //don't follow symlinks
traverseCallback);
for (auto i = lngFiles.begin(); i != lngFiles.end(); ++i)
@@ -193,14 +192,14 @@ ExistingTranslations::ExistingTranslations()
There is some buggy behavior in wxWidgets which maps "zh_TW" to simplified chinese.
Fortunately locales can be also entered as description. I changed to "Chinese (Traditional)" which works fine.
*/
- if (const wxLanguageInfo* locInfo = wxLocale::FindLanguageInfo(utf8CvrtTo<wxString>(lngHeader.localeName)))
+ if (const wxLanguageInfo* locInfo = wxLocale::FindLanguageInfo(utfCvrtTo<wxString>(lngHeader.localeName)))
{
ExistingTranslations::Entry newEntry;
newEntry.languageID = locInfo->Language;
- newEntry.languageName = utf8CvrtTo<wxString>(lngHeader.languageName);
+ newEntry.languageName = utfCvrtTo<wxString>(lngHeader.languageName);
newEntry.languageFile = toWx(*i);
- newEntry.translatorName = utf8CvrtTo<wxString>(lngHeader.translatorName);
- newEntry.languageFlag = utf8CvrtTo<wxString>(lngHeader.flagFile);
+ newEntry.translatorName = utfCvrtTo<wxString>(lngHeader.translatorName);
+ newEntry.languageFlag = utfCvrtTo<wxString>(lngHeader.flagFile);
locMapping.push_back(newEntry);
}
}
diff --git a/lib/parallel_scan.cpp b/lib/parallel_scan.cpp
index 9ab99920..435067b2 100644
--- a/lib/parallel_scan.cpp
+++ b/lib/parallel_scan.cpp
@@ -13,6 +13,7 @@
#include <wx+/string_conv.h>
#include <zen/thread.h> //includes <boost/thread.hpp>
#include <zen/scope_guard.h>
+#include <zen/fixed_list.h>
using namespace zen;
@@ -219,7 +220,7 @@ public:
void reportCurrentFile(const Zstring& filename, int threadID) //context of worker thread
{
- if (threadID != notifyingThreadID) return; //only one thread may report status
+ if (threadID != notifyingThreadID) return; //only one thread at a time may report status
boost::lock_guard<boost::mutex> dummy(lockCurrentStatus);
currentFile = filename;
@@ -329,7 +330,7 @@ public:
virtual std::shared_ptr<TraverseCallback>
onDir (const Zchar* shortName, const Zstring& fullName);
virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details);
- virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details);
+ virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details);
virtual HandleError onError (const std::wstring& errorText);
private:
@@ -377,26 +378,38 @@ void DirCallback::onFile(const Zchar* shortName, const Zstring& fullName, const
}
-void DirCallback::onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details)
+DirCallback::HandleLink DirCallback::onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details)
{
boost::this_thread::interruption_point();
- if (cfg.handleSymlinks_ == SYMLINK_IGNORE)
- return;
+ switch (cfg.handleSymlinks_)
+ {
+ case SYMLINK_IGNORE:
+ return LINK_SKIP;
- //update status information no matter whether object is excluded or not!
- cfg.acb_.reportCurrentFile(fullName, cfg.threadID_);
+ case SYMLINK_USE_DIRECTLY:
+ {
+ //update status information no matter whether object is excluded or not!
+ cfg.acb_.reportCurrentFile(fullName, cfg.threadID_);
- //------------------------------------------------------------------------------------
- const Zstring& relName = relNameParentPf_ + shortName;
+ //------------------------------------------------------------------------------------
+ const Zstring& relName = relNameParentPf_ + shortName;
- //apply filter before processing (use relative name!)
- if (!cfg.filterInstance->passFileFilter(relName)) //always use file filter: Link type may not be "stable" on Linux!
- return;
+ //apply filter before processing (use relative name!)
+ if (cfg.filterInstance->passFileFilter(relName)) //always use file filter: Link type may not be "stable" on Linux!
+ {
+ output_.addSubLink(shortName, LinkDescriptor(details.lastWriteTimeRaw, details.targetPath, details.dirLink ? LinkDescriptor::TYPE_DIR : LinkDescriptor::TYPE_FILE));
+ cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator
+ }
+ }
+ return LINK_SKIP;
- output_.addSubLink(shortName, LinkDescriptor(details.lastWriteTimeRaw, details.targetPath, details.dirLink ? LinkDescriptor::TYPE_DIR : LinkDescriptor::TYPE_FILE));
+ case SYMLINK_FOLLOW_LINK:
+ return LINK_FOLLOW;
+ }
- cfg.acb_.incItemsScanned(); //add 1 element to the progress indicator
+ assert(false);
+ return LINK_SKIP;
}
@@ -429,16 +442,16 @@ DirCallback::HandleError DirCallback::onError(const std::wstring& errorText)
{
switch (cfg.acb_.reportError(errorText))
{
- case FillBufferCallback::TRAV_ERROR_IGNORE:
+ case FillBufferCallback::ON_ERROR_IGNORE:
cfg.failedReads_.insert(relNameParentPf_);
- return TRAV_ERROR_IGNORE;
+ return ON_ERROR_IGNORE;
- case FillBufferCallback::TRAV_ERROR_RETRY:
- return TRAV_ERROR_RETRY;
+ case FillBufferCallback::ON_ERROR_RETRY:
+ return ON_ERROR_RETRY;
}
assert(false);
- return TRAV_ERROR_IGNORE;
+ return ON_ERROR_IGNORE;
}
@@ -498,20 +511,6 @@ public:
Zstring(),
dirVal.dirCont);
- bool followSymlinks = false;
- switch (item.first.handleSymlinks_)
- {
- case SYMLINK_IGNORE:
- followSymlinks = false; //=> symlinks will be reported via onSymlink() where they are excluded
- break;
- case SYMLINK_USE_DIRECTLY:
- followSymlinks = false;
- break;
- case SYMLINK_FOLLOW_LINK:
- followSymlinks = true;
- break;
- }
-
DstHackCallback* dstCallbackPtr = nullptr;
#ifdef FFS_WIN
DstHackCallbackImpl dstCallback(*acb_, threadID_);
@@ -519,7 +518,7 @@ public:
#endif
//get all files and folders from directoryPostfixed (and subdirectories)
- traverseFolder(directoryName, followSymlinks, traverser, dstCallbackPtr); //exceptions may be thrown!
+ traverseFolder(directoryName, traverser, dstCallbackPtr); //exceptions may be thrown!
});
}
@@ -540,8 +539,7 @@ void zen::fillBuffer(const std::set<DirectoryKey>& keysToRead, //in
std::vector<std::set<DirectoryKey>> buckets = separateByDistinctDisk(keysToRead); //one bucket per physical device
- std::vector<boost::thread> worker; //note: GCC doesn't allow to construct an array of empty threads since they would be initialized by const boost::thread&
- worker.reserve(buckets.size());
+ FixedList<boost::thread> worker; //note: we cannot use std::vector<boost::thread>: compiler error on GCC 4.7, probably a boost screw-up
zen::ScopeGuard guardWorker = zen::makeGuard([&]
{
@@ -554,7 +552,6 @@ void zen::fillBuffer(const std::set<DirectoryKey>& keysToRead, //in
//init worker threads
for (auto iter = buckets.begin(); iter != buckets.end(); ++iter)
{
- int threadID = iter - buckets.begin();
const std::set<DirectoryKey>& bucket = *iter;
std::vector<std::pair<DirectoryKey, DirectoryValue*>> workload;
@@ -566,16 +563,17 @@ void zen::fillBuffer(const std::set<DirectoryKey>& keysToRead, //in
workload.push_back(std::make_pair(key, &rv.first->second));
});
- worker.push_back(boost::thread(WorkerThread(threadID, acb, workload)));
+ const int threadId = iter - buckets.begin();
+ worker.emplace_back(WorkerThread(threadId, acb, workload));
}
//wait until done
- for (auto iter = worker.begin(); iter != worker.end(); ++iter)
+ int threadId = 0;
+ for (auto iter = worker.begin(); iter != worker.end(); ++iter, ++threadId)
{
boost::thread& wt = *iter;
- int threadID = iter - worker.begin();
- acb->setNotifyingThread(threadID); //process info messages of first (active) thread only
+ acb->setNotifyingThread(threadId); //process info messages of first (active) thread only
do
{
diff --git a/lib/parallel_scan.h b/lib/parallel_scan.h
index 836892ad..0ce0114d 100644
--- a/lib/parallel_scan.h
+++ b/lib/parallel_scan.h
@@ -56,11 +56,11 @@ public:
enum HandleError
{
- TRAV_ERROR_RETRY,
- TRAV_ERROR_IGNORE
+ ON_ERROR_RETRY,
+ ON_ERROR_IGNORE
};
- virtual HandleError reportError (const std::wstring& errorText) = 0; //may throw!
- virtual void reportStatus(const std::wstring& statusMsg, int itemTotal) = 0; //
+ virtual HandleError reportError (const std::wstring& errorText) = 0; //may throw!
+ virtual void reportStatus(const std::wstring& statusMsg, 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 07932c3a..6a0b9dc5 100644
--- a/lib/parse_lng.h
+++ b/lib/parse_lng.h
@@ -17,7 +17,8 @@
#include <stdexcept>
#include <string>
#include <vector>
-#include <zen/utf8.h>
+#include <zen/utf.h>
+#include <zen/string_tools.h>
namespace lngfile
{
@@ -311,24 +312,6 @@ private:
std::string::const_iterator pos;
};
-template <class C, class T>
-inline
-std::basic_string<C> numberToString(const T& number) //convert number to string the C++ way
-{
- std::basic_ostringstream<C> ss;
- ss << number;
- return ss.str();
-}
-
-template <class T, class C>
-inline
-T stringToNumber(const std::basic_string<C>& str) //convert string to number the C++ way
-{
- T number = 0;
- std::basic_istringstream<C>(str) >> number;
- return number;
-}
-
class LngParser
{
@@ -370,7 +353,7 @@ public:
consumeToken(Token::TK_FLAG_FILE_END);
consumeToken(Token::TK_PLURAL_COUNT_BEGIN);
- header.pluralCount = stringToNumber<int>(tk.text);
+ header.pluralCount = zen::stringTo<int>(tk.text);
consumeToken(Token::TK_TEXT);
consumeToken(Token::TK_PLURAL_COUNT_END);
@@ -521,7 +504,7 @@ void generateLng(const TranslationList& in, const TransHeader& header, std::stri
fileStream += KnownTokens::text(Token::TK_FLAG_FILE_END) + LB;
fileStream += TAB + KnownTokens::text(Token::TK_PLURAL_COUNT_BEGIN);
- fileStream += numberToString<char>(header.pluralCount);
+ fileStream += zen::numberTo<std::string>(header.pluralCount);
fileStream += KnownTokens::text(Token::TK_PLURAL_COUNT_END) + LB;
fileStream += TAB + KnownTokens::text(Token::TK_PLURAL_DEF_BEGIN);
diff --git a/lib/perf_check.cpp b/lib/perf_check.cpp
index 897be12c..ab0f7769 100644
--- a/lib/perf_check.cpp
+++ b/lib/perf_check.cpp
@@ -79,7 +79,7 @@ wxString PerfCheck::getRemainingTime(double dataRemaining) const
return zen::remainingTimeToShortString(remTimeSec);
}
}
- return wxT("-"); //fallback
+ return L"-"; //fallback
}
@@ -102,7 +102,7 @@ wxString PerfCheck::getBytesPerSecond() const
if (dataDelta > 0) //may be negative if user cancels copying
return zen::filesizeToShortString(zen::Int64(dataDelta * 1000 / timeDelta)) + _("/sec");
}
- return wxT("-"); //fallback
+ return L"-"; //fallback
}
@@ -120,7 +120,7 @@ wxString PerfCheck::getOverallBytesPerSecond() const //for all samples
if (dataDelta > 0) //may be negative if user cancels copying
return zen::filesizeToShortString(zen::Int64(dataDelta * 1000 / timeDelta)) + _("/sec");
}
- return wxT("-"); //fallback
+ return L"-"; //fallback
}
@@ -255,5 +255,4 @@ wxString Statistics::getRemainingTime(const int objectsCurrent, const double dat
return formatRemainingTime((objectsTotal - objectsCurrent) * z1_current + (dataTotal - dataCurrent) * z2_current);
}
-
*/
diff --git a/lib/process_xml.cpp b/lib/process_xml.cpp
index a3ed5bfc..677618b4 100644
--- a/lib/process_xml.cpp
+++ b/lib/process_xml.cpp
@@ -646,7 +646,7 @@ bool readText(const std::string& input, DirectionConfig::Variant& value)
template <> inline
-bool readValue(const XmlElement& input, ColumnAttributeRim& value)
+bool readStruc(const XmlElement& input, ColumnAttributeRim& value)
{
XmlIn in(input);
bool rv1 = in.attribute("Type", value.type_);
@@ -656,7 +656,7 @@ bool readValue(const XmlElement& input, ColumnAttributeRim& value)
}
template <> inline
-void writeValue(const ColumnAttributeRim& value, XmlElement& output)
+void writeStruc(const ColumnAttributeRim& value, XmlElement& output)
{
XmlOut out(output);
out.attribute("Type", value.type_);
@@ -666,7 +666,7 @@ void writeValue(const ColumnAttributeRim& value, XmlElement& output)
template <> inline
-bool readValue(const XmlElement& input, ColumnAttributeNavi& value)
+bool readStruc(const XmlElement& input, ColumnAttributeNavi& value)
{
XmlIn in(input);
bool rv1 = in.attribute("Type", value.type_);
@@ -676,7 +676,7 @@ bool readValue(const XmlElement& input, ColumnAttributeNavi& value)
}
template <> inline
-void writeValue(const ColumnAttributeNavi& value, XmlElement& output)
+void writeStruc(const ColumnAttributeNavi& value, XmlElement& output)
{
XmlOut out(output);
out.attribute("Type", value.type_);
@@ -812,7 +812,7 @@ void readConfig(const XmlIn& in, xmlAccess::XmlGuiConfig& config)
inGuiCfg["HideFiltered" ](config.hideFilteredElements);
inGuiCfg["HandleError" ](config.handleError);
- inGuiCfg["SyncPreviewActive"](config.syncPreviewEnabled);
+ inGuiCfg["SyncPreviewActive"](config.showSyncAction);
}
@@ -1081,7 +1081,7 @@ void writeConfig(const XmlGuiConfig& config, XmlOut& out)
outGuiCfg["HideFiltered" ](config.hideFilteredElements);
outGuiCfg["HandleError" ](config.handleError);
- outGuiCfg["SyncPreviewActive"](config.syncPreviewEnabled);
+ outGuiCfg["SyncPreviewActive"](config.showSyncAction);
}
void writeConfig(const XmlBatchConfig& config, XmlOut& out)
@@ -1220,9 +1220,9 @@ void xmlAccess::writeConfig(const XmlGlobalSettings& config)
}
-wxString xmlAccess::extractJobName(const wxString& configFilename)
+std::wstring xmlAccess::extractJobName(const Zstring& configFilename)
{
- const wxString shortName = afterLast(configFilename, utf8CvrtTo<wxString>(FILE_NAME_SEPARATOR)); //returns the whole string if separator not found
- const wxString jobName = beforeLast(shortName, L'.'); //returns empty string if seperator not found
- return jobName.IsEmpty() ? shortName : jobName;
+ const Zstring shortName = afterLast(configFilename, FILE_NAME_SEPARATOR); //returns the whole string if separator not found
+ const Zstring jobName = beforeLast(shortName, Zstr('.')); //returns empty string if seperator not found
+ return utfCvrtTo<std::wstring>(jobName.empty() ? shortName : jobName);
}
diff --git a/lib/process_xml.h b/lib/process_xml.h
index 767e4a40..43dedb51 100644
--- a/lib/process_xml.h
+++ b/lib/process_xml.h
@@ -39,8 +39,8 @@ enum OnGuiError
ON_GUIERROR_IGNORE
};
-typedef wxString Description;
-typedef wxString Commandline;
+typedef std::wstring Description;
+typedef std::wstring Commandline;
typedef std::vector<std::pair<Description, Commandline> > ExternalApps;
//---------------------------------------------------------------------
@@ -49,20 +49,20 @@ struct XmlGuiConfig
XmlGuiConfig() :
hideFilteredElements(false),
handleError(ON_GUIERROR_POPUP),
- syncPreviewEnabled(true) {} //initialize values
+ showSyncAction(true) {} //initialize values
zen::MainConfiguration mainCfg;
bool hideFilteredElements;
OnGuiError handleError; //reaction on error situation during synchronization
- bool syncPreviewEnabled;
+ bool showSyncAction;
bool operator==(const XmlGuiConfig& other) const
{
return mainCfg == other.mainCfg &&
hideFilteredElements == other.hideFilteredElements &&
handleError == other.handleError &&
- syncPreviewEnabled == other.syncPreviewEnabled;
+ showSyncAction == other.showSyncAction;
}
bool operator!=(const XmlGuiConfig& other) const { return !(*this == other); }
@@ -174,7 +174,7 @@ struct XmlGlobalSettings
externelApplications.push_back(std::make_pair(L"Open with default application", //mark for extraction: _("Open with default application")
L"\"%name\""));
#elif defined FFS_LINUX
- externelApplications.push_back(std::make_pair(L"Browse directory", //mark for extraction: _("Browse directory")
+ 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\""));
externelApplications.push_back(std::make_pair(L"Open with default application", //mark for extraction: _("Open with default application")
L"xdg-open \"%name\""));
@@ -250,7 +250,7 @@ MergeType getMergeType(const std::vector<Zstring>& filenames); //throw ()
void convertConfig(const std::vector<Zstring>& filenames, XmlGuiConfig& config); //throw xmlAccess::FfsXmlError
void convertConfig(const std::vector<Zstring>& filenames, XmlBatchConfig& config); //throw xmlAccess::FfsXmlError
-wxString extractJobName(const wxString& configFilename);
+std::wstring extractJobName(const Zstring& configFilename);
}
diff --git a/lib/resolve_path.cpp b/lib/resolve_path.cpp
index f5a342d2..bb0c1f3b 100644
--- a/lib/resolve_path.cpp
+++ b/lib/resolve_path.cpp
@@ -260,13 +260,13 @@ public:
TraverseMedia(DeviceList& devices) : devices_(devices) {}
virtual void onFile(const Zchar* shortName, const Zstring& fullName, const FileInfo& details) {}
- virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) {}
+ 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)
{
devices_.insert(std::make_pair(shortName, fullName));
return nullptr; //DON'T traverse into subdirs
}
- virtual HandleError onError(const std::wstring& errorText) { return TRAV_ERROR_IGNORE; }
+ virtual HandleError onError(const std::wstring& errorText) { return ON_ERROR_IGNORE; }
private:
DeviceList& devices_;
@@ -328,7 +328,7 @@ Zstring volumenNameToPath(const Zstring& volumeName) //return empty string on er
TraverseMedia::DeviceList deviceList;
TraverseMedia traverser(deviceList);
- traverseFolder("/media", false, traverser); //traverse one level
+ traverseFolder("/media", traverser); //traverse one level
TraverseMedia::DeviceList::const_iterator iter = deviceList.find(volumeName);
if (iter != deviceList.end())
@@ -511,7 +511,7 @@ Zstring zen::getFormattedDirectoryName(const Zstring& dirString) // throw()
//remove leading/trailing whitespace
trim(dirname, true, false);
- while (endsWith(dirname, " ")) //don't remove all whitespace from right, e.g. 0xa0 may be used as part of dir name
+ while (endsWith(dirname, Zstr(' '))) //don't remove all whitespace from right, e.g. 0xa0 may be used as part of dir name
dirname.resize(dirname.size() - 1);
if (dirname.empty()) //an empty string would later be resolved as "\"; this is not desired
@@ -613,7 +613,7 @@ void zen::loginNetworkShare(const Zstring& dirnameOrig, bool allowUserInteractio
trgRes.dwType = RESOURCETYPE_DISK;
trgRes.lpRemoteName = const_cast<LPWSTR>(networkShare.c_str()); //trgRes is "__in"
- //note: following function call may block heavily if network is not reachable!!!
+ //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,
diff --git a/lib/resources.cpp b/lib/resources.cpp
index 3ae24d1d..670f2cfd 100644
--- a/lib/resources.cpp
+++ b/lib/resources.cpp
@@ -53,7 +53,7 @@ GlobalResources::GlobalResources()
wxImage::AddHandler(new wxPNGHandler); //ownership passed
wxZipInputStream resourceFile(input, wxConvUTF8);
- //do NOT rely on wxConvLocal! May result in "Cannot convert from the charset 'Unknown encoding (-1)'!"
+ //do NOT rely on wxConvLocal! ON failure shows unhelpful popup "Cannot convert from the charset 'Unknown encoding (-1)'!"
while (true)
{
diff --git a/lib/return_codes.h b/lib/return_codes.h
new file mode 100644
index 00000000..c5f8fd15
--- /dev/null
+++ b/lib/return_codes.h
@@ -0,0 +1,22 @@
+// **************************************************************************
+// * 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 *
+// **************************************************************************
+
+#ifndef RETURN_CODES_H_INCLUDED
+#define RETURN_CODES_H_INCLUDED
+
+namespace zen
+{
+enum FfsReturnCode
+{
+ FFS_RC_SUCCESS = 0,
+ FFS_RC_FINISHED_WITH_ERRORS,
+ FFS_RC_ABORTED,
+ FFS_RC_EXCEPTION,
+};
+}
+
+
+#endif // RETURN_CODES_H_INCLUDED
diff --git a/lib/shadow.cpp b/lib/shadow.cpp
index f4d7f3af..ba4e1f5e 100644
--- a/lib/shadow.cpp
+++ b/lib/shadow.cpp
@@ -27,7 +27,7 @@ bool runningWOW64() //test if process is running under WOW64 (reference http://m
{
BOOL isWow64 = FALSE;
if (isWow64Process(::GetCurrentProcess(), &isWow64))
- return isWow64 == TRUE;
+ return isWow64 != FALSE;
}
return false;
diff --git a/lib/status_handler.h b/lib/status_handler.h
index 7b7cb3d7..ca7af298 100644
--- a/lib/status_handler.h
+++ b/lib/status_handler.h
@@ -8,6 +8,7 @@
#define STATUSHANDLER_H_INCLUDED
#include "../process_callback.h"
+#include <vector>
#include <string>
#include <zen/int64.h>
#include <zen/i18n.h>
diff --git a/lib/xml_base.cpp b/lib/xml_base.cpp
index 3f6cc0be..8f8ee74d 100644
--- a/lib/xml_base.cpp
+++ b/lib/xml_base.cpp
@@ -44,9 +44,6 @@ void xmlAccess::loadXmlDocument(const Zstring& filename, XmlDoc& doc) //throw Ff
}
catch (const FileError& error)
{
- if (!fileExists(filename))
- throw FfsXmlError(replaceCpy(_("Cannot find file %x."), L"%x", fmtFileName(filename)));
-
throw FfsXmlError(error.toString());
}
diff --git a/structures.cpp b/structures.cpp
index 5b2d4336..3147eb4c 100644
--- a/structures.cpp
+++ b/structures.cpp
@@ -211,7 +211,7 @@ int daysSinceBeginOfWeek(int dayOfWeek) //0-6, 0=Monday, 6=Sunday
LOCALE_IFIRSTDAYOFWEEK | // first day of week specifier, 0-6, 0=Monday, 6=Sunday
LOCALE_RETURN_NUMBER, //__in LCTYPE LCType,
reinterpret_cast<LPTSTR>(&firstDayOfWeek), //__out LPTSTR lpLCData,
- sizeof(firstDayOfWeek) / sizeof(TCHAR)) != 0) //__in int cchData
+ sizeof(firstDayOfWeek) / sizeof(TCHAR)) > 0) //__in int cchData
{
assert(firstDayOfWeek <= 6);
return (dayOfWeek + (7 - firstDayOfWeek)) % 7;
diff --git a/structures.h b/structures.h
index db912662..728e3213 100644
--- a/structures.h
+++ b/structures.h
@@ -105,7 +105,7 @@ enum SyncOperation
SO_OVERWRITE_LEFT,
SO_OVERWRITE_RIGHT,
- SO_COPY_METADATA_TO_LEFT, //objects are already equal: transfer metadata only
+ SO_COPY_METADATA_TO_LEFT, //objects are already equal: transfer metadata only - optimization
SO_COPY_METADATA_TO_RIGHT, //
SO_DO_NOTHING, //= both sides differ, but nothing will be synced
diff --git a/synchronization.cpp b/synchronization.cpp
index edc38303..daa08284 100644
--- a/synchronization.cpp
+++ b/synchronization.cpp
@@ -30,6 +30,7 @@
using namespace zen;
+
namespace
{
inline
@@ -72,7 +73,7 @@ SyncStatistics::SyncStatistics(const HierarchyObject& hierObj)
SyncStatistics::SyncStatistics(const FileMapping& fileObj)
{
init();
- getFileNumbers(fileObj);
+ calcStats(fileObj);
rowsTotal += 1;
}
@@ -80,14 +81,9 @@ SyncStatistics::SyncStatistics(const FileMapping& fileObj)
inline
void SyncStatistics::recurse(const HierarchyObject& hierObj)
{
- std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(),
- [&](const DirMapping& dirObj) { getDirNumbers(dirObj); });
-
- std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(),
- [&](const FileMapping& fileObj) { getFileNumbers(fileObj); });
-
- std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(),
- [&](const SymLinkMapping& linkObj) { getLinkNumbers(linkObj); });
+ std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](const DirMapping& dirObj ) { calcStats(dirObj ); });
+ std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](const FileMapping& fileObj) { calcStats(fileObj); });
+ std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](const SymLinkMapping& linkObj) { calcStats(linkObj); });
rowsTotal += hierObj.refSubDirs(). size();
rowsTotal += hierObj.refSubFiles().size();
@@ -96,7 +92,7 @@ void SyncStatistics::recurse(const HierarchyObject& hierObj)
inline
-void SyncStatistics::getFileNumbers(const FileMapping& fileObj)
+void SyncStatistics::calcStats(const FileMapping& fileObj)
{
switch (fileObj.getSyncOperation()) //evaluate comparison result and sync direction
{
@@ -126,7 +122,7 @@ void SyncStatistics::getFileNumbers(const FileMapping& fileObj)
++updateRight;
break;
- case SO_MOVE_LEFT_SOURCE: //ignore
+ case SO_MOVE_LEFT_SOURCE: //ignore; already counted
case SO_MOVE_RIGHT_SOURCE: //
break;
@@ -162,7 +158,7 @@ void SyncStatistics::getFileNumbers(const FileMapping& fileObj)
inline
-void SyncStatistics::getLinkNumbers(const SymLinkMapping& linkObj)
+void SyncStatistics::calcStats(const SymLinkMapping& linkObj)
{
switch (linkObj.getSyncOperation()) //evaluate comparison result and sync direction
{
@@ -211,7 +207,7 @@ void SyncStatistics::getLinkNumbers(const SymLinkMapping& linkObj)
inline
-void SyncStatistics::getDirNumbers(const DirMapping& dirObj)
+void SyncStatistics::calcStats(const DirMapping& dirObj)
{
switch (dirObj.getSyncOperation()) //evaluate comparison result and sync direction
{
@@ -260,9 +256,7 @@ void SyncStatistics::getDirNumbers(const DirMapping& dirObj)
break;
}
- recurse(dirObj); //hm, if this dir is deleted, it is not correct to recurse, except deletion variant is "permanently" or
- //"user-defined + different volume" -> fortunately the numbers are adjusted during sync!
- //however: it's risky to *not* recurse, since sync-algorithm might do so, even in case of deletion! (e.g. ignored failure to delete parent directory)!
+ 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!
}
@@ -293,7 +287,7 @@ std::vector<zen::FolderPairSyncCfg> zen::extractSyncCfg(const MainConfiguration&
//------------------------------------------------------------------------------------------------------------
-//test if user accidentally tries to sync the wrong folders
+//test if user accidentally selected the wrong folders to sync
bool significantDifferenceDetected(const SyncStatistics& folderPairStat)
{
//initial file copying shall not be detected as major difference
@@ -311,8 +305,102 @@ bool significantDifferenceDetected(const SyncStatistics& folderPairStat)
return nonMatchingRows >= 10 && nonMatchingRows > 0.5 * folderPairStat.getRowCount();
}
+
//#################################################################################################################
+#ifdef FFS_WIN
+warn_static("finish")
+#endif
+/*
+class PhysicalStatistics //counts *physical* operations, disk accesses and bytes transferred
+{
+public:
+PhysicalStatistics(const FolderComparison& folderCmp) : accesses(0)
+{
+ std::for_each(begin(folderCmp), end(folderCmp), [&](const BaseDirMapping& baseMap) { recurse(baseMap); });
+}
+
+int getAccesses() const { return accesses; }
+zen::Int64 getBytes() const { return bytes; }
+
+private:
+void recurse(const HierarchyObject& hierObj)
+{
+std::for_each(hierObj.refSubDirs ().begin(), hierObj.refSubDirs ().end(), [&](const DirMapping& dirObj ) { calcStats(dirObj ); });
+std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(), [&](const FileMapping& fileObj) { calcStats(fileObj); });
+std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(), [&](const SymLinkMapping& linkObj) { calcStats(linkObj); });
+}
+
+void calcStats(const FileMapping& fileObj)
+{
+switch (fileObj.getSyncOperation()) //evaluate comparison result and sync direction
+{
+ case SO_CREATE_NEW_LEFT:
+ accesses += 2; //read + write
+ bytes += to<Int64>(fileObj.getFileSize<RIGHT_SIDE>());
+ break;
+ case SO_CREATE_NEW_RIGHT:
+ accesses += 2; //read + write
+ bytes += to<Int64>(fileObj.getFileSize<LEFT_SIDE>());
+ break;
+
+ case SO_DELETE_LEFT:
+ ++accesses;
+ break;
+
+ case SO_DELETE_RIGHT:
+ ++accesses;
+ break;
+
+ case SO_MOVE_LEFT_TARGET:
+ case SO_MOVE_RIGHT_TARGET:
+ ++accesses;
+ break;
+
+ case SO_MOVE_LEFT_SOURCE: //ignore; already counted
+ case SO_MOVE_RIGHT_SOURCE: //
+ break;
+
+ case SO_OVERWRITE_LEFT:
+ //todo: delete
+ accesses += 2; //read + write
+ bytes += to<Int64>(fileObj.getFileSize<RIGHT_SIDE>());
+ break;
+
+ case SO_OVERWRITE_RIGHT:
+ //todo: delete
+ accesses += 2; //read + write
+ bytes += to<Int64>(fileObj.getFileSize<LEFT_SIDE>());
+ break;
+
+ case SO_COPY_METADATA_TO_LEFT:
+ case SO_COPY_METADATA_TO_RIGHT:
+ accesses += 2; //read + write
+ break;
+
+ case SO_UNRESOLVED_CONFLICT:
+ case SO_DO_NOTHING:
+ case SO_EQUAL:
+ break;
+}
+}
+
+void calcStats(const SymLinkMapping& linkObj)
+{
+
+}
+
+void calcStats(const DirMapping& dirObj)
+{
+ //since we model physical stats, we recurse only if deletion variant is "permanently" or "user-defined + different volume",
+ //else deletion is done as a single physical operation
+}
+
+int accesses;
+Int64 bytes;
+};
+*/
+//#################################################################################################################
FolderPairSyncCfg::FolderPairSyncCfg(bool automaticMode,
const DeletionPolicy handleDel,
@@ -325,24 +413,20 @@ FolderPairSyncCfg::FolderPairSyncCfg(bool automaticMode,
/*
add some postfix to alternate deletion directory: deletionDirectory\<prefix>2010-06-30 12-59-12\
*/
-Zstring getSessionDeletionDir(const Zstring& deletionDirectory, const Zstring& prefix = Zstring())
-{
- if (deletionDirectory.empty())
- return Zstring(); //no valid directory for deletion specified (checked later)
-
- const Zstring formattedDir = appendSeparator(deletionDirectory) + prefix + formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"));
+Zstring findUnusedName(const Zstring& filename)
+{
//ensure that session directory does not yet exist (must be unique)
- Zstring output = formattedDir;
+ Zstring output = filename;
for (int i = 1; zen::somethingExists(output); ++i)
- output = formattedDir + Zchar('_') + numberTo<Zstring>(i);
+ output = filename + Zchar('_') + numberTo<Zstring>(i);
- output += FILE_NAME_SEPARATOR;
return output;
}
-
-SyncProcess::SyncProcess(xmlAccess::OptionalDialogs& warnings,
+SyncProcess::SyncProcess(const std::wstring& jobName,
+ const std::wstring& timestamp,
+ xmlAccess::OptionalDialogs& warnings,
bool verifyCopiedFiles,
bool copyLockedFiles,
bool copyFilePermissions,
@@ -354,7 +438,9 @@ SyncProcess::SyncProcess(xmlAccess::OptionalDialogs& warnings,
copyFilePermissions_(copyFilePermissions),
transactionalFileCopy_(transactionalFileCopy),
m_warnings(warnings),
- procCallback(handler)
+ procCallback(handler),
+ custDelDirShortname(utfCvrtTo<Zstring>(jobName.empty() ? timestamp : jobName + L" " + timestamp))
+
{
if (runWithBackgroundPriority)
procBackground.reset(new ScheduleForBackgroundProcessing);
@@ -365,7 +451,8 @@ class DeletionHandling //e.g. generate name of alternate deletion directory (uni
{
public:
DeletionHandling(DeletionPolicy handleDel,
- const Zstring& custDelFolder,
+ const Zstring& custDelDir, // final custom deletion directory: custDelDir + \ + subdirShort
+ const Zstring& subdirShort, //
const Zstring& baseDirPf, //with separator postfix
ProcessCallback& procCallback);
~DeletionHandling(); //always (try to) clean up, even if synchronization is aborted!
@@ -391,9 +478,8 @@ private:
DeletionPolicy deletionType;
ProcessCallback* procCallback_; //always bound! need assignment operator => not a reference
- Zstring sessionDelDir; //target deletion folder for current folder pair (with timestamp, ends with path separator)
-
- Zstring baseDirPf_; //with separator postfix
+ Zstring sessionDelDirPf; //full target deletion folder for current folder pair (with timestamp, ends with path separator)
+ Zstring baseDirPf_; //ends with path separator
//preloaded status texts:
std::wstring txtRemovingFile;
@@ -405,7 +491,8 @@ private:
DeletionHandling::DeletionHandling(DeletionPolicy handleDel,
- const Zstring& custDelFolder,
+ const Zstring& custDelDir, // final custom deletion directory: custDelDir + \ + subdirShort
+ const Zstring& subdirShort, //
const Zstring& baseDirPf, //with separator postfix
ProcessCallback& procCallback) :
deletionType(handleDel),
@@ -418,7 +505,6 @@ DeletionHandling::DeletionHandling(DeletionPolicy handleDel,
(deletionType == MOVE_TO_RECYCLE_BIN && recycleBinStatus(baseDirPf) == STATUS_REC_MISSING))
deletionType = DELETE_PERMANENTLY; //Windows' ::SHFileOperation() will do this anyway, but we have a better and faster deletion routine (e.g. on networks)
#endif
-
switch (deletionType)
{
case DELETE_PERMANENTLY:
@@ -428,7 +514,8 @@ DeletionHandling::DeletionHandling(DeletionPolicy handleDel,
break;
case MOVE_TO_RECYCLE_BIN:
- sessionDelDir = getSessionDeletionDir(baseDirPf_, Zstr("FFS "));
+ if (!baseDirPf_.empty())
+ sessionDelDirPf = appendSeparator(findUnusedName(baseDirPf_ + Zstr("FFS ") + formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"))));
txtRemovingFile = _("Moving file %x to recycle bin" );
txtRemovingDirectory = _("Moving folder %x to recycle bin" );
@@ -436,11 +523,12 @@ DeletionHandling::DeletionHandling(DeletionPolicy handleDel,
break;
case MOVE_TO_CUSTOM_DIRECTORY:
- sessionDelDir = getSessionDeletionDir(custDelFolder);
+ if (!custDelDir.empty())
+ sessionDelDirPf = appendSeparator(findUnusedName(appendSeparator(custDelDir) + subdirShort));
- txtRemovingFile = replaceCpy(_("Moving file %x to %y" ), L"%y", fmtFileName(custDelFolder));
- txtRemovingDirectory = replaceCpy(_("Moving folder %x to %y" ), L"%y", fmtFileName(custDelFolder));
- txtRemovingSymlink = replaceCpy(_("Moving symbolic link %x to %y"), L"%y", fmtFileName(custDelFolder));
+ 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));
break;
}
}
@@ -459,7 +547,7 @@ void DeletionHandling::tryCleanup() //throw FileError
if (!cleanedUp)
{
if (deletionType == MOVE_TO_RECYCLE_BIN) //clean-up temporary directory (recycle bin)
- zen::moveToRecycleBin(beforeLast(sessionDelDir, FILE_NAME_SEPARATOR)); //throw FileError
+ zen::moveToRecycleBin(beforeLast(sessionDelDirPf, FILE_NAME_SEPARATOR)); //throw FileError
cleanedUp = true;
}
@@ -557,12 +645,12 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const
case MOVE_TO_RECYCLE_BIN:
{
- const Zstring targetFile = sessionDelDir + relativeName; //ends with path separator
+ const Zstring targetFile = sessionDelDirPf + relativeName; //ends with path separator
- try //... to get away cheaply!
+ try
{
//performance optimization: Instead of moving each object into recycle bin separately,
- //we rename them ony by one into a temporary directory and delete this directory only ONCE!
+ //we rename them one by one into a temporary directory and delete this directory only ONCE!
renameFile(fullName, targetFile); //throw FileError -> try to get away cheaply!
}
catch (FileError&)
@@ -588,7 +676,7 @@ void DeletionHandling::removeFile(const Zstring& relativeName) const
case MOVE_TO_CUSTOM_DIRECTORY:
{
CallbackMoveFileImpl callBack(*procCallback_, *this, nullptr); //we do *not* report statistics in this method
- const Zstring targetFile = sessionDelDir + relativeName; //ends with path separator
+ const Zstring targetFile = sessionDelDirPf + relativeName; //ends with path separator
try //... to get away cheaply!
{
@@ -633,12 +721,12 @@ void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* o
case MOVE_TO_RECYCLE_BIN:
{
- const Zstring targetDir = sessionDelDir + relativeName;
+ const Zstring targetDir = sessionDelDirPf + relativeName;
- try //... to get away cheaply!
+ try
{
//performance optimization: Instead of moving each object into recycle bin separately,
- //we rename them ony by one into a temporary directory and delete this directory only ONCE!
+ //we rename them one by one into a temporary directory and delete this directory only ONCE!
renameFile(fullName, targetDir); //throw FileError -> try to get away cheaply!
}
catch (FileError&)
@@ -670,7 +758,7 @@ void DeletionHandling::removeFolderInt(const Zstring& relativeName, const int* o
case MOVE_TO_CUSTOM_DIRECTORY:
{
CallbackMoveFileImpl callBack(*procCallback_, *this, objectsExpected ? &objectsReported : nullptr);
- const Zstring targetDir = sessionDelDir + relativeName;
+ const Zstring targetDir = sessionDelDirPf + relativeName;
try //... to get away cheaply!
{
@@ -715,7 +803,7 @@ bool DeletionHandling::deletionFreesSpace() const
case MOVE_TO_RECYCLE_BIN:
return false; //in general... (unless Recycle Bin is full)
case MOVE_TO_CUSTOM_DIRECTORY:
- switch (zen::onSameVolume(baseDirPf_, sessionDelDir))
+ switch (zen::onSameVolume(baseDirPf_, sessionDelDirPf))
{
case IS_SAME_YES:
return false;
@@ -969,7 +1057,7 @@ bool haveNameClash(const Zstring& shortname, Mapping& m)
}
-Zstring findUniqueTempName(const Zstring& filename)
+Zstring findUnusedTempName(const Zstring& filename)
{
Zstring output = filename + zen::TEMP_FILE_ENDING;
@@ -987,7 +1075,7 @@ void SynchronizeFolderPair::prepare2StepMove(FileMapping& sourceObj,
FileMapping& targetObj) //throw FileError
{
const Zstring& source = sourceObj.getFullName<side>();
- const Zstring& tmpTarget = findUniqueTempName(sourceObj.getBaseDirPf<side>() + sourceObj.getShortName<side>());
+ const Zstring& tmpTarget = findUnusedTempName(sourceObj.getBaseDirPf<side>() + sourceObj.getShortName<side>());
//this could still lead to a name-clash in obscure cases, if some file ex. on the other side with
//the very same (.ffs_tmp) name and is copied before the second step of the move is executed
//good news: even in this pathologic case, this may only prevent the copy of the other file, but not the move
@@ -1273,7 +1361,7 @@ void SynchronizeFolderPair::runPass(HierarchyObject& hierObj)
std::for_each(hierObj.refSubFiles().begin(), hierObj.refSubFiles().end(),
[&](FileMapping& fileObj)
{
- if (pass == getPass(fileObj))
+ if (pass == this->getPass(fileObj)) //"this->" required by two-pass lookup as enforced by GCC 4.7
tryReportingError([&] { synchronizeFile(fileObj); }, procCallback_);
});
@@ -1281,7 +1369,7 @@ void SynchronizeFolderPair::runPass(HierarchyObject& hierObj)
std::for_each(hierObj.refSubLinks().begin(), hierObj.refSubLinks().end(),
[&](SymLinkMapping& linkObj)
{
- if (pass == getPass(linkObj))
+ if (pass == this->getPass(linkObj))
tryReportingError([&] { synchronizeLink(linkObj); }, procCallback_);
});
@@ -1289,7 +1377,7 @@ void SynchronizeFolderPair::runPass(HierarchyObject& hierObj)
std::for_each(hierObj.refSubDirs().begin(), hierObj.refSubDirs().end(),
[&](DirMapping& dirObj)
{
- if (pass == getPass(dirObj))
+ if (pass == this->getPass(dirObj))
tryReportingError([&] { synchronizeFolder(dirObj); }, procCallback_);
this->runPass<pass>(dirObj); //recurse
@@ -1301,7 +1389,7 @@ void SynchronizeFolderPair::runPass(HierarchyObject& hierObj)
namespace
{
inline
-bool getTargetDir(SyncOperation syncOp, SelectedSide* side)
+bool getTargetDirection(SyncOperation syncOp, SelectedSide* side)
{
switch (syncOp)
{
@@ -1340,7 +1428,7 @@ void SynchronizeFolderPair::synchronizeFile(FileMapping& fileObj) const
SelectedSide sideTrg = LEFT_SIDE;
- if (getTargetDir(syncOp, &sideTrg))
+ if (getTargetDirection(syncOp, &sideTrg))
{
if (sideTrg == LEFT_SIDE)
synchronizeFileInt<LEFT_SIDE>(fileObj, syncOp);
@@ -1493,7 +1581,7 @@ void SynchronizeFolderPair::synchronizeLink(SymLinkMapping& linkObj) const
SelectedSide sideTrg = LEFT_SIDE;
- if (getTargetDir(syncOp, &sideTrg))
+ if (getTargetDirection(syncOp, &sideTrg))
{
if (sideTrg == LEFT_SIDE)
synchronizeLinkInt<LEFT_SIDE>(linkObj, syncOp);
@@ -1617,7 +1705,7 @@ void SynchronizeFolderPair::synchronizeFolder(DirMapping& dirObj) const
SelectedSide sideTrg = LEFT_SIDE;
- if (getTargetDir(syncOp, &sideTrg))
+ if (getTargetDirection(syncOp, &sideTrg))
{
if (sideTrg == LEFT_SIDE)
synchronizeFolderInt<LEFT_SIDE>(dirObj, syncOp);
@@ -1761,13 +1849,18 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
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.push_back(std::make_pair(DeletionHandling(folderPairCfg.handleDeletion,
folderPairCfg.custDelFolder,
+ subDirShort,
j->getBaseDirPf<LEFT_SIDE>(),
procCallback),
DeletionHandling(folderPairCfg.handleDeletion,
folderPairCfg.custDelFolder,
+ subDirShort,
j->getBaseDirPf<RIGHT_SIDE>(),
procCallback)));
}
@@ -1847,7 +1940,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 directory name must not be empty!"));
+ procCallback.reportFatalError(_("Target folder name must not be empty."));
skipFolderPair[folderIndex] = true;
continue;
}
@@ -1885,7 +1978,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
//check if user-defined directory for deletion was specified
if (folderPairCfg.custDelFolder.empty())
{
- procCallback.reportFatalError(_("Directory for file versioning was not supplied!"));
+ procCallback.reportFatalError(_("Folder name for file versioning must not be empty."));
skipFolderPair[folderIndex] = true;
continue;
}
@@ -1958,7 +2051,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
{
//show the first few conflicts in warning message also:
std::wstring warningMessage = _("Unresolved conflicts existing!") +
- L" (" + toStringSep(statisticsTotal.getConflict()) + L")\n\n";
+ L" (" + toGuiString(statisticsTotal.getConflict()) + L")\n\n";
const auto& firstConflicts = statisticsTotal.getFirstConflicts(); //get first few sync conflicts
for (auto iter = firstConflicts.begin(); iter != firstConflicts.end(); ++iter)
@@ -2012,7 +2105,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
warningMessage += L"\n";
std::for_each(recyclMissing.begin(), recyclMissing.end(),
- [&](const Zstring& path) { warningMessage += L"\n" + utf8CvrtTo<std::wstring>(path); });
+ [&](const Zstring& path) { warningMessage += L"\n" + utfCvrtTo<std::wstring>(path); });
procCallback.reportWarning(warningMessage, m_warnings.warningRecyclerMissing);
}
@@ -2030,7 +2123,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
if (!conflictDirs.empty())
{
- std::wstring warningMessage = _("A directory will be modified which is part of multiple folder pairs! Please review synchronization settings!") + L"\n";
+ 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);
@@ -2048,6 +2141,18 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
//loop through all directory pairs
for (auto j = begin(folderCmp); j != end(folderCmp); ++j)
{
+ //------------------------------------------------------------------------------------------
+ //always report folder pairs for log file, even if there is no work to do
+ std::wstring left = _("Left") + L": ";
+ std::wstring right = _("Right") + L": ";
+ makeSameLength(left, right);
+
+ const std::wstring statusTxt = _("Processing folder pair:") + L"\n" +
+ L" " + left + fmtFileName(j->getBaseDirPf<LEFT_SIDE >()) + L"\n" +
+ L" " + right + fmtFileName(j->getBaseDirPf<RIGHT_SIDE>());
+ procCallback.reportInfo(statusTxt);
+ //------------------------------------------------------------------------------------------
+
const size_t folderIndex = j - begin(folderCmp);
const FolderPairSyncCfg& folderPairCfg = syncConfig[folderIndex];
@@ -2060,19 +2165,6 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
if (EqualFilename()(j->getBaseDirPf<LEFT_SIDE>(), j->getBaseDirPf<RIGHT_SIDE>()))
continue;
- //------------------------------------------------------------------------------------------
- //info about folder pair to be processed (useful for logfile)
- std::wstring left = _("Left") + L": ";
- std::wstring right = _("Right") + L": ";
- makeSameLength(left, right);
-
- const std::wstring statusTxt = _("Processing folder pair:") + L" \n" +
- L" " + left + fmtFileName(j->getBaseDirPf<LEFT_SIDE >()) + L" \n" +
- L" " + right + fmtFileName(j->getBaseDirPf<RIGHT_SIDE>());
- procCallback.reportInfo(statusTxt);
-
- //------------------------------------------------------------------------------------------
-
//create base directories first (if not yet existing) -> no symlink or attribute copying! -> single error message instead of one per file (e.g. unplugged network drive)
const Zstring dirnameLeft = beforeLast(j->getBaseDirPf<LEFT_SIDE>(), FILE_NAME_SEPARATOR);
if (!dirnameLeft.empty() && !dirExistsUpdating(dirnameLeft, false, procCallback))
@@ -2133,7 +2225,7 @@ void SyncProcess::startSynchronizationProcess(const std::vector<FolderPairSyncCf
}
catch (const std::exception& e)
{
- procCallback.reportFatalError(utf8CvrtTo<std::wstring>(e.what()));
+ procCallback.reportFatalError(utfCvrtTo<std::wstring>(e.what()));
}
}
@@ -2154,11 +2246,11 @@ public:
virtual void deleteTargetFile(const Zstring& targetFile) { cmd_(); }
- virtual void updateCopyStatus(UInt64 totalBytesTransferred)
+ virtual void updateCopyStatus(Int64 bytesDelta)
{
//inform about the (differential) processed amount of data
- statusHandler_.updateProcessedData(0, to<Int64>(totalBytesTransferred) - bytesReported_); //throw()! -> this ensures client and service provider are in sync!
- bytesReported_ = to<Int64>(totalBytesTransferred); //
+ statusHandler_.updateProcessedData(0, bytesDelta); //throw()! -> this ensures client and service provider are in sync!
+ bytesReported_ += bytesDelta; //
statusHandler_.requestUiRefresh(); //may throw
}
@@ -2174,7 +2266,7 @@ private:
template <SelectedSide side, class DelTargetCommand>
void SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, const DelTargetCommand& cmd, FileAttrib& newAttr) const
{
- const UInt64 expectedBytesToCpy = fileObj.getFileSize<OtherSide<side>::result>();
+ const Int64 expectedBytesToCpy = to<Int64>(fileObj.getFileSize<OtherSide<side>::result>());
Zstring source = fileObj.getFullName<OtherSide<side>::result>();
const Zstring& target = fileObj.getBaseDirPf<side>() + fileObj.getRelativeName<OtherSide<side>::result>();
@@ -2201,10 +2293,14 @@ void SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, const
&newAttr); //throw FileError, ErrorFileLocked
//inform about the (remaining) processed amount of data
- if (newAttr.fileSize != expectedBytesToCpy)
- procCallback_.updateTotalData(0, to<Int64>(newAttr.fileSize) - to<Int64>(expectedBytesToCpy)); //adjust total: file may have changed after comparison!
- procCallback_.updateProcessedData(0, to<Int64>(newAttr.fileSize) - bytesReported);
- bytesReported = to<Int64>(newAttr.fileSize);
+ if (bytesReported != expectedBytesToCpy)
+ procCallback_.updateTotalData(0, bytesReported - expectedBytesToCpy);
+
+#ifdef FFS_WIN
+ warn_static("clarify: return physical(bytesReported) or logical(newAttr) numbers")
+#endif
+
+ //we model physical statistic numbers => adjust total: consider ADS, sparse, compressed files -> transferred bytes may differ from file size (which is just a rough guess)!
guardStatistics.dismiss();
};
@@ -2237,6 +2333,12 @@ void SynchronizeFolderPair::copyFileUpdatingTo(const FileMapping& fileObj, const
#endif
+#ifdef FFS_WIN
+ warn_static("make verification stats a first class citizen?")
+#endif
+
+
+
//#################### Verification #############################
if (verifyCopiedFiles_)
{
diff --git a/synchronization.h b/synchronization.h
index 4dcd8402..525a74d1 100644
--- a/synchronization.h
+++ b/synchronization.h
@@ -15,8 +15,7 @@
namespace zen
{
-
-class SyncStatistics //this class counts logical operations (create, update, delete) + bytes
+class SyncStatistics //this class counts *logical* operations, (create, update, delete + bytes), *not* disk accesses!
{
//-> note the fundamental difference to counting disk accesses!
public:
@@ -46,9 +45,9 @@ private:
void recurse(const HierarchyObject& hierObj);
- void getFileNumbers(const FileMapping& fileObj);
- void getLinkNumbers(const SymLinkMapping& linkObj);
- void getDirNumbers(const DirMapping& dirObj);
+ void calcStats(const FileMapping& fileObj);
+ void calcStats(const SymLinkMapping& linkObj);
+ void calcStats(const DirMapping& dirObj);
int createLeft, createRight;
int updateLeft, updateRight;
@@ -79,7 +78,9 @@ std::vector<FolderPairSyncCfg> extractSyncCfg(const MainConfiguration& mainCfg);
class SyncProcess
{
public:
- SyncProcess(xmlAccess::OptionalDialogs& warnings,
+ SyncProcess(const std::wstring& jobName, //may be empty
+ const std::wstring& timestamp,
+ xmlAccess::OptionalDialogs& warnings,
bool verifyCopiedFiles,
bool copyLockedFiles,
bool copyFilePermissions,
@@ -87,7 +88,7 @@ public:
bool runWithBackgroundPriority,
ProcessCallback& handler);
- //CONTRACT: syncConfig must have SAME SIZE folderCmp and correspond row-wise!
+ //CONTRACT: syncConfig must have SAME SIZE as folderCmp and correspond row-wise!
void startSynchronizationProcess(const std::vector<FolderPairSyncCfg>& syncConfig, FolderComparison& folderCmp);
private:
@@ -106,6 +107,7 @@ private:
ProcessCallback& procCallback;
std::unique_ptr<ScheduleForBackgroundProcessing> procBackground;
+ const Zstring custDelDirShortname; //e.g. "SyncJob 2012-05-15 131513"
};
diff --git a/ui/batch_config.cpp b/ui/batch_config.cpp
index cbb667ad..10cee822 100644
--- a/ui/batch_config.cpp
+++ b/ui/batch_config.cpp
@@ -45,7 +45,7 @@ private:
virtual void OnCmpSettings (wxCommandEvent& event);
virtual void OnSyncSettings (wxCommandEvent& event);
virtual void OnConfigureFilter(wxCommandEvent& event);
- virtual void OnHelp (wxCommandEvent& event);
+ virtual void OnHelp (wxCommandEvent& event) { displayHelpEntry(L"html/Schedule a Batch Job.html"); }
void OnCompSettingsContext(wxCommandEvent& event);
void OnSyncSettingsContext(wxCommandEvent& event);
@@ -368,15 +368,15 @@ void BatchDialog::updateGui() //re-evaluate gui after config changes
m_staticTextSyncVariant->SetLabel(cfg.mainCfg.getSyncVariantName());
//set filter icon
- if (isNullFilter(cfg.mainCfg.globalFilter))
+ if (!isNullFilter(cfg.mainCfg.globalFilter))
{
- setImage(*m_bpButtonFilter, GlobalResources::getImage(wxT("filterOff")));
- m_bpButtonFilter->SetToolTip(_("No filter selected"));
+ setImage(*m_bpButtonFilter, GlobalResources::getImage(L"filter"));
+ m_bpButtonFilter->SetToolTip(_("Filter is active"));
}
else
{
- setImage(*m_bpButtonFilter, GlobalResources::getImage(wxT("filterOn")));
- m_bpButtonFilter->SetToolTip(_("Filter is active"));
+ setImage(*m_bpButtonFilter, greyScale(GlobalResources::getImage(L"filter")));
+ m_bpButtonFilter->SetToolTip(_("No filter selected"));
}
m_panelOverview->Layout (); //adjust stuff inside scrolled window
@@ -461,15 +461,6 @@ void BatchDialog::OnFilesDropped(FileDropEvent& event)
}
-void BatchDialog::OnHelp(wxCommandEvent& event)
-{
-#ifdef FFS_WIN
- zen::displayHelpEntry(wxT("html\\ScheduleBatch.html"));
-#elif defined FFS_LINUX
- zen::displayHelpEntry(wxT("html/ScheduleBatch.html"));
-#endif
-}
-
/*
void BatchDialog::showNotebookpage(wxWindow* page, const wxString& pageName, bool show)
{
@@ -513,8 +504,8 @@ void BatchDialog::OnSaveBatchJob(wxCommandEvent& event)
wxEmptyString,
wxEmptyString,
defaultFileName,
- wxString(_("FreeFileSync batch file")) + L" (*.ffs_batch)|*.ffs_batch",
- wxFD_SAVE /*| wxFD_OVERWRITE_PROMPT*/); //creating this on freestore leads to memleak!
+ _("FreeFileSync batch file") + L" (*.ffs_batch)|*.ffs_batch" + L"|" +_("All files") + L" (*.*)|*",
+ wxFD_SAVE | wxFD_OVERWRITE_PROMPT); //creating this on freestore leads to memleak!
if (filePicker.ShowModal() == wxID_OK)
{
const wxString newFileName = filePicker.GetPath();
@@ -530,9 +521,9 @@ void BatchDialog::OnLoadBatchJob(wxCommandEvent& event)
{
wxFileDialog filePicker(this,
wxEmptyString,
- beforeLast(proposedBatchFileName, utf8CvrtTo<wxString>(FILE_NAME_SEPARATOR)), //set default dir: empty string if "currentConfigFileName" is empty or has no path separator
+ beforeLast(proposedBatchFileName, utfCvrtTo<wxString>(FILE_NAME_SEPARATOR)), //set default dir: empty string if "currentConfigFileName" is empty or has no path separator
wxEmptyString,
- wxString(_("FreeFileSync configuration")) + wxT(" (*.ffs_batch;*.ffs_gui)|*.ffs_batch;*.ffs_gui"),
+ _("FreeFileSync batch file") + L" (*.ffs_batch;*.ffs_gui)|*.ffs_batch;*.ffs_gui" + L"|" +_("All files") + L" (*.*)|*",
wxFD_OPEN | wxFD_MULTIPLE); //creating this on freestore leads to memleak!
if (filePicker.ShowModal() == wxID_OK)
{
diff --git a/ui/batch_status_handler.cpp b/ui/batch_status_handler.cpp
index 7254f570..89d28084 100644
--- a/ui/batch_status_handler.cpp
+++ b/ui/batch_status_handler.cpp
@@ -37,8 +37,8 @@ public:
virtual std::shared_ptr<TraverseCallback>
onDir (const Zchar* shortName, const Zstring& fullName) { return nullptr; } //DON'T traverse into subdirs
- virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) {}
- virtual HandleError onError (const std::wstring& errorText) { return TRAV_ERROR_IGNORE; } //errors are not really critical in this context
+ 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
private:
const Zstring prefix_;
@@ -50,9 +50,11 @@ private:
class LogFile //throw FileError
{
public:
- LogFile(const Zstring& logfileDirectory, const wxString& jobName) :
+ LogFile(const Zstring& logfileDirectory,
+ const std::wstring& jobName,
+ const std::wstring& timestamp) :
jobName_(jobName), //throw FileError
- logfileName(findUniqueLogname(logfileDirectory, jobName))
+ logfileName(findUnusedLogname(logfileDirectory, jobName, timestamp))
{
logFile.Open(toWx(logfileName), L"w");
if (!logFile.IsOpened())
@@ -78,11 +80,11 @@ public:
results.push_back(L"");
if (itemsTotal != 0 || dataTotal != 0) //=: sync phase was reached and there were actual items to sync
{
- results.push_back(L" " + _("Items processed:") + L" " + toStringSep(itemsSynced) + L" (" + filesizeToShortString(dataSynced) + L")");
+ 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" " + toStringSep(itemsTotal - itemsSynced) + L" (" + filesizeToShortString(dataTotal - dataSynced) + L")");
+ results.push_back(L" " + _("Items remaining:") + L" " + toGuiString(itemsTotal - itemsSynced) + L" (" + filesizeToShortString(dataTotal - dataSynced) + L")");
}
results.push_back(L" " + _("Total time:") + L" " + wxTimeSpan::Milliseconds(totalTime.Time()).Format());
@@ -100,7 +102,7 @@ public:
const auto& entries = log.getEntries();
for (auto iter = entries.begin(); iter != entries.end(); ++iter)
{
- const std::string& msg = utf8CvrtTo<std::string>(formatMessage(*iter));
+ const std::string& msg = utfCvrtTo<std::string>(formatMessage(*iter));
logFile.Write(msg.c_str(), msg.size()); //better do UTF8 conversion ourselves rather than to rely on wxWidgets
logFile.Write(L'\n');
}
@@ -116,7 +118,6 @@ public:
FindLogfiles traverseCallback(toZ(jobName_), logFiles);
traverseFolder(beforeLast(logfileName, FILE_NAME_SEPARATOR), //throw();
- false, //don't follow symlinks
traverseCallback);
if (logFiles.size() <= maxCount)
@@ -132,7 +133,9 @@ public:
//Zstring getLogfileName() const { return logfileName; }
private:
- static Zstring findUniqueLogname(const Zstring& logfileDirectory, const wxString& jobName)
+ static Zstring findUnusedLogname(const Zstring& logfileDirectory,
+ const std::wstring& jobName,
+ const std::wstring& timestamp)
{
//create logfile directory
Zstring logfileDir = logfileDirectory.empty() ?
@@ -143,7 +146,7 @@ private:
createDirectory(logfileDir); //throw FileError; create recursively if necessary
//assemble logfile name
- const Zstring logfileName = appendSeparator(logfileDir) + toZ(jobName) + Zstr(" ") + formatTime<Zstring>(Zstr("%Y-%m-%d %H%M%S"));
+ const Zstring logfileName = appendSeparator(logfileDir) + toZ(jobName) + Zstr(" ") + utfCvrtTo<Zstring>(timestamp);
//ensure uniqueness
Zstring output = logfileName + Zstr(".log");
@@ -162,29 +165,30 @@ private:
//##############################################################################################################################
BatchStatusHandler::BatchStatusHandler(bool showProgress,
- const wxString& jobName,
+ const std::wstring& jobName,
+ const std::wstring& timestamp,
const wxString& logfileDirectory,
size_t logFileCountMax,
const xmlAccess::OnError handleError,
const SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode
- int& returnVal,
+ FfsReturnCode& returnCode,
const std::wstring& execWhenFinished,
std::vector<std::wstring>& execFinishedHistory) :
switchBatchToGui_(switchBatchToGui),
showFinalResults(showProgress), //=> exit immediately or wait when finished
switchToGuiRequested(false),
handleError_(handleError),
- returnValue(returnVal),
+ returnCode_(returnCode),
syncStatusFrame(*this, *this, nullptr, showProgress, jobName, execWhenFinished, execFinishedHistory)
{
if (logFileCountMax > 0) //init log file: starts internal timer!
if (!tryReportingError([&]
{
- logFile.reset(new LogFile(toZ(logfileDirectory), jobName)); //throw FileError
+ logFile.reset(new LogFile(toZ(logfileDirectory), jobName, timestamp)); //throw FileError
logFile->limitLogfileCount(logFileCountMax); //throw()
}, *this))
{
- returnValue = -7;
+ returnCode_ = FFS_RC_ABORTED;
throw BatchAbortProcess();
}
@@ -200,13 +204,13 @@ BatchStatusHandler::~BatchStatusHandler()
std::wstring finalStatus;
if (abortIsRequested())
{
- returnValue = -4;
+ returnCode_ = FFS_RC_ABORTED;
finalStatus = _("Synchronization aborted!");
errorLog.logMsg(finalStatus, TYPE_ERROR);
}
else if (totalErrors > 0)
{
- returnValue = -5;
+ returnCode_ = FFS_RC_FINISHED_WITH_ERRORS;
finalStatus = _("Synchronization completed with errors!");
errorLog.logMsg(finalStatus, TYPE_WARNING);
}
diff --git a/ui/batch_status_handler.h b/ui/batch_status_handler.h
index cc23019e..56e9e781 100644
--- a/ui/batch_status_handler.h
+++ b/ui/batch_status_handler.h
@@ -12,6 +12,7 @@
#include "../lib/process_xml.h"
#include "progress_indicator.h"
#include "switch_to_gui.h"
+#include "lib/return_codes.h"
class LogFile;
@@ -23,12 +24,13 @@ class BatchStatusHandler : public zen::StatusHandler
{
public:
BatchStatusHandler(bool showProgress, //defines: -start minimized and -quit immediately when finished
- const wxString& jobName,
+ 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 xmlAccess::OnError handleError,
const zen::SwitchToGui& switchBatchToGui, //functionality to change from batch mode to GUI mode
- int& returnVal,
+ zen::FfsReturnCode& returnCode,
const std::wstring& execWhenFinished,
std::vector<std::wstring>& execFinishedHistory);
~BatchStatusHandler();
@@ -50,7 +52,7 @@ private:
bool switchToGuiRequested;
xmlAccess::OnError handleError_;
zen::ErrorLog errorLog; //list of non-resolved errors and warnings
- int& returnValue;
+ zen::FfsReturnCode& returnCode_;
SyncStatus syncStatusFrame; //the window managed by SyncStatus has longer lifetime than this handler!
std::unique_ptr<LogFile> logFile; //optional!
diff --git a/ui/check_version.cpp b/ui/check_version.cpp
index 37fa16ff..5856f95a 100644
--- a/ui/check_version.cpp
+++ b/ui/check_version.cpp
@@ -52,7 +52,7 @@ bool getOnlineVersion(wxString& version)
}
-const wxChar VERSION_SEP = wxT('.');
+const wchar_t VERSION_SEP = L'.';
std::vector<size_t> parseVersion(const wxString& version)
@@ -69,7 +69,7 @@ std::vector<size_t> parseVersion(const wxString& version)
}
-bool newerVersionExists(const wxString& onlineVersion)
+bool isNewerVersion(const wxString& onlineVersion)
{
std::vector<size_t> current = parseVersion(zen::currentVersion);
std::vector<size_t> online = parseVersion(onlineVersion);
@@ -91,14 +91,11 @@ void zen::checkForUpdateNow(wxWindow* parent)
return;
}
- if (newerVersionExists(onlineVersion))
+ if (isNewerVersion(onlineVersion))
{
- const int rv = wxMessageBox(_("A newer version of FreeFileSync is available:") + L" v" + onlineVersion + L". " + _("Download now?"),
- _("Information"),
- wxYES_NO | wxICON_QUESTION,
- parent);
- if (rv == wxYES)
- wxLaunchDefaultBrowser(wxString(L"http://sourceforge.net/projects/freefilesync/files/freefilesync/v") + onlineVersion + L"/");
+ if (showQuestionDlg(parent, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL,
+ _("A newer version of FreeFileSync is available:") + L" " + onlineVersion + L"\n\n" + _("Download now?")) == ReturnQuestionDlg::BUTTON_YES)
+ wxLaunchDefaultBrowser(L"http://sourceforge.net/projects/freefilesync/files/freefilesync/v" + onlineVersion + L"/");
}
else
wxMessageBox(_("FreeFileSync is up to date!"), _("Information"), wxICON_INFORMATION, parent);
@@ -116,17 +113,22 @@ void zen::checkForUpdatePeriodically(wxWindow* parent, long& lastUpdateCheck)
{
if (lastUpdateCheck == 0)
{
- const bool checkRegularly = showQuestionDlg(parent, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_NO,
- _("Do you want FreeFileSync to automatically check for updates every week?") + L"\n" +
- _("(Requires an Internet connection!)")) == ReturnQuestionDlg::BUTTON_YES;
- if (checkRegularly)
+ switch (showQuestionDlg(parent, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_NO | ReturnQuestionDlg::BUTTON_CANCEL,
+ _("Do you want FreeFileSync to automatically check for updates every week?") + L"\n" +
+ _("(Requires an Internet connection!)")))
{
- lastUpdateCheck = 123; //some old date (few seconds after 1970)
+ case ReturnQuestionDlg::BUTTON_YES:
+ lastUpdateCheck = 123; //some old date (few seconds after 1970) different from 0 and -1
+ checkForUpdatePeriodically(parent, lastUpdateCheck); //check for updates now
+ break;
- checkForUpdatePeriodically(parent, lastUpdateCheck); //check for updates now
+ case ReturnQuestionDlg::BUTTON_NO:
+ lastUpdateCheck = -1; //don't check for updates anymore
+ break;
+
+ case ReturnQuestionDlg::BUTTON_CANCEL:
+ break;
}
- else
- lastUpdateCheck = -1; //don't check for updates anymore
}
else if (wxGetLocalTime() >= lastUpdateCheck + 7 * 24 * 3600) //check weekly
{
@@ -136,14 +138,11 @@ void zen::checkForUpdatePeriodically(wxWindow* parent, long& lastUpdateCheck)
lastUpdateCheck = wxGetLocalTime();
- if (newerVersionExists(onlineVersion))
+ if (isNewerVersion(onlineVersion))
{
- const int rv = wxMessageBox(_("A newer version of FreeFileSync is available:") + L" v" + onlineVersion + L". " + _("Download now?"),
- _("Information"),
- wxYES_NO | wxICON_QUESTION,
- parent);
- if (rv == wxYES)
- wxLaunchDefaultBrowser(wxString(L"http://sourceforge.net/projects/freefilesync/files/freefilesync/v") + onlineVersion + L"/");
+ if (showQuestionDlg(parent, ReturnQuestionDlg::BUTTON_YES | ReturnQuestionDlg::BUTTON_CANCEL,
+ _("A newer version of FreeFileSync is available:") + L" " + onlineVersion + L"\n\n" + _("Download now?")) == ReturnQuestionDlg::BUTTON_YES)
+ wxLaunchDefaultBrowser(L"http://sourceforge.net/projects/freefilesync/files/freefilesync/v" + onlineVersion + L"/");
}
}
}
diff --git a/ui/custom_grid.cpp b/ui/custom_grid.cpp
index fdb72161..d6180dd0 100644
--- a/ui/custom_grid.cpp
+++ b/ui/custom_grid.cpp
@@ -9,6 +9,7 @@
#include <wx/settings.h>
#include <zen/i18n.h>
#include <zen/file_error.h>
+#include <zen/basic_math.h>
#include <wx+/tooltip.h>
#include <wx+/format_unit.h>
#include <wx+/string_conv.h>
@@ -195,7 +196,44 @@ protected:
dc.GradientFillLinear(rect, getColorSelectionGradientFrom(), getColorSelectionGradientTo(), wxEAST);
//ignore focus
else
- clearArea(dc, rect, getBackGroundColor(row));
+ {
+ //alternate background color to improve readability (while lacking cell borders)
+ if (getRowDisplayType(row) == DISP_TYPE_NORMAL && row % 2 == 0)
+ {
+ //accessibility, support high-contrast schemes => work with user-defined background color!
+ const auto backCol = getBackGroundColor(row);
+
+ auto colorDist = [](const wxColor& lhs, const wxColor& rhs) //just some metric
+ {
+ return numeric::power<2>(static_cast<int>(lhs.Red ()) - static_cast<int>(rhs.Red ())) +
+ numeric::power<2>(static_cast<int>(lhs.Green()) - static_cast<int>(rhs.Green())) +
+ numeric::power<2>(static_cast<int>(lhs.Blue ()) - static_cast<int>(rhs.Blue ()));
+ };
+
+ const int levelDiff = 20;
+ const int level = colorDist(backCol, *wxBLACK) < colorDist(backCol, *wxWHITE) ?
+ levelDiff : -levelDiff; //brighten or darken
+
+ auto incChannel = [level](unsigned char c) { return static_cast<unsigned char>(std::max(0, std::min(255, c + level))); };
+
+ const wxColor backColAlt(incChannel(backCol.Red ()),
+ incChannel(backCol.Green()),
+ incChannel(backCol.Blue ()));
+
+ //clearArea(dc, rect, backColAlt);
+
+ //add some nice background gradient
+ wxRect rectUpper = rect;
+ rectUpper.height /= 2;
+ wxRect rectLower = rect;
+ rectLower.y += rectUpper.height;
+ rectLower.height -= rectUpper.height;
+ dc.GradientFillLinear(rectUpper, backColAlt, getBackGroundColor(row), wxSOUTH);
+ dc.GradientFillLinear(rectLower, backColAlt, getBackGroundColor(row), wxNORTH);
+ }
+ else
+ clearArea(dc, rect, getBackGroundColor(row));
+ }
}
else
clearArea(dc, rect, wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
@@ -203,41 +241,71 @@ protected:
wxColor getBackGroundColor(size_t row) const
{
- wxColor backGroundCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
+ //accessibility: always set both foreground AND background colors!
+ // => harmonize with renderCell()!
- if (const FileSystemObject* fsObj = getRawData(row))
+ switch (getRowDisplayType(row))
{
- //mark filtered rows
- if (!fsObj->isActive())
+ case DISP_TYPE_NORMAL:
+ break;
+ case DISP_TYPE_FOLDER:
+ return COLOR_GREY;
+ case DISP_TYPE_SYMLINK:
+ return COLOR_ORANGE;
+ case DISP_TYPE_INACTIVE:
return COLOR_NOT_ACTIVE;
- else if (!fsObj->isEmpty<side>()) //always show not existing files/dirs/symlinks as empty
- {
- //mark directories and symlinks
- struct GetRowColor : public FSObjectVisitor
- {
- GetRowColor(wxColour& background) : background_(background) {}
- virtual void visit(const FileMapping& fileObj) {}
- virtual void visit(const SymLinkMapping& linkObj)
- {
- background_ = COLOR_ORANGE;
- }
- virtual void visit(const DirMapping& dirObj)
- {
- background_ = COLOR_GREY;
- }
- private:
- wxColour& background_;
- } getCol(backGroundCol);
- fsObj->accept(getCol);
- }
}
- return backGroundCol;
+ return wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
}
const FileSystemObject* getRawData(size_t row) const { return gridDataView_ ? gridDataView_->getObject(row) : nullptr; }
private:
+ enum DisplayType
+ {
+ DISP_TYPE_NORMAL,
+ DISP_TYPE_FOLDER,
+ DISP_TYPE_SYMLINK,
+ DISP_TYPE_INACTIVE,
+ };
+
+
+ DisplayType getRowDisplayType(size_t row) const
+ {
+ const FileSystemObject* fsObj = getRawData(row);
+ if (!fsObj )
+ return DISP_TYPE_NORMAL;
+
+ //mark filtered rows
+ if (!fsObj->isActive())
+ return DISP_TYPE_INACTIVE;
+
+ if (fsObj->isEmpty<side>()) //always show not existing files/dirs/symlinks as empty
+ return DISP_TYPE_NORMAL;
+
+ DisplayType output = DISP_TYPE_NORMAL;
+ //mark directories and symlinks
+ struct GetRowType : public FSObjectVisitor
+ {
+ GetRowType(DisplayType& result) : result_(result) {}
+
+ virtual void visit(const FileMapping& fileObj) {}
+ virtual void visit(const SymLinkMapping& linkObj)
+ {
+ result_ = DISP_TYPE_SYMLINK;
+ }
+ virtual void visit(const DirMapping& dirObj)
+ {
+ result_ = DISP_TYPE_FOLDER;
+ }
+ private:
+ DisplayType& result_;
+ } getType(output);
+ fsObj->accept(getType);
+ return output;
+ }
+
virtual size_t getRowCount() const
{
if (gridDataView_)
@@ -265,7 +333,7 @@ private:
switch (colType_)
{
case COL_TYPE_FULL_PATH:
- value = toWx(beforeLast(fileObj.getFullName<side>(), FILE_NAME_SEPARATOR));
+ value = toWx(appendSeparator(beforeLast(fileObj.getBaseDirPf<side>() + fileObj.getObjRelativeName(), FILE_NAME_SEPARATOR)));
break;
case COL_TYPE_FILENAME: //filename
value = toWx(fileObj.getShortName<side>());
@@ -278,7 +346,7 @@ private:
break;
case COL_TYPE_SIZE: //file size
if (!fsObj_.isEmpty<side>())
- value = zen::toStringSep(fileObj.getFileSize<side>());
+ value = zen::toGuiString(fileObj.getFileSize<side>());
break;
case COL_TYPE_DATE: //date
if (!fsObj_.isEmpty<side>())
@@ -295,7 +363,7 @@ private:
switch (colType_)
{
case COL_TYPE_FULL_PATH:
- value = toWx(beforeLast(linkObj.getFullName<side>(), FILE_NAME_SEPARATOR));
+ value = toWx(appendSeparator(beforeLast(linkObj.getBaseDirPf<side>() + linkObj.getObjRelativeName(), FILE_NAME_SEPARATOR)));
break;
case COL_TYPE_FILENAME: //filename
value = toWx(linkObj.getShortName<side>());
@@ -325,7 +393,7 @@ private:
switch (colType_)
{
case COL_TYPE_FULL_PATH:
- value = toWx(dirObj.getFullName<side>());
+ value = toWx(appendSeparator(beforeLast(dirObj.getBaseDirPf<side>() + dirObj.getObjRelativeName(), FILE_NAME_SEPARATOR)));
break;
case COL_TYPE_FILENAME:
value = toWx(dirObj.getShortName<side>());
@@ -338,7 +406,7 @@ private:
break;
case COL_TYPE_SIZE: //file size
if (!fsObj_.isEmpty<side>())
- value = _("<Directory>");
+ value = _("<Folder>");
break;
case COL_TYPE_DATE: //date
if (!fsObj_.isEmpty<side>())
@@ -366,7 +434,18 @@ private:
virtual void renderCell(Grid& grid, wxDC& dc, const wxRect& rect, size_t row, ColumnType colType)
{
- wxRect rectTmp = drawCellBorder(dc, rect);
+ wxRect rectTmp = rect;
+
+ //draw horizontal border if required
+ auto dispTp = getRowDisplayType(row);
+ if (dispTp == getRowDisplayType(row + 1) && dispTp != DISP_TYPE_NORMAL)
+ {
+ const wxColor colorGridLine = wxColour(192, 192, 192); //light grey
+ wxDCPenChanger dummy2(dc, wxPen(colorGridLine, 1, wxSOLID));
+ dc.DrawLine(rect.GetBottomLeft(), rect.GetBottomRight() + wxPoint(1, 0));
+ rectTmp.height -= 1;
+ }
+ //wxRect rectTmp = drawCellBorder(dc, rect);
const bool isActive = [&]() -> bool
{
@@ -436,6 +515,10 @@ private:
rectTmp.width -= iconSize;
}
+ std::unique_ptr<wxDCTextColourChanger> dummy3;
+ if (getRowDisplayType(row) != DISP_TYPE_NORMAL)
+ dummy3 = make_unique<wxDCTextColourChanger>(dc, *wxBLACK); //accessibility: always set both foreground AND background colors!
+
//draw text
if (static_cast<ColumnTypeRim>(colType) == COL_TYPE_SIZE && grid.GetLayoutDirection() != wxLayout_RightToLeft)
{
@@ -462,9 +545,9 @@ private:
if (static_cast<ColumnTypeRim>(colType) == COL_TYPE_FILENAME && iconMgr_)
bestSize += CELL_BORDER + iconMgr_->iconBuffer.getSize();
- bestSize += CELL_BORDER + dc.GetTextExtent(getValue(row, colType)).GetWidth();
+ bestSize += CELL_BORDER + dc.GetTextExtent(getValue(row, colType)).GetWidth() + CELL_BORDER;
- return bestSize + CELL_BORDER + 1; //add additional right border + 1 pix for border line
+ return bestSize; // + 1 pix for cell border line -> not used anymore!
}
virtual wxString getColumnLabel(ColumnType colType) const
@@ -478,7 +561,7 @@ private:
case COL_TYPE_REL_PATH:
return _("Relative path");
case COL_TYPE_DIRECTORY:
- return _("Directory");
+ return _("Base folder");
case COL_TYPE_SIZE:
return _("Size");
case COL_TYPE_DATE:
@@ -682,7 +765,7 @@ public:
GridDataMiddle(const std::shared_ptr<const zen::GridView>& gridDataView, Grid& grid) :
GridDataBase(grid),
gridDataView_(gridDataView),
- syncPreviewActive(true) {}
+ showSyncAction_(true) {}
void onSelectBegin(const wxPoint& clientPos, size_t row, ColumnType colType)
{
@@ -775,7 +858,7 @@ public:
toolTip.hide(); //handle custom tooltip
}
- void setSyncPreviewActive(bool value) { syncPreviewActive = value; }
+ void showSyncAction(bool value) { showSyncAction_ = value; }
private:
virtual size_t getRowCount() const { return 0; /*if there are multiple grid components, only the first one will be polled for row count!*/ }
@@ -785,7 +868,7 @@ private:
if (static_cast<ColumnTypeMiddle>(colType) == COL_TYPE_MIDDLE_VALUE)
{
if (const FileSystemObject* fsObj = getRawData(row))
- return syncPreviewActive ? getSymbol(fsObj->getSyncOperation()) : getSymbol(fsObj->getCategory());
+ return showSyncAction_ ? getSymbol(fsObj->getSyncOperation()) : getSymbol(fsObj->getCategory());
}
return wxEmptyString;
}
@@ -802,10 +885,10 @@ private:
{
case COL_TYPE_MIDDLE_VALUE:
{
- wxRect rectInside = drawCellBorder(dc, rect);
-
if (const FileSystemObject* fsObj = getRawData(row))
{
+ wxRect rectInside = drawCellBorder(dc, rect);
+
//draw checkbox
wxRect checkBoxArea = rectInside;
checkBoxArea.SetWidth(CHECK_BOX_WIDTH);
@@ -822,7 +905,7 @@ private:
rectInside.x += CHECK_BOX_WIDTH;
//synchronization preview
- if (syncPreviewActive)
+ if (showSyncAction_)
{
if (rowHighlighted && highlightBlock != BLOCKPOS_CHECK_BOX)
switch (highlightBlock)
@@ -864,7 +947,7 @@ private:
wxRect rectInside = drawColumnLabelBorder(dc, rect);
drawColumnLabelBackground(dc, rectInside, highlighted);
- if (syncPreviewActive)
+ if (showSyncAction_)
dc.DrawLabel(wxEmptyString, GlobalResources::getImage(L"syncSmall"), rectInside, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL);
else
dc.DrawLabel(wxEmptyString, GlobalResources::getImage(L"compareSmall"), rectInside, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL);
@@ -887,7 +970,7 @@ private:
return COLOR_NOT_ACTIVE;
else
{
- if (syncPreviewActive) //synchronization preview
+ if (showSyncAction_) //synchronization preview
{
switch (fsObj->getSyncOperation()) //evaluate comparison result and sync direction
{
@@ -959,7 +1042,7 @@ private:
if (rect.width > CHECK_BOX_WIDTH && rect.height > 0)
{
const FileSystemObject* const fsObj = getRawData(row);
- if (fsObj && syncPreviewActive &&
+ if (fsObj && showSyncAction_ &&
fsObj->getSyncOperation() != SO_EQUAL) //in sync-preview equal files shall be treated as in cmp result, i.e. as full checkbox
{
// cell:
@@ -987,7 +1070,7 @@ private:
{
if (const FileSystemObject* fsObj = getRawData(row))
{
- if (syncPreviewActive) //synchronization preview
+ if (showSyncAction_) //synchronization preview
{
const wchar_t* imageName = [&]() -> const wchar_t*
{
@@ -1066,10 +1149,10 @@ private:
toolTip.hide(); //if invalid row...
}
- virtual wxString getToolTip(ColumnType colType) const { return syncPreviewActive ? _("Synchronization Preview") : _("Comparison Result"); }
+ virtual wxString getToolTip(ColumnType colType) const { return showSyncAction_ ? _("Action") : _("Category"); }
std::shared_ptr<const zen::GridView> gridDataView_;
- bool syncPreviewActive;
+ bool showSyncAction_;
std::unique_ptr<std::pair<size_t, BlockPosition>> highlight; //(row, block) current mouse highlight
std::unique_ptr<std::pair<size_t, BlockPosition>> dragSelection; //(row, block)
std::unique_ptr<wxBitmap> buffer; //avoid costs of recreating this temporal variable
@@ -1354,10 +1437,10 @@ void gridview::setNavigationMarker(Grid& grid,
}
-void gridview::setSyncPreviewActive(Grid& grid, bool value)
+void gridview::showSyncAction(Grid& grid, bool value)
{
if (auto* provMiddle = dynamic_cast<GridDataMiddle*>(grid.getDataProvider(gridview::COMP_MIDDLE)))
- provMiddle->setSyncPreviewActive(value);
+ provMiddle->showSyncAction(value);
else
assert(false);
}
diff --git a/ui/custom_grid.h b/ui/custom_grid.h
index 8993777b..58a421e6 100644
--- a/ui/custom_grid.h
+++ b/ui/custom_grid.h
@@ -26,7 +26,7 @@ void init(Grid& grid, const std::shared_ptr<const GridView>& gridDataView);
std::vector<Grid::ColumnAttribute> convertConfig(const std::vector<ColumnAttributeRim>& attribs); //+ make consistent
std::vector<ColumnAttributeRim> convertConfig(const std::vector<Grid::ColumnAttribute>& attribs); //
-void setSyncPreviewActive(Grid& grid, bool value);
+void showSyncAction(Grid& grid, bool value);
void setupIcons(Grid& grid, bool show, IconBuffer::IconSize sz);
diff --git a/ui/dir_name.cpp b/ui/dir_name.cpp
index cf43accf..fcab49ca 100644
--- a/ui/dir_name.cpp
+++ b/ui/dir_name.cpp
@@ -126,7 +126,7 @@ void DirectoryName<NameControl>::OnFilesDropped(FileDropEvent& event)
setDirectoryName(fileName, &dirName_, &dirPicker_, dirName_, staticText_);
else
{
- wxString parentName = beforeLast(fileName, utf8CvrtTo<wxString>(FILE_NAME_SEPARATOR)); //returns empty string if ch not found
+ wxString parentName = beforeLast(fileName, utfCvrtTo<wxString>(FILE_NAME_SEPARATOR)); //returns empty string if ch not found
#ifdef FFS_WIN
if (endsWith(parentName, L":")) //volume name
parentName += FILE_NAME_SEPARATOR;
diff --git a/ui/exec_finished_box.cpp b/ui/exec_finished_box.cpp
index edc57d58..e776c673 100644
--- a/ui/exec_finished_box.cpp
+++ b/ui/exec_finished_box.cpp
@@ -31,24 +31,24 @@ std::vector<std::pair<std::wstring, std::wstring>> getDefaultCommands() //(gui n
#ifdef FFS_WIN
if (zen::vistaOrLater())
{
- addEntry(_("Shut down"), L"shutdown /s /t 60");
- addEntry(_("Log off" ), L"shutdown /l");
addEntry(_("Standby" ), L"rundll32.exe powrprof.dll,SetSuspendState Sleep"); //suspend/Suspend to RAM/sleep
+ addEntry(_("Log off" ), L"shutdown /l");
+ addEntry(_("Shut down"), L"shutdown /s /t 60");
//addEntry(_("Hibernate"), L"shutdown /h"); //Suspend to disk -> Standby is better anyway
}
else //XP
{
- addEntry(_("Shut down"), L"shutdown -s -t 60");
+ addEntry(_("Standby"), L"rundll32.exe powrprof.dll,SetSuspendState"); //this triggers standby OR hibernate, depending on whether hibernate setting is active!
addEntry(_("Log off" ), L"shutdown -l");
+ addEntry(_("Shut down"), L"shutdown -s -t 60");
//no suspend on XP?
- addEntry(_("Standby"), L"rundll32.exe powrprof.dll,SetSuspendState"); //this triggers standby OR hibernate, depending on whether hibernate setting is active!
}
#elif defined FFS_LINUX
+ addEntry(_("Standby" ), L"sudo pm-suspend");
+ addEntry(_("Log off" ), L"gnome-session-quit"); //alternative requiring admin: sudo killall Xorg
addEntry(_("Shut down"), L"dbus-send --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown");
//alternative requiring admin: sudo shutdown -h 1
- addEntry(_("Log off" ), L"gnome-session-quit"); //alternative requiring admin: sudo killall Xorg
- addEntry(_("Standby" ), L"sudo pm-suspend");
//addEntry(_("Hibernate"), L"sudo pm-hibernate");
//alternative: "pmi action suspend" and "pmi action hibernate", require "sudo apt-get install powermanagement-interaface"
diff --git a/ui/folder_history_box.cpp b/ui/folder_history_box.cpp
index 72204c3a..d30ada64 100644
--- a/ui/folder_history_box.cpp
+++ b/ui/folder_history_box.cpp
@@ -148,10 +148,11 @@ void FolderHistoryBox::OnMouseWheel(wxMouseEvent& event)
wxWindow* wnd = this;
while ((wnd = wnd->GetParent()) != nullptr) //silence MSVC warning
if (dynamic_cast<wxScrolledWindow*>(wnd) != nullptr)
- {
- wnd->GetEventHandler()->AddPendingEvent(event);
- break;
- }
+ if (wxEvtHandler* evtHandler = wnd->GetEventHandler())
+ {
+ evtHandler->AddPendingEvent(event);
+ break;
+ }
// event.Skip();
}
diff --git a/ui/folder_pair.h b/ui/folder_pair.h
index d80d8a05..3dadc07c 100644
--- a/ui/folder_pair.h
+++ b/ui/folder_pair.h
@@ -18,6 +18,7 @@
#include <wx+/string_conv.h>
#include "../lib/norm_filter.h"
#include <wx+/button.h>
+#include <wx+/image_tools.h>
namespace zen
{
@@ -46,38 +47,38 @@ public:
{
if (altCompConfig.get())
{
- setImage(*basicPanel_.m_bpButtonAltCompCfg, GlobalResources::getImage(wxT("cmpConfigSmall")));
+ setImage(*basicPanel_.m_bpButtonAltCompCfg, GlobalResources::getImage(L"cmpConfigSmall"));
basicPanel_.m_bpButtonAltCompCfg->SetToolTip(wxString(_("Select alternate comparison settings")) + wxT(" \n") +
wxT("(") + getVariantName(altCompConfig->compareVar) + wxT(")"));
}
else
{
- setImage(*basicPanel_.m_bpButtonAltCompCfg, GlobalResources::getImage(wxT("cmpConfigSmallGrey")));
+ setImage(*basicPanel_.m_bpButtonAltCompCfg, greyScale(GlobalResources::getImage(L"cmpConfigSmall")));
basicPanel_.m_bpButtonAltCompCfg->SetToolTip(_("Select alternate comparison settings"));
}
if (altSyncConfig.get())
{
- setImage(*basicPanel_.m_bpButtonAltSyncCfg, GlobalResources::getImage(wxT("syncConfigSmall")));
+ setImage(*basicPanel_.m_bpButtonAltSyncCfg, GlobalResources::getImage(L"syncConfigSmall"));
basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(wxString(_("Select alternate synchronization settings")) + wxT(" \n") +
wxT("(") + getVariantName(altSyncConfig->directionCfg.var) + wxT(")"));
}
else
{
- setImage(*basicPanel_.m_bpButtonAltSyncCfg, GlobalResources::getImage(wxT("syncConfigSmallGrey")));
+ setImage(*basicPanel_.m_bpButtonAltSyncCfg, greyScale(GlobalResources::getImage(L"syncConfigSmall")));
basicPanel_.m_bpButtonAltSyncCfg->SetToolTip(_("Select alternate synchronization settings"));
}
//test for Null-filter
- if (isNullFilter(localFilter))
+ if (!isNullFilter(localFilter))
{
- setImage(*basicPanel_.m_bpButtonLocalFilter, GlobalResources::getImage(L"filterOffSmall"));
- basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("No filter selected"));
+ setImage(*basicPanel_.m_bpButtonLocalFilter, GlobalResources::getImage(L"filterSmall"));
+ basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("Filter is active"));
}
else
{
- setImage(*basicPanel_.m_bpButtonLocalFilter, GlobalResources::getImage(L"filterOnSmall"));
- basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("Filter is active"));
+ setImage(*basicPanel_.m_bpButtonLocalFilter, greyScale(GlobalResources::getImage(L"filterSmall")));
+ basicPanel_.m_bpButtonLocalFilter->SetToolTip(_("No filter selected"));
}
}
diff --git a/ui/grid_view.cpp b/ui/grid_view.cpp
index 80ff895c..2162394f 100644
--- a/ui/grid_view.cpp
+++ b/ui/grid_view.cpp
@@ -71,13 +71,14 @@ void GridView::updateView(Predicate pred)
if (pred(*fsObj))
{
//save row position for direct random access to FileMapping or DirMapping
- rowPositions.insert(std::make_pair(ref.objId, viewRef.size())); //costs: 0.28 µs per call - MSVC based on std::set
+ this->rowPositions.insert(std::make_pair(ref.objId, viewRef.size())); //costs: 0.28 µs per call - MSVC based on std::set
+ //"this->" required by two-pass lookup as enforced by GCC 4.7
//save row position to identify first child *on sorted subview* of DirMapping or BaseDirMapping in case latter are filtered out
const HierarchyObject* parent = &(fsObj->parent());
for (;;) //map all yet unassociated parents to this row
{
- const auto rv = rowPositionsFirstChild.insert(std::make_pair(parent, viewRef.size()));
+ const auto rv = this->rowPositionsFirstChild.insert(std::make_pair(parent, viewRef.size()));
if (!rv.second)
break;
@@ -88,7 +89,7 @@ void GridView::updateView(Predicate pred)
}
//build subview
- viewRef.push_back(ref.objId);
+ this->viewRef.push_back(ref.objId);
}
});
}
diff --git a/ui/gui_generated.cpp b/ui/gui_generated.cpp
index 4c42caf1..c59028c2 100644
--- a/ui/gui_generated.cpp
+++ b/ui/gui_generated.cpp
@@ -23,7 +23,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
#endif
m_menuFile->Append( m_menuItem10 );
- m_menuItem11 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("2. &Synchronize...") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL );
+ m_menuItem11 = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("2. &Synchronize") ) + wxT('\t') + wxT("F6"), wxEmptyString, wxITEM_NORMAL );
#ifdef __WXMSW__
m_menuItem11->SetBitmaps( wxNullBitmap );
#elif defined( __WXGTK__ )
@@ -33,7 +33,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_menuFile->AppendSeparator();
- m_menuItemNew = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL );
+ m_menuItemNew = new wxMenuItem( m_menuFile, wxID_NEW, wxString( _("&New") ) + wxT('\t') + wxT("Ctrl+N"), wxEmptyString, wxITEM_NORMAL );
#ifdef __WXMSW__
m_menuItemNew->SetBitmaps( wxNullBitmap );
#elif defined( __WXGTK__ )
@@ -41,16 +41,16 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
#endif
m_menuFile->Append( m_menuItemNew );
- m_menuItemSave = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("S&ave configuration...") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL );
- m_menuFile->Append( m_menuItemSave );
-
- m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_ANY, wxString( _("&Load configuration...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL );
+ m_menuItemLoad = new wxMenuItem( m_menuFile, wxID_OPEN, wxString( _("&Open...") ) + wxT('\t') + wxT("Ctrl+O"), wxEmptyString, wxITEM_NORMAL );
m_menuFile->Append( m_menuItemLoad );
+ m_menuItemSave = new wxMenuItem( m_menuFile, wxID_SAVE, wxString( _("&Save...") ) + wxT('\t') + wxT("Ctrl+S"), wxEmptyString, wxITEM_NORMAL );
+ m_menuFile->Append( m_menuItemSave );
+
m_menuFile->AppendSeparator();
wxMenuItem* m_menuItem4;
- m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) + wxT('\t') + wxT("Ctrl+Q"), wxEmptyString, wxITEM_NORMAL );
+ m_menuItem4 = new wxMenuItem( m_menuFile, wxID_EXIT, wxString( _("&Quit") ) , wxEmptyString, wxITEM_NORMAL );
m_menuFile->Append( m_menuItem4 );
m_menubar1->Append( m_menuFile, _("&Program") );
@@ -82,7 +82,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_menuHelp->AppendSeparator();
- m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About...") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL );
+ m_menuItemAbout = new wxMenuItem( m_menuHelp, wxID_ABOUT, wxString( _("&About") ) + wxT('\t') + wxT("Shift+F1"), wxEmptyString, wxITEM_NORMAL );
m_menuHelp->Append( m_menuItemAbout );
m_menubar1->Append( m_menuHelp, _("&Help") );
@@ -172,7 +172,7 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
fgSizer12->Add( m_bpButtonSyncConfig, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 3 );
- m_buttonStartSync = new zen::BitmapButton( m_panelTopButtons, wxID_ANY, _("Synchronize..."), wxDefaultPosition, wxSize( 180,42 ), 0 );
+ m_buttonStartSync = new zen::BitmapButton( m_panelTopButtons, wxID_ANY, _("Synchronize"), wxDefaultPosition, wxSize( 180,42 ), 0 );
m_buttonStartSync->SetFont( wxFont( 14, 74, 90, 92, false, wxEmptyString ) );
m_buttonStartSync->SetToolTip( _("Start synchronization") );
@@ -352,9 +352,152 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
m_gridNavi->SetScrollRate( 5, 5 );
bSizerPanelHolder->Add( m_gridNavi, 1, wxEXPAND, 5 );
- m_gridMain = new zen::Grid( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
+ m_panelCenter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer1711;
+ bSizer1711 = new wxBoxSizer( wxVERTICAL );
+
+ m_gridMain = new zen::Grid( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHSCROLL|wxVSCROLL );
m_gridMain->SetScrollRate( 5, 5 );
- bSizerPanelHolder->Add( m_gridMain, 1, wxEXPAND, 5 );
+ bSizer1711->Add( m_gridMain, 1, wxEXPAND, 5 );
+
+ m_panelStatusBar = new wxPanel( m_panelCenter, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer451;
+ bSizer451 = new wxBoxSizer( wxHORIZONTAL );
+
+ bSizer451->SetMinSize( wxSize( -1,22 ) );
+ wxBoxSizer* bSizer53;
+ bSizer53 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusLeftDirs->Wrap( -1 );
+ bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 );
+
+ m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusLeftFiles->Wrap( -1 );
+ bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 );
+
+ m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusLeftBytes->Wrap( -1 );
+ bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer451->Add( bSizer53, 1, wxALIGN_BOTTOM|wxEXPAND, 5 );
+
+ m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer451->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxEXPAND, 2 );
+
+
+ bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusMiddle->Wrap( -1 );
+ m_staticTextStatusMiddle->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) );
+
+ bSizer451->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer451->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 );
+
+ wxBoxSizer* bSizer52;
+ bSizer52 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL );
+
+ m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusRightDirs->Wrap( -1 );
+ bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+ bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 );
+
+ m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 );
+
+ m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusRightFiles->Wrap( -1 );
+ bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 );
+
+ m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatusRightBytes->Wrap( -1 );
+ bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer451->Add( bSizer52, 1, wxALIGN_BOTTOM|wxEXPAND, 5 );
+
+
+ m_panelStatusBar->SetSizer( bSizer451 );
+ m_panelStatusBar->Layout();
+ bSizer451->Fit( m_panelStatusBar );
+ bSizer1711->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+
+ m_panelCenter->SetSizer( bSizer1711 );
+ m_panelCenter->Layout();
+ bSizer1711->Fit( m_panelCenter );
+ bSizerPanelHolder->Add( m_panelCenter, 1, wxEXPAND, 5 );
m_panelConfig = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
bSizerConfig = new wxBoxSizer( wxHORIZONTAL );
@@ -362,16 +505,16 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer151;
bSizer151 = new wxBoxSizer( wxHORIZONTAL );
- m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- m_bpButtonSave->SetToolTip( _("Save current configuration to file") );
-
- bSizer151->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
m_bpButtonLoad = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
m_bpButtonLoad->SetToolTip( _("Load configuration from file") );
bSizer151->Add( m_bpButtonLoad, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bpButtonSave = new wxBitmapButton( m_panelConfig, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ m_bpButtonSave->SetToolTip( _("Save current configuration to file") );
+
+ bSizer151->Add( m_bpButtonSave, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
bSizerConfig->Add( bSizer151, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
@@ -406,278 +549,280 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
bSizerPanelHolder->Add( m_panelFilter, 0, 0, 5 );
m_panelStatistics = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ bSizer1801 = new wxBoxSizer( wxHORIZONTAL );
+
+
+ bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 );
+
bSizerStatistics = new wxBoxSizer( wxHORIZONTAL );
+ wxBoxSizer* bSizer1712;
+ bSizer1712 = new wxBoxSizer( wxVERTICAL );
- bSizerStatistics->Add( 0, 0, 1, wxEXPAND, 5 );
- wxFlexGridSizer* fgSizer5;
- fgSizer5 = new wxFlexGridSizer( 2, 2, 0, 5 );
- fgSizer5->SetFlexibleDirection( wxHORIZONTAL );
- fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+ bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 );
- m_bitmapCreate = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreate->SetToolTip( _("Number of files and directories that will be created") );
+ m_bitmapCreateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
- fgSizer5->Add( m_bitmapCreate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer1712->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_textCtrlCreate = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlCreate->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlCreate->SetToolTip( _("Number of files and directories that will be created") );
- fgSizer5->Add( m_textCtrlCreate, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1712->Add( 0, 0, 1, wxEXPAND, 5 );
- m_bitmapUpdate = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdate->SetToolTip( _("Number of files that will be overwritten") );
- fgSizer5->Add( m_bitmapUpdate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer1712->Add( 2, 2, 0, 0, 5 );
- m_textCtrlUpdate = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlUpdate->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlUpdate->SetToolTip( _("Number of files that will be overwritten") );
+ m_staticTextCreateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateLeft->Wrap( -1 );
+ m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
- fgSizer5->Add( m_textCtrlUpdate, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1712->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizerStatistics->Add( fgSizer5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 );
+ bSizerStatistics->Add( bSizer1712, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- wxFlexGridSizer* fgSizer6;
- fgSizer6 = new wxFlexGridSizer( 2, 2, 0, 5 );
- fgSizer6->SetFlexibleDirection( wxHORIZONTAL );
- fgSizer6->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
- m_bitmapDelete = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDelete->SetToolTip( _("Number of files and directories that will be deleted") );
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
- fgSizer6->Add( m_bitmapDelete, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ wxBoxSizer* bSizer172;
+ bSizer172 = new wxBoxSizer( wxVERTICAL );
- m_textCtrlDelete = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlDelete->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlDelete->SetToolTip( _("Number of files and directories that will be deleted") );
- fgSizer6->Add( m_textCtrlDelete, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
- m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapData->SetToolTip( _("Total amount of data that will be transferred") );
+ m_bitmapUpdateLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
- fgSizer6->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer172->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- m_textCtrlData = new wxTextCtrl( m_panelStatistics, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlData->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") );
- fgSizer6->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer172->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizerStatistics->Add( fgSizer6, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 );
+ bSizer172->Add( 2, 2, 0, 0, 5 );
+ m_staticTextUpdateLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateLeft->Wrap( -1 );
+ m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
- bSizerStatistics->Add( 0, 0, 1, wxEXPAND, 5 );
+ bSizer172->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_panelStatistics->SetSizer( bSizerStatistics );
- m_panelStatistics->Layout();
- bSizerStatistics->Fit( m_panelStatistics );
- bSizerPanelHolder->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizerStatistics->Add( bSizer172, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL );
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
- bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
+ wxBoxSizer* bSizer173;
+ bSizer173 = new wxBoxSizer( wxVERTICAL );
- m_bpButtonSyncCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonSyncCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonSyncDirOverwLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonSyncDirOverwLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
- m_bpButtonSyncDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonSyncDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ m_bitmapDeleteLeft = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
- m_bpButtonLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer173->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- m_bpButtonLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer173->Add( 0, 0, 1, wxEXPAND, 5 );
- m_bpButtonDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonSyncDirNone = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonSyncDirNone, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer173->Add( 2, 2, 0, 0, 5 );
- m_bpButtonRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ m_staticTextDeleteLeft = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteLeft->Wrap( -1 );
+ m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
- m_bpButtonRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer173->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- m_bpButtonSyncDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonSyncDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonSyncDirOverwRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonSyncDirOverwRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizerStatistics->Add( bSizer173, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_bpButtonSyncCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonSyncCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_bpButtonConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
- bSizerViewFilter->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
+ bSizerData = new wxBoxSizer( wxVERTICAL );
- bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
+ bSizerData->Add( 0, 0, 1, wxEXPAND, 5 );
- m_panelViewFilter->SetSizer( bSizerViewFilter );
- m_panelViewFilter->Layout();
- bSizerViewFilter->Fit( m_panelViewFilter );
- bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmapData = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapData->SetToolTip( _("Total amount of data that will be transferred") );
- m_panelStatusBar = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSTATIC_BORDER|wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer451;
- bSizer451 = new wxBoxSizer( wxHORIZONTAL );
+ bSizerData->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizer451->SetMinSize( wxSize( -1,22 ) );
- wxBoxSizer* bSizer53;
- bSizer53 = new wxBoxSizer( wxHORIZONTAL );
+ bSizerData->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
- bSizerStatusLeftDirectories = new wxBoxSizer( wxHORIZONTAL );
+ bSizerData->Add( 2, 2, 0, 0, 5 );
- m_bitmapSmallDirectoryLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusLeftDirectories->Add( m_bitmapSmallDirectoryLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_staticTextData = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextData->Wrap( -1 );
+ m_staticTextData->SetToolTip( _("Total amount of data that will be transferred") );
+ bSizerData->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizerStatusLeftDirectories->Add( 2, 0, 0, 0, 5 );
- m_staticTextStatusLeftDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusLeftDirs->Wrap( -1 );
- bSizerStatusLeftDirectories->Add( m_staticTextStatusLeftDirs, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizerStatistics->Add( bSizerData, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- bSizer53->Add( bSizerStatusLeftDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
- bSizerStatusLeftFiles = new wxBoxSizer( wxHORIZONTAL );
+ wxBoxSizer* bSizer176;
+ bSizer176 = new wxBoxSizer( wxVERTICAL );
- bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 );
+ bSizer176->Add( 0, 0, 1, wxEXPAND, 5 );
- m_bitmapSmallFileLeft = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusLeftFiles->Add( m_bitmapSmallFileLeft, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmapDeleteRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+ bSizer176->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizerStatusLeftFiles->Add( 2, 0, 0, 0, 5 );
- m_staticTextStatusLeftFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusLeftFiles->Wrap( -1 );
- bSizerStatusLeftFiles->Add( m_staticTextStatusLeftFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer176->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizerStatusLeftFiles->Add( 10, 0, 0, 0, 5 );
+ bSizer176->Add( 2, 2, 0, 0, 5 );
- m_staticTextStatusLeftBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusLeftBytes->Wrap( -1 );
- bSizerStatusLeftFiles->Add( m_staticTextStatusLeftBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_staticTextDeleteRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteRight->Wrap( -1 );
+ m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
+ bSizer176->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer53->Add( bSizerStatusLeftFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizerStatistics->Add( bSizer176, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- bSizer53->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
- bSizer451->Add( bSizer53, 1, wxALIGN_BOTTOM|wxEXPAND, 5 );
+ wxBoxSizer* bSizer177;
+ bSizer177 = new wxBoxSizer( wxVERTICAL );
- m_staticline9 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer451->Add( m_staticline9, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxEXPAND, 2 );
+ bSizer177->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmapUpdateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
- m_staticTextStatusMiddle = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusMiddle->Wrap( -1 );
- m_staticTextStatusMiddle->SetFont( wxFont( 8, 70, 90, 92, false, wxEmptyString ) );
+ bSizer177->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizer451->Add( m_staticTextStatusMiddle, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer177->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizer451->Add( 26, 0, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_staticline10 = new wxStaticLine( m_panelStatusBar, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
- bSizer451->Add( m_staticline10, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP, 2 );
+ bSizer177->Add( 2, 2, 0, 0, 5 );
- wxBoxSizer* bSizer52;
- bSizer52 = new wxBoxSizer( wxHORIZONTAL );
+ m_staticTextUpdateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateRight->Wrap( -1 );
+ m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
+ bSizer177->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer52->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
- bSizerStatusRightDirectories = new wxBoxSizer( wxHORIZONTAL );
+ bSizerStatistics->Add( bSizer177, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_bitmapSmallDirectoryRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusRightDirectories->Add( m_bitmapSmallDirectoryRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizerStatistics->Add( 5, 5, 0, 0, 5 );
- bSizerStatusRightDirectories->Add( 2, 0, 0, 0, 5 );
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxVERTICAL );
- m_staticTextStatusRightDirs = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusRightDirs->Wrap( -1 );
- bSizerStatusRightDirectories->Add( m_staticTextStatusRightDirs, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer178->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizer52->Add( bSizerStatusRightDirectories, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmapCreateRight = new wxStaticBitmap( m_panelStatistics, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
- bSizerStatusRightFiles = new wxBoxSizer( wxHORIZONTAL );
+ bSizer178->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 );
+ bSizer178->Add( 0, 0, 1, wxEXPAND, 5 );
- m_bitmapSmallFileRight = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- bSizerStatusRightFiles->Add( m_bitmapSmallFileRight, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer178->Add( 2, 2, 0, 0, 5 );
- bSizerStatusRightFiles->Add( 2, 0, 0, 0, 5 );
+ m_staticTextCreateRight = new wxStaticText( m_panelStatistics, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateRight->Wrap( -1 );
+ m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
- m_staticTextStatusRightFiles = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusRightFiles->Wrap( -1 );
- bSizerStatusRightFiles->Add( m_staticTextStatusRightFiles, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer178->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizerStatusRightFiles->Add( 10, 0, 0, 0, 5 );
+ bSizerStatistics->Add( bSizer178, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_staticTextStatusRightBytes = new wxStaticText( m_panelStatusBar, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextStatusRightBytes->Wrap( -1 );
- bSizerStatusRightFiles->Add( m_staticTextStatusRightBytes, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1801->Add( bSizerStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 );
- bSizer52->Add( bSizerStatusRightFiles, 0, wxALIGN_CENTER_VERTICAL, 5 );
- wxBoxSizer* bSizer50;
- bSizer50 = new wxBoxSizer( wxHORIZONTAL );
+ bSizer1801->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizer50->Add( 0, 0, 1, wxALIGN_BOTTOM, 5 );
+ m_panelStatistics->SetSizer( bSizer1801 );
+ m_panelStatistics->Layout();
+ bSizer1801->Fit( m_panelStatistics );
+ bSizerPanelHolder->Add( m_panelStatistics, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_bitmapResizeCorner = new wxStaticBitmap( m_panelStatusBar, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 10,10 ), 0 );
- bSizer50->Add( m_bitmapResizeCorner, 0, wxALIGN_BOTTOM, 5 );
+ m_panelViewFilter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ bSizerViewFilter = new wxBoxSizer( wxHORIZONTAL );
- bSizer52->Add( bSizer50, 1, wxALIGN_BOTTOM, 5 );
+ bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
+ m_bpButtonSyncCreateLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonSyncCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizer451->Add( bSizer52, 1, wxALIGN_BOTTOM|wxEXPAND, 5 );
+ m_bpButtonSyncDirOverwLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonSyncDirOverwLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ m_bpButtonSyncDeleteLeft = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonSyncDeleteLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_panelStatusBar->SetSizer( bSizer451 );
- m_panelStatusBar->Layout();
- bSizer451->Fit( m_panelStatusBar );
- bSizerPanelHolder->Add( m_panelStatusBar, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+ m_bpButtonLeftOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonLeftOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonLeftNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonLeftNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonEqual = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonEqual, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonDifferent = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonDifferent, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonSyncDirNone = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonSyncDirNone, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonRightNewer = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonRightNewer, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonRightOnly = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonRightOnly, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonSyncDeleteRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonSyncDeleteRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonSyncDirOverwRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonSyncDirOverwRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonSyncCreateRight = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonSyncCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+ m_bpButtonConflict = new ToggleButton( m_panelViewFilter, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW );
+ bSizerViewFilter->Add( m_bpButtonConflict, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ bSizerViewFilter->Add( 0, 0, 1, wxEXPAND, 5 );
+
+
+ m_panelViewFilter->SetSizer( bSizerViewFilter );
+ m_panelViewFilter->Layout();
+ bSizerViewFilter->Fit( m_panelViewFilter );
+ bSizerPanelHolder->Add( m_panelViewFilter, 0, wxALIGN_CENTER_VERTICAL, 5 );
this->SetSizer( bSizerPanelHolder );
@@ -688,8 +833,8 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
this->Connect( m_menuItem10->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) );
this->Connect( m_menuItem11->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) );
this->Connect( m_menuItemNew->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnNewConfig ) );
- this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ) );
this->Connect( m_menuItemLoad->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ) );
+ this->Connect( m_menuItemSave->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ) );
this->Connect( m_menuItem4->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) );
this->Connect( m_menuItemGlobSett->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) );
this->Connect( m_menuItem7->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) );
@@ -706,8 +851,8 @@ MainDialogGenerated::MainDialogGenerated( wxWindow* parent, wxWindowID id, const
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_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this );
m_bpButtonLoad->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this );
+ m_bpButtonSave->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), 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 );
@@ -734,9 +879,9 @@ MainDialogGenerated::~MainDialogGenerated()
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MainDialogGenerated::OnClose ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnCompare ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnStartSync ) );
- this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnNewConfig ) );
- this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ) );
- this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ) );
+ this->Disconnect( wxID_NEW, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnNewConfig ) );
+ this->Disconnect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ) );
+ this->Disconnect( wxID_SAVE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ) );
this->Disconnect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuQuit ) );
this->Disconnect( wxID_PREFERENCES, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuGlobalSettings ) );
this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MainDialogGenerated::OnMenuBatchJob ) );
@@ -753,8 +898,8 @@ MainDialogGenerated::~MainDialogGenerated()
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_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), NULL, this );
m_bpButtonLoad->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnLoadConfig ), NULL, this );
+ m_bpButtonSave->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainDialogGenerated::OnSaveConfig ), 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 );
@@ -863,31 +1008,27 @@ FolderPairGenerated::~FolderPairGenerated()
CompareStatusGenerated::CompareStatusGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
+
wxBoxSizer* bSizer40;
bSizer40 = new wxBoxSizer( wxVERTICAL );
bSizer40->Add( 0, 0, 1, wxEXPAND, 5 );
- wxBoxSizer* bSizer48;
- bSizer48 = new wxBoxSizer( wxHORIZONTAL );
-
- m_staticText30 = new wxStaticText( this, wxID_ANY, _("Operation:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText30->Wrap( -1 );
- m_staticText30->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
-
- bSizer48->Add( m_staticText30, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+ wxBoxSizer* bSizer182;
+ bSizer182 = new wxBoxSizer( wxVERTICAL );
- m_textCtrlStatus = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
- m_textCtrlStatus->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_textCtrlStatus = new wxTextCtrl( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
+ m_textCtrlStatus->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
- bSizer48->Add( m_textCtrlStatus, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer182->Add( m_textCtrlStatus, 0, wxEXPAND, 5 );
- bSizer40->Add( bSizer48, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 );
+ bSizer40->Add( bSizer182, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
m_gauge2 = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL|wxGA_SMOOTH );
- bSizer40->Add( m_gauge2, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
+ bSizer40->Add( m_gauge2, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
bSizer42 = new wxBoxSizer( wxHORIZONTAL );
@@ -1042,6 +1183,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Batch job"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText56->Wrap( -1 );
m_staticText56->SetFont( wxFont( 14, 70, 90, 92, false, wxEmptyString ) );
+ m_staticText56->SetForegroundColour( wxColour( 0, 0, 0 ) );
bSizer72->Add( m_staticText56, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
@@ -1051,7 +1193,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer72->Fit( m_panel8 );
bSizer87->Add( m_panel8, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
- m_staticText44 = new wxStaticText( this, wxID_ANY, _("Create a batch file and automate synchronization. To start in batch mode simply double-click this file or run command: FreeFileSync.exe SyncJob.ffs_batch. This can also be scheduled in your system's task planner."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText44 = new wxStaticText( this, wxID_ANY, _("Create a batch file to automate synchronization. Double-click this file or schedule in your system's task planner: FreeFileSync.exe <job name>.ffs_batch"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText44->Wrap( 480 );
bSizer87->Add( m_staticText44, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
@@ -1102,19 +1244,25 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer175->Add( bSizer1701, 1, wxALIGN_CENTER_VERTICAL, 5 );
wxStaticBoxSizer* sbSizer26;
- sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Filter files") ), wxVERTICAL );
+ sbSizer26 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Filter files") ), wxHORIZONTAL );
+
+
+ sbSizer26->Add( 20, 0, 0, 0, 5 );
m_bpButtonFilter = new wxBitmapButton( m_panelOverview, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), wxBU_AUTODRAW|wxFULL_REPAINT_ON_RESIZE );
sbSizer26->Add( m_bpButtonFilter, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 15 );
+ sbSizer26->Add( 20, 0, 0, 0, 5 );
+
+
bSizer175->Add( sbSizer26, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
wxBoxSizer* bSizer171;
bSizer171 = new wxBoxSizer( wxVERTICAL );
wxStaticBoxSizer* sbSizer252;
- sbSizer252 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Synchronize...") ), wxHORIZONTAL );
+ sbSizer252 = new wxStaticBoxSizer( new wxStaticBox( m_panelOverview, wxID_ANY, _("Synchronize") ), wxHORIZONTAL );
m_staticTextSyncVariant = new wxStaticText( m_panelOverview, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextSyncVariant->Wrap( -1 );
@@ -1299,27 +1447,31 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer1722 = new wxBoxSizer( wxHORIZONTAL );
wxStaticBoxSizer* sbSizer24;
- sbSizer24 = new wxStaticBoxSizer( new wxStaticBox( m_panelBatchSettings, wxID_ANY, _("Status feedback") ), wxVERTICAL );
+ 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, 0, wxALL|wxEXPAND, 5 );
+ sbSizer24->Add( m_checkBoxShowProgress, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+ wxBoxSizer* bSizer1702;
+ bSizer1702 = new wxBoxSizer( wxHORIZONTAL );
- bSizer1722->Add( sbSizer24, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
-
-
- bSizer1722->Add( 10, 0, 0, 0, 5 );
-
- wxStaticBoxSizer* sbSizer25;
- sbSizer25 = 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 );
wxArrayString m_choiceHandleErrorChoices;
m_choiceHandleError = new wxChoice( m_panelBatchSettings, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHandleErrorChoices, 0 );
m_choiceHandleError->SetSelection( 0 );
- sbSizer25->Add( m_choiceHandleError, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer1702->Add( m_choiceHandleError, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ sbSizer24->Add( bSizer1702, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
- bSizer1722->Add( sbSizer25, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ bSizer1722->Add( sbSizer24, 1, wxALIGN_CENTER_VERTICAL, 5 );
+
+
+ bSizer1722->Add( 10, 0, 0, 0, 5 );
bSizer172->Add( bSizer1722, 0, wxEXPAND, 5 );
@@ -1334,10 +1486,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_staticText96 = new wxStaticText( m_panelBatchSettings, wxID_ANY, _("Maximum number of log files:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText96->Wrap( -1 );
- bSizer152->Add( m_staticText96, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
-
-
- bSizer152->Add( 0, 0, 1, wxEXPAND, 5 );
+ 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 );
@@ -1349,7 +1498,7 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
wxBoxSizer* bSizer1721;
bSizer1721 = new wxBoxSizer( wxVERTICAL );
- m_staticText94 = new wxStaticText( m_panelLogfile, wxID_ANY, _("Select log file directory:"), wxDefaultPosition, wxDefaultSize, 0 );
+ 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 );
@@ -1390,13 +1539,13 @@ BatchDlgGenerated::BatchDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
wxBoxSizer* bSizer68;
bSizer68 = new wxBoxSizer( wxHORIZONTAL );
- m_buttonSave = new wxButton( this, wxID_SAVE, _("&Save"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonSave = new wxButton( this, wxID_SAVE, _("&Save..."), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonSave->SetDefault();
m_buttonSave->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
bSizer68->Add( m_buttonSave, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
- m_buttonLoad = new wxButton( this, wxID_OPEN, _("&Load"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonLoad = new wxButton( this, wxID_OPEN, _("&Open..."), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonLoad->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer68->Add( m_buttonLoad, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
@@ -1613,23 +1762,23 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
fgSizer1->Add( m_buttonAutomatic, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_staticText81 = 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_staticText81->Wrap( 410 );
- fgSizer1->Add( m_staticText81, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 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_buttonOneWay = new wxButton( this, wxID_ANY, _("Mirror ->>"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonOneWay->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_buttonOneWay, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ fgSizer1->Add( m_buttonMirror, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_staticText8 = 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_staticText8->Wrap( 410 );
- fgSizer1->Add( m_staticText8, 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 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 ) );
@@ -1641,23 +1790,23 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
fgSizer1->Add( m_buttonUpdate, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_staticText101 = new wxStaticText( this, wxID_ANY, _("Copy new or updated files to right folder."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText101->Wrap( 410 );
- fgSizer1->Add( m_staticText101, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 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_buttonUpdate1 = new wxButton( this, wxID_ANY, _("Custom"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
- m_buttonUpdate1->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_buttonUpdate1, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
+ fgSizer1->Add( m_buttonCustom, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- m_staticText9 = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText9->Wrap( 410 );
- fgSizer1->Add( m_staticText9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+ m_staticTextCustom = new wxStaticText( this, wxID_ANY, _("Configure your own synchronization rules."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCustom->Wrap( 410 );
+ fgSizer1->Add( m_staticTextCustom, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
sbSizer7->Add( fgSizer1, 0, 0, 5 );
@@ -1758,7 +1907,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerLeftOnly = new wxBoxSizer( wxHORIZONTAL );
m_bitmapLeftOnly = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapLeftOnly->SetToolTip( _("File/folder exists on left side only") );
+ m_bitmapLeftOnly->SetToolTip( _("Item exists on left side only") );
bSizerLeftOnly->Add( m_bitmapLeftOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
@@ -1774,7 +1923,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerRightOnly = new wxBoxSizer( wxHORIZONTAL );
m_bitmapRightOnly = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapRightOnly->SetToolTip( _("File/folder exists on right side only") );
+ m_bitmapRightOnly->SetToolTip( _("Item exists on right side only") );
bSizerRightOnly->Add( m_bitmapRightOnly, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
@@ -1790,7 +1939,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerLeftNewer = new wxBoxSizer( wxHORIZONTAL );
m_bitmapLeftNewer = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapLeftNewer->SetToolTip( _("Left file is newer") );
+ m_bitmapLeftNewer->SetToolTip( _("Left side is newer") );
bSizerLeftNewer->Add( m_bitmapLeftNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
@@ -1806,7 +1955,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerRightNewer = new wxBoxSizer( wxHORIZONTAL );
m_bitmapRightNewer = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapRightNewer->SetToolTip( _("Right file is newer") );
+ m_bitmapRightNewer->SetToolTip( _("Right side is newer") );
bSizerRightNewer->Add( m_bitmapRightNewer, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
@@ -1822,7 +1971,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerDifferent = new wxBoxSizer( wxHORIZONTAL );
m_bitmapDifferent = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapDifferent->SetToolTip( _("Files have different content") );
+ m_bitmapDifferent->SetToolTip( _("Items have different content") );
bSizerDifferent->Add( m_bitmapDifferent, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
@@ -1838,7 +1987,7 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
bSizerConflict = new wxBoxSizer( wxHORIZONTAL );
m_bitmapConflict = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 45,45 ), 0 );
- m_bitmapConflict->SetToolTip( _("Conflict/file cannot be categorized") );
+ m_bitmapConflict->SetToolTip( _("Conflict/item cannot be categorized") );
bSizerConflict->Add( m_bitmapConflict, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
@@ -1896,14 +2045,14 @@ SyncCfgDlgGenerated::SyncCfgDlgGenerated( wxWindow* parent, wxWindowID id, const
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_buttonOneWay->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this );
- m_buttonOneWay->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), 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_buttonUpdate1->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this );
- m_buttonUpdate1->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), 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_bpButtonLeftOnly->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this );
@@ -1924,14 +2073,14 @@ SyncCfgDlgGenerated::~SyncCfgDlgGenerated()
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_buttonOneWay->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncMirror ), NULL, this );
- m_buttonOneWay->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncMirrorDouble ), 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_buttonUpdate1->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnSyncCustom ), NULL, this );
- m_buttonUpdate1->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( SyncCfgDlgGenerated::OnSyncCustomDouble ), 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_bpButtonLeftOnly->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( SyncCfgDlgGenerated::OnExLeftSideOnly ), NULL, this );
@@ -2088,56 +2237,64 @@ CmpCfgDlgGenerated::~CmpCfgDlgGenerated()
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 );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- wxBoxSizer* bSizer172;
- bSizer172 = new wxBoxSizer( wxVERTICAL );
-
- m_panelBackground = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
bSizerTop = new wxBoxSizer( wxVERTICAL );
+ m_panelHeader = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelHeader->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
wxBoxSizer* bSizer42;
bSizer42 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmapStatus = new wxStaticBitmap( m_panelBackground, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 28,28 ), 0 );
- bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+ m_bitmapStatus = new wxStaticBitmap( m_panelHeader, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 28,28 ), 0 );
+ bSizer42->Add( m_bitmapStatus, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
- m_staticTextStatus = new wxStaticText( m_panelBackground, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextStatus = new wxStaticText( m_panelHeader, wxID_ANY, _("Synchronizing..."), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextStatus->Wrap( -1 );
m_staticTextStatus->SetFont( wxFont( 14, 70, 90, 92, false, wxEmptyString ) );
- bSizer42->Add( m_staticTextStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
+ bSizer42->Add( m_staticTextStatus, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxTOP, 5 );
- m_animationControl1 = new wxAnimationCtrl( m_panelBackground, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxDefaultSize, wxAC_DEFAULT_STYLE );
+ m_animationControl1 = new wxAnimationCtrl( m_panelHeader, wxID_ANY, wxNullAnimation, wxDefaultPosition, wxDefaultSize, wxAC_DEFAULT_STYLE );
m_animationControl1->SetMinSize( wxSize( 45,45 ) );
bSizer42->Add( m_animationControl1, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
- bSizerTop->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 );
+ bSizer181->Add( bSizer42, 0, wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 );
- bSizerCurrentOperation = new wxBoxSizer( wxHORIZONTAL );
- m_staticText2511 = new wxStaticText( m_panelBackground, wxID_ANY, _("Operation:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText2511->Wrap( -1 );
- m_staticText2511->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
+ m_panelHeader->SetSizer( bSizer181 );
+ m_panelHeader->Layout();
+ bSizer181->Fit( m_panelHeader );
+ bSizerTop->Add( m_panelHeader, 0, wxEXPAND, 5 );
- bSizerCurrentOperation->Add( m_staticText2511, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
+ m_staticlineHeader = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerTop->Add( m_staticlineHeader, 0, wxEXPAND, 5 );
- m_textCtrlInfo = new wxTextCtrl( m_panelBackground, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
- m_textCtrlInfo->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_panelProgress = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ wxBoxSizer* bSizer173;
+ bSizer173 = new wxBoxSizer( wxVERTICAL );
- bSizerCurrentOperation->Add( m_textCtrlInfo, 1, wxALIGN_CENTER_VERTICAL, 5 );
+ wxBoxSizer* bSizer1811;
+ bSizer1811 = new wxBoxSizer( wxVERTICAL );
+ m_textCtrlStatus = new wxTextCtrl( m_panelProgress, wxID_ANY, _("dummy"), wxDefaultPosition, wxSize( -1,-1 ), wxTE_READONLY|wxNO_BORDER );
+ m_textCtrlStatus->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
- bSizerTop->Add( bSizerCurrentOperation, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+ bSizer1811->Add( m_textCtrlStatus, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxLEFT, 5 );
- m_panelProgress = new wxPanel( m_panelBackground, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer173;
- bSizer173 = new wxBoxSizer( wxVERTICAL );
- bSizer171 = new wxBoxSizer( wxHORIZONTAL );
+ bSizer173->Add( bSizer1811, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+
+ m_gauge1 = new wxGauge( m_panelProgress, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL );
+ bSizer173->Add( m_gauge1, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 );
- bSizerProgressStat = new wxStaticBoxSizer( new wxStaticBox( m_panelProgress, wxID_ANY, wxEmptyString ), wxHORIZONTAL );
+ bSizer171 = new wxBoxSizer( wxHORIZONTAL );
wxFlexGridSizer* fgSizer10;
fgSizer10 = new wxFlexGridSizer( 0, 2, 0, 5 );
@@ -2227,34 +2384,28 @@ SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id,
fgSizer10->Add( m_staticTextTimeElapsed, 0, wxALIGN_BOTTOM, 5 );
- bSizerProgressStat->Add( fgSizer10, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
-
- bSizer171->Add( bSizerProgressStat, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ bSizer171->Add( fgSizer10, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 10 );
bSizer171->Add( 10, 0, 0, 0, 5 );
- m_panelGraph = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- m_panelGraph->SetBackgroundColour( wxColour( 255, 255, 255 ) );
+ m_panelGraph = new zen::Graph2D( m_panelProgress, wxID_ANY, wxDefaultPosition, wxSize( 340,130 ), wxTAB_TRAVERSAL );
+ m_panelGraph->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer171->Add( m_panelGraph, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
- bSizer173->Add( bSizer171, 1, wxEXPAND, 5 );
-
- m_gauge1 = new wxGauge( m_panelProgress, wxID_ANY, 100, wxDefaultPosition, wxSize( -1,14 ), wxGA_HORIZONTAL );
- bSizer173->Add( m_gauge1, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+ bSizer173->Add( bSizer171, 1, wxEXPAND|wxTOP|wxLEFT, 5 );
m_panelProgress->SetSizer( bSizer173 );
m_panelProgress->Layout();
bSizer173->Fit( m_panelProgress );
- bSizerTop->Add( m_panelProgress, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+ bSizerTop->Add( m_panelProgress, 1, wxEXPAND, 5 );
bSizerFinalStat = new wxBoxSizer( wxVERTICAL );
- m_listbookResult = new wxListbook( m_panelBackground, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLB_TOP );
+ m_listbookResult = new wxListbook( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLB_TOP );
wxSize m_listbookResultImageSize = wxSize( 180,1 );
int m_listbookResultIndex = 0;
wxImageList* m_listbookResultImages = new wxImageList( m_listbookResultImageSize.GetWidth(), m_listbookResultImageSize.GetHeight() );
@@ -2265,39 +2416,48 @@ SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id,
bSizerFinalStat->Add( m_listbookResult, 1, wxEXPAND, 5 );
- bSizerTop->Add( bSizerFinalStat, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
+ bSizerTop->Add( bSizerFinalStat, 1, wxEXPAND, 5 );
+
+ m_staticline12 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizerTop->Add( m_staticline12, 0, wxEXPAND, 5 );
+
+ m_panelFooter = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelFooter->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer182;
+ bSizer182 = new wxBoxSizer( wxVERTICAL );
bSizerExecFinished = new wxBoxSizer( wxHORIZONTAL );
- m_staticText87 = new wxStaticText( m_panelBackground, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText87 = new wxStaticText( m_panelFooter, wxID_ANY, _("On completion:"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText87->Wrap( -1 );
m_staticText87->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 90, 90, false, wxEmptyString ) );
bSizerExecFinished->Add( m_staticText87, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
- m_comboBoxExecFinished = new ExecFinishedBox( m_panelBackground, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
+ m_comboBoxExecFinished = new ExecFinishedBox( m_panelFooter, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, NULL, 0 );
bSizerExecFinished->Add( m_comboBoxExecFinished, 1, wxALIGN_CENTER_VERTICAL, 5 );
- bSizerTop->Add( bSizerExecFinished, 0, wxTOP|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+ bSizer182->Add( bSizerExecFinished, 0, wxTOP|wxRIGHT|wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
bSizer28 = new wxBoxSizer( wxHORIZONTAL );
bSizer28->Add( 0, 0, 1, 0, 5 );
- m_buttonOK = new wxButton( m_panelBackground, wxID_OK, _("OK"), wxDefaultPosition, wxSize( 100,30 ), 0 );
+ m_buttonOK = new wxButton( m_panelFooter, wxID_OK, _("OK"), wxDefaultPosition, wxSize( 100,30 ), 0 );
m_buttonOK->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
m_buttonOK->Enable( false );
bSizer28->Add( m_buttonOK, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
- m_buttonPause = new wxButton( m_panelBackground, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( 100,30 ), 0 );
+ m_buttonPause = new wxButton( m_panelFooter, wxID_ANY, _("&Pause"), wxDefaultPosition, wxSize( 100,30 ), 0 );
m_buttonPause->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer28->Add( m_buttonPause, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
- m_buttonAbort = new wxButton( m_panelBackground, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( 100,30 ), 0 );
+ m_buttonAbort = new wxButton( m_panelFooter, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( 100,30 ), 0 );
m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer28->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxRIGHT, 5 );
@@ -2306,17 +2466,18 @@ SyncStatusDlgGenerated::SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id,
bSizer28->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizerTop->Add( bSizer28, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer182->Add( bSizer28, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
- m_panelBackground->SetSizer( bSizerTop );
- m_panelBackground->Layout();
- bSizerTop->Fit( m_panelBackground );
- bSizer172->Add( m_panelBackground, 1, wxEXPAND, 5 );
+ m_panelFooter->SetSizer( bSizer182 );
+ m_panelFooter->Layout();
+ bSizer182->Fit( m_panelFooter );
+ bSizerTop->Add( m_panelFooter, 0, wxEXPAND, 5 );
- this->SetSizer( bSizer172 );
+ this->SetSizer( bSizerTop );
this->Layout();
+ bSizerTop->Fit( this );
this->Centre( wxBOTH );
@@ -2341,6 +2502,8 @@ SyncStatusDlgGenerated::~SyncStatusDlgGenerated()
LogControlGenerated::LogControlGenerated( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style ) : wxPanel( parent, id, pos, size, style )
{
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
wxBoxSizer* bSizer153;
bSizer153 = new wxBoxSizer( wxHORIZONTAL );
@@ -2357,11 +2520,12 @@ LogControlGenerated::LogControlGenerated( wxWindow* parent, wxWindowID id, const
bSizer154->Add( m_bpButtonInfo, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+ bSizer153->Add( bSizer154, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
- m_textCtrlInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY );
- m_textCtrlInfo->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_staticline13 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bSizer153->Add( m_staticline13, 0, wxEXPAND, 5 );
+ m_textCtrlInfo = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
bSizer153->Add( m_textCtrlInfo, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
@@ -2394,33 +2558,33 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer31->Add( 0, 5, 0, 0, 5 );
+ wxBoxSizer* bSizer53;
+ bSizer53 = new wxBoxSizer( wxVERTICAL );
+
m_panel5 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxSIMPLE_BORDER|wxTAB_TRAVERSAL );
m_panel5->SetBackgroundColour( wxColour( 255, 255, 255 ) );
wxBoxSizer* bSizer36;
bSizer36 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmap11 = new wxStaticBitmap( m_panel5, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 404,55 ), 0 );
+ m_bitmap11 = new wxStaticBitmap( m_panel5, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
bSizer36->Add( m_bitmap11, 0, wxALIGN_CENTER_VERTICAL, 5 );
m_panel5->SetSizer( bSizer36 );
m_panel5->Layout();
bSizer36->Fit( m_panel5 );
- bSizer31->Add( m_panel5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer53->Add( m_panel5, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxBOTTOM, 5 );
m_build = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
m_build->Wrap( -1 );
- bSizer31->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
+ bSizer53->Add( m_build, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5 );
- bSizer31->Add( 0, 5, 0, 0, 5 );
- wxBoxSizer* bSizer53;
- bSizer53 = new wxBoxSizer( wxVERTICAL );
+ bSizer53->Add( 0, 5, 0, 0, 5 );
m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDOUBLE_BORDER|wxTAB_TRAVERSAL );
- m_panel33->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_panel33->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizerCodeInfo = new wxBoxSizer( wxVERTICAL );
@@ -2437,32 +2601,32 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer171 = new wxBoxSizer( wxHORIZONTAL );
m_hyperlink9 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("MinGW"), wxT("http://www.mingw.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink9->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink9->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer171->Add( m_hyperlink9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_hyperlink11 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("MS Visual C++"), wxT("http://msdn.microsoft.com/library/60k1461a.aspx"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink11->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink11->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer171->Add( m_hyperlink11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_hyperlink10 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Code::Blocks"), wxT("http://www.codeblocks.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink10->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink10->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer171->Add( m_hyperlink10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_hyperlink13 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Boost"), wxT("http://www.boost.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink13->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink13->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer171->Add( m_hyperlink13, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_hyperlink7 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("wxWidgets"), wxT("http://www.wxwidgets.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink7->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink7->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer171->Add( m_hyperlink7, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_hyperlink16 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Artistic Style"), wxT("http://astyle.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink16->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink16->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer171->Add( m_hyperlink16, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
@@ -2473,27 +2637,27 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer172 = new wxBoxSizer( wxHORIZONTAL );
m_hyperlink8 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Loki"), wxT("http://loki-lib.sourceforge.net/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink8->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink8->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer172->Add( m_hyperlink8, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_hyperlink15 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("zenXML"), wxT("http://zenxml.sourceforge.net/"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink15->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink15->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer172->Add( m_hyperlink15, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_hyperlink12 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Google Test"), wxT("http://code.google.com/p/googletest"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink12->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink12->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer172->Add( m_hyperlink12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_hyperlink18 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("Unicode NSIS"), wxT("http://www.scratchpaper.com"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink18->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink18->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer172->Add( m_hyperlink18, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_hyperlink14 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("wxFormBuilder"), wxT("http://wxformbuilder.org"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- m_hyperlink14->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink14->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
bSizer172->Add( m_hyperlink14, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
@@ -2505,7 +2669,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_hyperlink21 = new wxHyperlinkCtrl( m_panel33, wxID_ANY, _("- ZenJu -"), wxT("mailto:zhnmju123@gmx.de"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
m_hyperlink21->SetFont( wxFont( 10, 74, 93, 92, false, wxT("Segoe Print") ) );
- m_hyperlink21->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_hyperlink21->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
m_hyperlink21->SetToolTip( _("zhnmju123@gmx.de") );
bSizerCodeInfo->Add( m_hyperlink21, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
@@ -2531,7 +2695,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer170->Add( m_hyperlink1, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 );
+ m_bitmap9 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_bitmap9->SetToolTip( _("FreeFileSync at Sourceforge") );
bSizer170->Add( m_bitmap9, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
@@ -2554,7 +2718,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizer1711->Add( m_hyperlink2, 0, wxALIGN_CENTER_VERTICAL, 5 );
- m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 );
+ m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_bitmap10->SetToolTip( _("Email") );
bSizer1711->Add( m_bitmap10, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
@@ -2570,7 +2734,7 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
m_scrolledWindowTranslators = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxDOUBLE_BORDER|wxHSCROLL|wxVSCROLL );
m_scrolledWindowTranslators->SetScrollRate( 5, 5 );
- m_scrolledWindowTranslators->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_scrolledWindowTranslators->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
m_scrolledWindowTranslators->SetMinSize( wxSize( -1,180 ) );
bSizerTranslators = new wxBoxSizer( wxVERTICAL );
@@ -2597,31 +2761,54 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
bSizerTranslators->Fit( m_scrolledWindowTranslators );
bSizer53->Add( m_scrolledWindowTranslators, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM|wxEXPAND, 5 );
- wxStaticBoxSizer* sbSizer28;
- sbSizer28 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("If you like FreeFileSync") ), wxHORIZONTAL );
+ m_panel40 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel40->SetBackgroundColour( wxColour( 153, 170, 187 ) );
+ wxBoxSizer* bSizer183;
+ bSizer183 = new wxBoxSizer( wxVERTICAL );
- sbSizer28->Add( 0, 0, 1, wxEXPAND, 5 );
+ m_panel39 = new wxPanel( m_panel40, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel39->SetBackgroundColour( wxColour( 221, 221, 255 ) );
+
+ wxBoxSizer* bSizer184;
+ bSizer184 = new wxBoxSizer( wxHORIZONTAL );
+
+ m_staticText83 = new wxStaticText( m_panel39, wxID_ANY, _("If you like FreeFileSync"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText83->Wrap( -1 );
+ m_staticText83->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), 70, 93, 92, false, wxEmptyString ) );
+ m_staticText83->SetForegroundColour( wxColour( 0, 0, 0 ) );
- m_hyperlink3 = new wxHyperlinkCtrl( this, 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 );
+ bSizer184->Add( m_staticText83, 0, wxALL, 5 );
+
+
+ bSizer184->Add( 0, 0, 1, wxEXPAND, 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->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") );
- sbSizer28->Add( m_hyperlink3, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
+ bSizer184->Add( m_hyperlink3, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
- m_bitmapPaypal = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapPaypal = new wxStaticBitmap( m_panel39, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
m_bitmapPaypal->SetToolTip( _("Donate with PayPal") );
- sbSizer28->Add( m_bitmapPaypal, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
+ bSizer184->Add( m_bitmapPaypal, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
- sbSizer28->Add( 0, 0, 1, wxEXPAND, 5 );
+ bSizer184->Add( 0, 0, 1, wxEXPAND, 5 );
- bSizer53->Add( sbSizer28, 0, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+ m_panel39->SetSizer( bSizer184 );
+ m_panel39->Layout();
+ bSizer184->Fit( m_panel39 );
+ bSizer183->Add( m_panel39, 0, wxEXPAND|wxALL, 5 );
- bSizer31->Add( bSizer53, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 25 );
+ m_panel40->SetSizer( bSizer183 );
+ m_panel40->Layout();
+ bSizer183->Fit( m_panel40 );
+ bSizer53->Add( m_panel40, 0, wxEXPAND|wxBOTTOM, 5 );
wxStaticBoxSizer* sbSizer14;
sbSizer14 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Published under the GNU General Public License") ), wxHORIZONTAL );
@@ -2629,17 +2816,20 @@ AboutDlgGenerated::AboutDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
- m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 88,31 ), 0 );
+ m_bitmap13 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
sbSizer14->Add( m_bitmap13, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_hyperlink5 = new wxHyperlinkCtrl( this, wxID_ANY, _("http://www.gnu.org/licenses/gpl.html"), wxT("http://www.gnu.org/licenses/gpl.html"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE );
- sbSizer14->Add( m_hyperlink5, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ sbSizer14->Add( m_hyperlink5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
sbSizer14->Add( 0, 0, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer31->Add( sbSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
+ bSizer53->Add( sbSizer14, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
+
+
+ bSizer31->Add( bSizer53, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxRIGHT|wxLEFT, 25 );
m_buttonOkay = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( 100,30 ), 0 );
m_buttonOkay->SetDefault();
@@ -2670,6 +2860,7 @@ AboutDlgGenerated::~AboutDlgGenerated()
ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxSize( 300,160 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer24;
bSizer24 = new wxBoxSizer( wxVERTICAL );
@@ -2680,47 +2871,61 @@ ErrorDlgGenerated::ErrorDlgGenerated( wxWindow* parent, wxWindowID id, const wxS
wxBoxSizer* bSizer26;
bSizer26 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 );
- bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY );
- m_textCtrl8->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer26->Add( m_bitmap10, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
- bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
+ m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,130 ), wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
- m_checkBoxIgnoreErrors = new wxCheckBox( this, wxID_ANY, _("Ignore further errors"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticline6 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline6, 0, wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
+
+ m_panel33 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel33->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer177;
+ bSizer177 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxIgnoreErrors = new wxCheckBox( m_panel33, wxID_ANY, _("Ignore further errors"), wxDefaultPosition, wxDefaultSize, 0 );
m_checkBoxIgnoreErrors->SetToolTip( _("Hide further error messages during the current process") );
- bSizer24->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
+ bSizer177->Add( m_checkBoxIgnoreErrors, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
wxBoxSizer* bSizer25;
bSizer25 = new wxBoxSizer( wxHORIZONTAL );
- m_buttonIgnore = new wxButton( this, wxID_OK, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonIgnore = new wxButton( m_panel33, wxID_OK, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonIgnore->SetDefault();
m_buttonIgnore->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
- m_buttonRetry = new wxButton( this, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonRetry = new wxButton( m_panel33, wxID_RETRY, _("&Retry"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonRetry->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonRetry, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
- m_buttonAbort = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonAbort = new wxButton( m_panel33, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonAbort, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
- bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer177->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ m_panel33->SetSizer( bSizer177 );
+ m_panel33->Layout();
+ bSizer177->Fit( m_panel33 );
+ bSizer24->Add( m_panel33, 0, wxEXPAND, 5 );
this->SetSizer( bSizer24 );
this->Layout();
+ bSizer24->Fit( this );
this->Centre( wxBOTH );
@@ -2744,6 +2949,7 @@ ErrorDlgGenerated::~ErrorDlgGenerated()
WarningDlgGenerated::WarningDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxSize( 300,160 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer24;
bSizer24 = new wxBoxSizer( wxVERTICAL );
@@ -2754,45 +2960,59 @@ WarningDlgGenerated::WarningDlgGenerated( wxWindow* parent, wxWindowID id, const
wxBoxSizer* bSizer26;
bSizer26 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 );
- bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer26->Add( m_bitmap10, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
- m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY );
- m_textCtrl8->SetBackgroundColour( wxColour( 224, 224, 224 ) );
-
- bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
+ m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,130 ), wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 );
bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
- m_checkBoxDontShowAgain = new wxCheckBox( this, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer24->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
+ m_staticline7 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline7, 0, wxEXPAND|wxTOP, 5 );
+
+ m_panel34 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel34->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer178;
+ bSizer178 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBoxDontShowAgain = new wxCheckBox( m_panel34, wxID_ANY, _("Do not show this dialog again"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer178->Add( m_checkBoxDontShowAgain, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
wxBoxSizer* bSizer25;
bSizer25 = new wxBoxSizer( wxHORIZONTAL );
- m_buttonIgnore = new wxButton( this, wxID_IGNORE, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonIgnore = new wxButton( m_panel34, wxID_IGNORE, _("&Ignore"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonIgnore->SetDefault();
m_buttonIgnore->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonIgnore, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
- m_buttonSwitch = new wxButton( this, wxID_MORE, _("&Switch"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonSwitch = new wxButton( m_panel34, wxID_MORE, _("&Switch"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonSwitch->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonSwitch, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
- m_buttonAbort = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonAbort = new wxButton( m_panel34, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonAbort->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonAbort, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
- bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer178->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ m_panel34->SetSizer( bSizer178 );
+ m_panel34->Layout();
+ bSizer178->Fit( m_panel34 );
+ bSizer24->Add( m_panel34, 0, wxEXPAND, 5 );
this->SetSizer( bSizer24 );
this->Layout();
+ bSizer24->Fit( this );
this->Centre( wxBOTH );
@@ -2816,6 +3036,7 @@ WarningDlgGenerated::~WarningDlgGenerated()
QuestionDlgGenerated::QuestionDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxSize( 300,160 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer24;
bSizer24 = new wxBoxSizer( wxVERTICAL );
@@ -2826,45 +3047,59 @@ QuestionDlgGenerated::QuestionDlgGenerated( wxWindow* parent, wxWindowID id, con
wxBoxSizer* bSizer26;
bSizer26 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 48,48 ), 0 );
- bSizer26->Add( m_bitmap10, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
+ bSizer26->Add( m_bitmap10, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
- m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_MULTILINE|wxTE_READONLY );
- m_textCtrl8->SetBackgroundColour( wxColour( 224, 224, 224 ) );
-
- bSizer26->Add( m_textCtrl8, 1, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxRIGHT|wxLEFT, 5 );
+ m_textCtrl8 = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 400,130 ), wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer26->Add( m_textCtrl8, 1, wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
bSizer24->Add( bSizer26, 1, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
- m_checkBox = new wxCheckBox( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
- bSizer24->Add( m_checkBox, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
+ m_staticline8 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline8, 0, wxEXPAND|wxTOP, 5 );
+
+ m_panel35 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel35->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer179;
+ bSizer179 = new wxBoxSizer( wxVERTICAL );
+
+ m_checkBox = new wxCheckBox( m_panel35, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ bSizer179->Add( m_checkBox, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
wxBoxSizer* bSizer25;
bSizer25 = new wxBoxSizer( wxHORIZONTAL );
- m_buttonYes = new wxButton( this, wxID_YES, _("&Yes"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonYes = new wxButton( m_panel35, wxID_YES, _("&Yes"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonYes->SetDefault();
m_buttonYes->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonYes, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
- m_buttonNo = new wxButton( this, wxID_NO, _("&No"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonNo = new wxButton( m_panel35, wxID_NO, _("&No"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonNo->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonNo, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonCancel = new wxButton( m_panel35, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonCancel->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonCancel, 0, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer24->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+ bSizer179->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL, 5 );
+
+
+ m_panel35->SetSizer( bSizer179 );
+ m_panel35->Layout();
+ bSizer179->Fit( m_panel35 );
+ bSizer24->Add( m_panel35, 0, wxEXPAND, 5 );
this->SetSizer( bSizer24 );
this->Layout();
+ bSizer24->Fit( this );
this->Centre( wxBOTH );
@@ -2887,30 +3122,53 @@ QuestionDlgGenerated::~QuestionDlgGenerated()
DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxSize( 400,220 ), wxDefaultSize );
+ this->SetSizeHints( wxSize( 300,180 ), wxDefaultSize );
+ this->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOW ) );
wxBoxSizer* bSizer24;
bSizer24 = new wxBoxSizer( wxVERTICAL );
+ m_panelHeader = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panelHeader->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer181;
+ bSizer181 = new wxBoxSizer( wxVERTICAL );
+
wxBoxSizer* bSizer41;
bSizer41 = new wxBoxSizer( wxHORIZONTAL );
- m_bitmap12 = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( 40,40 ), 0 );
+ m_bitmap12 = new wxStaticBitmap( m_panelHeader, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize( -1,-1 ), 0 );
bSizer41->Add( m_bitmap12, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
- m_staticTextHeader = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextHeader = new wxStaticText( m_panelHeader, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTextHeader->Wrap( -1 );
m_staticTextHeader->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer41->Add( m_staticTextHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer24->Add( bSizer41, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT, 5 );
+ bSizer181->Add( bSizer41, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
+
- m_textCtrlMessage = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( -1,-1 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY );
- m_textCtrlMessage->SetBackgroundColour( wxColour( 224, 224, 224 ) );
+ m_panelHeader->SetSizer( bSizer181 );
+ m_panelHeader->Layout();
+ bSizer181->Fit( m_panelHeader );
+ bSizer24->Add( m_panelHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND, 5 );
- bSizer24->Add( m_textCtrlMessage, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+ m_staticline91 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline91, 0, wxEXPAND|wxBOTTOM, 5 );
+
+ m_textCtrlFileList = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 550,200 ), wxTE_DONTWRAP|wxTE_MULTILINE|wxTE_READONLY|wxNO_BORDER );
+ bSizer24->Add( m_textCtrlFileList, 1, wxEXPAND|wxLEFT, 5 );
+
+ m_staticline9 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+ bSizer24->Add( m_staticline9, 0, wxEXPAND|wxTOP, 5 );
+
+ m_panel36 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
+ m_panel36->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ) );
+
+ wxBoxSizer* bSizer180;
+ bSizer180 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer179;
bSizer179 = new wxBoxSizer( wxHORIZONTAL );
@@ -2918,10 +3176,10 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer99;
bSizer99 = new wxBoxSizer( wxVERTICAL );
- m_checkBoxUseRecycler = new wxCheckBox( this, wxID_ANY, _("Use Recycle Bin"), wxDefaultPosition, wxDefaultSize, 0 );
+ 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_checkBoxDeleteBothSides = new wxCheckBox( this, wxID_ANY, _("Delete on both sides"), wxDefaultPosition, wxDefaultSize, 0 );
+ 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 );
@@ -2935,13 +3193,13 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w
wxBoxSizer* bSizer25;
bSizer25 = new wxBoxSizer( wxHORIZONTAL );
- m_buttonOK = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonOK = new wxButton( m_panel36, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonOK->SetDefault();
m_buttonOK->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
bSizer25->Add( m_buttonOK, 0, wxTOP|wxBOTTOM|wxLEFT, 5 );
- m_buttonCancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonCancel = new wxButton( m_panel36, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_buttonCancel->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
bSizer25->Add( m_buttonCancel, 0, wxALL, 5 );
@@ -2950,11 +3208,18 @@ DeleteDlgGenerated::DeleteDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer179->Add( bSizer25, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- bSizer24->Add( bSizer179, 0, wxEXPAND, 5 );
+ bSizer180->Add( bSizer179, 0, wxEXPAND, 5 );
+
+
+ m_panel36->SetSizer( bSizer180 );
+ m_panel36->Layout();
+ bSizer180->Fit( m_panel36 );
+ bSizer24->Add( m_panel36, 0, wxEXPAND, 5 );
this->SetSizer( bSizer24 );
this->Layout();
+ bSizer24->Fit( this );
this->Centre( wxBOTH );
@@ -3003,6 +3268,7 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_staticTexHeader = new wxStaticText( m_panel8, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticTexHeader->Wrap( -1 );
m_staticTexHeader->SetFont( wxFont( 14, 70, 90, 92, false, wxEmptyString ) );
+ m_staticTexHeader->SetForegroundColour( wxColour( 0, 0, 0 ) );
bSizer72->Add( m_staticTexHeader, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
@@ -3027,59 +3293,6 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer21->Add( bSizer70, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP|wxRIGHT|wxLEFT|wxEXPAND, 5 );
- m_panel13 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- wxBoxSizer* bSizer69;
- bSizer69 = new wxBoxSizer( wxVERTICAL );
-
- m_staticline10 = new wxStaticLine( m_panel13, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
- bSizer69->Add( m_staticline10, 0, wxEXPAND, 5 );
-
- wxBoxSizer* bSizer52;
- bSizer52 = new wxBoxSizer( wxVERTICAL );
-
- m_staticText45 = new wxStaticText( m_panel13, wxID_ANY, _("Hints:"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText45->Wrap( -1 );
- m_staticText45->SetFont( wxFont( 10, 70, 90, 92, true, wxEmptyString ) );
-
- bSizer52->Add( m_staticText45, 0, wxBOTTOM, 5 );
-
- m_staticText83 = new wxStaticText( m_panel13, wxID_ANY, _("1. Enter relative file or directory names separated by ';' or a new line."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText83->Wrap( -1 );
- bSizer52->Add( m_staticText83, 0, 0, 5 );
-
- m_staticText84 = new wxStaticText( m_panel13, wxID_ANY, _("2. Use wildcard characters '*' and '?'."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText84->Wrap( -1 );
- bSizer52->Add( m_staticText84, 0, 0, 5 );
-
- m_staticText85 = new wxStaticText( m_panel13, wxID_ANY, _("3. Exclude files directly on main grid via context menu."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText85->Wrap( -1 );
- bSizer52->Add( m_staticText85, 0, 0, 5 );
-
-
- bSizer69->Add( bSizer52, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
-
- wxStaticBoxSizer* sbSizer21;
- sbSizer21 = new wxStaticBoxSizer( new wxStaticBox( m_panel13, wxID_ANY, _("Example") ), wxHORIZONTAL );
-
- m_staticText181 = new wxStaticText( m_panel13, wxID_ANY, _("Include: *.doc;*.zip;*.exe\nExclude: \\stuff\\temp\\*"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText181->Wrap( -1 );
- sbSizer21->Add( m_staticText181, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- m_staticText1811 = new wxStaticText( m_panel13, wxID_ANY, _("Synchronize all .doc, .zip and .exe files except everything in subfolder \"temp\"."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText1811->Wrap( 250 );
- m_staticText1811->SetFont( wxFont( 8, 70, 93, 90, false, wxEmptyString ) );
-
- sbSizer21->Add( m_staticText1811, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
-
- bSizer69->Add( sbSizer21, 0, wxALIGN_CENTER_HORIZONTAL|wxTOP, 5 );
-
-
- m_panel13->SetSizer( bSizer69 );
- m_panel13->Layout();
- bSizer69->Fit( m_panel13 );
- bSizer21->Add( m_panel13, 0, wxALIGN_CENTER_HORIZONTAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
-
wxBoxSizer* bSizer159;
bSizer159 = new wxBoxSizer( wxHORIZONTAL );
@@ -3228,11 +3441,11 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w
bSizer22->Add( 0, 0, 1, wxALIGN_CENTER_VERTICAL, 5 );
- 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 ) );
+ m_buttonOk = new wxButton( this, wxID_OK, _("OK"), wxDefaultPosition, wxSize( -1,30 ), 0 );
+ m_buttonOk->SetDefault();
+ m_buttonOk->SetFont( wxFont( 10, 70, 90, 92, false, wxEmptyString ) );
- bSizer22->Add( m_button10, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
+ bSizer22->Add( m_buttonOk, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT, 5 );
m_button17 = new wxButton( this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize( -1,30 ), 0 );
m_button17->SetFont( wxFont( 10, 70, 90, 90, false, wxEmptyString ) );
@@ -3258,7 +3471,7 @@ FilterDlgGenerated::FilterDlgGenerated( wxWindow* parent, wxWindowID id, const w
m_choiceUnitMinSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
m_choiceUnitMaxSize->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
m_button9->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this );
- m_button10->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this );
+ m_buttonOk->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this );
m_button17->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this );
}
@@ -3273,14 +3486,14 @@ FilterDlgGenerated::~FilterDlgGenerated()
m_choiceUnitMinSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
m_choiceUnitMaxSize->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( FilterDlgGenerated::OnUpdateChoice ), NULL, this );
m_button9->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnDefault ), NULL, this );
- m_button10->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this );
+ m_buttonOk->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnApply ), NULL, this );
m_button17->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( FilterDlgGenerated::OnCancel ), NULL, this );
}
GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxDialog( parent, id, title, pos, size, style )
{
- this->SetSizeHints( wxSize( 280,230 ), wxDefaultSize );
+ this->SetSizeHints( wxSize( 300,360 ), wxDefaultSize );
wxBoxSizer* bSizer95;
bSizer95 = new wxBoxSizer( wxVERTICAL );
@@ -3300,6 +3513,7 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind
m_staticText56 = new wxStaticText( m_panel8, wxID_ANY, _("Global settings"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText56->Wrap( -1 );
m_staticText56->SetFont( wxFont( 14, 70, 90, 92, false, wxEmptyString ) );
+ m_staticText56->SetForegroundColour( wxColour( 0, 0, 0 ) );
bSizer72->Add( m_staticText56, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
@@ -3315,11 +3529,11 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind
wxStaticBoxSizer* sbSizer23;
sbSizer23 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, wxEmptyString ), wxVERTICAL );
- m_checkBoxTransCopy = new wxCheckBox( this, wxID_ANY, _("Transactional file copy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_checkBoxTransCopy = new wxCheckBox( this, wxID_ANY, _("Fail-safe file copy"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer23->Add( m_checkBoxTransCopy, 0, wxEXPAND|wxALL, 5 );
m_staticText82 = new wxStaticText( this, wxID_ANY, _("Write to a temporary file (*.ffs_tmp) first then rename it. This guarantees a consistent state even in case of fatal error."), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText82->Wrap( 400 );
+ m_staticText82->Wrap( 420 );
m_staticText82->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
sbSizer23->Add( m_staticText82, 0, wxLEFT, 20 );
@@ -3328,7 +3542,7 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind
sbSizer23->Add( m_checkBoxCopyLocked, 0, wxALL|wxEXPAND, 5 );
m_staticTextCopyLocked = new wxStaticText( this, wxID_ANY, _("Copy shared or locked files using Volume Shadow Copy Service (Requires Administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticTextCopyLocked->Wrap( 400 );
+ m_staticTextCopyLocked->Wrap( 420 );
m_staticTextCopyLocked->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
sbSizer23->Add( m_staticTextCopyLocked, 0, wxLEFT|wxEXPAND, 20 );
@@ -3336,8 +3550,8 @@ GlobalSettingsDlgGenerated::GlobalSettingsDlgGenerated( wxWindow* parent, wxWind
m_checkBoxCopyPermissions = new wxCheckBox( this, wxID_ANY, _("Copy file access permissions"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer23->Add( m_checkBoxCopyPermissions, 0, wxALL|wxEXPAND, 5 );
- m_staticText8211 = new wxStaticText( this, wxID_ANY, _("Transfer file and directory permissions (Requires Administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText8211->Wrap( 400 );
+ m_staticText8211 = new wxStaticText( this, wxID_ANY, _("Transfer file and folder permissions (Requires Administrator rights)"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText8211->Wrap( 420 );
m_staticText8211->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT ) );
sbSizer23->Add( m_staticText8211, 0, wxLEFT|wxEXPAND, 20 );
@@ -3503,119 +3717,90 @@ SyncPreviewDlgGenerated::SyncPreviewDlgGenerated( wxWindow* parent, wxWindowID i
wxStaticBoxSizer* sbSizer161;
sbSizer161 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Statistics") ), wxVERTICAL );
- wxBoxSizer* bSizer157;
- bSizer157 = new wxBoxSizer( wxHORIZONTAL );
-
- wxFlexGridSizer* fgSizer5;
- fgSizer5 = new wxFlexGridSizer( 0, 2, 0, 5 );
- fgSizer5->SetFlexibleDirection( wxHORIZONTAL );
- fgSizer5->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
-
- fgSizer5->Add( 0, 0, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
-
- m_staticText94 = new wxStaticText( this, wxID_ANY, _("Left"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText94->Wrap( -1 );
- m_staticText94->SetFont( wxFont( 9, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer5->Add( m_staticText94, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ wxFlexGridSizer* fgSizer11;
+ fgSizer11 = new wxFlexGridSizer( 2, 7, 2, 5 );
+ fgSizer11->SetFlexibleDirection( wxBOTH );
+ fgSizer11->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
- m_bitmapCreate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapCreate->SetToolTip( _("Number of files and directories that will be created") );
+ m_bitmapCreateLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
- fgSizer5->Add( m_bitmapCreate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ fgSizer11->Add( m_bitmapCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- m_textCtrlCreateL = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlCreateL->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlCreateL->SetToolTip( _("Number of files and directories that will be created") );
+ m_bitmapUpdateLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
- fgSizer5->Add( m_textCtrlCreateL, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ fgSizer11->Add( m_bitmapUpdateLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- m_bitmapUpdate = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapUpdate->SetToolTip( _("Number of files that will be overwritten") );
+ m_bitmapDeleteLeft = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
- fgSizer5->Add( m_bitmapUpdate, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ fgSizer11->Add( m_bitmapDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- m_textCtrlUpdateL = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlUpdateL->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlUpdateL->SetToolTip( _("Number of files that will be overwritten") );
-
- fgSizer5->Add( m_textCtrlUpdateL, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
- m_bitmapDelete = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapDelete->SetToolTip( _("Number of files and directories that will be deleted") );
-
- fgSizer5->Add( m_bitmapDelete, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
-
- m_textCtrlDeleteL = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlDeleteL->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlDeleteL->SetToolTip( _("Number of files and directories that will be deleted") );
-
- fgSizer5->Add( m_textCtrlDeleteL, 0, wxALIGN_CENTER_VERTICAL, 5 );
-
-
- bSizer157->Add( fgSizer5, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
-
- wxFlexGridSizer* fgSizer51;
- fgSizer51 = new wxFlexGridSizer( 0, 1, 0, 5 );
- fgSizer51->SetFlexibleDirection( wxHORIZONTAL );
- fgSizer51->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
-
- m_staticText95 = new wxStaticText( this, wxID_ANY, _("Right"), wxDefaultPosition, wxDefaultSize, 0 );
- m_staticText95->Wrap( -1 );
- m_staticText95->SetFont( wxFont( 9, 70, 90, 92, false, wxEmptyString ) );
-
- fgSizer51->Add( m_staticText95, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmapData = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapData->SetToolTip( _("Total amount of data that will be transferred") );
- m_textCtrlCreateR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlCreateR->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlCreateR->SetToolTip( _("Number of files and directories that will be created") );
+ fgSizer11->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- fgSizer51->Add( m_textCtrlCreateR, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmapDeleteRight = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
- m_textCtrlUpdateR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlUpdateR->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlUpdateR->SetToolTip( _("Number of files that will be overwritten") );
+ fgSizer11->Add( m_bitmapDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- fgSizer51->Add( m_textCtrlUpdateR, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmapUpdateRight = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
- m_textCtrlDeleteR = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_READONLY|wxTE_RIGHT );
- m_textCtrlDeleteR->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlDeleteR->SetToolTip( _("Number of files and directories that will be deleted") );
+ fgSizer11->Add( m_bitmapUpdateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- fgSizer51->Add( m_textCtrlDeleteR, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ m_bitmapCreateRight = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
+ m_bitmapCreateRight->SetToolTip( _("Number of files and folders that will be created") );
+ fgSizer11->Add( m_bitmapCreateRight, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- bSizer157->Add( fgSizer51, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
+ m_staticTextCreateLeft = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateLeft->Wrap( -1 );
+ m_staticTextCreateLeft->SetToolTip( _("Number of files and folders that will be created") );
+ fgSizer11->Add( m_staticTextCreateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- sbSizer161->Add( bSizer157, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
+ m_staticTextUpdateLeft = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateLeft->Wrap( -1 );
+ m_staticTextUpdateLeft->SetToolTip( _("Number of files that will be overwritten") );
+ fgSizer11->Add( m_staticTextUpdateLeft, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL, 5 );
- sbSizer161->Add( 0, 10, 0, 0, 5 );
+ m_staticTextDeleteLeft = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteLeft->Wrap( -1 );
+ m_staticTextDeleteLeft->SetToolTip( _("Number of files and folders that will be deleted") );
- wxBoxSizer* bSizer156;
- bSizer156 = new wxBoxSizer( wxHORIZONTAL );
+ fgSizer11->Add( m_staticTextDeleteLeft, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- m_bitmapData = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );
- m_bitmapData->SetToolTip( _("Total amount of data that will be transferred") );
+ m_staticTextData = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextData->Wrap( -1 );
+ m_staticTextData->SetToolTip( _("Total amount of data that will be transferred") );
- bSizer156->Add( m_bitmapData, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxRIGHT, 5 );
+ fgSizer11->Add( m_staticTextData, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_staticTextDeleteRight = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextDeleteRight->Wrap( -1 );
+ m_staticTextDeleteRight->SetToolTip( _("Number of files and folders that will be deleted") );
- bSizer156->Add( 0, 0, 1, wxEXPAND, 5 );
+ fgSizer11->Add( m_staticTextDeleteRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- m_textCtrlData = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize( 80,-1 ), wxTE_CENTRE|wxTE_READONLY );
- m_textCtrlData->SetBackgroundColour( wxColour( 224, 224, 224 ) );
- m_textCtrlData->SetToolTip( _("Total amount of data that will be transferred") );
+ m_staticTextUpdateRight = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextUpdateRight->Wrap( -1 );
+ m_staticTextUpdateRight->SetToolTip( _("Number of files that will be overwritten") );
- bSizer156->Add( m_textCtrlData, 0, wxALIGN_CENTER_VERTICAL, 5 );
+ fgSizer11->Add( m_staticTextUpdateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
+ m_staticTextCreateRight = new wxStaticText( this, wxID_ANY, _("dummy"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticTextCreateRight->Wrap( -1 );
+ m_staticTextCreateRight->SetToolTip( _("Number of files and folders that will be created") );
- bSizer156->Add( 0, 0, 1, wxEXPAND, 5 );
+ fgSizer11->Add( m_staticTextCreateRight, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5 );
- sbSizer161->Add( bSizer156, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT|wxEXPAND, 5 );
+ sbSizer161->Add( fgSizer11, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 );
bSizer141->Add( sbSizer161, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_CENTER_HORIZONTAL|wxALL, 5 );
@@ -3741,6 +3926,7 @@ SearchDialogGenerated::SearchDialogGenerated( wxWindow* parent, wxWindowID id, c
this->SetSizer( bSizer161 );
this->Layout();
+ bSizer161->Fit( this );
this->Centre( wxBOTH );
diff --git a/ui/gui_generated.h b/ui/gui_generated.h
index bd7c6be4..cb608374 100644
--- a/ui/gui_generated.h
+++ b/ui/gui_generated.h
@@ -36,12 +36,12 @@
#include <wx/combobox.h>
#include <wx/filepicker.h>
#include <wx/scrolwin.h>
-#include <wx/listbox.h>
-#include <wx/checkbox.h>
#include <wx/statbmp.h>
-#include <wx/textctrl.h>
#include <wx/statline.h>
+#include <wx/listbox.h>
+#include <wx/checkbox.h>
#include <wx/frame.h>
+#include <wx/textctrl.h>
#include <wx/gauge.h>
#include <wx/statbox.h>
#include <wx/choice.h>
@@ -75,8 +75,8 @@ protected:
wxMenuItem* m_menuItem10;
wxMenuItem* m_menuItem11;
wxMenuItem* m_menuItemNew;
- wxMenuItem* m_menuItemSave;
wxMenuItem* m_menuItemLoad;
+ wxMenuItem* m_menuItemSave;
wxMenu* m_menuAdvanced;
wxMenu* m_menuLanguages;
wxMenuItem* m_menuItemGlobSett;
@@ -104,25 +104,50 @@ protected:
wxScrolledWindow* m_scrolledWindowFolderPairs;
wxBoxSizer* bSizerAddFolderPairs;
zen::Grid* m_gridNavi;
+ wxPanel* m_panelCenter;
zen::Grid* m_gridMain;
+ wxPanel* m_panelStatusBar;
+ wxBoxSizer* bSizerStatusLeftDirectories;
+ wxStaticBitmap* m_bitmapSmallDirectoryLeft;
+ wxStaticText* m_staticTextStatusLeftDirs;
+ wxBoxSizer* bSizerStatusLeftFiles;
+ wxStaticBitmap* m_bitmapSmallFileLeft;
+ wxStaticText* m_staticTextStatusLeftFiles;
+ wxStaticText* m_staticTextStatusLeftBytes;
+ wxStaticLine* m_staticline9;
+ wxStaticText* m_staticTextStatusMiddle;
+ wxStaticLine* m_staticline10;
+ wxBoxSizer* bSizerStatusRightDirectories;
+ wxStaticBitmap* m_bitmapSmallDirectoryRight;
+ wxStaticText* m_staticTextStatusRightDirs;
+ wxBoxSizer* bSizerStatusRightFiles;
+ wxStaticBitmap* m_bitmapSmallFileRight;
+ wxStaticText* m_staticTextStatusRightFiles;
+ wxStaticText* m_staticTextStatusRightBytes;
wxPanel* m_panelConfig;
wxBoxSizer* bSizerConfig;
- wxBitmapButton* m_bpButtonSave;
wxBitmapButton* m_bpButtonLoad;
+ wxBitmapButton* m_bpButtonSave;
wxListBox* m_listBoxHistory;
wxPanel* m_panelFilter;
wxBitmapButton* m_bpButtonFilter;
wxCheckBox* m_checkBoxHideFilt;
wxPanel* m_panelStatistics;
- wxBoxSizer* bSizerStatistics;
- wxStaticBitmap* m_bitmapCreate;
- wxTextCtrl* m_textCtrlCreate;
- wxStaticBitmap* m_bitmapUpdate;
- wxTextCtrl* m_textCtrlUpdate;
- wxStaticBitmap* m_bitmapDelete;
- wxTextCtrl* m_textCtrlDelete;
+ wxBoxSizer* bSizer1801;
+ wxStaticBitmap* m_bitmapCreateLeft;
+ wxStaticText* m_staticTextCreateLeft;
+ wxStaticBitmap* m_bitmapUpdateLeft;
+ wxStaticText* m_staticTextUpdateLeft;
+ wxStaticBitmap* m_bitmapDeleteLeft;
+ wxStaticText* m_staticTextDeleteLeft;
wxStaticBitmap* m_bitmapData;
- wxTextCtrl* m_textCtrlData;
+ wxStaticText* m_staticTextData;
+ wxStaticBitmap* m_bitmapDeleteRight;
+ wxStaticText* m_staticTextDeleteRight;
+ wxStaticBitmap* m_bitmapUpdateRight;
+ wxStaticText* m_staticTextUpdateRight;
+ wxStaticBitmap* m_bitmapCreateRight;
+ wxStaticText* m_staticTextCreateRight;
wxPanel* m_panelViewFilter;
wxBoxSizer* bSizerViewFilter;
ToggleButton* m_bpButtonSyncCreateLeft;
@@ -139,33 +164,14 @@ protected:
ToggleButton* m_bpButtonSyncDirOverwRight;
ToggleButton* m_bpButtonSyncCreateRight;
ToggleButton* m_bpButtonConflict;
- wxPanel* m_panelStatusBar;
- wxBoxSizer* bSizerStatusLeftDirectories;
- wxStaticBitmap* m_bitmapSmallDirectoryLeft;
- wxStaticText* m_staticTextStatusLeftDirs;
- wxBoxSizer* bSizerStatusLeftFiles;
- wxStaticBitmap* m_bitmapSmallFileLeft;
- wxStaticText* m_staticTextStatusLeftFiles;
- wxStaticText* m_staticTextStatusLeftBytes;
- wxStaticLine* m_staticline9;
- wxStaticText* m_staticTextStatusMiddle;
- wxStaticLine* m_staticline10;
- wxBoxSizer* bSizerStatusRightDirectories;
- wxStaticBitmap* m_bitmapSmallDirectoryRight;
- wxStaticText* m_staticTextStatusRightDirs;
- wxBoxSizer* bSizerStatusRightFiles;
- wxStaticBitmap* m_bitmapSmallFileRight;
- wxStaticText* m_staticTextStatusRightFiles;
- wxStaticText* m_staticTextStatusRightBytes;
- wxStaticBitmap* m_bitmapResizeCorner;
// Virtual event handlers, overide them in your derived class
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnCompare( wxCommandEvent& event ) { event.Skip(); }
virtual void OnStartSync( wxCommandEvent& event ) { event.Skip(); }
virtual void OnNewConfig( wxCommandEvent& event ) { event.Skip(); }
- virtual void OnSaveConfig( wxCommandEvent& event ) { event.Skip(); }
virtual void OnLoadConfig( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnSaveConfig( wxCommandEvent& event ) { event.Skip(); }
virtual void OnMenuQuit( wxCommandEvent& event ) { event.Skip(); }
virtual void OnMenuGlobalSettings( wxCommandEvent& event ) { event.Skip(); }
virtual void OnMenuBatchJob( wxCommandEvent& event ) { event.Skip(); }
@@ -210,6 +216,8 @@ public:
wxPanel* m_panelTopRight;
FolderHistoryBox* m_directoryRight;
zen::DirPickerCtrl* m_dirPickerRight;
+ wxBoxSizer* bSizerStatistics;
+ wxBoxSizer* bSizerData;
MainDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 702,522 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
@@ -252,7 +260,6 @@ class CompareStatusGenerated : public wxPanel
private:
protected:
- wxStaticText* m_staticText30;
wxTextCtrl* m_textCtrlStatus;
wxGauge* m_gauge2;
wxBoxSizer* bSizer42;
@@ -306,6 +313,7 @@ protected:
wxBoxSizer* bSizerAddFolderPairs;
wxPanel* m_panelBatchSettings;
wxCheckBox* m_checkBoxShowProgress;
+ wxStaticText* m_staticText961;
wxChoice* m_choiceHandleError;
wxStaticBoxSizer* sbSizerLogfileDir;
wxStaticText* m_staticText96;
@@ -391,16 +399,16 @@ private:
protected:
wxRadioButton* m_radioBtnAutomatic;
wxButton* m_buttonAutomatic;
- wxStaticText* m_staticText81;
+ wxStaticText* m_staticTextAutomatic;
wxRadioButton* m_radioBtnMirror;
- wxButton* m_buttonOneWay;
- wxStaticText* m_staticText8;
+ wxButton* m_buttonMirror;
+ wxStaticText* m_staticTextMirror;
wxRadioButton* m_radioBtnUpdate;
wxButton* m_buttonUpdate;
- wxStaticText* m_staticText101;
+ wxStaticText* m_staticTextUpdate;
wxRadioButton* m_radioBtnCustom;
- wxButton* m_buttonUpdate1;
- wxStaticText* m_staticText9;
+ wxButton* m_buttonCustom;
+ wxStaticText* m_staticTextCustom;
wxStaticBoxSizer* sbSizerCustDelDir;
wxChoice* m_choiceHandleDeletion;
wxPanel* m_panelCustomDeletionDir;
@@ -511,17 +519,15 @@ class SyncStatusDlgGenerated : public wxFrame
private:
protected:
- wxPanel* m_panelBackground;
wxBoxSizer* bSizerTop;
+ wxPanel* m_panelHeader;
wxStaticBitmap* m_bitmapStatus;
wxStaticText* m_staticTextStatus;
wxAnimationCtrl* m_animationControl1;
- wxBoxSizer* bSizerCurrentOperation;
- wxStaticText* m_staticText2511;
- wxTextCtrl* m_textCtrlInfo;
+ wxStaticLine* m_staticlineHeader;
wxPanel* m_panelProgress;
+ wxTextCtrl* m_textCtrlStatus;
wxBoxSizer* bSizer171;
- wxStaticBoxSizer* bSizerProgressStat;
wxStaticText* m_staticTextLabelItemsProc;
wxBoxSizer* bSizerItemsProc;
wxStaticText* m_staticTextProcessedObj;
@@ -539,6 +545,8 @@ protected:
zen::Graph2D* m_panelGraph;
wxBoxSizer* bSizerFinalStat;
wxListbook* m_listbookResult;
+ wxStaticLine* m_staticline12;
+ wxPanel* m_panelFooter;
wxBoxSizer* bSizerExecFinished;
wxStaticText* m_staticText87;
ExecFinishedBox* m_comboBoxExecFinished;
@@ -558,7 +566,7 @@ protected:
public:
wxGauge* m_gauge1;
- SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 640,350 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
+ SyncStatusDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
~SyncStatusDlgGenerated();
@@ -575,6 +583,7 @@ protected:
ToggleButton* m_bpButtonErrors;
ToggleButton* m_bpButtonWarnings;
ToggleButton* m_bpButtonInfo;
+ wxStaticLine* m_staticline13;
wxTextCtrl* m_textCtrlInfo;
// Virtual event handlers, overide them in your derived class
@@ -624,6 +633,9 @@ protected:
wxBoxSizer* bSizerTranslators;
wxStaticText* m_staticText54;
wxFlexGridSizer* fgSizerTranslators;
+ wxPanel* m_panel40;
+ wxPanel* m_panel39;
+ wxStaticText* m_staticText83;
wxHyperlinkCtrl* m_hyperlink3;
wxStaticBitmap* m_bitmapPaypal;
wxStaticBitmap* m_bitmap13;
@@ -652,6 +664,8 @@ private:
protected:
wxStaticBitmap* m_bitmap10;
wxTextCtrl* m_textCtrl8;
+ wxStaticLine* m_staticline6;
+ wxPanel* m_panel33;
wxCheckBox* m_checkBoxIgnoreErrors;
wxButton* m_buttonIgnore;
wxButton* m_buttonRetry;
@@ -666,7 +680,7 @@ protected:
public:
- ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 460,250 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
+ ErrorDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Error"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
~ErrorDlgGenerated();
};
@@ -680,6 +694,8 @@ private:
protected:
wxTextCtrl* m_textCtrl8;
+ wxStaticLine* m_staticline7;
+ wxPanel* m_panel34;
wxCheckBox* m_checkBoxDontShowAgain;
wxButton* m_buttonIgnore;
wxButton* m_buttonSwitch;
@@ -695,7 +711,7 @@ protected:
public:
wxStaticBitmap* m_bitmap10;
- WarningDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Warning"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 460,250 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
+ WarningDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Warning"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
~WarningDlgGenerated();
};
@@ -710,6 +726,8 @@ private:
protected:
wxStaticBitmap* m_bitmap10;
wxTextCtrl* m_textCtrl8;
+ wxStaticLine* m_staticline8;
+ wxPanel* m_panel35;
wxCheckBox* m_checkBox;
wxButton* m_buttonYes;
wxButton* m_buttonNo;
@@ -724,7 +742,7 @@ protected:
public:
- QuestionDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Question"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 420,198 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
+ QuestionDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Question"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
~QuestionDlgGenerated();
};
@@ -737,9 +755,13 @@ class DeleteDlgGenerated : public wxDialog
private:
protected:
+ wxPanel* m_panelHeader;
wxStaticBitmap* m_bitmap12;
wxStaticText* m_staticTextHeader;
- wxTextCtrl* m_textCtrlMessage;
+ wxStaticLine* m_staticline91;
+ wxTextCtrl* m_textCtrlFileList;
+ wxStaticLine* m_staticline9;
+ wxPanel* m_panel36;
wxCheckBox* m_checkBoxUseRecycler;
wxCheckBox* m_checkBoxDeleteBothSides;
wxButton* m_buttonOK;
@@ -755,7 +777,7 @@ protected:
public:
- DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 560,336 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
+ DeleteDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Confirm"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER );
~DeleteDlgGenerated();
};
@@ -773,14 +795,6 @@ protected:
wxStaticText* m_staticTexHeader;
wxStaticText* m_staticText44;
wxBitmapButton* m_bpButtonHelp;
- wxPanel* m_panel13;
- wxStaticLine* m_staticline10;
- wxStaticText* m_staticText45;
- wxStaticText* m_staticText83;
- wxStaticText* m_staticText84;
- wxStaticText* m_staticText85;
- wxStaticText* m_staticText181;
- wxStaticText* m_staticText1811;
wxStaticBitmap* m_bitmapInclude;
wxTextCtrl* m_textCtrlInclude;
wxStaticBitmap* m_bitmapExclude;
@@ -796,7 +810,7 @@ protected:
wxSpinCtrl* m_spinCtrlMaxSize;
wxChoice* m_choiceUnitMaxSize;
wxButton* m_button9;
- wxButton* m_button10;
+ wxButton* m_buttonOk;
wxButton* m_button17;
// Virtual event handlers, overide them in your derived class
@@ -870,19 +884,20 @@ protected:
wxStaticLine* m_staticline16;
wxStaticText* m_staticTextVariant;
wxStaticLine* m_staticline14;
- wxStaticText* m_staticText94;
- wxStaticBitmap* m_bitmapCreate;
- wxTextCtrl* m_textCtrlCreateL;
- wxStaticBitmap* m_bitmapUpdate;
- wxTextCtrl* m_textCtrlUpdateL;
- wxStaticBitmap* m_bitmapDelete;
- wxTextCtrl* m_textCtrlDeleteL;
- wxStaticText* m_staticText95;
- wxTextCtrl* m_textCtrlCreateR;
- wxTextCtrl* m_textCtrlUpdateR;
- wxTextCtrl* m_textCtrlDeleteR;
+ wxStaticBitmap* m_bitmapCreateLeft;
+ wxStaticBitmap* m_bitmapUpdateLeft;
+ wxStaticBitmap* m_bitmapDeleteLeft;
wxStaticBitmap* m_bitmapData;
- wxTextCtrl* m_textCtrlData;
+ wxStaticBitmap* m_bitmapDeleteRight;
+ wxStaticBitmap* m_bitmapUpdateRight;
+ wxStaticBitmap* m_bitmapCreateRight;
+ wxStaticText* m_staticTextCreateLeft;
+ wxStaticText* m_staticTextUpdateLeft;
+ wxStaticText* m_staticTextDeleteLeft;
+ wxStaticText* m_staticTextData;
+ wxStaticText* m_staticTextDeleteRight;
+ wxStaticText* m_staticTextUpdateRight;
+ wxStaticText* m_staticTextCreateRight;
wxStaticLine* m_staticline12;
wxCheckBox* m_checkBoxDontShowAgain;
wxButton* m_button16;
@@ -895,7 +910,7 @@ protected:
public:
- SyncPreviewDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Synchronization Preview"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
+ SyncPreviewDlgGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Summary"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE );
~SyncPreviewDlgGenerated();
};
@@ -942,7 +957,7 @@ protected:
public:
- SearchDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Find"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 384,97 ), long style = wxDEFAULT_DIALOG_STYLE );
+ SearchDialogGenerated( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Find"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxDEFAULT_DIALOG_STYLE );
~SearchDialogGenerated();
};
diff --git a/ui/main_dlg.cpp b/ui/main_dlg.cpp
index 049a1176..1ea2f29f 100644
--- a/ui/main_dlg.cpp
+++ b/ui/main_dlg.cpp
@@ -110,9 +110,8 @@ public:
{
const wxPoint absPos = dropGrid_.CalcUnscrolledPosition(clientPos);
-
const Opt<std::pair<ColumnType, size_t>> colInfo = dropGrid_.Grid::getColumnAtPos(absPos.x);
- const bool dropOnLeft = colInfo ? colInfo->second != gridview::COMP_RIGHT : true;
+ const bool dropOnLeft = colInfo ? colInfo->second != gridview::COMP_RIGHT : false;
if ((compPos_ == gridview::COMP_LEFT && !dropOnLeft) || //accept left or right half of m_gridMain only!
(compPos_ == gridview::COMP_RIGHT && dropOnLeft)) //
@@ -370,15 +369,14 @@ MainDialog::MainDialog(const std::vector<wxString>& cfgFileNames, xmlAccess::Xml
[&](const wxString& filename)
{
const Zstring filenameFmt = toZ(filename); //convert to Zstring first: we don't want to pass wxString by value and risk MT issues!
- findFirstMissing.addJob([=] { return filenameFmt.empty() || !fileExists(filenameFmt) ? zen::make_unique<NullType>() : nullptr; });
+ findFirstMissing.addJob([=] { return filenameFmt.empty() /*ever empty??*/ || !fileExists(filenameFmt) ? zen::make_unique<NullType>() : nullptr; });
});
//potentially slow network access: give all checks 500ms to finish
const bool allFilesExist = findFirstMissing.timedWait(boost::posix_time::milliseconds(500)) && //false: time elapsed
!findFirstMissing.get(); //no missing
- //------------------------------------------------------------------------------------------
-
if (!allFilesExist)
filenames.clear();
+ //------------------------------------------------------------------------------------------
if (filenames.empty())
{
@@ -465,7 +463,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
xmlAccess::XmlGlobalSettings& settings,
bool startComparison)
{
- syncPreviewEnabled = false;
+ showSyncAction_ = false;
folderHistoryLeft = std::make_shared<FolderHistory>(); //make sure it is always bound
folderHistoryRight = std::make_shared<FolderHistory>(); //
@@ -475,22 +473,15 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
wxWindowUpdateLocker dummy(this); //avoid display distortion
- //--------- avoid mirroring this dialog in RTL languages like Hebrew or Arabic --------------------
- //m_panelViewFilter ->SetLayoutDirection(wxLayout_LeftToRight);
- //m_panelStatusBar ->SetLayoutDirection(wxLayout_LeftToRight);
- //m_panelDirectoryPairs->SetLayoutDirection(wxLayout_LeftToRight);
- //------------------------------------------------------------------------------------------------------
-
//---------------- support for dockable gui style --------------------------------
bSizerPanelHolder->Detach(m_panelTopButtons);
bSizerPanelHolder->Detach(m_panelDirectoryPairs);
bSizerPanelHolder->Detach(m_gridNavi);
- bSizerPanelHolder->Detach(m_gridMain);
+ bSizerPanelHolder->Detach(m_panelCenter);
bSizerPanelHolder->Detach(m_panelConfig);
bSizerPanelHolder->Detach(m_panelFilter);
bSizerPanelHolder->Detach(m_panelViewFilter);
bSizerPanelHolder->Detach(m_panelStatistics);
- bSizerPanelHolder->Detach(m_panelStatusBar);
auiMgr.SetManagedWindow(this);
auiMgr.SetFlags(wxAUI_MGR_DEFAULT | wxAUI_MGR_LIVE_RESIZE);
@@ -507,7 +498,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
auiMgr.AddPane(m_panelDirectoryPairs,
wxAuiPaneInfo().Name(wxT("Panel2")).Layer(2).Top().Row(2).Caption(_("Folder pairs")).CaptionVisible(false).PaneBorder(false).Gripper());
- auiMgr.AddPane(m_gridMain,
+ auiMgr.AddPane(m_panelCenter,
wxAuiPaneInfo().Name(wxT("Panel3")).CenterPane().PaneBorder(false));
auiMgr.AddPane(m_gridNavi,
@@ -523,10 +514,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
wxAuiPaneInfo().Name(wxT("Panel6")).Layer(4).Bottom().Row(1).Position(2).Caption(_("Select view")).MinSize(m_bpButtonSyncDirNone->GetSize().GetWidth(), m_panelViewFilter->GetSize().GetHeight()));
auiMgr.AddPane(m_panelStatistics,
- wxAuiPaneInfo().Name(wxT("Panel7")).Layer(4).Bottom().Row(1).Position(3).Caption(_("Statistics")).MinSize(m_panelStatistics->GetSize().GetWidth() / 2, m_panelStatistics->GetSize().GetHeight()));
-
- auiMgr.AddPane(m_panelStatusBar,
- wxAuiPaneInfo().Name(wxT("Panel8")).Layer(4).Bottom().Row(0).CaptionVisible(false).PaneBorder(false).DockFixed());
+ wxAuiPaneInfo().Name(wxT("Panel7")).Layer(4).Bottom().Row(1).Position(3).Caption(_("Statistics")).MinSize(bSizerData->GetSize().GetWidth() / 2, m_panelStatistics->GetSize().GetHeight()));
auiMgr.Update();
@@ -597,7 +585,7 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
m_bpButtonSave ->SetBitmapLabel(GlobalResources::getImage(L"save"));
m_bpButtonLoad ->SetBitmapLabel(GlobalResources::getImage(L"load"));
m_bpButtonAddPair ->SetBitmapLabel(GlobalResources::getImage(L"addFolderPair"));
- m_bitmapResizeCorner->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"statusEdge")));
+ //m_bitmapResizeCorner->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"statusEdge")));
{
IconBuffer tmp(IconBuffer::SIZE_SMALL);
const wxBitmap bmpFile = tmp.genericFileIcon();
@@ -609,11 +597,6 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
m_bitmapSmallFileRight ->SetBitmap(bmpFile);
}
- m_bitmapCreate->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"create")));
- m_bitmapUpdate->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"update")));
- m_bitmapDelete->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"delete")));
- m_bitmapData ->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"data")));
-
m_panelTopButtons->Layout(); //wxButtonWithImage size might have changed
//menu icons: workaround for wxWidgets: small hack to update menu items: actually this is a wxWidgets bug (affects Windows- and Linux-build)
@@ -705,33 +688,42 @@ void MainDialog::init(const xmlAccess::XmlGuiConfig& guiCfg,
//check existence of all directories in parallel!
RunUntilFirstHit<NullType> findFirstMissing;
- bool haveNonEmptyPair = false;
+ //harmonize checks with comparison.cpp:: checkForIncompleteInput()
+ //we're really doing two checks: 1. check directory existence 2. check config validity -> don't mix them!
+ bool havePartialPair = false;
+ bool haveFullPair = false;
+
auto addDirCheck = [&](const FolderPairEnh& fp)
{
- const Zstring dirFmtLeft = getFormattedDirectoryName(fp.leftDirectory ); //should not block!?
- const Zstring dirFmtRight = getFormattedDirectoryName(fp.rightDirectory); //
+ const Zstring dirLeft = getFormattedDirectoryName(fp.leftDirectory ); //should not block!?
+ const Zstring dirRight = getFormattedDirectoryName(fp.rightDirectory); //
- if (dirFmtLeft.empty() && dirFmtRight.empty()) //only skip check if both sides are empty!
- return;
- haveNonEmptyPair = true;
- findFirstMissing.addJob([=] { return dirFmtLeft .empty() || !dirExists(dirFmtLeft ) ? zen::make_unique<NullType>() : nullptr; });
- findFirstMissing.addJob([=] { return dirFmtRight.empty() || !dirExists(dirFmtRight) ? zen::make_unique<NullType>() : nullptr; });
+ if (dirLeft.empty() != dirRight.empty()) //only skip check if both sides are empty!
+ havePartialPair = true;
+ else if (!dirLeft.empty())
+ haveFullPair = true;
+
+ if (!dirLeft.empty())
+ findFirstMissing.addJob([=] { return !dirExists(dirLeft ) ? zen::make_unique<NullType>() : nullptr; });
+ if (!dirRight.empty())
+ findFirstMissing.addJob([=] { return !dirExists(dirRight) ? zen::make_unique<NullType>() : nullptr; });
};
addDirCheck(currMainCfg.firstPair);
std::for_each(currMainCfg.additionalPairs.begin(), currMainCfg.additionalPairs.end(), addDirCheck);
//------------------------------------------------------------------------------------------
- if (haveNonEmptyPair)
+ if (havePartialPair != haveFullPair) //either all pairs full or all half-filled -> validity check!
{
//potentially slow network access: give all checks 500ms to finish
const bool allFilesExist = findFirstMissing.timedWait(boost::posix_time::milliseconds(500)) && //true: have result
!findFirstMissing.get(); //no missing
if (allFilesExist)
- {
- wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED);
- m_buttonCompare->GetEventHandler()->AddPendingEvent(dummy2); //simulate button click on "compare"
- }
+ if (wxEvtHandler* evtHandler = m_buttonCompare->GetEventHandler())
+ {
+ wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED);
+ evtHandler->AddPendingEvent(dummy2); //simulate button click on "compare"
+ }
}
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------
@@ -967,7 +959,7 @@ std::vector<FileSystemObject*> MainDialog::getTreeSelection() const
{
if (std::unique_ptr<TreeView::Node> node = treeDataView->getLine(row))
{
- if (const TreeView::RootNode* root = dynamic_cast<const TreeView::RootNode*>(node.get()))
+ if (auto root = dynamic_cast<const TreeView::RootNode*>(node.get()))
{
//select first level of child elements
std::transform(root->baseMap_.refSubDirs ().begin(), root->baseMap_.refSubDirs ().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; });
@@ -975,9 +967,15 @@ std::vector<FileSystemObject*> MainDialog::getTreeSelection() const
std::transform(root->baseMap_.refSubLinks().begin(), root->baseMap_.refSubLinks().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; });
//for (auto& fsObj : root->baseMap_.refSubLinks()) output.push_back(&fsObj); -> seriously MSVC, stop this disgrace and implement "range for"!
}
- else if (const TreeView::DirNode* dir = dynamic_cast<const TreeView::DirNode*>(node.get()))
+ else if (auto dir = dynamic_cast<const TreeView::DirNode*>(node.get()))
output.push_back(&(dir->dirObj_));
- //else if (dynamic_cast<const TreeView::FilesNode*>(node.get())) -> ignore files/symlinks
+ else if (auto file = dynamic_cast<const TreeView::FilesNode*>(node.get()))
+ {
+ //does a "little more" than what is shown on main grid: we return ALL files
+ HierarchyObject& parent = file->firstFile_.parent();
+ std::transform(parent.refSubFiles().begin(), parent.refSubFiles().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; });
+ std::transform(parent.refSubLinks().begin(), parent.refSubLinks().end(), std::back_inserter(output), [](FileSystemObject& fsObj) { return &fsObj; });
+ }
}
});
return output;
@@ -1046,7 +1044,7 @@ public:
if (updateUiIsAllowed()) //test if specific time span between ui updates is over
{
wxString statusMessage = replaceCpy(_P("Object deleted successfully!", "%x objects deleted successfully!", deletionCount),
- L"%x", zen::toStringSep(deletionCount), false);
+ L"%x", zen::toGuiString(deletionCount), false);
if (mainDlg->m_staticTextStatusMiddle->GetLabel() != statusMessage)
{
@@ -1140,11 +1138,26 @@ wxString extractLastValidDir(const FileSystemObject& fsObj)
}
-void MainDialog::openExternalApplication(const FileSystemObject* fsObj, bool leftSide, const wxString& commandline)
+void MainDialog::openExternalApplication(const wxString& commandline, const zen::FileSystemObject* fsObj, size_t compPos) //fsObj may be nullptr
{
if (commandline.empty())
return;
+ bool leftSide = true;
+ switch (compPos)
+ {
+ case gridview::COMP_LEFT:
+ break;
+ case gridview::COMP_MIDDLE:
+ return; //we don't want to start external apps when double-clicking here!
+ case gridview::COMP_RIGHT:
+ leftSide = false;
+ break;
+ default: //area to the right of main grid
+ leftSide = false;
+ fsObj = nullptr; //do not evaluate row when outside grid!
+ }
+
wxString name;
wxString nameCo;
wxString dir;
@@ -1254,6 +1267,8 @@ void MainDialog::disableAllElements(bool enableAbort)
m_bpButtonSyncConfig ->Disable();
m_buttonStartSync ->Disable();
m_gridMain ->Disable();
+ m_panelCenter ->Disable();
+ m_panelStatistics ->Disable();
m_gridNavi ->Disable();
m_panelDirectoryPairs->Disable();
m_menubar1->EnableTop(0, false);
@@ -1288,6 +1303,8 @@ void MainDialog::enableAllElements()
m_bpButtonSyncConfig ->Enable();
m_buttonStartSync ->Enable();
m_gridMain ->Enable();
+ m_panelCenter ->Enable();
+ m_panelStatistics ->Enable();
m_gridNavi ->Enable();
m_panelDirectoryPairs->Enable();
m_menubar1->EnableTop(0, true);
@@ -1494,7 +1511,7 @@ void MainDialog::onGridButtonEvent(wxKeyEvent& event)
auto cursorPos = m_gridMain->getGridCursor();
const size_t row = cursorPos.first;
const size_t compPos = cursorPos.second;
- openExternalApplication(gridDataView->getObject(row), compPos == gridview::COMP_LEFT, commandline);
+ openExternalApplication(commandline, gridDataView->getObject(row), compPos);
}
return;
}
@@ -1549,7 +1566,7 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou
return; //-> swallow event!
case WXK_F8: //F8
- enablePreview(!syncPreviewEnabled);
+ showSyncAction(!showSyncAction_);
return; //-> swallow event!
//redirect certain (unhandled) keys directly to grid!
@@ -1578,12 +1595,13 @@ void MainDialog::OnGlobalKeyEvent(wxKeyEvent& event) //process key events withou
!isPartOf(focus, m_directoryRight) &&
!isPartOf(focus, m_gridNavi ) &&
!isPartOf(focus, m_scrolledWindowFolderPairs))
- {
- m_gridMain->SetFocus();
- m_gridMain->GetEventHandler()->ProcessEvent(event); //propagating event catched at wxTheApp to child leads to recursion, but we prevented it...
- event.Skip(false); //definitively handled now!
- return;
- }
+ if (wxEvtHandler* evtHandler = m_gridMain->GetEventHandler())
+ {
+ m_gridMain->SetFocus();
+ evtHandler->ProcessEvent(event); //propagating event catched at wxTheApp to child leads to recursion, but we prevented it...
+ event.Skip(false); //definitively handled now!
+ return;
+ }
}
break;
}
@@ -1640,12 +1658,11 @@ void MainDialog::onNaviSelection(GridRangeSelectEvent& event)
void MainDialog::onNaviGridContext(GridClickEvent& event)
{
- ContextMenu menu;
-
const auto& selection = getTreeSelection(); //referenced by lambdas!
+ ContextMenu menu;
//----------------------------------------------------------------------------------------------------
- if (syncPreviewEnabled && !selection.empty())
+ if (showSyncAction_ && !selection.empty())
//std::any_of(selection.begin(), selection.end(), [](const FileSystemObject* fsObj){ return fsObj->getSyncOperation() != SO_EQUAL; })) -> doesn't consider directories
{
auto getImage = [&](SyncDirection dir, SyncOperation soDefault)
@@ -1686,13 +1703,13 @@ void MainDialog::onNaviGridContext(GridClickEvent& event)
{
//by relative path
menu.addItem(_("Exclude via filter:") + L" " + (FILE_NAME_SEPARATOR + selection[0]->getObjRelativeName()),
- [this, &selection] { excludeItems(selection); }, &GlobalResources::getImage(L"filterOnSmall"));
+ [this, &selection] { excludeItems(selection); }, &GlobalResources::getImage(L"filterSmall"));
}
else if (selection.size() > 1)
{
//by relative path
menu.addItem(_("Exclude via filter:") + L" " + _("<multiple selection>"),
- [this, &selection] { excludeItems(selection); }, &GlobalResources::getImage(L"filterOnSmall"));
+ [this, &selection] { excludeItems(selection); }, &GlobalResources::getImage(L"filterSmall"));
}
//----------------------------------------------------------------------------------------------------
@@ -1706,135 +1723,137 @@ void MainDialog::onNaviGridContext(GridClickEvent& event)
void MainDialog::onMainGridContext(GridClickEvent& event)
{
- ContextMenu menu;
-
const auto& selection = getGridSelection(); //referenced by lambdas!
+ ContextMenu menu;
- if (event.compPos_ == gridview::COMP_LEFT ||
- event.compPos_ == gridview::COMP_RIGHT)
+ switch (event.compPos_)
{
- //----------------------------------------------------------------------------------------------------
- if (syncPreviewEnabled && !selection.empty())
- {
- auto getImage = [&](SyncDirection dir, SyncOperation soDefault)
+ case gridview::COMP_MIDDLE:
+ menu.addItem(_("Include all"), [&]
{
- return mirrorIfRtl(getSyncOpImage(selection[0]->getSyncOperation() != SO_EQUAL ?
- selection[0]->testSyncOperation(dir) : soDefault));
- };
- const wxBitmap opRight = getImage(SYNC_DIR_RIGHT, SO_OVERWRITE_RIGHT);
- const wxBitmap opNone = getImage(SYNC_DIR_NONE, SO_DO_NOTHING );
- const wxBitmap opLeft = getImage(SYNC_DIR_LEFT, SO_OVERWRITE_LEFT );
-
- wxString shortCutLeft = L"\tAlt+Left";
- wxString shortCutRight = L"\tAlt+Right";
- if (wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft)
- std::swap(shortCutLeft, shortCutRight);
-
- menu.addItem(_("Set direction:") + L" ->" + shortCutRight, [this, &selection] { setSyncDirManually(selection, SYNC_DIR_RIGHT); }, &opRight);
- menu.addItem(_("Set direction:") + L" -" L"\tAlt+Up", [this, &selection] { setSyncDirManually(selection, SYNC_DIR_NONE); }, &opNone);
- menu.addItem(_("Set direction:") + L" <-" + shortCutLeft, [this, &selection] { setSyncDirManually(selection, SYNC_DIR_LEFT); }, &opLeft);
- //Gtk needs a direction, "<-", because it has no context menu icons!
- //Gtk requires "no spaces" for shortcut identifiers!
- menu.addSeparator();
- }
- //----------------------------------------------------------------------------------------------------
- if (!selection.empty())
- {
- if (selection[0]->isActive())
- menu.addItem(_("Exclude temporarily") + L"\tSpace", [this, &selection] { setManualFilter(selection, false); }, &GlobalResources::getImage(L"checkboxFalse"));
- else
- menu.addItem(_("Include temporarily") + L"\tSpace", [this, &selection] { setManualFilter(selection, true); }, &GlobalResources::getImage(L"checkboxTrue"));
- }
- else
- menu.addItem(_("Exclude temporarily") + L"\tSpace", [] {}, nullptr, false);
+ zen::setActiveStatus(true, folderCmp);
+ updateGui();
+ }, nullptr, gridDataView->rowsTotal() > 0);
- //----------------------------------------------------------------------------------------------------
- //EXCLUDE FILTER
- if (selection.size() == 1)
- {
- ContextMenu submenu;
+ menu.addItem(_("Exclude all"), [&]
+ {
+ zen::setActiveStatus(false, folderCmp);
+ updateGuiAfterFilterChange(400); //call this instead of updateGuiGrid() to add some delay if hideFiltered == true
+ }, nullptr, gridDataView->rowsTotal() > 0);
+ break;
- //by extension
- if (dynamic_cast<const DirMapping*>(selection[0]) == nullptr) //non empty && no directory
+ case gridview::COMP_LEFT:
+ case gridview::COMP_RIGHT:
+ default: //area to the right of main grid
+ //----------------------------------------------------------------------------------------------------
+ if (showSyncAction_ && !selection.empty())
{
- const Zstring filename = afterLast(selection[0]->getObjRelativeName(), FILE_NAME_SEPARATOR);
- if (contains(filename, Zchar('.'))) //be careful: AfterLast would return the whole string if '.' were not found!
+ auto getImage = [&](SyncDirection dir, SyncOperation soDefault)
{
- const Zstring extension = afterLast(filename, Zchar('.'));
-
- submenu.addItem(L"*." + utf8CvrtTo<wxString>(extension),
- [this, extension] { excludeExtension(extension); });
- }
+ return mirrorIfRtl(getSyncOpImage(selection[0]->getSyncOperation() != SO_EQUAL ?
+ selection[0]->testSyncOperation(dir) : soDefault));
+ };
+ const wxBitmap opRight = getImage(SYNC_DIR_RIGHT, SO_OVERWRITE_RIGHT);
+ const wxBitmap opNone = getImage(SYNC_DIR_NONE, SO_DO_NOTHING );
+ const wxBitmap opLeft = getImage(SYNC_DIR_LEFT, SO_OVERWRITE_LEFT );
+
+ wxString shortCutLeft = L"\tAlt+Left";
+ wxString shortCutRight = L"\tAlt+Right";
+ if (wxTheApp->GetLayoutDirection() == wxLayout_RightToLeft)
+ std::swap(shortCutLeft, shortCutRight);
+
+ menu.addItem(_("Set direction:") + L" ->" + shortCutRight, [this, &selection] { setSyncDirManually(selection, SYNC_DIR_RIGHT); }, &opRight);
+ menu.addItem(_("Set direction:") + L" -" L"\tAlt+Up", [this, &selection] { setSyncDirManually(selection, SYNC_DIR_NONE); }, &opNone);
+ menu.addItem(_("Set direction:") + L" <-" + shortCutLeft, [this, &selection] { setSyncDirManually(selection, SYNC_DIR_LEFT); }, &opLeft);
+ //Gtk needs a direction, "<-", because it has no context menu icons!
+ //Gtk requires "no spaces" for shortcut identifiers!
+ menu.addSeparator();
}
+ //----------------------------------------------------------------------------------------------------
+ if (!selection.empty())
+ {
+ if (selection[0]->isActive())
+ menu.addItem(_("Exclude temporarily") + L"\tSpace", [this, &selection] { setManualFilter(selection, false); }, &GlobalResources::getImage(L"checkboxFalse"));
+ else
+ menu.addItem(_("Include temporarily") + L"\tSpace", [this, &selection] { setManualFilter(selection, true); }, &GlobalResources::getImage(L"checkboxTrue"));
+ }
+ else
+ menu.addItem(_("Exclude temporarily") + L"\tSpace", [] {}, nullptr, false);
- //by short name
- submenu.addItem(utf8CvrtTo<wxString>(Zstring(Zstr("*")) + FILE_NAME_SEPARATOR + selection[0]->getObjShortName()),
- [this, &selection] { excludeShortname(*selection[0]); });
+ //----------------------------------------------------------------------------------------------------
+ //EXCLUDE FILTER
+ if (selection.size() == 1)
+ {
+ ContextMenu submenu;
- //by relative path
- submenu.addItem(utf8CvrtTo<wxString>(FILE_NAME_SEPARATOR + selection[0]->getObjRelativeName()),
- [this, &selection] { excludeItems(selection); });
+ //by extension
+ if (dynamic_cast<const DirMapping*>(selection[0]) == nullptr) //non empty && no directory
+ {
+ const Zstring filename = afterLast(selection[0]->getObjRelativeName(), FILE_NAME_SEPARATOR);
+ if (contains(filename, Zchar('.'))) //be careful: AfterLast would return the whole string if '.' were not found!
+ {
+ const Zstring extension = afterLast(filename, Zchar('.'));
- menu.addSubmenu(_("Exclude via filter:"), submenu, &GlobalResources::getImage(L"filterOnSmall"));
- }
- else if (selection.size() > 1)
- {
- //by relative path
- menu.addItem(_("Exclude via filter:") + L" " + _("<multiple selection>"),
- [this, &selection] { excludeItems(selection); }, &GlobalResources::getImage(L"filterOnSmall"));
- }
+ submenu.addItem(L"*." + utfCvrtTo<wxString>(extension),
+ [this, extension] { excludeExtension(extension); });
+ }
+ }
- //----------------------------------------------------------------------------------------------------
- //CONTEXT_EXTERNAL_APP
- if (!globalSettings->gui.externelApplications.empty())
- {
- menu.addSeparator();
+ //by short name
+ submenu.addItem(utfCvrtTo<wxString>(Zstring(Zstr("*")) + FILE_NAME_SEPARATOR + selection[0]->getObjShortName()),
+ [this, &selection] { excludeShortname(*selection[0]); });
+
+ //by relative path
+ submenu.addItem(utfCvrtTo<wxString>(FILE_NAME_SEPARATOR + selection[0]->getObjRelativeName()),
+ [this, &selection] { excludeItems(selection); });
- for (auto iter = globalSettings->gui.externelApplications.begin();
- iter != globalSettings->gui.externelApplications.end();
- ++iter)
+ menu.addSubmenu(_("Exclude via filter:"), submenu, &GlobalResources::getImage(L"filterSmall"));
+ }
+ else if (selection.size() > 1)
{
- //some trick to translate default external apps on the fly: 1. "open in explorer" 2. "start directly"
- wxString description = zen::implementation::translate(copyStringTo<std::wstring>(iter->first));
- if (description.empty())
- description = L" "; //wxWidgets doesn't like empty items
+ //by relative path
+ menu.addItem(_("Exclude via filter:") + L" " + _("<multiple selection>"),
+ [this, &selection] { excludeItems(selection); }, &GlobalResources::getImage(L"filterSmall"));
+ }
- const wxString command = iter->second;
+ //----------------------------------------------------------------------------------------------------
+ //CONTEXT_EXTERNAL_APP
+ if (!globalSettings->gui.externelApplications.empty())
+ {
+ menu.addSeparator();
- auto openApp = [this, &selection, command, event] { openExternalApplication(selection.empty() ? nullptr : selection[0], event.compPos_ == gridview::COMP_LEFT, command); };
+ for (auto iter = globalSettings->gui.externelApplications.begin();
+ iter != globalSettings->gui.externelApplications.end();
+ ++iter)
+ {
+ //some trick to translate default external apps on the fly: 1. "open in explorer" 2. "start directly"
+ wxString description = zen::implementation::translate(iter->first);
+ if (description.empty())
+ description = L" "; //wxWidgets doesn't like empty items
- if (iter == globalSettings->gui.externelApplications.begin())
- menu.addItem(description + L"\tEnter", openApp);
- else
- menu.addItem(description, openApp, nullptr, !selection.empty());
- }
- }
- //----------------------------------------------------------------------------------------------------
- //CONTEXT_DELETE_FILES
- menu.addSeparator();
+ const wxString command = iter->second;
- menu.addItem(_("Delete") + L"\tDel", [this]
- {
- deleteSelectedFiles(
- getGridSelection(true, false),
- getGridSelection(false, true));
- }, nullptr, !selection.empty());
- }
+ auto openApp = [this, &selection, command, event] { openExternalApplication(command, selection.empty() ? nullptr : selection[0], event.compPos_); };
- else if (event.compPos_ == gridview::COMP_MIDDLE)
- {
- menu.addItem(_("Include all"), [&]
- {
- zen::setActiveStatus(true, folderCmp);
- updateGui();
- }, nullptr, gridDataView->rowsTotal() > 0);
+ if (iter == globalSettings->gui.externelApplications.begin())
+ menu.addItem(description + L"\tEnter", openApp);
+ else
+ menu.addItem(description, openApp, nullptr, !selection.empty());
+ }
+ }
+ //----------------------------------------------------------------------------------------------------
+ //CONTEXT_DELETE_FILES
+ menu.addSeparator();
- menu.addItem(_("Exclude all"), [&]
- {
- zen::setActiveStatus(false, folderCmp);
- updateGuiAfterFilterChange(400); //call this instead of updateGuiGrid() to add some delay if hideFiltered == true
- }, nullptr, gridDataView->rowsTotal() > 0);
+ menu.addItem(_("Delete") + L"\tDel", [this]
+ {
+ deleteSelectedFiles(
+ getGridSelection(true, false),
+ getGridSelection(false, true));
+ }, nullptr, !selection.empty());
+ break;
}
+
menu.popup(*this);
}
@@ -1996,8 +2015,8 @@ void MainDialog::onGridLabelContext(GridClickEvent& event)
else if (event.compPos_ == gridview::COMP_MIDDLE)
{
- menu.addItem(_("Synchronization Preview") + L"\tF8", [&] { enablePreview(true ); }, syncPreviewEnabled ? &GlobalResources::getImage(L"syncSmall") : nullptr);
- menu.addItem(_("Comparison Result"), [&] { enablePreview(false); }, syncPreviewEnabled ? nullptr : &GlobalResources::getImage(L"compareSmall"));
+ menu.addItem(_("Category") + L"\tF8", [&] { showSyncAction(false); }, showSyncAction_ ? nullptr : &GlobalResources::getImage(L"compareSmall"));
+ menu.addItem(_("Action"), [&] { showSyncAction(true ); }, showSyncAction_ ? &GlobalResources::getImage(L"syncSmall") : nullptr);
}
menu.popup(*this);
}
@@ -2100,7 +2119,7 @@ void MainDialog::onNaviPanelFilesDropped(FileDropEvent& event)
wxString getFormattedHistoryElement(const wxString& filename)
{
- wxString output = afterLast(filename, utf8CvrtTo<wxString>(FILE_NAME_SEPARATOR));
+ wxString output = afterLast(filename, utfCvrtTo<wxString>(FILE_NAME_SEPARATOR));
if (endsWith(output, ".ffs_gui"))
output = beforeLast(output, L'.');
return output;
@@ -2206,8 +2225,8 @@ bool MainDialog::trySaveConfig(const wxString* fileName) //return true if saved
wxEmptyString,
wxEmptyString,
defaultFileName,
- wxString(_("FreeFileSync configuration")) + wxT(" (*.ffs_gui)|*.ffs_gui"),
- wxFD_SAVE /*| wxFD_OVERWRITE_PROMPT*/);
+ wxString(L"FreeFileSync (*.ffs_gui)|*.ffs_gui") + L"|" +_("All files") + L" (*.*)|*",
+ wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
if (filePicker.ShowModal() != wxID_OK)
return false;
targetFilename = filePicker.GetPath();
@@ -2235,9 +2254,9 @@ void MainDialog::OnLoadConfig(wxCommandEvent& event)
{
wxFileDialog filePicker(this,
wxEmptyString,
- beforeLast(activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : wxString(), utf8CvrtTo<wxString>(FILE_NAME_SEPARATOR)), //set default dir: empty string if "activeConfigFiles" is empty or has no path separator
+ beforeLast(activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : wxString(), utfCvrtTo<wxString>(FILE_NAME_SEPARATOR)), //set default dir: empty string if "activeConfigFiles" is empty or has no path separator
wxEmptyString,
- _("FreeFileSync configuration") + L" (*.ffs_gui;*.ffs_batch)|*.ffs_gui;*.ffs_batch",
+ wxString(L"FreeFileSync (*.ffs_gui;*.ffs_batch)|*.ffs_gui;*.ffs_batch") + L"|" +_("All files") + L" (*.*)|*",
wxFD_OPEN | wxFD_MULTIPLE);
if (filePicker.ShowModal() == wxID_OK)
@@ -2519,7 +2538,7 @@ void MainDialog::setConfig(const xmlAccess::XmlGuiConfig& newGuiCfg)
//read GUI layout
m_checkBoxHideFilt->SetValue(currentCfg.hideFilteredElements);
- enablePreview(currentCfg.syncPreviewEnabled);
+ showSyncAction(currentCfg.showSyncAction);
//###########################################################
//update compare variant name
@@ -2561,7 +2580,7 @@ xmlAccess::XmlGuiConfig MainDialog::getConfig() const
std::back_inserter(guiCfg.mainCfg.additionalPairs), getEnhancedPair);
//sync preview
- guiCfg.syncPreviewEnabled = syncPreviewEnabled;
+ guiCfg.showSyncAction = showSyncAction_;
return guiCfg;
}
@@ -2735,14 +2754,14 @@ wxBitmap buttonPressed(const std::string& name)
wxBitmap background = GlobalResources::getImage(L"buttonPressed");
return mirrorIfRtl(
layOver(
- GlobalResources::getImage(utf8CvrtTo<wxString>(name)), background));
+ GlobalResources::getImage(utfCvrtTo<wxString>(name)), background));
}
inline
wxBitmap buttonReleased(const std::string& name)
{
- wxImage output = GlobalResources::getImage(utf8CvrtTo<wxString>(name)).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally!
+ wxImage output = GlobalResources::getImage(utfCvrtTo<wxString>(name)).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally!
zen::move(output, 0, -1); //move image right one pixel
brighten(output, 80);
@@ -2847,15 +2866,15 @@ void MainDialog::initViewFilterButtons()
void MainDialog::updateFilterButtons()
{
//global filter: test for Null-filter
- if (isNullFilter(currentCfg.mainCfg.globalFilter))
+ if (!isNullFilter(currentCfg.mainCfg.globalFilter))
{
- setImage(*m_bpButtonFilter, GlobalResources::getImage(wxT("filterOff")));
- m_bpButtonFilter->SetToolTip(_("No filter selected"));
+ setImage(*m_bpButtonFilter, GlobalResources::getImage(L"filter"));
+ m_bpButtonFilter->SetToolTip(_("Filter is active"));
}
else
{
- setImage(*m_bpButtonFilter, GlobalResources::getImage(wxT("filterOn")));
- m_bpButtonFilter->SetToolTip(_("Filter is active"));
+ setImage(*m_bpButtonFilter, greyScale(GlobalResources::getImage(L"filter")));
+ m_bpButtonFilter->SetToolTip(_("No filter selected"));
}
//update main local filter
@@ -2972,17 +2991,34 @@ void MainDialog::clearGrid(bool refreshGrid)
void MainDialog::updateStatistics()
{
- //update preview of bytes to be transferred:
+ //update preview of item count and bytes to be transferred:
const SyncStatistics st(folderCmp);
- const wxString toCreate = zen::toStringSep(st.getCreate());
- const wxString toUpdate = zen::toStringSep(st.getUpdate());
- const wxString toDelete = zen::toStringSep(st.getDelete());
- const wxString data = zen::filesizeToShortString(st.getDataToProcess());
- m_textCtrlCreate->SetValue(toCreate);
- m_textCtrlUpdate->SetValue(toUpdate);
- m_textCtrlDelete->SetValue(toDelete);
- m_textCtrlData ->SetValue(data);
+ setText(*m_staticTextData, filesizeToShortString(st.getDataToProcess()));
+ if (st.getDataToProcess() == 0)
+ m_bitmapData->SetBitmap(greyScale(GlobalResources::getImage(L"data")));
+ else
+ m_bitmapData->SetBitmap(GlobalResources::getImage(L"data"));
+
+ auto setValue = [](wxStaticText& txtControl, int value, wxStaticBitmap& bmpControl, const wchar_t* bmpName)
+ {
+ setText(txtControl, toGuiString(value));
+
+ if (value == 0)
+ bmpControl.SetBitmap(greyScale(mirrorIfRtl(GlobalResources::getImage(bmpName))));
+ else
+ bmpControl.SetBitmap(mirrorIfRtl(GlobalResources::getImage(bmpName)));
+ };
+
+ setValue(*m_staticTextCreateLeft, st.getCreate<LEFT_SIDE >(), *m_bitmapCreateLeft, L"createLeftSmall");
+ setValue(*m_staticTextUpdateLeft, st.getUpdate<LEFT_SIDE >(), *m_bitmapUpdateLeft, L"updateLeftSmall");
+ setValue(*m_staticTextDeleteLeft, st.getDelete<LEFT_SIDE >(), *m_bitmapDeleteLeft, L"deleteLeftSmall");
+ setValue(*m_staticTextCreateRight, st.getCreate<RIGHT_SIDE>(), *m_bitmapCreateRight, L"createRightSmall");
+ setValue(*m_staticTextUpdateRight, st.getUpdate<RIGHT_SIDE>(), *m_bitmapUpdateRight, L"updateRightSmall");
+ setValue(*m_staticTextDeleteRight, st.getDelete<RIGHT_SIDE>(), *m_bitmapDeleteRight, L"deleteRightSmall");
+
+ m_panelStatistics->Layout();
+ m_panelStatistics->Refresh(); //fix small mess up on RTL layout
}
@@ -3018,10 +3054,10 @@ void MainDialog::applyCompareConfig(bool changePreviewStatus)
switch (currentCfg.mainCfg.cmpConfig.compareVar)
{
case CMP_BY_TIME_SIZE:
- enablePreview(true);
+ showSyncAction(true);
break;
case CMP_BY_CONTENT:
- enablePreview(false);
+ showSyncAction(false);
break;
}
@@ -3056,7 +3092,8 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
{
//quick sync: simulate button click on "compare"
wxCommandEvent dummy2(wxEVT_COMMAND_BUTTON_CLICKED);
- m_buttonCompare->GetEventHandler()->ProcessEvent(dummy2); //synchronous call
+ if (wxEvtHandler* evtHandler = m_buttonCompare->GetEventHandler())
+ evtHandler->ProcessEvent(dummy2); //synchronous call
if (folderCmp.empty()) //check if user aborted or error occured, ect...
return;
@@ -3085,7 +3122,9 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
{
//PERF_START;
- wxString activeFileName = activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName() ? activeConfigFiles[0] : wxString();
+ Zstring activeFileName;
+ if (activeConfigFiles.size() == 1 && activeConfigFiles[0] != lastRunConfigName())
+ activeFileName = utfCvrtTo<Zstring>(activeConfigFiles[0]);
const auto& guiCfg = getConfig();
@@ -3109,7 +3148,9 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
}
//start synchronization and mark all elements processed
- zen::SyncProcess syncProc(globalSettings->optDialogs,
+ zen::SyncProcess syncProc(xmlAccess::extractJobName(activeFileName),
+ formatTime<std::wstring>(L"%Y-%m-%d %H%M%S"),
+ globalSettings->optDialogs,
globalSettings->verifyFileCopy,
globalSettings->copyLockedFiles,
globalSettings->copyFilePermissions,
@@ -3145,9 +3186,9 @@ void MainDialog::OnStartSync(wxCommandEvent& event)
void MainDialog::onGridDoubleClick(GridClickEvent& event)
{
if (!globalSettings->gui.externelApplications.empty())
- openExternalApplication(gridDataView->getObject(event.row_), //optional
- event.compPos_ == gridview::COMP_LEFT,
- globalSettings->gui.externelApplications[0].second);
+ openExternalApplication(globalSettings->gui.externelApplications[0].second,
+ gridDataView->getObject(event.row_), //optional
+ event.compPos_);
}
@@ -3177,7 +3218,7 @@ void MainDialog::onGridLabelLeftClick(GridClickEvent& event)
case gridview::COMP_MIDDLE:
//sorting middle grid is more or less useless: therefore let's toggle view instead!
- enablePreview(!syncPreviewEnabled); //toggle view
+ showSyncAction(!showSyncAction_); //toggle view
break;
case gridview::COMP_RIGHT:
@@ -3262,7 +3303,7 @@ void MainDialog::updateGridViewData()
m_bpButtonSyncDirNone-> Show(false);
- if (syncPreviewEnabled)
+ if (showSyncAction_)
{
const GridView::StatusSyncPreview result = gridDataView->updateSyncPreview(currentCfg.hideFilteredElements,
m_bpButtonSyncCreateLeft-> isActive(),
@@ -3354,7 +3395,7 @@ void MainDialog::updateGridViewData()
m_gridMain->Refresh();
//navigation tree
- if (syncPreviewEnabled)
+ if (showSyncAction_)
treeDataView->updateSyncPreview(currentCfg.hideFilteredElements,
m_bpButtonSyncCreateLeft-> isActive(),
m_bpButtonSyncCreateRight-> isActive(),
@@ -3387,8 +3428,8 @@ void MainDialog::updateGridViewData()
bSizerStatusLeftDirectories->Show(foldersOnLeftView > 0);
bSizerStatusLeftFiles ->Show(filesOnLeftView > 0);
- setText(*m_staticTextStatusLeftDirs, replaceCpy(_P("1 directory", "%x directories", foldersOnLeftView), L"%x", toStringSep(foldersOnLeftView), false));
- setText(*m_staticTextStatusLeftFiles, replaceCpy(_P("1 file", "%x files", filesOnLeftView), L"%x", toStringSep(filesOnLeftView), false));
+ setText(*m_staticTextStatusLeftDirs, replaceCpy(_P("1 directory", "%x directories", foldersOnLeftView), L"%x", toGuiString(foldersOnLeftView), false));
+ setText(*m_staticTextStatusLeftFiles, replaceCpy(_P("1 file", "%x files", filesOnLeftView), L"%x", toGuiString(filesOnLeftView), false));
setText(*m_staticTextStatusLeftBytes, filesizeToShortString(to<Int64>(filesizeLeftView)));
{
@@ -3396,8 +3437,8 @@ void MainDialog::updateGridViewData()
if (gridDataView->rowsTotal() > 0)
{
statusMiddleNew = _P("%x of 1 row in view", "%x of %y rows in view", gridDataView->rowsTotal());
- replace(statusMiddleNew, L"%x", toStringSep(gridDataView->rowsOnView()), false);
- replace(statusMiddleNew, L"%y", toStringSep(gridDataView->rowsTotal ()), false);
+ replace(statusMiddleNew, L"%x", toGuiString(gridDataView->rowsOnView()), false);
+ replace(statusMiddleNew, L"%y", toGuiString(gridDataView->rowsTotal ()), false);
}
setText(*m_staticTextStatusMiddle, statusMiddleNew);
}
@@ -3405,8 +3446,8 @@ void MainDialog::updateGridViewData()
bSizerStatusRightDirectories->Show(foldersOnRightView > 0);
bSizerStatusRightFiles ->Show(filesOnRightView > 0);
- setText(*m_staticTextStatusRightDirs, replaceCpy(_P("1 directory", "%x directories", foldersOnRightView), L"%x", toStringSep(foldersOnRightView), false));
- setText(*m_staticTextStatusRightFiles, replaceCpy(_P("1 file", "%x files", filesOnRightView), L"%x", toStringSep(filesOnRightView), false));
+ setText(*m_staticTextStatusRightDirs, replaceCpy(_P("1 directory", "%x directories", foldersOnRightView), L"%x", toGuiString(foldersOnRightView), false));
+ setText(*m_staticTextStatusRightFiles, replaceCpy(_P("1 file", "%x files", filesOnRightView), L"%x", toGuiString(filesOnRightView), false));
setText(*m_staticTextStatusRightBytes, filesizeToShortString(to<Int64>(filesizeRightView)));
m_panelStatusBar->Layout();
@@ -3683,12 +3724,12 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
{
//get a filename
const wxString defaultFileName = L"FileList.csv"; //proposal
- wxFileDialog filePicker(this,
+ wxFileDialog filePicker(this, //creating this on freestore leads to memleak!
wxEmptyString,
wxEmptyString,
defaultFileName,
- _("Comma separated list") + L" (*.csv)|*.csv",
- wxFD_SAVE /*| wxFD_OVERWRITE_PROMPT*/); //creating this on freestore leads to memleak!
+ _("Comma separated list") + L" (*.csv)|*.csv" + L"|" +_("All files") + L" (*.*)|*",
+ wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
if (filePicker.ShowModal() != wxID_OK)
return;
@@ -3699,38 +3740,38 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
UtfString exportString;
//write legend
- exportString += utf8CvrtTo<UtfString>(_("Legend")) + '\n';
- if (syncPreviewEnabled)
- {
- exportString += "\"" + utf8CvrtTo<UtfString>(getSyncOpDescription(SO_EQUAL)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(SO_EQUAL)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getSyncOpDescription(SO_CREATE_NEW_LEFT)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(SO_CREATE_NEW_LEFT)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getSyncOpDescription(SO_CREATE_NEW_RIGHT)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(SO_CREATE_NEW_RIGHT)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getSyncOpDescription(SO_OVERWRITE_LEFT)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(SO_OVERWRITE_LEFT)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getSyncOpDescription(SO_OVERWRITE_RIGHT)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(SO_OVERWRITE_RIGHT)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getSyncOpDescription(SO_DELETE_LEFT)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(SO_DELETE_LEFT)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getSyncOpDescription(SO_DELETE_RIGHT)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(SO_DELETE_RIGHT)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getSyncOpDescription(SO_DO_NOTHING)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(SO_DO_NOTHING)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getSyncOpDescription(SO_UNRESOLVED_CONFLICT)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(SO_UNRESOLVED_CONFLICT)) + '\n';
+ exportString += utfCvrtTo<UtfString>(_("Legend")) + '\n';
+ if (showSyncAction_)
+ {
+ exportString += "\"" + utfCvrtTo<UtfString>(getSyncOpDescription(SO_EQUAL)) + "\";" + utfCvrtTo<UtfString>(getSymbol(SO_EQUAL)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getSyncOpDescription(SO_CREATE_NEW_LEFT)) + "\";" + utfCvrtTo<UtfString>(getSymbol(SO_CREATE_NEW_LEFT)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getSyncOpDescription(SO_CREATE_NEW_RIGHT)) + "\";" + utfCvrtTo<UtfString>(getSymbol(SO_CREATE_NEW_RIGHT)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getSyncOpDescription(SO_OVERWRITE_LEFT)) + "\";" + utfCvrtTo<UtfString>(getSymbol(SO_OVERWRITE_LEFT)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getSyncOpDescription(SO_OVERWRITE_RIGHT)) + "\";" + utfCvrtTo<UtfString>(getSymbol(SO_OVERWRITE_RIGHT)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getSyncOpDescription(SO_DELETE_LEFT)) + "\";" + utfCvrtTo<UtfString>(getSymbol(SO_DELETE_LEFT)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getSyncOpDescription(SO_DELETE_RIGHT)) + "\";" + utfCvrtTo<UtfString>(getSymbol(SO_DELETE_RIGHT)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getSyncOpDescription(SO_DO_NOTHING)) + "\";" + utfCvrtTo<UtfString>(getSymbol(SO_DO_NOTHING)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getSyncOpDescription(SO_UNRESOLVED_CONFLICT)) + "\";" + utfCvrtTo<UtfString>(getSymbol(SO_UNRESOLVED_CONFLICT)) + '\n';
}
else
{
- exportString += "\"" + utf8CvrtTo<UtfString>(getCategoryDescription(FILE_EQUAL)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(FILE_EQUAL)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getCategoryDescription(FILE_DIFFERENT)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(FILE_DIFFERENT)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getCategoryDescription(FILE_LEFT_SIDE_ONLY)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(FILE_LEFT_SIDE_ONLY)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getCategoryDescription(FILE_RIGHT_SIDE_ONLY)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(FILE_RIGHT_SIDE_ONLY)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getCategoryDescription(FILE_LEFT_NEWER)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(FILE_LEFT_NEWER)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getCategoryDescription(FILE_RIGHT_NEWER)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(FILE_RIGHT_NEWER)) + '\n';
- exportString += "\"" + utf8CvrtTo<UtfString>(getCategoryDescription(FILE_CONFLICT)) + "\";" + utf8CvrtTo<UtfString>(getSymbol(FILE_CONFLICT)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getCategoryDescription(FILE_EQUAL)) + "\";" + utfCvrtTo<UtfString>(getSymbol(FILE_EQUAL)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getCategoryDescription(FILE_DIFFERENT)) + "\";" + utfCvrtTo<UtfString>(getSymbol(FILE_DIFFERENT)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getCategoryDescription(FILE_LEFT_SIDE_ONLY)) + "\";" + utfCvrtTo<UtfString>(getSymbol(FILE_LEFT_SIDE_ONLY)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getCategoryDescription(FILE_RIGHT_SIDE_ONLY)) + "\";" + utfCvrtTo<UtfString>(getSymbol(FILE_RIGHT_SIDE_ONLY)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getCategoryDescription(FILE_LEFT_NEWER)) + "\";" + utfCvrtTo<UtfString>(getSymbol(FILE_LEFT_NEWER)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getCategoryDescription(FILE_RIGHT_NEWER)) + "\";" + utfCvrtTo<UtfString>(getSymbol(FILE_RIGHT_NEWER)) + '\n';
+ exportString += "\"" + utfCvrtTo<UtfString>(getCategoryDescription(FILE_CONFLICT)) + "\";" + utfCvrtTo<UtfString>(getSymbol(FILE_CONFLICT)) + '\n';
}
exportString += '\n';
//base folders
- exportString += utf8CvrtTo<UtfString>(_("Folder pairs")) + '\n' ;
+ exportString += utfCvrtTo<UtfString>(_("Folder pairs")) + '\n' ;
std::for_each(begin(folderCmp), end(folderCmp),
[&](BaseDirMapping& baseMap)
{
- exportString += utf8CvrtTo<UtfString>(baseMap.getBaseDirPf<LEFT_SIDE >()) + ';';
- exportString += utf8CvrtTo<UtfString>(baseMap.getBaseDirPf<RIGHT_SIDE>()) + '\n';
+ exportString += utfCvrtTo<UtfString>(baseMap.getBaseDirPf<LEFT_SIDE >()) + ';';
+ exportString += utfCvrtTo<UtfString>(baseMap.getBaseDirPf<RIGHT_SIDE>()) + '\n';
});
exportString += '\n';
@@ -3750,9 +3791,9 @@ void MainDialog::OnMenuExportFileList(wxCommandEvent& event)
auto addCellValue = [&](const wxString& val)
{
if (val.find(L';') != wxString::npos)
- exportString += '\"' + utf8CvrtTo<UtfString>(val) + '\"';
+ exportString += '\"' + utfCvrtTo<UtfString>(val) + '\"';
else
- exportString += utf8CvrtTo<UtfString>(val);
+ exportString += utfCvrtTo<UtfString>(val);
};
if (provLeft && provMiddle && provRight)
@@ -3922,12 +3963,12 @@ void MainDialog::OnMenuLanguageSwitch(wxCommandEvent& event)
//#########################################################################################################
-void MainDialog::enablePreview(bool value)
+void MainDialog::showSyncAction(bool value)
{
- syncPreviewEnabled = value;
+ showSyncAction_ = value;
//toggle display of sync preview in middle grid
- gridview::setSyncPreviewActive(*m_gridMain, value);
+ gridview::showSyncAction(*m_gridMain, value);
updateGui();
}
@@ -3935,15 +3976,15 @@ void MainDialog::enablePreview(bool value)
void MainDialog::updateSyncEnabledStatus()
{
- if (folderCmp.empty())
+ if (!folderCmp.empty())
{
- m_buttonStartSync->SetForegroundColour(wxColor(128, 128, 128)); //Some colors seem to have problems with 16Bit color depth, well this one hasn't!
- m_buttonStartSync->setBitmapFront(GlobalResources::getImage(L"syncDisabled"));
+ m_buttonStartSync->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT));
+ m_buttonStartSync->setBitmapFront(GlobalResources::getImage(L"sync"));
}
else
{
- m_buttonStartSync->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT));
- m_buttonStartSync->setBitmapFront(GlobalResources::getImage(L"sync"));
+ m_buttonStartSync->SetForegroundColour(wxColor(128, 128, 128)); //Some colors seem to have problems with 16-bit desktop color, well this one hasn't!
+ m_buttonStartSync->setBitmapFront(GlobalResources::getImage(L"syncDisabled")); //looks better than greyscaling "sync" bmp
}
}
diff --git a/ui/main_dlg.h b/ui/main_dlg.h
index 6c0c6974..b9f3fe0d 100644
--- a/ui/main_dlg.h
+++ b/ui/main_dlg.h
@@ -106,7 +106,7 @@ private:
void deleteSelectedFiles(const std::vector<zen::FileSystemObject*>& selectionLeft,
const std::vector<zen::FileSystemObject*>& selectionRight);
- void openExternalApplication(const zen::FileSystemObject* fsObj, bool leftSide, const wxString& commandline); //fsObj is optional!
+ void openExternalApplication(const wxString& commandline, const zen::FileSystemObject* fsObj, size_t compPos); //fsObj may be nullptr
//work to be done in idle time
void OnIdleEvent(wxEvent& event);
@@ -251,9 +251,9 @@ private:
bool processingGlobalKeyEvent; //indicator to notify recursion in OnGlobalKeyEvent()
- bool syncPreviewEnabled; //toggle to display configuration preview instead of comparison result
+ bool showSyncAction_; //toggle to display configuration preview instead of comparison result
//use this methods when changing values!
- void enablePreview(bool value);
+ void showSyncAction(bool value);
wxAuiManager auiMgr; //implement dockable GUI design
diff --git a/ui/msg_popup.cpp b/ui/msg_popup.cpp
index b6067242..142d2e9e 100644
--- a/ui/msg_popup.cpp
+++ b/ui/msg_popup.cpp
@@ -66,6 +66,8 @@ ErrorDlg::ErrorDlg(wxWindow* parent, const int activeButtons, const wxString& me
m_buttonIgnore->SetFocus();
else if (activeButtons & ReturnErrorDlg::BUTTON_ABORT)
m_buttonAbort->SetFocus();
+
+ Fit(); //child-element widths have changed: image was set
}
@@ -148,6 +150,8 @@ WarningDlg::WarningDlg(wxWindow* parent, int activeButtons, const wxString& mes
m_buttonIgnore->SetFocus();
else if (activeButtons & ReturnWarningDlg::BUTTON_ABORT)
m_buttonAbort->SetFocus();
+
+ Fit(); //child-element widths have changed: image was set
}
@@ -237,6 +241,8 @@ QuestionDlg::QuestionDlg(wxWindow* parent, int activeButtons, const wxString& me
m_buttonCancel->SetFocus();
else if (activeButtons & ReturnQuestionDlg::BUTTON_NO)
m_buttonNo->SetFocus();
+
+ Fit(); //child-element widths have changed: image was set
}
void QuestionDlg::OnYes(wxCommandEvent& event)
diff --git a/ui/progress_indicator.cpp b/ui/progress_indicator.cpp
index fba2c801..ff2df809 100644
--- a/ui/progress_indicator.cpp
+++ b/ui/progress_indicator.cpp
@@ -140,7 +140,7 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow()
//wxWindowUpdateLocker dummy(this) -> not needed
- const wxString& scannedObjects = toStringSep(syncStat_->getObjectsCurrent(ProcessCallback::PHASE_SCANNING));
+ const wxString& scannedObjects = toGuiString(syncStat_->getObjectsCurrent(ProcessCallback::PHASE_SCANNING));
auto setTitle = [&](const wxString& title)
{
@@ -186,7 +186,7 @@ void CompareStatus::CompareStatusImpl::updateStatusPanelNow()
m_gauge2->SetValue(numeric::round(fraction * GAUGE_FULL_RANGE));
//remaining objects and bytes for file comparison
- setText(*m_staticTextFilesRemaining, toStringSep(objectsTotal - objectsCurrent), &layoutChanged);
+ setText(*m_staticTextFilesRemaining, toGuiString(objectsTotal - objectsCurrent), &layoutChanged);
setText(*m_staticTextDataRemaining, L"(" + filesizeToShortString(dataTotal - dataCurrent) + L")", &layoutChanged);
//remaining time and speed: only visible during binary comparison
@@ -270,15 +270,15 @@ inline
wxBitmap buttonPressed(const std::string& name)
{
wxBitmap background = GlobalResources::getImage(wxT("log button pressed"));
- return layOver(GlobalResources::getImage(utf8CvrtTo<wxString>(name)), background);
+ return layOver(GlobalResources::getImage(utfCvrtTo<wxString>(name)), background);
}
inline
wxBitmap buttonReleased(const std::string& name)
{
- wxImage output = greyScale(GlobalResources::getImage(utf8CvrtTo<wxString>(name))).ConvertToImage();
- //GlobalResources::getImage(utf8CvrtTo<wxString>(name)).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally!
+ wxImage output = greyScale(GlobalResources::getImage(utfCvrtTo<wxString>(name))).ConvertToImage();
+ //GlobalResources::getImage(utfCvrtTo<wxString>(name)).ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally!
//brighten(output, 30);
zen::move(output, 0, -1); //move image right one pixel
@@ -308,6 +308,8 @@ public:
m_bpButtonWarnings->Show(warningCount != 0);
m_bpButtonInfo ->Show(infoCount != 0);
+ m_textCtrlInfo->SetMaxLength(0); //allow large entries!
+
updateLogText();
m_textCtrlInfo->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(LogControl::onKeyEvent), nullptr, this);
@@ -661,6 +663,7 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(AbortCallback& abortCb,
m_staticTextLabelItemsProc->Show(false);
bSizerItemsProc ->Show(false);
m_buttonOK ->Show(false);
+ m_panelFooter->Layout();
//register key event
Connect(wxEVT_CHAR_HOOK, wxKeyEventHandler(SyncStatusImpl::OnKeyPressed), nullptr, this);
@@ -681,6 +684,8 @@ SyncStatus::SyncStatusImpl::SyncStatusImpl(AbortCallback& abortCb,
m_comboBoxExecFinished->setHistoryRef(execFinishedHistory);
updateDialogStatus(); //null-status will be shown while waiting for dir locks (if at all)
+
+ Fit();
}
@@ -834,11 +839,10 @@ void SyncStatus::SyncStatusImpl::setExternalStatus(const wxString& status, const
if (mainDialog->GetTitle() != newCaption)
mainDialog->SetTitle(newCaption);
}
- else
- {
- if (this->GetTitle() != newCaption)
- this->SetTitle(newCaption);
- }
+
+ //always set a title: we don't wxGTK to show "nameless window" instead
+ if (this->GetTitle() != newCaption)
+ this->SetTitle(newCaption);
}
@@ -853,14 +857,14 @@ void SyncStatus::SyncStatusImpl::updateProgress(bool allowYield)
bool layoutChanged = false; //avoid screen flicker by calling layout() only if necessary
//sync status text
- setText(*m_textCtrlInfo, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts!
+ setText(*m_textCtrlStatus, replaceCpy(syncStat_->currentStatusText(), L'\n', L' ')); //no layout update for status texts!
switch (syncStat_->currentPhase()) //no matter if paused or not
{
case ProcessCallback::PHASE_NONE:
case ProcessCallback::PHASE_SCANNING:
//dialog caption, taskbar, systray tooltip
- setExternalStatus(getDialogStatusText(syncStat_, paused_, finalResult), toStringSep(syncStat_->getObjectsCurrent(ProcessCallback::PHASE_SCANNING))); //status text may be "paused"!
+ setExternalStatus(getDialogStatusText(syncStat_, paused_, finalResult), toGuiString(syncStat_->getObjectsCurrent(ProcessCallback::PHASE_SCANNING))); //status text may be "paused"!
//progress indicators
m_gauge1->Pulse();
@@ -905,7 +909,7 @@ void SyncStatus::SyncStatusImpl::updateProgress(bool allowYield)
graphDataBytesTotal->setValue(to<double>(dataTotal));
//remaining objects and data
- setText(*m_staticTextRemainingObj, toStringSep(objectsTotal - objectsCurrent), &layoutChanged);
+ setText(*m_staticTextRemainingObj, toGuiString(objectsTotal - objectsCurrent), &layoutChanged);
setText(*m_staticTextDataRemaining, L"(" + filesizeToShortString(dataTotal - dataCurrent) + L")", &layoutChanged);
//remaining time and speed
@@ -949,7 +953,7 @@ void SyncStatus::SyncStatusImpl::updateProgress(bool allowYield)
// Layout();
// bSizerItemsRem->Layout();
// bSizer171->Layout();
- bSizerProgressStat->Layout(); //
+ //bSizerProgressStat->Layout(); //
m_panelProgress->Layout(); //both needed
//m_panelBackground->Layout(); //we use a dummy panel as actual background: replaces simple "Layout()" call
//-> it seems this layout is not required, and even harmful: resets m_comboBoxExecFinished dropdown while user is selecting!
@@ -1083,7 +1087,8 @@ void SyncStatus::SyncStatusImpl::updateDialogStatus() //depends on "syncStat_, p
}
}
- m_panelBackground->Layout(); //we use a dummy panel as actual background: replaces simple "Layout()" call
+ m_panelHeader->Layout();
+ Layout();
}
@@ -1139,7 +1144,7 @@ void SyncStatus::SyncStatusImpl::processHasFinished(SyncResult resultId, const E
//show new element "items processed"
m_staticTextLabelItemsProc->Show(true);
bSizerItemsProc ->Show(true);
- m_staticTextProcessedObj ->SetLabel(toStringSep(objectsCurrent));
+ m_staticTextProcessedObj ->SetLabel(toGuiString(objectsCurrent));
m_staticTextDataProcessed->SetLabel(L"(" + filesizeToShortString(dataCurrent) + L")");
//hide remaining elements...
@@ -1180,7 +1185,8 @@ void SyncStatus::SyncStatusImpl::processHasFinished(SyncResult resultId, const E
m_animationControl1->Hide();
//hide current operation status
- bSizerCurrentOperation->Show(false);
+ m_staticlineHeader ->Hide();
+ m_textCtrlStatus ->Hide();
bSizerExecFinished->Show(false);
@@ -1218,7 +1224,8 @@ void SyncStatus::SyncStatusImpl::processHasFinished(SyncResult resultId, const E
if (log.getItemCount(TYPE_ERROR | TYPE_FATAL_ERROR) > 0)
m_listbookResult->ChangeSelection(posLog);
- m_panelBackground->Layout(); //we use a dummy panel as actual background: replaces simple "Layout()" call
+ m_panelFooter->Layout();
+ Layout();
//Raise(); -> don't! user may be watching a movie in the meantime ;)
}
diff --git a/ui/small_dlgs.cpp b/ui/small_dlgs.cpp
index c8c88de0..0dd85593 100644
--- a/ui/small_dlgs.cpp
+++ b/ui/small_dlgs.cpp
@@ -18,6 +18,7 @@
#include <zen/build_info.h>
#include <wx/wupdlock.h>
#include <wx/msgdlg.h>
+#include <wx+/no_flicker.h>
#include <wx+/mouse_move_dlg.h>
#include <wx+/rtl.h>
#include "../lib/help_provider.h"
@@ -58,11 +59,13 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
//language name
wxStaticText* staticTextLanguage = new wxStaticText(m_scrolledWindowTranslators, wxID_ANY, iter->languageName, wxDefaultPosition, wxDefaultSize, 0 );
staticTextLanguage->Wrap(-1);
+ staticTextLanguage->SetForegroundColour(*wxBLACK); //accessibility: always set both foreground AND background colors!
fgSizerTranslators->Add(staticTextLanguage, 0, wxALIGN_CENTER_VERTICAL);
//translator name
wxStaticText* staticTextTranslator = new wxStaticText(m_scrolledWindowTranslators, wxID_ANY, iter->translatorName, wxDefaultPosition, wxDefaultSize, 0 );
staticTextTranslator->Wrap(-1);
+ staticTextTranslator->SetForegroundColour(*wxBLACK); //accessibility: always set both foreground AND background colors!
fgSizerTranslators->Add(staticTextTranslator, 0, wxALIGN_CENTER_VERTICAL);
}
@@ -90,10 +93,10 @@ AboutDlg::AboutDlg(wxWindow* parent) : AboutDlgGenerated(parent)
//m_animationControl1->Play();
m_buttonOkay->SetFocus();
- Fit();
+ Fit(); //child-element widths have changed: image was set
#ifdef FFS_WIN
- new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
+ new zen::MouseMoveWindow(*this); //-> put *after* creating credit control
#endif
}
@@ -117,7 +120,7 @@ public:
private:
void OnClose ( wxCloseEvent& event) { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
void OnCancel (wxCommandEvent& event) { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
- void OnHelp (wxCommandEvent& event);
+ void OnHelp (wxCommandEvent& event) { displayHelpEntry(L"html/Exclude Items.html"); }
void OnDefault (wxCommandEvent& event);
void OnApply (wxCommandEvent& event);
void OnUpdateChoice(wxCommandEvent& event) { updateGui(); }
@@ -172,8 +175,7 @@ FilterDlg::FilterDlg(wxWindow* parent,
setFilter(filter);
- m_panel13->Hide();
- m_button10->SetFocus();
+ m_buttonOk->SetFocus();
//adapt header for global/local dialog
// if (isGlobalFilter_)
@@ -266,17 +268,6 @@ FilterConfig FilterDlg::getFilter() const
}
-void FilterDlg::OnHelp(wxCommandEvent& event)
-{
- m_bpButtonHelp->Hide();
- m_panel13->Show();
- Fit();
- Refresh();
-
- event.Skip();
-}
-
-
void FilterDlg::OnDefault(wxCommandEvent& event)
{
if (isGlobalFilter_)
@@ -359,6 +350,8 @@ DeleteDialog::DeleteDialog(wxWindow* parent,
m_checkBoxDeleteBothSides->SetValue(true);
}
+ m_textCtrlFileList->SetMaxLength(0); //allow large entries!
+
updateGui();
m_buttonOK->SetFocus();
@@ -367,6 +360,8 @@ DeleteDialog::DeleteDialog(wxWindow* parent,
void DeleteDialog::updateGui()
{
+ wxWindowUpdateLocker dummy(m_panelHeader); //avoid display distortion
+
const std::pair<wxString, int> delInfo = zen::deleteFromGridAndHDPreview(
rowsToDeleteOnLeft,
rowsToDeleteOnRight,
@@ -376,20 +371,22 @@ void DeleteDialog::updateGui()
{
header = _P("Do you really want to move the following object to the Recycle Bin?",
"Do you really want to move the following %x objects to the Recycle Bin?", delInfo.second);
- m_bitmap12->SetBitmap(GlobalResources::getImage(wxT("recycler")));
+ m_bitmap12->SetBitmap(GlobalResources::getImage(L"recycler"));
}
else
{
header = _P("Do you really want to delete the following object?",
"Do you really want to delete the following %x objects?", delInfo.second);
- m_bitmap12->SetBitmap(GlobalResources::getImage(wxT("deleteFile")));
+ m_bitmap12->SetBitmap(GlobalResources::getImage(L"deleteFile"));
}
- replace(header, L"%x", toStringSep(delInfo.second));
+ replace(header, L"%x", toGuiString(delInfo.second));
m_staticTextHeader->SetLabel(header);
const wxString& filesToDelete = delInfo.first;
- m_textCtrlMessage->SetValue(filesToDelete);
+ m_textCtrlFileList->ChangeValue(filesToDelete);
+ Fit(); //child-element widths have changed: image was set
+ m_panelHeader->Layout();
Layout();
}
@@ -435,7 +432,7 @@ class SyncPreviewDlg : public SyncPreviewDlgGenerated
public:
SyncPreviewDlg(wxWindow* parent,
const wxString& variantName,
- const zen::SyncStatistics& statistics,
+ const zen::SyncStatistics& st,
bool& dontShowAgain);
private:
void OnClose (wxCloseEvent& event) { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
@@ -448,7 +445,7 @@ private:
SyncPreviewDlg::SyncPreviewDlg(wxWindow* parent,
const wxString& variantName,
- const zen::SyncStatistics& statistics,
+ const SyncStatistics& st,
bool& dontShowAgain) :
SyncPreviewDlgGenerated(parent),
m_dontShowAgain(dontShowAgain)
@@ -457,27 +454,33 @@ SyncPreviewDlg::SyncPreviewDlg(wxWindow* parent,
new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this"
#endif
- using zen::toStringSep;
-
- m_buttonStartSync->setBitmapFront(GlobalResources::getImage(wxT("startSync")));
-
- m_bitmapCreate->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"create")));
- m_bitmapUpdate->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"update")));
- m_bitmapDelete->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"delete")));
- m_bitmapData ->SetBitmap(mirrorIfRtl(GlobalResources::getImage(L"data")));
-
+ m_buttonStartSync->setBitmapFront(GlobalResources::getImage(L"startSync"));
m_staticTextVariant->SetLabel(variantName);
- m_textCtrlData->SetValue(zen::filesizeToShortString(statistics.getDataToProcess()));
+ m_checkBoxDontShowAgain->SetValue(dontShowAgain);
- m_textCtrlCreateL->SetValue(toStringSep(statistics.getCreate<LEFT_SIDE>()));
- m_textCtrlUpdateL->SetValue(toStringSep(statistics.getUpdate<LEFT_SIDE>()));
- m_textCtrlDeleteL->SetValue(toStringSep(statistics.getDelete<LEFT_SIDE>()));
+ //update preview of item count and bytes to be transferred:
+ setText(*m_staticTextData, filesizeToShortString(st.getDataToProcess()));
+ if (st.getDataToProcess() == 0)
+ m_bitmapData->SetBitmap(greyScale(GlobalResources::getImage(L"data")));
+ else
+ m_bitmapData->SetBitmap(GlobalResources::getImage(L"data"));
- m_textCtrlCreateR->SetValue(toStringSep(statistics.getCreate<RIGHT_SIDE>()));
- m_textCtrlUpdateR->SetValue(toStringSep(statistics.getUpdate<RIGHT_SIDE>()));
- m_textCtrlDeleteR->SetValue(toStringSep(statistics.getDelete<RIGHT_SIDE>()));
+ auto setValue = [](wxStaticText& txtControl, int value, wxStaticBitmap& bmpControl, const wchar_t* bmpName)
+ {
+ setText(txtControl, toGuiString(value));
- m_checkBoxDontShowAgain->SetValue(dontShowAgain);
+ if (value == 0)
+ bmpControl.SetBitmap(greyScale(mirrorIfRtl(GlobalResources::getImage(bmpName))));
+ else
+ bmpControl.SetBitmap(mirrorIfRtl(GlobalResources::getImage(bmpName)));
+ };
+
+ setValue(*m_staticTextCreateLeft, st.getCreate<LEFT_SIDE >(), *m_bitmapCreateLeft, L"createLeftSmall");
+ setValue(*m_staticTextUpdateLeft, st.getUpdate<LEFT_SIDE >(), *m_bitmapUpdateLeft, L"updateLeftSmall");
+ setValue(*m_staticTextDeleteLeft, st.getDelete<LEFT_SIDE >(), *m_bitmapDeleteLeft, L"deleteLeftSmall");
+ setValue(*m_staticTextCreateRight, st.getCreate<RIGHT_SIDE>(), *m_bitmapCreateRight, L"createRightSmall");
+ setValue(*m_staticTextUpdateRight, st.getUpdate<RIGHT_SIDE>(), *m_bitmapUpdateRight, L"updateRightSmall");
+ setValue(*m_staticTextDeleteRight, st.getDelete<RIGHT_SIDE>(), *m_bitmapDeleteRight, L"deleteRightSmall");
m_buttonStartSync->SetFocus();
Fit();
@@ -515,17 +518,16 @@ private:
void OnOkay(wxCommandEvent& event);
void OnClose (wxCloseEvent& event) { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
void OnCancel(wxCommandEvent& event) { EndModal(ReturnSmallDlg::BUTTON_CANCEL); }
- void OnShowHelp(wxCommandEvent& event);
+ void OnShowHelp(wxCommandEvent& event) { displayHelpEntry(L"html/Comparison Settings.html"); }
- void OnTimeSize(wxCommandEvent& event) { m_radioBtnSizeDate->SetValue(true); }
- //void OnFilesize(wxCommandEvent& event) { m_radioBtnSize ->SetValue(true); }
- void OnContent (wxCommandEvent& event) { m_radioBtnContent ->SetValue(true); }
+ void OnTimeSize(wxCommandEvent& event) { m_radioBtnSizeDate->SetValue(true); updateGui(); }
+ void OnContent (wxCommandEvent& event) { m_radioBtnContent ->SetValue(true); updateGui(); }
void OnTimeSizeDouble(wxMouseEvent& event);
void OnFilesizeDouble(wxMouseEvent& event);
void OnContentDouble(wxMouseEvent& event);
- void updateView();
+ void updateGui();
CompConfig& cmpConfigOut;
@@ -550,10 +552,7 @@ CompareCfgDialog::CompareCfgDialog(wxWindow* parent,
//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(wxT("help")));
- m_bitmapByTime ->SetBitmap (GlobalResources::getImage(wxT("clock")));
- //m_bitmapBySize ->SetBitmap (GlobalResources::getImage(wxT("size")));
- m_bitmapByContent->SetBitmap (GlobalResources::getImage(wxT("cmpByContent")));
+ m_bpButtonHelp ->SetBitmapLabel(GlobalResources::getImage(L"help"));
switch (cmpConfig.compareVar)
{
@@ -569,14 +568,26 @@ CompareCfgDialog::CompareCfgDialog(wxWindow* parent,
setEnumVal(enumDescrHandleSyml, *m_choiceHandleSymlinks, cmpConfig.handleSymlinks);
- updateView();
+ updateGui();
+ Fit();
}
-void CompareCfgDialog::updateView()
+
+void CompareCfgDialog::updateGui()
{
- Fit();
+ auto setBitmap = [](wxStaticBitmap& bmpCtrl, bool active, const wxBitmap& bmp)
+ {
+ if (active)
+ bmpCtrl.SetBitmap(bmp);
+ 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"));
}
+
void CompareCfgDialog::OnOkay(wxCommandEvent& event)
{
if (m_radioBtnContent->GetValue())
@@ -606,16 +617,6 @@ void CompareCfgDialog::OnContentDouble(wxMouseEvent& event)
}
-void CompareCfgDialog::OnShowHelp(wxCommandEvent& event)
-{
-#ifdef FFS_WIN
- zen::displayHelpEntry(wxT("html\\ComparisonSettings.html"));
-#elif defined FFS_LINUX
- zen::displayHelpEntry(wxT("html/ComparisonSettings.html"));
-#endif
-}
-
-
ReturnSmallDlg::ButtonPressed zen::showCompareCfgDialog(wxWindow* parent, CompConfig& cmpConfig)
{
CompareCfgDialog syncDlg(parent, cmpConfig);
@@ -673,8 +674,8 @@ 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 directory name") + wxT("\n") +
- wxT("%dir \t") + _("- directory part only") + wxT("\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");
@@ -768,10 +769,11 @@ xmlAccess::ExternalApps GlobalSettingsDlg::getExtApp()
xmlAccess::ExternalApps output;
for (int i = 0; i < m_gridCustomCommand->GetNumberRows(); ++i)
{
- auto entry = std::make_pair(m_gridCustomCommand->GetCellValue(i, 0), //description
- m_gridCustomCommand->GetCellValue(i, 1)); //commandline
- if (!entry.first.empty() || !entry.second.empty())
- output.push_back(entry);
+ auto description = copyStringTo<std::wstring>(m_gridCustomCommand->GetCellValue(i, 0));
+ auto commandline = copyStringTo<std::wstring>(m_gridCustomCommand->GetCellValue(i, 1));
+
+ if (!description.empty() || !commandline.empty())
+ output.push_back(std::make_pair(description, commandline));
}
return output;
}
@@ -869,7 +871,7 @@ SelectTimespanDlg::SelectTimespanDlg(wxWindow* parent, Int64& timeFrom, Int64& t
LOCALE_IFIRSTDAYOFWEEK | // first day of week specifier, 0-6, 0=Monday, 6=Sunday
LOCALE_RETURN_NUMBER, //__in LCTYPE LCType,
reinterpret_cast<LPTSTR>(&firstDayOfWeek), //__out LPTSTR lpLCData,
- sizeof(firstDayOfWeek) / sizeof(TCHAR)) != 0 && //__in int cchData
+ sizeof(firstDayOfWeek) / sizeof(TCHAR)) > 0 && //__in int cchData
firstDayOfWeek == 6)
style |= wxCAL_SUNDAY_FIRST;
else //default
diff --git a/ui/sync_cfg.cpp b/ui/sync_cfg.cpp
index 87e1b44d..b88d40f0 100644
--- a/ui/sync_cfg.cpp
+++ b/ui/sync_cfg.cpp
@@ -214,7 +214,7 @@ SyncCfgDialog::SyncCfgDialog(wxWindow* parent,
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 subdirectory"));
+ 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")).
@@ -317,19 +317,27 @@ void SyncCfgDialog::updateGui()
}
//set radiobuttons -> 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)
{
case DirectionConfig::AUTOMATIC:
m_radioBtnAutomatic->SetValue(true); //automatic mode
+ m_staticTextAutomatic->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
break;
case DirectionConfig::MIRROR:
m_radioBtnMirror->SetValue(true); //one way ->
+ m_staticTextMirror->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
break;
case DirectionConfig::UPDATE:
m_radioBtnUpdate->SetValue(true); //Update ->
+ m_staticTextUpdate->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
break;
case DirectionConfig::CUSTOM:
m_radioBtnCustom->SetValue(true); //custom
+ m_staticTextCustom->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
break;
}
diff --git a/ui/tray_icon.cpp b/ui/tray_icon.cpp
index 2fc76f15..cd61ae29 100644
--- a/ui/tray_icon.cpp
+++ b/ui/tray_icon.cpp
@@ -171,7 +171,7 @@ private:
return nullptr;
wxMenu* contextMenu = new wxMenu;
- contextMenu->Append(CONTEXT_ABOUT, _("&About..."));
+ contextMenu->Append(CONTEXT_ABOUT, _("&About"));
contextMenu->AppendSeparator();
contextMenu->Append(CONTEXT_RESTORE, _("&Restore"));
//event handling
diff --git a/ui/tree_view.cpp b/ui/tree_view.cpp
index b3a9595a..ea73d979 100644
--- a/ui/tree_view.cpp
+++ b/ui/tree_view.cpp
@@ -9,6 +9,7 @@
#include <wx/settings.h>
#include <wx/menu.h>
#include <zen/i18n.h>
+#include <zen/utf.h>
#include <zen/stl_tools.h>
#include <wx+/format_unit.h>
#include <wx+/rtl.h>
@@ -336,7 +337,7 @@ void TreeView::updateView(Predicate pred)
if (root.firstFile || !root.subDirs.empty())
{
root.baseMap = baseObj;
- compressNode(root);
+ this->compressNode(root); //"this->" required by two-pass lookup as enforced by GCC 4.7
}
else
newView.pop_back();
@@ -656,18 +657,18 @@ private:
case COL_TYPE_NAVI_DIRECTORY:
if (const TreeView::RootNode* root = dynamic_cast<const TreeView::RootNode*>(node.get()))
{
- const wxString dirLeft = utf8CvrtTo<wxString>(beforeLast(root->baseMap_.getBaseDirPf<LEFT_SIDE >(), FILE_NAME_SEPARATOR));
- const wxString dirRight = utf8CvrtTo<wxString>(beforeLast(root->baseMap_.getBaseDirPf<RIGHT_SIDE>(), FILE_NAME_SEPARATOR));
+ const wxString dirLeft = utfCvrtTo<wxString>(beforeLast(root->baseMap_.getBaseDirPf<LEFT_SIDE >(), FILE_NAME_SEPARATOR));
+ const wxString dirRight = utfCvrtTo<wxString>(beforeLast(root->baseMap_.getBaseDirPf<RIGHT_SIDE>(), FILE_NAME_SEPARATOR));
if (dirLeft.empty())
return dirRight;
else if (dirRight.empty())
return dirLeft;
else
- return utf8CvrtTo<wxString>(dirLeft + L" \x2212 " + dirRight); //\x2212 = unicode minus
+ return utfCvrtTo<wxString>(dirLeft + L" \x2212 " + dirRight); //\x2212 = unicode minus
}
else if (const TreeView::DirNode* dir = dynamic_cast<const TreeView::DirNode*>(node.get()))
- return utf8CvrtTo<wxString>(dir->dirObj_.getObjShortName());
+ return utfCvrtTo<wxString>(dir->dirObj_.getObjShortName());
else if (dynamic_cast<const TreeView::FilesNode*>(node.get()))
return _("Files");
break;
@@ -801,6 +802,8 @@ private:
dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.DrawRectangle(areaPerc);
}
+
+ wxDCTextColourChanger dummy3(dc, *wxBLACK); //accessibility: always set both foreground AND background colors!
dc.DrawLabel(numberTo<wxString>(node->percent_) + L"%", areaPerc, wxALIGN_CENTER);
rectTmp.x += widthPercentBar + 2 * CELL_BORDER;
@@ -816,7 +819,8 @@ private:
wxRect rectStat(rectTmp.GetTopLeft(), wxSize(bmp.GetWidth(), bmp.GetHeight()));
rectStat.y += (rectTmp.height - rectStat.height) / 2;
- clearArea(dc, rectStat, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+ //clearArea(dc, rectStat, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+ clearArea(dc, rectStat, *wxWHITE); //accessibility: always set both foreground AND background colors!
drawBitmapRtlMirror(dc, bmp, rectStat, wxALIGN_CENTER, buffer);
};
diff --git a/version/version.h b/version/version.h
index 4bb5c71a..92e4e347 100644
--- a/version/version.h
+++ b/version/version.h
@@ -3,7 +3,7 @@
namespace zen
{
-const wchar_t currentVersion[] = L"5.3"; //internal linkage!
+const wchar_t currentVersion[] = L"5.4"; //internal linkage!
}
#endif
diff --git a/version/version.rc b/version/version.rc
index a440442d..c12673f9 100644
--- a/version/version.rc
+++ b/version/version.rc
@@ -1,2 +1,2 @@
-#define VER_FREEFILESYNC 5,3,0,0
-#define VER_FREEFILESYNC_STR "5.3\0"
+#define VER_FREEFILESYNC 5,4,0,0
+#define VER_FREEFILESYNC_STR "5.4\0"
diff --git a/wx+/app_main.h b/wx+/app_main.h
index e39a8b43..0177fbf3 100644
--- a/wx+/app_main.h
+++ b/wx+/app_main.h
@@ -36,13 +36,6 @@ bool& refMainWndStatus()
}
inline
-bool& refQueryEnd()
-{
- static bool status = false; //external linkage!
- return status;
-}
-
-inline
void setMainWindow(wxWindow* window)
{
wxTheApp->SetTopWindow(window);
diff --git a/wx+/context_menu.h b/wx+/context_menu.h
index 663596f9..9f2f844b 100644
--- a/wx+/context_menu.h
+++ b/wx+/context_menu.h
@@ -59,19 +59,22 @@ public:
void addSubmenu(const wxString& label, ContextMenu& submenu, const wxBitmap* bmp = nullptr) //invalidates submenu!
{
- wxMenuItem* newItem = new wxMenuItem(menu.get(), wxID_ANY, label, L"", wxITEM_NORMAL, submenu.menu.release()); //menu owns item!
- if (bmp) newItem->SetBitmap(*bmp); //do not set AFTER appending item! wxWidgets screws up for yet another crappy reason
- menu->Append(newItem);
//transfer submenu commands:
commandList.insert(submenu.commandList.begin(), submenu.commandList.end());
submenu.commandList.clear();
+
+ submenu.menu->SetNextHandler(menu.get()); //on wxGTK submenu events are not propagated to their parent menu by default!
+
+ wxMenuItem* newItem = new wxMenuItem(menu.get(), wxID_ANY, label, L"", wxITEM_NORMAL, submenu.menu.release()); //menu owns item, item owns submenu!
+ if (bmp) newItem->SetBitmap(*bmp); //do not set AFTER appending item! wxWidgets screws up for yet another crappy reason
+ menu->Append(newItem);
}
void popup(wxWindow& wnd) //show popup menu + process lambdas
{
//eventually all events from submenu items will be received by this menu
for (auto iter = commandList.begin(); iter != commandList.end(); ++iter)
- menu->Connect(iter->first, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(ContextMenu::onSelection), new GenericCommand(iter->second), /*pass ownership*/ this);
+ menu->Connect(iter->first, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(ContextMenu::onSelection), new GenericCommand(iter->second) /*pass ownership*/, this);
wnd.PopupMenu(menu.get());
wxTheApp->ProcessPendingEvents(); //make sure lambdas are evaluated before going out of scope;
diff --git a/wx+/format_unit.cpp b/wx+/format_unit.cpp
index f6d2e5c2..9d805f41 100644
--- a/wx+/format_unit.cpp
+++ b/wx+/format_unit.cpp
@@ -15,22 +15,18 @@
#ifdef FFS_WIN
#include <zen/win.h> //includes "windows.h"
#include <zen/win_ver.h>
-#endif
+#elif defined FFS_LINUX
+#include <clocale> //thousands separator
+#include <zen/utf.h> //
+#endif
-namespace
-{
-inline
-size_t getDigitCount(size_t number)
-{
- return number == 0 ? 1 : static_cast<size_t>(std::log10(static_cast<double>(number))) + 1;
-} //count number of digits
-}
+using namespace zen;
std::wstring zen::filesizeToShortString(Int64 size)
{
- //if (to<Int64>(size) < 0) return _("Error"); -> really? there's one exceptional case: a failed rename operation falls-back to copy + delete, reducing "bytes transferred" to potentially < 0!
+ //if (size < 0) return _("Error"); -> really? there's at least one exceptional case: a failed rename operation falls-back to copy + delete, reducing "bytes transferred" to potentially < 0!
if (numeric::abs(size) <= 999)
return replaceCpy(_P("1 Byte", "%x Bytes", to<int>(size)),
@@ -63,15 +59,14 @@ std::wstring zen::filesizeToShortString(Int64 size)
}
}
//print just three significant digits: 0,01 | 0,11 | 1,11 | 11,1 | 111
- const size_t leadDigitCount = getDigitCount(static_cast<size_t>(numeric::abs(filesize))); //number of digits before decimal point
- if (leadDigitCount == 0 || leadDigitCount > 3)
- return _("Error");
+ const size_t fullunits = static_cast<size_t>(numeric::abs(filesize));
+ const int precisionDigits = fullunits < 10 ? 2 : fullunits < 100 ? 1 : 0; //sprintf requires "int"
wchar_t buffer[50];
#ifdef __MINGW32__
- int charsWritten = ::snwprintf(buffer, 50, L"%.*f", static_cast<int>(3 - leadDigitCount), filesize); //MinGW does not comply to the C standard here
+ int charsWritten = ::snwprintf(buffer, 50, L"%.*f", precisionDigits, filesize); //MinGW does not comply to the C standard here
#else
- int charsWritten = std::swprintf(buffer, 50, L"%.*f", static_cast<int>(3 - leadDigitCount), filesize);
+ int charsWritten = std::swprintf(buffer, 50, L"%.*f", precisionDigits, filesize);
#endif
return charsWritten > 0 ? replaceCpy(output, L"%x", std::wstring(buffer, charsWritten)) : _("Error");
}
@@ -142,8 +137,114 @@ std::wstring zen::fractionToShortString(double fraction)
}
+#ifdef FFS_WIN
+namespace
+{
+bool getUserSetting(LCTYPE lt, UINT& setting)
+{
+ return ::GetLocaleInfo(LOCALE_USER_DEFAULT, //__in LCID Locale,
+ lt | LOCALE_RETURN_NUMBER, //__in LCTYPE LCType,
+ reinterpret_cast<LPTSTR>(&setting), //__out LPTSTR lpLCData,
+ sizeof(setting) / sizeof(TCHAR)) > 0; //__in int cchData
+}
+
+
+bool getUserSetting(LCTYPE lt, std::wstring& setting)
+{
+ int bufferSize = ::GetLocaleInfo(LOCALE_USER_DEFAULT, lt, nullptr, 0);
+ if (bufferSize > 0)
+ {
+ std::vector<wchar_t> buffer(bufferSize);
+ if (::GetLocaleInfo(LOCALE_USER_DEFAULT, //__in LCID Locale,
+ lt, //__in LCTYPE LCType,
+ &buffer[0], //__out LPTSTR lpLCData,
+ bufferSize) > 0) //__in int cchData
+ {
+ setting = &buffer[0]; //GetLocaleInfo() returns char count *including* 0-termination!
+ return true;
+ }
+ }
+ return false;
+}
+
+class IntegerFormat
+{
+public:
+ static const NUMBERFMT& get() { return getInst().fmt; }
+ static bool isValid() { return getInst().valid_; }
+
+private:
+ static const IntegerFormat& getInst()
+ {
+ static IntegerFormat inst; //not threadsafe in MSVC until C++11, but not required right now
+ return inst;
+ }
+
+ IntegerFormat() : fmt(), valid_(false)
+ {
+ //all we want is default NUMBERFMT, but set NumDigits to 0. what a disgrace:
+ fmt.NumDigits = 0;
+
+ std::wstring grouping;
+ if (getUserSetting(LOCALE_ILZERO, fmt.LeadingZero) &&
+ getUserSetting(LOCALE_SGROUPING, grouping) &&
+ getUserSetting(LOCALE_SDECIMAL, decimalSep) &&
+ getUserSetting(LOCALE_STHOUSAND, thousandSep) &&
+ getUserSetting(LOCALE_INEGNUMBER, fmt.NegativeOrder))
+ {
+ fmt.lpDecimalSep = &decimalSep[0]; //not used
+ fmt.lpThousandSep = &thousandSep[0];
+
+ //convert LOCALE_SGROUPING to Grouping: http://blogs.msdn.com/b/oldnewthing/archive/2006/04/18/578251.aspx
+ replace(grouping, L';', L"");
+ if (endsWith(grouping, L'0'))
+ grouping.resize(grouping.size() - 1);
+ else
+ grouping += L'0';
+ fmt.Grouping = stringTo<UINT>(grouping);
+ valid_ = true;
+ }
+ }
+
+ NUMBERFMT fmt;
+ std::wstring thousandSep;
+ std::wstring decimalSep;
+ bool valid_;
+};
+}
+#endif
+
+
std::wstring zen::ffs_Impl::includeNumberSeparator(const std::wstring& number)
{
+#ifdef FFS_WIN
+ if (IntegerFormat::isValid())
+ {
+ int bufferSize = ::GetNumberFormat(LOCALE_USER_DEFAULT, 0, number.c_str(), &IntegerFormat::get(), nullptr, 0);
+ if (bufferSize > 0)
+ {
+ std::vector<wchar_t> buffer(bufferSize);
+ if (::GetNumberFormat(LOCALE_USER_DEFAULT, //__in LCID Locale,
+ 0, //__in DWORD dwFlags,
+ number.c_str(), //__in LPCTSTR lpValue,
+ &IntegerFormat::get(), //__in_opt const NUMBERFMT *lpFormat,
+ &buffer[0], //__out_opt LPTSTR lpNumberStr,
+ bufferSize) > 0) //__in int cchNumber
+ return &buffer[0]; //GetNumberFormat() returns char count *including* 0-termination!
+ }
+ }
+ return number;
+
+#else
+ //we have to include thousands separator ourselves; this doesn't work for all countries (e.g india), but is better than nothing
+
+ //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale
+ const lconv* localInfo = ::localeconv(); //always bound according to doc
+ const std::wstring& thousandSep = utfCvrtTo<std::wstring>(localInfo->thousands_sep);
+ // why not working?
+ // THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep();
+ // DECIMAL_POINT = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).decimal_point();
+
std::wstring output(number);
size_t i = output.size();
for (;;)
@@ -153,9 +254,10 @@ std::wstring zen::ffs_Impl::includeNumberSeparator(const std::wstring& number)
i -= 3;
if (!isDigit(output[i - 1]))
break;
- output.insert(i, zen::getThousandsSeparator());
+ output.insert(i, thousandSep);
}
return output;
+#endif
}
/*
diff --git a/wx+/format_unit.h b/wx+/format_unit.h
index 71501db7..361e7d86 100644
--- a/wx+/format_unit.h
+++ b/wx+/format_unit.h
@@ -18,7 +18,7 @@ std::wstring remainingTimeToShortString(double timeInSec);
std::wstring fractionToShortString(double fraction); //within [0, 1]
template <class NumberType>
-std::wstring toStringSep(NumberType number); //convert number to std::wstring including thousands separator
+std::wstring toGuiString(NumberType number); //format integer number including thousands separator
std::wstring utcToLocalTimeString(Int64 utcTime); //throw std::runtime_error
@@ -42,12 +42,6 @@ std::wstring utcToLocalTimeString(Int64 utcTime); //throw std::runtime_error
-
-
-
-
-
-
//--------------- inline impelementation -------------------------------------------
namespace ffs_Impl
{
@@ -55,8 +49,9 @@ std::wstring includeNumberSeparator(const std::wstring& number);
}
template <class NumberType> inline
-std::wstring toStringSep(NumberType number)
+std::wstring toGuiString(NumberType number)
{
+ //assert_static(IsInteger<NumberType>::value); -> doesn't work for UInt64
return ffs_Impl::includeNumberSeparator(zen::numberTo<std::wstring>(number));
}
}
diff --git a/wx+/graph.cpp b/wx+/graph.cpp
index 9a64b3dd..fd68b548 100644
--- a/wx+/graph.cpp
+++ b/wx+/graph.cpp
@@ -96,7 +96,7 @@ void drawYLabel(wxDC& dc, double& yMin, double& yMax, const wxRect& clientArea,
if (clientArea.GetHeight() <= 0 || clientArea.GetWidth() <= 0)
return;
- int optimalBlockHeight = 3 * dc.GetMultiLineTextExtent(wxT("1")).GetHeight();;
+ int optimalBlockHeight = 3 * dc.GetMultiLineTextExtent(L"1").GetHeight();;
double valRangePerBlock = (yMax - yMin) * optimalBlockHeight / clientArea.GetHeight();
valRangePerBlock = labelFmt.getOptimalBlockSize(valRangePerBlock);
@@ -114,7 +114,8 @@ void drawYLabel(wxDC& dc, double& yMin, double& yMax, const wxRect& clientArea,
//draw labels
{
wxDCPenChanger dummy(dc, wxPen(wxColor(192, 192, 192))); //light grey
- dc.SetFont(wxFont(wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Arial") ));
+ wxDCTextColourChanger dummy2(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); //use user setting for labels
+ dc.SetFont(wxFont(wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, L"Arial"));
const int posLabel = drawLeft ? 0 : clientArea.GetWidth() - labelWidth;
const int posDataArea = drawLeft ? labelWidth : 0;
@@ -147,7 +148,7 @@ void drawXLabel(wxDC& dc, double& xMin, double& xMax, const wxRect& clientArea,
if (clientArea.GetHeight() <= 0 || clientArea.GetWidth() <= 0)
return;
- const int optimalBlockWidth = dc.GetMultiLineTextExtent(wxT("100000000000000")).GetWidth();
+ const int optimalBlockWidth = dc.GetMultiLineTextExtent(L"100000000000000").GetWidth();
double valRangePerBlock = (xMax - xMin) * optimalBlockWidth / clientArea.GetWidth();
valRangePerBlock = labelFmt.getOptimalBlockSize(valRangePerBlock);
@@ -166,7 +167,8 @@ void drawXLabel(wxDC& dc, double& xMin, double& xMax, const wxRect& clientArea,
//draw labels
{
wxDCPenChanger dummy(dc, wxPen(wxColor(192, 192, 192))); //light grey
- dc.SetFont(wxFont(wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxT("Arial") ));
+ wxDCTextColourChanger dummy2(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); //use user setting for labels
+ dc.SetFont(wxFont(wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, L"Arial"));
const int posLabel = drawBottom ? clientArea.GetHeight() - labelHeight : 0;
const int posDataArea = drawBottom ? 0 : labelHeight;
@@ -290,7 +292,8 @@ void Graph2D::OnMouseLeftUp(wxMouseEvent& event)
{
//fire off GraphSelectEvent
GraphSelectEvent evt(activeSel->refSelection());
- GetEventHandler()->AddPendingEvent(evt);
+ if (wxEvtHandler* evtHandler = GetEventHandler())
+ evtHandler->AddPendingEvent(evt);
oldSel.push_back(activeSel->refSelection());
}
@@ -342,10 +345,12 @@ private:
void Graph2D::render(wxDC& dc) const
{
{
- //draw everything including label background in natural window color by default (overwriting current background color)
- const wxColor backColor = wxPanel::GetClassDefaultAttributes().colBg != wxNullColour ?
- wxPanel::GetClassDefaultAttributes().colBg :
- wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
+ //clear everything, set label background color
+ // const wxColor backColor = wxPanel::GetClassDefaultAttributes().colBg != wxNullColour ?
+ // wxPanel::GetClassDefaultAttributes().colBg :
+ // wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE);
+ const wxColor backColor = GetBackgroundColour(); //user-configurable!
+
//wxDCBrushChanger dummy(dc, *wxTRANSPARENT_BRUSH); //sigh, who *invents* this stuff??? -> workaround for issue with wxBufferedPaintDC
DcBackgroundChanger dummy(dc, backColor);
dc.Clear();
@@ -395,8 +400,8 @@ void Graph2D::render(wxDC& dc) const
}
{
- //paint actual graph background (without labels) using window background color
- DcBackgroundChanger dummy(dc, GetBackgroundColour());
+ //paint actual graph background (without labels)
+ DcBackgroundChanger dummy(dc, *wxWHITE); //accessibility: we have to set both back- and foreground colors or none at all!
wxDCPenChanger dummy2(dc, wxColour(130, 135, 144)); //medium grey, the same Win7 uses for other frame borders
//dc.DrawRectangle(static_cast<const wxRect&>(dataArea).Inflate(1, 1)); //correct wxWidgets design mistakes
dc.DrawRectangle(dataArea);
@@ -507,10 +512,7 @@ void Graph2D::render(wxDC& dc) const
//wxDCBrushChanger dummy(dc, *wxTRANSPARENT_BRUSH);
wxDCBrushChanger dummy(dc, colSelect); //alpha channel (not yet) supported on wxMSW, so draw selection before graphs
- wxPen selPen(colSelect);
- //wxPen selPen(*wxBLACK);
- //selPen.SetStyle(wxSHORT_DASH);
- wxDCPenChanger dummy2(dc, selPen);
+ wxDCPenChanger dummy2(dc, colSelect);
for (auto i = allSelections.begin(); i != allSelections.end(); ++i)
{
diff --git a/wx+/grid.cpp b/wx+/grid.cpp
index 89891879..e1208109 100644
--- a/wx+/grid.cpp
+++ b/wx+/grid.cpp
@@ -16,15 +16,16 @@
#include <zen/tick_count.h>
#include <zen/string_tools.h>
#include <zen/scope_guard.h>
+#include <zen/utf.h>
#include "format_unit.h"
#ifdef FFS_LINUX
#include <gtk/gtk.h>
#endif
-
using namespace zen;
+
wxColor zen::getColorSelectionGradientFrom() { return wxColor(137, 172, 255); } //blue: H:158 S:255 V:196
wxColor zen::getColorSelectionGradientTo () { return wxColor(225, 234, 255); } // H:158 S:255 V:240
@@ -210,12 +211,55 @@ void GridData::drawCellBackground(wxDC& dc, const wxRect& rect, bool enabled, bo
}
-void GridData::drawCellText(wxDC& dc, const wxRect& rect, const wxString& text, bool enabled, int alignment)
+namespace
{
- wxDCTextColourChanger dummy(dc, enabled ? dc.GetTextForeground() : wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
+#ifdef _MSC_VER
+#pragma warning(disable:4428) // VC wrongly issues warning C4428: universal-character-name encountered in source
+#endif
+const wchar_t ELLIPSIS = L'\u2026'; //...
+
+template <class Function> inline
+wxString getTruncatedText(const wxString& text, Function textFits)
+{
+ if (textFits(text))
+ return text;
+
+ //unlike Windows 7 Explorer, we truncate UTF-16 correctly: e.g. CJK-Ideogramm encodes to TWO wchar_t: utfCvrtTo<wxString>("\xf0\xa4\xbd\x9c");
+ size_t low = 0; //number of unicode chars!
+ size_t high = unicodeLength(text); //
+
+ for (;;)
+ {
+ const size_t middle = (low + high) / 2;
+ wxString candidate(strBegin(text), findUnicodePos(text, middle));
+ candidate += ELLIPSIS;
+
+ if (high - low <= 1)
+ return candidate;
+
+ if (textFits(candidate))
+ low = middle;
+ else
+ high = middle;
+ }
+}
+
+void drawTextLabelFitting(wxDC& dc, const wxString& text, const wxRect& rect, int alignment)
+{
DcClipper clip(dc, rect); //wxDC::DrawLabel doesn't care about width, WTF?
- dc.DrawLabel(text, rect, alignment);
+
+ //truncate large texts and add ellipsis
+ auto textFits = [&](const wxString& phrase) { return dc.GetTextExtent(phrase).GetWidth() <= rect.GetWidth(); };
+ dc.DrawLabel(getTruncatedText(text, textFits), rect, alignment);
+}
+}
+
+
+void GridData::drawCellText(wxDC& dc, const wxRect& rect, const wxString& text, bool enabled, int alignment)
+{
+ wxDCTextColourChanger dummy(dc, enabled ? dc.GetTextForeground() : wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT));
+ drawTextLabelFitting(dc, text, rect, alignment);
}
@@ -260,8 +304,8 @@ void GridData::drawColumnLabelBackground(wxDC& dc, const wxRect& rect, bool high
void GridData::drawColumnLabelText(wxDC& dc, const wxRect& rect, const wxString& text)
{
- DcClipper clip(dc, rect); //wxDC::DrawLabel doesn't care about witdh, WTF?
- dc.DrawLabel(text, rect, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
+ wxDCTextColourChanger dummy(dc, *wxBLACK); //accessibility: always set both foreground AND background colors!
+ drawTextLabelFitting(dc, text, rect, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
}
//----------------------------------------------------------------------------------------------------------------
@@ -481,7 +525,7 @@ public:
}
private:
- static wxString formatRow(size_t row) { return toStringSep(row + 1); } //convert number to std::wstring including thousands separator
+ static wxString formatRow(size_t row) { return toGuiString(row + 1); } //convert number to std::wstring including thousands separator
virtual bool AcceptsFocus() const { return false; }
@@ -495,7 +539,8 @@ private:
wxFont labelFont = GetFont();
labelFont.SetWeight(wxFONTWEIGHT_BOLD);
dc.SetFont(labelFont);
- dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
+
+ wxDCTextColourChanger dummy(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); //use user setting for labels
auto rowRange = getRowsOnClient(rect); //returns range [begin, end)
for (auto row = rowRange.first; row < rowRange.second; ++row)
@@ -513,6 +558,7 @@ private:
{
//clearArea(dc, rect, getColorRowLabel());
dc.GradientFillLinear(rect, COLOR_LABEL_GRADIENT_FROM, COLOR_LABEL_GRADIENT_TO, wxWEST); //clear overlapping cells
+ wxDCTextColourChanger dummy3(dc, *wxBLACK); //accessibility: always set both foreground AND background colors!
//label text
wxRect textRect = rect;
@@ -621,7 +667,8 @@ private:
wxFont labelFont = GetFont();
labelFont.SetWeight(wxFONTWEIGHT_BOLD);
dc.SetFont(labelFont);
- dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
+
+ wxDCTextColourChanger dummy(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); //use user setting for labels
const int colLabelHeight = refParent().colLabelHeight;
@@ -847,6 +894,10 @@ private:
};
//----------------------------------------------------------------------------------------------------------------
+namespace
+{
+const wxEventType EVENT_GRID_HAS_SCROLLED = wxNewEventType(); //internal to Grid::MainWin::ScrollWindow()
+}
//----------------------------------------------------------------------------------------------------------------
class Grid::MainWin : public SubWindow
@@ -857,7 +908,10 @@ public:
ColLabelWin& colLabelWin) : SubWindow(parent),
rowLabelWin_(rowLabelWin),
colLabelWin_(colLabelWin),
- selectionAnchor(0) {}
+ selectionAnchor(0)
+ {
+ Connect(EVENT_GRID_HAS_SCROLLED, wxCommandEventHandler(MainWin::updateAfterScroll), nullptr, this);
+ }
void makeRowVisible(size_t row)
{
@@ -915,7 +969,8 @@ private:
clearArea(dc, rect, wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
dc.SetFont(GetFont());
- dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
+
+ wxDCTextColourChanger dummy(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); //use user setting for labels
const int rowHeight = rowLabelWin_.getRowHeight();
@@ -938,7 +993,7 @@ private:
{
//draw background lines
{
- DcClipper dummy(dc, rect); //solve issues with drawBackground() painting in area outside of rect (which is not also refreshed by renderCell()) -> keep small scope!
+ DcClipper dummy2(dc, rect); //solve issues with drawBackground() painting in area outside of rect (which is not also refreshed by renderCell()) -> keep small scope!
for (int row = rowFirst; row < rowLast; ++row)
drawBackground(*prov, dc, wxRect(cellAreaTL + wxPoint(0, row * rowHeight), wxSize(compWidth, rowHeight)), row, compPos);
}
@@ -992,8 +1047,12 @@ private:
{
const wxPoint absPos = refParent().CalcUnscrolledPosition(event.GetPosition());
const auto row = rowLabelWin_.getRowAtPos(absPos.y); //return -1 if no row at this position
- if (const auto colInfo = refParent().getColumnAtPos(absPos.x)) //returns (column type, compPos)
- sendEventNow(GridClickEvent(EVENT_GRID_MOUSE_LEFT_DOUBLE, event, row, colInfo->first, colInfo->second));
+ const auto colInfo = refParent().getColumnAtPos(absPos.x); //returns (column type, compPos)
+
+ const ColumnType colType = colInfo ? colInfo->first : DUMMY_COLUMN_TYPE;
+ const ptrdiff_t compPos = colInfo ? colInfo->second : -1;
+ //client is interested in all double-clicks, even those outside of the grid!
+ sendEventNow(GridClickEvent(EVENT_GRID_MOUSE_LEFT_DOUBLE, event, row, colType, compPos));
event.Skip();
}
@@ -1070,7 +1129,7 @@ private:
const auto colInfo = refParent().getColumnAtPos(absPos.x); //returns optional pair (column type, compPos)
const ColumnType colType = colInfo ? colInfo->first : DUMMY_COLUMN_TYPE; //we probably should notify even if colInfo is invalid!
- const size_t compPos = colInfo ? colInfo->second : 0;
+ const ptrdiff_t compPos = colInfo ? colInfo->second : -1;
//notify event
sendEventNow(GridClickEvent(event.RightUp() ? EVENT_GRID_MOUSE_RIGHT_UP : EVENT_GRID_MOUSE_LEFT_UP, event, row, colType, compPos));
@@ -1361,7 +1420,18 @@ private:
rowLabelWin_.ScrollWindow(0, dy, rect);
colLabelWin_.ScrollWindow(dx, 0, rect);
- refParent().updateWindowSizes(false); //row label width has changed -> do *not* update scrollbars: recursion on wxGTK!
+ //attention, wxGTK call sequence: wxScrolledWindow::Scroll() -> wxScrolledHelperNative::Scroll() -> wxScrolledHelperNative::DoScroll()
+ //which *first* calls us, MainWin::ScrollWindow(), and *then* internally updates m_yScrollPosition
+ //=> we cannot use CalcUnscrolledPosition() here which gives the wrong/outdated value!!!
+ //=> we need to update asynchronously:
+ wxCommandEvent scrollEvent(EVENT_GRID_HAS_SCROLLED);
+ if (wxEvtHandler* evtHandler = GetEventHandler())
+ evtHandler->AddPendingEvent(scrollEvent);
+ }
+
+ void updateAfterScroll(wxCommandEvent&)
+ {
+ refParent().updateWindowSizes(false); //row label width has changed -> do *not* update scrollbars: recursion on wxGTK! -> still a problem, now that we're called async??
rowLabelWin_.Update(); //update while dragging scroll thumb
}
diff --git a/wx+/image_tools.h b/wx+/image_tools.h
index 82fd88cc..8a2a43ed 100644
--- a/wx+/image_tools.h
+++ b/wx+/image_tools.h
@@ -53,9 +53,9 @@ void move(wxImage& img, int up, int left)
inline
wxBitmap greyScale(const wxBitmap& bmp)
{
- wxImage output = bmp.ConvertToImage().ConvertToGreyscale(1.0/3, 1.0/3, 1.0/3); //treat all channels equally!
+ wxImage output = bmp.ConvertToImage().ConvertToGreyscale(1.0 / 3, 1.0 / 3, 1.0 / 3); //treat all channels equally!
//wxImage output = bmp.ConvertToImage().ConvertToGreyscale();
- adjustBrightness(output, 170);
+ adjustBrightness(output, 160);
return output;
}
diff --git a/wx+/shell_execute.h b/wx+/shell_execute.h
index 9de30980..953efc43 100644
--- a/wx+/shell_execute.h
+++ b/wx+/shell_execute.h
@@ -71,7 +71,7 @@ void shellExecute(const wxString& command, ExecutionType type = EXEC_TYPE_ASYNC)
if (!::ShellExecuteEx(&execInfo)) //__inout LPSHELLEXECUTEINFO lpExecInfo
{
wxString cmdFmt = L"File: " + filename + L"\nArg: " + arguments;
- wxMessageBox(replaceCpy(_("Invalid command line: %x"), L"%x", L"\n" + cmdFmt) + L"\n\n" + getLastErrorFormatted());
+ wxMessageBox(_("Invalid command line:") + L"\n" + cmdFmt + L"\n\n" + getLastErrorFormatted());
return;
}
@@ -86,10 +86,10 @@ void shellExecute(const wxString& command, ExecutionType type = EXEC_TYPE_ASYNC)
if (type == EXEC_TYPE_SYNC)
{
//Posix::system - execute a shell command
- int rv = ::system(utf8CvrtTo<std::string>(command).c_str()); //do NOT use std::system as its documentation says nothing about "WEXITSTATUS(rv)", ect...
+ int rv = ::system(utfCvrtTo<std::string>(command).c_str()); //do NOT use std::system as its documentation says nothing about "WEXITSTATUS(rv)", ect...
if (rv == -1 || WEXITSTATUS(rv) == 127) //http://linux.die.net/man/3/system "In case /bin/sh could not be executed, the exit status will be that of a command that does exit(127)"
{
- wxMessageBox(replaceCpy(_("Invalid command line: %x"), L"%x", L"\n" + command));
+ wxMessageBox(_("Invalid command line:") + L"\n" + command);
return;
}
}
diff --git a/wx+/string_conv.h b/wx+/string_conv.h
index b23f6947..ba6f8d48 100644
--- a/wx+/string_conv.h
+++ b/wx+/string_conv.h
@@ -7,15 +7,15 @@
#ifndef STRINGCONV_H_INCLUDED
#define STRINGCONV_H_INCLUDED
-#include <zen/utf8.h>
+#include <zen/utf.h>
#include <wx/string.h>
#include <zen/zstring.h>
namespace zen
{
//conversion between Zstring and wxString
-inline wxString toWx(const Zstring& str) { return utf8CvrtTo<wxString>(str); }
-inline Zstring toZ(const wxString& str) { return utf8CvrtTo<Zstring>(str); }
+inline wxString toWx(const Zstring& str) { return utfCvrtTo<wxString>(str); }
+inline Zstring toZ(const wxString& str) { return utfCvrtTo<Zstring>(str); }
inline std::vector<Zstring> toZ(const std::vector<wxString>& strList)
{
diff --git a/zen/FindFilePlus/FindFilePlus.vcxproj b/zen/FindFilePlus/FindFilePlus.vcxproj
index 2c4256a6..a50239ab 100644
--- a/zen/FindFilePlus/FindFilePlus.vcxproj
+++ b/zen/FindFilePlus/FindFilePlus.vcxproj
@@ -80,10 +80,10 @@
<TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">FindFilePlus_$(Platform)</TargetName>
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">FindFilePlus_$(Platform)</TargetName>
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">FindFilePlus_$(Platform)</TargetName>
- <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">D:\Data\WinDDK\inc\ddk;D:\Data\WinDDK\inc\api;D:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
- <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">D:\Data\WinDDK\inc\ddk;D:\Data\WinDDK\inc\api;D:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
- <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">D:\Data\WinDDK\inc\ddk;D:\Data\WinDDK\inc\api;D:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
- <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">D:\Data\WinDDK\inc\ddk;D:\Data\WinDDK\inc\api;D:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\Data\WinDDK\inc\ddk;C:\Data\WinDDK\inc\api;C:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">C:\Data\WinDDK\inc\ddk;C:\Data\WinDDK\inc\api;C:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">C:\Data\WinDDK\inc\ddk;C:\Data\WinDDK\inc\api;C:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
+ <IncludePath Condition="'$(Configuration)|$(Platform)'=='Release|x64'">C:\Data\WinDDK\inc\ddk;C:\Data\WinDDK\inc\api;C:\Data\WinDDK\inc\crt;$(WindowsSdkDir)\include;$(VCInstallDir)include</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<BuildLog>
diff --git a/zen/FindFilePlus/find_file_plus.cpp b/zen/FindFilePlus/find_file_plus.cpp
index ad385668..9fba5f1a 100644
--- a/zen/FindFilePlus/find_file_plus.cpp
+++ b/zen/FindFilePlus/find_file_plus.cpp
@@ -265,14 +265,49 @@ void FileSearcher::readDirImpl(FileInformation& output) //throw FileError
false); //__in BOOLEAN restartScan
if (!NT_SUCCESS(rv))
{
- if (rv == STATUS_NO_SUCH_FILE) //harmonize ntQueryDirectoryFile() error handling! failure to find a file on first call returns STATUS_NO_SUCH_FILE,
- rv = STATUS_NO_MORE_FILES; //while on subsequent accesses returns STATUS_NO_MORE_FILES
- //note: not all directories contain "., .." entries! E.g. a drive's root directory or NetDrive + ftp.gnu.org\CRYPTO.README"
- //-> addon: this is NOT a directory, it looks like one in NetDrive, but it's a file in Opera
+ /*
+ fallback to default directory query method, if FileIdBothDirectoryInformation is not properly implemented
+ this is required for NetDrive mounted Webdav, e.g. www.box.net and NT4, 2000 remote drives, et al.
+
+ NT status code | Win32 error code
+ --------------------------------|------------------------
+ STATUS_INVALID_LEVEL | ERROR_INVALID_LEVEL
+ STATUS_NOT_SUPPORTED | ERROR_NOT_SUPPORTED
+ STATUS_UNEXPECTED_NETWORK_ERROR | ERROR_UNEXP_NET_ERR -> traverse network drive hosted by Win98
+ STATUS_INVALID_PARAMETER | ERROR_INVALID_PARAMETER
+ STATUS_INVALID_NETWORK_RESPONSE | ERROR_BAD_NET_RESP
+ STATUS_INVALID_INFO_CLASS | ERROR_INVALID_PARAMETER
+ STATUS_UNSUCCESSFUL | ERROR_GEN_FAILURE
+ STATUS_ACCESS_VIOLATION | ERROR_NOACCESS ->FileIdBothDirectoryInformation on XP accessing UDF
+ STATUS_NO_SUCH_FILE | ERROR_FILE_NOT_FOUND
+
+ rv == STATUS_NO_SUCH_FILE:
+ failure to find a file on first call returns STATUS_NO_SUCH_FILE, while subsequent accesses return STATUS_NO_MORE_FILES
+ note: not all directories contain ".", ".." entries! E.g. a drive's root directory or NetDrive + ftp.gnu.org\CRYPTO.README"
+ -> addon: this is NOT a directory, it looks like one in NetDrive, but it's a file in Opera
+ STATUS_NO_SUCH_FILE is abused by some citrix shares instead of "STATUS_INVALID_PARAMETER" so we treat it as such!
+ => since the directory is "truly empty" a fallback won't hurt
+ */
+ if (rv == STATUS_INVALID_LEVEL ||
+ rv == STATUS_NOT_SUPPORTED ||
+ rv == STATUS_UNEXPECTED_NETWORK_ERROR ||
+ rv == STATUS_INVALID_PARAMETER ||
+ rv == STATUS_INVALID_NETWORK_RESPONSE ||
+ rv == STATUS_INVALID_INFO_CLASS ||
+ rv == STATUS_UNSUCCESSFUL ||
+ rv == STATUS_ACCESS_VIOLATION ||
+ rv == STATUS_NO_SUCH_FILE)
+ rv = STATUS_NOT_SUPPORTED;
throw NtFileError(rv); //throws STATUS_NO_MORE_FILES when finished
}
+ //for (NTSTATUS i = 0xC0000000L; i != -1; ++i)
+ //{
+ // if (rtlNtStatusToDosError(i) == 59) //ERROR_UNEXP_NET_ERR
+ // __asm int 3;
+ //}
+
if (status.Information == 0) //except for the first call to call ::NtQueryDirectoryFile():
throw NtFileError(STATUS_BUFFER_OVERFLOW); //if buffer size is too small, return value is STATUS_SUCCESS and Information == 0 -> we don't expect this!
}
diff --git a/zen/FindFilePlus/find_file_plus.h b/zen/FindFilePlus/find_file_plus.h
index 7d03d98b..3799a1e1 100644
--- a/zen/FindFilePlus/find_file_plus.h
+++ b/zen/FindFilePlus/find_file_plus.h
@@ -50,8 +50,7 @@ FindHandle openDir(const wchar_t* dirname); //returns nullptr on error, call ::G
DLL_FUNCTION_DECLARATION
bool readDir(FindHandle hnd, FileInformation& output); //returns false on error or if there are no more files; ::GetLastError() returns ERROR_NO_MORE_FILES in this case
/*
-warning:; this may also return file system implementation dependent error codes like ERROR_NOT_SUPPORTED, ERROR_INVALID_LEVEL,
-ect. if "FileIdBothDirectoryInformation" is not supported! We need a fallback:
+warning: may also return with ERROR_NOT_SUPPORTED if "FileIdBothDirectoryInformation" is not supported! We need a fallback:
sometimes it's *not* sufficient to use fallback for NtQueryDirectoryFile() alone, we need to reset "hDir", since it may be fucked up by some poor file system layer implementation:
- Samba before v3.0.22 (Mar 30, 2006) seems to have a bug which sucessfully returns 128 elements via NtQueryDirectoryFile() and FileIdBothDirectoryInformation,
diff --git a/zen/debug_log.h b/zen/debug_log.h
index 43b2fea3..6be81e89 100644
--- a/zen/debug_log.h
+++ b/zen/debug_log.h
@@ -56,7 +56,7 @@ public:
const std::string& message)
{
const std::string logEntry = "[" + formatTime<std::string>(FORMAT_TIME) + "] " + afterLast(sourceFile, ZEN_FILE_NAME_SEPARATOR) +
- ", line " + toString<std::string>(sourceRow) + ": " + message + "\n";
+ ", line " + numberTo<std::string>(sourceRow) + ": " + message + "\n";
const size_t bytesWritten = ::fwrite(logEntry.c_str(), 1, logEntry.size(), handle);
if (std::ferror(handle) != 0 || bytesWritten != logEntry.size())
diff --git a/zen/dir_watcher.cpp b/zen/dir_watcher.cpp
index 19c56d5a..e54c1b5b 100644
--- a/zen/dir_watcher.cpp
+++ b/zen/dir_watcher.cpp
@@ -22,9 +22,9 @@
#include "file_traverser.h"
#endif
-
using namespace zen;
+
#ifdef FFS_WIN
namespace
{
@@ -128,16 +128,7 @@ public:
dirnamePf(appendSeparator(directory)),
hDir(INVALID_HANDLE_VALUE)
{
- //these two privileges are required by ::CreateFile FILE_FLAG_BACKUP_SEMANTICS according to
- //http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx
- try
- {
- activatePrivilege(SE_BACKUP_NAME); //throw FileError
- activatePrivilege(SE_RESTORE_NAME); //
- }
- catch (const FileError&) {}
-
- hDir = ::CreateFile(applyLongPathPrefix(dirnamePf.c_str()).c_str(),
+ hDir = ::CreateFile(applyLongPathPrefix(dirnamePf).c_str(),
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nullptr,
@@ -158,7 +149,7 @@ public:
~ReadChangesAsync()
{
- if (hDir != INVALID_HANDLE_VALUE)
+ if (hDir != INVALID_HANDLE_VALUE) //valid hDir is NOT an invariant, see move constructor!
::CloseHandle(hDir);
}
@@ -201,7 +192,7 @@ public:
zen::ScopeGuard guardAio = zen::makeGuard([&]
{
//http://msdn.microsoft.com/en-us/library/aa363789(v=vs.85).aspx
- if (::CancelIo(hDir) == TRUE) //cancel all async I/O related to this handle and thread
+ if (::CancelIo(hDir) != FALSE) //cancel all async I/O related to this handle and thread
{
DWORD bytesWritten = 0;
::GetOverlappedResult(hDir, &overlapped, &bytesWritten, true); //wait until cancellation is complete
@@ -364,7 +355,7 @@ public:
const std::shared_ptr<TraverseCallback>& otherMe) : otherMe_(otherMe), dirs_(dirs) {}
virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details) {}
- virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) {}
+ 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)
{
dirs_.push_back(fullName);
@@ -394,7 +385,7 @@ DirWatcher::DirWatcher(const Zstring& directory) : //throw FileError
std::shared_ptr<TraverseCallback> traverser;
traverser = std::make_shared<DirsOnlyTraverser>(fullDirList, traverser); //throw FileError
- zen::traverseFolder(dirname, false, *traverser); //don't traverse into symlinks (analog to windows build)
+ zen::traverseFolder(dirname, *traverser); //don't traverse into symlinks (analog to windows build)
//init
pimpl_->dirname = directory;
diff --git a/zen/dst_hack.cpp b/zen/dst_hack.cpp
index 9457b966..6e5c2230 100644
--- a/zen/dst_hack.cpp
+++ b/zen/dst_hack.cpp
@@ -2,7 +2,7 @@
#include <bitset>
#include "basic_math.h"
#include "long_path_prefix.h"
-#include "utf8.h"
+#include "utf.h"
#include "assert_static.h"
#include "int64.h"
#include "file_error.h"
@@ -169,7 +169,7 @@ FILETIME utcToLocal(const FILETIME& utcTime) //throw std::runtime_error
const std::wstring errorMessage = _("Conversion error:") + L" FILETIME -> local FILETIME: " + L"(" +
L"High: " + numberTo<std::wstring>(utcTime.dwHighDateTime) + L" " +
L"Low: " + numberTo<std::wstring>(utcTime.dwLowDateTime) + L") " + L"\n\n" + getLastErrorFormatted();
- throw std::runtime_error(wideToUtf8<std::string>(errorMessage));
+ throw std::runtime_error(utfCvrtTo<std::string>(errorMessage));
}
return localTime;
}
@@ -187,7 +187,7 @@ FILETIME localToUtc(const FILETIME& localTime) //throw std::runtime_error
const std::wstring errorMessage = _("Conversion error:") + L" local FILETIME -> FILETIME: " + L"(" +
L"High: " + numberTo<std::wstring>(localTime.dwHighDateTime) + L" " +
L"Low: " + numberTo<std::wstring>(localTime.dwLowDateTime) + L") " + L"\n\n" + getLastErrorFormatted();
- throw std::runtime_error(wideToUtf8<std::string>(errorMessage));
+ throw std::runtime_error(utfCvrtTo<std::string>(errorMessage));
}
return utcTime;
}
@@ -288,7 +288,7 @@ std::bitset<UTC_LOCAL_OFFSET_BITS> getUtcLocalShift()
{
const std::wstring errorMessage = _("Conversion error:") + L" Unexpected UTC <-> local time shift: " +
L"(" + numberTo<std::wstring>(timeShiftSec) + L") " + L"\n\n" + getLastErrorFormatted();
- throw std::runtime_error(wideToUtf8<std::string>(errorMessage));
+ throw std::runtime_error(utfCvrtTo<std::string>(errorMessage));
}
std::bitset<UTC_LOCAL_OFFSET_BITS> output(absValue);
diff --git a/zen/file_error.h b/zen/file_error.h
index 4565d0b7..622d6a47 100644
--- a/zen/file_error.h
+++ b/zen/file_error.h
@@ -9,7 +9,7 @@
#include <string>
#include "zstring.h"
-#include "utf8.h"
+#include "utf.h"
#include "last_error.h" //we'll need this later anyway!
namespace zen
@@ -39,7 +39,7 @@ DEFINE_NEW_FILE_ERROR(ErrorFileLocked);
//allow implicit UTF8 conversion: since std::wstring models a GUI string, convenience is more important than performance
inline
-std::wstring operator+(const std::wstring& lhs, const Zstring& rhs) { return std::wstring(lhs) += utf8CvrtTo<std::wstring>(rhs); }
+std::wstring operator+(const std::wstring& lhs, const Zstring& rhs) { return std::wstring(lhs) += utfCvrtTo<std::wstring>(rhs); }
//we musn't put our overloads in namespace std, but namespace zen (+ using directive) is sufficient
@@ -48,10 +48,9 @@ inline
std::wstring fmtFileName(const Zstring& filename)
{
std::wstring output;
- output.reserve(filename.size() + 2);
- output += L'\"';
- output += utf8CvrtTo<std::wstring>(filename);
- output += L'\"';
+ output += L'\'';
+ output += utfCvrtTo<std::wstring>(filename);
+ output += L'\'';
return output;
}
}
diff --git a/zen/file_handling.cpp b/zen/file_handling.cpp
index 864fd61f..f004e09c 100644
--- a/zen/file_handling.cpp
+++ b/zen/file_handling.cpp
@@ -14,7 +14,6 @@
#include "file_io.h"
#include "assert_static.h"
#include <boost/thread/tss.hpp>
-//#include <boost/thread/once.hpp>
#include "file_id_def.h"
#ifdef FFS_WIN
@@ -73,15 +72,15 @@ bool zen::dirExists(const Zstring& dirname)
}
-bool zen::symlinkExists(const Zstring& objname)
+bool zen::symlinkExists(const Zstring& linkname)
{
#ifdef FFS_WIN
- const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(objname).c_str());
+ const DWORD ret = ::GetFileAttributes(applyLongPathPrefix(linkname).c_str());
return ret != INVALID_FILE_ATTRIBUTES && (ret & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
#elif defined FFS_LINUX
struct stat fileInfo = {};
- return ::lstat(objname.c_str(), &fileInfo) == 0 &&
+ return ::lstat(linkname.c_str(), &fileInfo) == 0 &&
S_ISLNK(fileInfo.st_mode); //symbolic link
#endif
}
@@ -143,7 +142,7 @@ void getFileAttrib(const Zstring& filename, FileAttrib& attr, ProcSymlink procSl
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nullptr,
OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS,
+ FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory
nullptr);
if (hFile == INVALID_HANDLE_VALUE)
throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted());
@@ -453,7 +452,7 @@ Zstring getFilenameFmt(const Zstring& filename, Function fun) //throw(); returns
const DWORD rv = fun(filenameFmt.c_str(), //__in LPCTSTR lpszShortPath,
&buffer[0], //__out LPTSTR lpszLongPath,
bufferSize); //__in DWORD cchBuffer
- if (rv == 0 || rv >= buffer.size())
+ if (rv == 0 || rv >= bufferSize)
return Zstring();
return &buffer[0];
@@ -478,7 +477,7 @@ Zstring findUnused8Dot3Name(const Zstring& filename) //find a unique 8.3 short n
return output;
}
- throw std::runtime_error(std::string("100000000 files, one for each number, exist in this directory? You're kidding...\n") + utf8CvrtTo<std::string>(pathPrefix));
+ throw std::runtime_error(std::string("100000000 files, one for each number, exist in this directory? You're kidding...\n") + utfCvrtTo<std::string>(pathPrefix));
}
@@ -575,14 +574,10 @@ public:
virtual void deleteTargetFile(const Zstring& targetFile) { assert(!fileExists(targetFile)); }
- virtual void updateCopyStatus(UInt64 totalBytesTransferred)
+ virtual void updateCopyStatus(Int64 bytesDelta)
{
if (moveCallback)
- {
- const Int64 delta = to<Int64>(totalBytesTransferred) - bytesReported;
- moveCallback->updateStatus(delta);
- bytesReported += delta;
- }
+ moveCallback->updateStatus(bytesDelta);
}
private:
@@ -592,7 +587,6 @@ private:
const Zstring sourceFile_;
const Zstring targetFile_;
CallbackMoveFile* moveCallback; //optional
- Int64 bytesReported;
};
@@ -649,12 +643,13 @@ public:
files_.push_back(std::make_pair(shortName, fullName));
}
- virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details)
+ 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)
@@ -727,7 +722,7 @@ void moveDirectoryImpl(const Zstring& sourceDir, const Zstring& targetDir, Callb
//traverse source directory one level
TraverseOneLevel traverseCallback(fileList, dirList);
- traverseFolder(sourceDir, false, traverseCallback); //traverse one level, don't follow symlinks
+ traverseFolder(sourceDir, traverseCallback); //traverse one level
const Zstring targetDirPf = appendSeparator(targetDir);
@@ -780,12 +775,13 @@ public:
{
m_files.push_back(fullName);
}
- virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details)
+ virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details)
{
if (details.dirLink)
m_dirs.push_back(fullName);
else
m_files.push_back(fullName);
+ return LINK_SKIP;
}
virtual std::shared_ptr<TraverseCallback> onDir(const Zchar* shortName, const Zstring& fullName)
{
@@ -836,7 +832,7 @@ void zen::removeDirectory(const Zstring& directory, CallbackRemoveDir* callback)
{
//get all files and directories from current directory (WITHOUT subdirectories!)
FilesDirsOnlyTraverser traverser(fileList, dirList);
- traverseFolder(directory, false, traverser); //don't follow symlinks
+ traverseFolder(directory, traverser); //don't follow symlinks
}
//delete directories recursively
@@ -896,7 +892,9 @@ void zen::setFileTime(const Zstring& filename, const Int64& modificationTime, Pr
FileUpdateHandle targetHandle(filename, [=]
{
return ::CreateFile(applyLongPathPrefix(filename).c_str(),
- GENERIC_READ | GENERIC_WRITE, //use both when writing over network, see comment in file_io.cpp
+ FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES,
+ //avoids mysterious "access denied" when using "GENERIC_READ | GENERIC_WRITE" on a read-only file, even after read-only was removed right before:
+ //https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3514569&group_id=234430
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nullptr,
OPEN_EXISTING,
@@ -917,11 +915,68 @@ void zen::setFileTime(const Zstring& filename, const Int64& modificationTime, Pr
auto isNullTime = [](const FILETIME & ft) { return ft.dwLowDateTime == 0 && ft.dwHighDateTime == 0; };
- if (!::SetFileTime(targetHandle.get(),
- isNullTime(creationTime) ? nullptr : &creationTime,
- nullptr,
- &lastWriteTime))
- throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted());
+ if (!::SetFileTime(targetHandle.get(), //__in HANDLE hFile,
+ !isNullTime(creationTime) ? &creationTime : nullptr, //__in_opt const FILETIME *lpCreationTime,
+ nullptr, //__in_opt const FILETIME *lpLastAccessTime,
+ &lastWriteTime)) //__in_opt const FILETIME *lpLastWriteTime
+ {
+ auto lastErr = ::GetLastError();
+
+ //function may fail if file is read-only: https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3514569&group_id=234430
+ if (lastErr == ERROR_ACCESS_DENIED)
+ {
+ //dynamically load windows API function: available with Windows Vista and later
+ typedef BOOL (WINAPI* SetFileInformationByHandleFunc)(HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS FileInformationClass, LPVOID lpFileInformation, DWORD dwBufferSize);
+
+ const SysDllFun<SetFileInformationByHandleFunc> setFileInformationByHandle(L"kernel32.dll", "SetFileInformationByHandle");
+ if (setFileInformationByHandle) //if not: let the original error propagate!
+ {
+ auto setFileInfo = [&](FILE_BASIC_INFO basicInfo) //throw FileError; no const& since SetFileInformationByHandle() requires non-const parameter!
+ {
+ if (!setFileInformationByHandle(targetHandle.get(), //__in HANDLE hFile,
+ FileBasicInfo, //__in FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
+ &basicInfo, //__in LPVOID lpFileInformation,
+ sizeof(basicInfo))) //__in DWORD dwBufferSize
+ throw FileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted());
+ };
+
+ auto toLargeInteger = [](const FILETIME& ft) -> LARGE_INTEGER
+ {
+ LARGE_INTEGER tmp = {};
+ tmp.LowPart = ft.dwLowDateTime;
+ tmp.HighPart = ft.dwHighDateTime;
+ return tmp;
+ };
+ //---------------------------------------------------------------------------
+
+ BY_HANDLE_FILE_INFORMATION fileInfo = {};
+ if (::GetFileInformationByHandle(targetHandle.get(), &fileInfo))
+ if (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
+ {
+ FILE_BASIC_INFO basicInfo = {}; //undocumented: file times of "0" stand for "don't change"
+ basicInfo.FileAttributes = FILE_ATTRIBUTE_NORMAL; //[!] the bug in the ticket above requires we set this together with file times!!!
+ basicInfo.LastWriteTime = toLargeInteger(lastWriteTime); //
+ if (!isNullTime(creationTime))
+ basicInfo.CreationTime = toLargeInteger(creationTime);
+
+ setFileInfo(basicInfo); //throw FileError
+
+ try //... to restore original file attributes
+ {
+ FILE_BASIC_INFO basicInfo2 = {};
+ basicInfo2.FileAttributes = fileInfo.dwFileAttributes;
+ setFileInfo(basicInfo2); //throw FileError
+ }
+ catch (FileError&) {}
+
+ lastErr = ERROR_SUCCESS;
+ }
+ }
+
+ if (lastErr != ERROR_SUCCESS)
+ throw FileError(replaceCpy(_("Cannot write modification time of %x."), L"%x", fmtFileName(filename)) + L"\n\n" + getLastErrorFormatted(lastErr));
+ }
+ }
#ifndef NDEBUG //dst hack: verify data written
if (dst::isFatDrive(filename) && !dirExists(filename)) //throw()
@@ -1322,7 +1377,6 @@ void createDirectory_straight(const Zstring& directory, const Zstring& templateD
ZEN_ON_SCOPE_EXIT(::CloseHandle(hDir));
USHORT cmpState = COMPRESSION_FORMAT_DEFAULT;
-
DWORD bytesReturned = 0;
::DeviceIoControl(hDir, //handle to file or directory
FSCTL_SET_COMPRESSION, //dwIoControlCode
@@ -1364,8 +1418,11 @@ void createDirectoryRecursively(const Zstring& directory, const Zstring& templat
return;
}
#elif defined FFS_LINUX
- if (dirExists(directory))
- return;
+ if (somethingExists(directory))
+ {
+ if (dirExists(directory))
+ return;
+ }
#endif
else //if "not somethingExists" we need to create the parent directory
{
@@ -1485,7 +1542,7 @@ source attr | tf normal | tf compressed | tf encrypted | handled by
============|==================================================================
--- | --- -C- E-- copyFileWindowsDefault
--S | --S -CS E-S copyFileWindowsSparse
- -C- | --- (NOK) -C- E-- copyFileWindowsDefault
+ -C- | -C- -C- E-- copyFileWindowsDefault
-CS | -CS -CS E-S copyFileWindowsSparse
E-- | E-- E-- E-- copyFileWindowsDefault
E-S | E-- (NOK) E-- (NOK) E-- (NOK) copyFileWindowsDefault -> may fail with ERROR_DISK_FULL!!
@@ -1502,14 +1559,10 @@ Note: - if target parent folder is compressed or encrypted, both attributes are
//due to issues on non-NTFS volumes, we should use the copy-as-sparse routine only if required and supported!
-bool canCopyAsSparse(HANDLE hSource, const Zstring& targetFile) //throw ()
+bool canCopyAsSparse(DWORD fileAttrSource, const Zstring& targetFile) //throw ()
{
- BY_HANDLE_FILE_INFORMATION fileInfoSource = {};
- if (!::GetFileInformationByHandle(hSource, &fileInfoSource))
- return false;
-
- const bool sourceIsEncrypted = (fileInfoSource.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) != 0;
- const bool sourceIsSparse = (fileInfoSource.dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0;
+ const bool sourceIsEncrypted = (fileAttrSource & FILE_ATTRIBUTE_ENCRYPTED) != 0;
+ const bool sourceIsSparse = (fileAttrSource & FILE_ATTRIBUTE_SPARSE_FILE) != 0;
if (sourceIsEncrypted || !sourceIsSparse) //BackupRead() silently fails reading encrypted files!
return false; //small perf optimization: don't check "targetFile" if not needed
@@ -1544,18 +1597,23 @@ bool canCopyAsSparse(HANDLE hSource, const Zstring& targetFile) //throw ()
bool canCopyAsSparse(const Zstring& sourceFile, const Zstring& targetFile) //throw ()
{
- HANDLE hFileSource = ::CreateFile(applyLongPathPrefix(sourceFile).c_str(),
- GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read files that are open in other applications
- nullptr,
- OPEN_EXISTING,
- 0,
- nullptr);
- if (hFileSource == INVALID_HANDLE_VALUE)
+ //follow symlinks!
+ HANDLE hSource = ::CreateFile(applyLongPathPrefix(sourceFile).c_str(),
+ 0,
+ FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read files that are open in other applications
+ nullptr,
+ OPEN_EXISTING,
+ 0,
+ nullptr);
+ if (hSource == INVALID_HANDLE_VALUE)
+ return false;
+ ZEN_ON_SCOPE_EXIT(::CloseHandle(hSource));
+
+ BY_HANDLE_FILE_INFORMATION fileInfoSource = {};
+ if (!::GetFileInformationByHandle(hSource, &fileInfoSource))
return false;
- ZEN_ON_SCOPE_EXIT(::CloseHandle(hFileSource));
- return canCopyAsSparse(hFileSource, targetFile); //throw ()
+ return canCopyAsSparse(fileInfoSource.dwFileAttributes, targetFile); //throw ()
}
@@ -1567,7 +1625,7 @@ void copyFileWindowsSparse(const Zstring& sourceFile,
{
assert(canCopyAsSparse(sourceFile, targetFile));
- //comment suggests "FILE_FLAG_BACKUP_SEMANTICS + SE_BACKUP_NAME" may be needed: http://msdn.microsoft.com/en-us/library/windows/desktop/aa362509(v=vs.85).aspx
+ //try to get backup read and write privileges: who knows, maybe this helps solve some obscure "access denied" errors
try { activatePrivilege(SE_BACKUP_NAME); }
catch (const FileError&) {}
try { activatePrivilege(SE_RESTORE_NAME); }
@@ -1576,7 +1634,7 @@ void copyFileWindowsSparse(const Zstring& sourceFile,
//open sourceFile for reading
HANDLE hFileSource = ::CreateFile(applyLongPathPrefix(sourceFile).c_str(),
GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read files that are open in other applications
+ FILE_SHARE_READ | FILE_SHARE_DELETE,
nullptr,
OPEN_EXISTING, //FILE_FLAG_OVERLAPPED must not be used!
FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_BACKUP_SEMANTICS, //FILE_FLAG_NO_BUFFERING should not be used!
@@ -1605,7 +1663,8 @@ void copyFileWindowsSparse(const Zstring& sourceFile,
throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(sourceFile)) + L"\n\n" + getLastErrorFormatted());
//----------------------------------------------------------------------
- const DWORD validAttribs = FILE_ATTRIBUTE_READONLY |
+ const DWORD validAttribs = FILE_ATTRIBUTE_NORMAL | //"This attribute is valid only if used alone."
+ FILE_ATTRIBUTE_READONLY |
FILE_ATTRIBUTE_HIDDEN |
FILE_ATTRIBUTE_SYSTEM |
FILE_ATTRIBUTE_ARCHIVE | //those two are not set properly (not worse than ::CopyFileEx())
@@ -1615,7 +1674,7 @@ void copyFileWindowsSparse(const Zstring& sourceFile,
//create targetFile and open it for writing
HANDLE hFileTarget = ::CreateFile(applyLongPathPrefix(targetFile).c_str(),
GENERIC_READ | GENERIC_WRITE, //read access required for FSCTL_SET_COMPRESSION
- FILE_SHARE_READ | FILE_SHARE_DELETE,
+ FILE_SHARE_DELETE, //FILE_SHARE_DELETE is required to rename file while handle is open!
nullptr,
CREATE_NEW,
FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_BACKUP_SEMANTICS | (fileInfoSource.dwFileAttributes & validAttribs),
@@ -1652,73 +1711,44 @@ void copyFileWindowsSparse(const Zstring& sourceFile,
newAttrib->targetFileId = extractFileID(fileInfoTarget);
}
- //----------------------------------------------------------------------
- DWORD fsFlagsTarget = 0;
- {
- const DWORD bufferSize = 10000;
- std::vector<wchar_t> buffer(bufferSize);
-
- //full pathName need not yet exist!
- if (!::GetVolumePathName(targetFile.c_str(), //__in LPCTSTR lpszFileName,
- &buffer[0], //__out LPTSTR lpszVolumePathName,
- bufferSize)) //__in DWORD cchBufferLength
- throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(targetFile)) + L"\n\n" + getLastErrorFormatted());
-
- //GetVolumeInformationByHandleW would be a better solution, but it is supported beginning with Vista only!
- if (!::GetVolumeInformation(&buffer[0], //__in_opt LPCTSTR lpRootPathName
- nullptr, //__out_opt LPTSTR lpVolumeNameBuffer,
- 0, //__in DWORD nVolumeNameSize,
- nullptr, //__out_opt LPDWORD lpVolumeSerialNumber,
- nullptr, //__out_opt LPDWORD lpMaximumComponentLength,
- &fsFlagsTarget, //__out_opt LPDWORD lpFileSystemFlags,
- nullptr, //__out LPTSTR lpFileSystemNameBuffer,
- 0)) //__in DWORD nFileSystemNameSize
- throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(targetFile)) + L"\n\n" + getLastErrorFormatted());
- }
-
- //----------------------------------------------------------------------
- const bool sourceIsCompressed = (fileInfoSource.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) != 0;
- const bool sourceIsSparse = (fileInfoSource.dwFileAttributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0;
-
- const bool targetSupportsCompressed = (fsFlagsTarget & FILE_FILE_COMPRESSION ) != 0;
- const bool targetSupportsSparse = (fsFlagsTarget & FILE_SUPPORTS_SPARSE_FILES) != 0;
-
- //----------------------------------------------------------------------
- if (sourceIsCompressed && targetSupportsCompressed)
+ //#################### copy NTFS compressed attribute #########################
+ const bool sourceIsCompressed = (fileInfoSource.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) != 0;
+ const bool targetIsCompressed = (fileInfoTarget.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) != 0; //already set by CreateFile if target parent folder is compressed!
+ if (sourceIsCompressed && !targetIsCompressed)
{
USHORT cmpState = COMPRESSION_FORMAT_DEFAULT;
DWORD bytesReturned = 0;
- if (!DeviceIoControl(hFileTarget, //handle to file or directory
- FSCTL_SET_COMPRESSION, //dwIoControlCode
- &cmpState, //input buffer
- sizeof(cmpState), //size of input buffer
- nullptr, //lpOutBuffer
- 0, //OutBufferSize
- &bytesReturned, //number of bytes returned
- nullptr)) //OVERLAPPED structure
- {
- //-> if target folder is encrypted this call will legitimately fail with ERROR_INVALID_FUNCTION
- //throw FileError
- }
- }
+ if (!::DeviceIoControl(hFileTarget, //handle to file or directory
+ FSCTL_SET_COMPRESSION, //dwIoControlCode
+ &cmpState, //input buffer
+ sizeof(cmpState), //size of input buffer
+ nullptr, //lpOutBuffer
+ 0, //OutBufferSize
+ &bytesReturned, //number of bytes returned
+ nullptr)) //OVERLAPPED structure
+ {} //may legitimately fail with ERROR_INVALID_FUNCTION if:
+ // - target folder is encrypted
+ // - target volume does not support compressed attribute -> unlikely in this context
+ }
+ //#############################################################################
//although it seems the sparse attribute is set automatically by BackupWrite, we are required to do this manually: http://support.microsoft.com/kb/271398/en-us
//Quote: It is the responsibility of the backup utility to apply file attributes to a file after it is restored by using BackupWrite.
//The application should retrieve the attributes by using GetFileAttributes prior to creating a backup with BackupRead.
//If a file originally had the sparse attribute (FILE_ATTRIBUTE_SPARSE_FILE), the backup utility must explicitly set the
- //attribute on the restored file. The attribute can be set by using the DeviceIoControl function with the FSCTL_SET_SPARSE flag.
+ //attribute on the restored file.
- if (sourceIsSparse && targetSupportsSparse)
+ //if (sourceIsSparse && targetSupportsSparse) -> no need to check, this is our precondition!
{
DWORD bytesReturned = 0;
- if (!DeviceIoControl(hFileTarget, //handle to file
- FSCTL_SET_SPARSE, //dwIoControlCode
- nullptr, //input buffer
- 0, //size of input buffer
- nullptr, //lpOutBuffer
- 0, //OutBufferSize
- &bytesReturned, //number of bytes returned
- nullptr)) //OVERLAPPED structure
+ if (!::DeviceIoControl(hFileTarget, //handle to file
+ FSCTL_SET_SPARSE, //dwIoControlCode
+ nullptr, //input buffer
+ 0, //size of input buffer
+ nullptr, //lpOutBuffer
+ 0, //OutBufferSize
+ &bytesReturned, //number of bytes returned
+ nullptr)) //OVERLAPPED structure
throw FileError(replaceCpy(_("Cannot write file attributes of %x."), L"%x", fmtFileName(targetFile)) +
L"\n\n" + zen::getLastErrorFormatted() + L" (NTFS sparse)");
}
@@ -1737,10 +1767,9 @@ void copyFileWindowsSparse(const Zstring& sourceFile,
if (contextRead ) ::BackupRead (0, nullptr, 0, nullptr, true, false, &contextRead); //lpContext must be passed [...] all other parameters are ignored.
if (contextWrite) ::BackupWrite(0, nullptr, 0, nullptr, true, false, &contextWrite); );
-
//stream-copy sourceFile to targetFile
- UInt64 totalBytesTransferred; //may be larger than file size! context information + ADS!
bool eof = false;
+ bool silentFailure = true; //try to detect failure reading encrypted files
do
{
DWORD bytesRead = 0;
@@ -1772,18 +1801,21 @@ void copyFileWindowsSparse(const Zstring& sourceFile,
if (bytesWritten != bytesRead)
throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(targetFile)) + L"\n\n" + L"(incomplete write)");
- totalBytesTransferred += bytesRead;
+ //total bytes transferred may be larger than file size! context information + ADS or smaller (sparse, compressed)!
//invoke callback method to update progress indicators
if (callback)
- callback->updateCopyStatus(totalBytesTransferred); //throw X!
+ callback->updateCopyStatus(Int64(bytesRead)); //throw X!
+
+ if (bytesRead > 0)
+ silentFailure = false;
}
while (!eof);
//DST hack not required, since both source and target volumes cannot be FAT!
//::BackupRead() silently fails reading encrypted files -> double check!
- if (totalBytesTransferred == 0U && UInt64(fileInfoSource.nFileSizeLow, fileInfoSource.nFileSizeHigh) != 0U)
+ if (silentFailure && UInt64(fileInfoSource.nFileSizeLow, fileInfoSource.nFileSizeHigh) != 0U)
//note: there is no guaranteed ordering relation beween bytes transferred and file size! Consider ADS (>) and compressed/sparse files (<)!
throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(sourceFile)) + L"\n\n" + L"(unknown error)");
@@ -1835,33 +1867,32 @@ DEFINE_NEW_FILE_ERROR(ErrorShouldCopyAsSparse);
class ErrorHandling
{
public:
- ErrorHandling() : shouldCopyAsSparse(false) {}
-
- void reportUserException(CallbackCopyFile& userCallback, const UInt64& bytesTransferred)
- {
- exceptionInUserCallback.reset(new std::pair<CallbackCopyFile*, UInt64>(&userCallback, bytesTransferred));
- }
+ ErrorHandling() : shouldCopyAsSparse(false), exceptionInUserCallback(nullptr) {}
+ //call context: copyCallbackInternal()
void reportErrorShouldCopyAsSparse() { shouldCopyAsSparse = true; }
+ void reportUserException(CallbackCopyFile& userCallback) { exceptionInUserCallback = &userCallback; }
+
void reportError(const std::wstring& message) { errorMsg = message; }
+ //call context: copyFileWindowsDefault()
void evaluateErrors() //throw X
{
if (shouldCopyAsSparse)
throw ErrorShouldCopyAsSparse(L"sparse dummy value");
if (exceptionInUserCallback)
- exceptionInUserCallback->first->updateCopyStatus(exceptionInUserCallback->second); //rethrow (hopefully!)
+ exceptionInUserCallback->updateCopyStatus(0); //rethrow (hopefully!)
if (!errorMsg.empty())
throw FileError(errorMsg);
}
private:
- bool shouldCopyAsSparse;
- std::wstring errorMsg; //these two are exclusive!
- std::unique_ptr<std::pair<CallbackCopyFile*, UInt64>> exceptionInUserCallback; //
+ bool shouldCopyAsSparse; //
+ std::wstring errorMsg; //these are exclusive!
+ CallbackCopyFile* exceptionInUserCallback; //
};
@@ -1879,7 +1910,9 @@ struct CallbackData
CallbackCopyFile* const userCallback; //optional!
ErrorHandling errorHandler;
- FileAttrib newAttrib; //modified by CopyFileEx at start
+ FileAttrib newAttrib; //modified by CopyFileEx() at beginning
+
+ Int64 bytesReported; //used internally to calculate bytes transferred delta
};
@@ -1903,6 +1936,8 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize,
file time handling:
::CopyFileEx() will copy file modification time (only) over from source file AFTER the last invokation of this callback
=> it is possible to adapt file creation time of target in here, but NOT file modification time!
+ CAVEAT: if ::CopyFileEx() fails to set modification time, it silently ignores this error and returns success!!!
+ see procmon log in: https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3514569&group_id=234430
alternate data stream handling:
CopyFileEx() processes multiple streams one after another, stream 1 is the file data stream and always available!
@@ -1915,12 +1950,6 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize,
if (dwCallbackReason == CALLBACK_STREAM_SWITCH && //called up-front for every file (even if 0-sized)
dwStreamNumber == 1) //consider ADS!
{
- if (canCopyAsSparse(hSourceFile, cbd.targetFile_)) //throw ()
- {
- cbd.errorHandler.reportErrorShouldCopyAsSparse(); //use another copy routine!
- return PROGRESS_CANCEL;
- }
-
//#################### return source file attributes ################################
BY_HANDLE_FILE_INFORMATION fileInfoSrc = {};
if (!::GetFileInformationByHandle(hSourceFile, &fileInfoSrc))
@@ -1941,14 +1970,40 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize,
cbd.newAttrib.sourceFileId = extractFileID(fileInfoSrc);
cbd.newAttrib.targetFileId = extractFileID(fileInfoTrg);
+ //#################### switch to sparse file copy if req. #######################
+ if (canCopyAsSparse(fileInfoSrc.dwFileAttributes, cbd.targetFile_)) //throw ()
+ {
+ cbd.errorHandler.reportErrorShouldCopyAsSparse(); //use a different copy routine!
+ return PROGRESS_CANCEL;
+ }
+
//#################### copy file creation time ################################
::SetFileTime(hDestinationFile, &fileInfoSrc.ftCreationTime, nullptr, nullptr); //no error handling!
- //##############################################################################
+
+ //#################### copy NTFS compressed attribute #########################
+ const bool sourceIsCompressed = (fileInfoSrc.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) != 0;
+ const bool targetIsCompressed = (fileInfoTrg.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED) != 0; //already set by CopyFileEx if target parent folder is compressed!
+ if (sourceIsCompressed && !targetIsCompressed)
+ {
+ USHORT cmpState = COMPRESSION_FORMAT_DEFAULT;
+ DWORD bytesReturned = 0;
+ if (!::DeviceIoControl(hDestinationFile, //handle to file or directory
+ FSCTL_SET_COMPRESSION, //dwIoControlCode
+ &cmpState, //input buffer
+ sizeof(cmpState), //size of input buffer
+ nullptr, //lpOutBuffer
+ 0, //OutBufferSize
+ &bytesReturned, //number of bytes returned
+ nullptr)) //OVERLAPPED structure
+ {} //may legitimately fail with ERROR_INVALID_FUNCTION if
+ // - if target folder is encrypted
+ // - target volume does not support compressed attribute
+ //#############################################################################
+ }
}
//called after copy operation is finished - note: for 0-sized files this callback is invoked just ONCE!
//if (totalFileSize.QuadPart == totalBytesTransferred.QuadPart && dwStreamNumber == 1) {}
-
if (cbd.userCallback)
{
//some odd check for some possible(?) error condition
@@ -1960,13 +2015,14 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize,
nullptr, 0);
try
{
- cbd.userCallback->updateCopyStatus(UInt64(totalBytesTransferred.QuadPart)); //throw X!
+ cbd.userCallback->updateCopyStatus(totalBytesTransferred.QuadPart - cbd.bytesReported); //throw X!
+ cbd.bytesReported = totalBytesTransferred.QuadPart;
}
catch (...)
{
//#warning migrate to std::exception_ptr when available
- cbd.errorHandler.reportUserException(*cbd.userCallback, UInt64(totalBytesTransferred.QuadPart));
+ cbd.errorHandler.reportUserException(*cbd.userCallback);
return PROGRESS_CANCEL;
}
}
@@ -1975,7 +2031,7 @@ DWORD CALLBACK copyCallbackInternal(LARGE_INTEGER totalFileSize,
const bool supportNonEncryptedDestination = winXpOrLater(); //encrypted destination is not supported with Windows 2000
-const bool supportUnbufferedCopy = vistaOrLater();
+//const bool supportUnbufferedCopy = vistaOrLater();
//caveat: function scope static initialization is not thread-safe in VS 2010!
@@ -1984,20 +2040,23 @@ void copyFileWindowsDefault(const Zstring& sourceFile,
CallbackCopyFile* callback,
FileAttrib* newAttrib) //throw FileError, ErrorTargetPathMissing, ErrorTargetExisting, ErrorFileLocked, ErrorShouldCopyAsSparse
{
+ //try to get backup read and write privileges: who knows, maybe this helps solve some obscure "access denied" errors
+ try { activatePrivilege(SE_BACKUP_NAME); }
+ catch (const FileError&) {}
+ try { activatePrivilege(SE_RESTORE_NAME); }
+ catch (const FileError&) {}
+
zen::ScopeGuard guardTarget = zen::makeGuard([&] { try { removeFile(targetFile); } catch (...) {} });
//transactional behavior: guard just before starting copy, we don't trust ::CopyFileEx(), do we? ;)
DWORD copyFlags = COPY_FILE_FAIL_IF_EXISTS;
-#ifndef COPY_FILE_ALLOW_DECRYPTED_DESTINATION
- const DWORD COPY_FILE_ALLOW_DECRYPTED_DESTINATION = 0x00000008;
-#endif
-
if (supportNonEncryptedDestination)
copyFlags |= COPY_FILE_ALLOW_DECRYPTED_DESTINATION; //allow copying from encrypted to non-encrytped location
- if (supportUnbufferedCopy) //see http://blogs.technet.com/b/askperf/archive/2007/05/08/slow-large-file-copy-issues.aspx
- copyFlags |= COPY_FILE_NO_BUFFERING; //no perf difference at worst, huge improvement for large files (20% in test NTFS -> NTFS)
+ //if (supportUnbufferedCopy) //see http://blogs.technet.com/b/askperf/archive/2007/05/08/slow-large-file-copy-issues.aspx
+ // copyFlags |= COPY_FILE_NO_BUFFERING; //no perf difference at worst, huge improvement for large files (20% in test NTFS -> NTFS)
+ //It's a shame this flag causes file corruption! https://sourceforge.net/tracker/?func=detail&atid=1093080&aid=3529683&group_id=234430
CallbackData cbd(callback, sourceFile, targetFile);
@@ -2007,7 +2066,7 @@ void copyFileWindowsDefault(const Zstring& sourceFile,
copyCallbackInternal, //__in_opt LPPROGRESS_ROUTINE lpProgressRoutine,
&cbd, //__in_opt LPVOID lpData,
nullptr, //__in_opt LPBOOL pbCancel,
- copyFlags) == TRUE; //__in DWORD dwCopyFlags
+ copyFlags) != FALSE; //__in DWORD dwCopyFlags
cbd.errorHandler.evaluateErrors(); //throw ?, process errors in callback first!
if (!success)
@@ -2141,18 +2200,15 @@ void copyFileLinux(const Zstring& sourceFile,
}();
//copy contents of sourceFile to targetFile
- UInt64 totalBytesTransferred;
do
{
const size_t bytesRead = fileIn.read(&buffer[0], buffer.size()); //throw FileError
fileOut.write(&buffer[0], bytesRead); //throw FileError
- totalBytesTransferred += bytesRead;
-
//invoke callback method to update progress indicators
if (callback)
- callback->updateCopyStatus(totalBytesTransferred); //throw X!
+ callback->updateCopyStatus(Int64(bytesRead)); //throw X!
}
while (!fileIn.eof());
}
@@ -2194,11 +2250,11 @@ void copyFileLinux(const Zstring& sourceFile,
#endif
-Zstring createTempName(const Zstring& filename)
+Zstring findUnusedTempName(const Zstring& filename)
{
Zstring output = filename + zen::TEMP_FILE_ENDING;
- //ensure uniqueness
+ //ensure uniqueness (+ minor race condition)
for (int i = 1; somethingExists(output); ++i)
output = filename + Zchar('_') + numberTo<Zstring>(i) + zen::TEMP_FILE_ENDING;
@@ -2255,7 +2311,7 @@ void zen::copyFile(const Zstring& sourceFile, //throw FileError, ErrorTargetPath
{
//determine non-used temp file name "first":
//using optimistic strategy: assume everything goes well, but recover on error -> minimize file accesses
- temporary = createTempName(targetFile);
+ temporary = findUnusedTempName(targetFile);
//retry
copyFileSelectOs(sourceFile, temporary, callback, sourceAttr); //throw FileError
diff --git a/zen/file_handling.h b/zen/file_handling.h
index e90ad544..8848fbc2 100644
--- a/zen/file_handling.h
+++ b/zen/file_handling.h
@@ -21,7 +21,7 @@ struct CallbackCopyFile;
bool fileExists (const Zstring& filename); //throw() check whether file or symlink exists
bool dirExists (const Zstring& dirname); //throw() check whether directory or symlink exists
-bool symlinkExists (const Zstring& objname); //throw() check whether a symbolic link exists
+bool symlinkExists (const Zstring& linkname); //throw() check whether a symbolic link exists
bool somethingExists(const Zstring& objname); //throw() check whether any object with this name exists
//check whether two folders are located on the same (logical) volume
@@ -108,7 +108,7 @@ struct CallbackCopyFile //callback functionality
//may throw:
//Linux: unconditionally
//Windows: first exception is swallowed, updateCopyStatus() is then called again where it should throw again and exception will propagate as expected
- virtual void updateCopyStatus(UInt64 totalBytesTransferred) = 0;
+ virtual void updateCopyStatus(Int64 bytesDelta) = 0; //accummulated delta != file size! consider ADS, sparse, compressed files
};
diff --git a/zen/file_io.cpp b/zen/file_io.cpp
index 462364da..3b3c244d 100644
--- a/zen/file_io.cpp
+++ b/zen/file_io.cpp
@@ -26,7 +26,7 @@ FileInput::FileInput(const Zstring& filename) : //throw FileError, ErrorNotExis
#ifdef FFS_WIN
fileHandle = ::CreateFile(zen::applyLongPathPrefix(filename).c_str(),
GENERIC_READ,
- FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, //all shared modes are required to read open files that are shared by other applications
+ FILE_SHARE_READ | FILE_SHARE_DELETE,
nullptr,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
@@ -62,12 +62,11 @@ FileInput::FileInput(const Zstring& filename) : //throw FileError, ErrorNotExis
#endif
{
const ErrorCode lastError = getLastError();
- std::wstring errorMessage = replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename_)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (open)";
if (errorCodeForNotExisting(lastError))
- throw ErrorNotExisting(errorMessage);
+ throw ErrorNotExisting(replaceCpy(_("Cannot find file %x."), L"%x", fmtFileName(filename_)) + L"\n\n" + getLastErrorFormatted(lastError));
- throw FileError(errorMessage);
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename_)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (open)");
}
}
@@ -93,17 +92,23 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //returns actual number
nullptr)) //__inout_opt LPOVERLAPPED lpOverlapped
#elif defined FFS_LINUX
const size_t bytesRead = ::fread(buffer, 1, bytesToRead, fileHandle);
- if (::ferror(fileHandle) != 0)
+ if (::ferror(fileHandle) != 0) //checks status of stream, not fread()!
#endif
throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename_)) + L"\n\n" + getLastErrorFormatted() + L" (read)");
#ifdef FFS_WIN
if (bytesRead < bytesToRead) //verify only!
+ eofReached = true;
+
#elif defined FFS_LINUX
if (::feof(fileHandle) != 0)
-#endif
eofReached = true;
+ if (bytesRead < bytesToRead)
+ if (!eofReached) //pathologic!?
+ throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename_)) + L"\n\n" + L"Incomplete read!");
+#endif
+
if (bytesRead > bytesToRead)
throw FileError(replaceCpy(_("Cannot read file %x."), L"%x", fmtFileName(filename_)) + L"\n\n" + L"buffer overflow");
@@ -111,12 +116,6 @@ size_t FileInput::read(void* buffer, size_t bytesToRead) //returns actual number
}
-bool FileInput::eof() //end of file reached
-{
- return eofReached;
-}
-
-
FileOutput::FileOutput(FileHandle handle, const Zstring& filename) : fileHandle(handle), filename_(filename) {}
@@ -131,7 +130,7 @@ FileOutput::FileOutput(const Zstring& filename, AccessFlag access) : //throw Fil
to use GENERIC_READ | GENERIC_WRITE for dwDesiredAccess than to use GENERIC_WRITE alone.
The resulting code is faster, because the redirector can use the cache manager and send fewer SMBs with more data.
This combination also avoids an issue where writing to a file across a network can occasionally return ERROR_ACCESS_DENIED. */
- FILE_SHARE_READ | FILE_SHARE_DELETE, //note: FILE_SHARE_DELETE is required to rename file while handle is open!
+ FILE_SHARE_DELETE, //FILE_SHARE_DELETE is required to rename file while handle is open!
nullptr,
access == ACC_OVERWRITE ? CREATE_ALWAYS : CREATE_NEW,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
@@ -192,10 +191,10 @@ void FileOutput::write(const void* buffer, size_t bytesToWrite) //throw FileErro
nullptr)) //__inout_opt LPOVERLAPPED lpOverlapped
#elif defined FFS_LINUX
const size_t bytesWritten = ::fwrite(buffer, 1, bytesToWrite, fileHandle);
- if (::ferror(fileHandle) != 0)
+ if (::ferror(fileHandle) != 0) //checks status of stream, not fwrite()!
#endif
throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filename_)) + L"\n\n" + getLastErrorFormatted() + L" (w)"); //w -> distinguish from fopen error message!
if (bytesWritten != bytesToWrite) //must be fulfilled for synchronous writes!
- throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filename_)) + L"\n\n" + L"(incomplete write)");
+ throw FileError(replaceCpy(_("Cannot write file %x."), L"%x", fmtFileName(filename_)) + L"\n\n" + L"Incomplete write!");
}
diff --git a/zen/file_io.h b/zen/file_io.h
index eb797b7b..33074d7e 100644
--- a/zen/file_io.h
+++ b/zen/file_io.h
@@ -35,7 +35,7 @@ public:
~FileInput();
size_t read(void* buffer, size_t bytesToRead); //throw FileError; returns actual number of bytes read
- bool eof(); //end of file reached
+ bool eof() { return eofReached; } //end of file reached
private:
FileInput(const FileInput&);
diff --git a/zen/file_traverser.cpp b/zen/file_traverser.cpp
index ea6aa289..3acb0edf 100644
--- a/zen/file_traverser.cpp
+++ b/zen/file_traverser.cpp
@@ -43,9 +43,9 @@ bool tryReportingError(Command cmd, zen::TraverseCallback& callback) //return "t
{
switch (callback.onError(e.toString()))
{
- case TraverseCallback::TRAV_ERROR_RETRY:
+ case TraverseCallback::ON_ERROR_RETRY:
break;
- case TraverseCallback::TRAV_ERROR_IGNORE:
+ case TraverseCallback::ON_ERROR_IGNORE:
return false;
//default:
// assert(false);
@@ -57,7 +57,7 @@ bool tryReportingError(Command cmd, zen::TraverseCallback& callback) //return "t
#ifdef FFS_WIN
inline
-bool extractFileInfoFromSymlink(const Zstring& linkName, zen::TraverseCallback::FileInfo& output)
+bool getTargetInfoFromSymlink(const Zstring& linkName, zen::TraverseCallback::FileInfo& output)
{
//open handle to target of symbolic link
HANDLE hFile = ::CreateFile(zen::applyLongPathPrefix(linkName).c_str(),
@@ -65,7 +65,7 @@ bool extractFileInfoFromSymlink(const Zstring& linkName, zen::TraverseCallback::
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nullptr,
OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS,
+ FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory
nullptr);
if (hFile == INVALID_HANDLE_VALUE)
return false;
@@ -179,7 +179,7 @@ struct Win32Traverser
{
struct DirHandle
{
- DirHandle() : searchHandle(nullptr), firstRead(true) {}
+ DirHandle() : searchHandle(nullptr), firstRead(true), firstData() {}
HANDLE searchHandle;
bool firstRead;
@@ -268,7 +268,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());
+ throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted() + L" (+)");
}
static void destroy(DirHandle hnd) { ::closeDir(hnd.searchHandle); } //throw()
@@ -285,32 +285,15 @@ struct FilePlusTraverser
/*
fallback to default directory query method, if FileIdBothDirectoryInformation is not properly implemented
this is required for NetDrive mounted Webdav, e.g. www.box.net and NT4, 2000 remote drives, et al.
-
- NT status code | Win32 error code
- --------------------------------|--------------------------
- STATUS_INVALID_LEVEL | ERROR_INVALID_LEVEL
- STATUS_NOT_SUPPORTED | ERROR_NOT_SUPPORTED
- STATUS_INVALID_PARAMETER | ERROR_INVALID_PARAMETER
- STATUS_INVALID_NETWORK_RESPONSE | ERROR_BAD_NET_RESP
- STATUS_INVALID_INFO_CLASS | ERROR_INVALID_PARAMETER
- STATUS_UNSUCCESSFUL | ERROR_GEN_FAILURE
- STATUS_ACCESS_VIOLATION | ERROR_NOACCESS ->FileIdBothDirectoryInformation on XP accessing UDF
*/
-
- if (lastError == ERROR_INVALID_LEVEL ||
- lastError == ERROR_NOT_SUPPORTED ||
- lastError == ERROR_INVALID_PARAMETER ||
- lastError == ERROR_BAD_NET_RESP ||
- lastError == ERROR_UNEXP_NET_ERR || //traverse network drive hosted by Win98
- lastError == ERROR_GEN_FAILURE ||
- lastError == ERROR_NOACCESS)
+ if (lastError == ERROR_NOT_SUPPORTED)
{
fb(); //fallback should apply to whole directory sub-tree!
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 read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + getLastErrorFormatted(lastError) + L" (+)");
}
return true;
}
@@ -346,9 +329,8 @@ struct FilePlusTraverser
class DirTraverser
{
public:
- DirTraverser(const Zstring& baseDirectory, bool followSymlinks, zen::TraverseCallback& sink, zen::DstHackCallback* dstCallback) :
+ DirTraverser(const Zstring& baseDirectory, TraverseCallback& sink, DstHackCallback* dstCallback) :
isFatFileSystem(dst::isFatDrive(baseDirectory)),
- followSymlinks_(followSymlinks),
volumeSerial(retrieveVolumeSerial(baseDirectory)) //return 0 on error
{
try //traversing certain folders with restricted permissions requires this privilege! (but copying these files may still fail)
@@ -377,96 +359,103 @@ private:
tryReportingError([&]
{
if (level == 100) //notify endless recursion
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Endless loop."));
+ throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion."));
}, sink);
typename Trav::DirHandle searchHandle;
- const bool openSuccess = tryReportingError([&]
- {
- typedef Trav Trav; //f u VS!
- Trav::create(directory, searchHandle); //throw FileError
- }, sink);
-
- if (!openSuccess)
- return; //ignored error
+ if (!tryReportingError([&]
+ {
+ typedef Trav Trav; //f u VS!
+ Trav::create(directory, searchHandle); //throw FileError
+ }, sink))
+ return; //ignored error
ZEN_ON_SCOPE_EXIT(typedef Trav Trav; Trav::destroy(searchHandle));
- typename Trav::FindData fileInfo = {};
+ typename Trav::FindData findData = {};
auto fallback = [&] { this->traverse<Win32Traverser>(directory, sink, level); }; //help VS2010 a little by avoiding too deeply nested lambdas
- while ([&]() -> bool
- {
- bool gotEntry = false;
-
- typedef Trav Trav1; //f u VS!
- tryReportingError([&]
+ for (;;)
{
- typedef Trav1 Trav; //f u VS!
- gotEntry = Trav::getEntry(searchHandle, directory, fileInfo, fallback); //throw FileError
- }, sink);
+ bool gotEntry = false;
+ tryReportingError([&] { typedef Trav Trav; /*VS 2010 bug*/ gotEntry = Trav::getEntry(searchHandle, directory, findData, fallback); }, sink); //throw FileError
+ if (!gotEntry) //no more items or ignored error
+ return;
- return gotEntry;
- }())
- {
//skip "." and ".."
- const Zchar* const shortName = Trav::getShortName(fileInfo);
+ const Zchar* const shortName = Trav::getShortName(findData);
if (shortName[0] == L'.' &&
- (shortName[1] == 0 || (shortName[1] == L'.' && shortName[2] == 0)))
+ (shortName[1] == 0 || (shortName[1] == L'.' && shortName[2] == 0)))
continue;
const Zstring& fullName = appendSeparator(directory) + shortName;
- if (Trav::isSymlink(fileInfo) && !followSymlinks_) //evaluate symlink directly
+ if (Trav::isSymlink(findData)) //check first!
{
- TraverseCallback::SymlinkInfo details;
+ TraverseCallback::SymlinkInfo linkInfo;
try
{
- details.targetPath = getSymlinkRawTargetString(fullName); //throw FileError
+ linkInfo.targetPath = getSymlinkRawTargetString(fullName); //throw FileError
}
-#ifdef NDEBUG //Release
- catch (FileError&) {}
-#else
- catch (FileError& e) { sink.onError(e.toString()); } //show broken symlink / access errors in debug build!
-#endif
+ catch (FileError&) { assert(false); }
+ linkInfo.lastWriteTimeRaw = Trav::getModTime (findData);
+ linkInfo.dirLink = Trav::isDirectory(findData); //directory symlinks have this flag on Windows
+
+ 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 (!getTargetInfoFromSymlink(fullName, targetInfo))
+ throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(fullName)) + L"\n\n" + getLastErrorFormatted());
+ }, sink);
+
+ if (validLink)
+ {
+ if (Trav::isDirectory(findData))
+ {
+ if (const std::shared_ptr<TraverseCallback>& rv = sink.onDir(shortName, fullName))
+ traverse<Trav>(fullName, *rv, level + 1);
+ }
+ else //a file
+ sink.onFile(shortName, fullName, targetInfo);
+ }
+ else //report broken symlink as file!
+ sink.onFile(shortName, fullName, TraverseCallback::FileInfo());
+ }
+ break;
- details.lastWriteTimeRaw = Trav::getModTime (fileInfo);
- details.dirLink = Trav::isDirectory(fileInfo); //directory symlinks have this flag on Windows
- sink.onSymlink(shortName, fullName, details);
+ case TraverseCallback::LINK_SKIP:
+ break;
+ }
}
- else if (Trav::isDirectory(fileInfo)) //a directory... or symlink that needs to be followed (for directory symlinks this flag is set too!)
+ else if (Trav::isDirectory(findData))
{
- if (const std::shared_ptr<TraverseCallback> rv = sink.onDir(shortName, fullName))
+ if (const std::shared_ptr<TraverseCallback>& rv = sink.onDir(shortName, fullName))
traverse<Trav>(fullName, *rv, level + 1);
}
- else //a file or symlink that is followed...
+ else //a file
{
- TraverseCallback::FileInfo details;
+ TraverseCallback::FileInfo fileInfo;
+ Trav::extractFileInfo(findData, volumeSerial, fileInfo);
- if (Trav::isSymlink(fileInfo)) //dereference symlinks!
- {
- extractFileInfoFromSymlink(fullName, details); //try to...
- //keep details initial if symlink is broken
- }
- else
+ //####################################### DST hack ###########################################
+ if (isFatFileSystem)
{
- Trav::extractFileInfo(fileInfo, volumeSerial, details);
-
- //####################################### DST hack ###########################################
- if (isFatFileSystem)
- {
- const dst::RawTime rawTime(Trav::getCreateTimeRaw(fileInfo), Trav::getModTimeRaw(fileInfo));
+ const dst::RawTime rawTime(Trav::getCreateTimeRaw(findData), Trav::getModTimeRaw(findData));
- if (dst::fatHasUtcEncoded(rawTime)) //throw std::runtime_error
- details.lastWriteTimeRaw = toTimeT(dst::fatDecodeUtcTime(rawTime)); //return real UTC time; throw (std::runtime_error)
- else
- markForDstHack.push_back(std::make_pair(fullName, Trav::getModTimeRaw(fileInfo)));
- }
- //####################################### DST hack ###########################################
+ if (dst::fatHasUtcEncoded(rawTime)) //throw std::runtime_error
+ fileInfo.lastWriteTimeRaw = toTimeT(dst::fatDecodeUtcTime(rawTime)); //return real UTC time; throw (std::runtime_error)
+ else
+ markForDstHack.push_back(std::make_pair(fullName, Trav::getModTimeRaw(findData)));
}
+ //####################################### DST hack ###########################################
- sink.onFile(shortName, fullName, details);
+ sink.onFile(shortName, fullName, fileInfo);
}
}
}
@@ -491,11 +480,11 @@ private:
FileUpdateHandle updateHandle(i->first, [=]
{
return ::CreateFile(zen::applyLongPathPrefix(i->first).c_str(),
- GENERIC_READ | GENERIC_WRITE, //use both when writing over network, see comment in file_io.cpp
+ FILE_WRITE_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
nullptr,
OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS,
+ FILE_FLAG_BACKUP_SEMANTICS, //needed to open a directory
nullptr);
});
if (updateHandle.get() == INVALID_HANDLE_VALUE)
@@ -543,7 +532,6 @@ private:
FilenameTimeList markForDstHack;
//####################################### DST hack ###########################################
- const bool followSymlinks_;
const DWORD volumeSerial; //may be 0!
};
@@ -552,8 +540,7 @@ private:
class DirTraverser
{
public:
- DirTraverser(const Zstring& baseDirectory, bool followSymlinks, zen::TraverseCallback& sink, zen::DstHackCallback* dstCallback) :
- followSymlinks_(followSymlinks)
+ DirTraverser(const Zstring& baseDirectory, zen::TraverseCallback& sink, zen::DstHackCallback* dstCallback)
{
const Zstring directoryFormatted = //remove trailing slash
baseDirectory.size() > 1 && endsWith(baseDirectory, FILE_NAME_SEPARATOR) ? //exception: allow '/'
@@ -580,23 +567,21 @@ private:
tryReportingError([&]
{
if (level == 100) //notify endless recursion
- throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Endless loop."));
+ throw FileError(replaceCpy(_("Cannot read directory %x."), L"%x", fmtFileName(directory)) + L"\n\n" + _("Detected endless directory recursion."));
}, sink);
DIR* dirObj = nullptr;
- tryReportingError([&]
- {
- dirObj = ::opendir(directory.c_str()); //directory must NOT end with path separator, except "/"
+ if (!tryReportingError([&]
+ {
+ 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());
- }, sink);
-
- if (!dirObj)
- return; //ignored error
+ }, sink))
+ return; //ignored error
ZEN_ON_SCOPE_EXIT(::closedir(dirObj)); //never close nullptr handles! -> crash
- while (true)
+ for (;;)
{
struct ::dirent* dirEntry = nullptr;
tryReportingError([&]
@@ -604,7 +589,7 @@ private:
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());
}, sink);
- if (!dirEntry) //no more items or ignore error
+ if (!dirEntry) //no more items or ignored error
return;
@@ -616,80 +601,88 @@ private:
const Zstring& fullName = appendSeparator(directory) + shortName;
- struct ::stat fileInfo = {};
- bool haveData = false;
- tryReportingError([&]
- {
- if (::lstat(fullName.c_str(), &fileInfo) != 0) //lstat() does not resolve symlinks
+ struct ::stat statData = {};
+ if (!tryReportingError([&]
+ {
+ if (::lstat(fullName.c_str(), &statData) != 0) //lstat() does not resolve symlinks
throw FileError(replaceCpy(_("Cannot read file attributes of %x."), L"%x", fmtFileName(fullName)) + L"\n\n" + getLastErrorFormatted());
- haveData = true;
- }, sink);
- if (!haveData)
- continue; //ignore error: skip file
+ }, sink))
+ continue; //ignore error: skip file
- if (S_ISLNK(fileInfo.st_mode))
+ if (S_ISLNK(statData.st_mode)) //on Linux there is no distinction between file and directory symlinks!
{
- if (followSymlinks_) //on Linux Symlinks need to be followed to evaluate whether they point to a file or directory
- {
- if (::stat(fullName.c_str(), &fileInfo) != 0) //stat() resolves symlinks
- {
- sink.onFile(shortName, fullName, TraverseCallback::FileInfo()); //report broken symlink as file!
- continue;
- }
+ struct ::stat statDataTrg = {};
+ bool validLink = ::stat(fullName.c_str(), &statDataTrg) == 0; //if "LINK_SKIP", a broken link is no error!
- fileInfo.st_dev = 0; //id from dereferenced symlink is problematic, since renaming will consider the link, not the target!
- fileInfo.st_ino = 0; //
- }
- else //evaluate symlink directly
+ TraverseCallback::SymlinkInfo linkInfo;
+ try
{
- TraverseCallback::SymlinkInfo details;
- try
- {
- details.targetPath = getSymlinkRawTargetString(fullName); //throw FileError
- }
- catch (FileError& e)
- {
-#ifndef NDEBUG //show broken symlink / access errors in debug build!
- sink.onError(e.toString());
-#endif
- }
+ linkInfo.targetPath = getSymlinkRawTargetString(fullName); //throw FileError
+ }
+ catch (FileError&) { assert(false); }
+ linkInfo.lastWriteTimeRaw = statData.st_mtime; //UTC time (ANSI C format); unit: 1 second
+ linkInfo.dirLink = validLink && S_ISDIR(statDataTrg.st_mode);
+ //S_ISDIR and S_ISLNK are mutually exclusive on Linux => explicitly need to follow link
- details.lastWriteTimeRaw = fileInfo.st_mtime; //UTC time(ANSI C format); unit: 1 second
- details.dirLink = ::stat(fullName.c_str(), &fileInfo) == 0 && S_ISDIR(fileInfo.st_mode);
- //S_ISDIR and S_ISLNK are mutually exclusive on Linux => explicitly need to follow link
- sink.onSymlink(shortName, fullName, details);
- continue;
+ switch (sink.onSymlink(shortName, fullName, linkInfo))
+ {
+ case TraverseCallback::LINK_FOLLOW:
+ //try to resolve symlink (and report error on failure!!!)
+ validLink = tryReportingError([&]
+ {
+ if (validLink) return; //no need to check twice
+ if (::stat(fullName.c_str(), &statDataTrg) != 0)
+ throw FileError(replaceCpy(_("Cannot resolve symbolic link %x."), L"%x", fmtFileName(fullName)) + L"\n\n" + getLastErrorFormatted());
+ }, sink);
+
+ if (validLink)
+ {
+ if (S_ISDIR(statDataTrg.st_mode)) //a directory
+ {
+ if (const std::shared_ptr<TraverseCallback>& rv = sink.onDir(shortName, fullName))
+ traverse(fullName, *rv, level + 1);
+ }
+ else //a file
+ {
+ TraverseCallback::FileInfo fileInfo;
+ fileInfo.fileSize = zen::UInt64(statDataTrg.st_size);
+ fileInfo.lastWriteTimeRaw = statDataTrg.st_mtime; //UTC time (time_t format); unit: 1 second
+ //fileInfo.id = extractFileID(statDataTrg); -> id from dereferenced symlink is problematic, since renaming will consider the link, not the target!
+ sink.onFile(shortName, fullName, fileInfo);
+ }
+ }
+ else //report broken symlink as file!
+ sink.onFile(shortName, fullName, TraverseCallback::FileInfo());
+ break;
+
+ case TraverseCallback::LINK_SKIP:
+ break;
}
}
-
- //fileInfo contains dereferenced data in any case from here on
-
- if (S_ISDIR(fileInfo.st_mode)) //a directory... cannot be a symlink on Linux in this case
+ else if (S_ISDIR(statData.st_mode)) //a directory
{
- const std::shared_ptr<TraverseCallback> rv = sink.onDir(shortName, fullName);
- if (rv)
+ if (const std::shared_ptr<TraverseCallback>& rv = sink.onDir(shortName, fullName))
traverse(fullName, *rv, level + 1);
}
- else //a file... (or symlink; pathological!)
+ else //a file
{
- TraverseCallback::FileInfo details;
- details.fileSize = zen::UInt64(fileInfo.st_size);
- details.lastWriteTimeRaw = fileInfo.st_mtime; //UTC time (time_t format); unit: 1 second
- details.id = extractFileID(fileInfo);
+ TraverseCallback::FileInfo fileInfo;
+ fileInfo.fileSize = zen::UInt64(statData.st_size);
+ fileInfo.lastWriteTimeRaw = statData.st_mtime; //UTC time (time_t format); unit: 1 second
+ fileInfo.id = extractFileID(statData);
- sink.onFile(shortName, fullName, details);
+ sink.onFile(shortName, fullName, fileInfo);
}
}
}
std::vector<char> buffer;
- const bool followSymlinks_;
};
#endif
}
-void zen::traverseFolder(const Zstring& directory, bool followSymlinks, TraverseCallback& sink, DstHackCallback* dstCallback)
+void zen::traverseFolder(const Zstring& directory, TraverseCallback& sink, DstHackCallback* dstCallback)
{
- DirTraverser(directory, followSymlinks, sink, dstCallback);
+ DirTraverser(directory, sink, dstCallback);
}
diff --git a/zen/file_traverser.h b/zen/file_traverser.h
index ab46621f..c29d987d 100644
--- a/zen/file_traverser.h
+++ b/zen/file_traverser.h
@@ -17,9 +17,8 @@
namespace zen
{
-class TraverseCallback
+struct TraverseCallback
{
-public:
virtual ~TraverseCallback() {}
struct FileInfo
@@ -32,21 +31,27 @@ public:
struct SymlinkInfo
{
Int64 lastWriteTimeRaw; //number of seconds since Jan. 1st 1970 UTC
- Zstring targetPath; //may be empty if something goes wrong
+ Zstring targetPath; //optional: empty if something goes wrong
bool dirLink; //"true": point to dir; "false": point to file (or broken Link on Linux)
};
+ enum HandleLink
+ {
+ LINK_FOLLOW, //dereferences link, then calls "onDir()" or "onFile()"
+ LINK_SKIP
+ };
+
enum HandleError
{
- TRAV_ERROR_RETRY,
- TRAV_ERROR_IGNORE
+ ON_ERROR_RETRY,
+ ON_ERROR_IGNORE
};
//overwrite these virtual methods
- virtual std::shared_ptr<TraverseCallback> //nullptr: ignore directory, non-nullptr: traverse into
+ virtual std::shared_ptr<TraverseCallback> //nullptr: ignore directory, non-nullptr: traverse into using the (new) callback
/**/ onDir (const Zchar* shortName, const Zstring& fullName) = 0;
virtual void onFile (const Zchar* shortName, const Zstring& fullName, const FileInfo& details) = 0;
- virtual void onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) = 0;
+ virtual HandleLink onSymlink(const Zchar* shortName, const Zstring& fullName, const SymlinkInfo& details) = 0;
virtual HandleError onError (const std::wstring& errorText) = 0;
};
@@ -64,12 +69,8 @@ struct DstHackCallback; //DST hack not required on Linux
//custom traverser with detail information about files
//directory may end with PATH_SEPARATOR
void traverseFolder(const Zstring& directory, //throw();
- bool followSymlinks,
TraverseCallback& sink,
DstHackCallback* dstCallback = nullptr); //apply DST hack if callback is supplied
-//followSymlinks:
-//"true": Symlinks dereferenced and reported via onFile() and onDir() => onSymlink not used!
-//"false": Symlinks directly reported via onSymlink(), directory symlinks are not followed
}
#endif // FILETRAVERSER_H_INCLUDED
diff --git a/zen/file_update_handle.h b/zen/file_update_handle.h
index 716048fd..3df69f10 100644
--- a/zen/file_update_handle.h
+++ b/zen/file_update_handle.h
@@ -18,25 +18,28 @@ public:
attr(INVALID_FILE_ATTRIBUTES)
{
hFile = cmd();
- if (hFile != INVALID_HANDLE_VALUE)
- return;
-
- const DWORD lastError = ::GetLastError();
- if (lastError == ERROR_ACCESS_DENIED) //function fails if file is read-only
+ if (hFile == INVALID_HANDLE_VALUE)
{
- //zen::ScopeGuard guardErrorCode = zen::makeGuard([&] { ::SetLastError(lastError); }); //transactional behavior: ensure cleanup (e.g. network drop) -> cref [!]
-
- //read-only file attribute may cause trouble: temporarily reset it
- const DWORD tmpAttr = ::GetFileAttributes(filenameFmt.c_str());
- if (tmpAttr != INVALID_FILE_ATTRIBUTES && (tmpAttr & FILE_ATTRIBUTE_READONLY))
+ //try to recover
+ if (::GetLastError() == ERROR_ACCESS_DENIED) //function fails if file is read-only
{
- if (::SetFileAttributes(filenameFmt.c_str(), FILE_ATTRIBUTE_NORMAL))
+ //read-only file attribute may cause trouble: temporarily reset it
+ const DWORD tmpAttr = ::GetFileAttributes(filenameFmt.c_str());
+ if (tmpAttr != INVALID_FILE_ATTRIBUTES)
{
- //guardErrorCode.dismiss();
- attr = tmpAttr; //"create" guard on read-only attribute
+ if (tmpAttr & FILE_ATTRIBUTE_READONLY)
+ {
+ if (::SetFileAttributes(filenameFmt.c_str(), FILE_ATTRIBUTE_NORMAL))
+ {
+ //guardErrorCode.dismiss();
+ attr = tmpAttr; //"create" guard on read-only attribute
- //now try again
- hFile = cmd();
+ //now try again
+ hFile = cmd();
+ }
+ }
+ else
+ ::SetLastError(ERROR_ACCESS_DENIED);
}
}
}
diff --git a/zen/i18n.h b/zen/i18n.h
index cea4340d..8c740b23 100644
--- a/zen/i18n.h
+++ b/zen/i18n.h
@@ -9,10 +9,8 @@
#include <string>
#include <memory>
-#include <clocale> //thousands separator
-#include "utf8.h" //
-//thin layer to enable localization - without platform/library dependencies!
+//minimal layer enabling text translation - without platform/library dependencies!
#ifndef WXINTL_NO_GETTEXT_MACRO
#error WXINTL_NO_GETTEXT_MACRO must be defined to deactivate wxWidgets underscore macro
#endif
@@ -36,7 +34,6 @@ struct TranslationHandler
void setTranslator(TranslationHandler* newHandler = nullptr); //takes ownership
TranslationHandler* getTranslator();
-std::wstring getThousandsSeparator();
@@ -93,18 +90,6 @@ void setTranslator(TranslationHandler* newHandler) { implementation::globalHandl
inline
TranslationHandler* getTranslator() { return implementation::globalHandler().get(); }
-
-
-inline
-std::wstring getThousandsSeparator() //consistency with sprintf(): just use the same values the C-runtime uses!!!
-{
- //::setlocale (LC_ALL, ""); -> implicitly called by wxLocale
- const lconv* localInfo = ::localeconv(); //always bound according to doc
- return utf8CvrtTo<std::wstring>(localInfo->thousands_sep);
- // why not working?
- // THOUSANDS_SEPARATOR = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).thousands_sep();
- // DECIMAL_POINT = std::use_facet<std::numpunct<wchar_t> >(std::locale("")).decimal_point();
-}
}
#endif //I18_N_HEADER_3843489325045
diff --git a/zen/last_error.h b/zen/last_error.h
index 28982b63..76850f6a 100644
--- a/zen/last_error.h
+++ b/zen/last_error.h
@@ -8,7 +8,7 @@
#define SYSTEMFUNCTIONS_H_INCLUDED
#include <string>
-#include "utf8.h"
+#include "utf.h"
#include "i18n.h"
#ifdef FFS_WIN
@@ -116,7 +116,7 @@ std::wstring getLastErrorFormatted(ErrorCode lastError)
replace(output, L"%x", numberTo<std::wstring>(lastError));
output += L" ";
- output += utf8CvrtTo<std::wstring>(::strerror(lastError));
+ output += utfCvrtTo<std::wstring>(::strerror(lastError));
errno = lastError; //restore errno
return output;
diff --git a/zen/long_path_prefix.h b/zen/long_path_prefix.h
index db3207d3..ed6308dc 100644
--- a/zen/long_path_prefix.h
+++ b/zen/long_path_prefix.h
@@ -15,7 +15,7 @@ namespace zen
//handle filenames longer-equal 260 (== MAX_PATH) characters by applying \\?\-prefix; see: http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath
/*
1. path must be absolute
-2. if path is smaller than MAX_PATH nothing is changed!
+2. if path is smaller than MAX_PATH nothing is changed! caveat: FindFirstFile() "Prepending the string "\\?\" does not allow access to the root directory."
3. path may already contain \\?\-prefix
*/
Zstring applyLongPathPrefix(const Zstring& path); //throw()
diff --git a/zen/privilege.cpp b/zen/privilege.cpp
index 69c820f3..9d8f12a0 100644
--- a/zen/privilege.cpp
+++ b/zen/privilege.cpp
@@ -36,7 +36,7 @@ bool privilegeIsActive(LPCTSTR privilege) //throw FileError
&alreadyGranted)) //__out LPBOOL pfResult
throw FileError(replaceCpy(_("Cannot set privilege %x."), L"%x", std::wstring(L"\"") + privilege + L"\"") + L"\n\n" + getLastErrorFormatted());
- return alreadyGranted == TRUE;
+ return alreadyGranted != FALSE;
}
diff --git a/zen/recycler.cpp b/zen/recycler.cpp
index e53b5f6a..5e5e56d4 100644
--- a/zen/recycler.cpp
+++ b/zen/recycler.cpp
@@ -157,7 +157,7 @@ bool zen::moveToRecycleBin(const Zstring& filename) //throw FileError
}
throw FileError(shortMsg + L"\n\n" + L"Glib Error Code " + numberTo<std::wstring>(error->code) + /* L", " +
- g_quark_to_string(error->domain) + */ L": " + utf8CvrtTo<std::wstring>(error->message));
+ g_quark_to_string(error->domain) + */ L": " + utfCvrtTo<std::wstring>(error->message));
}
#endif
return true;
diff --git a/zen/string_base.h b/zen/string_base.h
index 45f65ab8..16731089 100644
--- a/zen/string_base.h
+++ b/zen/string_base.h
@@ -291,11 +291,6 @@ template <class Char, template <class, class> class SP, class AP> inline Zbase<C
-
-
-
-
-
//################################# implementation ########################################
template <class Char, template <class, class> class SP, class AP> inline
Zbase<Char, SP, AP>::Zbase()
@@ -345,7 +340,7 @@ Zbase<Char, SP, AP>::Zbase(Zbase<Char, SP, AP>&& tmp)
{
//rawStr = this->clone(tmp.rawStr); NO! do not increment ref-count of a potentially unshared string! We'd lose optimization opportunity of reusing it!
//instead create a dummy string and swap:
- if (canWrite(tmp.rawStr, 0)) //perf: this check saves about 4%
+ if (this->canWrite(tmp.rawStr, 0)) //perf: this check saves about 4%
{
rawStr = this->create(0); //no perf issue! see comment in default constructor
rawStr[0] = 0;
@@ -446,17 +441,17 @@ Zbase<Char, SP, AP>& Zbase<Char, SP, AP>::replace(size_t pos1, size_t n1, const
const size_t newLen = oldLen - n1 + n2;
- if (canWrite(rawStr, newLen))
+ if (this->canWrite(rawStr, newLen))
{
if (n1 < n2) //move remainder right -> std::copy_backward
{
std::copy_backward(rawStr + pos1 + n1, rawStr + oldLen + 1, rawStr + newLen + 1); //include null-termination
- setLength(rawStr, newLen);
+ this->setLength(rawStr, newLen);
}
else if (n1 > n2) //shift left -> std::copy
{
std::copy(rawStr + pos1 + n1, rawStr + oldLen + 1, rawStr + pos1 + n2); //include null-termination
- setLength(rawStr, newLen);
+ this->setLength(rawStr, newLen);
}
std::copy(str.data(), str.data() + n2, rawStr + pos1);
@@ -470,7 +465,7 @@ Zbase<Char, SP, AP>& Zbase<Char, SP, AP>::replace(size_t pos1, size_t n1, const
std::copy(str.data(), str.data() + n2, newStr + pos1);
std::copy(rawStr + pos1 + n1, rawStr + oldLen + 1, newStr + pos1 + n2); //include null-termination
- destroy(rawStr);
+ this->destroy(rawStr);
rawStr = newStr;
}
return *this;
@@ -480,12 +475,12 @@ Zbase<Char, SP, AP>& Zbase<Char, SP, AP>::replace(size_t pos1, size_t n1, const
template <class Char, template <class, class> class SP, class AP> inline
void Zbase<Char, SP, AP>::resize(size_t newSize, Char fillChar)
{
- if (canWrite(rawStr, newSize))
+ if (this->canWrite(rawStr, newSize))
{
if (length() < newSize)
std::fill(rawStr + length(), rawStr + newSize, fillChar);
rawStr[newSize] = 0;
- setLength(rawStr, newSize); //keep after call to length()
+ this->setLength(rawStr, newSize); //keep after call to length()
}
else
{
@@ -500,7 +495,7 @@ void Zbase<Char, SP, AP>::resize(size_t newSize, Char fillChar)
else
std::copy(rawStr, rawStr + newSize, newStr);
- destroy(rawStr);
+ this->destroy(rawStr);
rawStr = newStr;
}
}
@@ -593,10 +588,10 @@ void Zbase<Char, SP, AP>::clear()
{
if (!empty())
{
- if (canWrite(rawStr, 0))
+ if (this->canWrite(rawStr, 0))
{
rawStr[0] = 0; //keep allocated memory
- setLength(rawStr, 0); //
+ this->setLength(rawStr, 0); //
}
else
*this = Zbase();
@@ -614,13 +609,13 @@ void Zbase<Char, SP, AP>::swap(Zbase<Char, SP, AP>& other)
template <class Char, template <class, class> class SP, class AP> inline
void Zbase<Char, SP, AP>::reserve(size_t minCapacity) //make unshared and check capacity
{
- if (!canWrite(rawStr, minCapacity))
+ if (!this->canWrite(rawStr, minCapacity))
{
//allocate a new string
- Char* newStr = create(length(), std::max(minCapacity, length())); //reserve() must NEVER shrink the string: logical const!
+ Char* newStr = this->create(length(), std::max(minCapacity, length())); //reserve() must NEVER shrink the string: logical const!
std::copy(rawStr, rawStr + length() + 1, newStr); //include 0-termination
- destroy(rawStr);
+ this->destroy(rawStr);
rawStr = newStr;
}
}
@@ -629,11 +624,11 @@ void Zbase<Char, SP, AP>::reserve(size_t minCapacity) //make unshared and check
template <class Char, template <class, class> class SP, class AP> inline
Zbase<Char, SP, AP>& Zbase<Char, SP, AP>::assign(const Char* source, size_t len)
{
- if (canWrite(rawStr, len))
+ if (this->canWrite(rawStr, len))
{
std::copy(source, source + len, rawStr);
rawStr[len] = 0; //include null-termination
- setLength(rawStr, len);
+ this->setLength(rawStr, len);
}
else
*this = Zbase(source, len);
@@ -650,7 +645,7 @@ Zbase<Char, SP, AP>& Zbase<Char, SP, AP>::append(const Char* source, size_t len)
std::copy(source, source + len, rawStr + thisLen);
rawStr[thisLen + len] = 0;
- setLength(rawStr, thisLen + len);
+ this->setLength(rawStr, thisLen + len);
return *this;
}
diff --git a/zen/symlink_target.h b/zen/symlink_target.h
index 06239b5a..dfd5ebfa 100644
--- a/zen/symlink_target.h
+++ b/zen/symlink_target.h
@@ -64,16 +64,15 @@ Zstring getSymlinkRawTargetString(const Zstring& linkPath) //throw FileError
#ifdef FFS_WIN
//FSCTL_GET_REPARSE_POINT: http://msdn.microsoft.com/en-us/library/aa364571(VS.85).aspx
- try //reading certain symlinks/junctions requires admin rights! This shall not cause an error in user mode!
- {
- activatePrivilege(SE_BACKUP_NAME); //throw FileError
- }
- catch (FileError&) {}
+ //reading certain symlinks/junctions requires admin rights!
+ try
+ { activatePrivilege(SE_BACKUP_NAME); } //throw FileError
+ catch (FileError&) {} //This shall not cause an error in user mode!
const HANDLE hLink = ::CreateFile(applyLongPathPrefix(linkPath).c_str(),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
- 0,
+ nullptr,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
nullptr);
diff --git a/zen/thread.h b/zen/thread.h
index ba9a46e2..3fb73e70 100644
--- a/zen/thread.h
+++ b/zen/thread.h
@@ -8,8 +8,8 @@
#define BOOST_THREAD_WRAP_H
//temporary solution until C++11 thread becomes fully available
-#include <vector>
#include <memory>
+#include "fixed_list.h"
#ifdef __MINGW32__
#pragma GCC diagnostic push
@@ -63,7 +63,7 @@ public:
private:
class AsyncResult;
- std::vector<boost::thread> workload;
+ FixedList<boost::thread> workload; //note: we cannot use std::vector<boost::thread>: compiler error on GCC 4.7, probably a boost screw-up
std::shared_ptr<AsyncResult> result;
};
@@ -180,10 +180,10 @@ template <class Fun> inline
void RunUntilFirstHit<T>::addJob(Fun f) //f must return a std::unique_ptr<T> containing a value on success
{
auto result2 = result; //VC11: this is ridiculous!!!
- workload.push_back(boost::thread([result2, f]
+ workload.emplace_back([result2, f]
{
result2->reportFinished(f());
- }));
+ });
}
diff --git a/zen/tick_count.h b/zen/tick_count.h
index 37c7cc59..30b0295d 100644
--- a/zen/tick_count.h
+++ b/zen/tick_count.h
@@ -56,17 +56,17 @@ public:
#endif
TickVal() : val_() {}
- TickVal(const NativeVal& val) : val_(val) {}
+ explicit TickVal(const NativeVal& val) : val_(val) {}
inline friend
std::int64_t operator-(const TickVal& lhs, const TickVal& rhs)
{
#ifdef FFS_WIN
- assert_static(IsSignedInt<decltype(lhs.val_.QuadPart)>::value);
+ assert_static(IsSignedInt<decltype(lhs.val_.QuadPart)>::value);
return lhs.val_.QuadPart - rhs.val_.QuadPart;
#elif defined FFS_LINUX
- assert_static(IsSignedInt<decltype(lhs.val_.tv_sec)>::value);
- assert_static(IsSignedInt<decltype(lhs.val_.tv_nsec)>::value);
+ assert_static(IsSignedInt<decltype(lhs.val_.tv_sec)>::value);
+ assert_static(IsSignedInt<decltype(lhs.val_.tv_nsec)>::value);
return static_cast<std::int64_t>(lhs.val_.tv_sec - rhs.val_.tv_sec) * 1000000000.0 + lhs.val_.tv_nsec - rhs.val_.tv_nsec;
#endif
}
@@ -85,6 +85,7 @@ std::int64_t ticksPerSec() //return 0 on error
LARGE_INTEGER frequency = {};
if (!::QueryPerformanceFrequency(&frequency))
return 0;
+ assert_static(sizeof(std::int64_t) >= sizeof(frequency.QuadPart));
return frequency.QuadPart;
#elif defined FFS_LINUX
@@ -107,7 +108,7 @@ TickVal getTicks() //return 0 on error
if (::clock_gettime(CLOCK_MONOTONIC_RAW, &now) != 0) //CLOCK_MONOTONIC measures time reliably across processors!
return TickVal();
#endif
- return now;
+ return TickVal(now);
}
}
diff --git a/zen/utf8.h b/zen/utf.h
index 242b729f..2ba6eaa3 100644
--- a/zen/utf8.h
+++ b/zen/utf.h
@@ -14,23 +14,25 @@
namespace zen
{
-//convert any(!) "string-like" object into target string by applying a UTF8 conversion (but only if necessary!)
+//convert all(!) char- and wchar_t-based "string-like" objects applying a UTF8 conversions (but only if necessary!)
template <class TargetString, class SourceString>
-TargetString utf8CvrtTo(const SourceString& str);
-
-//convert wide to utf8 string; example: std::string tmp = toUtf8<std::string>(L"abc");
-template <class CharString, class WideString>
-CharString wideToUtf8(const WideString& str);
-
-//convert utf8 string to wide; example: std::wstring tmp = utf8To<std::wstring>("abc");
-template <class WideString, class CharString>
-WideString utf8ToWide(const CharString& str);
+TargetString utfCvrtTo(const SourceString& str);
const char BYTE_ORDER_MARK_UTF8[] = "\xEF\xBB\xBF";
+//---- explicit conversion: wide <-> utf8 ----
+template <class CharString, class WideString>
+CharString wideToUtf8(const WideString& str); //example: std::string tmp = wideToUtf8<std::string>(L"abc");
+template <class WideString, class CharString>
+WideString utf8ToWide(const CharString& str); //std::wstring tmp = utf8ToWide<std::wstring>("abc");
+//access unicode characters in UTF-encoded string (char- or wchar_t-based)
+template <class UtfString>
+size_t unicodeLength(const UtfString& str); //return number of code points for UTF-encoded string
+template <class UtfString>
+size_t findUnicodePos(const UtfString& str, size_t unicodePos); //return position of unicode char in UTF-encoded string
@@ -95,6 +97,21 @@ void codePointToUtf16(CodePoint cp, Function writeOutput) //"writeOutput" is a u
}
+inline
+size_t getUtf16Len(Char16 ch) //ch must be first code unit!
+{
+ const CodePoint cp = ch;
+
+ if (HIGH_SURROGATE <= cp && cp <= HIGH_SURROGATE_MAX)
+ return 2;
+ else
+ {
+ assert(cp < LOW_SURROGATE || LOW_SURROGATE_MAX < cp); //NO low surrogate expected
+ return 1;
+ }
+}
+
+
template <class CharIterator, class Function> inline
void utf16ToCodePoint(CharIterator first, CharIterator last, Function writeOutput) //"writeOutput" is a unary function taking a CodePoint
{
@@ -151,7 +168,7 @@ void codePointToUtf8(CodePoint cp, Function writeOutput) //"writeOutput" is a un
inline
-size_t getUtf8Len(unsigned char ch)
+size_t getUtf8Len(unsigned char ch) //ch must be first code unit!
{
if (ch < 0x80)
return 1;
@@ -229,8 +246,133 @@ void utf8ToCodePoint(CharIterator first, CharIterator last, Function writeOutput
}
+template <class CharString> inline
+size_t unicodeLength(const CharString& str, char) //utf8
+{
+ typedef typename GetCharType<CharString>::Type CharType;
+
+ const CharType* strFirst = strBegin(str);
+ const CharType* const strLast = strFirst + strLength(str);
+
+ size_t len = 0;
+ while (strFirst < strLast) //[!]
+ {
+ ++len;
+ strFirst += getUtf8Len(*strFirst); //[!]
+ }
+ return len;
+}
+
+
+template <class WideString> inline
+size_t unicodeLengthWide(const WideString& str, Int2Type<2>) //windows: utf16-wchar_t
+{
+ typedef typename GetCharType<WideString>::Type CharType;
+
+ const CharType* strFirst = strBegin(str);
+ const CharType* const strLast = strFirst + strLength(str);
+
+ size_t len = 0;
+ while (strFirst < strLast) //[!]
+ {
+ ++len;
+ strFirst += getUtf16Len(*strFirst); //[!]
+ }
+ return len;
+}
+
+
+template <class WideString> inline
+size_t unicodeLengthWide(const WideString& str, Int2Type<4>) //other OS: utf32-wchar_t
+{
+ return strLength(str);
+}
+
+
+template <class WideString> inline
+size_t unicodeLength(const WideString& str, wchar_t)
+{
+ return unicodeLengthWide(str, Int2Type<sizeof(wchar_t)>());
+}
+}
+
+
+template <class UtfString> inline
+size_t unicodeLength(const UtfString& str) //return number of code points
+{
+ return implementation::unicodeLength(str, typename GetCharType<UtfString>::Type());
+}
+
+
+namespace implementation
+{
+template <class CharString> inline
+size_t findUnicodePos(const CharString& str, size_t unicodePos, char) //utf8-char
+{
+ typedef typename GetCharType<CharString>::Type CharType;
+
+ const CharType* strFirst = strBegin(str);
+ const size_t strLen = strLength(str);
+
+ size_t utfPos = 0;
+ while (unicodePos-- > 0)
+ {
+ utfPos += getUtf8Len(strFirst[utfPos]);
+
+ if (utfPos >= strLen)
+ return strLen;
+ }
+ return utfPos;
+}
+
+
+template <class WideString> inline
+size_t findUnicodePosWide(const WideString& str, size_t unicodePos, Int2Type<2>) //windows: utf16-wchar_t
+{
+ typedef typename GetCharType<WideString>::Type CharType;
+
+ const CharType* strFirst = strBegin(str);
+ const size_t strLen = strLength(str);
+
+ size_t utfPos = 0;
+ while (unicodePos-- > 0)
+ {
+ utfPos += getUtf16Len(strFirst[utfPos]);
+
+ if (utfPos >= strLen)
+ return strLen;
+ }
+ return utfPos;
+}
+
+
+template <class WideString> inline
+size_t findUnicodePosWide(const WideString& str, size_t unicodePos, Int2Type<4>) //other OS: utf32-wchar_t
+{
+ return std::min(strLength(str), unicodePos);
+}
+
+
+template <class UtfString> inline
+size_t findUnicodePos(const UtfString& str, size_t unicodePos, wchar_t)
+{
+ return findUnicodePosWide(str, unicodePos, Int2Type<sizeof(wchar_t)>());
+}
+}
+
+
+template <class UtfString> inline
+size_t findUnicodePos(const UtfString& str, size_t unicodePos) //return position of unicode char in UTF-encoded string
+{
+ return implementation::findUnicodePos(str, unicodePos, typename GetCharType<UtfString>::Type());
+}
+
+//-------------------------------------------------------------------------------------------
+
+namespace implementation
+{
template <class WideString, class CharString> inline
-WideString utf8ToWide(const CharString& str, Int2Type<2>) //windows: convert utf8 to utf16 wchar_t
+WideString utf8ToWide(const CharString& str, Int2Type<2>) //windows: convert utf8 to utf16-wchar_t
{
WideString output;
utf8ToCodePoint(strBegin(str), strBegin(str) + strLength(str),
@@ -240,7 +382,7 @@ WideString utf8ToWide(const CharString& str, Int2Type<2>) //windows: convert utf
template <class WideString, class CharString> inline
-WideString utf8ToWide(const CharString& str, Int2Type<4>) //other OS: convert utf8 to utf32 wchar_t
+WideString utf8ToWide(const CharString& str, Int2Type<4>) //other OS: convert utf8 to utf32-wchar_t
{
WideString output;
utf8ToCodePoint(strBegin(str), strBegin(str) + strLength(str),
@@ -289,26 +431,26 @@ CharString wideToUtf8(const WideString& str)
return implementation::wideToUtf8<CharString>(str, Int2Type<sizeof(wchar_t)>());
}
-
//-------------------------------------------------------------------------------------------
+
template <class TargetString, class SourceString> inline
-TargetString utf8CvrtTo(const SourceString& str, char, wchar_t) { return utf8ToWide<TargetString>(str); }
+TargetString utfCvrtTo(const SourceString& str, char, wchar_t) { return utf8ToWide<TargetString>(str); }
template <class TargetString, class SourceString> inline
-TargetString utf8CvrtTo(const SourceString& str, wchar_t, char) { return wideToUtf8<TargetString>(str); }
+TargetString utfCvrtTo(const SourceString& str, wchar_t, char) { return wideToUtf8<TargetString>(str); }
template <class TargetString, class SourceString> inline
-TargetString utf8CvrtTo(const SourceString& str, char, char) { return copyStringTo<TargetString>(str); }
+TargetString utfCvrtTo(const SourceString& str, char, char) { return copyStringTo<TargetString>(str); }
template <class TargetString, class SourceString> inline
-TargetString utf8CvrtTo(const SourceString& str, wchar_t, wchar_t) { return copyStringTo<TargetString>(str); }
+TargetString utfCvrtTo(const SourceString& str, wchar_t, wchar_t) { return copyStringTo<TargetString>(str); }
template <class TargetString, class SourceString> inline
-TargetString utf8CvrtTo(const SourceString& str)
+TargetString utfCvrtTo(const SourceString& str)
{
- return utf8CvrtTo<TargetString>(str,
- typename GetCharType<SourceString>::Type(),
- typename GetCharType<TargetString>::Type());
+ return utfCvrtTo<TargetString>(str,
+ typename GetCharType<SourceString>::Type(),
+ typename GetCharType<TargetString>::Type());
}
}
diff --git a/zen/win_ver.h b/zen/win_ver.h
index c2162c61..3a6f23c1 100644
--- a/zen/win_ver.h
+++ b/zen/win_ver.h
@@ -7,7 +7,7 @@
#ifndef WINDOWS_VERSION_HEADER_238470348254325
#define WINDOWS_VERSION_HEADER_238470348254325
-#include "win.h"
+#include <zen/win.h> //includes "windows.h"
namespace zen
{
@@ -44,8 +44,7 @@ bool winXyOrLater(DWORD major, DWORD minor)
OSVERSIONINFO osvi = {};
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (::GetVersionEx(&osvi)) //38 ns per call! (yes, that's nano!) -> we do NOT miss C++11 thread safe statics right now...
- return osvi.dwMajorVersion > major ||
- (osvi.dwMajorVersion == major && osvi.dwMinorVersion >= minor);
+ return osvi.dwMajorVersion != major ? osvi.dwMajorVersion > major : osvi.dwMinorVersion >= minor;
return false;
}
}
diff --git a/zen/zstring.h b/zen/zstring.h
index 8f7486b0..94d5b1a4 100644
--- a/zen/zstring.h
+++ b/zen/zstring.h
@@ -104,7 +104,7 @@ template <template <class, class> class SP, class AP>
void makeUpper(zen::Zbase<wchar_t, SP, AP>& str);
#endif
-#ifdef FFS_WIN //Windows stores filenames in wide character format
+#ifdef FFS_WIN //Windows encodes Unicode as UTF-16 wchar_t
typedef wchar_t Zchar;
#define Zstr(x) L ## x
const Zchar FILE_NAME_SEPARATOR = L'\\';
@@ -157,8 +157,7 @@ void makeUpperCaseWin(wchar_t* str, size_t size);
}
-template <class T, template <class, class> class SP, class AP>
-inline
+template <class T, template <class, class> class SP, class AP> inline
int cmpFileName(const zen::Zbase<T, SP, AP>& lhs, const zen::Zbase<T, SP, AP>& rhs)
{
#ifdef FFS_WIN
@@ -169,8 +168,7 @@ int cmpFileName(const zen::Zbase<T, SP, AP>& lhs, const zen::Zbase<T, SP, AP>& r
}
-template <class T, template <class, class> class SP, class AP>
-inline
+template <class T, template <class, class> class SP, class AP> inline
bool LessFilename::operator()(const zen::Zbase<T, SP, AP>& lhs, const zen::Zbase<T, SP, AP>& rhs) const
{
#ifdef FFS_WIN
@@ -181,8 +179,7 @@ bool LessFilename::operator()(const zen::Zbase<T, SP, AP>& lhs, const zen::Zbase
}
-template <class T, template <class, class> class SP, class AP>
-inline
+template <class T, template <class, class> class SP, class AP> inline
bool EqualFilename::operator()(const zen::Zbase<T, SP, AP>& lhs, const zen::Zbase<T, SP, AP>& rhs) const
{
#ifdef FFS_WIN
@@ -195,8 +192,7 @@ bool EqualFilename::operator()(const zen::Zbase<T, SP, AP>& lhs, const zen::Zbas
#ifdef FFS_WIN
-template <template <class, class> class SP, class AP>
-inline
+template <template <class, class> class SP, class AP> inline
void makeUpper(zen::Zbase<wchar_t, SP, AP>& str)
{
z_impl::makeUpperCaseWin(str.begin(), str.length());
bgstack15